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
46
47
48
49
50
51
52
53
54
|
# File 'lib/daimon_markdown/filter/plugin.rb', line 6
def call
doc.search(".//text()").each do |node|
next if node.parent.name == "code"
result[:plugins] = []
node.to_s.scan(/{{(.+?)}}/m) do |str|
begin
parser = DaimonMarkdown::Parser.new(str[0])
parser.parse
plugin_class = DaimonMarkdown::Plugin.lookup(parser.name)
plugin = plugin_class.new(doc, node, result, context)
plugin.call(*parser.args)
rescue DaimonMarkdown::Parser::Error => ex
message = "#{node} (#{ex.class}: #{ex.message})"
node.replace(message)
rescue DaimonMarkdown::Plugin::UnknownPluginError => ex
node.replace(ex.message)
rescue DaimonMarkdown::Plugin::Error => ex
message = " <pre>Error occured in \#{plugin_class}\n \#{node} (\#{ex.class}: \#{ex.message})\n \#{ex.backtrace.join(\"\\n\")}</pre>\n MESSAGE\n node.parent.replace(message)\n rescue => ex\n message = <<~MESSAGE\n <pre>Unexpected error occured in \#{plugin_class}\n \#{node} (\#{ex.class}: \#{ex.message})\n \#{ex.backtrace.join(\"\\n\")}</pre>\n MESSAGE\n node.parent.replace(message)\n end\n end\n unless result[:plugins].empty?\n scanner = StringScanner.new(node.to_s)\n new_node = \"\"\n loop do\n if scanner.match?(/{{.+?}}/)\n new_node << result[:plugins].shift\n scanner.pos += scanner.matched_size\n else\n new_node << scanner.getch\n end\n break if scanner.eos?\n end\n node.replace(new_node)\n end\n end\n doc\nend\n"
|