coderay 1.0.9 → 1.1.0.rc1
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.
- checksums.yaml +7 -0
- data/Rakefile +2 -0
- data/bin/coderay +4 -4
- data/lib/coderay.rb +2 -3
- data/lib/coderay/encoders/debug.rb +5 -17
- data/lib/coderay/encoders/debug_lint.rb +62 -0
- data/lib/coderay/encoders/html.rb +84 -84
- data/lib/coderay/encoders/html/css.rb +7 -7
- data/lib/coderay/encoders/html/numbering.rb +24 -19
- data/lib/coderay/encoders/html/output.rb +1 -1
- data/lib/coderay/encoders/lint.rb +57 -0
- data/lib/coderay/encoders/statistic.rb +0 -1
- data/lib/coderay/encoders/terminal.rb +121 -105
- data/lib/coderay/helpers/file_type.rb +54 -47
- data/lib/coderay/helpers/plugin.rb +4 -13
- data/lib/coderay/scanner.rb +58 -26
- data/lib/coderay/scanners/c.rb +1 -1
- data/lib/coderay/scanners/cpp.rb +1 -1
- data/lib/coderay/scanners/css.rb +22 -25
- data/lib/coderay/scanners/diff.rb +53 -31
- data/lib/coderay/scanners/groovy.rb +17 -4
- data/lib/coderay/scanners/html.rb +38 -16
- data/lib/coderay/scanners/java.rb +1 -1
- data/lib/coderay/scanners/java_script.rb +30 -6
- data/lib/coderay/scanners/json.rb +15 -12
- data/lib/coderay/scanners/lua.rb +280 -0
- data/lib/coderay/scanners/php.rb +22 -4
- data/lib/coderay/scanners/python.rb +3 -3
- data/lib/coderay/scanners/raydebug.rb +8 -8
- data/lib/coderay/scanners/ruby.rb +2 -2
- data/lib/coderay/scanners/sass.rb +232 -0
- data/lib/coderay/scanners/sql.rb +7 -4
- data/lib/coderay/scanners/taskpaper.rb +36 -0
- data/lib/coderay/scanners/yaml.rb +2 -2
- data/lib/coderay/styles/alpha.rb +31 -21
- data/lib/coderay/token_kinds.rb +68 -71
- data/lib/coderay/tokens.rb +23 -77
- data/lib/coderay/version.rb +1 -1
- data/test/functional/examples.rb +3 -3
- data/test/functional/for_redcloth.rb +4 -10
- metadata +13 -14
- data/lib/coderay/helpers/gzip.rb +0 -41
@@ -47,7 +47,7 @@ module Scanners
|
|
47
47
|
when !check(/(?:"[^"]*")(?=: |:$)/) && match = scan(/"/)
|
48
48
|
encoder.begin_group :string
|
49
49
|
encoder.text_token match, :delimiter
|
50
|
-
encoder.text_token match, :content if match = scan(/ [^"\\]* (?: \\. [^"\\]* )* /mx)
|
50
|
+
encoder.text_token match, :content if (match = scan(/ [^"\\]* (?: \\. [^"\\]* )* /mx)) && !match.empty?
|
51
51
|
encoder.text_token match, :delimiter if match = scan(/"/)
|
52
52
|
encoder.end_group :string
|
53
53
|
next
|
@@ -84,7 +84,7 @@ module Scanners
|
|
84
84
|
when match = scan(/(?:"[^"\n]*"|'[^'\n]*')(?= *:(?: |$))/)
|
85
85
|
encoder.begin_group :key
|
86
86
|
encoder.text_token match[0,1], :delimiter
|
87
|
-
encoder.text_token match[1..-2], :content
|
87
|
+
encoder.text_token match[1..-2], :content if match.size > 2
|
88
88
|
encoder.text_token match[-1,1], :delimiter
|
89
89
|
encoder.end_group :key
|
90
90
|
key_indent = column(pos - match.size) - 1
|
data/lib/coderay/styles/alpha.rb
CHANGED
@@ -3,14 +3,14 @@ module Styles
|
|
3
3
|
|
4
4
|
# A colorful theme using CSS 3 colors (with alpha channel).
|
5
5
|
class Alpha < Style
|
6
|
-
|
6
|
+
|
7
7
|
register_for :alpha
|
8
|
-
|
8
|
+
|
9
9
|
code_background = 'hsl(0,0%,95%)'
|
10
10
|
numbers_background = 'hsl(180,65%,90%)'
|
11
11
|
border_color = 'silver'
|
12
12
|
normal_color = 'black'
|
13
|
-
|
13
|
+
|
14
14
|
CSS_MAIN_STYLES = <<-MAIN # :nodoc:
|
15
15
|
.CodeRay {
|
16
16
|
background-color: #{code_background};
|
@@ -39,6 +39,9 @@ table.CodeRay td { padding: 2px 4px; vertical-align: top; }
|
|
39
39
|
color: gray !important;
|
40
40
|
text-decoration: none !important;
|
41
41
|
}
|
42
|
+
.CodeRay .line-numbers pre {
|
43
|
+
word-break: normal;
|
44
|
+
}
|
42
45
|
.CodeRay .line-numbers a:target { color: blue !important; }
|
43
46
|
.CodeRay .line-numbers .highlighted { color: red !important; }
|
44
47
|
.CodeRay .line-numbers .highlighted a { color: red !important; }
|
@@ -53,45 +56,52 @@ table.CodeRay td { padding: 2px 4px; vertical-align: top; }
|
|
53
56
|
.annotation { color:#007 }
|
54
57
|
.attribute-name { color:#b48 }
|
55
58
|
.attribute-value { color:#700 }
|
56
|
-
.binary { color:#
|
59
|
+
.binary { color:#549 }
|
60
|
+
.binary .char { color:#325 }
|
61
|
+
.binary .delimiter { color:#325 }
|
62
|
+
.char { color:#D20 }
|
57
63
|
.char .content { color:#D20 }
|
58
64
|
.char .delimiter { color:#710 }
|
59
|
-
.char { color:#D20 }
|
60
65
|
.class { color:#B06; font-weight:bold }
|
61
66
|
.class-variable { color:#369 }
|
62
67
|
.color { color:#0A0 }
|
63
68
|
.comment { color:#777 }
|
64
69
|
.comment .char { color:#444 }
|
65
70
|
.comment .delimiter { color:#444 }
|
66
|
-
.complex { color:#A08 }
|
67
71
|
.constant { color:#036; font-weight:bold }
|
68
72
|
.decorator { color:#B0B }
|
69
73
|
.definition { color:#099; font-weight:bold }
|
70
74
|
.delimiter { color:black }
|
71
75
|
.directive { color:#088; font-weight:bold }
|
72
|
-
.
|
73
|
-
.doc-string { color:#D42; font-weight:bold }
|
76
|
+
.docstring { color:#D42; }
|
74
77
|
.doctype { color:#34b }
|
78
|
+
.done { text-decoration: line-through; color: gray }
|
75
79
|
.entity { color:#800; font-weight:bold }
|
76
80
|
.error { color:#F00; background-color:#FAA }
|
77
81
|
.escape { color:#666 }
|
78
82
|
.exception { color:#C00; font-weight:bold }
|
79
83
|
.float { color:#60E }
|
80
84
|
.function { color:#06B; font-weight:bold }
|
85
|
+
.function .delimiter { color:#024; font-weight:bold }
|
81
86
|
.global-variable { color:#d70 }
|
82
87
|
.hex { color:#02b }
|
83
|
-
.
|
88
|
+
.id { color:#33D; font-weight:bold }
|
84
89
|
.include { color:#B44; font-weight:bold }
|
85
90
|
.inline { background-color: hsla(0,0%,0%,0.07); color: black }
|
86
91
|
.inline-delimiter { font-weight: bold; color: #666 }
|
87
92
|
.instance-variable { color:#33B }
|
88
93
|
.integer { color:#00D }
|
94
|
+
.imaginary { color:#f00 }
|
95
|
+
.important { color:#D00 }
|
96
|
+
.key { color: #606 }
|
89
97
|
.key .char { color: #60f }
|
90
98
|
.key .delimiter { color: #404 }
|
91
|
-
.key { color: #606 }
|
92
99
|
.keyword { color:#080; font-weight:bold }
|
93
100
|
.label { color:#970; font-weight:bold }
|
94
|
-
.local-variable { color:#
|
101
|
+
.local-variable { color:#950 }
|
102
|
+
.map .content { color:#808 }
|
103
|
+
.map .delimiter { color:#40A}
|
104
|
+
.map { background-color:hsla(200,100%,50%,0.06); }
|
95
105
|
.namespace { color:#707; font-weight:bold }
|
96
106
|
.octal { color:#40E }
|
97
107
|
.operator { }
|
@@ -100,30 +110,30 @@ table.CodeRay td { padding: 2px 4px; vertical-align: top; }
|
|
100
110
|
.predefined-type { color:#0a5; font-weight:bold }
|
101
111
|
.preprocessor { color:#579 }
|
102
112
|
.pseudo-class { color:#00C; font-weight:bold }
|
113
|
+
.regexp { background-color:hsla(300,100%,50%,0.06); }
|
103
114
|
.regexp .content { color:#808 }
|
104
115
|
.regexp .delimiter { color:#404 }
|
105
116
|
.regexp .modifier { color:#C2C }
|
106
|
-
.regexp { background-color:hsla(300,100%,50%,0.06); }
|
107
117
|
.reserved { color:#080; font-weight:bold }
|
118
|
+
.shell { background-color:hsla(120,100%,50%,0.06); }
|
108
119
|
.shell .content { color:#2B2 }
|
109
120
|
.shell .delimiter { color:#161 }
|
110
|
-
.
|
121
|
+
.string { background-color:hsla(0,100%,50%,0.05); }
|
111
122
|
.string .char { color: #b0b }
|
112
123
|
.string .content { color: #D20 }
|
113
124
|
.string .delimiter { color: #710 }
|
114
125
|
.string .modifier { color: #E40 }
|
115
|
-
.
|
126
|
+
.symbol { color:#A60 }
|
116
127
|
.symbol .content { color:#A60 }
|
117
128
|
.symbol .delimiter { color:#630 }
|
118
|
-
.
|
119
|
-
.tag { color:#070 }
|
129
|
+
.tag { color:#070; font-weight:bold }
|
120
130
|
.type { color:#339; font-weight:bold }
|
121
|
-
.value { color: #088
|
122
|
-
.variable
|
131
|
+
.value { color: #088 }
|
132
|
+
.variable { color:#037 }
|
123
133
|
|
124
134
|
.insert { background: hsla(120,100%,50%,0.12) }
|
125
135
|
.delete { background: hsla(0,100%,50%,0.12) }
|
126
|
-
.change { color: #bbf; background: #007
|
136
|
+
.change { color: #bbf; background: #007 }
|
127
137
|
.head { color: #f8f; background: #505 }
|
128
138
|
.head .filename { color: white; }
|
129
139
|
|
@@ -135,8 +145,8 @@ table.CodeRay td { padding: 2px 4px; vertical-align: top; }
|
|
135
145
|
.change .change { color: #88f }
|
136
146
|
.head .head { color: #f4f }
|
137
147
|
TOKENS
|
138
|
-
|
148
|
+
|
139
149
|
end
|
140
|
-
|
150
|
+
|
141
151
|
end
|
142
152
|
end
|
data/lib/coderay/token_kinds.rb
CHANGED
@@ -10,81 +10,78 @@ module CodeRay
|
|
10
10
|
TokenKinds.compare_by_identity if TokenKinds.respond_to? :compare_by_identity
|
11
11
|
|
12
12
|
TokenKinds.update( # :nodoc:
|
13
|
-
:
|
14
|
-
:attribute_name => 'attribute-name',
|
15
|
-
:attribute_value => 'attribute-value',
|
16
|
-
:binary => 'bin',
|
17
|
-
:char => 'char',
|
18
|
-
:class => 'class',
|
19
|
-
:class_variable => 'class-variable',
|
20
|
-
:color => 'color',
|
21
|
-
:comment => 'comment',
|
22
|
-
:complex => 'complex',
|
23
|
-
:constant => 'constant',
|
24
|
-
:content => 'content',
|
25
|
-
:debug => 'debug',
|
26
|
-
:decorator => 'decorator',
|
27
|
-
:definition => 'definition',
|
28
|
-
:delimiter => 'delimiter',
|
29
|
-
:directive => 'directive',
|
30
|
-
:doc => 'doc',
|
31
|
-
:doctype => 'doctype',
|
32
|
-
:doc_string => 'doc-string',
|
33
|
-
:entity => 'entity',
|
34
|
-
:error => 'error',
|
35
|
-
:escape => 'escape',
|
36
|
-
:exception => 'exception',
|
37
|
-
:filename => 'filename',
|
38
|
-
:float => 'float',
|
39
|
-
:function => 'function',
|
40
|
-
:global_variable => 'global-variable',
|
41
|
-
:hex => 'hex',
|
42
|
-
:imaginary => 'imaginary',
|
43
|
-
:important => 'important',
|
44
|
-
:include => 'include',
|
45
|
-
:inline => 'inline',
|
46
|
-
:inline_delimiter => 'inline-delimiter',
|
47
|
-
:instance_variable => 'instance-variable',
|
48
|
-
:integer => 'integer',
|
49
|
-
:key => 'key',
|
50
|
-
:keyword => 'keyword',
|
51
|
-
:label => 'label',
|
52
|
-
:local_variable => 'local-variable',
|
53
|
-
:modifier => 'modifier',
|
54
|
-
:namespace => 'namespace',
|
55
|
-
:octal => 'octal',
|
56
|
-
:predefined => 'predefined',
|
57
|
-
:predefined_constant => 'predefined-constant',
|
58
|
-
:predefined_type => 'predefined-type',
|
59
|
-
:preprocessor => 'preprocessor',
|
60
|
-
:pseudo_class => 'pseudo-class',
|
61
|
-
:regexp => 'regexp',
|
62
|
-
:reserved => 'reserved',
|
63
|
-
:shell => 'shell',
|
64
|
-
:string => 'string',
|
65
|
-
:symbol => 'symbol',
|
66
|
-
:tag => 'tag',
|
67
|
-
:type => 'type',
|
68
|
-
:value => 'value',
|
69
|
-
:variable => 'variable',
|
13
|
+
:debug => 'debug', # highlight for debugging (white on blue background)
|
70
14
|
|
71
|
-
:
|
72
|
-
:
|
73
|
-
:
|
74
|
-
:
|
15
|
+
:annotation => 'annotation', # Groovy, Java
|
16
|
+
:attribute_name => 'attribute-name', # HTML, CSS
|
17
|
+
:attribute_value => 'attribute-value', # HTML
|
18
|
+
:binary => 'binary', # Python, Ruby
|
19
|
+
:char => 'char', # most scanners, also inside of strings
|
20
|
+
:class => 'class', # lots of scanners, for different purposes also in CSS
|
21
|
+
:class_variable => 'class-variable', # Ruby, YAML
|
22
|
+
:color => 'color', # CSS
|
23
|
+
:comment => 'comment', # most scanners
|
24
|
+
:constant => 'constant', # PHP, Ruby
|
25
|
+
:content => 'content', # inside of strings, most scanners
|
26
|
+
:decorator => 'decorator', # Python
|
27
|
+
:definition => 'definition', # CSS
|
28
|
+
:delimiter => 'delimiter', # inside strings, comments and other types
|
29
|
+
:directive => 'directive', # lots of scanners
|
30
|
+
:doctype => 'doctype', # Goorvy, HTML, Ruby, YAML
|
31
|
+
:docstring => 'docstring', # Python
|
32
|
+
:done => 'done', # Taskpaper
|
33
|
+
:entity => 'entity', # HTML
|
34
|
+
:error => 'error', # invalid token, most scanners
|
35
|
+
:escape => 'escape', # Ruby (string inline variables like #$foo, #@bar)
|
36
|
+
:exception => 'exception', # Java, PHP, Python
|
37
|
+
:filename => 'filename', # Diff
|
38
|
+
:float => 'float', # most scanners
|
39
|
+
:function => 'function', # CSS, JavaScript, PHP
|
40
|
+
:global_variable => 'global-variable', # Ruby, YAML
|
41
|
+
:hex => 'hex', # hexadecimal number; lots of scanners
|
42
|
+
:id => 'id', # CSS
|
43
|
+
:imaginary => 'imaginary', # Python
|
44
|
+
:important => 'important', # CSS, Taskpaper
|
45
|
+
:include => 'include', # C, Groovy, Java, Python, Sass
|
46
|
+
:inline => 'inline', # nested code, eg. inline string evaluation; lots of scanners
|
47
|
+
:inline_delimiter => 'inline-delimiter', # used instead of :inline > :delimiter FIXME: Why use inline_delimiter?
|
48
|
+
:instance_variable => 'instance-variable', # Ruby
|
49
|
+
:integer => 'integer', # most scanners
|
50
|
+
:key => 'key', # lots of scanners, used together with :value
|
51
|
+
:keyword => 'keyword', # reserved word that's actually implemented; most scanners
|
52
|
+
:label => 'label', # C, PHP
|
53
|
+
:local_variable => 'local-variable', # local and magic variables; some scanners
|
54
|
+
:map => 'map', # Lua tables
|
55
|
+
:modifier => 'modifier', # used inside on strings; lots of scanners
|
56
|
+
:namespace => 'namespace', # Clojure, Java, Taskpaper
|
57
|
+
:octal => 'octal', # lots of scanners
|
58
|
+
:predefined => 'predefined', # predefined function: lots of scanners
|
59
|
+
:predefined_constant => 'predefined-constant',# lots of scanners
|
60
|
+
:predefined_type => 'predefined-type', # C, Java, PHP
|
61
|
+
:preprocessor => 'preprocessor', # C, Delphi, HTML
|
62
|
+
:pseudo_class => 'pseudo-class', # CSS
|
63
|
+
:regexp => 'regexp', # Groovy, JavaScript, Ruby
|
64
|
+
:reserved => 'reserved', # most scanners
|
65
|
+
:shell => 'shell', # Ruby
|
66
|
+
:string => 'string', # most scanners
|
67
|
+
:symbol => 'symbol', # Clojure, Ruby, YAML
|
68
|
+
:tag => 'tag', # CSS, HTML
|
69
|
+
:type => 'type', # CSS, Java, SQL, YAML
|
70
|
+
:value => 'value', # used together with :key; CSS, JSON, YAML
|
71
|
+
:variable => 'variable', # Sass, SQL, YAML
|
75
72
|
|
76
|
-
:
|
73
|
+
:change => 'change', # Diff
|
74
|
+
:delete => 'delete', # Diff
|
75
|
+
:head => 'head', # Diff, YAML
|
76
|
+
:insert => 'insert', # Diff
|
77
|
+
:eyecatcher => 'eyecatcher', # Diff
|
77
78
|
|
78
|
-
:ident => false,
|
79
|
-
:operator => false,
|
79
|
+
:ident => false, # almost all scanners
|
80
|
+
:operator => false, # almost all scanners
|
80
81
|
|
81
|
-
:space => false,
|
82
|
-
:plain => false
|
82
|
+
:space => false, # almost all scanners
|
83
|
+
:plain => false # almost all scanners
|
83
84
|
)
|
84
85
|
|
85
|
-
TokenKinds[:method]
|
86
|
-
TokenKinds[:escape] = TokenKinds[:delimiter]
|
87
|
-
TokenKinds[:docstring] = TokenKinds[:comment]
|
88
|
-
|
89
|
-
TokenKinds.freeze
|
86
|
+
TokenKinds[:method] = TokenKinds[:function]
|
90
87
|
end
|
data/lib/coderay/tokens.rb
CHANGED
@@ -1,55 +1,43 @@
|
|
1
1
|
module CodeRay
|
2
2
|
|
3
|
-
#
|
4
|
-
|
5
|
-
|
6
|
-
# = Tokens TODO: Rewrite!
|
7
|
-
#
|
8
|
-
# The Tokens class represents a list of tokens returnd from
|
9
|
-
# a Scanner.
|
3
|
+
# The Tokens class represents a list of tokens returned from
|
4
|
+
# a Scanner. It's actually just an Array with a few helper methods.
|
10
5
|
#
|
11
|
-
# A token is not a special object, just
|
12
|
-
# consisting of
|
6
|
+
# A token itself is not a special object, just two elements in an Array:
|
13
7
|
# * the _token_ _text_ (the original source of the token in a String) or
|
14
8
|
# a _token_ _action_ (begin_group, end_group, begin_line, end_line)
|
15
9
|
# * the _token_ _kind_ (a Symbol representing the type of the token)
|
16
10
|
#
|
17
|
-
#
|
11
|
+
# It looks like this:
|
18
12
|
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
13
|
+
# ..., '# It looks like this', :comment, ...
|
14
|
+
# ..., '3.1415926', :float, ...
|
15
|
+
# ..., '$^', :error, ...
|
22
16
|
#
|
23
17
|
# Some scanners also yield sub-tokens, represented by special
|
24
|
-
# token actions,
|
18
|
+
# token actions, for example :begin_group and :end_group.
|
25
19
|
#
|
26
20
|
# The Ruby scanner, for example, splits "a string" into:
|
27
21
|
#
|
28
22
|
# [
|
29
|
-
#
|
30
|
-
#
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
23
|
+
# :begin_group, :string,
|
24
|
+
# '"', :delimiter,
|
25
|
+
# 'a string', :content,
|
26
|
+
# '"', :delimiter,
|
27
|
+
# :end_group, :string
|
34
28
|
# ]
|
35
29
|
#
|
36
|
-
# Tokens
|
37
|
-
#
|
38
|
-
# then builds the output from this object.
|
39
|
-
#
|
40
|
-
# Thus, the syntax below becomes clear:
|
30
|
+
# Tokens can be used to save the output of a Scanners in a simple
|
31
|
+
# Ruby object that can be send to an Encoder later:
|
41
32
|
#
|
42
|
-
# CodeRay.scan('price = 2.59', :ruby).
|
43
|
-
#
|
44
|
-
#
|
45
|
-
#
|
33
|
+
# tokens = CodeRay.scan('price = 2.59', :ruby).tokens
|
34
|
+
# tokens.encode(:html)
|
35
|
+
# tokens.html
|
36
|
+
# CodeRay.encoder(:html).encode_tokens(tokens)
|
46
37
|
#
|
47
38
|
# Tokens gives you the power to handle pre-scanned code very easily:
|
48
|
-
# You can
|
49
|
-
#
|
50
|
-
#
|
51
|
-
# It also allows you to generate tokens directly (without using a scanner),
|
52
|
-
# to load them from a file, and still use any Encoder that CodeRay provides.
|
39
|
+
# You can serialize it to a JSON string and store it in a database, pass it
|
40
|
+
# around to encode it more than once, send it to other algorithms...
|
53
41
|
class Tokens < Array
|
54
42
|
|
55
43
|
# The Scanner instance that created the tokens.
|
@@ -58,8 +46,7 @@ module CodeRay
|
|
58
46
|
# Encode the tokens using encoder.
|
59
47
|
#
|
60
48
|
# encoder can be
|
61
|
-
# * a
|
62
|
-
# * an Encoder class
|
49
|
+
# * a plugin name like :html oder 'statistic'
|
63
50
|
# * an Encoder object
|
64
51
|
#
|
65
52
|
# options are passed to the encoder.
|
@@ -93,6 +80,7 @@ module CodeRay
|
|
93
80
|
# This method is used by @Scanner#tokenize@ when called with an Array
|
94
81
|
# of source strings. The Diff encoder uses it for inline highlighting.
|
95
82
|
def split_into_parts *sizes
|
83
|
+
return Array.new(sizes.size) { Tokens.new } if size == 2 && first == ''
|
96
84
|
parts = []
|
97
85
|
opened = []
|
98
86
|
content = nil
|
@@ -156,53 +144,11 @@ module CodeRay
|
|
156
144
|
parts
|
157
145
|
end
|
158
146
|
|
159
|
-
# Dumps the object into a String that can be saved
|
160
|
-
# in files or databases.
|
161
|
-
#
|
162
|
-
# The dump is created with Marshal.dump;
|
163
|
-
# In addition, it is gzipped using GZip.gzip.
|
164
|
-
#
|
165
|
-
# The returned String object includes Undumping
|
166
|
-
# so it has an #undump method. See Tokens.load.
|
167
|
-
#
|
168
|
-
# You can configure the level of compression,
|
169
|
-
# but the default value 7 should be what you want
|
170
|
-
# in most cases as it is a good compromise between
|
171
|
-
# speed and compression rate.
|
172
|
-
#
|
173
|
-
# See GZip module.
|
174
|
-
def dump gzip_level = 7
|
175
|
-
dump = Marshal.dump self
|
176
|
-
dump = GZip.gzip dump, gzip_level
|
177
|
-
dump.extend Undumping
|
178
|
-
end
|
179
|
-
|
180
147
|
# Return the actual number of tokens.
|
181
148
|
def count
|
182
149
|
size / 2
|
183
150
|
end
|
184
151
|
|
185
|
-
# Include this module to give an object an #undump
|
186
|
-
# method.
|
187
|
-
#
|
188
|
-
# The string returned by Tokens.dump includes Undumping.
|
189
|
-
module Undumping
|
190
|
-
# Calls Tokens.load with itself.
|
191
|
-
def undump
|
192
|
-
Tokens.load self
|
193
|
-
end
|
194
|
-
end
|
195
|
-
|
196
|
-
# Undump the object using Marshal.load, then
|
197
|
-
# unzip it using GZip.gunzip.
|
198
|
-
#
|
199
|
-
# The result is commonly a Tokens object, but
|
200
|
-
# this is not guaranteed.
|
201
|
-
def Tokens.load dump
|
202
|
-
dump = GZip.gunzip dump
|
203
|
-
@dump = Marshal.load dump
|
204
|
-
end
|
205
|
-
|
206
152
|
alias text_token push
|
207
153
|
def begin_group kind; push :begin_group, kind end
|
208
154
|
def end_group kind; push :end_group, kind end
|