Sha256: 480e768ba7d2a17c1ab3c992ab63b46d69ff8bfa9348eb6ba584a16462b5ffe8

Contents?: true

Size: 1.72 KB

Versions: 17

Compression:

Stored size: 1.72 KB

Contents

# ~*~ encoding: utf-8 ~*~
require 'octicons'

# Replace specified tokens with dynamically generated content.
class Gollum::Filter::Macro < Gollum::Filter
  def extract(data)
    quoted_arg   = %r{".*?"}
    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
      	
        if argument =~ /^([a-z0-9_]+)="(.*?)"/
      		opts[Regexp.last_match[1]] = Regexp.last_match[2]
			  elsif argument =~ /^"(.*)"$/
      		args << Regexp.last_match[1]
			  else
				  args << argument
        end
      end
		  
		  args << opts unless opts.empty?
      
      @map[id] = { :macro => macro, :args => args }
      id
    end
  end

  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
          icon = Octicons::Octicon.new('zap', {width: 24, height: 24})
          icon.options[:class] << ' mr-2'
          "<div class='flash flash-error'>#{icon.to_svg}Macro Error for #{macro}: #{e.message}</div>"
        end
      end
    end

    data
  end
end

Version data entries

17 entries across 17 versions & 1 rubygems

Version Path
gollum-lib-5.1.1-java lib/gollum-lib/filter/macro.rb
gollum-lib-5.1.1 lib/gollum-lib/filter/macro.rb
gollum-lib-5.1-java lib/gollum-lib/filter/macro.rb
gollum-lib-5.1 lib/gollum-lib/filter/macro.rb
gollum-lib-5.0.6-java lib/gollum-lib/filter/macro.rb
gollum-lib-5.0.6 lib/gollum-lib/filter/macro.rb
gollum-lib-5.0.5-java lib/gollum-lib/filter/macro.rb
gollum-lib-5.0.5 lib/gollum-lib/filter/macro.rb
gollum-lib-5.0.4-java lib/gollum-lib/filter/macro.rb
gollum-lib-5.0.4 lib/gollum-lib/filter/macro.rb
gollum-lib-5.0.3-java lib/gollum-lib/filter/macro.rb
gollum-lib-5.0.3 lib/gollum-lib/filter/macro.rb
gollum-lib-5.0.2-java lib/gollum-lib/filter/macro.rb
gollum-lib-5.0.2 lib/gollum-lib/filter/macro.rb
gollum-lib-5.0.1-java lib/gollum-lib/filter/macro.rb
gollum-lib-5.0.1 lib/gollum-lib/filter/macro.rb
gollum-lib-5.0 lib/gollum-lib/filter/macro.rb