Class: HTMLPipeline::NodeFilter::EmojiFilter

Inherits:
HTMLPipeline::NodeFilter show all
Defined in:
lib/html_pipeline/node_filter/emoji_filter.rb

Overview

HTML filter that replaces :emoji: with images.

Context:

:asset_root (required) - base url to link to emoji sprite
:asset_path (optional) - url path to link to emoji sprite. :file_name can be used as a placeholder for the sprite file name. If no asset_path is set "emoji/:file_name" is used.
:ignored_ancestor_tags (optional) - Tags to stop the emojification. Node has matched ancestor HTML tags will not be emojified. Default to pre, code, and tt tags. Extra tags please pass in the form of array, e.g., %w(blockquote summary).
:img_attrs (optional) - Attributes for generated img tag. E.g. Pass { "draggble" => true, "height" => nil } to set draggable attribute to "true" and clear height attribute of generated img tag.

Constant Summary collapse

DEFAULT_IGNORED_ANCESTOR_TAGS =
["pre", "code", "tt"].freeze

Instance Attribute Summary

Attributes inherited from HTMLPipeline::NodeFilter

#context

Attributes inherited from Filter

#context, #result

Instance Method Summary collapse

Methods inherited from HTMLPipeline::NodeFilter

call, #html, #initialize, #reset!

Methods inherited from Filter

#base_url, #call, call, #has_ancestor?, #initialize, #needs

Constructor Details

This class inherits a constructor from HTMLPipeline::NodeFilter

Instance Method Details

#after_initializeObject

Build a regexp that matches all valid :emoji: names.



19
20
21
# File 'lib/html_pipeline/node_filter/emoji_filter.rb', line 19

def after_initialize
  @emoji_pattern ||= /:(#{emoji_names.map { |name| Regexp.escape(name) }.join("|")}):/
end

#asset_path(name) ⇒ Object

The url path to link emoji sprites

:file_name can be used in the asset_path as a placeholder for the sprite file name. If no asset_path is set in the context “emoji/:file_name” is used. Returns the context’s asset_path or the default path if no context asset_path is given.



62
63
64
65
66
67
68
# File 'lib/html_pipeline/node_filter/emoji_filter.rb', line 62

def asset_path(name)
  if context[:asset_path]
    context[:asset_path].gsub(":file_name", emoji_filename(name))
  else
    File.join("emoji", emoji_filename(name))
  end
end

#asset_rootObject

The base url to link emoji sprites

Raises ArgumentError if context option has not been provided. Returns the context’s asset_root.



54
55
56
# File 'lib/html_pipeline/node_filter/emoji_filter.rb', line 54

def asset_root
  context[:asset_root]
end

#emoji_image_filter(text) ⇒ Object

Replace :emoji: with corresponding images.

text - String text to replace :emoji: in.

Returns a String with :emoji: replaced with images.



44
45
46
47
48
# File 'lib/html_pipeline/node_filter/emoji_filter.rb', line 44

def emoji_image_filter(text)
  text.gsub(@emoji_pattern) do
    emoji_image_tag(Regexp.last_match(1))
  end
end

#emoji_namesObject



85
86
87
88
89
90
91
# File 'lib/html_pipeline/node_filter/emoji_filter.rb', line 85

def emoji_names
  if self.class.gemoji_loaded?
    Emoji.all.map(&:aliases)
  else
    Gemojione::Index.new.all.map { |i| i[1]["name"] }
  end.flatten.sort
end

#handle_text_chunk(text) ⇒ Object



27
28
29
30
31
# File 'lib/html_pipeline/node_filter/emoji_filter.rb', line 27

def handle_text_chunk(text)
  return unless text.to_s.include?(":")

  text.replace(emoji_image_filter(text.to_s), as: :html)
end

#selectorObject



23
24
25
# File 'lib/html_pipeline/node_filter/emoji_filter.rb', line 23

def selector
  Selma::Selector.new(match_text_within: "*", ignore_text_within: ignored_ancestor_tags)
end

#validateObject

Implementation of validate hook. Errors should raise exceptions or use an existing validator.



35
36
37
# File 'lib/html_pipeline/node_filter/emoji_filter.rb', line 35

def validate
  needs(:asset_root)
end