From fdd7eab11ddbe99a772930fb6af2586f8021f276 Mon Sep 17 00:00:00 2001 From: murphy Date: Fri, 4 Nov 2005 01:39:22 +0000 Subject: Finally: Demo Tests! Added demo/suite.rb, demo/*.out files Rakefile adjusted TODO updated --- Rakefile | 15 + TODO | 2 +- demo/demo_count.out | 1 + demo/demo_css.out | 96 +++++ demo/demo_div.out | 17 + demo/demo_dump.out | 21 ++ demo/demo_encoder.out | 80 ++++ demo/demo_global_vars.out | 3 + demo/demo_global_vars2.out | 10 + demo/demo_highlight.out | 141 ++++++++ demo/demo_html.out | 885 +++++++++++++++++++++++++++++++++++++++++++++ demo/demo_html2.out | 151 ++++++++ demo/demo_load_encoder.out | 5 + demo/demo_more.out | 2 + demo/demo_more.rb | 3 +- demo/demo_scanner.out | 16 + demo/demo_simple.out | 1 + demo/demo_stream2.out | 2 + demo/demo_tokens.out | 14 + demo/suite.rb | 82 +++++ 20 files changed, 1545 insertions(+), 2 deletions(-) create mode 100644 demo/demo_count.out create mode 100644 demo/demo_css.out create mode 100644 demo/demo_div.out create mode 100644 demo/demo_dump.out create mode 100644 demo/demo_encoder.out create mode 100644 demo/demo_global_vars.out create mode 100644 demo/demo_global_vars2.out create mode 100644 demo/demo_highlight.out create mode 100644 demo/demo_html.out create mode 100644 demo/demo_html2.out create mode 100644 demo/demo_load_encoder.out create mode 100644 demo/demo_more.out create mode 100644 demo/demo_scanner.out create mode 100644 demo/demo_simple.out create mode 100644 demo/demo_stream2.out create mode 100644 demo/demo_tokens.out create mode 100644 demo/suite.rb diff --git a/Rakefile b/Rakefile index d14cf54..87715c1 100644 --- a/Rakefile +++ b/Rakefile @@ -44,11 +44,26 @@ task :stats => :copy_files do ).to_s end +desc 'Test CodeRay Demos' +task :test_demos do + system 'ruby -w ./demo/suite.rb' +end + desc 'Test CodeRay' task :test do system 'ruby -w ./test/suite.rb' end +desc 'Test CodeRay Demos with Fox' +task :testf_demos do + system 'ruby -w ./demo/suite.rb -f' +end + +desc 'Test CodeRay with Fox' +task :testf do + system 'ruby -w ./test/suite.rb -f' +end + desc 'Test CodeRay with debugging' task :debug do system 'ruby -w -d ./test/suite.rb' diff --git a/TODO b/TODO index 51912e0..0c2e0ff 100644 --- a/TODO +++ b/TODO @@ -8,7 +8,7 @@ Project: Documentation: 3/4 0 2 Doc the interface 3/4 0 1 write examples - 0 2 Test demos +1/2 0 2 Test demos Interface: diff --git a/demo/demo_count.out b/demo/demo_count.out new file mode 100644 index 0000000..68c2349 --- /dev/null +++ b/demo/demo_count.out @@ -0,0 +1 @@ +2 out of 4 tokens have the kind :integer. diff --git a/demo/demo_css.out b/demo/demo_css.out new file mode 100644 index 0000000..658610d --- /dev/null +++ b/demo/demo_css.out @@ -0,0 +1,96 @@ +.CodeRay { + background-color: #f8f8f8; + border: 1px solid silver; + font-family: 'Courier New', 'Terminal', monospace; + color: black; +} +.CodeRay pre { margin: 0px; } + +div.CodeRay { } + +span.CodeRay { white-space: pre; border: 0px; padding: 2px; } + +table.CodeRay { border-collapse: collapse; width: 100%; padding: 2px; } +table.CodeRay td { padding: 2px 4px; vertical-align: top; } + +.CodeRay .line_numbers, .CodeRay .no { + background-color: #def; + color: gray; + text-align: right; +} +.CodeRay .line_numbers tt { font-weight: bold; } +.CodeRay .no { padding: 0px 4px; } +.CodeRay .code { width: 100%; } + +ol.CodeRay { font-size: 10pt; } +ol.CodeRay li { white-space: pre; } + +.CodeRay .code pre { overflow: auto; } +.CodeRay .af { color:#00C; } +.CodeRay .an { color:#007; } +.CodeRay .av { color:#700; } +.CodeRay .aw { color:#C00; } +.CodeRay .bi { color:#509; font-weight:bold; } +.CodeRay .c { color:#888; } + +.CodeRay .ch { color:#04D; } +.CodeRay .ch .k { color:#04D; } +.CodeRay .ch .dl { color:#039; } + +.CodeRay .cl { color:#B06; font-weight:bold; } +.CodeRay .co { color:#036; font-weight:bold; } +.CodeRay .cr { color:#0A0; } +.CodeRay .cv { color:#369; } +.CodeRay .df { color:#099; font-weight:bold; } +.CodeRay .di { color:#088; font-weight:bold; } +.CodeRay .dl { color:black; } +.CodeRay .do { color:#970; } +.CodeRay .ds { color:#D42; font-weight:bold; } +.CodeRay .e { color:#666; font-weight:bold; } +.CodeRay .er { color:#F00; background-color:#FAA; } +.CodeRay .ex { color:#F00; font-weight:bold; } +.CodeRay .fl { color:#60E; font-weight:bold; } +.CodeRay .fu { color:#06B; font-weight:bold; } +.CodeRay .gv { color:#d70; font-weight:bold; } +.CodeRay .hx { color:#058; font-weight:bold; } +.CodeRay .i { color:#00D; font-weight:bold; } +.CodeRay .ic { color:#B44; font-weight:bold; } +.CodeRay .il { } +.CodeRay .in { color:#B2B; font-weight:bold; } +.CodeRay .iv { color:#33B; } +.CodeRay .la { color:#970; font-weight:bold; } +.CodeRay .lv { color:#963; } +.CodeRay .oc { color:#40E; font-weight:bold; } +.CodeRay .on { color:#000; font-weight:bold; } +.CodeRay .pc { color:#038; font-weight:bold; } +.CodeRay .pd { color:#369; font-weight:bold; } +.CodeRay .pp { color:#579; } +.CodeRay .pt { color:#339; font-weight:bold; } +.CodeRay .r { color:#080; font-weight:bold; } + +.CodeRay .rx { background-color:#fff0ff; } +.CodeRay .rx .k { color:#808; } +.CodeRay .rx .dl { color:#404; } +.CodeRay .rx .mod { color:#C2C; } +.CodeRay .rx .fu { color:#404; font-weight: bold; } + +.CodeRay .s { background-color:#fff0f0; } +.CodeRay .s .s { background-color:#ffe0e0; } +.CodeRay .s .s .s { background-color:#ffd0d0; } +.CodeRay .s .k { color:#D20; } +.CodeRay .s .dl { color:#710; } + +.CodeRay .sh { background-color:#f0fff0; } +.CodeRay .sh .k { color:#2B2; } +.CodeRay .sh .dl { color:#161; } + +.CodeRay .sy { color:#A60; } +.CodeRay .sy .k { color:#A60; } +.CodeRay .sy .dl { color:#630; } + +.CodeRay .ta { color:#070; } +.CodeRay .tf { color:#070; font-weight:bold; } +.CodeRay .ts { color:#D70; font-weight:bold; } +.CodeRay .ty { color:#339; font-weight:bold; } +.CodeRay .v { color:#036; } +.CodeRay .xt { color:#444; } diff --git a/demo/demo_div.out b/demo/demo_div.out new file mode 100644 index 0000000..1a7de97 --- /dev/null +++ b/demo/demo_div.out @@ -0,0 +1,17 @@ +
+
for a in 0..255
+        a = a.chr
+        begin
+                x = eval("?\\#{a}")
+                if x == a[0]
+                        next
+                else
+                        print "#{a}: #{x}"
+                end
+        rescue SyntaxError => boom
+                print "#{a}: error"
+        end
+        puts
+end
+
+
diff --git a/demo/demo_dump.out b/demo/demo_dump.out new file mode 100644 index 0000000..d303b08 --- /dev/null +++ b/demo/demo_dump.out @@ -0,0 +1,21 @@ +YAML: 2690 bytes +Dump: 1058 bytes +undumped: +
+
require 'coderay'
+
+# scan some code
+tokens = CodeRay.scan(File.read($0), :ruby)
+
+# dump using YAML
+yaml = tokens.yaml
+puts 'YAML: %4d bytes' % yaml.size
+
+# dump using Marshal
+dump = tokens.dump(0)
+puts 'Dump: %4d bytes' % dump.size
+
+# undump and encode
+puts 'undumped:', dump.undump.div(:css => :class)
+
+
diff --git a/demo/demo_encoder.out b/demo/demo_encoder.out new file mode 100644 index 0000000..bef3e86 --- /dev/null +++ b/demo/demo_encoder.out @@ -0,0 +1,80 @@ +Encoders Demo: puts 17 + 4 + +Statistic: + +Code Statistics + +Tokens 8 + Non-Whitespace 4 +Bytes Total 12 + +Token Types (4): + type count ratio size (average) +------------------------------------------------------------- + TOTAL 8 100.00 % 1.5 + space 4 50.00 % 1.0 + integer 2 25.00 % 1.5 + operator 1 12.50 % 1.0 + ident 1 12.50 % 4.0 + + +Original text: +ident puts +space +integer 17 +space +operator + +space +integer 4 +space \ + + +YAML: +--- +- + - puts + - :ident +- + - " " + - :space +- + - "17" + - :integer +- + - " " + - :space +- + - "+" + - :operator +- + - " " + - :space +- + - "4" + - :integer +- + - " + " + - :space + +Dump: +"x\332\355\314;\n\302@\024\205aP\311c\320\316\005\004[+A\020\356\224\331\201\330\245\n\346\"A\230\0312c\341\356M\"\242k\220\277\272\217\303wVE-\333\332wzn\237\"\027\177W\027\233E\265l\362]\031\036)\212\351;ui<\263JL\f\355U\307=?\234d\335\273\2447\035\346\310\346\323\330\313\306\a\035\332\344\177\277G[L\303\314\327\\j\263o.TEXT_FIELD(:NAME, "PANFRAGE OHNE $GV UND MIT #{<--$GV-->}").SET ARTIKEL +ODER +TEXT = <--$BLA-->.TEST(...) \ No newline at end of file diff --git a/demo/demo_global_vars2.out b/demo/demo_global_vars2.out new file mode 100644 index 0000000..bd9f05f --- /dev/null +++ b/demo/demo_global_vars2.out @@ -0,0 +1,10 @@ + + + + + +$ie.text_field(:name, "pAnfrage ohne $gV und mit #{$gv}").set artikel +oder +text = $bla.test(...) + + diff --git a/demo/demo_highlight.out b/demo/demo_highlight.out new file mode 100644 index 0000000..e6236af --- /dev/null +++ b/demo/demo_highlight.out @@ -0,0 +1,141 @@ +
+
puts "Hello, World!"
+
+ + + + + + + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+
require 'coderay'
+
+puts CodeRay.highlight('puts "Hello, World!"', :ruby)
+
+output = CodeRay.highlight_file($0, :line_numbers => :table)
+puts <<HTML
+<html>
+<head>
+#{output.stylesheet true}
+<body>
+#{output}
+</body>
+</html>
+HTML
+
+ + + diff --git a/demo/demo_html.out b/demo/demo_html.out new file mode 100644 index 0000000..b82e456 --- /dev/null +++ b/demo/demo_html.out @@ -0,0 +1,885 @@ + + + + + CodeRay HTML Encoder Example + + + + + + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+
require 'scanner'
+
+module CodeRay
+  
+  class RubyScanner < Scanner
+    
+    RESERVED_WORDS = [
+      'and', 'def', 'end', 'in', 'or', 'unless', 'begin',
+      'defined?', 'ensure', 'module', 'redo', 'super', 'until',
+      'BEGIN', 'break', 'do', 'next', 'rescue', 'then',
+      'when', 'END', 'case', 'else', 'for', 'retry',
+      'while', 'alias', 'class', 'elsif', 'if', 'not', 'return',
+      'undef', 'yield',
+    ]
+
+    DEF_KEYWORDS = ['def']
+    MODULE_KEYWORDS = ['class', 'module']
+    DEF_NEW_STATE = WordList.new(:initial).
+      add(DEF_KEYWORDS, :def_expected).
+      add(MODULE_KEYWORDS, :module_expected)
+
+    WORDS_ALLOWING_REGEXP = [
+      'and', 'or', 'not', 'while', 'until', 'unless', 'if', 'elsif', 'when'
+    ]
+    REGEXP_ALLOWED = WordList.new(false).
+      add(WORDS_ALLOWING_REGEXP, :set)
+    
+    PREDEFINED_CONSTANTS = [
+      'nil', 'true', 'false', 'self',
+      'DATA', 'ARGV', 'ARGF', '__FILE__', '__LINE__',
+    ]
+
+    IDENT_KIND = WordList.new(:ident).
+      add(RESERVED_WORDS, :reserved).
+      add(PREDEFINED_CONSTANTS, :pre_constant)
+
+    METHOD_NAME = / #{IDENT} [?!]? /xo
+    METHOD_NAME_EX = /
+     #{METHOD_NAME}  # common methods: split, foo=, empty?, gsub!
+     | \*\*?         # multiplication and power
+     | [-+~]@?       # plus, minus
+     | [\/%&|^`]     # division, modulo or format strings, &and, |or, ^xor, `system`
+     | \[\]=?        # array getter and setter
+     | <=?>? | >=?   # comparison, rocket operator
+     | << | >>       # append or shift left, shift right
+     | ===?          # simple equality and case equality
+    /ox
+    GLOBAL_VARIABLE = / \$ (?: #{IDENT} | \d+ | [~&+`'=\/,;_.<>!@0$?*":F\\] | -[a-zA-Z_0-9] ) /ox
+
+    DOUBLEQ = / "  [^"\#\\]*  (?: (?: \#\{.*?\} | \#(?:$")?  | \\. ) [^"\#\\]*  )* "?  /ox
+    SINGLEQ = / '  [^'\\]*    (?:                              \\.   [^'\\]*    )* '?  /ox
+    STRING  = / #{SINGLEQ} | #{DOUBLEQ} /ox
+    SHELL   = / `  [^`\#\\]*  (?: (?: \#\{.*?\} | \#(?:$`)?  | \\. ) [^`\#\\]*  )* `?  /ox
+    REGEXP  = / \/ [^\/\#\\]* (?: (?: \#\{.*?\} | \#(?:$\/)? | \\. ) [^\/\#\\]* )* \/? /ox
+    
+    DECIMAL = /\d+(?:_\d+)*/  # doesn't recognize 09 as octal error
+    OCTAL = /0_?[0-7]+(?:_[0-7]+)*/
+    HEXADECIMAL = /0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*/
+    BINARY = /0b[01]+(?:_[01]+)*/
+
+    EXPONENT = / [eE] [+-]? #{DECIMAL} /ox
+    FLOAT = / #{DECIMAL} (?: #{EXPONENT} | \. #{DECIMAL} #{EXPONENT}? ) /
+    INTEGER = /#{OCTAL}|#{HEXADECIMAL}|#{BINARY}|#{DECIMAL}/
+    
+    def reset
+      super
+      @regexp_allowed = false
+    end
+    
+    def next_token
+      return if @scanner.eos?
+
+      kind = :error
+      if @scanner.scan(/\s+/)  # in every state
+        kind = :space
+        @regexp_allowed = :set if @regexp_allowed or @scanner.matched.index(?\n)  # delayed flag setting
+
+      elsif @state == :def_expected
+        if @scanner.scan(/ (?: (?:#{IDENT}(?:\.|::))* | (?:@@?|$)? #{IDENT}(?:\.|::) ) #{METHOD_NAME_EX} /ox)
+          kind = :method
+          @state = :initial
+        else
+          @scanner.scan(/./)
+          kind = :error
+        end
+        @state = :initial
+        
+      elsif @state == :module_expected
+        if @scanner.scan(/<</)
+          kind = :operator
+        else
+          if @scanner.scan(/ (?: #{IDENT} (?:\.|::))* #{IDENT} /ox)
+            kind = :method
+          else
+            @scanner.scan(/./)
+            kind = :error
+          end
+          @state = :initial
+        end
+        
+      elsif # state == :initial
+        # IDENTIFIERS, KEYWORDS
+        if @scanner.scan(GLOBAL_VARIABLE)
+          kind = :global_variable
+        elsif @scanner.scan(/ @@ #{IDENT} /ox)
+          kind = :class_variable
+        elsif @scanner.scan(/ @ #{IDENT} /ox)
+          kind = :instance_variable
+        elsif @scanner.scan(/ __END__\n ( (?!\#CODE\#) .* )? | \#[^\n]* | =begin(?=\s).*? \n=end(?=\s|\z)(?:[^\n]*)? /x)
+          kind = :comment
+        elsif @scanner.scan(METHOD_NAME)
+          if @last_token_dot
+            kind = :ident
+          else
+            matched = @scanner.matched
+            kind = IDENT_KIND[matched]
+            if kind == :ident and matched =~ /^[A-Z]/
+              kind = :constant
+            elsif kind == :reserved
+              @state = DEF_NEW_STATE[matched]
+              @regexp_allowed = REGEXP_ALLOWED[matched]
+            end
+          end
+          
+        elsif @scanner.scan(STRING)
+          kind = :string
+        elsif @scanner.scan(SHELL)
+          kind = :shell
+        ## HEREDOCS
+        elsif @scanner.scan(/\//) and @regexp_allowed
+           @scanner.unscan
+           @scanner.scan(REGEXP)
+          kind = :regexp
+        ## %strings
+        elsif @scanner.scan(/:(?:#{GLOBAL_VARIABLE}|#{METHOD_NAME_EX}|#{STRING})/ox)
+          kind = :global_variable
+        elsif @scanner.scan(/
+          \? (?:
+            [^\s\\]
+          | 
+            \\ (?:M-\\C-|C-\\M-|M-\\c|c\\M-|c|C-|M-))? (?: \\ (?: . | [0-7]{3} | x[0-9A-Fa-f][0-9A-Fa-f] )
+          )
+        /ox)
+          kind = :integer
+          
+        elsif @scanner.scan(/ [-+*\/%=<>;,|&!()\[\]{}~?] | \.\.?\.? | ::? /x)
+          kind = :operator
+          @regexp_allowed = :set if @scanner.matched[-1,1] =~ /[~=!<>|&^,\(\[+\-\/\*%]\z/
+        elsif @scanner.scan(FLOAT)
+          kind = :float
+        elsif @scanner.scan(INTEGER)
+          kind = :integer
+        elsif @scanner.scan(/:(?:#{GLOBAL_VARIABLE}|#{METHOD_NAME_EX}|#{STRING})/ox)
+          kind = :global_variable
+        else
+          @scanner.scan(/./m)
+        end
+      end
+      
+      token = Token.new @scanner.matched, kind
+
+      if kind == :regexp
+        token.text << @scanner.scan(/[eimnosux]*/)
+      end
+      
+      @regexp_allowed = (@regexp_allowed == :set)  # delayed flag setting
+
+      token
+    end
+  end
+  
+  ScannerList.register RubyScanner, 'ruby'
+
+end
+
+module CodeRay
+  require 'scanner'
+
+  class Highlighter
+
+    def initialize lang
+      @scanner = Scanner[lang].new
+    end
+
+    def highlight code
+      @scanner.feed code
+      @scanner.all_tokens.map { |t| t.inspect }.join "\n"
+    end
+
+  end
+
+  class HTMLHighlighter < Highlighter
+    
+    ClassOfKind = {
+      :attribute_name => 'an',
+      :attribute_name_fat => 'af',
+      :attribute_value => 'av',
+      :attribute_value_fat => 'aw',
+      :bin => 'bi',
+       :char => 'ch',
+      :class => 'cl',
+      :class_variable => 'cv',
+      :color => 'cr',
+      :comment => 'c',
+      :constant => 'co',
+      :definition => 'df',
+      :directive => 'di',
+      :doc => 'do',
+      :doc_string => 'ds',
+      :exception => 'ex',
+      :error => 'er',
+      :float => 'fl',
+      :function => 'fu',
+      :global_variable => 'gv',
+      :hex => 'hx',
+      :include => 'ic',
+      :instance_variable => 'iv',
+      :integer => 'i',
+      :interpreted => 'in',
+      :label => 'la',
+      :local_variable => 'lv',
+      :oct => 'oc',
+      :operator_name => 'on',
+      :pre_constant => 'pc',
+      :pre_type => 'pt',
+      :predefined => 'pd',
+      :preprocessor => 'pp',
+      :regexp => 'rx',
+      :reserved => 'r',
+      :shell => 'sh',
+      :string => 's',
+      :symbol => 'sy',
+      :tag => 'ta',
+      :tag_fat => 'tf',
+      :tag_special => 'ts',
+      :type => 'ty',
+      :variable => 'v',
+      :xml_text => 'xt',
+
+      :ident => :NO_HIGHLIGHT,
+      :operator => :NO_HIGHLIGHT,
+      :space => :NO_HIGHLIGHT,
+    }
+    ClassOfKind[:procedure] = ClassOfKind[:method] = ClassOfKind[:function]
+    ClassOfKind.default = ClassOfKind[:error] or raise 'no class found for :error!'
+    
+    def initialize lang, options = {}
+      super lang
+      
+      @HTML_TAB = ' ' * options.fetch(:tabs2space, 8)
+      case level = options.fetch(:level, 'xhtml')
+        when 'html'
+          @HTML_BR = "<BR>\n"
+        when 'xhtml'
+          @HTML_BR = "<br />\n"
+      else
+        raise "Unknown HTML level: #{level}"
+      end
+    end
+
+    def highlight code
+      @scanner.feed code
+      
+      out = ''
+      while t = @scanner.next_token
+        warn t.inspect if t.text.nil?
+        out << to_html(t)
+      end
+      TEMPLATE =~ /<%CONTENT%>/
+      $` + out + $'
+    end
+    
+  private
+    def to_html token
+      css_class = ClassOfKind[token.kind]
+      if defined? ::DEBUG and not ClassOfKind.has_key? token.kind
+        warn "no token class found for :#{token.kind}"
+      end
+        
+      text = text_to_html token.text
+      if css_class == :NO_HIGHLIGHT
+        text
+      else
+        "<span class=\"#{css_class}\">#{text}</span>"
+      end
+    end
+    
+    def text_to_html text
+      return '' if text.empty?
+      text = text.dup  # important
+      if text.index(/["><&]/)
+        text.gsub!('&', '&amp;')
+        text.gsub!('"', '&quot;')
+        text.gsub!('>', '&gt;')
+        text.gsub!('<', '&lt;')
+      end
+      if text.index(/\s/)
+        text.gsub!("\n", @HTML_BR)
+        text.gsub!("\t", @HTML_TAB)
+        text.gsub!(/^ /, '&nbsp;')
+        text.gsub!('  ', ' &nbsp;')
+      end
+      text
+    end
+    
+    TEMPLATE = <<-'TEMPLATE'
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html dir="ltr">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<meta http-equiv="Content-Style-Type" content="text/css">
+
+<title>RubyBB BBCode</title>
+<style type="text/css">
+.code {
+  width: 100%;
+  background-color: #FAFAFA;
+  border: 1px solid #D1D7DC;
+  font-family: 'Courier New', 'Terminal', monospace;
+  font-size: 10pt;
+  color: black;
+  vertical-align: top;
+  text-align: left;
+}
+.code .af { color:#00C; }
+.code .an { color:#007; }
+.code .av { color:#700; }
+.code .aw { color:#C00; }
+.code .bi { color:#509; font-weight:bold; }
+.code .c  { color:#888; }
+.code .ch { color:#C28; font-weight:bold; }
+.code .cl { color:#B06; font-weight:bold; }
+.code .co { color:#036; font-weight:bold; }
+.code .cr { color:#0A0; }
+.code .cv { color:#369; }
+.code .df { color:#099; font-weight:bold; }
+.code .di { color:#088; font-weight:bold; }
+.code .do { color:#970; }
+.code .ds { color:#D42; font-weight:bold; }
+.code .er { color:#F00; background-color:#FAA; }
+.code .ex { color:#F00; font-weight:bold; }
+.code .fl { color:#60E; font-weight:bold; }
+.code .fu { color:#06B; font-weight:bold; }
+.code .gv { color:#800; font-weight:bold; }
+.code .hx { color:#058; font-weight:bold; }
+.code .i  { color:#00D; font-weight:bold; }
+.code .ic { color:#B44; font-weight:bold; }
+.code .in { color:#B2B; font-weight:bold; }
+.code .iv { color:#33B; }
+.code .la { color:#970; font-weight:bold; }
+.code .lv { color:#963; }
+.code .oc { color:#40E; font-weight:bold; }
+.code .on { color:#000; font-weight:bold; }
+.code .pc { color:#038; font-weight:bold; }
+.code .pd { color:#369; font-weight:bold; }
+.code .pp { color:#579; }
+.code .pt { color:#339; font-weight:bold; }
+.code .r  { color:#080; font-weight:bold; }
+.code .rx { color:#927; font-weight:bold; }
+.code .s  { color:#D42; font-weight:bold; }
+.code .sh { color:#B2B; font-weight:bold; }
+.code .sy { color:#A60; }
+.code .ta { color:#070; }
+.code .tf { color:#070; font-weight:bold; }
+.code .ts { color:#D70; font-weight:bold; }
+.code .ty { color:#339; font-weight:bold; }
+.code .v  { color:#036; }
+.code .xt { color:#444; }
+</style>
+</head>
+<body>
+<div class="code">
+<%CONTENT%>
+</div>
+<div class="validators">
+<a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!" height="31" width="88" style="border:none;"></a>
+<img style="border:0" src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!" >
+</div>    
+</body>
+</html>
+    TEMPLATE
+
+  end
+
+end
+
+ + + diff --git a/demo/demo_html2.out b/demo/demo_html2.out new file mode 100644 index 0000000..d748b85 --- /dev/null +++ b/demo/demo_html2.out @@ -0,0 +1,151 @@ + + + + + CodeRay HTML Encoder Example + + + + + + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+
require 'coderay'
+
+# scan this file
+tokens = CodeRay.scan(File.read($0) * 1, :ruby)
+
+# output it with two styles of line numbers
+out = tokens.div(:line_numbers => :table)
+out << '<hr />'
+out << tokens.div(:line_numbers => :inline, :line_number_start => 8)
+
+puts out.page
+
+
+
 8  require 'coderay'
+ 9  
+10  # scan this file
+11  tokens = CodeRay.scan(File.read($0) * 1, :ruby)
+12  
+13  # output it with two styles of line numbers
+14  out = tokens.div(:line_numbers => :table)
+15  out << '<hr />'
+16  out << tokens.div(:line_numbers => :inline, :line_number_start => 8)
+17  
+18  puts out.page
+
+
+ + + diff --git a/demo/demo_load_encoder.out b/demo/demo_load_encoder.out new file mode 100644 index 0000000..d1a1d97 --- /dev/null +++ b/demo/demo_load_encoder.out @@ -0,0 +1,5 @@ +CodeRay::Encoders::YAML is not defined; you must load it first. +Now it is loaded: CodeRay::Encoders::YAML +See? +Require is also possible: CodeRay::Encoders::Tokens +See? diff --git a/demo/demo_more.out b/demo/demo_more.out new file mode 100644 index 0000000..21d6755 --- /dev/null +++ b/demo/demo_more.out @@ -0,0 +1,2 @@ +Input: 4975B, Output: 22363B +Take a look with your browser. diff --git a/demo/demo_more.rb b/demo/demo_more.rb index 5056842..fb718dd 100644 --- a/demo/demo_more.rb +++ b/demo/demo_more.rb @@ -27,7 +27,8 @@ File.open('test.html', 'w') do |f| f.write $output end puts 'Input: %dB, Output: %dB' % [$input.size, $output.size] -puts 'Created "test.html" in %0.3f seconds (%d KB/s). Take a look with your browser.' % [time, $input.size / 1024.0 / time] +#puts 'Created "test.html" in %0.3f seconds (%d KB/s).' % [time, $input.size / 1024.0 / time] +puts 'Take a look with your browser.' __END__ /********************************************************************** diff --git a/demo/demo_scanner.out b/demo/demo_scanner.out new file mode 100644 index 0000000..7ee911c --- /dev/null +++ b/demo/demo_scanner.out @@ -0,0 +1,16 @@ +C Code: if (*p == '{') nest++; + +> print only operators: +(*==)++; +------------------------------ + +Ruby Code: ruby_code(:can, BE, %r[q[ui]te #{ /comple/x },] => $-s, &?\xee) + +> has a string? +false + +> number of regexps? +2 + +> has a string? +"ruby_code" (ident), "(" (operator), ":can" (symbol), "," (operator), " " (space), "BE" (constant), "," (operator), " " (space), "%r[" (delimiter), "q" (content), "[" (nesting_delimiter), "ui" (content), "]" (nesting_delimiter), "te " (content), "#{" (delimiter), " " (space), "/" (delimiter), "comple" (content), "/" (delimiter), "x" (modifier), " " (space), "}" (delimiter), "," (content), "]" (delimiter), " " (space), "=" (operator), ">" (operator), " " (space), "$-s" (global_variable), "," (operator), " " (space), "&" (operator), "?\xee" (integer), ")" (operator) diff --git a/demo/demo_simple.out b/demo/demo_simple.out new file mode 100644 index 0000000..5e349d5 --- /dev/null +++ b/demo/demo_simple.out @@ -0,0 +1 @@ +puts 'Hello, world!' diff --git a/demo/demo_stream2.out b/demo/demo_stream2.out new file mode 100644 index 0000000..95f37b6 --- /dev/null +++ b/demo/demo_stream2.out @@ -0,0 +1,2 @@ +kind: regexp, text size: 5. +kind: space, text size: 1. diff --git a/demo/demo_tokens.out b/demo/demo_tokens.out new file mode 100644 index 0000000..daa34b8 --- /dev/null +++ b/demo/demo_tokens.out @@ -0,0 +1,14 @@ +ident puts +space +integer 3 +space +operator + +space +integer 4 +operator , +space +:open string +delimiter ' +content 3 + 4 +delimiter ' +:close string diff --git a/demo/suite.rb b/demo/suite.rb new file mode 100644 index 0000000..0ccf069 --- /dev/null +++ b/demo/suite.rb @@ -0,0 +1,82 @@ +mydir = File.dirname(__FILE__) +$:.unshift mydir + '/../lib/' + +$VERBOSE = true + +require 'test/unit' +include Test::Unit + +class CodeRaySuite < TestCase + + def self.dir &block + @dir ||= File.dirname(__FILE__) + if block + Dir.chdir @dir, &block + end + @dir + end + + def dir &block + self.class.dir(&block) + end + + def test_ALL + dir do + for input in Dir["demo_*.rb"] - ['demo_server.rb', 'demo_stream.rb'] + puts "[ testing #{input}... ]" + name = File.basename(input, ".rb") + output = name + '.out' + code = File.open(input, 'rb') { |f| break f.read } + + result = `ruby -wI../lib #{input}` + + if File.exist? output + expected = File.read output + ok = expected == result + computed = output.sub('.out', '.computed') + unless ok + File.open(computed, 'w') { |f| f.write result } + print `gvimdiff #{output} #{computed}` if $DEBUG + end + assert(ok, "Output error: #{computed} != #{output}") unless $DEBUG + else + File.open(output, 'w') do |f| f.write result end + puts "New test: #{output}" + end + + end + end + end + +end + +require 'test/unit/testsuite' +$suite = TestSuite.new 'CodeRay Demos Test' +$suite << CodeRaySuite.suite + +def load_suite name + begin + require name + '/suite.rb' + rescue LoadError + $stderr.puts <<-ERR + +!! Folder #{File.split(__FILE__).first + '/' + name} not found + + ERR + false + end +end + +if subsuite = ARGV.find { |a| break $1 if a[/^([^-].*)/] } + load_suite(subsuite) or exit +else + Dir[mydir + '/*/'].each { |suite| load_suite suite } +end + +if ARGV.include? '-f' + require 'test/unit/ui/fox/testrunner' + UI::Fox::TestRunner.run $suite +else + require 'test/unit/ui/console/testrunner' + UI::Console::TestRunner.run $suite +end -- cgit v1.2.1