hemingway 0.0.2 → 0.0.3
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 +4 -4
- data/README.md +17 -0
- data/lib/hemingway/block/block.rb +222 -121
- data/lib/hemingway/block/block.treetop +6 -3
- data/lib/hemingway/block/center/center.rb +134 -0
- data/lib/hemingway/block/center/center.treetop +17 -0
- data/lib/hemingway/block/center/center_nodes.rb +17 -0
- data/lib/hemingway/block/list/list.rb +30 -25
- data/lib/hemingway/block/list/list.treetop +1 -1
- data/lib/hemingway/build.rb +104 -6
- data/lib/hemingway/latex.rb +82 -15
- data/lib/hemingway/latex.treetop +4 -4
- data/lib/hemingway/latex_nodes.rb +16 -0
- data/lib/hemingway/math/math.rb +88 -4
- data/lib/hemingway/math/math.treetop +5 -1
- data/lib/hemingway/math/math_nodes.rb +14 -1
- data/lib/hemingway/special/special.rb +13 -2
- data/lib/hemingway/special/special.treetop +1 -1
- data/lib/hemingway/special/special_nodes.rb +9 -5
- data/lib/hemingway/symbol/symbol.rb +14 -2
- data/lib/hemingway/symbol/symbol.treetop +2 -1
- data/lib/hemingway/tag/tag.rb +162 -2
- data/lib/hemingway/tag/tag.treetop +6 -0
- data/lib/hemingway/tag/tag_nodes.rb +6 -0
- data/lib/hemingway/version.rb +1 -1
- data/spec/build_spec.rb +17 -0
- data/spec/nodes/block/center_spec.rb +27 -0
- data/spec/nodes/block/list_spec.rb +5 -0
- data/spec/nodes/block_spec.rb +5 -1
- data/spec/nodes/math_spec.rb +10 -0
- data/spec/nodes/special_spec.rb +6 -0
- data/spec/nodes/tag_spec.rb +9 -0
- metadata +7 -2
data/lib/hemingway/latex.treetop
CHANGED
@@ -34,7 +34,7 @@ module Hemingway
|
|
34
34
|
# have to dig past to get at the list. elements[0] refers to the array of
|
35
35
|
# tags or texts here.
|
36
36
|
rule paragraph
|
37
|
-
sequence:( content / footnote )* eop <ParagraphNode>
|
37
|
+
sequence:( content / footnote / !eop newline )* eop <ParagraphNode>
|
38
38
|
end
|
39
39
|
|
40
40
|
# The last paragraph in an entry need not end with \n\n. Because this
|
@@ -43,7 +43,7 @@ module Hemingway
|
|
43
43
|
# to consume. The only time I can imagine this happening would be at
|
44
44
|
# the end of an entry.
|
45
45
|
rule last_paragraph
|
46
|
-
sequence:( content / footnote )+ eop? <ParagraphNode>
|
46
|
+
sequence:( content / footnote / !eop newline )+ eop? <ParagraphNode>
|
47
47
|
end
|
48
48
|
|
49
49
|
# Example: \tag{text} or just text or $\Delta$
|
@@ -58,7 +58,7 @@ module Hemingway
|
|
58
58
|
|
59
59
|
# Treetop does not separate lexing from parsing. Must consume all input.
|
60
60
|
rule whitespace
|
61
|
-
( " " / newline )
|
61
|
+
( " " / newline )+ <WhitespaceNode>
|
62
62
|
end
|
63
63
|
|
64
64
|
rule spaces
|
@@ -74,7 +74,7 @@ module Hemingway
|
|
74
74
|
end
|
75
75
|
|
76
76
|
rule newline
|
77
|
-
"\n"
|
77
|
+
"\n" <NewlineNode>
|
78
78
|
end
|
79
79
|
|
80
80
|
end
|
@@ -22,6 +22,8 @@ module Hemingway
|
|
22
22
|
if element.respond_to?(:footnote_html)
|
23
23
|
footnote_seed += 1
|
24
24
|
element.html(footnote_seed)
|
25
|
+
elsif element.respond_to?(:newline)
|
26
|
+
element.newline.html
|
25
27
|
else
|
26
28
|
element.html
|
27
29
|
end
|
@@ -40,6 +42,20 @@ module Hemingway
|
|
40
42
|
end
|
41
43
|
end
|
42
44
|
end
|
45
|
+
end
|
46
|
+
|
47
|
+
module NewlineNode
|
48
|
+
def html
|
49
|
+
end
|
50
|
+
|
51
|
+
def visible_html
|
52
|
+
"\n"
|
53
|
+
end
|
54
|
+
end
|
43
55
|
|
56
|
+
module WhitespaceNode
|
57
|
+
def html
|
58
|
+
end
|
44
59
|
end
|
60
|
+
|
45
61
|
end
|
data/lib/hemingway/math/math.rb
CHANGED
@@ -16,7 +16,7 @@ module Hemingway
|
|
16
16
|
elements[0]
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
19
|
+
def content
|
20
20
|
elements[1]
|
21
21
|
end
|
22
22
|
|
@@ -40,11 +40,23 @@ module Hemingway
|
|
40
40
|
r1 = _nt_math_start
|
41
41
|
s0 << r1
|
42
42
|
if r1
|
43
|
-
|
43
|
+
i2 = index
|
44
|
+
r3 = _nt_symbol
|
45
|
+
if r3
|
46
|
+
r2 = r3
|
47
|
+
else
|
48
|
+
r4 = _nt_exponent
|
49
|
+
if r4
|
50
|
+
r2 = r4
|
51
|
+
else
|
52
|
+
@index = i2
|
53
|
+
r2 = nil
|
54
|
+
end
|
55
|
+
end
|
44
56
|
s0 << r2
|
45
57
|
if r2
|
46
|
-
|
47
|
-
s0 <<
|
58
|
+
r5 = _nt_math_end
|
59
|
+
s0 << r5
|
48
60
|
end
|
49
61
|
end
|
50
62
|
if s0.last
|
@@ -78,6 +90,78 @@ module Hemingway
|
|
78
90
|
r0
|
79
91
|
end
|
80
92
|
|
93
|
+
module Exponent0
|
94
|
+
def value
|
95
|
+
elements[1]
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
def _nt_exponent
|
101
|
+
start_index = index
|
102
|
+
if node_cache[:exponent].has_key?(index)
|
103
|
+
cached = node_cache[:exponent][index]
|
104
|
+
if cached
|
105
|
+
cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
|
106
|
+
@index = cached.interval.end
|
107
|
+
end
|
108
|
+
return cached
|
109
|
+
end
|
110
|
+
|
111
|
+
i0, s0 = index, []
|
112
|
+
if has_terminal?("^{", false, index)
|
113
|
+
r1 = instantiate_node(SyntaxNode,input, index...(index + 2))
|
114
|
+
@index += 2
|
115
|
+
else
|
116
|
+
terminal_parse_failure("^{")
|
117
|
+
r1 = nil
|
118
|
+
end
|
119
|
+
s0 << r1
|
120
|
+
if r1
|
121
|
+
i2 = index
|
122
|
+
if has_terminal?("\\circ", false, index)
|
123
|
+
r3 = instantiate_node(SyntaxNode,input, index...(index + 5))
|
124
|
+
@index += 5
|
125
|
+
else
|
126
|
+
terminal_parse_failure("\\circ")
|
127
|
+
r3 = nil
|
128
|
+
end
|
129
|
+
if r3
|
130
|
+
r2 = r3
|
131
|
+
else
|
132
|
+
r4 = _nt_text
|
133
|
+
if r4
|
134
|
+
r2 = r4
|
135
|
+
else
|
136
|
+
@index = i2
|
137
|
+
r2 = nil
|
138
|
+
end
|
139
|
+
end
|
140
|
+
s0 << r2
|
141
|
+
if r2
|
142
|
+
if has_terminal?("}", false, index)
|
143
|
+
r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
144
|
+
@index += 1
|
145
|
+
else
|
146
|
+
terminal_parse_failure("}")
|
147
|
+
r5 = nil
|
148
|
+
end
|
149
|
+
s0 << r5
|
150
|
+
end
|
151
|
+
end
|
152
|
+
if s0.last
|
153
|
+
r0 = instantiate_node(ExponentNode,input, i0...index, s0)
|
154
|
+
r0.extend(Exponent0)
|
155
|
+
else
|
156
|
+
@index = i0
|
157
|
+
r0 = nil
|
158
|
+
end
|
159
|
+
|
160
|
+
node_cache[:exponent][start_index] = r0
|
161
|
+
|
162
|
+
r0
|
163
|
+
end
|
164
|
+
|
81
165
|
def _nt_math_start
|
82
166
|
start_index = index
|
83
167
|
if node_cache[:math_start].has_key?(index)
|
@@ -5,7 +5,7 @@ module Hemingway
|
|
5
5
|
|
6
6
|
# Example: $ \Pi = 3.14159 $
|
7
7
|
rule math
|
8
|
-
math_start symbol math_end <MathNode>
|
8
|
+
math_start content:( symbol / exponent ) math_end <MathNode>
|
9
9
|
end
|
10
10
|
|
11
11
|
# Example : \Pi
|
@@ -17,6 +17,10 @@ module Hemingway
|
|
17
17
|
math_symbol
|
18
18
|
end
|
19
19
|
|
20
|
+
rule exponent
|
21
|
+
"^{" value:( "\\circ" / text ) "}" <ExponentNode>
|
22
|
+
end
|
23
|
+
|
20
24
|
rule math_start
|
21
25
|
"$"
|
22
26
|
end
|
@@ -1,7 +1,20 @@
|
|
1
1
|
module Hemingway
|
2
2
|
module MathNode
|
3
3
|
def html
|
4
|
-
|
4
|
+
content.html
|
5
5
|
end
|
6
6
|
end
|
7
|
+
|
8
|
+
module ExponentNode
|
9
|
+
def html
|
10
|
+
# Pretty bad hack, but I figure it ain't a big deal until I want to
|
11
|
+
# support more rebust syntax.
|
12
|
+
if value.text_value == "\\circ"
|
13
|
+
"°"
|
14
|
+
else
|
15
|
+
Build.tag("sup", value.html)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
7
20
|
end
|
@@ -107,8 +107,19 @@ module Hemingway
|
|
107
107
|
if r9
|
108
108
|
r2 = r9
|
109
109
|
else
|
110
|
-
|
111
|
-
|
110
|
+
if has_terminal?("textbackslash{}", false, index)
|
111
|
+
r10 = instantiate_node(SyntaxNode,input, index...(index + 15))
|
112
|
+
@index += 15
|
113
|
+
else
|
114
|
+
terminal_parse_failure("textbackslash{}")
|
115
|
+
r10 = nil
|
116
|
+
end
|
117
|
+
if r10
|
118
|
+
r2 = r10
|
119
|
+
else
|
120
|
+
@index = i2
|
121
|
+
r2 = nil
|
122
|
+
end
|
112
123
|
end
|
113
124
|
end
|
114
125
|
end
|
@@ -6,7 +6,7 @@ module Hemingway
|
|
6
6
|
# Special characters that need to be escaped in Latex.
|
7
7
|
# Example: War \& Peace
|
8
8
|
rule special
|
9
|
-
escape character:( "#" / "$" / "%" / "&" / "_" / "{" / "}" ) <SpecialNode>
|
9
|
+
escape character:( "#" / "$" / "%" / "&" / "_" / "{" / "}" / "textbackslash{}" ) <SpecialNode>
|
10
10
|
end
|
11
11
|
|
12
12
|
rule escape
|
@@ -408,8 +408,20 @@ module Hemingway
|
|
408
408
|
r0 = r35
|
409
409
|
r0.extend(SymbolNode)
|
410
410
|
else
|
411
|
-
|
412
|
-
|
411
|
+
if has_terminal?("\\rightarrow", false, index)
|
412
|
+
r36 = instantiate_node(SyntaxNode,input, index...(index + 11))
|
413
|
+
@index += 11
|
414
|
+
else
|
415
|
+
terminal_parse_failure("\\rightarrow")
|
416
|
+
r36 = nil
|
417
|
+
end
|
418
|
+
if r36
|
419
|
+
r0 = r36
|
420
|
+
r0.extend(SymbolNode)
|
421
|
+
else
|
422
|
+
@index = i0
|
423
|
+
r0 = nil
|
424
|
+
end
|
413
425
|
end
|
414
426
|
end
|
415
427
|
end
|
data/lib/hemingway/tag/tag.rb
CHANGED
@@ -75,6 +75,21 @@ module Hemingway
|
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
|
+
module Tag5
|
79
|
+
def tag_start
|
80
|
+
elements[0]
|
81
|
+
end
|
82
|
+
|
83
|
+
def accent
|
84
|
+
elements[1]
|
85
|
+
end
|
86
|
+
|
87
|
+
def character
|
88
|
+
elements[3]
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
78
93
|
def _nt_tag
|
79
94
|
start_index = index
|
80
95
|
if node_cache[:tag].has_key?(index)
|
@@ -249,8 +264,56 @@ module Hemingway
|
|
249
264
|
if r23
|
250
265
|
r0 = r23
|
251
266
|
else
|
252
|
-
|
253
|
-
|
267
|
+
i26, s26 = index, []
|
268
|
+
r27 = _nt_tag_start
|
269
|
+
s26 << r27
|
270
|
+
if r27
|
271
|
+
r28 = _nt_accent
|
272
|
+
s26 << r28
|
273
|
+
if r28
|
274
|
+
if has_terminal?("{", false, index)
|
275
|
+
r29 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
276
|
+
@index += 1
|
277
|
+
else
|
278
|
+
terminal_parse_failure("{")
|
279
|
+
r29 = nil
|
280
|
+
end
|
281
|
+
s26 << r29
|
282
|
+
if r29
|
283
|
+
if index < input_length
|
284
|
+
r30 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
285
|
+
@index += 1
|
286
|
+
else
|
287
|
+
terminal_parse_failure("any character")
|
288
|
+
r30 = nil
|
289
|
+
end
|
290
|
+
s26 << r30
|
291
|
+
if r30
|
292
|
+
if has_terminal?("}", false, index)
|
293
|
+
r31 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
294
|
+
@index += 1
|
295
|
+
else
|
296
|
+
terminal_parse_failure("}")
|
297
|
+
r31 = nil
|
298
|
+
end
|
299
|
+
s26 << r31
|
300
|
+
end
|
301
|
+
end
|
302
|
+
end
|
303
|
+
end
|
304
|
+
if s26.last
|
305
|
+
r26 = instantiate_node(AccentNode,input, i26...index, s26)
|
306
|
+
r26.extend(Tag5)
|
307
|
+
else
|
308
|
+
@index = i26
|
309
|
+
r26 = nil
|
310
|
+
end
|
311
|
+
if r26
|
312
|
+
r0 = r26
|
313
|
+
else
|
314
|
+
@index = i0
|
315
|
+
r0 = nil
|
316
|
+
end
|
254
317
|
end
|
255
318
|
end
|
256
319
|
end
|
@@ -481,6 +544,103 @@ module Hemingway
|
|
481
544
|
r0
|
482
545
|
end
|
483
546
|
|
547
|
+
def _nt_accent
|
548
|
+
start_index = index
|
549
|
+
if node_cache[:accent].has_key?(index)
|
550
|
+
cached = node_cache[:accent][index]
|
551
|
+
if cached
|
552
|
+
cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
|
553
|
+
@index = cached.interval.end
|
554
|
+
end
|
555
|
+
return cached
|
556
|
+
end
|
557
|
+
|
558
|
+
i0 = index
|
559
|
+
if has_terminal?('`', false, index)
|
560
|
+
r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
561
|
+
@index += 1
|
562
|
+
else
|
563
|
+
terminal_parse_failure('`')
|
564
|
+
r1 = nil
|
565
|
+
end
|
566
|
+
if r1
|
567
|
+
r0 = r1
|
568
|
+
else
|
569
|
+
if has_terminal?("'", false, index)
|
570
|
+
r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
571
|
+
@index += 1
|
572
|
+
else
|
573
|
+
terminal_parse_failure("'")
|
574
|
+
r2 = nil
|
575
|
+
end
|
576
|
+
if r2
|
577
|
+
r0 = r2
|
578
|
+
else
|
579
|
+
if has_terminal?('^', false, index)
|
580
|
+
r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
581
|
+
@index += 1
|
582
|
+
else
|
583
|
+
terminal_parse_failure('^')
|
584
|
+
r3 = nil
|
585
|
+
end
|
586
|
+
if r3
|
587
|
+
r0 = r3
|
588
|
+
else
|
589
|
+
if has_terminal?('"', false, index)
|
590
|
+
r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
591
|
+
@index += 1
|
592
|
+
else
|
593
|
+
terminal_parse_failure('"')
|
594
|
+
r4 = nil
|
595
|
+
end
|
596
|
+
if r4
|
597
|
+
r0 = r4
|
598
|
+
else
|
599
|
+
if has_terminal?("c", false, index)
|
600
|
+
r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
601
|
+
@index += 1
|
602
|
+
else
|
603
|
+
terminal_parse_failure("c")
|
604
|
+
r5 = nil
|
605
|
+
end
|
606
|
+
if r5
|
607
|
+
r0 = r5
|
608
|
+
else
|
609
|
+
if has_terminal?("~", false, index)
|
610
|
+
r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
611
|
+
@index += 1
|
612
|
+
else
|
613
|
+
terminal_parse_failure("~")
|
614
|
+
r6 = nil
|
615
|
+
end
|
616
|
+
if r6
|
617
|
+
r0 = r6
|
618
|
+
else
|
619
|
+
if has_terminal?("r", false, index)
|
620
|
+
r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
621
|
+
@index += 1
|
622
|
+
else
|
623
|
+
terminal_parse_failure("r")
|
624
|
+
r7 = nil
|
625
|
+
end
|
626
|
+
if r7
|
627
|
+
r0 = r7
|
628
|
+
else
|
629
|
+
@index = i0
|
630
|
+
r0 = nil
|
631
|
+
end
|
632
|
+
end
|
633
|
+
end
|
634
|
+
end
|
635
|
+
end
|
636
|
+
end
|
637
|
+
end
|
638
|
+
|
639
|
+
node_cache[:accent][start_index] = r0
|
640
|
+
|
641
|
+
r0
|
642
|
+
end
|
643
|
+
|
484
644
|
def _nt_tag_start
|
485
645
|
start_index = index
|
486
646
|
if node_cache[:tag_start].has_key?(index)
|