class HTML::Pipeline::NicoLinkFilter

Constants

DEFAULT_PATTERNS
IGNORE_PARENTS

Public Class Methods

new(doc, context = nil, result = nil) click to toggle source
Calls superclass method
# File lib/html/pipeline/nico_link/filter.rb, line 9
def initialize(doc, context = nil, result = nil)
  super
  @context = context || {}
end

Public Instance Methods

apply_filter(content) click to toggle source
# File lib/html/pipeline/nico_link/filter.rb, line 27
def apply_filter(content)
  content = content.dup
  content.gsub!(merged_pattern) do |text|
    index = Regexp.last_match.captures.index { |n| n }
    pattern_set = patterns[index]
    value = pattern_set[:convert] ? pattern_set[:convert].call(text) : text
    url = pattern_set[:link].gsub('%s', value)
    "<a href=\"#{ERB::Util.html_escape(url)}\">#{ERB::Util.html_escape(text)}</a>"
  end
  content
end
call() click to toggle source
# File lib/html/pipeline/nico_link/filter.rb, line 14
def call
  doc.xpath('.//text()').each do |node|
    next if has_ancestor?(node, IGNORE_PARENTS)

    content = node.to_html
    html = apply_filter(content)
    next if html == content

    node.replace(html)
  end
  doc
end
merged_pattern() click to toggle source
# File lib/html/pipeline/nico_link/filter.rb, line 49
def merged_pattern
  @merged_pattern ||= /\b(?:(#{patterns.map { |n| n[:pattern] }.join(')|(')}))\b/
end
patterns() click to toggle source
# File lib/html/pipeline/nico_link/filter.rb, line 39
def patterns
  @patterns ||= (@context[:nico_link] || DEFAULT_PATTERNS).map do |pattern_set|
    {
      pattern: pattern_set[:pattern],
      link: pattern_set[:link],
      convert: pattern_set[:convert]
    }
  end
end