Class: Gollum::Filter::Macro

Inherits:
Gollum::Filter show all
Defined in:
lib/gollum-lib/filter/macro.rb

Overview

Replace specified tokens with dynamically generated content.

Constant Summary

Constants inherited from Gollum::Filter

PLACEHOLDER_PATTERN

Instance Attribute Summary

Attributes inherited from Gollum::Filter

#close_pattern, #open_pattern

Instance Method Summary collapse

Methods inherited from Gollum::Filter

#initialize

Methods included from Helpers

#path_to_link_text, #trim_leading_slashes

Constructor Details

This class inherits a constructor from Gollum::Filter

Instance Method Details

#extract(data) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/gollum-lib/filter/macro.rb', line 6

def extract(data)
  quoted_arg   = %r{".*?(?<!\\)"} # use a negative lookbehind to not terminate on a " preceeded by \
  unquoted_arg = %r{[^,)]+}
  named_arg    = %r{[a-z0-9_]+=".*?"}
  
  arg = %r{(?:#{quoted_arg}|#{unquoted_arg}|#{named_arg})}
  arg_list = %r{(\s*|#{arg}(?:\s*,\s*#{arg})*)}

  data.gsub(/('?)\<\<\s*([A-Z][A-Za-z0-9]*)\s*\(#{arg_list}\)\s*\>\>/) do
    next CGI.escape_html($&[1..-1]) unless Regexp.last_match[1].empty?
    id = "#{open_pattern}#{Digest::SHA1.hexdigest(Regexp.last_match[2] + Regexp.last_match[3])}#{close_pattern}"
    macro = Regexp.last_match[2]
    argstr = Regexp.last_match[3]
    args = []
    opts = {}
    
    argstr.scan(/,?\s*(#{arg})\s*/) do |arguments|
    	# Stabstabstab
    	argument = arguments.first

      case argument
      in /^([a-z0-9_]+)="(.*?)"/
        opts[Regexp.last_match[1]] = Regexp.last_match[2]
      in /^"(.*)"$/
        args << Regexp.last_match[1].gsub("\\\"", "\"")
      in /\s*false\s*/
        args << false
      in /\s*true\s*/
        args << true
      else
        args << argument
      end
    end
  
  args << opts unless opts.empty?
    
    @map[id] = { :macro => macro, :args => args }
    id
  end
end

#process(data) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/gollum-lib/filter/macro.rb', line 47

def process(data)
  @map.each do |id, spec|
    macro = spec[:macro]
    args  = spec[:args]

    data.gsub!(id) do
      begin
        Gollum::Macro.instance(macro, @markup.wiki, @markup.page).render(*args)
      rescue StandardError => e
        %Q(<div class="flash flash-error gollum-macro-error my-2">Macro Error for #{macro}: #{e.message}</div>)
      end
    end
  end

  data
end