lib/jekyll-openmoji.rb in jekyll-openmoji-0.0.2 vs lib/jekyll-openmoji.rb in jekyll-openmoji-0.0.3
- old
+ new
@@ -1,141 +1,3 @@
# frozen_string_literal: true
-require "jekyll"
-require "gemoji"
-require "negarmoji"
-require "html/pipeline"
-
-module Jekyll
- class Emoji
- 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_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_root}} asset root.
- #
- # 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_root, asset_path)
- filters[src_root] ||= HTML::Pipeline.new([
- HTML::Pipeline::EmojiFilter,
- ], :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
- @filters ||= {}
- end
-
- # Public: Calculate the asset root source for the given config.
- # The custom emoji asset root can be defined in the config as
- # emoji.src, and must be a valid URL (i.e. it must include a
- # protocol and valid domain)
- #
- # 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 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.
- def emojiable?(doc)
- (doc.is_a?(Jekyll::Page) || doc.write?) &&
- doc.output_ext == ".html" || (doc.permalink&.end_with?("/"))
- end
-
- private
-
- 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.to_s
- else
- OPENMOJI_ASSET_HOST_URL.to_s
- end
- end
-
- def replace_document_body(doc)
- 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_root, asset_path).call(body_content)[:output].to_s
- String.new(head) << opener << processed_markup << rest.join
- end
- end
- end
-end
-
-Jekyll::Hooks.register [:pages, :documents], :post_render do |doc|
- Jekyll::Emoji.emojify(doc) if Jekyll::Emoji.emojiable?(doc)
-end
+require "jekyll-openmoji/plugin"