Class: MailchimpTemplate

Inherits:
Object
  • Object
show all
Defined in:
lib/mailchimp_template.rb,
lib/mailchimp_template/version.rb

Constant Summary collapse

VERSION =
"1.0.2"

Instance Method Summary collapse

Constructor Details

#initialize(template) ⇒ MailchimpTemplate

Returns a new instance of MailchimpTemplate.



6
7
8
# File 'lib/mailchimp_template.rb', line 6

def initialize(template)
  @template = template
end

Instance Method Details

#merge_tagsObject



16
17
18
# File 'lib/mailchimp_template.rb', line 16

def merge_tags
  @template.scan(/\*\|(?<tag_name>.+?)\|\*/).flatten
end

#render(merge_tags: {}, regions: {}) ⇒ Object



10
11
12
13
14
# File 'lib/mailchimp_template.rb', line 10

def render(merge_tags: {}, regions: {})
  result = @template
  result = render_regions(result, regions)
  return render_merge_tags(result, merge_tags)
end

#render_merge_tags(template, merge_tags = {}) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/mailchimp_template.rb', line 29

def render_merge_tags(template, merge_tags = {})
  # | is %7C when escaped by Nokogiri
  template.gsub! /\*(?:\||%7C)(?<tag_name>.+?)(?:\||%7C)\*/ do |match|
    tag_name = $~[:tag_name]
    case tag_name
    when /^IF:(?<cond>.+)/, /^IFNOT:(?<cond>.+)/, /^ELSEIF:(?<cond>.+)/, "ELSE:", "END:IF"
      #TODO: handle conditional merge tags
      match
    when "MC:TOC"
      #TODO: generate TOC of h1 and h2 tags
      match
    when "MC:TOC_TEXT"
      #TODO: generate TOC of h1 and h2 tags, render as text
      match
    when /^DATE:(?<format>.+)/
      #TODO: render with PHP date format (nontrivial, requires a custom parser)
      match
    when "CURRENT_YEAR"
      Date.today.year
    else
      merge_tags[tag_name] || match
    end
  end
end

#render_regions(template, regions = {}) ⇒ Object



20
21
22
23
24
25
26
27
# File 'lib/mailchimp_template.rb', line 20

def render_regions(template, regions = {})
  html = Nokogiri::HTML::DocumentFragment.parse(template)
  html.css("*").select { |n| n.attr("mc:edit") }.each do |editable_region|
    editable_region.children = Nokogiri::HTML::DocumentFragment.parse(regions[editable_region.attr("mc:edit")])
    editable_region.remove_attribute("mc:edit")
  end
  result = html.to_s
end