class Habakiri
Constants
- VERSION
Public Class Methods
new(template, prefix = '{{', suffix = '}}')
click to toggle source
# File lib/habakiri.rb, line 5 def initialize(template, prefix = '{{', suffix = '}}') @prefix = prefix.to_s @suffix = suffix.to_s @template = template.to_s @keywords = keywords end
Private Class Methods
exec(template, text)
click to toggle source
# File lib/habakiri.rb, line 57 def exec(template, text) new(template).exec(text) end
Public Instance Methods
exec(text)
click to toggle source
# File lib/habakiri.rb, line 12 def exec(text) diffs = Diff::LCS.sdiff(@template, text.to_s) @keywords.each.with_object({}){|(key, key_begin, key_end), object| index_begin = diffs.index{|d| d.old_position == key_begin } index_end = diffs.index{|d| d.old_position == key_end } list = diffs[index_begin...index_end] # 改行後の追加要素も対応する文字列とみなす i = index_end if i loop do diff = diffs[i] if diff && (diff.action == '+' || (diff.action == '=' && /\R/.match?(diff.old_element))) list.push(diff) i += 1 else break end end end value = list.map(&:new_element).join.strip case object[key] when nil object[key] = value when String object[key] = [object[key], value] when Array object[key] << value end } end
Private Instance Methods
keywords()
click to toggle source
# File lib/habakiri.rb, line 48 def keywords @template.to_enum(:scan, /#{@prefix}.+?#{@suffix}/).map{ m = Regexp.last_match key = m[0].delete_prefix(@prefix).delete_suffix(@suffix).strip [key, m.begin(0), m.end(0)] } end