zmack-ultraviolet 0.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. data/History.txt +25 -0
  2. data/Manifest.txt +233 -0
  3. data/README.txt +52 -0
  4. data/Rakefile +49 -0
  5. data/VERSION +1 -0
  6. data/bin/theme2latexrender +122 -0
  7. data/bin/theme2xhtmlrender +157 -0
  8. data/bin/uv +140 -0
  9. data/lib/uv.rb +89 -0
  10. data/lib/uv/render_processor.rb +131 -0
  11. data/lib/uv/utility.rb +67 -0
  12. data/mm/manual.mm +840 -0
  13. data/render/latex/active4d.render +132 -0
  14. data/render/latex/all_hallows_eve.render +96 -0
  15. data/render/latex/amy.render +171 -0
  16. data/render/latex/blackboard.render +111 -0
  17. data/render/latex/brilliance_black.render +552 -0
  18. data/render/latex/brilliance_dull.render +561 -0
  19. data/render/latex/cobalt.render +162 -0
  20. data/render/latex/dawn.render +126 -0
  21. data/render/latex/eiffel.render +132 -0
  22. data/render/latex/espresso_libre.render +123 -0
  23. data/render/latex/idle.render +93 -0
  24. data/render/latex/iplastic.render +99 -0
  25. data/render/latex/lazy.render +96 -0
  26. data/render/latex/mac_classic.render +135 -0
  27. data/render/latex/magicwb_amiga.render +117 -0
  28. data/render/latex/pastels_on_dark.render +204 -0
  29. data/render/latex/slush_poppies.render +123 -0
  30. data/render/latex/spacecadet.render +81 -0
  31. data/render/latex/sunburst.render +186 -0
  32. data/render/latex/twilight.render +153 -0
  33. data/render/latex/zenburnesque.render +126 -0
  34. data/render/old/txt2tags.render +131 -0
  35. data/render/xhtml/active4d.render +140 -0
  36. data/render/xhtml/all_hallows_eve.render +104 -0
  37. data/render/xhtml/amy.render +179 -0
  38. data/render/xhtml/blackboard.render +119 -0
  39. data/render/xhtml/brilliance_black.render +560 -0
  40. data/render/xhtml/brilliance_dull.render +569 -0
  41. data/render/xhtml/cobalt.render +170 -0
  42. data/render/xhtml/dawn.render +134 -0
  43. data/render/xhtml/eiffel.render +140 -0
  44. data/render/xhtml/espresso_libre.render +131 -0
  45. data/render/xhtml/files/css/active4d.css +114 -0
  46. data/render/xhtml/files/css/all_hallows_eve.css +72 -0
  47. data/render/xhtml/files/css/amy.css +147 -0
  48. data/render/xhtml/files/css/blackboard.css +88 -0
  49. data/render/xhtml/files/css/brilliance_black.css +605 -0
  50. data/render/xhtml/files/css/brilliance_dull.css +599 -0
  51. data/render/xhtml/files/css/cobalt.css +149 -0
  52. data/render/xhtml/files/css/dawn.css +121 -0
  53. data/render/xhtml/files/css/eiffel.css +121 -0
  54. data/render/xhtml/files/css/espresso_libre.css +109 -0
  55. data/render/xhtml/files/css/idle.css +62 -0
  56. data/render/xhtml/files/css/iplastic.css +80 -0
  57. data/render/xhtml/files/css/lazy.css +73 -0
  58. data/render/xhtml/files/css/mac_classic.css +123 -0
  59. data/render/xhtml/files/css/magicwb_amiga.css +104 -0
  60. data/render/xhtml/files/css/pastels_on_dark.css +188 -0
  61. data/render/xhtml/files/css/slush_poppies.css +85 -0
  62. data/render/xhtml/files/css/spacecadet.css +51 -0
  63. data/render/xhtml/files/css/sunburst.css +180 -0
  64. data/render/xhtml/files/css/twilight.css +137 -0
  65. data/render/xhtml/files/css/zenburnesque.css +91 -0
  66. data/render/xhtml/idle.render +101 -0
  67. data/render/xhtml/iplastic.render +107 -0
  68. data/render/xhtml/lazy.render +104 -0
  69. data/render/xhtml/mac_classic.render +143 -0
  70. data/render/xhtml/magicwb_amiga.render +125 -0
  71. data/render/xhtml/pastels_on_dark.render +212 -0
  72. data/render/xhtml/slush_poppies.render +131 -0
  73. data/render/xhtml/spacecadet.render +89 -0
  74. data/render/xhtml/sunburst.render +194 -0
  75. data/render/xhtml/twilight.render +161 -0
  76. data/render/xhtml/zenburnesque.render +134 -0
  77. data/syntax/actionscript.syntax +97 -0
  78. data/syntax/active4d.syntax +276 -0
  79. data/syntax/active4d_html.syntax +311 -0
  80. data/syntax/active4d_ini.syntax +50 -0
  81. data/syntax/active4d_library.syntax +21 -0
  82. data/syntax/ada.syntax +33 -0
  83. data/syntax/antlr.syntax +151 -0
  84. data/syntax/apache.syntax +191 -0
  85. data/syntax/applescript.syntax +384 -0
  86. data/syntax/asp.syntax +70 -0
  87. data/syntax/asp_vb.net.syntax +129 -0
  88. data/syntax/bibtex.syntax +151 -0
  89. data/syntax/blog_html.syntax +41 -0
  90. data/syntax/blog_markdown.syntax +42 -0
  91. data/syntax/blog_text.syntax +27 -0
  92. data/syntax/blog_textile.syntax +27 -0
  93. data/syntax/buggy/nemerle.syntax +74 -0
  94. data/syntax/build.syntax +53 -0
  95. data/syntax/bulletin_board.syntax +287 -0
  96. data/syntax/c++.syntax +109 -0
  97. data/syntax/c.syntax +326 -0
  98. data/syntax/cake.syntax +55 -0
  99. data/syntax/camlp4.syntax +36 -0
  100. data/syntax/cm.syntax +32 -0
  101. data/syntax/coldfusion.syntax +119 -0
  102. data/syntax/context_free.syntax +176 -0
  103. data/syntax/cs.syntax +59 -0
  104. data/syntax/css.syntax +195 -0
  105. data/syntax/css_experimental.syntax +1925 -0
  106. data/syntax/csv.syntax +68 -0
  107. data/syntax/d.syntax +142 -0
  108. data/syntax/diff.syntax +81 -0
  109. data/syntax/dokuwiki.syntax +204 -0
  110. data/syntax/dot.syntax +47 -0
  111. data/syntax/doxygen.syntax +43 -0
  112. data/syntax/dylan.syntax +62 -0
  113. data/syntax/eiffel.syntax +78 -0
  114. data/syntax/erlang.syntax +922 -0
  115. data/syntax/f-script.syntax +80 -0
  116. data/syntax/fortran.syntax +141 -0
  117. data/syntax/fxscript.syntax +142 -0
  118. data/syntax/greasemonkey.syntax +34 -0
  119. data/syntax/gri.syntax +83 -0
  120. data/syntax/groovy.syntax +191 -0
  121. data/syntax/gtd.syntax +22 -0
  122. data/syntax/gtdalt.syntax +143 -0
  123. data/syntax/haml.syntax +88 -0
  124. data/syntax/haskell.syntax +88 -0
  125. data/syntax/html-asp.syntax +27 -0
  126. data/syntax/html.syntax +362 -0
  127. data/syntax/html_django.syntax +36 -0
  128. data/syntax/html_for_asp.net.syntax +424 -0
  129. data/syntax/html_mason.syntax +119 -0
  130. data/syntax/html_rails.syntax +40 -0
  131. data/syntax/html_tcl.syntax +26 -0
  132. data/syntax/icalendar.syntax +32 -0
  133. data/syntax/inform.syntax +48 -0
  134. data/syntax/ini.syntax +55 -0
  135. data/syntax/installer_distribution_script.syntax +77 -0
  136. data/syntax/io.syntax +81 -0
  137. data/syntax/java.syntax +211 -0
  138. data/syntax/javaproperties.syntax +20 -0
  139. data/syntax/javascript.syntax +256 -0
  140. data/syntax/javascript_+_prototype.syntax +72 -0
  141. data/syntax/javascript_+_prototype_bracketed.syntax +140 -0
  142. data/syntax/jquery_javascript.syntax +114 -0
  143. data/syntax/json.syntax +136 -0
  144. data/syntax/languagedefinition.syntax +708 -0
  145. data/syntax/latex.syntax +566 -0
  146. data/syntax/latex_beamer.syntax +41 -0
  147. data/syntax/latex_log.syntax +50 -0
  148. data/syntax/latex_memoir.syntax +64 -0
  149. data/syntax/lexflex.syntax +219 -0
  150. data/syntax/lighttpd.syntax +54 -0
  151. data/syntax/lilypond.syntax +492 -0
  152. data/syntax/lisp.syntax +61 -0
  153. data/syntax/literate_haskell.syntax +24 -0
  154. data/syntax/logo.syntax +29 -0
  155. data/syntax/logtalk.syntax +152 -0
  156. data/syntax/lua.syntax +86 -0
  157. data/syntax/m.syntax +142 -0
  158. data/syntax/macports_portfile.syntax +163 -0
  159. data/syntax/mail.syntax +118 -0
  160. data/syntax/makefile.syntax +36 -0
  161. data/syntax/man.syntax +17 -0
  162. data/syntax/markdown.syntax +543 -0
  163. data/syntax/mediawiki.syntax +567 -0
  164. data/syntax/mel.syntax +92 -0
  165. data/syntax/mips.syntax +66 -0
  166. data/syntax/mod_perl.syntax +50 -0
  167. data/syntax/modula-3.syntax +47 -0
  168. data/syntax/moinmoin.syntax +189 -0
  169. data/syntax/mootools.syntax +572 -0
  170. data/syntax/movable_type.syntax +162 -0
  171. data/syntax/multimarkdown.syntax +39 -0
  172. data/syntax/objective-c++.syntax +18 -0
  173. data/syntax/objective-c.syntax +233 -0
  174. data/syntax/ocaml.syntax +764 -0
  175. data/syntax/ocamllex.syntax +167 -0
  176. data/syntax/ocamlyacc.syntax +184 -0
  177. data/syntax/old/YAML.yaml +160 -0
  178. data/syntax/old/txt2tags.yaml +139 -0
  179. data/syntax/opengl.syntax +14 -0
  180. data/syntax/pascal.syntax +77 -0
  181. data/syntax/perl.syntax +1115 -0
  182. data/syntax/php.syntax +1253 -0
  183. data/syntax/plain_text.syntax +32 -0
  184. data/syntax/pmwiki.syntax +113 -0
  185. data/syntax/postscript.syntax +114 -0
  186. data/syntax/processing.syntax +106 -0
  187. data/syntax/prolog.syntax +40 -0
  188. data/syntax/property_list.syntax +635 -0
  189. data/syntax/python.syntax +868 -0
  190. data/syntax/python_django.syntax +21 -0
  191. data/syntax/qmake_project.syntax +114 -0
  192. data/syntax/qt_c++.syntax +26 -0
  193. data/syntax/quake3_config.syntax +32 -0
  194. data/syntax/r.syntax +81 -0
  195. data/syntax/r_console.syntax +16 -0
  196. data/syntax/ragel.syntax +201 -0
  197. data/syntax/rd_r_documentation.syntax +91 -0
  198. data/syntax/regexp.syntax +50 -0
  199. data/syntax/regular_expressions_oniguruma.syntax +107 -0
  200. data/syntax/regular_expressions_python.syntax +109 -0
  201. data/syntax/release_notes.syntax +46 -0
  202. data/syntax/remind.syntax +253 -0
  203. data/syntax/restructuredtext.syntax +250 -0
  204. data/syntax/rez.syntax +80 -0
  205. data/syntax/ruby.syntax +1035 -0
  206. data/syntax/ruby_experimental.syntax +145 -0
  207. data/syntax/ruby_on_rails.syntax +88 -0
  208. data/syntax/s5.syntax +69 -0
  209. data/syntax/scheme.syntax +347 -0
  210. data/syntax/scilab.syntax +41 -0
  211. data/syntax/setext.syntax +147 -0
  212. data/syntax/shell-unix-generic.syntax +384 -0
  213. data/syntax/slate.syntax +149 -0
  214. data/syntax/smarty.syntax +63 -0
  215. data/syntax/sql.syntax +237 -0
  216. data/syntax/sql_rails.syntax +18 -0
  217. data/syntax/ssh-config.syntax +33 -0
  218. data/syntax/standard_ml.syntax +121 -0
  219. data/syntax/strings_file.syntax +39 -0
  220. data/syntax/subversion_commit_message.syntax +36 -0
  221. data/syntax/sweave.syntax +84 -0
  222. data/syntax/swig.syntax +57 -0
  223. data/syntax/tcl.syntax +152 -0
  224. data/syntax/template_toolkit.syntax +121 -0
  225. data/syntax/tex.syntax +86 -0
  226. data/syntax/tex_math.syntax +49 -0
  227. data/syntax/textile.syntax +215 -0
  228. data/syntax/tsv.syntax +50 -0
  229. data/syntax/twiki.syntax +241 -0
  230. data/syntax/txt2tags.syntax +79 -0
  231. data/syntax/vectorscript.syntax +57 -0
  232. data/syntax/xhtml_1.0.syntax +4027 -0
  233. data/syntax/xml.syntax +180 -0
  234. data/syntax/xml_strict.syntax +92 -0
  235. data/syntax/xsl.syntax +60 -0
  236. data/syntax/yaml.syntax +160 -0
  237. data/syntax/yui_javascript.syntax +176 -0
  238. data/test/test_uv.rb +0 -0
  239. metadata +313 -0
@@ -0,0 +1,157 @@
1
+ #! /usr/bin/env ruby
2
+ begin
3
+ require 'plist'
4
+ rescue LoadError
5
+ require 'rubygems'
6
+ require 'plist'
7
+ end
8
+ require 'yaml'
9
+ require 'uv/utility'
10
+
11
+ base_dir = File.join( File.dirname(__FILE__), '..', 'render' )
12
+
13
+
14
+ def settings
15
+ unless @settings
16
+ @settings = @theme["settings"].find { |s| ! s["name"] }["settings"]
17
+ end
18
+ @settings
19
+ end
20
+
21
+ puts "Processing #{ARGV[0]}"
22
+
23
+ @theme = Plist::parse_xml( ARGV[0] )
24
+ render = {"name" => @theme["name"]}
25
+ css = {}
26
+
27
+ standard_name = File.basename( ARGV[0] ).downcase.gsub(/\s+/, '_').gsub('.tmtheme', '').gsub(/\W/, '').gsub(/_+/, '_')
28
+ code_name = "pre.#{standard_name}"
29
+
30
+ render["tags"] = []
31
+ count_names = {}
32
+ @theme["settings"].each do |t|
33
+ if t["scope"]
34
+ class_name = t["name"].downcase.gsub(/\W/, ' ').gsub('.tmtheme', '').split(' ').collect{|s| s.capitalize}.join
35
+ if class_name == ""
36
+ class_name = "x" * t["name"].size
37
+ end
38
+
39
+ if count_names[class_name]
40
+ tname = class_name
41
+ class_name = "#{class_name}#{count_names[class_name]}"
42
+ count_names[tname] += count_names[tname] + 1
43
+ else
44
+ count_names[class_name] = 1
45
+ end
46
+
47
+ tag = {}
48
+ tag["selector"] = t["scope"]
49
+ tag["begin"] = "<span class=\"#{class_name}\">"
50
+ tag["end"] = "</span>"
51
+ render["tags"] << tag
52
+
53
+ if s = t["settings"]
54
+ style = {}
55
+ style["color"] = Uv.normalize_color(settings, s["foreground"], true)
56
+ style["background-color"] = Uv.normalize_color(settings, s["background"])
57
+ case s["fontStyle"]
58
+ when /bold/ then style["font-weight"] = "bold"
59
+ when /italic/ then style["font-style"] = "italic"
60
+ when /underline/ then style["text-decoration"] = "underline"
61
+ end
62
+ css[".#{class_name}"] = style
63
+ end
64
+ elsif ! t["name"]
65
+ if s = t["settings"]
66
+ style = {}
67
+ style["color"] = Uv.normalize_color(settings, s["foreground"], true)
68
+ style["background-color"] = Uv.alpha_blend(s["background"], s["background"])
69
+ css[code_name] = style
70
+ @style = style
71
+ style = {}
72
+ style["background-color"] = Uv.alpha_blend(s["selection"], s["selection"])
73
+ style["color"] = Uv.foreground( style["background-color"] )
74
+ css[".line-numbers"] = style
75
+
76
+ tag = {}
77
+ tag["begin"] = "<span class=\"line-numbers\">"
78
+ tag["end"] = "</span>"
79
+ render["line-numbers"] = tag
80
+ end
81
+ end
82
+ end
83
+
84
+ render["filter"] = "CGI.escapeHTML( @escaped )"
85
+
86
+ tag = {}
87
+ tag["begin"] = ""
88
+ tag["end"] = ""
89
+ render["line"] = tag
90
+
91
+
92
+ tag = {}
93
+ tag["begin"] = "<pre class=\"#{standard_name}\">"
94
+ tag["end"] = "</pre>"
95
+ render["listing"] = tag
96
+
97
+ tag = {}
98
+ tag["begin"] = <<END
99
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
100
+ <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
101
+
102
+ <head>
103
+ <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
104
+ <meta http-equiv="cache-control" content="no-cache" />
105
+ <meta http-equiv="expires" content="3600" />
106
+ <meta name="revisit-after" content="2 days" />
107
+ <meta name="robots" content="index,follow" />
108
+ <meta name="publisher" content="Dichodaemon" />
109
+ <meta name="copyright" content="Dichodaemon" />
110
+
111
+ <meta name="author" content="Dichodaemon" />
112
+ <meta name="distribution" content="global" />
113
+ <meta name="description" content="Ocatarinetabellachithchix" />
114
+ <meta name="keywords" content="arzaversperia flexilimosos toves" />
115
+ <link rel="stylesheet" type="text/css" media="screen,projection,print" href="css/#{standard_name}.css" />
116
+ <title>#{standard_name}</title>
117
+
118
+ </head>
119
+
120
+ <body>
121
+ END
122
+
123
+ tag["end"] = <<END
124
+ <p>
125
+ <a href="http://validator.w3.org/check?uri=referer">
126
+ <img style="border:0"
127
+ src="http://www.w3.org/Icons/valid-xhtml10"
128
+ alt="Valid XHTML 1.0 Strict" height="31" width="88" />
129
+ </a>
130
+ <a href="http://jigsaw.w3.org/css-validator/check?uri=referer">
131
+ <img style="border:0;width:88px;height:31px"
132
+ src="http://jigsaw.w3.org/css-validator/images/vcss"
133
+ alt="Valid CSS!" />
134
+ </a>
135
+ </p>
136
+ </body>
137
+ </html>
138
+ END
139
+
140
+ render["document"] = tag
141
+
142
+ File.open( File.join( base_dir, "xhtml", "#{standard_name}.render" ), "w" ) {|f| YAML.dump( render, f ) }
143
+
144
+ File.open( File.join( base_dir, "xhtml", "files", "css", "#{standard_name}.css" ), "w" ) do |f|
145
+ css.each do |key, values|
146
+ if key == code_name
147
+ f.puts "#{code_name} {"
148
+ #puts @style
149
+ else
150
+ f.puts "#{code_name} #{key} {"
151
+ end
152
+ values.each do |style, value|
153
+ f.puts " #{style}: #{value};" if value
154
+ end
155
+ f.puts "}"
156
+ end
157
+ end
data/bin/uv ADDED
@@ -0,0 +1,140 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ begin
4
+ require 'rubygems'
5
+ require 'uv'
6
+ rescue LoadError
7
+ $:.unshift File.join( File.dirname(__FILE__), '..', 'lib' )
8
+ require 'uv'
9
+ end
10
+
11
+ require 'optparse'
12
+ require 'ostruct'
13
+
14
+ o = OpenStruct.new
15
+ o.copy_files = false
16
+ o.output = "xhtml"
17
+ o.headers = false
18
+ o.theme = "espresso_libre"
19
+ o.lines = true
20
+
21
+ options = OptionParser.new
22
+
23
+ options.banner =<<END
24
+
25
+ Usage: uv [options] input_file
26
+
27
+ Parses input_file (or stdin, if no input_file is given) and
28
+ outputs the coresponding HTML to stdout. If no syntax is specified,
29
+ it tries to guess the best one. If no theme is specified, defaults
30
+ to espresso_libre.
31
+
32
+ Example:
33
+
34
+ uv -t amy -h ~/.bashrc > bashrc.html
35
+
36
+ Renders the contents of ~/.bashrc to file bashrc.html
37
+ as a standalone web page.
38
+
39
+ All options are non-mandatory
40
+
41
+ Options:
42
+
43
+ END
44
+
45
+ options.on( "-c DIR", "--copy-files DIR", <<DESCRIPTION ) {|val| o.copy_files = val}
46
+ Copy the required files to the specified output directory (css, images, etc).
47
+ DESCRIPTION
48
+
49
+ options.on( "-s SYNTAX", "--syntax SYNTAX", <<DESCRIPTION, Uv.syntaxes) {|val| o.syntax = val}
50
+ The file's syntax (e.g. ruby, c++, etc.)
51
+ DESCRIPTION
52
+
53
+ options.on( "-o OUTPUT", "--output OUTPUT", <<DESCRIPTION) {|val| o.output = val}
54
+ The output format (xhtml, latex, etc.) default to xhtml
55
+ DESCRIPTION
56
+
57
+ options.on( "-t THEME", "--theme THEME", <<DESCRIPTION, Uv.themes) {|val| o.theme = val}
58
+ The theme to be used (e.g. amy, espresso_libre, etc.)
59
+ DESCRIPTION
60
+
61
+ options.on( "-n", "--no-lines", <<DESCRIPTION ) {|val| o.lines = false}
62
+ Produces output without line numbers
63
+ DESCRIPTION
64
+
65
+
66
+ options.on( "-h", "--headers", <<DESCRIPTION ) {|val| o.headers = val}
67
+ Include headers, outputs a self-contained web page/document
68
+ DESCRIPTION
69
+
70
+ options.on( "-d", "--debug", <<DESCRIPTION ) {|val| o.debug = val}
71
+ Outputs debug information instead of normal page rendering
72
+ DESCRIPTION
73
+
74
+ options.on( "-l [syntaxes|themes]", "--list [syntaxes|themes]", ['syntaxes', 'themes'], <<DESCRIPTION ) {|val| o.list = val}
75
+ Lists all the available syntaxes/themes
76
+ DESCRIPTION
77
+
78
+
79
+ options.on( "-?", "--help", <<DESCRIPTION ) {|val| o.help = val}
80
+ Show this message
81
+ DESCRIPTION
82
+
83
+ rest = options.parse( ARGV )
84
+
85
+
86
+ if o.help
87
+ puts options
88
+ exit
89
+ elsif o.list
90
+ if o.list == 'syntaxes'
91
+ puts "Available syntaxes:\n"
92
+ Uv.syntaxes.sort.each{ |s| puts " - #{s}"}
93
+ elsif o.list == 'themes'
94
+ puts "Available themes:\n"
95
+ Uv.themes.sort.each{ |t| puts " - #{t}"}
96
+ else
97
+ STDERR.puts "Option #{o.list} is not valid should be one of [syntaxes, themes]"
98
+ end
99
+ exit
100
+ end
101
+
102
+ if o.copy_files
103
+ unless File.exists?(o.copy_files)
104
+ STDERR.puts "The specified output directory: #{o.copy_files} does not exist."
105
+ exit -1
106
+ end
107
+ Uv.copy_files o.output, o.copy_files
108
+ end
109
+
110
+ o.filename = rest[0]
111
+
112
+ if o.filename && ! o.syntax
113
+ candidates = Uv.syntax_for_file o.filename
114
+ if candidates.size > 1
115
+ STDERR.puts "Many syntaxes match, please specify"
116
+ STDERR.puts "\nMatching syntaxes:"
117
+ candidates.sort.each { |name, syntax| STDERR.puts "\t - " + name}
118
+ exit -1
119
+ end
120
+ o.syntax = candidates.first.first unless candidates.size == 0
121
+ end
122
+
123
+ unless o.syntax
124
+ STDERR.puts "No default syntax found, please specify"
125
+ exit -1
126
+ end
127
+
128
+ if o.filename
129
+ o.text = File.read(o.filename)
130
+ else
131
+ o.text = STDIN
132
+ end
133
+
134
+ if o.debug
135
+ Uv.debug( o.text, o.syntax )
136
+ exit
137
+ end
138
+
139
+ puts Uv.parse( o.text, o.output, o.syntax, o.lines, o.theme, o.headers )
140
+
@@ -0,0 +1,89 @@
1
+ require 'fileutils'
2
+ require 'textpow'
3
+ require 'uv/render_processor.rb'
4
+
5
+
6
+ module Uv
7
+
8
+ def Uv.path
9
+ result = []
10
+ result << File.join(File.dirname(__FILE__), ".." )
11
+ end
12
+
13
+ def Uv.copy_files output, output_dir
14
+ Uv.path.each do |dir|
15
+ dir_name = File.join( dir, "render", output, "files" )
16
+ FileUtils.cp_r( Dir.glob(File.join( dir_name, "." )), output_dir ) if File.exists?( dir_name )
17
+ end
18
+ end
19
+
20
+ def Uv.init_syntaxes
21
+ @syntaxes = {}
22
+ Dir.glob( File.join(File.dirname(__FILE__), '..', 'syntax', '*.syntax') ).each do |f|
23
+ @syntaxes[File.basename(f, '.syntax')] = Textpow::SyntaxNode.load( f )
24
+ end
25
+ end
26
+
27
+ def Uv.syntaxes
28
+ Dir.glob( File.join(File.dirname(__FILE__), '..', 'syntax', '*.syntax') ).collect do |f|
29
+ File.basename(f, '.syntax')
30
+ end
31
+ end
32
+
33
+ def Uv.themes
34
+ Dir.glob( File.join(File.dirname(__FILE__), '..', 'render', 'xhtml', 'files', 'css', '*.css') ).collect do |f|
35
+ File.basename(f, '.css')
36
+ end
37
+ end
38
+
39
+ def Uv.syntax_for_file file_name
40
+ init_syntaxes unless @syntaxes
41
+ first_line = ""
42
+ File.open( file_name, 'r' ) { |f|
43
+ while (first_line = f.readline).strip.size == 0; end
44
+ }
45
+ result = []
46
+ @syntaxes.each do |key, value|
47
+ assigned = false
48
+ if value.fileTypes
49
+ value.fileTypes.each do |t|
50
+ if t == File.basename( file_name ) || t == File.extname( file_name )[1..-1]
51
+ result << [key, value]
52
+ assigned = true
53
+ break
54
+ end
55
+ end
56
+ end
57
+ unless assigned
58
+ if value.firstLineMatch && value.firstLineMatch =~ first_line
59
+ result << [key, value]
60
+ end
61
+ end
62
+ end
63
+ result
64
+ end
65
+
66
+ def Uv.parse text, output = "xhtml", syntax_name = nil, line_numbers = false, render_style = "classic", headers = false
67
+ init_syntaxes unless @syntaxes
68
+ renderer = File.join( File.dirname(__FILE__), '..',"render", output,"#{render_style}.render")
69
+ raise( ArgumentError, "Output for #{output} is not yet implemented" ) unless File.exists?(renderer)
70
+ css_class = render_style
71
+ render_options = YAML.load( File.open( renderer ) )
72
+ render_processor = RenderProcessor.new( render_options, line_numbers, headers )
73
+ @syntaxes[syntax_name].parse( text, render_processor )
74
+ render_processor.string
75
+ end
76
+
77
+ def Uv.debug text, syntax_name
78
+ unless @syntaxes
79
+ @syntaxes = {}
80
+ Dir.glob( File.join(File.dirname(__FILE__), '..', 'syntax', '*.syntax') ).each do |f|
81
+ @syntaxes[File.basename(f, '.syntax')] = Textpow::SyntaxNode.load( f )
82
+ end
83
+ end
84
+ processor = Textpow::DebugProcessor.new
85
+
86
+ @syntaxes[syntax_name].parse( text, processor )
87
+ end
88
+
89
+ end
@@ -0,0 +1,131 @@
1
+ require 'cgi'
2
+
3
+ module Uv
4
+
5
+
6
+ class RenderProcessor
7
+ @@score_manager = Textpow::ScoreManager.new
8
+
9
+ attr_reader :string
10
+ attr_accessor :escapeHTML
11
+
12
+ def initialize render_options, line_numbers = false, headers = true, score_manager = nil
13
+ @score_manager = score_manager || @@score_manager
14
+ @render_options = render_options
15
+ @options = {}
16
+ @headers = headers
17
+ @line_numbers = line_numbers
18
+ @escapeHTML = true
19
+ end
20
+
21
+ def start_parsing name
22
+ @stack = [name]
23
+ @string = ""
24
+ @line = nil
25
+ @line_number = 0
26
+ print @render_options["document"]["begin"] if @headers
27
+ print @render_options["listing"]["begin"]
28
+ # opt = options @stack
29
+ # print opt["begin"] if opt
30
+ end
31
+
32
+ def print string
33
+ @string << string
34
+ end
35
+
36
+ def escape string
37
+ if @render_options["filter"]
38
+ @escaped = string
39
+ @escaped = self.instance_eval( @render_options["filter"] )
40
+ @escaped
41
+ else
42
+ string
43
+ end
44
+ end
45
+
46
+ def open_tag name, position
47
+ @stack << name
48
+ print escape(@line[@position...position].gsub(/\n|\r/, '')) if position > @position
49
+ @position = position
50
+ opt = options @stack
51
+ print opt["begin"] if opt
52
+ end
53
+
54
+ def close_tag name, position
55
+ print escape(@line[@position...position].gsub(/\n|\r/, '')) if position > @position
56
+ @position = position
57
+ opt = options @stack
58
+ print opt["end"] if opt
59
+ @stack.pop
60
+ end
61
+
62
+ def close_line
63
+ stack = @stack[0..-1]
64
+ while stack.size > 1
65
+ opt = options stack
66
+ print opt["end"] if opt
67
+ stack.pop
68
+ end
69
+ end
70
+
71
+ def open_line
72
+ stack = [@stack.first]
73
+ clone = @stack[1..-1]
74
+ while stack.size < @stack.size
75
+ stack << clone.shift
76
+ opt = options stack
77
+ print opt["begin"] if opt
78
+ end
79
+ end
80
+
81
+ def new_line line
82
+ if @line
83
+ print escape(@line[@position..-1].gsub(/\n|\r/, ''))
84
+ close_line
85
+ print @render_options["line"]["end"]
86
+ print "\n"
87
+ end
88
+ @position = 0
89
+ @line_number += 1
90
+ @line = line
91
+ print @render_options["line"]["begin"]
92
+ if @line_numbers
93
+ print @render_options["line-numbers"]["begin"]
94
+ print @line_number.to_s.rjust(4).ljust(5)
95
+ print @render_options["line-numbers"]["end"]
96
+ print " "
97
+ end
98
+ open_line
99
+ end
100
+
101
+ def end_parsing name
102
+ if @line
103
+ print escape(@line[@position..-1].gsub(/\n|\r/, ''))
104
+ while @stack.size > 1
105
+ opt = options @stack
106
+ print opt["end"] if opt
107
+ @stack.pop
108
+ end
109
+ print @render_options["line"]["end"]
110
+ print "\n"
111
+ end
112
+ # opt = options @stack
113
+ # print opt["end"] if opt
114
+ @stack.pop
115
+ print @render_options["listing"]["end"]
116
+ print @render_options["document"]["end"] if @headers
117
+ end
118
+
119
+ def options stack
120
+ ref = stack.join ' '
121
+ return @options[ref] if @options.has_key? ref
122
+
123
+ result = @render_options['tags'].max do |a, b|
124
+ @score_manager.score( a['selector'], ref ) <=> @score_manager.score( b['selector'], ref )
125
+ end
126
+ result = nil if @score_manager.score( result['selector'], ref ) == 0
127
+ @options[ref] = result
128
+ end
129
+ end
130
+ end
131
+