annotate vendor/plugins/coderay-0.9.2/lib/coderay/encoders/html/css.rb @ 866:2cd212a468b6 bug_152

Close obsolete branch bug_152
author Chris Cannam
date Wed, 11 May 2011 10:08:34 +0100
parents 513646585e45
children
rev   line source
Chris@0 1 module CodeRay
Chris@0 2 module Encoders
Chris@0 3
Chris@0 4 class HTML
Chris@0 5 class CSS
Chris@0 6
Chris@0 7 attr :stylesheet
Chris@0 8
Chris@0 9 def CSS.load_stylesheet style = nil
Chris@0 10 CodeRay::Styles[style]
Chris@0 11 end
Chris@0 12
Chris@0 13 def initialize style = :default
Chris@0 14 @classes = Hash.new
Chris@0 15 style = CSS.load_stylesheet style
Chris@0 16 @stylesheet = [
Chris@0 17 style::CSS_MAIN_STYLES,
Chris@0 18 style::TOKEN_COLORS.gsub(/^(?!$)/, '.CodeRay ')
Chris@0 19 ].join("\n")
Chris@0 20 parse style::TOKEN_COLORS
Chris@0 21 end
Chris@0 22
Chris@0 23 def [] *styles
Chris@0 24 cl = @classes[styles.first]
Chris@0 25 return '' unless cl
Chris@0 26 style = ''
Chris@0 27 1.upto(styles.size) do |offset|
Chris@0 28 break if style = cl[styles[offset .. -1]]
Chris@0 29 end
Chris@0 30 # warn 'Style not found: %p' % [styles] if style.empty?
Chris@0 31 return style
Chris@0 32 end
Chris@0 33
Chris@0 34 private
Chris@0 35
Chris@0 36 CSS_CLASS_PATTERN = /
Chris@0 37 ( # $1 = selectors
Chris@0 38 (?:
Chris@0 39 (?: \s* \. [-\w]+ )+
Chris@0 40 \s* ,?
Chris@0 41 )+
Chris@0 42 )
Chris@0 43 \s* \{ \s*
Chris@0 44 ( [^\}]+ )? # $2 = style
Chris@0 45 \s* \} \s*
Chris@0 46 |
Chris@0 47 ( . ) # $3 = error
Chris@0 48 /mx
Chris@0 49 def parse stylesheet
Chris@0 50 stylesheet.scan CSS_CLASS_PATTERN do |selectors, style, error|
Chris@0 51 raise "CSS parse error: '#{error.inspect}' not recognized" if error
Chris@0 52 for selector in selectors.split(',')
Chris@0 53 classes = selector.scan(/[-\w]+/)
Chris@0 54 cl = classes.pop
Chris@0 55 @classes[cl] ||= Hash.new
Chris@0 56 @classes[cl][classes] = style.to_s.strip.delete(' ').chomp(';')
Chris@0 57 end
Chris@0 58 end
Chris@0 59 end
Chris@0 60
Chris@0 61 end
Chris@0 62 end
Chris@0 63
Chris@0 64 end
Chris@0 65 end
Chris@0 66
Chris@0 67 if $0 == __FILE__
Chris@0 68 require 'pp'
Chris@0 69 pp CodeRay::Encoders::HTML::CSS.new
Chris@0 70 end