# frozen_string_literal: true class EmojiFormatter include RoutingHelper DISALLOWED_BOUNDING_REGEX = /[[:alnum:]:]/.freeze attr_reader :html, :custom_emojis, :options # @param [ActiveSupport::SafeBuffer] html # @param [Array] custom_emojis # @param [Hash] options # @option options [Boolean] :animate # @option options [String] :style def initialize(html, custom_emojis, options = {}) raise ArgumentError unless html.html_safe? @html = html @custom_emojis = custom_emojis @options = options end def to_s return html if custom_emojis.empty? || html.blank? i = -1 tag_open_index = nil inside_shortname = false shortname_start_index = -1 invisible_depth = 0 last_index = 0 result = ''.dup while i + 1 < html.size i += 1 if invisible_depth.zero? && inside_shortname && html[i] == ':' inside_shortname = false shortcode = html[shortname_start_index + 1..i - 1] char_after = html[i + 1] next unless (char_after.nil? || !DISALLOWED_BOUNDING_REGEX.match?(char_after)) && (emoji = emoji_map[shortcode]) result << html[last_index..shortname_start_index - 1] if shortname_start_index.positive? result << image_for_emoji(shortcode, emoji) last_index = i + 1 elsif tag_open_index && html[i] == '>' tag = html[tag_open_index..i] tag_open_index = nil if invisible_depth.positive? invisible_depth += count_tag_nesting(tag) elsif tag == '