require 'sanitize'
module Html2rss
module AttributePostProcessors
## Returns a formatted String according to the string pattern.
#
# If +self+ is used, the selectors extracted value will be used.
# It uses [Kernel#format](https://ruby-doc.org/core/Kernel.html#method-i-format)
#
# Imagine this HTML:
#
# Product
# 23,42€
#
#
# YAML usage example:
#
# selectors:
# items:
# selector: 'li'
# price:
# selector: '.price'
# title:
# selector: h1
# post_process:
# name: template
# string: '%{self} (%{price})'
#
# Would return:
# 'Product (23,42€)'
class Template
def initialize(value, env)
@value = value
@options = env[:options]
@item = env[:item]
end
##
# @return [String]
def get
if @options['methods']
string % methods
else
names = string.scan(/%[<|{](\w*)[>|}]/).flatten
names.uniq!
format(string, names.map { |name| [name.to_sym, item_value(name)] }.to_h)
end
end
private
def string
@options['string']
end
def methods
@methods ||= @options['methods'].map(&method(:item_value))
end
def item_value(method_name)
method_name.to_s == 'self' ? @value.to_s : @item.public_send(method_name.to_sym).to_s
end
end
end
end