ruby-uv 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (230) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +4 -0
  3. data/README.rdoc +79 -0
  4. data/Rakefile +1 -0
  5. data/bin/theme2latexrender +122 -0
  6. data/bin/theme2xhtmlrender +158 -0
  7. data/bin/uv +140 -0
  8. data/lib/uv/engine.rb +4 -0
  9. data/lib/uv/render_processor.rb +140 -0
  10. data/lib/uv/utility.rb +67 -0
  11. data/lib/uv/version.rb +3 -0
  12. data/lib/uv.rb +98 -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/idle.render +101 -0
  46. data/render/xhtml/iplastic.render +107 -0
  47. data/render/xhtml/lazy.render +104 -0
  48. data/render/xhtml/mac_classic.render +143 -0
  49. data/render/xhtml/magicwb_amiga.render +125 -0
  50. data/render/xhtml/pastels_on_dark.render +212 -0
  51. data/render/xhtml/railscasts.render +93 -0
  52. data/render/xhtml/slush_poppies.render +131 -0
  53. data/render/xhtml/spacecadet.render +83 -0
  54. data/render/xhtml/sunburst.render +194 -0
  55. data/render/xhtml/twilight.render +161 -0
  56. data/render/xhtml/zenburnesque.render +134 -0
  57. data/ruby-uv.gemspec +24 -0
  58. data/syntax/actionscript.syntax +97 -0
  59. data/syntax/active4d.syntax +276 -0
  60. data/syntax/active4d_html.syntax +311 -0
  61. data/syntax/active4d_ini.syntax +50 -0
  62. data/syntax/active4d_library.syntax +21 -0
  63. data/syntax/ada.syntax +33 -0
  64. data/syntax/antlr.syntax +151 -0
  65. data/syntax/apache.syntax +191 -0
  66. data/syntax/applescript.syntax +384 -0
  67. data/syntax/asp.syntax +70 -0
  68. data/syntax/asp_vb.net.syntax +129 -0
  69. data/syntax/bibtex.syntax +151 -0
  70. data/syntax/blog_html.syntax +41 -0
  71. data/syntax/blog_markdown.syntax +42 -0
  72. data/syntax/blog_text.syntax +27 -0
  73. data/syntax/blog_textile.syntax +27 -0
  74. data/syntax/build.syntax +53 -0
  75. data/syntax/bulletin_board.syntax +287 -0
  76. data/syntax/cake.syntax +55 -0
  77. data/syntax/camlp4.syntax +36 -0
  78. data/syntax/cm.syntax +32 -0
  79. data/syntax/coldfusion.syntax +119 -0
  80. data/syntax/context_free.syntax +176 -0
  81. data/syntax/cs.syntax +59 -0
  82. data/syntax/css.syntax +195 -0
  83. data/syntax/css_experimental.syntax +1925 -0
  84. data/syntax/csv.syntax +68 -0
  85. data/syntax/d.syntax +142 -0
  86. data/syntax/diff.syntax +81 -0
  87. data/syntax/dokuwiki.syntax +204 -0
  88. data/syntax/dot.syntax +47 -0
  89. data/syntax/doxygen.syntax +43 -0
  90. data/syntax/dylan.syntax +62 -0
  91. data/syntax/eiffel.syntax +78 -0
  92. data/syntax/erlang.syntax +922 -0
  93. data/syntax/f-script.syntax +80 -0
  94. data/syntax/fortran.syntax +141 -0
  95. data/syntax/fxscript.syntax +142 -0
  96. data/syntax/greasemonkey.syntax +34 -0
  97. data/syntax/gri.syntax +83 -0
  98. data/syntax/groovy.syntax +191 -0
  99. data/syntax/gtd.syntax +22 -0
  100. data/syntax/gtdalt.syntax +143 -0
  101. data/syntax/haml.syntax +88 -0
  102. data/syntax/haskell.syntax +88 -0
  103. data/syntax/html-asp.syntax +27 -0
  104. data/syntax/html.syntax +362 -0
  105. data/syntax/html_django.syntax +36 -0
  106. data/syntax/html_for_asp.net.syntax +424 -0
  107. data/syntax/html_mason.syntax +119 -0
  108. data/syntax/html_rails.syntax +40 -0
  109. data/syntax/html_tcl.syntax +26 -0
  110. data/syntax/icalendar.syntax +32 -0
  111. data/syntax/inform.syntax +48 -0
  112. data/syntax/ini.syntax +55 -0
  113. data/syntax/installer_distribution_script.syntax +77 -0
  114. data/syntax/io.syntax +81 -0
  115. data/syntax/java.syntax +211 -0
  116. data/syntax/javaproperties.syntax +20 -0
  117. data/syntax/javascript.syntax +256 -0
  118. data/syntax/javascript_+_prototype.syntax +72 -0
  119. data/syntax/javascript_+_prototype_bracketed.syntax +140 -0
  120. data/syntax/jquery_javascript.syntax +114 -0
  121. data/syntax/json.syntax +136 -0
  122. data/syntax/languagedefinition.syntax +708 -0
  123. data/syntax/latex.syntax +566 -0
  124. data/syntax/latex_beamer.syntax +41 -0
  125. data/syntax/latex_log.syntax +50 -0
  126. data/syntax/latex_memoir.syntax +64 -0
  127. data/syntax/lexflex.syntax +219 -0
  128. data/syntax/lighttpd.syntax +54 -0
  129. data/syntax/lilypond.syntax +492 -0
  130. data/syntax/lisp.syntax +61 -0
  131. data/syntax/literate_haskell.syntax +24 -0
  132. data/syntax/logo.syntax +29 -0
  133. data/syntax/logtalk.syntax +152 -0
  134. data/syntax/lua.syntax +86 -0
  135. data/syntax/m.syntax +142 -0
  136. data/syntax/macports_portfile.syntax +163 -0
  137. data/syntax/makefile.syntax +36 -0
  138. data/syntax/man.syntax +17 -0
  139. data/syntax/mediawiki.syntax +567 -0
  140. data/syntax/mips.syntax +66 -0
  141. data/syntax/mod_perl.syntax +50 -0
  142. data/syntax/modula-3.syntax +47 -0
  143. data/syntax/moinmoin.syntax +189 -0
  144. data/syntax/mootools.syntax +572 -0
  145. data/syntax/movable_type.syntax +162 -0
  146. data/syntax/multimarkdown.syntax +39 -0
  147. data/syntax/objective-c++.syntax +18 -0
  148. data/syntax/objective-c.syntax +233 -0
  149. data/syntax/ocaml.syntax +764 -0
  150. data/syntax/ocamllex.syntax +167 -0
  151. data/syntax/ocamlyacc.syntax +184 -0
  152. data/syntax/opengl.syntax +14 -0
  153. data/syntax/pascal.syntax +77 -0
  154. data/syntax/perl.syntax +1115 -0
  155. data/syntax/plain_text.syntax +32 -0
  156. data/syntax/postscript.syntax +114 -0
  157. data/syntax/processing.syntax +106 -0
  158. data/syntax/prolog.syntax +40 -0
  159. data/syntax/property_list.syntax +635 -0
  160. data/syntax/python.syntax +868 -0
  161. data/syntax/python_django.syntax +21 -0
  162. data/syntax/qmake_project.syntax +114 -0
  163. data/syntax/qt_c++.syntax +26 -0
  164. data/syntax/quake3_config.syntax +32 -0
  165. data/syntax/r.syntax +81 -0
  166. data/syntax/r_console.syntax +16 -0
  167. data/syntax/ragel.syntax +201 -0
  168. data/syntax/rd_r_documentation.syntax +91 -0
  169. data/syntax/regexp.syntax +50 -0
  170. data/syntax/release_notes.syntax +46 -0
  171. data/syntax/remind.syntax +253 -0
  172. data/syntax/restructuredtext.syntax +250 -0
  173. data/syntax/rez.syntax +80 -0
  174. data/syntax/ruby.syntax +1035 -0
  175. data/syntax/ruby_experimental.syntax +145 -0
  176. data/syntax/ruby_on_rails.syntax +88 -0
  177. data/syntax/s5.syntax +69 -0
  178. data/syntax/scheme.syntax +347 -0
  179. data/syntax/scilab.syntax +41 -0
  180. data/syntax/setext.syntax +147 -0
  181. data/syntax/shell-unix-generic.syntax +384 -0
  182. data/syntax/slate.syntax +149 -0
  183. data/syntax/sql.syntax +237 -0
  184. data/syntax/sql_rails.syntax +18 -0
  185. data/syntax/ssh-config.syntax +33 -0
  186. data/syntax/standard_ml.syntax +121 -0
  187. data/syntax/strings_file.syntax +39 -0
  188. data/syntax/subversion_commit_message.syntax +36 -0
  189. data/syntax/sweave.syntax +84 -0
  190. data/syntax/swig.syntax +57 -0
  191. data/syntax/tcl.syntax +152 -0
  192. data/syntax/template_toolkit.syntax +121 -0
  193. data/syntax/tex.syntax +86 -0
  194. data/syntax/tex_math.syntax +49 -0
  195. data/syntax/textile.syntax +215 -0
  196. data/syntax/tsv.syntax +50 -0
  197. data/syntax/twiki.syntax +241 -0
  198. data/syntax/txt2tags.syntax +79 -0
  199. data/syntax/vectorscript.syntax +57 -0
  200. data/syntax/xhtml_1.0.syntax +4027 -0
  201. data/syntax/xml.syntax +180 -0
  202. data/syntax/xml_strict.syntax +92 -0
  203. data/syntax/xsl.syntax +60 -0
  204. data/syntax/yaml.syntax +160 -0
  205. data/syntax/yui_javascript.syntax +176 -0
  206. data/test/test_uv.rb +17 -0
  207. data/vendor/assets/stylesheets/active4d.css +117 -0
  208. data/vendor/assets/stylesheets/all_hallows_eve.css +75 -0
  209. data/vendor/assets/stylesheets/all_uv_themes.css +4 -0
  210. data/vendor/assets/stylesheets/amy.css +150 -0
  211. data/vendor/assets/stylesheets/blackboard.css +91 -0
  212. data/vendor/assets/stylesheets/brilliance_black.css +608 -0
  213. data/vendor/assets/stylesheets/brilliance_dull.css +602 -0
  214. data/vendor/assets/stylesheets/cobalt.css +152 -0
  215. data/vendor/assets/stylesheets/dawn.css +124 -0
  216. data/vendor/assets/stylesheets/eiffel.css +124 -0
  217. data/vendor/assets/stylesheets/espresso_libre.css +112 -0
  218. data/vendor/assets/stylesheets/idle.css +65 -0
  219. data/vendor/assets/stylesheets/iplastic.css +83 -0
  220. data/vendor/assets/stylesheets/lazy.css +76 -0
  221. data/vendor/assets/stylesheets/mac_classic.css +126 -0
  222. data/vendor/assets/stylesheets/magicwb_amiga.css +107 -0
  223. data/vendor/assets/stylesheets/pastels_on_dark.css +191 -0
  224. data/vendor/assets/stylesheets/railscasts.css +74 -0
  225. data/vendor/assets/stylesheets/slush_poppies.css +88 -0
  226. data/vendor/assets/stylesheets/spacecadet.css +54 -0
  227. data/vendor/assets/stylesheets/sunburst.css +183 -0
  228. data/vendor/assets/stylesheets/twilight.css +140 -0
  229. data/vendor/assets/stylesheets/zenburnesque.css +94 -0
  230. metadata +302 -0
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ # A sample Gemfile
2
+ source "http://rubygems.org"
3
+
4
+ gemspec
data/README.rdoc ADDED
@@ -0,0 +1,79 @@
1
+ = Ultraviolet
2
+
3
+ This is a fixed version of the Ultraviolet syntax highlighting library for the 1.9 tree of the Ruby programming language. There are still some languages that are not working, but hopefully will be soon. If you find any bugs, or fix any syntax files, please send me a note and I'll update the repository.
4
+
5
+ == Non-working languages
6
+ * C
7
+ * C++
8
+ * mail
9
+ * markdown
10
+ * mel
11
+ * PHP
12
+ * pmwiki
13
+ * Regexp Oniguruma
14
+ * Regexp Python
15
+ * Smarty
16
+
17
+ == Install
18
+
19
+ Ultraviolet requires a couple other libraries. Textpow and plist are required but not working on 1.9. But don't fret, fixed versions can be found at the following locations:
20
+
21
+ * {Textpow}[http://github.com/spox/textpow]
22
+ * {plist}[http://github.com/spox/plist]
23
+
24
+ = Etc.
25
+
26
+ For ultraviolet information, see the README.txt file for original author information
27
+
28
+ = Original Ultraviolet
29
+
30
+ Ultraviolet is a syntax highlighting library and engine. It
31
+ uses TextMate[http://macromates.com/] syntax files and parses
32
+ them using the Textpow[http://textpow.rubyforge.org] library. It
33
+ supports more than 60 programming languages out of the box.
34
+
35
+ == SYNTAX
36
+
37
+
38
+ == REQUIREMENTS:
39
+
40
+ * Oniguruma for Ruby[http://oniguruma.rubyforge.org] v1.1.0 or higher.
41
+ * Textpow[http://textpow.rubyforge.org] v0.9.0 or higher.
42
+
43
+ == INSTALL:
44
+
45
+ sudo gem install -r markray
46
+
47
+ == BUGS/PROBLEMS/INCOMPATIBILITIES:
48
+
49
+
50
+ == TODO:
51
+
52
+
53
+ == CREDITS:
54
+
55
+
56
+ == LICENSE:
57
+
58
+ (The MIT License)
59
+
60
+ Copyright (c) 2007 FIX
61
+
62
+ Permission is hereby granted, free of charge, to any person obtaining
63
+ a copy of this software and associated documentation files (the
64
+ 'Software'), to deal in the Software without restriction, including
65
+ without limitation the rights to use, copy, modify, merge, publish,
66
+ distribute, sublicense, and/or sell copies of the Software, and to
67
+ permit persons to whom the Software is furnished to do so, subject to
68
+ the following conditions:
69
+
70
+ The above copyright notice and this permission notice shall be
71
+ included in all copies or substantial portions of the Software.
72
+
73
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
74
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
75
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
76
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
77
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
78
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
79
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,122 @@
1
+ #! /usr/bin/env ruby
2
+ begin
3
+ require 'plist'
4
+ rescue LoadError
5
+ require 'rubygems'
6
+ require 'plist'
7
+ end
8
+ require 'uv/utility'
9
+
10
+ base_dir = File.join( File.dirname(__FILE__), '..', 'render' )
11
+
12
+ def settings
13
+ unless @settings
14
+ @settings = @theme["settings"].find { |s| ! s["name"] }["settings"]
15
+ end
16
+ @settings
17
+ end
18
+
19
+ @theme = Plist::parse_xml( ARGV[0] )
20
+ render = {"name" => @theme["name"]}
21
+ codecolumn = ""
22
+ numbercolumn = ""
23
+ standard_name = File.basename( ARGV[0] ).downcase.gsub(/\s+/, '_').gsub('.tmtheme', '').gsub(/\W/, '').gsub(/_+/, '_')
24
+
25
+ render["tags"] = []
26
+
27
+ @theme["settings"].each do |t|
28
+ if t["scope"]
29
+ class_name = t["name"].downcase.gsub(/\W/, ' ').gsub('.tmtheme', '').split(' ').collect{|s| s.capitalize}.join
30
+ if class_name == ""
31
+ class_name = "x" * t["name"].size
32
+ end
33
+
34
+ tag = {}
35
+ tag["selector"] = t["scope"]
36
+ render["tags"] << tag
37
+
38
+ begin_string = ""
39
+ pcount = 0
40
+ if s = t["settings"]
41
+ if s["background"]
42
+ begin_string << "\\setlength{\\fboxsep}{0ex}\\colorbox[HTML]{#{Uv.normalize_color(settings, s["background"])[1..-1]}}{\\rule[-0.5ex]{0pt}{2.0ex}"
43
+ else
44
+ begin_string << "{"
45
+ end
46
+ pcount += 1
47
+ if s["foreground"]
48
+ begin_string << "\\color[HTML]{#{Uv.normalize_color(settings, s["foreground"], true)[1..-1]}}"
49
+ end
50
+ case s["fontStyle"]
51
+ when /bold/
52
+ begin_string << "\\textbf{"
53
+ pcount += 1
54
+ when /italic/
55
+ begin_string << "\\textit{"
56
+ pcount += 1
57
+ when /underline/
58
+ begin_string << "\\underline{"
59
+ pcount += 1
60
+ end
61
+ tag["begin"] = begin_string
62
+ tag["end"] = "}" * pcount
63
+ end
64
+
65
+
66
+ elsif ! t["name"]
67
+ if s = t["settings"]
68
+ codecolumn = "\\newcolumntype{C}{>{"
69
+ codecolumn << "\\color[HTML]{#{Uv.normalize_color(settings, s["foreground"], true)[1..-1]}}" if s["foreground"]
70
+ codecolumn << "\\columncolor[HTML]{#{Uv.alpha_blend(s["background"], s["background"])[1..-1]}}" if s["background"]
71
+ codecolumn << "}l}"
72
+ bg = Uv.alpha_blend(s["selection"], s["selection"]) if s["selection"]
73
+ numbercolumn = "\\newcolumntype{N}{>{"
74
+ numbercolumn << "\\color[HTML]{#{Uv.foreground(bg)[1..-1]}}" if bg
75
+ numbercolumn << "\\columncolor[HTML]{#{bg[1..-1]}}" if s["selection"]
76
+ numbercolumn << "}l}"
77
+
78
+ tag = {}
79
+ tag["begin"] = "\\texttt{"
80
+ tag["end"] = "}&\\mbox{\\texttt{"
81
+ render["line-numbers"] = tag end
82
+ end
83
+ end
84
+
85
+ render["filter"] = '@escaped.gsub(/(\$)/, \'\\\\\\\\\1\').gsub(/\\\\(?!\$)/, \'$\\\\\\\\backslash$\').gsub(/(_|\{|\}|&|\#|%)/, \'\\\\\\\\\1\').gsub(/~/, \'\\\\textasciitilde \').gsub(/ /,\'\\\\hspace{1ex}\').gsub(/\t| /,\'\\\\hspace{3ex}\').gsub(/\"/, "\'\'").gsub(/(\^)/,\'\\\\\\\\\1{}\')'
86
+
87
+ tag = {}
88
+ tag["begin"] = ""
89
+ tag["end"] = "}}\\\\"
90
+ render["line"] = tag
91
+
92
+ tag = {}
93
+ tag["begin"] = <<END
94
+ #{codecolumn}
95
+ #{numbercolumn}
96
+ \\begin{longtable}{NC}
97
+ END
98
+
99
+ tag["end"] = <<END
100
+ \\end{longtable}
101
+ END
102
+ render["listing"] = tag
103
+
104
+ tag = {}
105
+ tag["begin"] = <<END
106
+ \\documentclass[a4paper,landscape]{article}
107
+ \\usepackage{xcolor}
108
+ \\usepackage{colortbl}
109
+ \\usepackage{longtable}
110
+ \\usepackage[left=2cm,top=1cm,right=3cm,nohead,nofoot]{geometry}
111
+ \\usepackage[T1]{fontenc}
112
+ \\usepackage[scaled]{beramono}
113
+ \\begin{document}
114
+ END
115
+
116
+ tag["end"] = <<END
117
+ \\end{document}
118
+ END
119
+
120
+ render["document"] = tag
121
+
122
+ File.open( File.join( base_dir, "latex", "#{standard_name}.render" ), "w" ) {|f| YAML.dump( render, f ) }
@@ -0,0 +1,158 @@
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
+ puts "ERROR: YAML not included!!" unless defined?(YAML.dump)
10
+ require 'uv/utility'
11
+
12
+ base_dir = File.join( File.dirname(__FILE__), '..', 'render' )
13
+
14
+
15
+ def settings
16
+ unless @settings
17
+ @settings = @theme["settings"].find { |s| ! s["name"] }["settings"]
18
+ end
19
+ @settings
20
+ end
21
+
22
+ puts "Processing #{ARGV[0]}"
23
+
24
+ @theme = Plist::parse_xml( ARGV[0] )
25
+ render = {"name" => @theme["name"]}
26
+ css = {}
27
+
28
+ standard_name = File.basename( ARGV[0] ).downcase.gsub(/\s+/, '_').gsub('.tmtheme', '').gsub(/\W/, '').gsub(/_+/, '_')
29
+ code_name = "pre.#{standard_name}"
30
+
31
+ render["tags"] = []
32
+ count_names = {}
33
+ @theme["settings"].each do |t|
34
+ if t["scope"]
35
+ class_name = t["name"].downcase.gsub(/\W/, ' ').gsub('.tmtheme', '').split(' ').collect{|s| s.capitalize}.join
36
+ if class_name == ""
37
+ class_name = "x" * t["name"].size
38
+ end
39
+
40
+ if count_names[class_name]
41
+ tname = class_name
42
+ class_name = "#{class_name}#{count_names[class_name]}"
43
+ count_names[tname] += count_names[tname] + 1
44
+ else
45
+ count_names[class_name] = 1
46
+ end
47
+
48
+ tag = {}
49
+ tag["selector"] = t["scope"]
50
+ tag["begin"] = "<span class=\"#{class_name}\">"
51
+ tag["end"] = "</span>"
52
+ render["tags"] << tag
53
+
54
+ if s = t["settings"]
55
+ style = {}
56
+ style["color"] = Uv.normalize_color(settings, s["foreground"], true)
57
+ style["background-color"] = Uv.normalize_color(settings, s["background"])
58
+ case s["fontStyle"]
59
+ when /bold/ then style["font-weight"] = "bold"
60
+ when /italic/ then style["font-style"] = "italic"
61
+ when /underline/ then style["text-decoration"] = "underline"
62
+ end
63
+ css[".#{class_name}"] = style
64
+ end
65
+ elsif ! t["name"]
66
+ if s = t["settings"]
67
+ style = {}
68
+ style["color"] = Uv.normalize_color(settings, s["foreground"], true)
69
+ style["background-color"] = Uv.alpha_blend(s["background"], s["background"])
70
+ css[code_name] = style
71
+ @style = style
72
+ style = {}
73
+ style["background-color"] = Uv.alpha_blend(s["selection"], s["selection"])
74
+ style["color"] = Uv.foreground( style["background-color"] )
75
+ css[".line-numbers"] = style
76
+
77
+ tag = {}
78
+ tag["begin"] = "<span class=\"line-numbers\">"
79
+ tag["end"] = "</span>"
80
+ render["line-numbers"] = tag
81
+ end
82
+ end
83
+ end
84
+
85
+ render["filter"] = "CGI.escapeHTML( @escaped )"
86
+
87
+ tag = {}
88
+ tag["begin"] = ""
89
+ tag["end"] = ""
90
+ render["line"] = tag
91
+
92
+
93
+ tag = {}
94
+ tag["begin"] = "<pre class=\"#{standard_name}\">"
95
+ tag["end"] = "</pre>"
96
+ render["listing"] = tag
97
+
98
+ tag = {}
99
+ tag["begin"] = <<END
100
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
101
+ <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
102
+
103
+ <head>
104
+ <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
105
+ <meta http-equiv="cache-control" content="no-cache" />
106
+ <meta http-equiv="expires" content="3600" />
107
+ <meta name="revisit-after" content="2 days" />
108
+ <meta name="robots" content="index,follow" />
109
+ <meta name="publisher" content="Dichodaemon" />
110
+ <meta name="copyright" content="Dichodaemon" />
111
+
112
+ <meta name="author" content="Dichodaemon" />
113
+ <meta name="distribution" content="global" />
114
+ <meta name="description" content="Ocatarinetabellachithchix" />
115
+ <meta name="keywords" content="arzaversperia flexilimosos toves" />
116
+ <link rel="stylesheet" type="text/css" media="screen,projection,print" href="css/#{standard_name}.css" />
117
+ <title>#{standard_name}</title>
118
+
119
+ </head>
120
+
121
+ <body>
122
+ END
123
+
124
+ tag["end"] = <<END
125
+ <p>
126
+ <a href="http://validator.w3.org/check?uri=referer">
127
+ <img style="border:0"
128
+ src="http://www.w3.org/Icons/valid-xhtml10"
129
+ alt="Valid XHTML 1.0 Strict" height="31" width="88" />
130
+ </a>
131
+ <a href="http://jigsaw.w3.org/css-validator/check?uri=referer">
132
+ <img style="border:0;width:88px;height:31px"
133
+ src="http://jigsaw.w3.org/css-validator/images/vcss"
134
+ alt="Valid CSS!" />
135
+ </a>
136
+ </p>
137
+ </body>
138
+ </html>
139
+ END
140
+
141
+ render["document"] = tag
142
+
143
+ File.open( File.join( base_dir, "xhtml", "#{standard_name}.render" ), "w" ) {|f| YAML.dump( render, f ) }
144
+
145
+ File.open( File.join( "..", "vendor", "assets", "stylesheets", "#{standard_name}.css" ), "w" ) do |f|
146
+ css.each do |key, values|
147
+ if key == code_name
148
+ f.puts "#{code_name} {"
149
+ #puts @style
150
+ else
151
+ f.puts "#{code_name} #{key} {"
152
+ end
153
+ values.each do |style, value|
154
+ f.puts " #{style}: #{value};" if value
155
+ end
156
+ f.puts "}"
157
+ end
158
+ 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
+
data/lib/uv/engine.rb ADDED
@@ -0,0 +1,4 @@
1
+ module Uv
2
+ class Engine < Rails::Engine
3
+ end
4
+ end
@@ -0,0 +1,140 @@
1
+ require 'cgi'
2
+
3
+ module Uv
4
+
5
+ class RenderProcessor
6
+ @@score_manager = Textpow::ScoreManager.new
7
+
8
+ attr_reader :string
9
+ attr_accessor :escapeHTML
10
+
11
+ def self.load(output, style = nil, line_numbers = false, headers = false)
12
+ style ||= Uv.default_style
13
+ renderer = File.join( Uv.render_path, output,"#{style}.render")
14
+ raise( ArgumentError, "Output for #{output} in #{style} style is not yet implemented" ) unless File.exists?(renderer)
15
+ options = YAML.load_file(renderer)
16
+ processor = RenderProcessor.new(options, line_numbers, headers)
17
+ yield processor if block_given?
18
+ processor
19
+ end
20
+
21
+ def initialize render_options, line_numbers = false, headers = true, score_manager = nil
22
+ @score_manager = score_manager || @@score_manager
23
+ @render_options = render_options
24
+ @options = {}
25
+ @headers = headers
26
+ @line_numbers = line_numbers
27
+ @escapeHTML = true
28
+ end
29
+
30
+ def start_parsing name
31
+ @stack = [name]
32
+ @string = ""
33
+ @line = nil
34
+ @line_number = 0
35
+ print @render_options["document"]["begin"] if @headers
36
+ print @render_options["listing"]["begin"]
37
+ # opt = options @stack
38
+ # print opt["begin"] if opt
39
+ end
40
+
41
+ def print string
42
+ @string << string
43
+ end
44
+
45
+ def escape string
46
+ if @render_options["filter"]
47
+ @escaped = string
48
+ @escaped = self.instance_eval( @render_options["filter"] )
49
+ @escaped
50
+ else
51
+ string
52
+ end
53
+ end
54
+
55
+ def open_tag name, position
56
+ @stack << name
57
+ print escape(@line[@position...position].gsub(/\n|\r/, '')) if position > @position
58
+ @position = position
59
+ opt = options @stack
60
+ print opt["begin"] if opt
61
+ end
62
+
63
+ def close_tag name, position
64
+ print escape(@line[@position...position].gsub(/\n|\r/, '')) if position > @position
65
+ @position = position
66
+ opt = options @stack
67
+ print opt["end"] if opt
68
+ @stack.pop
69
+ end
70
+
71
+ def close_line
72
+ stack = @stack[0..-1]
73
+ while stack.size > 1
74
+ opt = options stack
75
+ print opt["end"] if opt
76
+ stack.pop
77
+ end
78
+ end
79
+
80
+ def open_line
81
+ stack = [@stack.first]
82
+ clone = @stack[1..-1]
83
+ while stack.size < @stack.size
84
+ stack << clone.shift
85
+ opt = options stack
86
+ print opt["begin"] if opt
87
+ end
88
+ end
89
+
90
+ def new_line line
91
+ if @line
92
+ print escape(@line[@position..-1].gsub(/\n|\r/, ''))
93
+ close_line
94
+ print @render_options["line"]["end"]
95
+ print "\n"
96
+ end
97
+ @position = 0
98
+ @line_number += 1
99
+ @line = line
100
+ print @render_options["line"]["begin"]
101
+ if @line_numbers
102
+ print @render_options["line-numbers"]["begin"]
103
+ print @line_number.to_s.rjust(4).ljust(5)
104
+ print @render_options["line-numbers"]["end"]
105
+ print " "
106
+ end
107
+ open_line
108
+ end
109
+
110
+ def end_parsing name
111
+ if @line
112
+ print escape(@line[@position..-1].gsub(/\n|\r/, ''))
113
+ while @stack.size > 1
114
+ opt = options @stack
115
+ print opt["end"] if opt
116
+ @stack.pop
117
+ end
118
+ print @render_options["line"]["end"]
119
+ print "\n"
120
+ end
121
+ # opt = options @stack
122
+ # print opt["end"] if opt
123
+ @stack.pop
124
+ print @render_options["listing"]["end"]
125
+ print @render_options["document"]["end"] if @headers
126
+ end
127
+
128
+ def options stack
129
+ ref = stack.join ' '
130
+ return @options[ref] if @options.has_key? ref
131
+
132
+ result = @render_options['tags'].max do |a, b|
133
+ @score_manager.score( a['selector'], ref ) <=> @score_manager.score( b['selector'], ref )
134
+ end
135
+ result = nil if @score_manager.score( result['selector'], ref ) == 0
136
+ @options[ref] = result
137
+ end
138
+ end
139
+ end
140
+