bibtex-ruby 2.0.10 → 2.0.11
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.
Potentially problematic release.
This version of bibtex-ruby might be problematic. Click here for more details.
- data/Gemfile.lock +2 -2
- data/History.txt +5 -0
- data/lib/bibtex/bibliography.rb +1 -1
- data/lib/bibtex/bibtex.y +30 -13
- data/lib/bibtex/lexer.rb +44 -22
- data/lib/bibtex/parser.rb +109 -104
- data/lib/bibtex/version.rb +1 -1
- data/test/bibtex/test_lexer.rb +3 -0
- data/test/bibtex/test_parser.rb +67 -53
- metadata +13 -18
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
bibtex-ruby (2.0.
|
4
|
+
bibtex-ruby (2.0.11)
|
5
5
|
latex-decode (>= 0.0.6)
|
6
6
|
multi_json (~> 1.3)
|
7
7
|
|
@@ -40,7 +40,7 @@ GEM
|
|
40
40
|
linecache (0.46)
|
41
41
|
rbx-require-relative (> 0.0.4)
|
42
42
|
minitest (2.11.3)
|
43
|
-
multi_json (1.3.
|
43
|
+
multi_json (1.3.5)
|
44
44
|
mynyml-redgreen (0.7.1)
|
45
45
|
term-ansicolor (>= 1.0.4)
|
46
46
|
racc (1.4.8)
|
data/History.txt
CHANGED
data/lib/bibtex/bibliography.rb
CHANGED
@@ -317,7 +317,7 @@ module BibTeX
|
|
317
317
|
|
318
318
|
# group names together
|
319
319
|
names.each do |name|
|
320
|
-
group = groups[name.sort_order(:initials => true).gsub(/\s+/, '')]
|
320
|
+
group = groups[name.sort_order(:initials => true).gsub(/\s+/, '').downcase]
|
321
321
|
group[:names] << name
|
322
322
|
|
323
323
|
if group[:prototype].nil? || group[:prototype].first.to_s.length < name.first.to_s.length
|
data/lib/bibtex/bibtex.y
CHANGED
@@ -23,7 +23,7 @@
|
|
23
23
|
|
24
24
|
class BibTeX::Parser
|
25
25
|
|
26
|
-
token AT COMMA COMMENT CONTENT ERROR EQ LBRACE META_CONTENT
|
26
|
+
token AT COMMA COMMENT CONTENT ERROR EQ LBRACE META_CONTENT KEY
|
27
27
|
NAME NUMBER PREAMBLE RBRACE SHARP STRING STRING_LITERAL
|
28
28
|
|
29
29
|
expect 0
|
@@ -67,12 +67,11 @@ rule
|
|
67
67
|
| entry_head assignments COMMA RBRACE { result = val[0] << val[1] }
|
68
68
|
| entry_head RBRACE { result = val[0] }
|
69
69
|
|
70
|
-
entry_head : NAME LBRACE
|
71
|
-
|
72
|
-
key : NAME { result = val[0] }
|
73
|
-
| NUMBER { result = val[0] }
|
74
|
-
| NUMBER NAME { result = val[0,2].join }
|
70
|
+
entry_head : NAME LBRACE opt_key { result = BibTeX::Entry.new(:type => val[0].downcase.to_sym, :key => val[2]) }
|
75
71
|
|
72
|
+
opt_key : { missing_key }
|
73
|
+
| KEY
|
74
|
+
|
76
75
|
assignments : assignment { result = val[0] }
|
77
76
|
| assignments COMMA assignment { result.merge!(val[2]) }
|
78
77
|
|
@@ -90,29 +89,47 @@ require 'bibtex/lexer'
|
|
90
89
|
|
91
90
|
attr_reader :lexer, :options
|
92
91
|
|
93
|
-
|
92
|
+
@defaults = {
|
93
|
+
:include => [:errors],
|
94
|
+
:allow_missing_keys => false,
|
95
|
+
:debug => false
|
96
|
+
}.freeze
|
97
|
+
|
98
|
+
class << self
|
99
|
+
attr_reader :defaults
|
100
|
+
end
|
94
101
|
|
95
102
|
def initialize(options = {})
|
96
|
-
@options =
|
103
|
+
@options = Parser.defaults.merge(options)
|
97
104
|
@lexer = Lexer.new(@options)
|
98
105
|
end
|
99
106
|
|
100
107
|
def parse(input)
|
101
108
|
@yydebug = debug?
|
102
|
-
|
103
|
-
|
109
|
+
|
110
|
+
lexer.analyse(input)
|
104
111
|
do_parse
|
105
112
|
#yyparse(@lexer,:each)
|
106
113
|
end
|
107
114
|
|
108
115
|
def next_token
|
109
|
-
|
116
|
+
lexer.next_token
|
110
117
|
end
|
111
118
|
|
112
119
|
def debug?
|
113
|
-
|
120
|
+
options[:debug] || ENV['DEBUG']
|
114
121
|
end
|
115
|
-
|
122
|
+
|
123
|
+
def allow_missing_keys?
|
124
|
+
options[:allow_missing_keys]
|
125
|
+
end
|
126
|
+
|
127
|
+
def missing_key
|
128
|
+
unless allow_missing_keys?
|
129
|
+
raise ParseError, "Failed to parse BibTeX entry: cite-key missing"
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
116
133
|
def on_error(tid, val, vstack)
|
117
134
|
message =
|
118
135
|
"Failed to parse BibTeX on value #{val.inspect} (#{token_to_str(tid) || '?'}) #{ vstack.inspect}"
|
data/lib/bibtex/lexer.rb
CHANGED
@@ -34,30 +34,33 @@ module BibTeX
|
|
34
34
|
@defaults = {
|
35
35
|
:include => [:errors],
|
36
36
|
:strict => true,
|
37
|
+
:allow_missing_keys => false,
|
37
38
|
:strip => true
|
38
39
|
}.freeze
|
39
40
|
|
40
41
|
# Patterns Cache (#37: MacRuby does not cache regular expressions)
|
41
42
|
@patterns = {
|
42
|
-
:space
|
43
|
-
:lbrace
|
44
|
-
:rbrace
|
45
|
-
:braces
|
46
|
-
:eq
|
47
|
-
:comma
|
48
|
-
:number
|
49
|
-
:name
|
50
|
-
:quote
|
51
|
-
:unquote
|
52
|
-
:sharp
|
53
|
-
:object
|
54
|
-
:period
|
55
|
-
:strict_next
|
56
|
-
:next
|
57
|
-
:entry
|
58
|
-
:string
|
59
|
-
:comment
|
60
|
-
:preamble
|
43
|
+
:space => /[\s]+/o,
|
44
|
+
:lbrace => /\s*\{/o,
|
45
|
+
:rbrace => /\s*\}\s*/o,
|
46
|
+
:braces => /\{|\}/o,
|
47
|
+
:eq => /\s*=\s*/o,
|
48
|
+
:comma => /\s*,\s*/o,
|
49
|
+
:number => /\d+/o,
|
50
|
+
:name => /[[:alpha:]\d\/:_!$\?\.%&\*-]+/io,
|
51
|
+
:quote => /\s*"/o,
|
52
|
+
:unquote => /[\{\}"]/o,
|
53
|
+
:sharp => /\s*#\s*/o,
|
54
|
+
:object => /@/o,
|
55
|
+
:period => /./o,
|
56
|
+
:strict_next => /@[\t ]*/o,
|
57
|
+
:next => /(^|\n)[\t ]*@[\t ]*/o,
|
58
|
+
:entry => /[a-z\d:_!\.$%&*-]+/io,
|
59
|
+
:string => /string/io,
|
60
|
+
:comment => /comment/io,
|
61
|
+
:preamble => /preamble/io,
|
62
|
+
:key => /[[:alpha:]\d \/:_!$\?\.%&\*-]+,/io,
|
63
|
+
:optional_key => /[[:alpha:]\d \/:_!$\?\.%&\*-]+*,/io
|
61
64
|
}.freeze
|
62
65
|
|
63
66
|
MODE = Hash.new(:meta).merge({
|
@@ -127,7 +130,13 @@ module BibTeX
|
|
127
130
|
end
|
128
131
|
|
129
132
|
# Returns true if the lexer is currently in strict mode.
|
130
|
-
def strict
|
133
|
+
def strict?
|
134
|
+
!!@options[:strict]
|
135
|
+
end
|
136
|
+
|
137
|
+
def allow_missing_keys?
|
138
|
+
!!@options[:allow_missing_keys]
|
139
|
+
end
|
131
140
|
|
132
141
|
def strip_line_breaks?
|
133
142
|
!!options[:strip] && !active?(:comment)
|
@@ -174,7 +183,6 @@ module BibTeX
|
|
174
183
|
|
175
184
|
def parse_bibtex
|
176
185
|
case
|
177
|
-
when @scanner.scan(Lexer.patterns[:space])
|
178
186
|
when @scanner.scan(Lexer.patterns[:lbrace])
|
179
187
|
@brace_level += 1
|
180
188
|
push([:LBRACE,'{'])
|
@@ -198,6 +206,8 @@ module BibTeX
|
|
198
206
|
push([:SHARP,'#'])
|
199
207
|
when @scanner.scan(Lexer.patterns[:object])
|
200
208
|
enter_object
|
209
|
+
when @scanner.scan(Lexer.patterns[:space])
|
210
|
+
# skip
|
201
211
|
when @scanner.scan(Lexer.patterns[:period])
|
202
212
|
error_unexpected_token
|
203
213
|
end
|
@@ -290,9 +300,21 @@ module BibTeX
|
|
290
300
|
when @scanner.scan(Lexer.patterns[:entry])
|
291
301
|
@mode = @active_object = :entry
|
292
302
|
push [:NAME, @scanner.matched]
|
303
|
+
|
304
|
+
# TODO: DRY - try to parse key
|
305
|
+
if @scanner.scan(Lexer.patterns[:lbrace])
|
306
|
+
@brace_level += 1
|
307
|
+
push([:LBRACE,'{'])
|
308
|
+
@mode = :content if @brace_level > 1 || @brace_level == 1 && active?(:comment)
|
309
|
+
|
310
|
+
if @scanner.scan(Lexer.patterns[allow_missing_keys? ? :optional_key : :key])
|
311
|
+
push [:KEY, @scanner.matched.chop.strip]
|
312
|
+
end
|
313
|
+
end
|
314
|
+
|
293
315
|
else
|
294
316
|
error_unexpected_object
|
295
|
-
end
|
317
|
+
end
|
296
318
|
end
|
297
319
|
|
298
320
|
# Called when parser leaves a BibTeX object.
|
data/lib/bibtex/parser.rb
CHANGED
@@ -11,33 +11,51 @@ require 'bibtex/lexer'
|
|
11
11
|
module BibTeX
|
12
12
|
class Parser < Racc::Parser
|
13
13
|
|
14
|
-
module_eval(<<'...end bibtex.y/module_eval...', 'bibtex.y',
|
14
|
+
module_eval(<<'...end bibtex.y/module_eval...', 'bibtex.y', 89)
|
15
15
|
|
16
16
|
attr_reader :lexer, :options
|
17
17
|
|
18
|
-
|
18
|
+
@defaults = {
|
19
|
+
:include => [:errors],
|
20
|
+
:allow_missing_keys => false,
|
21
|
+
:debug => false
|
22
|
+
}.freeze
|
23
|
+
|
24
|
+
class << self
|
25
|
+
attr_reader :defaults
|
26
|
+
end
|
19
27
|
|
20
28
|
def initialize(options = {})
|
21
|
-
@options =
|
29
|
+
@options = Parser.defaults.merge(options)
|
22
30
|
@lexer = Lexer.new(@options)
|
23
31
|
end
|
24
32
|
|
25
33
|
def parse(input)
|
26
34
|
@yydebug = debug?
|
27
|
-
|
28
|
-
|
35
|
+
|
36
|
+
lexer.analyse(input)
|
29
37
|
do_parse
|
30
38
|
#yyparse(@lexer,:each)
|
31
39
|
end
|
32
40
|
|
33
41
|
def next_token
|
34
|
-
|
42
|
+
lexer.next_token
|
35
43
|
end
|
36
44
|
|
37
45
|
def debug?
|
38
|
-
|
46
|
+
options[:debug] || ENV['DEBUG']
|
47
|
+
end
|
48
|
+
|
49
|
+
def allow_missing_keys?
|
50
|
+
options[:allow_missing_keys]
|
51
|
+
end
|
52
|
+
|
53
|
+
def missing_key
|
54
|
+
unless allow_missing_keys?
|
55
|
+
raise ParseError, "Failed to parse BibTeX entry: cite-key missing"
|
56
|
+
end
|
39
57
|
end
|
40
|
-
|
58
|
+
|
41
59
|
def on_error(tid, val, vstack)
|
42
60
|
message =
|
43
61
|
"Failed to parse BibTeX on value #{val.inspect} (#{token_to_str(tid) || '?'}) #{ vstack.inspect}"
|
@@ -51,50 +69,48 @@ module_eval(<<'...end bibtex.y/module_eval...', 'bibtex.y', 90)
|
|
51
69
|
##### State transition tables begin ###
|
52
70
|
|
53
71
|
racc_action_table = [
|
54
|
-
14, 33, 38,
|
55
|
-
|
56
|
-
4, 4, 34, 34, 6, 6, 26, 5,
|
57
|
-
|
58
|
-
47,
|
59
|
-
45 ]
|
72
|
+
14, 33, 38, 26, 32, 33, 24, 18, 32, 15,
|
73
|
+
34, 39, 16, 37, 34, 33, 33, 36, 32, 32,
|
74
|
+
52, 27, 4, 4, 34, 34, 6, 6, 26, 5,
|
75
|
+
5, 48, 43, 44, 29, 41, 42, 22, 29, 46,
|
76
|
+
47, 21, 20, 19, 54, 7, 44, 44 ]
|
60
77
|
|
61
78
|
racc_action_check = [
|
62
|
-
4, 21, 23, 21,
|
63
|
-
|
64
|
-
0, 2,
|
65
|
-
38, 30, 30,
|
66
|
-
|
67
|
-
58 ]
|
79
|
+
4, 21, 23, 17, 21, 47, 17, 4, 47, 4,
|
80
|
+
21, 26, 4, 23, 47, 44, 39, 22, 44, 39,
|
81
|
+
39, 18, 0, 2, 44, 39, 0, 2, 38, 0,
|
82
|
+
2, 38, 30, 30, 20, 27, 28, 16, 33, 35,
|
83
|
+
36, 15, 14, 7, 45, 1, 50, 55 ]
|
68
84
|
|
69
85
|
racc_action_pointer = [
|
70
|
-
|
71
|
-
nil, nil, nil, nil,
|
72
|
-
|
73
|
-
18, nil, nil,
|
74
|
-
|
75
|
-
|
86
|
+
20, 45, 21, nil, -4, nil, nil, 43, nil, nil,
|
87
|
+
nil, nil, nil, nil, 34, 33, 29, -8, 13, nil,
|
88
|
+
29, -7, 6, -1, nil, nil, 4, 25, 22, nil,
|
89
|
+
18, nil, nil, 33, nil, 25, 33, nil, 17, 8,
|
90
|
+
nil, nil, nil, nil, 7, 30, nil, -3, nil, nil,
|
91
|
+
31, nil, nil, nil, nil, 32 ]
|
76
92
|
|
77
93
|
racc_action_default = [
|
78
|
-
-1, -
|
79
|
-
-8, -9, -10, -11, -
|
80
|
-
-13, -
|
81
|
-
-
|
82
|
-
-
|
83
|
-
-
|
94
|
+
-1, -34, -2, -3, -34, -6, -7, -34, -4, -5,
|
95
|
+
-8, -9, -10, -11, -34, -34, -34, -34, -34, 56,
|
96
|
+
-13, -34, -34, -34, -25, -29, -34, -27, -34, -14,
|
97
|
+
-34, -18, -20, -13, -22, -34, -34, -23, -34, -34,
|
98
|
+
-26, -28, -12, -15, -34, -34, -16, -34, -24, -30,
|
99
|
+
-32, -31, -33, -19, -21, -17 ]
|
84
100
|
|
85
101
|
racc_goto_table = [
|
86
102
|
30, 25, 28, 3, 1, 8, 11, 12, 13, 10,
|
87
|
-
9, 35,
|
88
|
-
nil, nil,
|
103
|
+
9, 35, 53, 17, 23, 45, 40, 2, 50, 51,
|
104
|
+
nil, nil, 49, nil, nil, nil, 55 ]
|
89
105
|
|
90
106
|
racc_goto_check = [
|
91
107
|
10, 16, 9, 3, 1, 3, 6, 7, 8, 5,
|
92
108
|
4, 11, 12, 13, 14, 9, 15, 2, 10, 17,
|
93
|
-
nil, nil, 16, nil, nil, nil,
|
109
|
+
nil, nil, 16, nil, nil, nil, 10 ]
|
94
110
|
|
95
111
|
racc_goto_pointer = [
|
96
112
|
nil, 4, 17, 3, 6, 5, 2, 3, 4, -18,
|
97
|
-
-21, -11, -
|
113
|
+
-21, -11, -32, 9, -3, -11, -16, -20 ]
|
98
114
|
|
99
115
|
racc_goto_default = [
|
100
116
|
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
@@ -102,44 +118,43 @@ racc_goto_default = [
|
|
102
118
|
|
103
119
|
racc_reduce_table = [
|
104
120
|
0, 0, :racc_error,
|
105
|
-
0,
|
106
|
-
1,
|
107
|
-
1,
|
108
|
-
2,
|
109
|
-
2,
|
110
|
-
1,
|
111
|
-
1,
|
112
|
-
1,
|
113
|
-
1,
|
114
|
-
1,
|
115
|
-
1,
|
116
|
-
4,
|
117
|
-
0,
|
118
|
-
1,
|
119
|
-
4,
|
120
|
-
4,
|
121
|
-
3,
|
122
|
-
1,
|
123
|
-
3,
|
124
|
-
1,
|
125
|
-
3,
|
126
|
-
1,
|
127
|
-
3,
|
128
|
-
4,
|
129
|
-
2,
|
130
|
-
|
131
|
-
|
132
|
-
1,
|
133
|
-
|
134
|
-
|
135
|
-
3,
|
136
|
-
|
137
|
-
1,
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
racc_shift_n = 59
|
121
|
+
0, 19, :_reduce_1,
|
122
|
+
1, 19, :_reduce_2,
|
123
|
+
1, 20, :_reduce_3,
|
124
|
+
2, 20, :_reduce_4,
|
125
|
+
2, 21, :_reduce_5,
|
126
|
+
1, 21, :_reduce_6,
|
127
|
+
1, 21, :_reduce_7,
|
128
|
+
1, 22, :_reduce_8,
|
129
|
+
1, 22, :_reduce_9,
|
130
|
+
1, 22, :_reduce_10,
|
131
|
+
1, 22, :_reduce_11,
|
132
|
+
4, 23, :_reduce_12,
|
133
|
+
0, 27, :_reduce_13,
|
134
|
+
1, 27, :_reduce_14,
|
135
|
+
4, 25, :_reduce_15,
|
136
|
+
4, 24, :_reduce_16,
|
137
|
+
3, 29, :_reduce_17,
|
138
|
+
1, 28, :_reduce_18,
|
139
|
+
3, 28, :_reduce_19,
|
140
|
+
1, 30, :_reduce_20,
|
141
|
+
3, 30, :_reduce_21,
|
142
|
+
1, 30, :_reduce_22,
|
143
|
+
3, 26, :_reduce_23,
|
144
|
+
4, 26, :_reduce_24,
|
145
|
+
2, 26, :_reduce_25,
|
146
|
+
3, 31, :_reduce_26,
|
147
|
+
0, 33, :_reduce_27,
|
148
|
+
1, 33, :_reduce_none,
|
149
|
+
1, 32, :_reduce_29,
|
150
|
+
3, 32, :_reduce_30,
|
151
|
+
3, 34, :_reduce_31,
|
152
|
+
1, 35, :_reduce_32,
|
153
|
+
1, 35, :_reduce_33 ]
|
154
|
+
|
155
|
+
racc_reduce_n = 34
|
156
|
+
|
157
|
+
racc_shift_n = 56
|
143
158
|
|
144
159
|
racc_token_table = {
|
145
160
|
false => 0,
|
@@ -152,15 +167,16 @@ racc_token_table = {
|
|
152
167
|
:EQ => 7,
|
153
168
|
:LBRACE => 8,
|
154
169
|
:META_CONTENT => 9,
|
155
|
-
:
|
156
|
-
:
|
157
|
-
:
|
158
|
-
:
|
159
|
-
:
|
160
|
-
:
|
161
|
-
:
|
170
|
+
:KEY => 10,
|
171
|
+
:NAME => 11,
|
172
|
+
:NUMBER => 12,
|
173
|
+
:PREAMBLE => 13,
|
174
|
+
:RBRACE => 14,
|
175
|
+
:SHARP => 15,
|
176
|
+
:STRING => 16,
|
177
|
+
:STRING_LITERAL => 17 }
|
162
178
|
|
163
|
-
racc_nt_base =
|
179
|
+
racc_nt_base = 18
|
164
180
|
|
165
181
|
racc_use_result_var = true
|
166
182
|
|
@@ -191,6 +207,7 @@ Racc_token_to_s_table = [
|
|
191
207
|
"EQ",
|
192
208
|
"LBRACE",
|
193
209
|
"META_CONTENT",
|
210
|
+
"KEY",
|
194
211
|
"NAME",
|
195
212
|
"NUMBER",
|
196
213
|
"PREAMBLE",
|
@@ -213,7 +230,7 @@ Racc_token_to_s_table = [
|
|
213
230
|
"string_literal",
|
214
231
|
"entry_head",
|
215
232
|
"assignments",
|
216
|
-
"
|
233
|
+
"opt_key",
|
217
234
|
"assignment",
|
218
235
|
"value" ]
|
219
236
|
|
@@ -407,42 +424,37 @@ module_eval(<<'.,.,', 'bibtex.y', 69)
|
|
407
424
|
|
408
425
|
module_eval(<<'.,.,', 'bibtex.y', 71)
|
409
426
|
def _reduce_27(val, _values, result)
|
410
|
-
|
427
|
+
missing_key
|
411
428
|
result
|
412
429
|
end
|
413
430
|
.,.,
|
414
431
|
|
415
|
-
|
416
|
-
def _reduce_28(val, _values, result)
|
417
|
-
result = val[0]
|
418
|
-
result
|
419
|
-
end
|
420
|
-
.,.,
|
432
|
+
# reduce 28 omitted
|
421
433
|
|
422
|
-
module_eval(<<'.,.,', 'bibtex.y',
|
434
|
+
module_eval(<<'.,.,', 'bibtex.y', 74)
|
423
435
|
def _reduce_29(val, _values, result)
|
424
|
-
result = val[0
|
436
|
+
result = val[0]
|
425
437
|
result
|
426
438
|
end
|
427
439
|
.,.,
|
428
440
|
|
429
441
|
module_eval(<<'.,.,', 'bibtex.y', 75)
|
430
442
|
def _reduce_30(val, _values, result)
|
431
|
-
result
|
443
|
+
result.merge!(val[2])
|
432
444
|
result
|
433
445
|
end
|
434
446
|
.,.,
|
435
447
|
|
436
|
-
module_eval(<<'.,.,', 'bibtex.y',
|
448
|
+
module_eval(<<'.,.,', 'bibtex.y', 77)
|
437
449
|
def _reduce_31(val, _values, result)
|
438
|
-
result.
|
450
|
+
result = { val[0].downcase.to_sym => val[2] }
|
439
451
|
result
|
440
452
|
end
|
441
453
|
.,.,
|
442
454
|
|
443
|
-
module_eval(<<'.,.,', 'bibtex.y',
|
455
|
+
module_eval(<<'.,.,', 'bibtex.y', 79)
|
444
456
|
def _reduce_32(val, _values, result)
|
445
|
-
result =
|
457
|
+
result = val[0]
|
446
458
|
result
|
447
459
|
end
|
448
460
|
.,.,
|
@@ -454,13 +466,6 @@ module_eval(<<'.,.,', 'bibtex.y', 80)
|
|
454
466
|
end
|
455
467
|
.,.,
|
456
468
|
|
457
|
-
module_eval(<<'.,.,', 'bibtex.y', 81)
|
458
|
-
def _reduce_34(val, _values, result)
|
459
|
-
result = val[0]
|
460
|
-
result
|
461
|
-
end
|
462
|
-
.,.,
|
463
|
-
|
464
469
|
def _reduce_none(val, _values, result)
|
465
470
|
val[0]
|
466
471
|
end
|
data/lib/bibtex/version.rb
CHANGED
data/test/bibtex/test_lexer.rb
CHANGED
data/test/bibtex/test_parser.rb
CHANGED
@@ -40,44 +40,58 @@ module BibTeX
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
|
44
|
-
|
43
|
+
describe 'key parsing' do
|
44
|
+
it 'handles whitespace in keys' do
|
45
45
|
input = "@Misc{George Martin06,title = {FEAST FOR CROWS}}"
|
46
46
|
bib = Parser.new(:debug => false, :strict => false).parse(input)
|
47
47
|
assert_equal "George Martin06", bib.first.key
|
48
48
|
assert bib[:"George Martin06"]
|
49
49
|
end
|
50
|
+
|
51
|
+
it 'fails when there is no cite-key' do
|
52
|
+
input = "@misc{title = {Crime and Punishment}}"
|
53
|
+
assert_raises ParseError do
|
54
|
+
Parser.new(:debug => false, :strict => false).parse(input)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'tolerates missing key with :allow_missing_keys set' do
|
59
|
+
input = "@misc{title = {Crime and Punishment}}"
|
60
|
+
assert_equal :misc, Parser.new({
|
61
|
+
:debug => false, :strict => false, :allow_missing_keys => true
|
62
|
+
}).parse(input)[0].type
|
63
|
+
end
|
50
64
|
end
|
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
|
-
|
65
|
+
|
66
|
+
describe 'backslashes and escape sequences' do
|
67
|
+
|
68
|
+
it 'leaves backslashes intact' do
|
69
|
+
Parser.new.parse(%q(@misc{key, title = "a backslash: \"}))[0].title.must_be :==, 'a backslash: \\'
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'parses LaTeX escaped quotes {"}' do
|
73
|
+
Parser.new.parse(%q(@misc{key, title = "{"}"}))[0].title.must_be :==, '{"}'
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'parses complex LaTeX markup' do
|
77
|
+
b = Parser.new.parse(<<-END)[0]
|
78
|
+
@book{proust_1996,
|
79
|
+
address = {Paris},
|
80
|
+
author = {Proust, Jo\\"{e}lle},
|
81
|
+
booktitle = {Perception et Intermodalit\\'{e}: Approches Actuelles De La Question De Molyneux},
|
82
|
+
editor = {Proust, Jo\\"{e}lle},
|
83
|
+
keywords = {Perception; Molyneux's Problem},
|
84
|
+
publisher = {Presses Universitaires de France},
|
85
|
+
title = {Perception et Intermodalit\\'{e}: Approches Actuelles De La Question De Molyneux},
|
86
|
+
year = {1996}
|
87
|
+
}
|
88
|
+
END
|
89
|
+
b.booktitle.must_be :==, "Perception et Intermodalit\\'{e}: Approches Actuelles De La Question De Molyneux"
|
90
|
+
b.editor.must_be :==, 'Proust, Jo\"{e}lle'
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
81
95
|
describe 'given a set of explicit and implicit comments' do
|
82
96
|
before do
|
83
97
|
@bib = Parser.new(:debug => false, :include => [:meta_content]).parse(File.read(Test.fixtures(:comment)))
|
@@ -129,26 +143,26 @@ module BibTeX
|
|
129
143
|
|
130
144
|
end
|
131
145
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
146
|
+
describe 'given an entry with missing commas between fields' do
|
147
|
+
before do
|
148
|
+
@level = BibTeX.log.level
|
149
|
+
BibTeX.log.level = Logger::FATAL
|
150
|
+
end
|
151
|
+
|
152
|
+
after do
|
153
|
+
BibTeX.log.level = @level
|
154
|
+
end
|
155
|
+
|
156
|
+
it 'raises a parser error' do
|
157
|
+
lambda {
|
158
|
+
Parser.new.parse <<-END
|
159
|
+
@book{book1,
|
160
|
+
title = "Parse error because"
|
161
|
+
author = "comma missing between title and author"
|
162
|
+
}
|
163
|
+
END
|
164
|
+
}.must_raise(ParseError)
|
165
|
+
end
|
166
|
+
end
|
153
167
|
end
|
154
168
|
end
|
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.11
|
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: 2012-05-
|
12
|
+
date: 2012-05-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: latex-decode
|
16
|
-
requirement: &
|
16
|
+
requirement: &70315022871540 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.0.6
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70315022871540
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: multi_json
|
27
|
-
requirement: &
|
27
|
+
requirement: &70315022871020 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '1.3'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70315022871020
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rake
|
38
|
-
requirement: &
|
38
|
+
requirement: &70315022870540 !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: *70315022870540
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: racc
|
49
|
-
requirement: &
|
49
|
+
requirement: &70315022870060 !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: *70315022870060
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rdoc
|
60
|
-
requirement: &
|
60
|
+
requirement: &70315022869580 !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: *70315022869580
|
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
|
@@ -180,18 +180,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
180
180
|
- - ! '>='
|
181
181
|
- !ruby/object:Gem::Version
|
182
182
|
version: '0'
|
183
|
-
segments:
|
184
|
-
- 0
|
185
|
-
hash: -1420866145453124737
|
186
183
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
187
184
|
none: false
|
188
185
|
requirements:
|
189
186
|
- - ! '>='
|
190
187
|
- !ruby/object:Gem::Version
|
191
188
|
version: '0'
|
192
|
-
segments:
|
193
|
-
- 0
|
194
|
-
hash: -1420866145453124737
|
195
189
|
requirements: []
|
196
190
|
rubyforge_project:
|
197
191
|
rubygems_version: 1.8.10
|
@@ -212,3 +206,4 @@ test_files:
|
|
212
206
|
- test/bibtex/test_value.rb
|
213
207
|
- test/test_bibtex.rb
|
214
208
|
- test/test_export.rb
|
209
|
+
has_rdoc:
|