lib/jekyll-openmoji.rb in jekyll-openmoji-0.0.1 vs lib/jekyll-openmoji.rb in jekyll-openmoji-0.0.2

- old
+ new

@@ -1,40 +1,62 @@ # frozen_string_literal: true require "jekyll" -require 'gemoji' +require "gemoji" require "negarmoji" require "html/pipeline" module Jekyll class Emoji - OPENMOJI_ASSET_HOST_URL = "https://cdn.jsdeliver.net/gh/azadeh-afzar/OpenMoji-Jekyll-Plugin" + OPENMOJI_ASSET_HOST_URL = "https://cdn.jsdelivr.net/gh/azadeh-afzar/OpenMoji-Jekyll-Plugin@latest" ASSET_PATH = "/images/color/svg" + DEFAULT_DIR = "/emoji" + FILE_NAME = "/:file_name" BODY_START_TAG = "<body" OPENING_BODY_TAG_REGEX = %r!<body(.*?)>\s*!m.freeze class << self def emojify(doc) return unless doc.output =~ HTML::Pipeline::EmojiFilter.emoji_pattern doc.output = if doc.output.include? BODY_START_TAG replace_document_body(doc) else - src = emoji_src(doc.site.config) - filter_with_emoji(src).call(doc.output)[:output].to_s + src_root = emoji_src_root(doc.site.config) + asset_path = emoji_asset_path(doc.site.config) + filter_with_emoji(src_root, asset_path).call(doc.output)[:output].to_s end end - # Public: Create or fetch the filter for the given {{src}} asset root. + # Public: Create or fetch the filter for the given {{src_root}} asset root. # - # src - the asset root URL (e.g. https://github.githubassets.com/images/icons/) + # src_root - the asset root URL (e.g. https://cdn.jsdelivr.net/gh/azadeh-afzar/OpenMoji-Jekyll-Plugin@latest) + # asset_path - the asset sub-path of src (e.g. "/images/color/svg") # + # if asset_path it's not provided by user in _config.yml file, html pipeline module + # will default it to value "emoji" + # + # examples of _config.yml: + # 1. user provided all URLs: + # emoji: + # src: https://example.com/asset + # asset: /images/png + # emoji files will serve from https://example.com/asset/images/png + # + # 2. user provided just src: + # emoji: + # src: https://example.com/asset + # emoji files will serve from https://example.com/emoji + # + # 3. user provided nothing: + # emoji files will serve from https://cdn.jsdelivr.net/gh/azadeh-afzar/OpenMoji-Jekyll-Plugin@latest/images/color/svg + # # Returns an HTML::Pipeline instance for the given asset root. - def filter_with_emoji(src) - filters[src] ||= HTML::Pipeline.new([ + def filter_with_emoji(src_root, asset_path) + filters[src_root] ||= HTML::Pipeline.new([ HTML::Pipeline::EmojiFilter, - ], :asset_root => src, :img_attrs => { :align => nil }) + ], :asset_root => src_root, :asset_path => asset_path, :img_attrs => { :align => nil }) end # Public: Filters hash where the key is the asset root source. # Effectively a cache. def filters @@ -48,19 +70,40 @@ # # config - the hash-like configuration of the document's site # # Returns a full URL to use as the asset root URL. Defaults to the root # URL for assets provided by an ASSET_HOST_URL environment variable, - # otherwise the root URL for emoji assets at assets-cdn.github.com. - def emoji_src(config = {}) + # otherwise the root URL for emoji assets at https://cdn.jsdelivr.net/gh/azadeh-afzar/OpenMoji-Jekyll-Plugin@latest. + def emoji_src_root(config = {}) if config.key?("emoji") && config["emoji"].key?("src") config["emoji"]["src"] else default_asset_root end end + # Public: Calculate the asset root source for the given config. + # The custom emoji asset root can be defined in the config as + # emoji.asset. + # + # If emoji.asset isn't defined, its value will explicitly set to "emoji" + # + # config - the hash-like configuration of the document's site + # + # Returns a string to use as the asset path. Defaults to the ASSET_PATH. + def emoji_asset_path(config = {}) + if config.key?("emoji") && config["emoji"].key?("src") + if config["emoji"].key?("asset") + config["emoji"]["asset"].chomp("/") + FILE_NAME.to_s + else + "#{DEFAULT_DIR}#{FILE_NAME}" + end + else + "#{ASSET_PATH}#{FILE_NAME}" + end + end + # Public: Defines the conditions for a document to be emojiable. # # doc - the Jekyll::Document or Jekyll::Page # # Returns true if the doc is written & is HTML. @@ -73,20 +116,21 @@ def default_asset_root if !ENV["ASSET_HOST_URL"].to_s.empty? # Ensure that any trailing "/" is trimmed asset_host_url = ENV["ASSET_HOST_URL"].chomp("/") - "#{asset_host_url}#{ASSET_PATH}" + asset_host_url.to_s else - "#{OPENMOJI_ASSET_HOST_URL}#{ASSET_PATH}" + OPENMOJI_ASSET_HOST_URL.to_s end end def replace_document_body(doc) - src = emoji_src(doc.site.config) + src_root = emoji_src_root(doc.site.config) + asset_path = emoji_asset_path(doc.site.config) head, opener, tail = doc.output.partition(OPENING_BODY_TAG_REGEX) body_content, *rest = tail.partition("</body>") - processed_markup = filter_with_emoji(src).call(body_content)[:output].to_s + processed_markup = filter_with_emoji(src_root, asset_path).call(body_content)[:output].to_s String.new(head) << opener << processed_markup << rest.join end end end end