textpow1x 1.0.0 → 1.1.0
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/.travis.yml +7 -0
- data/Gemfile.lock +1 -1
- data/MIT-LICENSE.txt +18 -0
- data/README.rdoc +42 -169
- data/Rakefile +22 -0
- data/examples/benchmark_js.rb +11 -0
- data/examples/jquery.js +9046 -0
- data/lib/textpow/recording_processor.rb +13 -0
- data/lib/textpow/syntax/broken/markdown.syntax +218 -242
- data/lib/textpow/syntax.rb +89 -94
- data/lib/textpow/version.rb +1 -1
- data/lib/textpow.rb +1 -0
- data/spec/fixtures/objeck.plist +107 -0
- data/spec/textpow/score_manager_spec.rb +20 -0
- data/spec/textpow/syntax_files_spec.rb +26 -0
- data/spec/textpow/syntax_spec.rb +99 -0
- data/spec/textpow_spec.rb +3 -30
- metadata +13 -4
data/.travis.yml
ADDED
data/Gemfile.lock
CHANGED
data/MIT-LICENSE.txt
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
2
|
+
a copy of this software and associated documentation files (the
|
3
|
+
'Software'), to deal in the Software without restriction, including
|
4
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
5
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
6
|
+
permit persons to whom the Software is furnished to do so, subject to
|
7
|
+
the following conditions:
|
8
|
+
|
9
|
+
The above copyright notice and this permission notice shall be
|
10
|
+
included in all copies or substantial portions of the Software.
|
11
|
+
|
12
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
13
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
14
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
15
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
16
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
17
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
18
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
Read {TextMate}[http://macromates.com/] syntax files and parse text with them.
|
2
2
|
|
3
3
|
For Ruby 1.8 and 1.9.
|
4
4
|
|
@@ -31,180 +31,53 @@ Install oniguruma
|
|
31
31
|
|
32
32
|
3. Parse some text:
|
33
33
|
|
34
|
-
syntax.parse(
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
the
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
But Textpow is not able to parse text pfiles. However, in practice this is not a problem,
|
65
|
-
since it is possible to convert both text and binary pfiles to an XML format. Indeed, all
|
66
|
-
the syntaxes in the Textmate syntax {repository}[http://macromates.com/svn/Bundles/trunk/Bundles/]
|
67
|
-
are in XML format:
|
68
|
-
|
69
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
70
|
-
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
71
|
-
<plist version="1.0">
|
72
|
-
<dict>
|
73
|
-
<key>scopeName</key>
|
74
|
-
<string>source.untitled</string>
|
75
|
-
<key>fileTypes</key>
|
76
|
-
<array>
|
77
|
-
<string>txt</string>
|
78
|
-
</array>
|
79
|
-
<key>foldingStartMarker</key>
|
80
|
-
<string>\{\s*$</string>
|
81
|
-
<key>foldingStopMarker</key>
|
82
|
-
<string>^\s*\}</string>
|
83
|
-
<key>patterns</key>
|
84
|
-
<array>
|
85
|
-
<dict>
|
86
|
-
<key>name</key>
|
87
|
-
<string>keyword.control.untitled</string>
|
88
|
-
<key>match</key>
|
89
|
-
<string>\b(if|while|for|return)\b</string>
|
90
|
-
</dict>
|
91
|
-
<dict>
|
92
|
-
<key>name</key>
|
93
|
-
<string>string.quoted.double.untitled</string>
|
94
|
-
<key>begin</key>
|
95
|
-
<string>"</string>
|
96
|
-
<key>end</key>
|
97
|
-
<string>"</string>
|
98
|
-
<key>patterns</key>
|
99
|
-
<array>
|
100
|
-
<dict>
|
101
|
-
<key>name</key>
|
102
|
-
<string>constant.character.escape.untitled</string>
|
103
|
-
<key>match</key>
|
104
|
-
<string>\\.</string>
|
105
|
-
</dict>
|
106
|
-
</array>
|
107
|
-
</dict>
|
108
|
-
</array>
|
109
|
-
</dict>
|
110
|
-
|
111
|
-
Of course, most people find XML both ugly and cumbersome. Fortunately, it is
|
112
|
-
also possible to store syntax files in YAML format, which is much easier to
|
113
|
-
read:
|
114
|
-
|
115
|
-
---
|
116
|
-
fileTypes:
|
117
|
-
- txt
|
118
|
-
scopeName: source.untitled
|
119
|
-
foldingStartMarker: \{\s*$
|
120
|
-
foldingStopMarker: ^\s*\}
|
121
|
-
patterns:
|
122
|
-
- name: keyword.control.untitled
|
123
|
-
match: \b(if|while|for|return)\b
|
124
|
-
- name: string.quoted.double.untitled
|
125
|
-
begin: '"'
|
126
|
-
end: '"'
|
127
|
-
patterns:
|
128
|
-
- name: constant.character.escape.untitled
|
129
|
-
match: \\.
|
130
|
-
|
131
|
-
==== Processors
|
132
|
-
|
133
|
-
Until now we have talked about the parsing process without explaining what
|
134
|
-
it is exactly. Basically, parsing consists in reading text from a string or
|
135
|
-
file and applying tags to parts of the text according to what has been
|
136
|
-
specified in the syntax file.
|
137
|
-
|
138
|
-
In textpow, the process takes place line by line, from the beginning to the
|
139
|
-
end and from left to right for every line. As the text is parsed, events are
|
140
|
-
sent to a processor object when a tag is open or closed and so on.
|
141
|
-
A processor is any object which implements one or more of the following
|
142
|
-
methods:
|
143
|
-
|
144
|
-
class Processor
|
145
|
-
def open_tag name, position
|
146
|
-
end
|
147
|
-
|
148
|
-
def close_tag name, position
|
149
|
-
end
|
150
|
-
|
151
|
-
def new_line line
|
152
|
-
end
|
153
|
-
|
154
|
-
def start_parsing name
|
155
|
-
end
|
156
|
-
|
157
|
-
def end_parsing name
|
158
|
-
end
|
34
|
+
syntax.parse(text, processor)
|
35
|
+
|
36
|
+
=== Syntax-files
|
37
|
+
|
38
|
+
Syntax files are written with {Textmate grammer}[http://macromates.com/textmate/manual/language_grammars#language_grammars].
|
39
|
+
They are written in text/binary/xml/yaml format (all can be translated into each other).
|
40
|
+
Textpow can understand the yaml form (ending in .syntax) and the xml form (ending in .tmSyntax or .plist) via plist library, but not the text or binary form.
|
41
|
+
All syntax files shipped with textpow are in the yaml form, since its easiest to read and less verbose.
|
42
|
+
|
43
|
+
Adding a new syntax:
|
44
|
+
* use <tt>rake convert[filename]</tt> to convert it into yaml format
|
45
|
+
* drop it into the lib/textpow/syntax folder
|
46
|
+
* run tests <tt>rake</tt> to see if the syntax is parseable
|
47
|
+
|
48
|
+
=== Processors
|
49
|
+
A processors is a hook that is called while parsing a text.
|
50
|
+
It must implement these methods:
|
51
|
+
|
52
|
+
class MyProcessor
|
53
|
+
def open_tag(tag_name, position_in_current_line); end
|
54
|
+
def close_tag(tag_name, position_in_current_line); end
|
55
|
+
|
56
|
+
# called before processing a line
|
57
|
+
def new_line(line_content); end
|
58
|
+
|
59
|
+
# called before parsing anything
|
60
|
+
def start_parsing(scope_name); end
|
61
|
+
|
62
|
+
# called before parsing everything
|
63
|
+
def end_parsing(scope_name); end
|
159
64
|
end
|
160
65
|
|
161
|
-
|
162
|
-
|
163
|
-
* <tt>close_tag</tt>. The same that <tt>open_tag</tt>, but it is called when a tag is closed.
|
164
|
-
* <tt>new_line</tt>. Is called every time that a new line is processed, it receives the
|
165
|
-
line's contents.
|
166
|
-
* <tt>start_parsing</tt>. Is called once at the beginning of the parsing process. It
|
167
|
-
receives the scope name for the syntax being used.
|
168
|
-
* <tt>end_parsing</tt>. Is called once after all the input text has been parsed. It
|
169
|
-
receives the scope name for the syntax being used.
|
170
|
-
|
171
|
-
Textpow ensures that the methods are called in parsing order, thus,
|
172
|
-
for example, if there are two subsequent calls to <tt>open_tag</tt>, the first
|
66
|
+
Textpow ensures that the methods are called in parsing order.
|
67
|
+
If there are two subsequent calls to <tt>open_tag</tt>, the first
|
173
68
|
having <tt>name="text.string", position=10</tt> and the second having
|
174
|
-
<tt>name="markup.string", position=10</tt>, it
|
69
|
+
<tt>name="markup.string", position=10</tt>, it means that the
|
175
70
|
<tt>"markup.string"</tt> tag is inside the <tt>"text.string"</tt> tag.
|
176
71
|
|
177
|
-
==
|
72
|
+
== TODO
|
178
73
|
|
179
|
-
* {
|
180
|
-
* {
|
181
|
-
*
|
182
|
-
* Dizan Vasque
|
74
|
+
* parse text plist files {example}[https://raw.github.com/kangax/textmate-js-language-syntax-file/master/JavaScript.plist]
|
75
|
+
* parse tmLanguage files {example}[https://github.com/mattfarina/Ruby-Sass/blob/master/Ruby%20Sass.tmLanguage]
|
76
|
+
* document / spec / fix include languages (they dont work very well)
|
183
77
|
|
184
|
-
== LICENSE:
|
78
|
+
== LICENSE: MIT
|
185
79
|
|
186
|
-
(
|
187
|
-
|
188
|
-
* Copyright (c)
|
189
|
-
* Copyright (c) 2010 Chris Hoffman
|
190
|
-
* Copyright (c) 2009 Spox
|
80
|
+
* Copyright (c) 2011 {Michael Grosser}[http://github.com/grosser]
|
81
|
+
* Copyright (c) 2010 {Chris Hoffman}[http://github.com/cehoffman]
|
82
|
+
* Copyright (c) 2009 {Spox}[http://github.com/spox]
|
191
83
|
* Copyright (c) 2007-2008 Dizan Vasquez
|
192
|
-
|
193
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
194
|
-
a copy of this software and associated documentation files (the
|
195
|
-
'Software'), to deal in the Software without restriction, including
|
196
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
197
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
198
|
-
permit persons to whom the Software is furnished to do so, subject to
|
199
|
-
the following conditions:
|
200
|
-
|
201
|
-
The above copyright notice and this permission notice shall be
|
202
|
-
included in all copies or substantial portions of the Software.
|
203
|
-
|
204
|
-
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
205
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
206
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
207
|
-
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
208
|
-
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
209
|
-
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
210
|
-
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
CHANGED
@@ -4,3 +4,25 @@ Bundler::GemHelper.install_tasks
|
|
4
4
|
task :default do
|
5
5
|
sh "rspec spec/"
|
6
6
|
end
|
7
|
+
|
8
|
+
desc "Convert a plist to a .syntax file"
|
9
|
+
task :convert, :file do |t,args|
|
10
|
+
require 'plist'
|
11
|
+
require 'yaml'
|
12
|
+
yaml = Plist.parse_xml(args[:file]).to_yaml
|
13
|
+
File.open('out.syntax','w'){|f| f.write(yaml) }
|
14
|
+
end
|
15
|
+
|
16
|
+
rule /^version:bump:.*/ do |t|
|
17
|
+
sh "git status | grep 'nothing to commit'" # ensure we are not dirty
|
18
|
+
index = ['major', 'minor','patch'].index(t.name.split(':').last)
|
19
|
+
file = 'lib/textpow/version.rb'
|
20
|
+
|
21
|
+
version_file = File.read(file)
|
22
|
+
old_version, *version_parts = version_file.match(/(\d+)\.(\d+)\.(\d+)/).to_a
|
23
|
+
version_parts[index] = version_parts[index].to_i + 1
|
24
|
+
new_version = version_parts * '.'
|
25
|
+
File.open(file,'w'){|f| f.write(version_file.sub(old_version, new_version)) }
|
26
|
+
|
27
|
+
sh "bundle && git add #{file} Gemfile.lock && git commit -m 'bump version to #{new_version}'"
|
28
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
$LOAD_PATH.unshift 'lib'
|
2
|
+
require 'textpow'
|
3
|
+
|
4
|
+
syntax = Textpow::SyntaxNode.load("#{Textpow.syntax_path}/javascript.syntax")
|
5
|
+
text = File.read('examples/jquery.js')
|
6
|
+
processor = Textpow::RecordingProcessor.new
|
7
|
+
|
8
|
+
start = Time.now.to_f
|
9
|
+
5.times{ syntax.parse(text, processor) }
|
10
|
+
puts Time.now.to_f - start
|
11
|
+
|