ultraviolet/bin/theme2xhtmlrender
2009-06-12 18:06:56 -07:00

156 lines
4.6 KiB
Ruby
Executable file

#! /usr/bin/env ruby
begin
require 'plist'
rescue LoadError
require 'rubygems'
require 'plist'
end
require 'uv/utility'
base_dir = File.join( File.dirname(__FILE__), '..', 'render' )
def settings
unless @settings
@settings = @theme["settings"].find { |s| ! s["name"] }["settings"]
end
@settings
end
puts "Processing #{ARGV[0]}"
@theme = Plist::parse_xml( ARGV[0] )
render = {"name" => @theme["name"]}
css = {}
standard_name = File.basename( ARGV[0] ).downcase.gsub(/\s+/, '_').gsub('.tmtheme', '').gsub(/\W/, '').gsub(/_+/, '_')
code_name = "pre.#{standard_name}"
render["tags"] = []
count_names = {}
@theme["settings"].each do |t|
if t["scope"]
class_name = t["name"].downcase.gsub(/\W/, ' ').gsub('.tmtheme', '').split(' ').collect{|s| s.capitalize}.join
if class_name == ""
class_name = "x" * t["name"].size
end
if count_names[class_name]
tname = class_name
class_name = "#{class_name}#{count_names[class_name]}"
count_names[tname] += count_names[tname] + 1
else
count_names[class_name] = 1
end
tag = {}
tag["selector"] = t["scope"]
tag["begin"] = "<span class=\"#{class_name}\">"
tag["end"] = "</span>"
render["tags"] << tag
if s = t["settings"]
style = {}
style["color"] = Uv.normalize_color(settings, s["foreground"], true)
style["background-color"] = Uv.normalize_color(settings, s["background"])
case s["fontStyle"]
when /bold/ then style["font-weight"] = "bold"
when /italic/ then style["font-style"] = "italic"
when /underline/ then style["text-decoration"] = "underline"
end
css[".#{class_name}"] = style
end
elsif ! t["name"]
if s = t["settings"]
style = {}
style["color"] = Uv.normalize_color(settings, s["foreground"], true)
style["background-color"] = Uv.alpha_blend(s["background"], s["background"])
css[code_name] = style
@style = style
style = {}
style["background-color"] = Uv.alpha_blend(s["selection"], s["selection"])
style["color"] = Uv.foreground( style["background-color"] )
css[".line-numbers"] = style
tag = {}
tag["begin"] = "<span class=\"line-numbers\">"
tag["end"] = "</span>"
render["line-numbers"] = tag
end
end
end
render["filter"] = "CGI.escapeHTML( @escaped )"
tag = {}
tag["begin"] = ""
tag["end"] = ""
render["line"] = tag
tag = {}
tag["begin"] = "<pre class=\"#{standard_name}\">"
tag["end"] = "</pre>"
render["listing"] = tag
tag = {}
tag["begin"] = <<END
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="3600" />
<meta name="revisit-after" content="2 days" />
<meta name="robots" content="index,follow" />
<meta name="publisher" content="Dichodaemon" />
<meta name="copyright" content="Dichodaemon" />
<meta name="author" content="Dichodaemon" />
<meta name="distribution" content="global" />
<meta name="description" content="Ocatarinetabellachithchix" />
<meta name="keywords" content="arzaversperia flexilimosos toves" />
<link rel="stylesheet" type="text/css" media="screen,projection,print" href="css/#{standard_name}.css" />
<title>#{standard_name}</title>
</head>
<body>
END
tag["end"] = <<END
<p>
<a href="http://validator.w3.org/check?uri=referer">
<img style="border:0"
src="http://www.w3.org/Icons/valid-xhtml10"
alt="Valid XHTML 1.0 Strict" height="31" width="88" />
</a>
<a href="http://jigsaw.w3.org/css-validator/check?uri=referer">
<img style="border:0;width:88px;height:31px"
src="http://jigsaw.w3.org/css-validator/images/vcss"
alt="Valid CSS!" />
</a>
</p>
</body>
</html>
END
render["document"] = tag
File.open( File.join( base_dir, "xhtml", "#{standard_name}.render" ), "w" ) {|f| YAML.dump( render, f ) }
File.open( File.join( base_dir, "xhtml", "files", "css", "#{standard_name}.css" ), "w" ) do |f|
css.each do |key, values|
if key == code_name
f.puts "#{code_name} {"
#puts @style
else
f.puts "#{code_name} #{key} {"
end
values.each do |style, value|
f.puts " #{style}: #{value};" if value
end
f.puts "}"
end
end