coderay 0.7.4.215 → 0.8.260
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +421 -257
- data/README +24 -13
- data/bin/coderay +9 -4
- data/lib/coderay.rb +19 -17
- data/lib/coderay/duo.rb +67 -9
- data/lib/coderay/encoder.rb +18 -9
- data/lib/coderay/encoders/_map.rb +2 -1
- data/lib/coderay/encoders/debug.rb +14 -11
- data/lib/coderay/encoders/html.rb +44 -17
- data/lib/coderay/encoders/html/css.rb +13 -8
- data/lib/coderay/encoders/html/numerization.rb +8 -6
- data/lib/coderay/encoders/html/output.rb +3 -1
- data/lib/coderay/encoders/statistic.rb +2 -6
- data/lib/coderay/encoders/text.rb +2 -3
- data/lib/coderay/encoders/tokens.rb +3 -3
- data/lib/coderay/encoders/xml.rb +1 -2
- data/lib/coderay/for_redcloth.rb +72 -0
- data/lib/coderay/helpers/file_type.rb +38 -9
- data/lib/coderay/helpers/gzip_simple.rb +1 -0
- data/lib/coderay/helpers/plugin.rb +15 -8
- data/lib/coderay/helpers/word_list.rb +4 -0
- data/lib/coderay/scanner.rb +30 -13
- data/lib/coderay/scanners/_map.rb +1 -1
- data/lib/coderay/scanners/c.rb +3 -1
- data/lib/coderay/scanners/css.rb +181 -0
- data/lib/coderay/scanners/debug.rb +1 -0
- data/lib/coderay/scanners/delphi.rb +1 -0
- data/lib/coderay/scanners/diff.rb +104 -0
- data/lib/coderay/scanners/java.rb +179 -0
- data/lib/coderay/scanners/java/builtin_types.rb +419 -0
- data/lib/coderay/scanners/java_script.rb +187 -0
- data/lib/coderay/scanners/json.rb +106 -0
- data/lib/coderay/scanners/nitro_xhtml.rb +5 -4
- data/lib/coderay/scanners/plaintext.rb +2 -0
- data/lib/coderay/scanners/rhtml.rb +2 -2
- data/lib/coderay/scanners/ruby.rb +64 -50
- data/lib/coderay/scanners/ruby/patterns.rb +15 -19
- data/lib/coderay/scanners/scheme.rb +142 -0
- data/lib/coderay/scanners/sql.Keith.rb +143 -0
- data/lib/coderay/scanners/sql.rb +154 -0
- data/lib/coderay/scanners/xml.rb +1 -0
- data/lib/coderay/styles/cycnus.rb +30 -9
- data/lib/coderay/styles/murphy.rb +15 -2
- data/lib/coderay/{encoders/html/classes.rb → token_classes.rb} +14 -9
- data/lib/coderay/tokens.rb +33 -14
- data/lib/term/ansicolor.rb +220 -0
- metadata +62 -44
    
        data/README
    CHANGED
    
    | @@ -18,12 +18,12 @@ And with line numbers. | |
| 18 18 | 
             
            * is what everybody should have on their website
         | 
| 19 19 | 
             
            * solves all your problems and makes the girls run after you
         | 
| 20 20 |  | 
| 21 | 
            -
            Version: 0. | 
| 21 | 
            +
            Version: 0.8.0
         | 
| 22 22 | 
             
            Author:: murphy (Kornelius Kalnbach)
         | 
| 23 23 | 
             
            Contact:: murphy rubychan de
         | 
| 24 24 | 
             
            Website:: coderay.rubychan.de[http://coderay.rubychan.de]
         | 
| 25 25 | 
             
            License:: GNU LGPL; see LICENSE file in the main directory.
         | 
| 26 | 
            -
            Subversion:: $Id: README  | 
| 26 | 
            +
            Subversion:: $Id: README 247 2008-08-28 05:06:01Z murphy $
         | 
| 27 27 |  | 
| 28 28 | 
             
            -----
         | 
| 29 29 |  | 
| @@ -40,8 +40,10 @@ Since CodeRay is still in beta stage, nightly buildy may be useful: | |
| 40 40 |  | 
| 41 41 | 
             
            === Dependencies
         | 
| 42 42 |  | 
| 43 | 
            -
            CodeRay needs Ruby 1.8 and the | 
| 44 | 
            -
             | 
| 43 | 
            +
            CodeRay needs Ruby 1.8 and the
         | 
| 44 | 
            +
            strscan[http://www.ruby-doc.org/stdlib/libdoc/strscan/rdoc/index.htm]
         | 
| 45 | 
            +
            library (part of the standard library.)  It should also run with Ruby 1.9 and
         | 
| 46 | 
            +
            yarv.
         | 
| 45 47 |  | 
| 46 48 |  | 
| 47 49 | 
             
            == Example Usage
         | 
| @@ -67,7 +69,8 @@ Please report errors in this documentation to <coderay cycnus de>. | |
| 67 69 |  | 
| 68 70 | 
             
            === Special Thanks to
         | 
| 69 71 |  | 
| 70 | 
            -
            * licenser (Heinz N. Gies) for ending my QBasic career, inventing the Coder | 
| 72 | 
            +
            * licenser (Heinz N. Gies) for ending my QBasic career, inventing the Coder
         | 
| 73 | 
            +
              project and the input/output plugin system.
         | 
| 71 74 | 
             
              CodeRay would not exist without him.
         | 
| 72 75 |  | 
| 73 76 | 
             
            === Thanks to
         | 
| @@ -88,6 +91,8 @@ Please report errors in this documentation to <coderay cycnus de>. | |
| 88 91 | 
             
            * Daniel and Dethix from ruby-mine.de
         | 
| 89 92 | 
             
            * Dookie (who is no longer with us...) and Leonidas from
         | 
| 90 93 | 
             
              http://www.python-forum.de
         | 
| 94 | 
            +
            * Andreas Schwarz for finding out that CaseIgnoringWordList was not case
         | 
| 95 | 
            +
              ignoring! Such things really make you write tests.
         | 
| 91 96 | 
             
            * matz and all Ruby gods and gurus
         | 
| 92 97 | 
             
            * The inventors of: the computer, the internet, the true color display, HTML &
         | 
| 93 98 | 
             
              CSS, VIM, RUBY, pizza, microwaves, guitars, scouting, programming, anime, 
         | 
| @@ -97,21 +102,27 @@ Where would we be without all those people? | |
| 97 102 |  | 
| 98 103 | 
             
            === Created using
         | 
| 99 104 |  | 
| 100 | 
            -
            * Ruby[http://ruby-lang.org/ | 
| 101 | 
            -
            * Chihiro (my Sony VAIO laptop)  | 
| 102 | 
            -
             | 
| 105 | 
            +
            * Ruby[http://ruby-lang.org/]
         | 
| 106 | 
            +
            * Chihiro (my Sony VAIO laptop), Henrietta (my new MacBook) and
         | 
| 107 | 
            +
              Seras (my Athlon 2200+ tower)
         | 
| 108 | 
            +
            * VIM[http://vim.org] and TextMate[http://macromates.com]
         | 
| 103 109 | 
             
            * RDE[http://homepage2.nifty.com/sakazuki/rde_e.html]
         | 
| 104 | 
            -
            * Microsoft Windows (yes, I confess!)
         | 
| 105 | 
            -
            * Firefox[http://www.mozilla.org/products/firefox/] and | 
| 110 | 
            +
            * Microsoft Windows (yes, I confess!) and MacOS X
         | 
| 111 | 
            +
            * Firefox[http://www.mozilla.org/products/firefox/] and
         | 
| 112 | 
            +
              Thunderbird[http://www.mozilla.org/products/thunderbird/]
         | 
| 106 113 | 
             
            * Rake[http://rake.rubyforge.org/]
         | 
| 107 114 | 
             
            * RubyGems[http://docs.rubygems.org/]
         | 
| 108 | 
            -
            * {Subversion/TortoiseSVN}[http://tortoisesvn.tigris.org/] using Apache via | 
| 115 | 
            +
            * {Subversion/TortoiseSVN}[http://tortoisesvn.tigris.org/] using Apache via
         | 
| 116 | 
            +
              XAMPP[http://www.apachefriends.org/en/xampp.html]
         | 
| 109 117 | 
             
            * RDoc (though I'm quite unsatisfied with it)
         | 
| 110 | 
            -
            * GNUWin32, MinGW and some other tools to make the shell under windows a bit | 
| 118 | 
            +
            * GNUWin32, MinGW and some other tools to make the shell under windows a bit
         | 
| 119 | 
            +
              more useful
         | 
| 120 | 
            +
            * Term::ANSIColor[http://term-ansicolor.rubyforge.org/]
         | 
| 111 121 |  | 
| 112 122 | 
             
            ---
         | 
| 113 123 |  | 
| 114 124 | 
             
            * As you can see, CodeRay was created under heavy use of *free* software.
         | 
| 115 125 | 
             
            * So CodeRay is also *free*.
         | 
| 116 | 
            -
            * If you use CodeRay to create software, think about making this software | 
| 126 | 
            +
            * If you use CodeRay to create software, think about making this software
         | 
| 127 | 
            +
              *free*, too.
         | 
| 117 128 | 
             
            * Thanks :)
         | 
    
        data/bin/coderay
    CHANGED
    
    | @@ -29,11 +29,11 @@ Example: | |
| 29 29 | 
             
                if first[/-(\w+)/] == first
         | 
| 30 30 | 
             
                  lang = $1.to_sym
         | 
| 31 31 | 
             
                  input = $stdin.read
         | 
| 32 | 
            -
                  tokens =  | 
| 32 | 
            +
                  tokens = :scan
         | 
| 33 33 | 
             
                elsif first == '-'
         | 
| 34 34 | 
             
                  lang = $1.to_sym
         | 
| 35 35 | 
             
                  input = $stdin.read
         | 
| 36 | 
            -
                  tokens =  | 
| 36 | 
            +
                  tokens = :scan
         | 
| 37 37 | 
             
                else
         | 
| 38 38 | 
             
                  file = first
         | 
| 39 39 | 
             
                  tokens = CodeRay.scan_file file
         | 
| @@ -54,8 +54,13 @@ Example: | |
| 54 54 | 
             
                $stderr.puts 'No format given; setting to default (HTML Page)'
         | 
| 55 55 | 
             
                format = :page
         | 
| 56 56 | 
             
              end
         | 
| 57 | 
            -
             | 
| 58 | 
            -
               | 
| 57 | 
            +
              
         | 
| 58 | 
            +
              # TODO: allow streaming
         | 
| 59 | 
            +
              if tokens == :scan
         | 
| 60 | 
            +
                output = CodeRay::Duo[lang => format].highlight input  #, :stream => true
         | 
| 61 | 
            +
              else
         | 
| 62 | 
            +
                output = tokens.encode format
         | 
| 63 | 
            +
              end
         | 
| 59 64 | 
             
              out = $stdout
         | 
| 60 65 | 
             
              if output_filename
         | 
| 61 66 | 
             
                output_filename += '.' + CodeRay::Encoders[format]::FILE_EXTENSION
         | 
    
        data/lib/coderay.rb
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            # = CodeRay Library
         | 
| 2 2 | 
             
            #
         | 
| 3 | 
            -
            # $Id: coderay.rb  | 
| 3 | 
            +
            # $Id: coderay.rb 260 2008-10-08 20:18:31Z murphy $
         | 
| 4 4 | 
             
            #
         | 
| 5 5 | 
             
            # CodeRay is a Ruby library for syntax highlighting.
         | 
| 6 6 | 
             
            #
         | 
| @@ -24,8 +24,8 @@ | |
| 24 24 | 
             
            #
         | 
| 25 25 | 
             
            # == Usage
         | 
| 26 26 | 
             
            #
         | 
| 27 | 
            -
            # Remember you need RubyGems to use CodeRay. Run Ruby with | 
| 28 | 
            -
            # if required.
         | 
| 27 | 
            +
            # Remember you need RubyGems to use CodeRay, unless you have it in your load path. Run Ruby with
         | 
| 28 | 
            +
            # -rubygems option if required.
         | 
| 29 29 | 
             
            #
         | 
| 30 30 | 
             
            # === Highlight Ruby code in a string as html
         | 
| 31 31 | 
             
            # 
         | 
| @@ -44,19 +44,15 @@ | |
| 44 44 | 
             
            # 
         | 
| 45 45 | 
             
            # You can include this div in your page. The used CSS styles can be printed with
         | 
| 46 46 | 
             
            # 
         | 
| 47 | 
            -
            #   %  | 
| 47 | 
            +
            #   % coderay_stylesheet
         | 
| 48 48 | 
             
            # 
         | 
| 49 49 | 
             
            # === Highlight without typing too much
         | 
| 50 | 
            -
            #
         | 
| 50 | 
            +
            # 
         | 
| 51 51 | 
             
            # If you are one of the hasty (or lazy, or extremely curious) people, just run this file:
         | 
| 52 | 
            -
            #
         | 
| 53 | 
            -
            #   % ruby -rubygems coderay.rb
         | 
| 54 52 | 
             
            # 
         | 
| 55 | 
            -
            #  | 
| 53 | 
            +
            #   % ruby -rubygems /path/to/coderay/coderay.rb > example.html
         | 
| 56 54 | 
             
            # 
         | 
| 57 | 
            -
            # | 
| 58 | 
            -
            #
         | 
| 59 | 
            -
            # and look at the file it created.
         | 
| 55 | 
            +
            # and look at the file it created in your browser.
         | 
| 60 56 | 
             
            # 
         | 
| 61 57 | 
             
            # = CodeRay Module
         | 
| 62 58 | 
             
            #
         | 
| @@ -111,7 +107,7 @@ | |
| 111 107 | 
             
            #
         | 
| 112 108 | 
             
            # CodeRay.scan_stream:: Scan in stream mode.
         | 
| 113 109 | 
             
            #
         | 
| 114 | 
            -
            # | 
| 110 | 
            +
            # == All-in-One Encoding
         | 
| 115 111 | 
             
            #
         | 
| 116 112 | 
             
            # CodeRay.encode:: Highlight a string with a given input and output format.
         | 
| 117 113 | 
             
            #
         | 
| @@ -121,11 +117,16 @@ | |
| 121 117 | 
             
            # for this Encoder must only be done once.
         | 
| 122 118 | 
             
            #
         | 
| 123 119 | 
             
            # CodeRay.encoder:: Create an Encoder instance with format and options.
         | 
| 120 | 
            +
            # CodeRay.scanner:: Create an Scanner instance for lang, with '' as default code.
         | 
| 124 121 | 
             
            #
         | 
| 125 | 
            -
            #  | 
| 126 | 
            -
            # on creation; you can't re-use them with another string.
         | 
| 122 | 
            +
            # To make use of CodeRay.scanner, use CodeRay::Scanner::code=.
         | 
| 127 123 | 
             
            #
         | 
| 128 | 
            -
            # | 
| 124 | 
            +
            # The scanning methods provide more flexibility; we recommend to use these.
         | 
| 125 | 
            +
            # 
         | 
| 126 | 
            +
            # == Reusing Scanners and Encoders
         | 
| 127 | 
            +
            # 
         | 
| 128 | 
            +
            # If you want to re-use scanners and encoders (because that is faster), see
         | 
| 129 | 
            +
            # CodeRay::Duo for the most convenient (and recommended) interface.
         | 
| 129 130 | 
             
            module CodeRay
         | 
| 130 131 |  | 
| 131 132 | 
             
              # Version: Major.Minor.Teeny[.Revision]
         | 
| @@ -133,7 +134,7 @@ module CodeRay | |
| 133 134 | 
             
              # Minor: odd for beta, even for stable
         | 
| 134 135 | 
             
              # Teeny: development state
         | 
| 135 136 | 
             
              # Revision: Subversion Revision number (generated on rake)
         | 
| 136 | 
            -
              VERSION = '0. | 
| 137 | 
            +
              VERSION = '0.8'
         | 
| 137 138 |  | 
| 138 139 | 
             
              require 'coderay/tokens'
         | 
| 139 140 | 
             
              require 'coderay/scanner'
         | 
| @@ -314,6 +315,7 @@ end | |
| 314 315 | 
             
            # Run a test script.
         | 
| 315 316 | 
             
            if $0 == __FILE__
         | 
| 316 317 | 
             
              $stderr.print 'Press key to print demo.'; gets
         | 
| 317 | 
            -
               | 
| 318 | 
            +
              # Just use this file as an example of Ruby code.
         | 
| 319 | 
            +
              code = File.read(__FILE__)[/module CodeRay.*/m]
         | 
| 318 320 | 
             
              print CodeRay.scan(code, :ruby).html
         | 
| 319 321 | 
             
            end
         | 
    
        data/lib/coderay/duo.rb
    CHANGED
    
    | @@ -4,26 +4,84 @@ module CodeRay | |
| 4 4 | 
             
              #
         | 
| 5 5 | 
             
              # $Id: scanner.rb 123 2006-03-21 14:46:34Z murphy $
         | 
| 6 6 | 
             
              #
         | 
| 7 | 
            -
              #  | 
| 7 | 
            +
              # A Duo is a convenient way to use CodeRay. You just create a Duo,
         | 
| 8 | 
            +
              # giving it a lang (language of the input code) and a format (desired
         | 
| 9 | 
            +
              # output format), and call Duo#highlight with the code.
         | 
| 10 | 
            +
              # 
         | 
| 11 | 
            +
              # Duo makes it easy to re-use both scanner and encoder for a repetitive
         | 
| 12 | 
            +
              # task. It also provides a very easy interface syntax:
         | 
| 13 | 
            +
              # 
         | 
| 14 | 
            +
              #   require 'coderay'
         | 
| 15 | 
            +
              #   CodeRay::Duo[:python, :div].highlight 'import this'
         | 
| 16 | 
            +
              # 
         | 
| 17 | 
            +
              # Until you want to do uncommon things with CodeRay, I recommend to use
         | 
| 18 | 
            +
              # this method, since it takes care of everything.
         | 
| 8 19 | 
             
              class Duo
         | 
| 9 20 |  | 
| 10 | 
            -
                attr_accessor : | 
| 11 | 
            -
             | 
| 12 | 
            -
                 | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 21 | 
            +
                attr_accessor :lang, :format, :options
         | 
| 22 | 
            +
                
         | 
| 23 | 
            +
                # Create a new Duo, holding a lang and a format to highlight code.
         | 
| 24 | 
            +
                # 
         | 
| 25 | 
            +
                # simple:
         | 
| 26 | 
            +
                #   CodeRay::Duo[:ruby, :page].highlight 'bla 42'
         | 
| 27 | 
            +
                # 
         | 
| 28 | 
            +
                # streaming:
         | 
| 29 | 
            +
                #   CodeRay::Duo[:ruby, :page].highlight 'bar 23', :stream => true
         | 
| 30 | 
            +
                # 
         | 
| 31 | 
            +
                # with options:
         | 
| 32 | 
            +
                #   CodeRay::Duo[:ruby, :html, :hint => :debug].highlight '????::??'
         | 
| 33 | 
            +
                # 
         | 
| 34 | 
            +
                # alternative syntax without options:
         | 
| 35 | 
            +
                #   CodeRay::Duo[:ruby => :statistic].encode 'class << self; end'
         | 
| 36 | 
            +
                # 
         | 
| 37 | 
            +
                # alternative syntax with options:
         | 
| 38 | 
            +
                #   CodeRay::Duo[{ :ruby => :statistic }, :do => :something].encode 'abc'
         | 
| 39 | 
            +
                # 
         | 
| 40 | 
            +
                # The options are forwarded to scanner and encoder
         | 
| 41 | 
            +
                # (see CodeRay.get_scanner_options).
         | 
| 42 | 
            +
                def initialize lang = nil, format = nil, options = {}
         | 
| 43 | 
            +
                  if format == nil and lang.is_a? Hash and lang.size == 1
         | 
| 44 | 
            +
                    @lang = lang.keys.first
         | 
| 45 | 
            +
                    @format = lang[@lang]
         | 
| 46 | 
            +
                  else
         | 
| 47 | 
            +
                    @lang = lang
         | 
| 48 | 
            +
                    @format = format
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
                  @options = options
         | 
| 15 51 | 
             
                end
         | 
| 16 52 |  | 
| 17 53 | 
             
                class << self
         | 
| 54 | 
            +
                  # To allow calls like Duo[:ruby, :html].highlight.
         | 
| 18 55 | 
             
                  alias [] new
         | 
| 19 56 | 
             
                end
         | 
| 20 57 |  | 
| 21 | 
            -
                 | 
| 22 | 
            -
             | 
| 23 | 
            -
                  @ | 
| 58 | 
            +
                # The scanner of the duo. Only created once.
         | 
| 59 | 
            +
                def scanner
         | 
| 60 | 
            +
                  @scanner ||= CodeRay.scanner @lang, CodeRay.get_scanner_options(@options)
         | 
| 61 | 
            +
                end
         | 
| 62 | 
            +
                
         | 
| 63 | 
            +
                # The encoder of the duo. Only created once.
         | 
| 64 | 
            +
                def encoder
         | 
| 65 | 
            +
                  @encoder ||= CodeRay.encoder @format, @options
         | 
| 66 | 
            +
                end
         | 
| 67 | 
            +
                
         | 
| 68 | 
            +
                # Tokenize and highlight the code using +scanner+ and +encoder+.
         | 
| 69 | 
            +
                #
         | 
| 70 | 
            +
                # If the :stream option is set, the Duo will go into streaming mode,
         | 
| 71 | 
            +
                # saving memory for the cost of time.
         | 
| 72 | 
            +
                def encode code, options = { :stream => false }
         | 
| 73 | 
            +
                  stream = options.delete :stream
         | 
| 74 | 
            +
                  options = @options.merge options
         | 
| 75 | 
            +
                  if stream
         | 
| 76 | 
            +
                    encoder.encode_stream(code, @lang, options)
         | 
| 77 | 
            +
                  else
         | 
| 78 | 
            +
                    scanner.code = code
         | 
| 79 | 
            +
                    encoder.encode_tokens(scanner.tokenize, options)
         | 
| 80 | 
            +
                  end
         | 
| 24 81 | 
             
                end
         | 
| 25 82 | 
             
                alias highlight encode
         | 
| 26 83 |  | 
| 27 84 | 
             
              end
         | 
| 28 85 |  | 
| 29 86 | 
             
            end
         | 
| 87 | 
            +
             | 
    
        data/lib/coderay/encoder.rb
    CHANGED
    
    | @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            require "stringio"
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module CodeRay
         | 
| 2 4 |  | 
| 3 5 | 
             
              # This module holds the Encoder class and its subclasses.
         | 
| @@ -40,7 +42,7 @@ module CodeRay | |
| 40 42 | 
             
                    # downcase class name instead.
         | 
| 41 43 | 
             
                    def const_missing sym
         | 
| 42 44 | 
             
                      if sym == :FILE_EXTENSION
         | 
| 43 | 
            -
                         | 
| 45 | 
            +
                        plugin_id
         | 
| 44 46 | 
             
                      else
         | 
| 45 47 | 
             
                        super
         | 
| 46 48 | 
             
                      end
         | 
| @@ -130,13 +132,15 @@ module CodeRay | |
| 130 132 | 
             
                  # By default, it calls text_token or block_token, depending on
         | 
| 131 133 | 
             
                  # whether +text+ is a String.
         | 
| 132 134 | 
             
                  def token text, kind
         | 
| 133 | 
            -
                     | 
| 134 | 
            -
                       | 
| 135 | 
            -
             | 
| 136 | 
            -
                       | 
| 137 | 
            -
             | 
| 138 | 
            -
                       | 
| 139 | 
            -
             | 
| 135 | 
            +
                    out =
         | 
| 136 | 
            +
                      if text.is_a? ::String  # Ruby 1.9: watch out, :open.is_a? String is true
         | 
| 137 | 
            +
                        text_token text, kind
         | 
| 138 | 
            +
                      elsif text.is_a? ::Symbol
         | 
| 139 | 
            +
                        block_token text, kind
         | 
| 140 | 
            +
                      else
         | 
| 141 | 
            +
                        raise 'Unknown token text type: %p' % text
         | 
| 142 | 
            +
                      end
         | 
| 143 | 
            +
                    @out << out if defined?(@out) && @out
         | 
| 140 144 | 
             
                  end
         | 
| 141 145 |  | 
| 142 146 | 
             
                  def text_token text, kind
         | 
| @@ -148,6 +152,10 @@ module CodeRay | |
| 148 152 | 
             
                      open_token kind
         | 
| 149 153 | 
             
                    when :close
         | 
| 150 154 | 
             
                      close_token kind
         | 
| 155 | 
            +
                    when :begin_line
         | 
| 156 | 
            +
                      begin_line kind
         | 
| 157 | 
            +
                    when :end_line
         | 
| 158 | 
            +
                      end_line kind
         | 
| 151 159 | 
             
                    else
         | 
| 152 160 | 
             
                      raise 'unknown block action: %p' % action
         | 
| 153 161 | 
             
                    end
         | 
| @@ -164,7 +172,8 @@ module CodeRay | |
| 164 172 | 
             
                  # The already created +tokens+ object must be used; it can be a
         | 
| 165 173 | 
             
                  # TokenStream or a Tokens object.
         | 
| 166 174 | 
             
                  def compile tokens, options
         | 
| 167 | 
            -
                    tokens.each | 
| 175 | 
            +
                    tokens.each { |text, kind| token text, kind }  # FIXME for Ruby 1.9?
         | 
| 176 | 
            +
                    #tokens.each(&self)
         | 
| 168 177 | 
             
                  end
         | 
| 169 178 |  | 
| 170 179 | 
             
                end
         | 
| @@ -19,17 +19,12 @@ module Encoders | |
| 19 19 |  | 
| 20 20 | 
             
              protected
         | 
| 21 21 | 
             
                def text_token text, kind
         | 
| 22 | 
            -
                   | 
| 23 | 
            -
                     | 
| 24 | 
            -
             | 
| 25 | 
            -
                     | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
                    end
         | 
| 29 | 
            -
                end
         | 
| 30 | 
            -
             | 
| 31 | 
            -
                def block_token action, kind
         | 
| 32 | 
            -
                  @out << super
         | 
| 22 | 
            +
                  if kind == :space
         | 
| 23 | 
            +
                    text
         | 
| 24 | 
            +
                  else
         | 
| 25 | 
            +
                    text = text.gsub(/[)\\]/, '\\\\\0')  # escape ) and \
         | 
| 26 | 
            +
                    "#{kind}(#{text})"
         | 
| 27 | 
            +
                  end
         | 
| 33 28 | 
             
                end
         | 
| 34 29 |  | 
| 35 30 | 
             
                def open_token kind
         | 
| @@ -40,6 +35,14 @@ module Encoders | |
| 40 35 | 
             
                  ">"
         | 
| 41 36 | 
             
                end
         | 
| 42 37 |  | 
| 38 | 
            +
                def begin_line kind
         | 
| 39 | 
            +
                  "#{kind}["
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                def end_line kind
         | 
| 43 | 
            +
                  "]"
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
             | 
| 43 46 | 
             
              end
         | 
| 44 47 |  | 
| 45 48 | 
             
            end
         | 
| @@ -86,7 +86,7 @@ module Encoders | |
| 86 86 | 
             
                  :hint => false,
         | 
| 87 87 | 
             
                }
         | 
| 88 88 |  | 
| 89 | 
            -
                helper : | 
| 89 | 
            +
                helper :output, :css
         | 
| 90 90 |  | 
| 91 91 | 
             
                attr_reader :css
         | 
| 92 92 |  | 
| @@ -119,15 +119,14 @@ module Encoders | |
| 119 119 | 
             
                    end
         | 
| 120 120 | 
             
                }
         | 
| 121 121 |  | 
| 122 | 
            -
                TRANSPARENT_TOKEN_KINDS =  | 
| 122 | 
            +
                TRANSPARENT_TOKEN_KINDS = [
         | 
| 123 123 | 
             
                  :delimiter, :modifier, :content, :escape, :inline_delimiter,
         | 
| 124 | 
            -
                ]
         | 
| 124 | 
            +
                ].to_set
         | 
| 125 125 |  | 
| 126 126 | 
             
                # Generate a hint about the given +classes+ in a +hint+ style.
         | 
| 127 127 | 
             
                #
         | 
| 128 128 | 
             
                # +hint+ may be :info, :info_long or :debug.
         | 
| 129 129 | 
             
                def self.token_path_to_hint hint, classes
         | 
| 130 | 
            -
                  return '' unless hint
         | 
| 131 130 | 
             
                  title =
         | 
| 132 131 | 
             
                    case hint
         | 
| 133 132 | 
             
                    when :info
         | 
| @@ -137,7 +136,7 @@ module Encoders | |
| 137 136 | 
             
                    when :debug
         | 
| 138 137 | 
             
                      classes.inspect
         | 
| 139 138 | 
             
                    end
         | 
| 140 | 
            -
                  " title=\"#{title}\""
         | 
| 139 | 
            +
                  title ? " title=\"#{title}\"" : ''
         | 
| 141 140 | 
             
                end
         | 
| 142 141 |  | 
| 143 142 | 
             
                def setup options
         | 
| @@ -159,29 +158,32 @@ module Encoders | |
| 159 158 |  | 
| 160 159 | 
             
                  when :class
         | 
| 161 160 | 
             
                    @css_style = Hash.new do |h, k|
         | 
| 162 | 
            -
                       | 
| 163 | 
            -
                        type = k.first
         | 
| 164 | 
            -
                      else
         | 
| 165 | 
            -
                        type = k
         | 
| 166 | 
            -
                      end
         | 
| 167 | 
            -
                      c = ClassOfKind[type]
         | 
| 161 | 
            +
                      c = CodeRay::Tokens::ClassOfKind[k.first]
         | 
| 168 162 | 
             
                      if c == :NO_HIGHLIGHT and not hint
         | 
| 169 | 
            -
                        h[k] = false
         | 
| 163 | 
            +
                        h[k.dup] = false
         | 
| 170 164 | 
             
                      else
         | 
| 171 | 
            -
                        title =  | 
| 172 | 
            -
             | 
| 165 | 
            +
                        title = if hint
         | 
| 166 | 
            +
                          HTML.token_path_to_hint(hint, k[1..-1] << k.first)
         | 
| 167 | 
            +
                        else
         | 
| 168 | 
            +
                          ''
         | 
| 169 | 
            +
                        end
         | 
| 170 | 
            +
                        if c == :NO_HIGHLIGHT
         | 
| 171 | 
            +
                          h[k.dup] = '<span%s>' % [title]
         | 
| 172 | 
            +
                        else
         | 
| 173 | 
            +
                          h[k.dup] = '<span%s class="%s">' % [title, c]
         | 
| 174 | 
            +
                        end
         | 
| 173 175 | 
             
                      end
         | 
| 174 176 | 
             
                    end
         | 
| 175 177 |  | 
| 176 178 | 
             
                  when :style
         | 
| 177 179 | 
             
                    @css_style = Hash.new do |h, k|
         | 
| 178 | 
            -
                      if k.is_a? Array
         | 
| 180 | 
            +
                      if k.is_a? ::Array
         | 
| 179 181 | 
             
                        styles = k.dup
         | 
| 180 182 | 
             
                      else
         | 
| 181 183 | 
             
                        styles = [k]
         | 
| 182 184 | 
             
                      end
         | 
| 183 185 | 
             
                      type = styles.first
         | 
| 184 | 
            -
                      classes = styles.map { |c| ClassOfKind[c] }
         | 
| 186 | 
            +
                      classes = styles.map { |c| Tokens::ClassOfKind[c] }
         | 
| 185 187 | 
             
                      if classes.first == :NO_HIGHLIGHT and not hint
         | 
| 186 188 | 
             
                        h[k] = false
         | 
| 187 189 | 
             
                      else
         | 
| @@ -224,13 +226,16 @@ module Encoders | |
| 224 226 | 
             
                      text = text.gsub(/#{HTML_ESCAPE_PATTERN}/o) { |m| @HTML_ESCAPE[m] }
         | 
| 225 227 | 
             
                    end
         | 
| 226 228 | 
             
                    @opened[0] = type
         | 
| 227 | 
            -
                    if style = @css_style[@opened]
         | 
| 229 | 
            +
                    if text != "\n" && style = @css_style[@opened]
         | 
| 228 230 | 
             
                      @out << style << text << '</span>'
         | 
| 229 231 | 
             
                    else
         | 
| 230 232 | 
             
                      @out << text
         | 
| 231 233 | 
             
                    end
         | 
| 232 234 | 
             
                  else
         | 
| 235 | 
            +
                    
         | 
| 233 236 | 
             
                    case text
         | 
| 237 | 
            +
                    
         | 
| 238 | 
            +
                    # token groups, eg. strings
         | 
| 234 239 | 
             
                    when :open
         | 
| 235 240 | 
             
                      @opened[0] = type
         | 
| 236 241 | 
             
                      @out << (@css_style[@opened] || '<span>')
         | 
| @@ -246,6 +251,28 @@ module Encoders | |
| 246 251 | 
             
                        @out << '</span>'
         | 
| 247 252 | 
             
                        @opened.pop
         | 
| 248 253 | 
             
                      end
         | 
| 254 | 
            +
                    
         | 
| 255 | 
            +
                    # whole lines to be highlighted, eg. a deleted line in a diff
         | 
| 256 | 
            +
                    when :begin_line
         | 
| 257 | 
            +
                      @opened[0] = type
         | 
| 258 | 
            +
                      if style = @css_style[@opened]
         | 
| 259 | 
            +
                        @out << style.sub('<span', '<div')
         | 
| 260 | 
            +
                      else
         | 
| 261 | 
            +
                        @out << '<div>'
         | 
| 262 | 
            +
                      end
         | 
| 263 | 
            +
                      @opened << type
         | 
| 264 | 
            +
                    when :end_line
         | 
| 265 | 
            +
                      if @opened.empty?
         | 
| 266 | 
            +
                        # nothing to close
         | 
| 267 | 
            +
                      else
         | 
| 268 | 
            +
                        if $DEBUG and (@opened.size == 1 or @opened.last != type)
         | 
| 269 | 
            +
                          raise 'Malformed token stream: Trying to close a line (%p) \
         | 
| 270 | 
            +
                            that is not open. Open are: %p.' % [type, @opened[1..-1]]
         | 
| 271 | 
            +
                        end
         | 
| 272 | 
            +
                        @out << '</div>'
         | 
| 273 | 
            +
                        @opened.pop
         | 
| 274 | 
            +
                      end
         | 
| 275 | 
            +
                    
         | 
| 249 276 | 
             
                    when nil
         | 
| 250 277 | 
             
                      raise 'Token with nil as text was given: %p' % [[text, type]]
         | 
| 251 278 | 
             
                    else
         |