diff options
Diffstat (limited to 'lib/coderay/scanners')
-rw-r--r-- | lib/coderay/scanners/_map.rb | 4 | ||||
-rw-r--r-- | lib/coderay/scanners/clojure.rb | 2 | ||||
-rw-r--r-- | lib/coderay/scanners/css.rb | 63 | ||||
-rw-r--r-- | lib/coderay/scanners/erb.rb (renamed from lib/coderay/scanners/rhtml.rb) | 6 | ||||
-rw-r--r-- | lib/coderay/scanners/groovy.rb | 2 | ||||
-rw-r--r-- | lib/coderay/scanners/java_script.rb | 2 | ||||
-rw-r--r-- | lib/coderay/scanners/nitro_xhtml.rb | 136 | ||||
-rw-r--r-- | lib/coderay/scanners/php.rb | 4 | ||||
-rw-r--r-- | lib/coderay/scanners/ruby.rb | 17 |
9 files changed, 57 insertions, 179 deletions
diff --git a/lib/coderay/scanners/_map.rb b/lib/coderay/scanners/_map.rb index b94d452..a240298 100644 --- a/lib/coderay/scanners/_map.rb +++ b/lib/coderay/scanners/_map.rb @@ -6,11 +6,11 @@ module Scanners :cplusplus => :cpp, :ecmascript => :java_script, :ecma_script => :java_script, - :erb => :rhtml, + :rhtml => :erb, + :eruby => :erb, :irb => :ruby, :javascript => :java_script, :js => :java_script, - :nitro => :nitro_xhtml, :pascal => :delphi, :patch => :diff, :plain => :text, diff --git a/lib/coderay/scanners/clojure.rb b/lib/coderay/scanners/clojure.rb index 89713de..f8fbf65 100644 --- a/lib/coderay/scanners/clojure.rb +++ b/lib/coderay/scanners/clojure.rb @@ -156,7 +156,7 @@ module CodeRay elsif match = scan(/['`\(\[\)\]\{\}]|\#[({]|~@?|[@\^]/) encoder.text_token match, :operator elsif match = scan(/;.*/) - encoder.text_token match, :comment # FIXME: recognize (comment ...) too + encoder.text_token match, :comment # TODO: recognize (comment ...) too elsif match = scan(/\#?\\(?:newline|space|.?)/) encoder.text_token match, :char elsif match = scan(/\#[ft]/) diff --git a/lib/coderay/scanners/css.rb b/lib/coderay/scanners/css.rb index 6413f8f..e5f03f5 100644 --- a/lib/coderay/scanners/css.rb +++ b/lib/coderay/scanners/css.rb @@ -2,9 +2,9 @@ module CodeRay module Scanners class CSS < Scanner - + register_for :css - + KINDS_NOT_LOC = [ :comment, :class, :pseudo_class, :type, @@ -20,28 +20,28 @@ module Scanners NMChar = /[-_a-zA-Z0-9]|#{Escape}/ NMStart = /[_a-zA-Z]|#{Escape}/ NL = /\r\n|\r|\n|\f/ - String1 = /"(?:[^\n\r\f\\"]|\\#{NL}|#{Escape})*"?/ # FIXME: buggy regexp - String2 = /'(?:[^\n\r\f\\']|\\#{NL}|#{Escape})*'?/ # FIXME: buggy regexp + String1 = /"(?:[^\n\r\f\\"]|\\#{NL}|#{Escape})*"?/ # TODO: buggy regexp + String2 = /'(?:[^\n\r\f\\']|\\#{NL}|#{Escape})*'?/ # TODO: buggy regexp String = /#{String1}|#{String2}/ - + HexColor = /#(?:#{Hex}{6}|#{Hex}{3})/ Color = /#{HexColor}/ - + Num = /-?(?:[0-9]+|[0-9]*\.[0-9]+)/ Name = /#{NMChar}+/ Ident = /-?#{NMStart}#{NMChar}*/ AtKeyword = /@#{Ident}/ Percentage = /#{Num}%/ - + reldimensions = %w[em ex px] absdimensions = %w[in cm mm pt pc] Unit = Regexp.union(*(reldimensions + absdimensions)) - + Dimension = /#{Num}#{Unit}/ - + Comment = %r! /\* (?: .*? \*/ | .* ) !mx Function = /(?:url|alpha|attr|counters?)\((?:[^)\n\r\f]|\\\))*\)?/ - + Id = /##{Name}/ Class = /\.#{Name}/ PseudoClass = /:#{Name}/ @@ -64,20 +64,26 @@ module Scanners when :initial, :media if match = scan(/(?>#{RE::Ident})(?!\()|\*/ox) encoder.text_token match, :type + next elsif match = scan(RE::Class) encoder.text_token match, :class + next elsif match = scan(RE::Id) encoder.text_token match, :constant + next elsif match = scan(RE::PseudoClass) encoder.text_token match, :pseudo_class + next elsif match = scan(RE::AttributeSelector) # TODO: Improve highlighting inside of attribute selectors. encoder.text_token match[0,1], :operator encoder.text_token match[1..-2], :attribute_name if match.size > 2 encoder.text_token match[-1,1], :operator if match[-1] == ?] + next elsif match = scan(/@media/) encoder.text_token match, :directive states.push :media_before_name + next end when :block @@ -87,18 +93,21 @@ module Scanners else encoder.text_token match, :key end + next end - + when :media_before_name if match = scan(RE::Ident) encoder.text_token match, :type states[-1] = :media_after_name + next end when :media_after_name if match = scan(/\{/) encoder.text_token match, :operator states[-1] = :media + next end else @@ -110,12 +119,12 @@ module Scanners elsif match = scan(/\/\*(?:.*?\*\/|\z)/m) encoder.text_token match, :comment - + elsif match = scan(/\{/) value_expected = false encoder.text_token match, :operator states.push :block - + elsif match = scan(/\}/) value_expected = false if states.last == :block || states.last == :media @@ -124,14 +133,14 @@ module Scanners else encoder.text_token match, :error end - + elsif match = scan(/#{RE::String}/o) encoder.begin_group :string encoder.text_token match[0, 1], :delimiter encoder.text_token match[1..-2], :content if match.size > 2 encoder.text_token match[-1, 1], :delimiter if match.size >= 2 encoder.end_group :string - + elsif match = scan(/#{RE::Function}/o) encoder.begin_group :string start = match[/^\w+\(/] @@ -143,22 +152,22 @@ module Scanners encoder.text_token match[start.size..-1], :content end encoder.end_group :string - + elsif match = scan(/(?: #{RE::Dimension} | #{RE::Percentage} | #{RE::Num} )/ox) encoder.text_token match, :float - + elsif match = scan(/#{RE::Color}/o) encoder.text_token match, :color - + elsif match = scan(/! *important/) encoder.text_token match, :important - + elsif match = scan(/(?:rgb|hsl)a?\([^()\n]*\)?/) encoder.text_token match, :color - + elsif match = scan(RE::AtKeyword) encoder.text_token match, :directive - + elsif match = scan(/ [+>:;,.=()\/] /x) if match == ':' value_expected = true @@ -166,18 +175,18 @@ module Scanners value_expected = false end encoder.text_token match, :operator - + else encoder.text_token getch, :error - + end - + end - + encoder end - + end - + end end diff --git a/lib/coderay/scanners/rhtml.rb b/lib/coderay/scanners/erb.rb index 9bfab5c..eaf3bba 100644 --- a/lib/coderay/scanners/rhtml.rb +++ b/lib/coderay/scanners/erb.rb @@ -5,9 +5,9 @@ module Scanners load :ruby # Scanner for HTML ERB templates. - class RHTML < Scanner + class ERB < Scanner - register_for :rhtml + register_for :erb title 'HTML ERB Template' KINDS_NOT_LOC = HTML::KINDS_NOT_LOC @@ -56,7 +56,7 @@ module Scanners if start_tag[/\A<%#/] encoder.text_token code, :comment else - @ruby_scanner.tokenize code + @ruby_scanner.tokenize code, :tokens => encoder end unless code.empty? encoder.text_token end_tag, :inline_delimiter unless end_tag.empty? encoder.end_group :inline diff --git a/lib/coderay/scanners/groovy.rb b/lib/coderay/scanners/groovy.rb index 2334bc6..3501aaf 100644 --- a/lib/coderay/scanners/groovy.rb +++ b/lib/coderay/scanners/groovy.rb @@ -220,7 +220,7 @@ module Scanners encoder.text_token match, :content elsif match = scan(/ \\. /mx) - encoder.text_token match, :content # FIXME: Shouldn't this be :error? + encoder.text_token match, :content # TODO: Shouldn't this be :error? elsif match = scan(/ \\ | \n /x) encoder.end_group state diff --git a/lib/coderay/scanners/java_script.rb b/lib/coderay/scanners/java_script.rb index 9ebda6f..9063c5e 100644 --- a/lib/coderay/scanners/java_script.rb +++ b/lib/coderay/scanners/java_script.rb @@ -89,7 +89,7 @@ module Scanners end elsif value_expected && match = scan(/<([[:alpha:]]\w*) (?: [^\/>]*\/> | .*?<\/\1>)/xim) - # FIXME: scan over nested tags + # TODO: scan over nested tags xml_scanner.tokenize match, :tokens => encoder value_expected = false next diff --git a/lib/coderay/scanners/nitro_xhtml.rb b/lib/coderay/scanners/nitro_xhtml.rb deleted file mode 100644 index b67b60c..0000000 --- a/lib/coderay/scanners/nitro_xhtml.rb +++ /dev/null @@ -1,136 +0,0 @@ -module CodeRay -module Scanners - - load :html - load :ruby - - # Nitro XHTML Scanner - # - # Alias: +nitro+ - class NitroXHTML < Scanner - - register_for :nitro_xhtml - file_extension :xhtml - title 'Nitro XHTML' - - KINDS_NOT_LOC = HTML::KINDS_NOT_LOC - - NITRO_RUBY_BLOCK = / - <\?r - (?> - [^\?]* - (?> \?(?!>) [^\?]* )* - ) - (?: \?> )? - | - <ruby> - (?> - [^<]* - (?> <(?!\/ruby>) [^<]* )* - ) - (?: <\/ruby> )? - | - <% - (?> - [^%]* - (?> %(?!>) [^%]* )* - ) - (?: %> )? - /mx # :nodoc: - - NITRO_VALUE_BLOCK = / - \# - (?: - \{ - [^{}]* - (?> - \{ [^}]* \} - (?> [^{}]* ) - )* - \}? - | \| [^|]* \|? - | \( [^)]* \)? - | \[ [^\]]* \]? - | \\ [^\\]* \\? - ) - /x # :nodoc: - - NITRO_ENTITY = / - % (?: \#\d+ | \w+ ) ; - / # :nodoc: - - START_OF_RUBY = / - (?=[<\#%]) - < (?: \?r | % | ruby> ) - | \# [{(|] - | % (?: \#\d+ | \w+ ) ; - /x # :nodoc: - - CLOSING_PAREN = Hash.new { |h, p| h[p] = p } # :nodoc: - CLOSING_PAREN.update( { - '(' => ')', - '[' => ']', - '{' => '}', - } ) - - protected - - def setup - @ruby_scanner = CodeRay.scanner :ruby, :tokens => @tokens, :keep_tokens => true - @html_scanner = CodeRay.scanner :html, :tokens => @tokens, :keep_tokens => true, :keep_state => true - end - - def reset_instance - super - @html_scanner.reset - end - - def scan_tokens encoder, options - - until eos? - - if (match = scan_until(/(?=#{START_OF_RUBY})/o) || scan_rest) and not match.empty? - @html_scanner.tokenize match - - elsif match = scan(/#{NITRO_VALUE_BLOCK}/o) - start_tag = match[0,2] - delimiter = CLOSING_PAREN[start_tag[1,1]] - end_tag = match[-1,1] == delimiter ? delimiter : '' - encoder.begin_group :inline - encoder.text_token start_tag, :inline_delimiter - code = match[start_tag.size .. -1 - end_tag.size] - @ruby_scanner.tokenize code, :tokens => encoder - encoder.text_token end_tag, :inline_delimiter unless end_tag.empty? - encoder.end_group :inline - - elsif match = scan(/#{NITRO_RUBY_BLOCK}/o) - start_tag = '<?r' - end_tag = match[-2,2] == '?>' ? '?>' : '' - encoder.begin_group :inline - encoder.text_token start_tag, :inline_delimiter - code = match[start_tag.size .. -(end_tag.size)-1] - @ruby_scanner.tokenize code, :tokens => encoder - encoder.text_token end_tag, :inline_delimiter unless end_tag.empty? - encoder.end_group :inline - - elsif entity = scan(/#{NITRO_ENTITY}/o) - encoder.text_token entity, :entity - - elsif scan(/%/) - encoder.text_token matched, :error - - else - raise_inspect 'else-case reached!', encoder - - end - - end - - encoder - - end - - end - -end -end diff --git a/lib/coderay/scanners/php.rb b/lib/coderay/scanners/php.rb index c290dab..b2632a2 100644 --- a/lib/coderay/scanners/php.rb +++ b/lib/coderay/scanners/php.rb @@ -234,8 +234,8 @@ module Scanners def scan_tokens encoder, options if check(RE::PHP_START) || # starts with <? - (match?(/\s*<\S/) && check(/.{1,100}#{RE::PHP_START}/om)) || # starts with tag and contains <? - check(/.{1,100}#{RE::HTML_INDICATOR}/om) || + (match?(/\s*<\S/) && check(/.{1,1000}#{RE::PHP_START}/om)) || # starts with tag and contains <? + check(/.{0,1000}#{RE::HTML_INDICATOR}/om) || check(/.{1,100}#{RE::PHP_START}/om) # PHP start after max 100 chars # is HTML with embedded PHP, so start with HTML states = [:initial] diff --git a/lib/coderay/scanners/ruby.rb b/lib/coderay/scanners/ruby.rb index e1395ca..25da208 100644 --- a/lib/coderay/scanners/ruby.rb +++ b/lib/coderay/scanners/ruby.rb @@ -26,7 +26,7 @@ module Scanners state, heredocs = @state heredocs = heredocs.dup if heredocs.is_a?(Array) - if state && state.instance_of?(self.class::StringState) + if state && state.instance_of?(StringState) encoder.begin_group state.type end @@ -426,13 +426,18 @@ module Scanners end # cleaning up - if options[:keep_state] - heredocs = nil if heredocs && heredocs.empty? - @state = state, heredocs + if state.is_a? StringState + encoder.end_group state.type end - if state.is_a? self.class::StringState - encoder.end_group state.type + if options[:keep_state] + if state.is_a?(StringState) && state.heredoc + (heredocs ||= []).unshift state + state = :initial + elsif heredocs && heredocs.empty? + heredocs = nil + end + @state = state, heredocs end if inline_block_stack |