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.
@@ -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
@@ -16,7 +16,7 @@ module Hemingway
16
16
  elements[0]
17
17
  end
18
18
 
19
- def symbol
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
- r2 = _nt_symbol
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
- r3 = _nt_math_end
47
- s0 << r3
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
- symbol.html
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
+ "&deg;"
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
- @index = i2
111
- r2 = nil
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
@@ -1,7 +1,11 @@
1
1
  module Hemingway
2
- module SpecialNode
3
- def html
4
- character.text_value
5
- end
6
- end
2
+ module SpecialNode
3
+ def html
4
+ if character.text_value == "textbackslash{}"
5
+ "\\"
6
+ else
7
+ character.text_value
8
+ end
9
+ end
10
+ end
7
11
  end
@@ -408,8 +408,20 @@ module Hemingway
408
408
  r0 = r35
409
409
  r0.extend(SymbolNode)
410
410
  else
411
- @index = i0
412
- r0 = nil
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
@@ -39,7 +39,8 @@ module Hemingway
39
39
  "\\phi" /
40
40
  "\\chi" /
41
41
  "\\psi" /
42
- "\\omega"
42
+ "\\omega" /
43
+ "\\rightarrow"
43
44
  ) <SymbolNode>
44
45
  end
45
46
 
@@ -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
- @index = i0
253
- r0 = nil
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)