bibtex-ruby 2.0.4 → 2.0.5
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of bibtex-ruby might be problematic. Click here for more details.
- data/Gemfile +2 -2
- data/Gemfile.lock +35 -39
- data/History.txt +6 -0
- data/Manifest +3 -0
- data/bibtex-ruby.gemspec +1 -1
- data/examples/bib2html.rb +1 -1
- data/features/issues/name_parsing.feature +19 -0
- data/features/names.feature +5 -4
- data/lib/bibtex/bibliography.rb +1 -1
- data/lib/bibtex/elements.rb +1 -1
- data/lib/bibtex/entry.rb +5 -2
- data/lib/bibtex/lexer.rb +42 -19
- data/lib/bibtex/name_parser.rb +29 -11
- data/lib/bibtex/names.y +28 -10
- data/lib/bibtex/parser.rb +1 -1
- data/lib/bibtex/value.rb +11 -1
- data/lib/bibtex/version.rb +1 -1
- data/test/benchmark.rb +37 -35
- data/test/bibtex/test_bibliography.rb +4 -0
- data/test/bibtex/test_entry.rb +9 -1
- data/test/bibtex/test_value.rb +15 -1
- data/test/macruby.d +21 -0
- data/test/macruby.rb +22 -0
- data/test/test_export.rb +1 -1
- metadata +22 -13
data/Gemfile
CHANGED
@@ -2,7 +2,7 @@ source :rubygems
|
|
2
2
|
gemspec
|
3
3
|
|
4
4
|
group :debug do
|
5
|
-
gem '
|
5
|
+
gem 'debugger', :platforms => [:mri_19]
|
6
6
|
gem 'ruby-debug', :platforms => [:mri_18]
|
7
7
|
gem 'rbx-trepanning', :platforms => [:rbx]
|
8
8
|
end
|
@@ -16,5 +16,5 @@ end
|
|
16
16
|
|
17
17
|
group :profile do
|
18
18
|
gem 'ruby-prof', ['~>0.10'], :platforms => [:mri_19, :mri_19]
|
19
|
-
gem 'gnuplot', ['~>2.
|
19
|
+
gem 'gnuplot', ['~>2.4']
|
20
20
|
end
|
data/Gemfile.lock
CHANGED
@@ -1,71 +1,67 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
bibtex-ruby (2.0.
|
4
|
+
bibtex-ruby (2.0.5)
|
5
5
|
latex-decode (>= 0.0.6)
|
6
|
-
multi_json (~> 1.
|
6
|
+
multi_json (~> 1.3)
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: http://rubygems.org/
|
10
10
|
specs:
|
11
|
-
archive-tar-minitar (0.5.2)
|
12
11
|
autowatchr (0.1.5)
|
13
12
|
watchr
|
14
13
|
builder (3.0.0)
|
15
|
-
|
16
|
-
|
14
|
+
coderay (1.0.5)
|
15
|
+
columnize (0.3.6)
|
16
|
+
cucumber (1.1.9)
|
17
17
|
builder (>= 2.1.2)
|
18
18
|
diff-lcs (>= 1.1.2)
|
19
|
-
gherkin (~> 2.
|
19
|
+
gherkin (~> 2.9.0)
|
20
20
|
json (>= 1.4.6)
|
21
|
-
term-ansicolor (>= 1.0.
|
22
|
-
|
23
|
-
|
21
|
+
term-ansicolor (>= 1.0.6)
|
22
|
+
debugger (1.0.0)
|
23
|
+
columnize (>= 0.3.1)
|
24
|
+
debugger-linecache
|
25
|
+
debugger-ruby_core_source
|
26
|
+
debugger-linecache (1.0.1)
|
27
|
+
debugger-ruby_core_source
|
28
|
+
debugger-ruby_core_source (1.0.1)
|
29
|
+
diff-lcs (1.1.3)
|
30
|
+
gherkin (2.9.0)
|
24
31
|
json (>= 1.4.6)
|
25
|
-
gherkin (2.
|
32
|
+
gherkin (2.9.0-java)
|
26
33
|
json (>= 1.4.6)
|
27
|
-
gnuplot (2.
|
28
|
-
json (1.5
|
29
|
-
json (1.5
|
30
|
-
latex-decode (0.0.
|
34
|
+
gnuplot (2.4.1)
|
35
|
+
json (1.6.5)
|
36
|
+
json (1.6.5-java)
|
37
|
+
latex-decode (0.0.12)
|
31
38
|
unicode (~> 0.4)
|
32
39
|
linecache (0.46)
|
33
40
|
rbx-require-relative (> 0.0.4)
|
34
|
-
|
35
|
-
|
36
|
-
minitest (2.3.1)
|
37
|
-
multi_json (1.0.4)
|
41
|
+
minitest (2.11.3)
|
42
|
+
multi_json (1.3.2)
|
38
43
|
mynyml-redgreen (0.7.1)
|
39
44
|
term-ansicolor (>= 1.0.4)
|
40
|
-
racc (1.4.
|
41
|
-
rake (0.9.2)
|
45
|
+
racc (1.4.8)
|
46
|
+
rake (0.9.2.2)
|
42
47
|
rbx-linecache (1.3)
|
43
48
|
rbx-require-relative
|
44
|
-
rbx-require-relative (0.0.
|
45
|
-
rbx-trepanning (1.
|
49
|
+
rbx-require-relative (0.0.9)
|
50
|
+
rbx-trepanning (0.1.0)
|
51
|
+
coderay (>= 1.0)
|
46
52
|
columnize
|
47
|
-
|
48
|
-
rbx-linecache (~> 1.2)
|
53
|
+
rbx-linecache (~> 1.3)
|
49
54
|
rbx-require-relative (>= 0.0.4)
|
50
|
-
rdoc (3.
|
55
|
+
rdoc (3.12)
|
56
|
+
json (~> 1.4)
|
51
57
|
ruby-debug (0.10.4)
|
52
58
|
columnize (>= 0.1)
|
53
59
|
ruby-debug-base (~> 0.10.4.0)
|
54
60
|
ruby-debug-base (0.10.4)
|
55
61
|
linecache (>= 0.3)
|
56
|
-
ruby-debug-base19 (0.11.25)
|
57
|
-
columnize (>= 0.3.1)
|
58
|
-
linecache19 (>= 0.5.11)
|
59
|
-
ruby_core_source (>= 0.1.4)
|
60
|
-
ruby-debug19 (0.11.6)
|
61
|
-
columnize (>= 0.3.1)
|
62
|
-
linecache19 (>= 0.5.11)
|
63
|
-
ruby-debug-base19 (>= 0.11.19)
|
64
62
|
ruby-prof (0.10.8)
|
65
|
-
|
66
|
-
|
67
|
-
term-ansicolor (1.0.5)
|
68
|
-
unicode (0.4.0)
|
63
|
+
term-ansicolor (1.0.7)
|
64
|
+
unicode (0.4.2)
|
69
65
|
watchr (0.7)
|
70
66
|
|
71
67
|
PLATFORMS
|
@@ -76,7 +72,8 @@ DEPENDENCIES
|
|
76
72
|
autowatchr (~> 0.1)
|
77
73
|
bibtex-ruby!
|
78
74
|
cucumber (~> 1.0)
|
79
|
-
|
75
|
+
debugger
|
76
|
+
gnuplot (~> 2.4)
|
80
77
|
minitest
|
81
78
|
mynyml-redgreen (~> 0.7)
|
82
79
|
racc (~> 1.4)
|
@@ -84,5 +81,4 @@ DEPENDENCIES
|
|
84
81
|
rbx-trepanning
|
85
82
|
rdoc (~> 3.9)
|
86
83
|
ruby-debug
|
87
|
-
ruby-debug19
|
88
84
|
ruby-prof (~> 0.10)
|
data/History.txt
CHANGED
data/Manifest
CHANGED
@@ -19,6 +19,7 @@ features/issues/braced_strings.feature
|
|
19
19
|
features/issues/crossref.feature
|
20
20
|
features/issues/latex_filter.feature
|
21
21
|
features/issues/multiline_strings.feature
|
22
|
+
features/issues/name_parsing.feature
|
22
23
|
features/issues/number_keys.feature
|
23
24
|
features/issues/parse_months.feature
|
24
25
|
features/issues/slash_keys.feature
|
@@ -82,6 +83,8 @@ test/fixtures/no_bibtex.bib
|
|
82
83
|
test/fixtures/preamble.bib
|
83
84
|
test/fixtures/roundtrip.bib
|
84
85
|
test/helper.rb
|
86
|
+
test/macruby.d
|
87
|
+
test/macruby.rb
|
85
88
|
test/profile.rb
|
86
89
|
test/test_bibtex.rb
|
87
90
|
test/test_export.rb
|
data/bibtex-ruby.gemspec
CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
|
|
26
26
|
END_DESCRIPTION
|
27
27
|
|
28
28
|
s.add_runtime_dependency('latex-decode', ['>=0.0.6'])
|
29
|
-
s.add_runtime_dependency('multi_json', ['~>1.
|
29
|
+
s.add_runtime_dependency('multi_json', ['~>1.3'])
|
30
30
|
|
31
31
|
s.add_development_dependency('rake', ['~>0.9'])
|
32
32
|
s.add_development_dependency('racc', ['~>1.4'])
|
data/examples/bib2html.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
Feature: BibTeX Names
|
2
|
+
As a hacker who works with bibliographies
|
3
|
+
I want to be able to access individual parts of names in a BibTeX file
|
4
|
+
|
5
|
+
Scenario Outline: Name Parsing
|
6
|
+
When I parse the name "<name>"
|
7
|
+
Then the parts should be:
|
8
|
+
| first | von | last | jr |
|
9
|
+
| <first> | <von> | <last> | <jr> |
|
10
|
+
|
11
|
+
@names @issue-46
|
12
|
+
Scenarios: Names with LaTeX commands
|
13
|
+
| name | first | von | last | jr |
|
14
|
+
| G{\\"u}rkan, G. | G. | | G{\\"u}rkan | |
|
15
|
+
| {\"O}zge, A. | A. | | {\"O}zge | |
|
16
|
+
| Yonca Ozge, A. | A. | | Yonca Ozge | |
|
17
|
+
| Yonca \"Ozge, A. | A. | | Yonca \"Ozge | |
|
18
|
+
| Yonca Özge, A. | A. | | Yonca Özge | |
|
19
|
+
| Yonca {\"O}Zge, A. | A. | | Yonca {\"O}Zge | |
|
data/features/names.feature
CHANGED
@@ -8,7 +8,7 @@ Feature: BibTeX Names
|
|
8
8
|
| first | von | last | jr |
|
9
9
|
| <first> | <von> | <last> | <jr> |
|
10
10
|
|
11
|
-
@display
|
11
|
+
@names @display
|
12
12
|
Scenarios: Decoret test suite (display order)
|
13
13
|
| name | first | von | last | jr |
|
14
14
|
| AA BB | AA | | BB | |
|
@@ -32,7 +32,7 @@ Feature: BibTeX Names
|
|
32
32
|
| AA bb {cc} DD | AA | bb | {cc} DD | |
|
33
33
|
| AA {bb} CC | AA {bb} | | CC | |
|
34
34
|
|
35
|
-
@sort
|
35
|
+
@names @sort
|
36
36
|
Scenarios: Decoret test suite (sort order)
|
37
37
|
| name | first | von | last | jr |
|
38
38
|
| bb CC, AA | AA | bb | CC | |
|
@@ -46,7 +46,7 @@ Feature: BibTeX Names
|
|
46
46
|
| CC dd BB, AA | AA | CC dd | BB | |
|
47
47
|
| BB, AA | AA | | BB | |
|
48
48
|
|
49
|
-
@sort
|
49
|
+
@names @sort
|
50
50
|
Scenarios: Long von parts
|
51
51
|
| name | first | von | last | jr |
|
52
52
|
| bb cc dd CC, AA | AA | bb cc dd | CC | |
|
@@ -54,7 +54,7 @@ Feature: BibTeX Names
|
|
54
54
|
| BB cc dd CC, AA | AA | BB cc dd | CC | |
|
55
55
|
| BB CC dd CC, AA | AA | BB CC dd | CC | |
|
56
56
|
|
57
|
-
|
57
|
+
@names
|
58
58
|
Scenarios: Decoret further remarks
|
59
59
|
| name | first | von | last | jr |
|
60
60
|
# | Paul \'Emile Victor | Paul \'Emile | | Victor | |
|
@@ -69,6 +69,7 @@ Feature: BibTeX Names
|
|
69
69
|
| Dominique {G}alouzeau de Villepin | Dominique | {G}alouzeau de | Villepin | |
|
70
70
|
| Galouzeau {de} Villepin, Dominique | Dominique | | Galouzeau {de} Villepin | |
|
71
71
|
|
72
|
+
@names
|
72
73
|
Scenarios: Some actual names
|
73
74
|
| name | first | von | last | jr |
|
74
75
|
| John Paul Jones | John Paul | | Jones | |
|
data/lib/bibtex/bibliography.rb
CHANGED
@@ -316,7 +316,7 @@ module BibTeX
|
|
316
316
|
|
317
317
|
# Returns a JSON representation of the bibliography.
|
318
318
|
def to_json(options = {})
|
319
|
-
MultiJson.
|
319
|
+
MultiJson.dump(to_a(options))
|
320
320
|
end
|
321
321
|
|
322
322
|
# Returns a CiteProc JSON representation of the bibliography. Only BibTeX enrties are exported.
|
data/lib/bibtex/elements.rb
CHANGED
data/lib/bibtex/entry.rb
CHANGED
@@ -335,9 +335,10 @@ module BibTeX
|
|
335
335
|
# add(:author, "Edgar A. Poe", :title, "The Raven")
|
336
336
|
# add([:author, "Edgar A. Poe", :title, "The Raven"])
|
337
337
|
# add(:author => "Edgar A. Poe", :title => "The Raven")
|
338
|
+
# add(:author => Names.new(Name.new(:first => 'Edgar A.', :last => 'Poe')))
|
338
339
|
def add(*arguments)
|
339
340
|
Hash[*arguments.flatten].each_pair do |name, value|
|
340
|
-
fields[name.to_sym] = Value.
|
341
|
+
fields[name.to_sym] = Value.create(value)
|
341
342
|
end
|
342
343
|
|
343
344
|
self
|
@@ -374,7 +375,9 @@ module BibTeX
|
|
374
375
|
end
|
375
376
|
|
376
377
|
if bibliography.options.has_key?(:filter)
|
377
|
-
|
378
|
+
[*bibliography.options[:filter]].each do |filter|
|
379
|
+
convert!(filter)
|
380
|
+
end
|
378
381
|
end
|
379
382
|
|
380
383
|
self
|
data/lib/bibtex/lexer.rb
CHANGED
@@ -37,6 +37,29 @@ module BibTeX
|
|
37
37
|
:strip => true
|
38
38
|
}.freeze
|
39
39
|
|
40
|
+
# Patterns Cache (#37: MacRuby does not cache regular expressions)
|
41
|
+
@patterns = {
|
42
|
+
:space => /[\s]+/o,
|
43
|
+
:lbrace => /\{/o,
|
44
|
+
:rbrace => /\}/o,
|
45
|
+
:braces => /\{|\}/o,
|
46
|
+
:eq => /=/o,
|
47
|
+
:comma => /,/o,
|
48
|
+
:number => /\d+/o,
|
49
|
+
:name => /[[:alpha:]\d \/:_!$\.%&*-]+/io,
|
50
|
+
:quote => /"/o,
|
51
|
+
:unquote => /[\{\}"]/o,
|
52
|
+
:sharp => /#/o,
|
53
|
+
:object => /@/o,
|
54
|
+
:period => /./o,
|
55
|
+
:strict_next => /@[\t ]*/o,
|
56
|
+
:next => /(^|\n)[\t ]*@[\t ]*/o,
|
57
|
+
:entry => /[a-z\d:_!\.$%&*-]+/io,
|
58
|
+
:string => /string/io,
|
59
|
+
:comment => /comment/io,
|
60
|
+
:preamble => /preamble/io
|
61
|
+
}.freeze
|
62
|
+
|
40
63
|
MODE = Hash.new(:meta).merge({
|
41
64
|
:bibtex => :bibtex, :entry => :bibtex,
|
42
65
|
:string => :bibtex, :preamble => :bibtex,
|
@@ -45,7 +68,7 @@ module BibTeX
|
|
45
68
|
}).freeze
|
46
69
|
|
47
70
|
class << self
|
48
|
-
|
71
|
+
attr_reader :defaults, :patterns
|
49
72
|
end
|
50
73
|
|
51
74
|
#
|
@@ -151,37 +174,37 @@ module BibTeX
|
|
151
174
|
|
152
175
|
def parse_bibtex
|
153
176
|
case
|
154
|
-
when @scanner.scan(
|
155
|
-
when @scanner.scan(
|
177
|
+
when @scanner.scan(Lexer.patterns[:space])
|
178
|
+
when @scanner.scan(Lexer.patterns[:lbrace])
|
156
179
|
@brace_level += 1
|
157
180
|
push([:LBRACE,'{'])
|
158
181
|
@mode = :content if @brace_level > 1 || @brace_level == 1 && active?(:comment)
|
159
|
-
when @scanner.scan(
|
182
|
+
when @scanner.scan(Lexer.patterns[:rbrace])
|
160
183
|
@brace_level -= 1
|
161
184
|
push([:RBRACE,'}'])
|
162
185
|
return leave_object if @brace_level == 0
|
163
186
|
return error_unbalanced_braces if @brace_level < 0
|
164
|
-
when @scanner.scan(
|
187
|
+
when @scanner.scan(Lexer.patterns[:eq])
|
165
188
|
push([:EQ,'='])
|
166
|
-
when @scanner.scan(
|
189
|
+
when @scanner.scan(Lexer.patterns[:comma])
|
167
190
|
push([:COMMA,','])
|
168
|
-
when @scanner.scan(
|
191
|
+
when @scanner.scan(Lexer.patterns[:number])
|
169
192
|
push([:NUMBER,@scanner.matched])
|
170
|
-
when @scanner.scan(
|
193
|
+
when @scanner.scan(Lexer.patterns[:name])
|
171
194
|
push([:NAME,@scanner.matched.rstrip])
|
172
|
-
when @scanner.scan(
|
195
|
+
when @scanner.scan(Lexer.patterns[:quote])
|
173
196
|
@mode = :literal
|
174
|
-
when @scanner.scan(
|
197
|
+
when @scanner.scan(Lexer.patterns[:sharp])
|
175
198
|
push([:SHARP,'#'])
|
176
|
-
when @scanner.scan(
|
199
|
+
when @scanner.scan(Lexer.patterns[:object])
|
177
200
|
enter_object
|
178
|
-
when @scanner.scan(
|
201
|
+
when @scanner.scan(Lexer.patterns[:period])
|
179
202
|
error_unexpected_token
|
180
203
|
end
|
181
204
|
end
|
182
205
|
|
183
206
|
def parse_meta
|
184
|
-
match = @scanner.scan_until(strict? ?
|
207
|
+
match = @scanner.scan_until(Lexer.patterns[strict? ? :strict_next : :next])
|
185
208
|
if @scanner.matched
|
186
209
|
push([:META_CONTENT,match.chop])
|
187
210
|
enter_object
|
@@ -192,7 +215,7 @@ module BibTeX
|
|
192
215
|
end
|
193
216
|
|
194
217
|
def parse_content
|
195
|
-
match = @scanner.scan_until(
|
218
|
+
match = @scanner.scan_until(Lexer.patterns[:braces])
|
196
219
|
case @scanner.matched
|
197
220
|
when '{'
|
198
221
|
@brace_level += 1
|
@@ -222,7 +245,7 @@ module BibTeX
|
|
222
245
|
end
|
223
246
|
|
224
247
|
def parse_literal
|
225
|
-
match = @scanner.scan_until(
|
248
|
+
match = @scanner.scan_until(Lexer.patterns[:unquote])
|
226
249
|
case @scanner.matched
|
227
250
|
when '{'
|
228
251
|
@brace_level += 1
|
@@ -255,16 +278,16 @@ module BibTeX
|
|
255
278
|
push [:AT,'@']
|
256
279
|
|
257
280
|
case
|
258
|
-
when @scanner.scan(
|
281
|
+
when @scanner.scan(Lexer.patterns[:string])
|
259
282
|
@mode = @active_object = :string
|
260
283
|
push [:STRING, @scanner.matched]
|
261
|
-
when @scanner.scan(
|
284
|
+
when @scanner.scan(Lexer.patterns[:preamble])
|
262
285
|
@mode = @active_object = :preamble
|
263
286
|
push [:PREAMBLE, @scanner.matched]
|
264
|
-
when @scanner.scan(
|
287
|
+
when @scanner.scan(Lexer.patterns[:comment])
|
265
288
|
@mode = @active_object = :comment
|
266
289
|
push [:COMMENT, @scanner.matched]
|
267
|
-
when @scanner.scan(
|
290
|
+
when @scanner.scan(Lexer.patterns[:entry])
|
268
291
|
@mode = @active_object = :entry
|
269
292
|
push [:NAME, @scanner.matched]
|
270
293
|
else
|
data/lib/bibtex/name_parser.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
2
|
# DO NOT MODIFY!!!!
|
3
|
-
# This file is automatically generated by Racc 1.4.
|
3
|
+
# This file is automatically generated by Racc 1.4.8
|
4
4
|
# from Racc grammer file "".
|
5
5
|
#
|
6
6
|
|
@@ -13,6 +13,24 @@ module BibTeX
|
|
13
13
|
|
14
14
|
module_eval(<<'...end names.y/module_eval...', 'names.y', 94)
|
15
15
|
|
16
|
+
# Patterns Cache (#37: MacRuby does not cache regular expressions)
|
17
|
+
@patterns = {
|
18
|
+
:and => /,?\s+and\s+/io,
|
19
|
+
:space => /[\t\r\n\s]+/o,
|
20
|
+
:comma => /,/o,
|
21
|
+
:lower => /[[:lower:]][^\t\r\n\s\{\}\d\\,]*/o,
|
22
|
+
:upper => /[[:upper:]][^\t\r\n\s\{\}\d\\,]*/o,
|
23
|
+
:symbols => /(\d|\\.)+/o,
|
24
|
+
:lbrace => /\{/o,
|
25
|
+
:rbrace => /\}/o,
|
26
|
+
:period => /./o,
|
27
|
+
:braces => /[\{\}]/o
|
28
|
+
}.freeze
|
29
|
+
|
30
|
+
class << self
|
31
|
+
attr_reader :patterns
|
32
|
+
end
|
33
|
+
|
16
34
|
def initialize(options = {})
|
17
35
|
self.options.merge!(options)
|
18
36
|
end
|
@@ -48,36 +66,36 @@ module_eval(<<'...end names.y/module_eval...', 'names.y', 94)
|
|
48
66
|
def do_scan
|
49
67
|
until @src.eos?
|
50
68
|
case
|
51
|
-
when @src.scan(
|
69
|
+
when @src.scan(NameParser.patterns[:and])
|
52
70
|
push_word
|
53
71
|
@stack.push([:AND,@src.matched])
|
54
72
|
|
55
|
-
when @src.scan(
|
73
|
+
when @src.scan(NameParser.patterns[:space])
|
56
74
|
push_word
|
57
75
|
|
58
|
-
when @src.scan(
|
76
|
+
when @src.scan(NameParser.patterns[:comma])
|
59
77
|
push_word
|
60
78
|
@stack.push([:COMMA,@src.matched])
|
61
79
|
|
62
|
-
when @src.scan(
|
80
|
+
when @src.scan(NameParser.patterns[:lower])
|
63
81
|
is_lowercase
|
64
82
|
@word[1] << @src.matched
|
65
83
|
|
66
|
-
when @src.scan(
|
84
|
+
when @src.scan(NameParser.patterns[:upper])
|
67
85
|
is_uppercase
|
68
86
|
@word[1] << @src.matched
|
69
87
|
|
70
|
-
when @src.scan(
|
88
|
+
when @src.scan(NameParser.patterns[:symbols])
|
71
89
|
@word[1] << @src.matched
|
72
90
|
|
73
|
-
when @src.scan(
|
91
|
+
when @src.scan(NameParser.patterns[:lbrace])
|
74
92
|
@word[1] << @src.matched
|
75
93
|
scan_literal
|
76
94
|
|
77
|
-
when @src.scan(
|
95
|
+
when @src.scan(NameParser.patterns[:rbrace])
|
78
96
|
error_unbalanced
|
79
97
|
|
80
|
-
when @src.scan(
|
98
|
+
when @src.scan(NameParser.patterns[:period])
|
81
99
|
@word[1] << @src.matched
|
82
100
|
end
|
83
101
|
end
|
@@ -105,7 +123,7 @@ module_eval(<<'...end names.y/module_eval...', 'names.y', 94)
|
|
105
123
|
@brace_level = 1
|
106
124
|
|
107
125
|
while @brace_level > 0
|
108
|
-
@word[1] << @src.scan_until(
|
126
|
+
@word[1] << @src.scan_until(NameParser.patterns[:braces]).to_s
|
109
127
|
|
110
128
|
case @src.matched
|
111
129
|
when '{'
|
data/lib/bibtex/names.y
CHANGED
@@ -92,6 +92,24 @@ require 'strscan'
|
|
92
92
|
|
93
93
|
---- inner
|
94
94
|
|
95
|
+
# Patterns Cache (#37: MacRuby does not cache regular expressions)
|
96
|
+
@patterns = {
|
97
|
+
:and => /,?\s+and\s+/io,
|
98
|
+
:space => /[\t\r\n\s]+/o,
|
99
|
+
:comma => /,/o,
|
100
|
+
:lower => /[[:lower:]][^\t\r\n\s\{\}\d\\,]*/o,
|
101
|
+
:upper => /[[:upper:]][^\t\r\n\s\{\}\d\\,]*/o,
|
102
|
+
:symbols => /(\d|\\.)+/o,
|
103
|
+
:lbrace => /\{/o,
|
104
|
+
:rbrace => /\}/o,
|
105
|
+
:period => /./o,
|
106
|
+
:braces => /[\{\}]/o
|
107
|
+
}.freeze
|
108
|
+
|
109
|
+
class << self
|
110
|
+
attr_reader :patterns
|
111
|
+
end
|
112
|
+
|
95
113
|
def initialize(options = {})
|
96
114
|
self.options.merge!(options)
|
97
115
|
end
|
@@ -127,36 +145,36 @@ require 'strscan'
|
|
127
145
|
def do_scan
|
128
146
|
until @src.eos?
|
129
147
|
case
|
130
|
-
when @src.scan(
|
148
|
+
when @src.scan(NameParser.patterns[:and])
|
131
149
|
push_word
|
132
150
|
@stack.push([:AND,@src.matched])
|
133
151
|
|
134
|
-
when @src.scan(
|
152
|
+
when @src.scan(NameParser.patterns[:space])
|
135
153
|
push_word
|
136
154
|
|
137
|
-
when @src.scan(
|
155
|
+
when @src.scan(NameParser.patterns[:comma])
|
138
156
|
push_word
|
139
157
|
@stack.push([:COMMA,@src.matched])
|
140
158
|
|
141
|
-
when @src.scan(
|
159
|
+
when @src.scan(NameParser.patterns[:lower])
|
142
160
|
is_lowercase
|
143
161
|
@word[1] << @src.matched
|
144
162
|
|
145
|
-
when @src.scan(
|
163
|
+
when @src.scan(NameParser.patterns[:upper])
|
146
164
|
is_uppercase
|
147
165
|
@word[1] << @src.matched
|
148
166
|
|
149
|
-
when @src.scan(
|
167
|
+
when @src.scan(NameParser.patterns[:symbols])
|
150
168
|
@word[1] << @src.matched
|
151
169
|
|
152
|
-
when @src.scan(
|
170
|
+
when @src.scan(NameParser.patterns[:lbrace])
|
153
171
|
@word[1] << @src.matched
|
154
172
|
scan_literal
|
155
173
|
|
156
|
-
when @src.scan(
|
174
|
+
when @src.scan(NameParser.patterns[:rbrace])
|
157
175
|
error_unbalanced
|
158
176
|
|
159
|
-
when @src.scan(
|
177
|
+
when @src.scan(NameParser.patterns[:period])
|
160
178
|
@word[1] << @src.matched
|
161
179
|
end
|
162
180
|
end
|
@@ -184,7 +202,7 @@ require 'strscan'
|
|
184
202
|
@brace_level = 1
|
185
203
|
|
186
204
|
while @brace_level > 0
|
187
|
-
@word[1] << @src.scan_until(
|
205
|
+
@word[1] << @src.scan_until(NameParser.patterns[:braces]).to_s
|
188
206
|
|
189
207
|
case @src.matched
|
190
208
|
when '{'
|
data/lib/bibtex/parser.rb
CHANGED
data/lib/bibtex/value.rb
CHANGED
@@ -55,6 +55,16 @@ module BibTeX
|
|
55
55
|
def_delegators :to_s, :=~, :===, *String.instance_methods(false).reject { |m| m =~ /^\W|^length$|^dup$|!$/ }
|
56
56
|
def_delegators :@tokens, :[], :length
|
57
57
|
def_delegator :@tokens, :each, :each_token
|
58
|
+
|
59
|
+
# call-seq:
|
60
|
+
# create(other) => other.dup
|
61
|
+
# create(*args) => Value.new(args)
|
62
|
+
#
|
63
|
+
# Duplicates a +Value+ object (or an object of any subclass of +Value+),
|
64
|
+
# or initializes a new one.
|
65
|
+
def self.create(*args)
|
66
|
+
args[0].class < Value && args.size == 1 ? args[0].dup : Value.new(args)
|
67
|
+
end
|
58
68
|
|
59
69
|
def initialize(*arguments)
|
60
70
|
@tokens = []
|
@@ -248,4 +258,4 @@ module BibTeX
|
|
248
258
|
|
249
259
|
end
|
250
260
|
|
251
|
-
end
|
261
|
+
end
|
data/lib/bibtex/version.rb
CHANGED
data/test/benchmark.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
-
|
1
|
+
# ruby -Ilib -rrubygems test/benchmark.rb
|
2
2
|
|
3
3
|
require 'benchmark'
|
4
4
|
include Benchmark
|
5
5
|
|
6
|
+
require 'bibtex'
|
7
|
+
|
6
8
|
# data = File.open(BibTeX::Test.fixtures(:benchmark)).read
|
7
9
|
|
8
10
|
input = <<-END
|
@@ -19,8 +21,8 @@ input = <<-END
|
|
19
21
|
}
|
20
22
|
END
|
21
23
|
|
22
|
-
n, k =
|
23
|
-
|
24
|
+
n, k = 31, 10
|
25
|
+
lexer = BibTeX::Lexer.new
|
24
26
|
# parser = BibTeX::Parser.new
|
25
27
|
|
26
28
|
f = []
|
@@ -35,18 +37,18 @@ Benchmark.benchmark((" "*15) + CAPTION, 7, format, '%14s:' % 'sum(f)', '%14s:' %
|
|
35
37
|
|
36
38
|
f << b.report('%14s:' % "f(#{i})") do
|
37
39
|
i.times do
|
38
|
-
|
39
|
-
|
40
|
-
BibTeX::Parser.new.parse(input)
|
40
|
+
lexer.data = input
|
41
|
+
lexer.analyse
|
42
|
+
# BibTeX::Parser.new.parse(input)
|
41
43
|
end
|
42
44
|
end
|
43
45
|
|
44
46
|
data = input * i
|
45
47
|
|
46
48
|
g << b.report('%14s:' % "g(#{i})") do
|
47
|
-
|
48
|
-
|
49
|
-
BibTeX::Parser.new.parse(data)
|
49
|
+
lexer.data = data
|
50
|
+
lexer.analyse
|
51
|
+
# BibTeX::Parser.new.parse(data)
|
50
52
|
end
|
51
53
|
|
52
54
|
end
|
@@ -54,29 +56,29 @@ Benchmark.benchmark((" "*15) + CAPTION, 7, format, '%14s:' % 'sum(f)', '%14s:' %
|
|
54
56
|
[f.inject(:+), g.inject(:+)]
|
55
57
|
end
|
56
58
|
|
57
|
-
require 'gnuplot'
|
58
|
-
|
59
|
-
f = f.map(&:total)
|
60
|
-
g = g.map(&:total)
|
61
|
-
|
62
|
-
x = 1.step(n,k).to_a
|
63
|
-
|
64
|
-
Gnuplot.open do |gp|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
end
|
59
|
+
# require 'gnuplot'
|
60
|
+
#
|
61
|
+
# f = f.map(&:total)
|
62
|
+
# g = g.map(&:total)
|
63
|
+
#
|
64
|
+
# x = 1.step(n,k).to_a
|
65
|
+
#
|
66
|
+
# Gnuplot.open do |gp|
|
67
|
+
# Gnuplot::Plot.new(gp) do |plot|
|
68
|
+
#
|
69
|
+
# plot.title 'BibTeX-Ruby Benchmark'
|
70
|
+
# plot.ylabel 't'
|
71
|
+
# plot.xlabel 'n'
|
72
|
+
#
|
73
|
+
# plot.data << Gnuplot::DataSet.new([x,f]) do |ds|
|
74
|
+
# ds.with = 'linespoints'
|
75
|
+
# ds.title = 'f'
|
76
|
+
# end
|
77
|
+
#
|
78
|
+
# plot.data << Gnuplot::DataSet.new([x,g]) do |ds|
|
79
|
+
# ds.with = 'linespoints'
|
80
|
+
# ds.title = 'g'
|
81
|
+
# end
|
82
|
+
#
|
83
|
+
# end
|
84
|
+
# end
|
@@ -34,6 +34,10 @@ module BibTeX
|
|
34
34
|
it 'accepts filters' do
|
35
35
|
Bibliography.parse("@misc{k, title = {\\''u}}", :filter => 'latex')[0].title.must_be :==, 'ü'
|
36
36
|
end
|
37
|
+
|
38
|
+
it 'accepts filters in an array' do
|
39
|
+
Bibliography.parse("@misc{k, title = {\\''u}}", :filter => ['latex'])[0].title.must_be :==, 'ü'
|
40
|
+
end
|
37
41
|
end
|
38
42
|
|
39
43
|
describe 'given a populated biliography' do
|
data/test/bibtex/test_entry.rb
CHANGED
@@ -11,6 +11,14 @@ module BibTeX
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
+
describe '#add' do
|
15
|
+
it 'preserves BibTeX::Names (and other subclasses of BibTeX::Value)' do
|
16
|
+
e = Entry.new
|
17
|
+
e.add(:author, Names.new(Name.new(:first => 'first_name')))
|
18
|
+
assert_equal e[:author].class, Names
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
14
22
|
describe 'cross-references' do
|
15
23
|
it 'has no cross-reference by default' do
|
16
24
|
assert_equal false, Entry.new.has_cross_reference?
|
@@ -452,4 +460,4 @@ module BibTeX
|
|
452
460
|
end
|
453
461
|
|
454
462
|
end
|
455
|
-
end
|
463
|
+
end
|
data/test/bibtex/test_value.rb
CHANGED
@@ -2,6 +2,20 @@ require 'helper.rb'
|
|
2
2
|
|
3
3
|
module BibTeX
|
4
4
|
class ValueTest < MiniTest::Spec
|
5
|
+
|
6
|
+
describe "::create" do
|
7
|
+
it "should return a duplicate when called with a Value subclass" do
|
8
|
+
val = Value.new('value')
|
9
|
+
names = Names.new(Name.new(:first => 'first_name'))
|
10
|
+
|
11
|
+
assert_equal val.dup, Value.create(val)
|
12
|
+
assert_equal names.dup, Value.create(names)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should return a new Value object when called with other arguments" do
|
16
|
+
assert_equal Value.new('value'), Value.create('value')
|
17
|
+
end
|
18
|
+
end
|
5
19
|
|
6
20
|
describe "when empty" do
|
7
21
|
it "should be equal to an empty string" do
|
@@ -132,4 +146,4 @@ module BibTeX
|
|
132
146
|
end
|
133
147
|
|
134
148
|
end
|
135
|
-
end
|
149
|
+
end
|
data/test/macruby.d
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
/* time.d */
|
2
|
+
|
3
|
+
#pragma D option quiet
|
4
|
+
|
5
|
+
macruby$target:::method-entry
|
6
|
+
{
|
7
|
+
self->starttime = walltimestamp / 1000;
|
8
|
+
}
|
9
|
+
|
10
|
+
macruby$target:::method-return
|
11
|
+
{
|
12
|
+
@invoked_time[copyinstr(arg0), copyinstr(arg1)] = sum((walltimestamp / 1000) - self->starttime);
|
13
|
+
}
|
14
|
+
|
15
|
+
END
|
16
|
+
{
|
17
|
+
printf("\n");
|
18
|
+
printf("%-10s %-15s %s\n", "CLASS", "METHOD", "TOTAL TIME µsec");
|
19
|
+
printf("--------------------------------------------------------------------------------\n");
|
20
|
+
printa("%-10s %-15s %@d\n", @invoked_time);
|
21
|
+
}
|
data/test/macruby.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
|
2
|
+
# sudo dtrace -qs test/macruby.d -c "macruby -Ilib -rrubygems test/macruby.rb"
|
3
|
+
|
4
|
+
require 'bibtex'
|
5
|
+
|
6
|
+
input = <<-END
|
7
|
+
@book{pickaxe,
|
8
|
+
Address = {Raleigh, North Carolina},
|
9
|
+
Author = {Thomas, Dave, and Fowler, Chad, and Hunt, Andy},
|
10
|
+
Date-Added = {2010-08-05 09:54:07 +0200},
|
11
|
+
Date-Modified = {2010-08-05 10:07:01 +0200},
|
12
|
+
Keywords = {ruby},
|
13
|
+
Publisher = {The Pragmatic Bookshelf},
|
14
|
+
Series = {The Facets of Ruby},
|
15
|
+
Title = {Programming Ruby 1.9: The Pragmatic Programmer's Guide},
|
16
|
+
Year = {2009}
|
17
|
+
}
|
18
|
+
END
|
19
|
+
|
20
|
+
lexer = BibTeX::Lexer.new
|
21
|
+
lexer.data = input * 100
|
22
|
+
lexer.analyse
|
data/test/test_export.rb
CHANGED
@@ -22,7 +22,7 @@ module BibTeX
|
|
22
22
|
|
23
23
|
def test_json
|
24
24
|
bib = BibTeX::Bibliography.open(Test.fixtures(:bibdesk), :debug => false)
|
25
|
-
json = MultiJson.
|
25
|
+
json = MultiJson.load(bib.to_json)
|
26
26
|
refute_nil(json)
|
27
27
|
assert_equal(3, json.length)
|
28
28
|
assert_equal(%w[ dragon pickaxe rails], json.map { |y| y['key'] }.sort)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bibtex-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-04-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: latex-decode
|
16
|
-
requirement: &
|
16
|
+
requirement: &70347703840520 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,21 +21,21 @@ dependencies:
|
|
21
21
|
version: 0.0.6
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70347703840520
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: multi_json
|
27
|
-
requirement: &
|
27
|
+
requirement: &70347703829060 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '1.
|
32
|
+
version: '1.3'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70347703829060
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rake
|
38
|
-
requirement: &
|
38
|
+
requirement: &70347703826940 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0.9'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70347703826940
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: racc
|
49
|
-
requirement: &
|
49
|
+
requirement: &70347703825800 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '1.4'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70347703825800
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rdoc
|
60
|
-
requirement: &
|
60
|
+
requirement: &70347703823800 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,7 +65,7 @@ dependencies:
|
|
65
65
|
version: '3.9'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70347703823800
|
69
69
|
description: ! "\t\tBibTeX-Ruby is the Rubyist's swiss-army-knife for all things BibTeX.
|
70
70
|
It\n includes a parser for all common BibTeX objects (@string, @preamble,\n @comment
|
71
71
|
and regular entries) and a sophisticated name parser that\n tokenizes correctly
|
@@ -99,6 +99,7 @@ files:
|
|
99
99
|
- features/issues/crossref.feature
|
100
100
|
- features/issues/latex_filter.feature
|
101
101
|
- features/issues/multiline_strings.feature
|
102
|
+
- features/issues/name_parsing.feature
|
102
103
|
- features/issues/number_keys.feature
|
103
104
|
- features/issues/parse_months.feature
|
104
105
|
- features/issues/slash_keys.feature
|
@@ -154,6 +155,8 @@ files:
|
|
154
155
|
- test/fixtures/preamble.bib
|
155
156
|
- test/fixtures/roundtrip.bib
|
156
157
|
- test/helper.rb
|
158
|
+
- test/macruby.d
|
159
|
+
- test/macruby.rb
|
157
160
|
- test/profile.rb
|
158
161
|
- test/test_bibtex.rb
|
159
162
|
- test/test_export.rb
|
@@ -177,12 +180,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
177
180
|
- - ! '>='
|
178
181
|
- !ruby/object:Gem::Version
|
179
182
|
version: '0'
|
183
|
+
segments:
|
184
|
+
- 0
|
185
|
+
hash: -230691617197525967
|
180
186
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
181
187
|
none: false
|
182
188
|
requirements:
|
183
189
|
- - ! '>='
|
184
190
|
- !ruby/object:Gem::Version
|
185
191
|
version: '0'
|
192
|
+
segments:
|
193
|
+
- 0
|
194
|
+
hash: -230691617197525967
|
186
195
|
requirements: []
|
187
196
|
rubyforge_project:
|
188
197
|
rubygems_version: 1.8.10
|