Class: Jekyll::Emoji

Inherits:
Object
  • Object
show all
Defined in:
lib/jekyll-openmoji.rb

Constant Summary collapse

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 Method Summary collapse

Class Method Details

.emoji_asset_path(config = {}) ⇒ Object

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.



93
94
95
96
97
98
99
100
101
102
103
# File 'lib/jekyll-openmoji.rb', line 93

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

.emoji_src_root(config = {}) ⇒ Object

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.



76
77
78
79
80
81
82
# File 'lib/jekyll-openmoji.rb', line 76

def emoji_src_root(config = {})
  if config.key?("emoji") && config["emoji"].key?("src")
    config["emoji"]["src"]
  else
    default_asset_root
  end
end

.emojiable?(doc) ⇒ Boolean

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.

Returns:

  • (Boolean)


110
111
112
113
# File 'lib/jekyll-openmoji.rb', line 110

def emojiable?(doc)
  (doc.is_a?(Jekyll::Page) || doc.write?) &&
    doc.output_ext == ".html" || (doc.permalink&.end_with?("/"))
end

.emojify(doc) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
# File 'lib/jekyll-openmoji.rb', line 18

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

.filter_with_emoji(src_root, asset_path) ⇒ Object

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”)

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.



54
55
56
57
58
# File 'lib/jekyll-openmoji.rb', line 54

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

.filtersObject

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



62
63
64
# File 'lib/jekyll-openmoji.rb', line 62

def filters
  @filters ||= {}
end