css.rb
65 lines
| 1.4 KiB
| text/x-ruby
|
RubyLexer
|
r638 | module CodeRay | ||
module Encoders | ||||
class HTML | ||||
class CSS | ||||
attr :stylesheet | ||||
def CSS.load_stylesheet style = nil | ||||
CodeRay::Styles[style] | ||||
end | ||||
def initialize style = :default | ||||
@classes = Hash.new | ||||
style = CSS.load_stylesheet style | ||||
@stylesheet = [ | ||||
style::CSS_MAIN_STYLES, | ||||
style::TOKEN_COLORS.gsub(/^(?!$)/, '.CodeRay ') | ||||
].join("\n") | ||||
parse style::TOKEN_COLORS | ||||
end | ||||
def [] *styles | ||||
cl = @classes[styles.first] | ||||
return '' unless cl | ||||
style = '' | ||||
1.upto(styles.size) do |offset| | ||||
break if style = cl[styles[offset .. -1]] | ||||
end | ||||
|
r2965 | raise 'Style not found: %p' % [styles] if $DEBUG and style.empty? | ||
|
r638 | return style | ||
end | ||||
private | ||||
CSS_CLASS_PATTERN = / | ||||
|
r2965 | ( (?: # $1 = classes | ||
\s* \. [-\w]+ | ||||
)+ ) | ||||
|
r638 | \s* \{ \s* | ||
( [^\}]+ )? # $2 = style | ||||
\s* \} \s* | ||||
| | ||||
( . ) # $3 = error | ||||
/mx | ||||
def parse stylesheet | ||||
|
r2965 | stylesheet.scan CSS_CLASS_PATTERN do |classes, style, error| | ||
|
r638 | raise "CSS parse error: '#{error.inspect}' not recognized" if error | ||
|
r2965 | styles = classes.scan(/[-\w]+/) | ||
cl = styles.pop | ||||
@classes[cl] ||= Hash.new | ||||
@classes[cl][styles] = style.to_s.strip | ||||
|
r638 | end | ||
end | ||||
end | ||||
end | ||||
end | ||||
end | ||||
if $0 == __FILE__ | ||||
require 'pp' | ||||
pp CodeRay::Encoders::HTML::CSS.new | ||||
end | ||||