Mercurial > hg > soundsoftware-site
annotate vendor/gems/coderay-1.0.0/lib/coderay/encoders/html/css.rb @ 1022:f2ec92061fca browsing
Merge from live branch
author | Chris Cannam <chris.cannam@soundsoftware.ac.uk> |
---|---|
date | Tue, 13 Nov 2012 10:35:40 +0000 |
parents | cbb26bc654de |
children |
rev | line source |
---|---|
Chris@909 | 1 module CodeRay |
Chris@909 | 2 module Encoders |
Chris@909 | 3 |
Chris@909 | 4 class HTML |
Chris@909 | 5 class CSS # :nodoc: |
Chris@909 | 6 |
Chris@909 | 7 attr :stylesheet |
Chris@909 | 8 |
Chris@909 | 9 def CSS.load_stylesheet style = nil |
Chris@909 | 10 CodeRay::Styles[style] |
Chris@909 | 11 end |
Chris@909 | 12 |
Chris@909 | 13 def initialize style = :default |
Chris@909 | 14 @classes = Hash.new |
Chris@909 | 15 style = CSS.load_stylesheet style |
Chris@909 | 16 @stylesheet = [ |
Chris@909 | 17 style::CSS_MAIN_STYLES, |
Chris@909 | 18 style::TOKEN_COLORS.gsub(/^(?!$)/, '.CodeRay ') |
Chris@909 | 19 ].join("\n") |
Chris@909 | 20 parse style::TOKEN_COLORS |
Chris@909 | 21 end |
Chris@909 | 22 |
Chris@909 | 23 def get_style styles |
Chris@909 | 24 cl = @classes[styles.first] |
Chris@909 | 25 return '' unless cl |
Chris@909 | 26 style = '' |
Chris@909 | 27 1.upto styles.size do |offset| |
Chris@909 | 28 break if style = cl[styles[offset .. -1]] |
Chris@909 | 29 end |
Chris@909 | 30 # warn 'Style not found: %p' % [styles] if style.empty? |
Chris@909 | 31 return style |
Chris@909 | 32 end |
Chris@909 | 33 |
Chris@909 | 34 private |
Chris@909 | 35 |
Chris@909 | 36 CSS_CLASS_PATTERN = / |
Chris@909 | 37 ( # $1 = selectors |
Chris@909 | 38 (?: |
Chris@909 | 39 (?: \s* \. [-\w]+ )+ |
Chris@909 | 40 \s* ,? |
Chris@909 | 41 )+ |
Chris@909 | 42 ) |
Chris@909 | 43 \s* \{ \s* |
Chris@909 | 44 ( [^\}]+ )? # $2 = style |
Chris@909 | 45 \s* \} \s* |
Chris@909 | 46 | |
Chris@909 | 47 ( [^\n]+ ) # $3 = error |
Chris@909 | 48 /mx |
Chris@909 | 49 def parse stylesheet |
Chris@909 | 50 stylesheet.scan CSS_CLASS_PATTERN do |selectors, style, error| |
Chris@909 | 51 raise "CSS parse error: '#{error.inspect}' not recognized" if error |
Chris@909 | 52 for selector in selectors.split(',') |
Chris@909 | 53 classes = selector.scan(/[-\w]+/) |
Chris@909 | 54 cl = classes.pop |
Chris@909 | 55 @classes[cl] ||= Hash.new |
Chris@909 | 56 @classes[cl][classes] = style.to_s.strip.delete(' ').chomp(';') |
Chris@909 | 57 end |
Chris@909 | 58 end |
Chris@909 | 59 end |
Chris@909 | 60 |
Chris@909 | 61 end |
Chris@909 | 62 end |
Chris@909 | 63 |
Chris@909 | 64 end |
Chris@909 | 65 end |