Control jemoji with a front matter variable
Author: | Admin |
Title: | Control jemoji plugin with front matter variable |
Language: | en-US |
Number of words: | 349 |
Created: | 04:46 on Friday, 08. October 2021 |
Modified: | 04:46 on Friday, 08. October 2021 |
Keywords: | jekyll, ruby, yaml, frontmatter |
Excerpt: | Use a front matter variable to control the jemoji plugin in Jekyll. This allows to disable emjoi parsing for a single page. |
Tags: | Jekyll |
Page layout: | nonav |
This is a very minor modification of the Jekyll jemoji plugin. It allows to set a front matter variable emoji: false
to disable emoji parsing for the entire document. The plugin is fairly simple and consists of only a single Ruby source code file with the name jemoji.rb
.
The relevant change(s) can be found in the emojiable?
method between lines 65 to 68. It checks for the presence of a emoji
variable in the document’s data (frontmatter) and returns false when the variable is present with a value of false. This can be useful for pages that contain source code or similar content that might contain emoji character sequences when it is not desirable to parse them.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# frozen_string_literal: true
require "jekyll"
require "html/pipeline"
module Jekyll
class Emoji
GITHUB_DOT_COM_ASSET_HOST_URL = "https://github.githubassets.com"
ASSET_PATH = "/images/icons/"
BODY_START_TAG = "<body"
OPENING_BODY_TAG_REGEX = %r!<body(.*?)>\s*!m.freeze
class << self
def emojify(doc)
return unless doc.output&.match?(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
end
end
# Public: Create or fetch the filter for the given asset root.
#
# src - the asset root URL (e.g. https://github.githubassets.com/images/icons/)
#
# Returns an HTML::Pipeline instance for the given asset root.
def filter_with_emoji(src)
filters[src] ||= HTML::Pipeline.new([
HTML::Pipeline::EmojiFilter,
], :asset_root => src, :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 assets-cdn.github.com.
def emoji_src(config = {})
if config.key?("emoji") && config["emoji"].key?("src")
config["emoji"]["src"]
else
default_asset_root
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 and does not forbid
# emoji parsing via front matter variable emoji: false.
def emojiable?(doc)
(doc.is_a?(Jekyll::Page) || doc.write?) && doc.data["emoji"] != false &&
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}#{ASSET_PATH}"
else
"#{GITHUB_DOT_COM_ASSET_HOST_URL}#{ASSET_PATH}"
end
end
def replace_document_body(doc)
src = emoji_src(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
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
You can write a comment
Please stick to common netiquette when posting comments. Avoid any form of personal attacks, harassment, hate speech, sexism, racism or otherwise inappropriate content. Comments that violate common rules of civilized communication among humans will be deleted without further notice.
Note: if you do not provide a user name, your comment will be posted as Anonymous