class Jekyll::Emoji

Constants

BODY_START_TAG
DEFAULT_ASSET_PATH
DEFAULT_DIR
DEFAULT_EXTENSION
DEFAULT_HOST_URL

Default configuration.

DEFAULT_IMG_ATTRS
FILE_NAME

Regex values.

OPENING_BODY_TAG_REGEX
VERSION

Public Class Methods

emoji_asset_path(config = {}) click to toggle source

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.

# File lib/jekyll-openmoji/plugin.rb, line 111
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
    "#{DEFAULT_ASSET_PATH}#{FILE_NAME}"
  end
end
emoji_attributes(config = {}) click to toggle source

Public: return emoji <img> tag attributes. The custom emoji css attributes can be defined with emoji.img_attrs.

for example:

emoji:

img_attrs:
  class: "openmoji"
  height: 30

this will override default emoji css attributes.

If emoji.img_attrs isn't defined, its value will explicitly set to DEFAULT_IMG_ATTRS.

config - the hash-like configuration of the document's site

Returns a hash to use as the attributes. Defaults to the DEFAULT_IMG_ATTRS.

# File lib/jekyll-openmoji/plugin.rb, line 158
def emoji_attributes(config = {})
  if config.key?("emoji") && config["emoji"].key?("img_attrs")
    # merge default values with custom values and then
    # convert hash keys to symbols.
    DEFAULT_IMG_ATTRS.merge!(config["emoji"]["img_attrs"])
      .map { |key, value| [key.to_sym, value] }.to_h
  else
    # convert hash keys to symbols.
    DEFAULT_IMG_ATTRS.map { |key, value| [key.to_sym, value] }.to_h
  end
end
emoji_extension(config = {}) click to toggle source

Public: return extension for emoji files. The custom emoji extension can be defined in the config as emoji.extension.

If emoji.extension isn't defined, its value will explicitly set to “svg”.

config - the hash-like configuration of the document's site.

Returns a string to use as the extension. Defaults to the DEFAULT_EXTENSION.

# File lib/jekyll-openmoji/plugin.rb, line 132
def emoji_extension(config = {})
  if config.key?("emoji") && config["emoji"].key?("extension")
    config["emoji"]["extension"]
  else
    DEFAULT_EXTENSION.to_s
  end
end
emoji_src_root(config = {}) click to toggle source

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 cdn.jsdelivr.net/gh/azadeh-afzar/OpenMoji-Jekyll-Plugin@latest.

# File lib/jekyll-openmoji/plugin.rb, line 94
def emoji_src_root(config = {})
  if config.key?("emoji") && config["emoji"].key?("src")
    config["emoji"]["src"]
  else
    default_asset_root
  end
end
emojiable?(doc) click to toggle source

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.

# File lib/jekyll-openmoji/plugin.rb, line 175
def emojiable?(doc)
  (doc.is_a?(Jekyll::Page) || doc.write?) &&
    doc.output_ext == ".html" || (doc.permalink&.end_with?("/"))
end
emojify(doc) click to toggle source
# File lib/jekyll-openmoji/plugin.rb, line 26
def emojify(doc)
  return unless
      doc.output =~ HTML::Pipeline::NegarMojiHtmlPipeline::NegarehEmojiFilter
                      .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)
                 file_extension = emoji_extension(doc.site.config)
                 img_attrs = emoji_attributes(doc.site.config)
                 filter_with_emoji(src_root, asset_path, file_extension,
                                   img_attrs).call(doc.output)[:output].to_s
               end
end
filter_with_emoji(src_root, asset_path, file_extension, img_attrs) click to toggle source

Public: Create or fetch the filter for the given {{src_root}} asset root.

:src_root - the asset root URL (e.g. cdn.jsdelivr.net/gh/azadeh-afzar/OpenMoji-Jekyll-Plugin@latest) :asset_path - the asset sub-path of src (e.g. “/images/color/svg”) [default = “emoji”].

:extension - the extension of emoji image files, [default = svg ].

:img_attrs - the custom css properties for emoji <img> tag.

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.

# File lib/jekyll-openmoji/plugin.rb, line 69
def filter_with_emoji(src_root, asset_path, file_extension, img_attrs)
  filters[src_root] ||= HTML::Pipeline.new([HTML::Pipeline::
          NegarMojiHtmlPipeline::NegarehEmojiFilter],
                                           :asset_root => src_root,
                                           :asset_path => asset_path,
                                           :extension  => file_extension,
                                           :img_attrs  => img_attrs)
end
filters() click to toggle source

Public: Filters hash where the key is the asset root source. Effectively a cache.

# File lib/jekyll-openmoji/plugin.rb, line 80
def filters
  @filters ||= {}
end

Private Class Methods

default_asset_root() click to toggle source
# File lib/jekyll-openmoji/plugin.rb, line 182
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
    DEFAULT_HOST_URL.to_s
  end
end
replace_document_body(doc) click to toggle source
# File lib/jekyll-openmoji/plugin.rb, line 192
def replace_document_body(doc)
  src_root = emoji_src_root(doc.site.config)
  asset_path = emoji_asset_path(doc.site.config)
  file_extension = emoji_extension(doc.site.config)
  img_attrs = emoji_attributes(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, file_extension,
                                       img_attrs).call(body_content)[:output]
                       .to_s
  String.new(head) << opener << processed_markup << rest.join
end