vertiginous-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 (234) hide show
  1. data/History.txt +25 -0
  2. data/Manifest.txt +233 -0
  3. data/README.txt +52 -0
  4. data/Rakefile +51 -0
  5. data/bin/theme2latexrender +122 -0
  6. data/bin/theme2xhtmlrender +156 -0
  7. data/bin/uv +140 -0
  8. data/lib/uv/render_processor.rb +131 -0
  9. data/lib/uv/utility.rb +67 -0
  10. data/lib/uv.rb +89 -0
  11. data/render/latex/active4d.render +132 -0
  12. data/render/latex/all_hallows_eve.render +96 -0
  13. data/render/latex/amy.render +171 -0
  14. data/render/latex/blackboard.render +111 -0
  15. data/render/latex/brilliance_black.render +552 -0
  16. data/render/latex/brilliance_dull.render +561 -0
  17. data/render/latex/cobalt.render +162 -0
  18. data/render/latex/dawn.render +126 -0
  19. data/render/latex/eiffel.render +132 -0
  20. data/render/latex/espresso_libre.render +123 -0
  21. data/render/latex/idle.render +93 -0
  22. data/render/latex/iplastic.render +99 -0
  23. data/render/latex/lazy.render +96 -0
  24. data/render/latex/mac_classic.render +135 -0
  25. data/render/latex/magicwb_amiga.render +117 -0
  26. data/render/latex/pastels_on_dark.render +204 -0
  27. data/render/latex/slush_poppies.render +123 -0
  28. data/render/latex/spacecadet.render +81 -0
  29. data/render/latex/sunburst.render +186 -0
  30. data/render/latex/twilight.render +153 -0
  31. data/render/latex/zenburnesque.render +126 -0
  32. data/render/old/txt2tags.render +131 -0
  33. data/render/xhtml/active4d.render +140 -0
  34. data/render/xhtml/all_hallows_eve.render +104 -0
  35. data/render/xhtml/amy.render +179 -0
  36. data/render/xhtml/blackboard.render +119 -0
  37. data/render/xhtml/brilliance_black.render +560 -0
  38. data/render/xhtml/brilliance_dull.render +569 -0
  39. data/render/xhtml/cobalt.render +170 -0
  40. data/render/xhtml/dawn.render +134 -0
  41. data/render/xhtml/eiffel.render +140 -0
  42. data/render/xhtml/espresso_libre.render +131 -0
  43. data/render/xhtml/files/css/active4d.css +114 -0
  44. data/render/xhtml/files/css/all_hallows_eve.css +72 -0
  45. data/render/xhtml/files/css/amy.css +147 -0
  46. data/render/xhtml/files/css/blackboard.css +88 -0
  47. data/render/xhtml/files/css/brilliance_black.css +605 -0
  48. data/render/xhtml/files/css/brilliance_dull.css +599 -0
  49. data/render/xhtml/files/css/cobalt.css +149 -0
  50. data/render/xhtml/files/css/dawn.css +121 -0
  51. data/render/xhtml/files/css/eiffel.css +121 -0
  52. data/render/xhtml/files/css/espresso_libre.css +109 -0
  53. data/render/xhtml/files/css/idle.css +62 -0
  54. data/render/xhtml/files/css/iplastic.css +80 -0
  55. data/render/xhtml/files/css/lazy.css +73 -0
  56. data/render/xhtml/files/css/mac_classic.css +123 -0
  57. data/render/xhtml/files/css/magicwb_amiga.css +104 -0
  58. data/render/xhtml/files/css/pastels_on_dark.css +188 -0
  59. data/render/xhtml/files/css/slush_poppies.css +85 -0
  60. data/render/xhtml/files/css/spacecadet.css +51 -0
  61. data/render/xhtml/files/css/sunburst.css +180 -0
  62. data/render/xhtml/files/css/twilight.css +137 -0
  63. data/render/xhtml/files/css/zenburnesque.css +91 -0
  64. data/render/xhtml/idle.render +101 -0
  65. data/render/xhtml/iplastic.render +107 -0
  66. data/render/xhtml/lazy.render +104 -0
  67. data/render/xhtml/mac_classic.render +143 -0
  68. data/render/xhtml/magicwb_amiga.render +125 -0
  69. data/render/xhtml/pastels_on_dark.render +212 -0
  70. data/render/xhtml/slush_poppies.render +131 -0
  71. data/render/xhtml/spacecadet.render +89 -0
  72. data/render/xhtml/sunburst.render +194 -0
  73. data/render/xhtml/twilight.render +161 -0
  74. data/render/xhtml/zenburnesque.render +134 -0
  75. data/syntax/actionscript.syntax +97 -0
  76. data/syntax/active4d.syntax +276 -0
  77. data/syntax/active4d_html.syntax +311 -0
  78. data/syntax/active4d_ini.syntax +50 -0
  79. data/syntax/active4d_library.syntax +21 -0
  80. data/syntax/ada.syntax +33 -0
  81. data/syntax/antlr.syntax +151 -0
  82. data/syntax/apache.syntax +191 -0
  83. data/syntax/applescript.syntax +384 -0
  84. data/syntax/asp.syntax +70 -0
  85. data/syntax/asp_vb.net.syntax +129 -0
  86. data/syntax/bibtex.syntax +151 -0
  87. data/syntax/blog_html.syntax +41 -0
  88. data/syntax/blog_markdown.syntax +42 -0
  89. data/syntax/blog_text.syntax +27 -0
  90. data/syntax/blog_textile.syntax +27 -0
  91. data/syntax/build.syntax +53 -0
  92. data/syntax/bulletin_board.syntax +287 -0
  93. data/syntax/c++.syntax +109 -0
  94. data/syntax/c.syntax +326 -0
  95. data/syntax/cake.syntax +55 -0
  96. data/syntax/camlp4.syntax +36 -0
  97. data/syntax/cm.syntax +32 -0
  98. data/syntax/coldfusion.syntax +119 -0
  99. data/syntax/context_free.syntax +176 -0
  100. data/syntax/cs.syntax +59 -0
  101. data/syntax/css.syntax +195 -0
  102. data/syntax/css_experimental.syntax +1925 -0
  103. data/syntax/csv.syntax +68 -0
  104. data/syntax/d.syntax +142 -0
  105. data/syntax/diff.syntax +81 -0
  106. data/syntax/dokuwiki.syntax +204 -0
  107. data/syntax/dot.syntax +47 -0
  108. data/syntax/doxygen.syntax +43 -0
  109. data/syntax/dylan.syntax +62 -0
  110. data/syntax/eiffel.syntax +78 -0
  111. data/syntax/erlang.syntax +922 -0
  112. data/syntax/f-script.syntax +80 -0
  113. data/syntax/fortran.syntax +141 -0
  114. data/syntax/fxscript.syntax +142 -0
  115. data/syntax/greasemonkey.syntax +34 -0
  116. data/syntax/gri.syntax +83 -0
  117. data/syntax/groovy.syntax +191 -0
  118. data/syntax/gtd.syntax +22 -0
  119. data/syntax/gtdalt.syntax +143 -0
  120. data/syntax/haml.syntax +88 -0
  121. data/syntax/haskell.syntax +88 -0
  122. data/syntax/html-asp.syntax +27 -0
  123. data/syntax/html.syntax +362 -0
  124. data/syntax/html_django.syntax +36 -0
  125. data/syntax/html_for_asp.net.syntax +424 -0
  126. data/syntax/html_mason.syntax +119 -0
  127. data/syntax/html_rails.syntax +40 -0
  128. data/syntax/html_tcl.syntax +26 -0
  129. data/syntax/icalendar.syntax +32 -0
  130. data/syntax/inform.syntax +48 -0
  131. data/syntax/ini.syntax +55 -0
  132. data/syntax/installer_distribution_script.syntax +77 -0
  133. data/syntax/io.syntax +81 -0
  134. data/syntax/java.syntax +211 -0
  135. data/syntax/javaproperties.syntax +20 -0
  136. data/syntax/javascript.syntax +256 -0
  137. data/syntax/javascript_+_prototype.syntax +72 -0
  138. data/syntax/javascript_+_prototype_bracketed.syntax +140 -0
  139. data/syntax/jquery_javascript.syntax +114 -0
  140. data/syntax/json.syntax +136 -0
  141. data/syntax/languagedefinition.syntax +708 -0
  142. data/syntax/latex.syntax +566 -0
  143. data/syntax/latex_beamer.syntax +41 -0
  144. data/syntax/latex_log.syntax +50 -0
  145. data/syntax/latex_memoir.syntax +64 -0
  146. data/syntax/lexflex.syntax +219 -0
  147. data/syntax/lighttpd.syntax +54 -0
  148. data/syntax/lilypond.syntax +492 -0
  149. data/syntax/lisp.syntax +61 -0
  150. data/syntax/literate_haskell.syntax +24 -0
  151. data/syntax/logo.syntax +29 -0
  152. data/syntax/logtalk.syntax +152 -0
  153. data/syntax/lua.syntax +86 -0
  154. data/syntax/m.syntax +142 -0
  155. data/syntax/macports_portfile.syntax +163 -0
  156. data/syntax/mail.syntax +118 -0
  157. data/syntax/makefile.syntax +36 -0
  158. data/syntax/man.syntax +17 -0
  159. data/syntax/markdown.syntax +543 -0
  160. data/syntax/mediawiki.syntax +567 -0
  161. data/syntax/mel.syntax +92 -0
  162. data/syntax/mips.syntax +66 -0
  163. data/syntax/mod_perl.syntax +50 -0
  164. data/syntax/modula-3.syntax +47 -0
  165. data/syntax/moinmoin.syntax +189 -0
  166. data/syntax/mootools.syntax +572 -0
  167. data/syntax/movable_type.syntax +162 -0
  168. data/syntax/multimarkdown.syntax +39 -0
  169. data/syntax/objective-c++.syntax +18 -0
  170. data/syntax/objective-c.syntax +233 -0
  171. data/syntax/ocaml.syntax +764 -0
  172. data/syntax/ocamllex.syntax +167 -0
  173. data/syntax/ocamlyacc.syntax +184 -0
  174. data/syntax/opengl.syntax +14 -0
  175. data/syntax/pascal.syntax +77 -0
  176. data/syntax/perl.syntax +1115 -0
  177. data/syntax/php.syntax +1253 -0
  178. data/syntax/plain_text.syntax +32 -0
  179. data/syntax/pmwiki.syntax +113 -0
  180. data/syntax/postscript.syntax +114 -0
  181. data/syntax/processing.syntax +106 -0
  182. data/syntax/prolog.syntax +40 -0
  183. data/syntax/property_list.syntax +635 -0
  184. data/syntax/python.syntax +868 -0
  185. data/syntax/python_django.syntax +21 -0
  186. data/syntax/qmake_project.syntax +114 -0
  187. data/syntax/qt_c++.syntax +26 -0
  188. data/syntax/quake3_config.syntax +32 -0
  189. data/syntax/r.syntax +81 -0
  190. data/syntax/r_console.syntax +16 -0
  191. data/syntax/ragel.syntax +201 -0
  192. data/syntax/rd_r_documentation.syntax +91 -0
  193. data/syntax/regexp.syntax +50 -0
  194. data/syntax/regular_expressions_oniguruma.syntax +107 -0
  195. data/syntax/regular_expressions_python.syntax +109 -0
  196. data/syntax/release_notes.syntax +46 -0
  197. data/syntax/remind.syntax +253 -0
  198. data/syntax/restructuredtext.syntax +250 -0
  199. data/syntax/rez.syntax +80 -0
  200. data/syntax/ruby.syntax +1035 -0
  201. data/syntax/ruby_experimental.syntax +145 -0
  202. data/syntax/ruby_on_rails.syntax +88 -0
  203. data/syntax/s5.syntax +69 -0
  204. data/syntax/scheme.syntax +347 -0
  205. data/syntax/scilab.syntax +41 -0
  206. data/syntax/setext.syntax +147 -0
  207. data/syntax/shell-unix-generic.syntax +384 -0
  208. data/syntax/slate.syntax +149 -0
  209. data/syntax/smarty.syntax +63 -0
  210. data/syntax/sql.syntax +237 -0
  211. data/syntax/sql_rails.syntax +18 -0
  212. data/syntax/ssh-config.syntax +33 -0
  213. data/syntax/standard_ml.syntax +121 -0
  214. data/syntax/strings_file.syntax +39 -0
  215. data/syntax/subversion_commit_message.syntax +36 -0
  216. data/syntax/sweave.syntax +84 -0
  217. data/syntax/swig.syntax +57 -0
  218. data/syntax/tcl.syntax +152 -0
  219. data/syntax/template_toolkit.syntax +121 -0
  220. data/syntax/tex.syntax +86 -0
  221. data/syntax/tex_math.syntax +49 -0
  222. data/syntax/textile.syntax +215 -0
  223. data/syntax/tsv.syntax +50 -0
  224. data/syntax/twiki.syntax +241 -0
  225. data/syntax/txt2tags.syntax +79 -0
  226. data/syntax/vectorscript.syntax +57 -0
  227. data/syntax/xhtml_1.0.syntax +4027 -0
  228. data/syntax/xml.syntax +180 -0
  229. data/syntax/xml_strict.syntax +92 -0
  230. data/syntax/xsl.syntax +60 -0
  231. data/syntax/yaml.syntax +160 -0
  232. data/syntax/yui_javascript.syntax +176 -0
  233. data/test/test_uv.rb +0 -0
  234. metadata +307 -0
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,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
+
data/lib/uv/utility.rb ADDED
@@ -0,0 +1,67 @@
1
+ module Uv
2
+ def Uv.foreground bg
3
+ fg = "#FFFFFF"
4
+ 3.times do |i|
5
+ fg = "#000000" if bg[i*2+1, 2].hex > 0xFF / 2
6
+ end
7
+ fg
8
+ end
9
+
10
+ def Uv.alpha_blend bg, fg
11
+ unless bg =~ /^#((\d|[ABCDEF]){3}|(\d|[ABCDEF]){6}|(\d|[ABCDEF]){8})$/i
12
+ raise(ArgumentError, "Malformed background color '#{bg}'" )
13
+ end
14
+ unless fg =~ /^#((\d|[ABCDEF]){3}|(\d|[ABCDEF]){6}|(\d|[ABCDEF]){8})$/i
15
+ raise(ArgumentError, "Malformed foreground color '#{fg}'" )
16
+ end
17
+
18
+ if bg.size == 4
19
+ tbg = (fg[1,1].hex * 0xff / 0xf).to_s(16).upcase.rjust(2, '0')
20
+ tbg += (fg[2,1].hex * 0xff / 0xf).to_s(16).upcase.rjust(2, '0')
21
+ tbg += (fg[3,1].hex * 0xff / 0xf).to_s(16).upcase.rjust(2, '0')
22
+ bg = "##{tbg}"
23
+ end
24
+
25
+ result = ""
26
+ if fg.size == 4
27
+ result += (fg[1,1].hex * 0xff / 0xf).to_s(16).upcase.rjust(2, '0')
28
+ result += (fg[2,1].hex * 0xff / 0xf).to_s(16).upcase.rjust(2, '0')
29
+ result += (fg[3,1].hex * 0xff / 0xf).to_s(16).upcase.rjust(2, '0')
30
+ elsif fg.size == 9
31
+ if bg.size == 7
32
+ div0 = bg[1..-1].hex
33
+ div1, alpha = fg[1..-1].hex.divmod( 0x100 )
34
+ 3.times {
35
+ div0, mod0 = div0.divmod( 0x100 )
36
+ div1, mod1 = div1.divmod( 0x100 )
37
+ result = ((mod0 * alpha + mod1 * ( 0x100 - alpha ) ) / 0x100).to_s(16).upcase.rjust(2, '0') + result
38
+ }
39
+ else
40
+ div_a, alpha_a = bg[1..-1].hex.divmod( 0x100 )
41
+ div_b, alpha_b = fg[1..-1].hex.divmod( 0x100 )
42
+ alpha = alpha_a + alpha_b * (0x100 - alpha_a)
43
+ 3.times {
44
+ div_b, c_b = div_b.divmod( 0x100 )
45
+ div_a, c_a = div_a.divmod( 0x100 )
46
+ result = ((c_a * alpha_a + ( 0x100 - alpha_a ) * alpha_b * c_b ) / alpha).to_s(16).upcase.rjust(2, '0') + result
47
+ }
48
+ end
49
+ #result = "FF00FF"
50
+ else
51
+ result = fg[1..-1]
52
+ end
53
+ "##{result}"
54
+ end
55
+
56
+ def Uv.normalize_color settings, color, fg = false
57
+ if color
58
+ if fg
59
+ alpha_blend( settings["foreground"] ? settings["foreground"] : "#000000FF", color )
60
+ else
61
+ alpha_blend( settings["background"] ? settings["background"] : "#000000FF", color )
62
+ end
63
+ else
64
+ color
65
+ end
66
+ end
67
+ end
data/lib/uv.rb ADDED
@@ -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,132 @@
1
+ ---
2
+ name: Active4D
3
+ line:
4
+ begin: ""
5
+ end: "}}\\\\"
6
+ tags:
7
+ - begin: \setlength{\fboxsep}{0ex}\colorbox[HTML]{ECF1FF}{\rule[-0.5ex]{0pt}{2.0ex}
8
+ end: "}"
9
+ selector: text.html source.active4d
10
+ - begin: "{\\color[HTML]{000000}"
11
+ end: "}"
12
+ selector: text.xml
13
+ - begin: "{\\color[HTML]{D33535}"
14
+ end: "}"
15
+ selector: comment.line
16
+ - begin: "{\\color[HTML]{D33435}"
17
+ end: "}"
18
+ selector: comment.block
19
+ - begin: "{\\color[HTML]{666666}"
20
+ end: "}"
21
+ selector: string
22
+ - begin: "{\\color[HTML]{66CCFF}\\textbf{"
23
+ end: "}}"
24
+ selector: string.interpolated variable
25
+ - begin: "{\\color[HTML]{A8017E}"
26
+ end: "}"
27
+ selector: constant.numeric
28
+ - begin: "{"
29
+ end: "}"
30
+ selector: constant.character, constant.other
31
+ - begin: "{\\color[HTML]{66CCFF}\\textbf{"
32
+ end: "}}"
33
+ selector: constant.other.date, constant.other.time
34
+ - begin: "{\\color[HTML]{A535AE}"
35
+ end: "}"
36
+ selector: constant.language
37
+ - begin: "{\\color[HTML]{6392FF}\\textbf{"
38
+ end: "}}"
39
+ selector: variable.other.local
40
+ - begin: "{\\color[HTML]{0053FF}\\textbf{"
41
+ end: "}}"
42
+ selector: variable
43
+ - begin: "{\\color[HTML]{0BB600}"
44
+ end: "}"
45
+ selector: variable.other.table-field
46
+ - begin: "{\\color[HTML]{006699}\\textbf{"
47
+ end: "}}"
48
+ selector: keyword
49
+ - begin: "{"
50
+ end: "}"
51
+ selector: keyword.operator
52
+ - begin: "{\\color[HTML]{FF5600}"
53
+ end: "}"
54
+ selector: storage
55
+ - begin: "{\\color[HTML]{21439C}"
56
+ end: "}"
57
+ selector: entity.name.type
58
+ - begin: "{"
59
+ end: "}"
60
+ selector: entity.other.inherited-class
61
+ - begin: "{\\color[HTML]{21439C}"
62
+ end: "}"
63
+ selector: entity.name.function
64
+ - begin: "{"
65
+ end: "}"
66
+ selector: variable.parameter
67
+ - begin: "{\\color[HTML]{7A7A7A}"
68
+ end: "}"
69
+ selector: meta.tag
70
+ - begin: "{\\color[HTML]{016CFF}"
71
+ end: "}"
72
+ selector: entity.name.tag
73
+ - begin: "{\\color[HTML]{963DFF}"
74
+ end: "}"
75
+ selector: entity.other.attribute-name
76
+ - begin: "{\\color[HTML]{45AE34}\\textbf{"
77
+ end: "}}"
78
+ selector: support.function
79
+ - begin: "{\\color[HTML]{B7734C}"
80
+ end: "}"
81
+ selector: support.constant
82
+ - begin: "{\\color[HTML]{A535AE}"
83
+ end: "}"
84
+ selector: support.type, support.class
85
+ - begin: "{\\color[HTML]{A535AE}"
86
+ end: "}"
87
+ selector: support.variable
88
+ - begin: \setlength{\fboxsep}{0ex}\colorbox[HTML]{990000}{\rule[-0.5ex]{0pt}{2.0ex}\color[HTML]{FFFFFF}
89
+ end: "}"
90
+ selector: invalid
91
+ - begin: \setlength{\fboxsep}{0ex}\colorbox[HTML]{656565}{\rule[-0.5ex]{0pt}{2.0ex}\color[HTML]{FFFFFF}
92
+ end: "}"
93
+ selector: meta.diff
94
+ - begin: \setlength{\fboxsep}{0ex}\colorbox[HTML]{1B63FF}{\rule[-0.5ex]{0pt}{2.0ex}\color[HTML]{FFFFFF}
95
+ end: "}"
96
+ selector: meta.diff.range
97
+ - begin: \setlength{\fboxsep}{0ex}\colorbox[HTML]{FF7880}{\rule[-0.5ex]{0pt}{2.0ex}\color[HTML]{000000}
98
+ end: "}"
99
+ selector: markup.deleted.diff
100
+ - begin: \setlength{\fboxsep}{0ex}\colorbox[HTML]{98FF9A}{\rule[-0.5ex]{0pt}{2.0ex}\color[HTML]{000000}
101
+ end: "}"
102
+ selector: markup.inserted.diff
103
+ - begin: "{\\color[HTML]{5E5E5E}"
104
+ end: "}"
105
+ selector: source.diff
106
+ listing:
107
+ begin: |
108
+ \newcolumntype{C}{>{\color[HTML]{000000}\columncolor[HTML]{FFFFFF}}l}
109
+ \newcolumntype{N}{>{\color[HTML]{000000}\columncolor[HTML]{BAD6FD}}l}
110
+ \begin{longtable}{NC}
111
+
112
+ end: |
113
+ \end{longtable}
114
+
115
+ document:
116
+ begin: |
117
+ \documentclass[a4paper,landscape]{article}
118
+ \usepackage{xcolor}
119
+ \usepackage{colortbl}
120
+ \usepackage{longtable}
121
+ \usepackage[left=2cm,top=1cm,right=3cm,nohead,nofoot]{geometry}
122
+ \usepackage[T1]{fontenc}
123
+ \usepackage[scaled]{beramono}
124
+ \begin{document}
125
+
126
+ end: |
127
+ \end{document}
128
+
129
+ filter: "@escaped.gsub(/(\\$)/, '\\\\\\\\\\1').gsub(/\\\\(?!\\$)/, '$\\\\\\\\backslash$').gsub(/(_|\\{|\\}|&|\\#|%)/, '\\\\\\\\\\1').gsub(/~/, '\\\\textasciitilde ').gsub(/ /,'\\\\hspace{1ex}').gsub(/\\t| /,'\\\\hspace{3ex}').gsub(/\\\"/, \"''\").gsub(/(\\^)/,'\\\\\\\\\\1{}')"
130
+ line-numbers:
131
+ begin: \texttt{
132
+ end: "}&\\mbox{\\texttt{"
@@ -0,0 +1,96 @@
1
+ ---
2
+ name: All Hallow's Eve
3
+ line:
4
+ begin: ""
5
+ end: "}}\\\\"
6
+ tags:
7
+ - begin: \setlength{\fboxsep}{0ex}\colorbox[HTML]{434242}{\rule[-0.5ex]{0pt}{2.0ex}\color[HTML]{FFFFFF}
8
+ end: "}"
9
+ selector: text
10
+ - begin: \setlength{\fboxsep}{0ex}\colorbox[HTML]{000000}{\rule[-0.5ex]{0pt}{2.0ex}\color[HTML]{FFFFFF}
11
+ end: "}"
12
+ selector: source
13
+ - begin: "{\\color[HTML]{9933CC}"
14
+ end: "}"
15
+ selector: comment
16
+ - begin: "{\\color[HTML]{3387CC}"
17
+ end: "}"
18
+ selector: constant
19
+ - begin: "{\\color[HTML]{CC7833}"
20
+ end: "}"
21
+ selector: keyword
22
+ - begin: "{\\color[HTML]{D0D0FF}"
23
+ end: "}"
24
+ selector: meta.preprocessor.c
25
+ - begin: "{"
26
+ end: "}"
27
+ selector: keyword.control.import
28
+ - begin: "{"
29
+ end: "}"
30
+ selector: entity.name.function
31
+ - begin: "{\\textit{"
32
+ end: "}}"
33
+ selector: variable.parameter
34
+ - begin: \setlength{\fboxsep}{0ex}\colorbox[HTML]{9B9B9B}{\rule[-0.5ex]{0pt}{2.0ex}\color[HTML]{FFFFFF}
35
+ end: "}"
36
+ selector: source comment.block
37
+ - begin: "{\\color[HTML]{66CC33}"
38
+ end: "}"
39
+ selector: string
40
+ - begin: "{\\color[HTML]{AAAAAA}"
41
+ end: "}"
42
+ selector: string constant.character.escape
43
+ - begin: \setlength{\fboxsep}{0ex}\colorbox[HTML]{CCCC33}{\rule[-0.5ex]{0pt}{2.0ex}\color[HTML]{000000}
44
+ end: "}"
45
+ selector: string.interpolated
46
+ - begin: "{\\color[HTML]{CCCC33}"
47
+ end: "}"
48
+ selector: string.regexp
49
+ - begin: "{\\color[HTML]{CCCC33}"
50
+ end: "}"
51
+ selector: string.literal
52
+ - begin: "{\\color[HTML]{555555}"
53
+ end: "}"
54
+ selector: string.interpolated constant.character.escape
55
+ - begin: "{\\underline{"
56
+ end: "}}"
57
+ selector: entity.name.type
58
+ - begin: "{\\textit{"
59
+ end: "}}"
60
+ selector: entity.other.inherited-class
61
+ - begin: "{\\underline{"
62
+ end: "}}"
63
+ selector: entity.name.tag
64
+ - begin: "{"
65
+ end: "}"
66
+ selector: entity.other.attribute-name
67
+ - begin: "{\\color[HTML]{C83730}"
68
+ end: "}"
69
+ selector: support.function
70
+ listing:
71
+ begin: |
72
+ \newcolumntype{C}{>{\color[HTML]{FFFFFF}\columncolor[HTML]{000000}}l}
73
+ \newcolumntype{N}{>{\color[HTML]{FFFFFF}\columncolor[HTML]{73597E}}l}
74
+ \begin{longtable}{NC}
75
+
76
+ end: |
77
+ \end{longtable}
78
+
79
+ document:
80
+ begin: |
81
+ \documentclass[a4paper,landscape]{article}
82
+ \usepackage{xcolor}
83
+ \usepackage{colortbl}
84
+ \usepackage{longtable}
85
+ \usepackage[left=2cm,top=1cm,right=3cm,nohead,nofoot]{geometry}
86
+ \usepackage[T1]{fontenc}
87
+ \usepackage[scaled]{beramono}
88
+ \begin{document}
89
+
90
+ end: |
91
+ \end{document}
92
+
93
+ filter: "@escaped.gsub(/(\\$)/, '\\\\\\\\\\1').gsub(/\\\\(?!\\$)/, '$\\\\\\\\backslash$').gsub(/(_|\\{|\\}|&|\\#|%)/, '\\\\\\\\\\1').gsub(/~/, '\\\\textasciitilde ').gsub(/ /,'\\\\hspace{1ex}').gsub(/\\t| /,'\\\\hspace{3ex}').gsub(/\\\"/, \"''\").gsub(/(\\^)/,'\\\\\\\\\\1{}')"
94
+ line-numbers:
95
+ begin: \texttt{
96
+ end: "}&\\mbox{\\texttt{"