glyph 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. data/AUTHORS.textile +1 -1
  2. data/CHANGELOG.textile +119 -222
  3. data/LICENSE.textile +1 -1
  4. data/README.textile +42 -23
  5. data/Rakefile +1 -3
  6. data/VERSION +1 -1
  7. data/benchmark.rb +72 -0
  8. data/book/config.yml +4 -4
  9. data/book/document.glyph +90 -57
  10. data/book/images/document_generation.png +0 -0
  11. data/book/lib/macros/reference.rb +75 -22
  12. data/book/output/html/glyph.html +3183 -2121
  13. data/book/output/html/images/document_generation.png +0 -0
  14. data/book/output/pdf/glyph.pdf +7370 -4913
  15. data/book/resources/document_generation.txt +34 -0
  16. data/book/snippets.yml +6 -0
  17. data/book/text/changelog.glyph +45 -34
  18. data/book/text/compiling/compiling.glyph +23 -0
  19. data/book/text/compiling/lite_mode.glyph +23 -0
  20. data/book/text/compiling/programmatic_usage.glyph +77 -0
  21. data/book/text/extending/bookmarks_headers.glyph +21 -0
  22. data/book/text/extending/further_reading.glyph +13 -0
  23. data/book/text/extending/internals.glyph +79 -0
  24. data/book/text/extending/interpreting.glyph +51 -0
  25. data/book/text/extending/macro_def.glyph +64 -0
  26. data/book/text/extending/params_attrs.glyph +70 -0
  27. data/book/text/extending/placeholders.glyph +34 -0
  28. data/book/text/extending/validators.glyph +16 -0
  29. data/book/text/getting_started/configuration.glyph +49 -0
  30. data/book/text/getting_started/create_project.glyph +41 -0
  31. data/book/text/getting_started/structure.glyph +55 -0
  32. data/book/text/introduction.glyph +49 -26
  33. data/book/text/license.glyph +1 -1
  34. data/book/text/macros/macros_block.glyph +99 -0
  35. data/book/text/macros/macros_core.glyph +208 -0
  36. data/book/text/macros/macros_filters.glyph +40 -0
  37. data/book/text/macros/macros_inline.glyph +50 -0
  38. data/book/text/macros/macros_structure.glyph +100 -0
  39. data/book/text/ref_commands.glyph +94 -73
  40. data/book/text/ref_config.glyph +34 -42
  41. data/book/text/ref_macros.glyph +1 -373
  42. data/book/text/text_editing/code.glyph +51 -0
  43. data/book/text/text_editing/conditionals.glyph +49 -0
  44. data/book/text/text_editing/evaluation.glyph +13 -0
  45. data/book/text/text_editing/glyph_files.glyph +7 -0
  46. data/book/text/text_editing/images.glyph +29 -0
  47. data/book/text/text_editing/inclusions.glyph +44 -0
  48. data/book/text/text_editing/links.glyph +53 -0
  49. data/book/text/text_editing/macro_intro.glyph +111 -0
  50. data/book/text/text_editing/raw_html.glyph +112 -0
  51. data/book/text/text_editing/sections.glyph +63 -0
  52. data/book/text/text_editing/stylesheets.glyph +36 -0
  53. data/book/text/troubleshooting/errors_command.glyph +39 -0
  54. data/book/text/troubleshooting/errors_generic.glyph +29 -0
  55. data/book/text/troubleshooting/errors_intro.glyph +3 -0
  56. data/book/text/troubleshooting/errors_macro.glyph +98 -0
  57. data/book/text/troubleshooting/errors_parser.glyph +29 -0
  58. data/config.yml +77 -58
  59. data/document.glyph +25 -25
  60. data/glyph.gemspec +57 -22
  61. data/lib/glyph.rb +54 -13
  62. data/lib/glyph/commands.rb +84 -17
  63. data/lib/glyph/config.rb +3 -3
  64. data/lib/glyph/document.rb +14 -8
  65. data/lib/glyph/interpreter.rb +18 -58
  66. data/lib/glyph/macro.rb +160 -55
  67. data/lib/glyph/macro_validators.rb +104 -12
  68. data/lib/glyph/node.rb +24 -0
  69. data/lib/glyph/parser.rb +278 -0
  70. data/lib/glyph/syntax_node.rb +225 -0
  71. data/macros/core.rb +212 -0
  72. data/macros/filters.rb +66 -15
  73. data/macros/html/block.rb +43 -105
  74. data/macros/html/inline.rb +11 -12
  75. data/macros/html/structure.rb +123 -58
  76. data/macros/xml.rb +33 -0
  77. data/spec/files/container.textile +2 -2
  78. data/spec/files/document.glyph +2 -2
  79. data/spec/files/document_with_toc.glyph +3 -3
  80. data/spec/files/included.textile +1 -1
  81. data/spec/files/ligature.jpg +0 -0
  82. data/spec/files/markdown.markdown +2 -1
  83. data/spec/lib/commands_spec.rb +46 -3
  84. data/spec/lib/document_spec.rb +4 -4
  85. data/spec/lib/glyph_spec.rb +17 -46
  86. data/spec/lib/interpreter_spec.rb +6 -25
  87. data/spec/lib/macro_spec.rb +141 -43
  88. data/spec/lib/macro_validators_spec.rb +27 -5
  89. data/spec/lib/node_spec.rb +26 -1
  90. data/spec/lib/parser_spec.rb +246 -0
  91. data/spec/lib/syntax_node_spec.rb +111 -0
  92. data/spec/macros/core_spec.rb +195 -0
  93. data/spec/macros/filters_spec.rb +38 -4
  94. data/spec/macros/macros_spec.rb +20 -176
  95. data/spec/macros/textile_spec.rb +13 -71
  96. data/spec/macros/xml_spec.rb +77 -0
  97. data/spec/spec_helper.rb +50 -10
  98. data/spec/tasks/load_spec.rb +13 -2
  99. data/styles/default.css +18 -6
  100. data/styles/pagination.css +1 -19
  101. data/tasks/generate.rake +2 -2
  102. data/tasks/load.rake +27 -17
  103. data/tasks/project.rake +1 -1
  104. metadata +75 -62
  105. data/book/script/compile.rb +0 -8
  106. data/book/script/prof +0 -1
  107. data/book/script/prof_results.htm +0 -21079
  108. data/book/text/authoring.glyph +0 -548
  109. data/book/text/extending.glyph +0 -224
  110. data/book/text/getting_started.glyph +0 -158
  111. data/book/text/troubleshooting.glyph +0 -179
  112. data/lib/glyph/glyph_language.rb +0 -538
  113. data/lib/glyph/glyph_language.treetop +0 -27
  114. data/macros/common.rb +0 -160
@@ -0,0 +1,225 @@
1
+ module Glyph
2
+
3
+ # A subclass of Glyph::SyntaxNode is instantiated by Glyph::Parser whenever a known
4
+ # text element is parsed.
5
+ # @since 0.3.0
6
+ class SyntaxNode < Node
7
+
8
+ # @return [String] an empty string
9
+ # @since 0.3.0
10
+ def to_s
11
+ ""
12
+ end
13
+
14
+ # @return [String] the value of the :value key
15
+ # @since 0.3.0
16
+ def evaluate(context, options={})
17
+ self[:value]
18
+ end
19
+
20
+ # @return [Glyph::MacroNode] the first Glyph::MacroNode ancestor
21
+ # @since 0.3.0
22
+ def parent_macro
23
+ find_parent{|n| n.is_a?(MacroNode)}
24
+ end
25
+
26
+ end
27
+
28
+ # The root element of any Glyph Abstract Syntax Tree
29
+ # @since 0.3.0
30
+ class DocumentNode < SyntaxNode
31
+
32
+ # @return [String] the value of the children node
33
+ # @since 0.3.0
34
+ def evaluate(context)
35
+ self[:value] = ""
36
+ self.children.each {|c| self[:value] << c.evaluate(context) }
37
+ self[:value]
38
+ end
39
+
40
+ end
41
+
42
+ # A Glyph macro in Glyph Abstract Syntax Tree
43
+ # @since 0.3.0
44
+ class MacroNode < SyntaxNode
45
+
46
+ # @return [String] a textual representation of the macro
47
+ # @since 0.3.0
48
+ def to_s
49
+ e = self[:escape] ? "=" : ""
50
+ "#{self[:name]}["+e+attributes.join+parameters.join("|")+e+"]"
51
+ end
52
+
53
+ # Expands the macro
54
+ # @return [String] the value of the macro
55
+ # @since 0.3.0
56
+ def evaluate(context, options={})
57
+ self[:value] = expand(context)
58
+ end
59
+
60
+ # @return [Array<Glyph::ParameterNode>] an array of the child parameter nodes
61
+ # @since 0.3.0
62
+ def parameters
63
+ children.select{|n| n.is_a? ParameterNode }
64
+ end
65
+
66
+ #
67
+ # Returns the parameter syntax node at the specified index
68
+ # @param [Fixnum] n the index of the parameter
69
+ # @return [Glyph::ParameterNode, nil] a parameter node
70
+ # @since 0.3.0
71
+ def parameter(n)
72
+ parameters[n]
73
+ end
74
+
75
+ # Equivalent to Glyph::MacroNode#parameter(0).
76
+ # @since 0.3.0
77
+ def value
78
+ parameter(0)
79
+ end
80
+
81
+ # @return [Array<Glyph::AttributeNode>] an array of the child attribute nodes
82
+ # @since 0.3.0
83
+ def attributes
84
+ children.select{|n| n.is_a? AttributeNode }
85
+ end
86
+
87
+ # Returns the attribute syntax node with the specified name
88
+ # @param [Symbol] name the name of the attribute
89
+ # @return [Glyph::AttributeNode, nil] an attribute node
90
+ # @since 0.3.0
91
+ def attribute(name)
92
+ attributes.select{|n| n[:name] == name}[0]
93
+ end
94
+
95
+ alias attr attribute
96
+ alias param parameter
97
+ alias attrs attributes
98
+ alias params parameters
99
+
100
+ # Expands the macro corresponding to self[:name]
101
+ # @param [Glyph::MacroNode] context the context of the macro
102
+ # @return [String] the value of the macro
103
+ # @since 0.3.0
104
+ def expand(context)
105
+ xml_element(context)
106
+ self.merge!({
107
+ :source => context[:source],
108
+ :document => context[:document],
109
+ :info => context[:info],
110
+ :value => ""
111
+ })
112
+ Glyph::Macro.new(self).expand
113
+ end
114
+
115
+ protected
116
+
117
+ def xml_element(context)
118
+ known_macro = Glyph::MACROS.include? self[:name]
119
+ name = self[:name].to_s
120
+ if !known_macro && name.match(/^=(.+)/) then
121
+ # Force tag name override if macro starts with a '='
122
+ name.gsub! /^=(.+)/, '\1'
123
+ end
124
+ case
125
+ # Use XML syntax
126
+ when Glyph['language.set'] == 'xml' then
127
+ self[:element] = name
128
+ self[:name] = :"|xml|"
129
+ # Fallback to XML syntax
130
+ when Glyph['language.options.xml_fallback'] then
131
+ unless known_macro then
132
+ self[:element] = name
133
+ self[:fallback] = true
134
+ self[:name] = :"|xml|"
135
+ end
136
+ else
137
+ # Unknown macro
138
+ raise RuntimeError, "Undefined macro '#{name}'\n -> source: #{context[:source][:name]}" unless known_macro
139
+ end
140
+ end
141
+
142
+ end
143
+
144
+ # A piece of text in Glyph Abstract Syntax Tree
145
+ # @since 0.3.0
146
+ class TextNode < SyntaxNode
147
+
148
+ # @return [String] the text itself
149
+ def to_s
150
+ self[:value]
151
+ end
152
+
153
+ end
154
+
155
+ # A Glyph macro parameter in Glyph Abstract Syntax Tree
156
+ # @since 0.3.0
157
+ class ParameterNode < SyntaxNode
158
+
159
+ # @return [String] a textual representation of the parameter node
160
+ # @since 0.3.0
161
+ def to_s
162
+ children.join
163
+ end
164
+
165
+ # @return [String] a textual representation of the parameter contents
166
+ # @since 0.3.0
167
+ def contents
168
+ parent[:escape] ? ".[=#{children.join}=]" : children.join
169
+ end
170
+
171
+ # @param [Glyph::MacroNode] context the context of the macro
172
+ # @param [Hash] options a hash of options
173
+ # @option options [Boolean] :params whether to evaluate child nodes or not
174
+ # @return [String] the evaluated child nodes
175
+ # @since 0.3.0
176
+ def evaluate(context, options={:params => false})
177
+ self[:value] = ""
178
+ self.children.each {|c| self[:value] << c.evaluate(context) } if options[:params]
179
+ self[:value]
180
+ end
181
+
182
+ end
183
+
184
+ # A Glyph macro attribute in Glyph Abstract Syntax Tree
185
+ # @since 0.3.0
186
+ class AttributeNode < SyntaxNode
187
+
188
+ # @return [String] a textual representation of the attribute node
189
+ # @since 0.3.0
190
+ def to_s
191
+ e = self[:escape] ? "=" : ""
192
+ "@#{self[:name]}["+e+children.join+e+"]"
193
+ end
194
+
195
+ # @return [String] a textual representation of the attribute contents
196
+ # @since 0.3.0
197
+ def contents
198
+ self[:escape] ? ".[=#{children.join}=]" : children.join
199
+ end
200
+
201
+ # @param [Glyph::MacroNode] context the context of the macro
202
+ # @param [Hash] options a hash of options
203
+ # @option options [Boolean] :attrs whether to evaluate child nodes or not
204
+ # @return [String] the evaluated child nodes
205
+ # @since 0.3.0
206
+ def evaluate(context, options={:attrs => false})
207
+ self[:value] = ""
208
+ self.children.each {|c| self[:value] << c.evaluate(context) } if options[:attrs]
209
+ self[:value]
210
+ end
211
+
212
+ end
213
+
214
+ # Some escaped text within Glyph Abstract Syntax Tree
215
+ # @since 0.3.0
216
+ class EscapeNode < SyntaxNode
217
+
218
+ # Returns the escaped value
219
+ def to_s
220
+ self[:value]
221
+ end
222
+
223
+ end
224
+
225
+ end
data/macros/core.rb ADDED
@@ -0,0 +1,212 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ macro :snippet do
4
+ no_mutual_inclusion_in 0
5
+ ident = value.to_sym
6
+ if Glyph::SNIPPETS.has_key? ident then
7
+ begin
8
+ update_source "snippet[#{ident}]"
9
+ interpret Glyph::SNIPPETS[ident]
10
+ rescue Exception => e
11
+ case
12
+ when e.is_a?(Glyph::MutualInclusionError) then
13
+ raise
14
+ when e.is_a?(Glyph::MacroError) then
15
+ macro_warning e.message, e
16
+ else
17
+ macro_warning e.message, e
18
+ end
19
+ macro_todo "Correct errors in snippet '#{ident}'"
20
+ end
21
+ else
22
+ macro_warning "Snippet '#{ident}' does not exist"
23
+ "[SNIPPET '#{ident}' NOT PROCESSED]"
24
+ end
25
+ end
26
+
27
+ macro "snippet:" do
28
+ exact_parameters 2
29
+ ident = param(0)
30
+ text = param(1)
31
+ Glyph::SNIPPETS[ident.to_sym] = text
32
+ ""
33
+ end
34
+
35
+ macro "macro:" do
36
+ safety_check
37
+ exact_parameters 2
38
+ ident = param(0)
39
+ code = param(1)
40
+ Glyph.macro(ident) do
41
+ instance_eval code
42
+ end
43
+ ""
44
+ end
45
+
46
+ macro :include do
47
+ safety_check
48
+ exact_parameters 1
49
+ no_mutual_inclusion_in 0
50
+ v = value
51
+ v += ".glyph" unless v.match(/\..+$/)
52
+ ext = v.match(/\.(.*)$/)[1]
53
+ if Glyph.lite? then
54
+ file = Pathname.new(v)
55
+ else
56
+ if ext == 'rb' then
57
+ file = Glyph::PROJECT/"lib/#{v}"
58
+ else
59
+ file = Glyph::PROJECT/"text/#{v}"
60
+ end
61
+ end
62
+ if file.exist? then
63
+ contents = file_load file
64
+ if ext == "rb" then
65
+ begin
66
+ Glyph.instance_eval contents
67
+ ""
68
+ rescue Exception => e
69
+ macro_warning e.message, e
70
+ end
71
+ else
72
+ if Glyph["filters.by_file_extension"] && !ext.in?(['rb','glyph']) then
73
+ if Glyph::MACROS.include?(ext.to_sym) then
74
+ contents = "#{ext}[#{contents}]"
75
+ else
76
+ macro_warning "Filter macro '#{ext}' not available"
77
+ end
78
+ end
79
+ begin
80
+ update_source v
81
+ interpret contents
82
+ rescue Glyph::MutualInclusionError => e
83
+ raise
84
+ rescue Glyph::MacroError => e
85
+ macro_warning e.message, e
86
+ macro_todo "Correct errors in file '#{value}'"
87
+ rescue Exception => e
88
+ macro_warning e.message, e
89
+ macro_todo "Correct errors in file '#{value}'"
90
+ end
91
+ end
92
+ else
93
+ macro_warning "File '#{value}' no found."
94
+ "[FILE '#{value}' NOT FOUND]"
95
+ end
96
+ end
97
+
98
+ macro :ruby do
99
+ safety_check
100
+ max_parameters 1
101
+ res = Glyph.instance_eval(value.gsub(/\\*([\[\]\|])/){$1})
102
+ res.is_a?(Proc) ? "" : res
103
+ end
104
+
105
+ macro :config do
106
+ Glyph[value]
107
+ end
108
+
109
+ macro "config:" do
110
+ safety_check
111
+ max_parameters 2
112
+ setting = param(0)
113
+ v = param(1) rescue nil
114
+ if setting.match /^system\..+/ then
115
+ macro_warning "Cannot reset '#{setting}' setting (system use only)."
116
+ else
117
+ Glyph[setting] = v
118
+ end
119
+ nil
120
+ end
121
+
122
+ macro :comment do
123
+ ""
124
+ end
125
+
126
+ macro :escape do
127
+ value
128
+ end
129
+
130
+ macro :condition do
131
+ min_parameters 1
132
+ max_parameters 2
133
+ res = param(0)
134
+ (res.blank? || res == "false") ? "" : param(1).to_s
135
+ end
136
+
137
+ macro :eq do
138
+ min_parameters 1
139
+ max_parameters 2
140
+ (param(0).to_s == param(1).to_s) ? true : nil
141
+ end
142
+
143
+ macro :not do
144
+ max_parameters 1
145
+ v = param(0).to_s
146
+ (v.blank? || v == "false") ? true : nil
147
+ end
148
+
149
+ macro :and do
150
+ min_parameters 1
151
+ max_parameters 2
152
+ res_a = !param(0).blank?
153
+ res_b = !param(1).blank?
154
+ (res_a && res_b) ? true : nil
155
+ end
156
+
157
+ macro :or do
158
+ min_parameters 1
159
+ max_parameters 2
160
+ res_a = !param(0).blank?
161
+ res_b = !param(1).blank?
162
+ (res_a || res_b) ? true : nil
163
+ end
164
+
165
+ macro :match do
166
+ exact_parameters 2
167
+ val = param(0).to_s
168
+ regexp = param(1).to_s
169
+ macro_error "Invalid regular expression: #{regexp}" unless regexp.match /^\/.*\/[a-z]?$/
170
+ val.match(instance_eval(regexp)) ? true : nil
171
+ end
172
+
173
+ macro "alias:" do
174
+ exact_parameters 2
175
+ Glyph.macro_alias param(0) => param(1)
176
+ end
177
+
178
+ macro "rewrite:" do
179
+ safety_check
180
+ exact_parameters 2
181
+ macro_name = param(0).to_sym
182
+ @node.param(1).descend do |n, level|
183
+ if n[:name] == macro_name then
184
+ macro_error "Macro '#{macro_name}' cannot be defined by itself"
185
+ end
186
+ end
187
+ string = raw_param(1)
188
+ Glyph.macro macro_name do
189
+ s = string.dup
190
+ # Parameters
191
+ s.gsub!(/\{\{(\d+)\}\}/) do
192
+ raw_param($1.to_i).strip
193
+ end
194
+ # Attributes
195
+ s.gsub!(/\{\{([^\[\]\|\\\s]+)\}\}/) do
196
+ raw_attr($1.to_sym).strip
197
+ end
198
+ interpret s
199
+ end
200
+ nil
201
+ end
202
+
203
+ macro_alias '--' => :comment
204
+ macro_alias '&' => :snippet
205
+ macro_alias '&:' => 'snippet:'
206
+ macro_alias '%:' => 'macro:'
207
+ macro_alias '%' => :ruby
208
+ macro_alias '$' => :config
209
+ macro_alias '$:' => 'config:'
210
+ macro_alias '.' => :escape
211
+ macro_alias '?' => :condition
212
+ macro_alias 'rw:' => 'rewrite:'
data/macros/filters.rb CHANGED
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  macro :textile do
4
- exact_parameters 1, :level => :warning
4
+ exact_parameters 1
5
5
  rc = nil
6
6
  begin
7
7
  require 'RedCloth'
8
- rc = RedCloth.new @value, Glyph::CONFIG.get("filters.redcloth.restrictions")
8
+ rc = RedCloth.new value, Glyph::CONFIG.get("filters.redcloth.restrictions")
9
9
  rescue Exception
10
- macro_error "RedCloth gem not installed. Please run: gem insall RedCloth"
10
+ macro_error "RedCloth gem not installed. Please run: gem install RedCloth"
11
11
  end
12
12
  target = Glyph["filters.target"]
13
13
  case target.to_sym
@@ -24,7 +24,10 @@ macro :markdown do
24
24
  exact_parameters 1, :level => :warning
25
25
  md = nil
26
26
  markdown_converter = Glyph["filters.markdown_converter"].to_sym rescue nil
27
- if !markdown_converter then
27
+ begin
28
+ raise LoadError unless markdown_converter
29
+ require markdown_converter.to_s
30
+ rescue LoadError
28
31
  begin
29
32
  require 'bluecloth'
30
33
  markdown_converter = :bluecloth
@@ -41,28 +44,24 @@ macro :markdown do
41
44
  require 'kramdown'
42
45
  markdown_converter = :kramdown
43
46
  rescue LoadError
44
- macro_error "No MarkDown converter installed. Please run: gem install bluecloth"
47
+ macro_error "No supported MarkDown converter installed. Please run: gem install bluecloth"
45
48
  end
46
49
  end
47
50
  end
48
51
  end
49
- Glyph["filters.markdown_converter"] = markdown_converter
50
52
  end
53
+ Glyph["filters.markdown_converter"] = markdown_converter
51
54
  case markdown_converter
52
55
  when :bluecloth
53
- require 'bluecloth'
54
- md = BlueCloth.new @value
56
+ md = BlueCloth.new value
55
57
  when :rdiscount
56
- require 'rdiscount'
57
- md = RDiscount.new @value
58
+ md = RDiscount.new value
58
59
  when :maruku
59
- require 'maruku'
60
- md = Maruku.new @value
60
+ md = Maruku.new value
61
61
  when :kramdown
62
- require 'kramdown'
63
- md = Kramdown::Document.new @value
62
+ md = Kramdown::Document.new value
64
63
  else
65
- macro_error "No MarkDown converter installed. Please run: gem insall bluecloth"
64
+ macro_error "No supported MarkDown converter installed. Please run: gem install bluecloth"
66
65
  end
67
66
  target = Glyph["filters.target"]
68
67
  if target.to_sym == :html then
@@ -72,4 +71,56 @@ macro :markdown do
72
71
  end
73
72
  end
74
73
 
74
+ macro :highlight do
75
+ exact_parameters 2
76
+ lang = param(0)
77
+ text = param(1)
78
+ text.gsub!(/\\(.)/){$1}
79
+ highlighter = Glyph["filters.highlighter"].to_sym rescue nil
80
+ begin
81
+ raise LoadError unless highlighter
82
+ if highlighter.to_s.match(/^(uv|ultraviolet)$/) then
83
+ require 'uv'
84
+ else
85
+ require highlighter.to_s
86
+ end
87
+ rescue LoadError
88
+ begin
89
+ require 'coderay'
90
+ highlighter = :coderay
91
+ rescue LoadError
92
+ begin
93
+ require 'uv'
94
+ highlighter = :ultraviolet
95
+ rescue LoadError
96
+ macro_error "No supported highlighter installed. Please run: gem install coderay"
97
+ end
98
+ end
99
+ end
100
+ Glyph["highlighter.current"] = highlighter
101
+ target = Glyph["filters.target"]
102
+ result = ""
103
+ case highlighter.to_sym
104
+ when :coderay
105
+ begin
106
+ result = CodeRay.scan(text, lang).div(Glyph["filters.coderay"])
107
+ rescue Exception => e
108
+ macro_error e.message
109
+ end
110
+ when :ultraviolet
111
+ begin
112
+ target = 'xhtml' if target.to_s == 'html'
113
+ result = Uv.parse(text.to_s, target.to_s, lang.to_s,
114
+ Glyph["filters.ultraviolet.line_numbers"],
115
+ Glyph["filters.ultraviolet.theme"].to_s)
116
+ rescue Exception => e
117
+ macro_error e.message
118
+ end
119
+ else
120
+ macro_error "No supported highlighter installed. Please run: gem install coderay"
121
+ end
122
+ result
123
+ end
124
+
75
125
  macro_alias :md => :markdown
126
+ macro_alias :txt => :textile