Chris@909: module CodeRay Chris@909: module Encoders Chris@909: Chris@909: class HTML Chris@909: class CSS # :nodoc: Chris@909: Chris@909: attr :stylesheet Chris@909: Chris@909: def CSS.load_stylesheet style = nil Chris@909: CodeRay::Styles[style] Chris@909: end Chris@909: Chris@909: def initialize style = :default Chris@909: @classes = Hash.new Chris@909: style = CSS.load_stylesheet style Chris@909: @stylesheet = [ Chris@909: style::CSS_MAIN_STYLES, Chris@909: style::TOKEN_COLORS.gsub(/^(?!$)/, '.CodeRay ') Chris@909: ].join("\n") Chris@909: parse style::TOKEN_COLORS Chris@909: end Chris@909: Chris@909: def get_style styles Chris@909: cl = @classes[styles.first] Chris@909: return '' unless cl Chris@909: style = '' Chris@909: 1.upto styles.size do |offset| Chris@909: break if style = cl[styles[offset .. -1]] Chris@909: end Chris@909: # warn 'Style not found: %p' % [styles] if style.empty? Chris@909: return style Chris@909: end Chris@909: Chris@909: private Chris@909: Chris@909: CSS_CLASS_PATTERN = / Chris@909: ( # $1 = selectors Chris@909: (?: Chris@909: (?: \s* \. [-\w]+ )+ Chris@909: \s* ,? Chris@909: )+ Chris@909: ) Chris@909: \s* \{ \s* Chris@909: ( [^\}]+ )? # $2 = style Chris@909: \s* \} \s* Chris@909: | Chris@909: ( [^\n]+ ) # $3 = error Chris@909: /mx Chris@909: def parse stylesheet Chris@909: stylesheet.scan CSS_CLASS_PATTERN do |selectors, style, error| Chris@909: raise "CSS parse error: '#{error.inspect}' not recognized" if error Chris@909: for selector in selectors.split(',') Chris@909: classes = selector.scan(/[-\w]+/) Chris@909: cl = classes.pop Chris@909: @classes[cl] ||= Hash.new Chris@909: @classes[cl][classes] = style.to_s.strip.delete(' ').chomp(';') Chris@909: end Chris@909: end Chris@909: end Chris@909: Chris@909: end Chris@909: end Chris@909: Chris@909: end Chris@909: end