ruby-uv 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README.rdoc +79 -0
- data/Rakefile +1 -0
- data/bin/theme2latexrender +122 -0
- data/bin/theme2xhtmlrender +158 -0
- data/bin/uv +140 -0
- data/lib/uv/engine.rb +4 -0
- data/lib/uv/render_processor.rb +140 -0
- data/lib/uv/utility.rb +67 -0
- data/lib/uv/version.rb +3 -0
- data/lib/uv.rb +98 -0
- data/render/latex/active4d.render +132 -0
- data/render/latex/all_hallows_eve.render +96 -0
- data/render/latex/amy.render +171 -0
- data/render/latex/blackboard.render +111 -0
- data/render/latex/brilliance_black.render +552 -0
- data/render/latex/brilliance_dull.render +561 -0
- data/render/latex/cobalt.render +162 -0
- data/render/latex/dawn.render +126 -0
- data/render/latex/eiffel.render +132 -0
- data/render/latex/espresso_libre.render +123 -0
- data/render/latex/idle.render +93 -0
- data/render/latex/iplastic.render +99 -0
- data/render/latex/lazy.render +96 -0
- data/render/latex/mac_classic.render +135 -0
- data/render/latex/magicwb_amiga.render +117 -0
- data/render/latex/pastels_on_dark.render +204 -0
- data/render/latex/slush_poppies.render +123 -0
- data/render/latex/spacecadet.render +81 -0
- data/render/latex/sunburst.render +186 -0
- data/render/latex/twilight.render +153 -0
- data/render/latex/zenburnesque.render +126 -0
- data/render/old/txt2tags.render +131 -0
- data/render/xhtml/active4d.render +140 -0
- data/render/xhtml/all_hallows_eve.render +104 -0
- data/render/xhtml/amy.render +179 -0
- data/render/xhtml/blackboard.render +119 -0
- data/render/xhtml/brilliance_black.render +560 -0
- data/render/xhtml/brilliance_dull.render +569 -0
- data/render/xhtml/cobalt.render +170 -0
- data/render/xhtml/dawn.render +134 -0
- data/render/xhtml/eiffel.render +140 -0
- data/render/xhtml/espresso_libre.render +131 -0
- data/render/xhtml/idle.render +101 -0
- data/render/xhtml/iplastic.render +107 -0
- data/render/xhtml/lazy.render +104 -0
- data/render/xhtml/mac_classic.render +143 -0
- data/render/xhtml/magicwb_amiga.render +125 -0
- data/render/xhtml/pastels_on_dark.render +212 -0
- data/render/xhtml/railscasts.render +93 -0
- data/render/xhtml/slush_poppies.render +131 -0
- data/render/xhtml/spacecadet.render +83 -0
- data/render/xhtml/sunburst.render +194 -0
- data/render/xhtml/twilight.render +161 -0
- data/render/xhtml/zenburnesque.render +134 -0
- data/ruby-uv.gemspec +24 -0
- data/syntax/actionscript.syntax +97 -0
- data/syntax/active4d.syntax +276 -0
- data/syntax/active4d_html.syntax +311 -0
- data/syntax/active4d_ini.syntax +50 -0
- data/syntax/active4d_library.syntax +21 -0
- data/syntax/ada.syntax +33 -0
- data/syntax/antlr.syntax +151 -0
- data/syntax/apache.syntax +191 -0
- data/syntax/applescript.syntax +384 -0
- data/syntax/asp.syntax +70 -0
- data/syntax/asp_vb.net.syntax +129 -0
- data/syntax/bibtex.syntax +151 -0
- data/syntax/blog_html.syntax +41 -0
- data/syntax/blog_markdown.syntax +42 -0
- data/syntax/blog_text.syntax +27 -0
- data/syntax/blog_textile.syntax +27 -0
- data/syntax/build.syntax +53 -0
- data/syntax/bulletin_board.syntax +287 -0
- data/syntax/cake.syntax +55 -0
- data/syntax/camlp4.syntax +36 -0
- data/syntax/cm.syntax +32 -0
- data/syntax/coldfusion.syntax +119 -0
- data/syntax/context_free.syntax +176 -0
- data/syntax/cs.syntax +59 -0
- data/syntax/css.syntax +195 -0
- data/syntax/css_experimental.syntax +1925 -0
- data/syntax/csv.syntax +68 -0
- data/syntax/d.syntax +142 -0
- data/syntax/diff.syntax +81 -0
- data/syntax/dokuwiki.syntax +204 -0
- data/syntax/dot.syntax +47 -0
- data/syntax/doxygen.syntax +43 -0
- data/syntax/dylan.syntax +62 -0
- data/syntax/eiffel.syntax +78 -0
- data/syntax/erlang.syntax +922 -0
- data/syntax/f-script.syntax +80 -0
- data/syntax/fortran.syntax +141 -0
- data/syntax/fxscript.syntax +142 -0
- data/syntax/greasemonkey.syntax +34 -0
- data/syntax/gri.syntax +83 -0
- data/syntax/groovy.syntax +191 -0
- data/syntax/gtd.syntax +22 -0
- data/syntax/gtdalt.syntax +143 -0
- data/syntax/haml.syntax +88 -0
- data/syntax/haskell.syntax +88 -0
- data/syntax/html-asp.syntax +27 -0
- data/syntax/html.syntax +362 -0
- data/syntax/html_django.syntax +36 -0
- data/syntax/html_for_asp.net.syntax +424 -0
- data/syntax/html_mason.syntax +119 -0
- data/syntax/html_rails.syntax +40 -0
- data/syntax/html_tcl.syntax +26 -0
- data/syntax/icalendar.syntax +32 -0
- data/syntax/inform.syntax +48 -0
- data/syntax/ini.syntax +55 -0
- data/syntax/installer_distribution_script.syntax +77 -0
- data/syntax/io.syntax +81 -0
- data/syntax/java.syntax +211 -0
- data/syntax/javaproperties.syntax +20 -0
- data/syntax/javascript.syntax +256 -0
- data/syntax/javascript_+_prototype.syntax +72 -0
- data/syntax/javascript_+_prototype_bracketed.syntax +140 -0
- data/syntax/jquery_javascript.syntax +114 -0
- data/syntax/json.syntax +136 -0
- data/syntax/languagedefinition.syntax +708 -0
- data/syntax/latex.syntax +566 -0
- data/syntax/latex_beamer.syntax +41 -0
- data/syntax/latex_log.syntax +50 -0
- data/syntax/latex_memoir.syntax +64 -0
- data/syntax/lexflex.syntax +219 -0
- data/syntax/lighttpd.syntax +54 -0
- data/syntax/lilypond.syntax +492 -0
- data/syntax/lisp.syntax +61 -0
- data/syntax/literate_haskell.syntax +24 -0
- data/syntax/logo.syntax +29 -0
- data/syntax/logtalk.syntax +152 -0
- data/syntax/lua.syntax +86 -0
- data/syntax/m.syntax +142 -0
- data/syntax/macports_portfile.syntax +163 -0
- data/syntax/makefile.syntax +36 -0
- data/syntax/man.syntax +17 -0
- data/syntax/mediawiki.syntax +567 -0
- data/syntax/mips.syntax +66 -0
- data/syntax/mod_perl.syntax +50 -0
- data/syntax/modula-3.syntax +47 -0
- data/syntax/moinmoin.syntax +189 -0
- data/syntax/mootools.syntax +572 -0
- data/syntax/movable_type.syntax +162 -0
- data/syntax/multimarkdown.syntax +39 -0
- data/syntax/objective-c++.syntax +18 -0
- data/syntax/objective-c.syntax +233 -0
- data/syntax/ocaml.syntax +764 -0
- data/syntax/ocamllex.syntax +167 -0
- data/syntax/ocamlyacc.syntax +184 -0
- data/syntax/opengl.syntax +14 -0
- data/syntax/pascal.syntax +77 -0
- data/syntax/perl.syntax +1115 -0
- data/syntax/plain_text.syntax +32 -0
- data/syntax/postscript.syntax +114 -0
- data/syntax/processing.syntax +106 -0
- data/syntax/prolog.syntax +40 -0
- data/syntax/property_list.syntax +635 -0
- data/syntax/python.syntax +868 -0
- data/syntax/python_django.syntax +21 -0
- data/syntax/qmake_project.syntax +114 -0
- data/syntax/qt_c++.syntax +26 -0
- data/syntax/quake3_config.syntax +32 -0
- data/syntax/r.syntax +81 -0
- data/syntax/r_console.syntax +16 -0
- data/syntax/ragel.syntax +201 -0
- data/syntax/rd_r_documentation.syntax +91 -0
- data/syntax/regexp.syntax +50 -0
- data/syntax/release_notes.syntax +46 -0
- data/syntax/remind.syntax +253 -0
- data/syntax/restructuredtext.syntax +250 -0
- data/syntax/rez.syntax +80 -0
- data/syntax/ruby.syntax +1035 -0
- data/syntax/ruby_experimental.syntax +145 -0
- data/syntax/ruby_on_rails.syntax +88 -0
- data/syntax/s5.syntax +69 -0
- data/syntax/scheme.syntax +347 -0
- data/syntax/scilab.syntax +41 -0
- data/syntax/setext.syntax +147 -0
- data/syntax/shell-unix-generic.syntax +384 -0
- data/syntax/slate.syntax +149 -0
- data/syntax/sql.syntax +237 -0
- data/syntax/sql_rails.syntax +18 -0
- data/syntax/ssh-config.syntax +33 -0
- data/syntax/standard_ml.syntax +121 -0
- data/syntax/strings_file.syntax +39 -0
- data/syntax/subversion_commit_message.syntax +36 -0
- data/syntax/sweave.syntax +84 -0
- data/syntax/swig.syntax +57 -0
- data/syntax/tcl.syntax +152 -0
- data/syntax/template_toolkit.syntax +121 -0
- data/syntax/tex.syntax +86 -0
- data/syntax/tex_math.syntax +49 -0
- data/syntax/textile.syntax +215 -0
- data/syntax/tsv.syntax +50 -0
- data/syntax/twiki.syntax +241 -0
- data/syntax/txt2tags.syntax +79 -0
- data/syntax/vectorscript.syntax +57 -0
- data/syntax/xhtml_1.0.syntax +4027 -0
- data/syntax/xml.syntax +180 -0
- data/syntax/xml_strict.syntax +92 -0
- data/syntax/xsl.syntax +60 -0
- data/syntax/yaml.syntax +160 -0
- data/syntax/yui_javascript.syntax +176 -0
- data/test/test_uv.rb +17 -0
- data/vendor/assets/stylesheets/active4d.css +117 -0
- data/vendor/assets/stylesheets/all_hallows_eve.css +75 -0
- data/vendor/assets/stylesheets/all_uv_themes.css +4 -0
- data/vendor/assets/stylesheets/amy.css +150 -0
- data/vendor/assets/stylesheets/blackboard.css +91 -0
- data/vendor/assets/stylesheets/brilliance_black.css +608 -0
- data/vendor/assets/stylesheets/brilliance_dull.css +602 -0
- data/vendor/assets/stylesheets/cobalt.css +152 -0
- data/vendor/assets/stylesheets/dawn.css +124 -0
- data/vendor/assets/stylesheets/eiffel.css +124 -0
- data/vendor/assets/stylesheets/espresso_libre.css +112 -0
- data/vendor/assets/stylesheets/idle.css +65 -0
- data/vendor/assets/stylesheets/iplastic.css +83 -0
- data/vendor/assets/stylesheets/lazy.css +76 -0
- data/vendor/assets/stylesheets/mac_classic.css +126 -0
- data/vendor/assets/stylesheets/magicwb_amiga.css +107 -0
- data/vendor/assets/stylesheets/pastels_on_dark.css +191 -0
- data/vendor/assets/stylesheets/railscasts.css +74 -0
- data/vendor/assets/stylesheets/slush_poppies.css +88 -0
- data/vendor/assets/stylesheets/spacecadet.css +54 -0
- data/vendor/assets/stylesheets/sunburst.css +183 -0
- data/vendor/assets/stylesheets/twilight.css +140 -0
- data/vendor/assets/stylesheets/zenburnesque.css +94 -0
- metadata +302 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
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,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
|
+
|