hemingway 0.0.0 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/.travis.yml +4 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +297 -0
- data/Rakefile +1 -0
- data/hemingway.gemspec +23 -0
- data/lib/hemingway/block/block.rb +378 -0
- data/lib/hemingway/block/block.treetop +36 -0
- data/lib/hemingway/block/block_nodes.rb +9 -0
- data/lib/hemingway/block/list/list.rb +412 -0
- data/lib/hemingway/block/list/list.treetop +51 -0
- data/lib/hemingway/block/list/list_nodes.rb +39 -0
- data/lib/hemingway/block/quote/quote.rb +192 -0
- data/lib/hemingway/block/quote/quote.treetop +27 -0
- data/lib/hemingway/block/quote/quote_nodes.rb +25 -0
- data/lib/hemingway/block/verbatim/verbatim.rb +159 -0
- data/lib/hemingway/block/verbatim/verbatim.treetop +21 -0
- data/lib/hemingway/block/verbatim/verbatim_nodes.rb +9 -0
- data/lib/hemingway/build.rb +65 -0
- data/lib/hemingway/footnote/footnote.rb +83 -0
- data/lib/hemingway/footnote/footnote.treetop +11 -0
- data/lib/hemingway/footnote/footnote_nodes.rb +21 -0
- data/lib/hemingway/latex.rb +409 -0
- data/lib/hemingway/latex.treetop +81 -0
- data/lib/hemingway/latex_nodes.rb +45 -0
- data/lib/hemingway/math/math.rb +135 -0
- data/lib/hemingway/math/math.treetop +29 -0
- data/lib/hemingway/math/math_nodes.rb +7 -0
- data/lib/hemingway/special/special.rb +164 -0
- data/lib/hemingway/special/special.treetop +17 -0
- data/lib/hemingway/special/special_nodes.rb +7 -0
- data/lib/hemingway/symbol/symbol.rb +460 -0
- data/lib/hemingway/symbol/symbol.treetop +47 -0
- data/lib/hemingway/symbol/symbol_nodes.rb +7 -0
- data/lib/hemingway/tag/tag.rb +538 -0
- data/lib/hemingway/tag/tag.treetop +63 -0
- data/lib/hemingway/tag/tag_nodes.rb +49 -0
- data/lib/hemingway/text/text.rb +121 -0
- data/lib/hemingway/text/text.treetop +35 -0
- data/lib/hemingway/text/text_nodes.rb +7 -0
- data/lib/hemingway/version.rb +3 -0
- data/lib/hemingway.rb +7 -0
- data/script/build +22 -0
- data/script/test +2 -0
- data/spec/build_spec.rb +65 -0
- data/spec/nodes/block/list_spec.rb +91 -0
- data/spec/nodes/block/quote_spec.rb +31 -0
- data/spec/nodes/block/verbatim_spec.rb +27 -0
- data/spec/nodes/block_spec.rb +21 -0
- data/spec/nodes/footnote_spec.rb +42 -0
- data/spec/nodes/math_spec.rb +31 -0
- data/spec/nodes/special_spec.rb +27 -0
- data/spec/nodes/tag_spec.rb +98 -0
- data/spec/parser_spec.rb +48 -0
- data/spec/spec_helper.rb +5 -0
- metadata +110 -18
@@ -0,0 +1,25 @@
|
|
1
|
+
module Hemingway
|
2
|
+
|
3
|
+
module QuoteNode
|
4
|
+
def html(block_content)
|
5
|
+
Build.tag("blockquote", block_content.html)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
module QuoteEntryNode
|
10
|
+
def html
|
11
|
+
elements.map { |e| e.html }.join
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
module QuoteParagraphNode
|
16
|
+
def html
|
17
|
+
paragraph_content = sequence.elements.map do |element|
|
18
|
+
element.html
|
19
|
+
end.join
|
20
|
+
|
21
|
+
Build.tag("p", paragraph_content)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,159 @@
|
|
1
|
+
# Autogenerated from a Treetop grammar. Edits may be lost.
|
2
|
+
|
3
|
+
|
4
|
+
require "hemingway/block/verbatim/verbatim_nodes"
|
5
|
+
|
6
|
+
module Hemingway
|
7
|
+
module Block
|
8
|
+
module Verbatim
|
9
|
+
include Treetop::Runtime
|
10
|
+
|
11
|
+
def root
|
12
|
+
@root ||= :verbatim
|
13
|
+
end
|
14
|
+
|
15
|
+
def _nt_verbatim
|
16
|
+
start_index = index
|
17
|
+
if node_cache[:verbatim].has_key?(index)
|
18
|
+
cached = node_cache[:verbatim][index]
|
19
|
+
if cached
|
20
|
+
cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
|
21
|
+
@index = cached.interval.end
|
22
|
+
end
|
23
|
+
return cached
|
24
|
+
end
|
25
|
+
|
26
|
+
r0 = _nt_verbatim_text
|
27
|
+
|
28
|
+
node_cache[:verbatim][start_index] = r0
|
29
|
+
|
30
|
+
r0
|
31
|
+
end
|
32
|
+
|
33
|
+
def _nt_verbatim_type
|
34
|
+
start_index = index
|
35
|
+
if node_cache[:verbatim_type].has_key?(index)
|
36
|
+
cached = node_cache[:verbatim_type][index]
|
37
|
+
if cached
|
38
|
+
cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
|
39
|
+
@index = cached.interval.end
|
40
|
+
end
|
41
|
+
return cached
|
42
|
+
end
|
43
|
+
|
44
|
+
if has_terminal?("verbatim", false, index)
|
45
|
+
r0 = instantiate_node(VerbatimNode,input, index...(index + 8))
|
46
|
+
@index += 8
|
47
|
+
else
|
48
|
+
terminal_parse_failure("verbatim")
|
49
|
+
r0 = nil
|
50
|
+
end
|
51
|
+
|
52
|
+
node_cache[:verbatim_type][start_index] = r0
|
53
|
+
|
54
|
+
r0
|
55
|
+
end
|
56
|
+
|
57
|
+
module VerbatimText0
|
58
|
+
def block_end
|
59
|
+
elements[0]
|
60
|
+
end
|
61
|
+
|
62
|
+
def verbatim_type
|
63
|
+
elements[1]
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
module VerbatimText1
|
69
|
+
end
|
70
|
+
|
71
|
+
def _nt_verbatim_text
|
72
|
+
start_index = index
|
73
|
+
if node_cache[:verbatim_text].has_key?(index)
|
74
|
+
cached = node_cache[:verbatim_text][index]
|
75
|
+
if cached
|
76
|
+
cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
|
77
|
+
@index = cached.interval.end
|
78
|
+
end
|
79
|
+
return cached
|
80
|
+
end
|
81
|
+
|
82
|
+
s0, i0 = [], index
|
83
|
+
loop do
|
84
|
+
i1, s1 = index, []
|
85
|
+
i2 = index
|
86
|
+
i3, s3 = index, []
|
87
|
+
r4 = _nt_block_end
|
88
|
+
s3 << r4
|
89
|
+
if r4
|
90
|
+
r5 = _nt_verbatim_type
|
91
|
+
s3 << r5
|
92
|
+
if r5
|
93
|
+
if has_terminal?("}", false, index)
|
94
|
+
r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
95
|
+
@index += 1
|
96
|
+
else
|
97
|
+
terminal_parse_failure("}")
|
98
|
+
r6 = nil
|
99
|
+
end
|
100
|
+
s3 << r6
|
101
|
+
end
|
102
|
+
end
|
103
|
+
if s3.last
|
104
|
+
r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
|
105
|
+
r3.extend(VerbatimText0)
|
106
|
+
else
|
107
|
+
@index = i3
|
108
|
+
r3 = nil
|
109
|
+
end
|
110
|
+
if r3
|
111
|
+
r2 = nil
|
112
|
+
else
|
113
|
+
@index = i2
|
114
|
+
r2 = instantiate_node(SyntaxNode,input, index...index)
|
115
|
+
end
|
116
|
+
s1 << r2
|
117
|
+
if r2
|
118
|
+
if index < input_length
|
119
|
+
r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
120
|
+
@index += 1
|
121
|
+
else
|
122
|
+
terminal_parse_failure("any character")
|
123
|
+
r7 = nil
|
124
|
+
end
|
125
|
+
s1 << r7
|
126
|
+
end
|
127
|
+
if s1.last
|
128
|
+
r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
|
129
|
+
r1.extend(VerbatimText1)
|
130
|
+
else
|
131
|
+
@index = i1
|
132
|
+
r1 = nil
|
133
|
+
end
|
134
|
+
if r1
|
135
|
+
s0 << r1
|
136
|
+
else
|
137
|
+
break
|
138
|
+
end
|
139
|
+
end
|
140
|
+
if s0.empty?
|
141
|
+
@index = i0
|
142
|
+
r0 = nil
|
143
|
+
else
|
144
|
+
r0 = instantiate_node(TextNode,input, i0...index, s0)
|
145
|
+
end
|
146
|
+
|
147
|
+
node_cache[:verbatim_text][start_index] = r0
|
148
|
+
|
149
|
+
r0
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
|
154
|
+
class VerbatimParser < Treetop::Runtime::CompiledParser
|
155
|
+
include Verbatim
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
159
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "hemingway/block/verbatim/verbatim_nodes"
|
2
|
+
|
3
|
+
module Hemingway
|
4
|
+
module Block
|
5
|
+
grammar Verbatim
|
6
|
+
|
7
|
+
rule verbatim
|
8
|
+
verbatim_text
|
9
|
+
end
|
10
|
+
|
11
|
+
rule verbatim_type
|
12
|
+
"verbatim" <VerbatimNode>
|
13
|
+
end
|
14
|
+
|
15
|
+
rule verbatim_text
|
16
|
+
( !( block_end verbatim_type "}" ) . )+ <TextNode>
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Hemingway
|
2
|
+
|
3
|
+
# This is a moronic little class to generate some HTML Tags around
|
4
|
+
# some content.
|
5
|
+
class Build
|
6
|
+
def self.tag(html_attribute, html_content=nil, options={})
|
7
|
+
String.new.tap do |t|
|
8
|
+
t << "<" + html_attribute
|
9
|
+
t << " id='" + options[:id] + "'" if options[:id]
|
10
|
+
t << " class='" + options[:class] + "'" if options[:class]
|
11
|
+
t << " href='" + options[:href] + "'" if options[:href]
|
12
|
+
t << ">"
|
13
|
+
t << html_content if html_content
|
14
|
+
t << "</" + html_attribute + ">" unless options[:close_tag] == false
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.symbol(symbol)
|
19
|
+
latex_sym_to_html[symbol]
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
def self.latex_sym_to_html
|
24
|
+
{
|
25
|
+
"\\Gamma" => "Γ",
|
26
|
+
"\\Delta" => "Δ",
|
27
|
+
"\\Theta" => "Θ",
|
28
|
+
"\\Lambda" => "Λ",
|
29
|
+
"\\Xi" => "Ξ",
|
30
|
+
"\\Pi" => "Π",
|
31
|
+
"\\Sigma" => "Σ",
|
32
|
+
"\\Upsilon" => "Υ",
|
33
|
+
"\\Phi" => "Φ",
|
34
|
+
"\\Psi" => "Ψ",
|
35
|
+
"\\Omega" => "Ω",
|
36
|
+
"\\alpha" => "α",
|
37
|
+
"\\beta" => "β",
|
38
|
+
"\\gamma" => "γ",
|
39
|
+
"\\delta" => "δ",
|
40
|
+
"\\epsilon" => "ε",
|
41
|
+
"\\zeta" => "ζ",
|
42
|
+
"\\eta" => "η",
|
43
|
+
"\\theta" => "θ",
|
44
|
+
"\\iota" => "ι",
|
45
|
+
"\\kappa" => "κ",
|
46
|
+
"\\lambda" => "λ",
|
47
|
+
"\\mu" => "μ",
|
48
|
+
"\\nu" => "ν",
|
49
|
+
"\\xi" => "ξ",
|
50
|
+
"\\pi" => "π",
|
51
|
+
"\\rho" => "ρ",
|
52
|
+
"\\varsigma" => "ς",
|
53
|
+
"\\sigma" => "σ",
|
54
|
+
"\\tau" => "τ",
|
55
|
+
"\\upsilon" => "υ",
|
56
|
+
"\\phi" => "φ",
|
57
|
+
"\\chi" => "χ",
|
58
|
+
"\\psi" => "ψ",
|
59
|
+
"\\omega" => "ω"
|
60
|
+
}
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# Autogenerated from a Treetop grammar. Edits may be lost.
|
2
|
+
|
3
|
+
|
4
|
+
require "hemingway/footnote/footnote_nodes"
|
5
|
+
|
6
|
+
module Hemingway
|
7
|
+
module Footnote
|
8
|
+
include Treetop::Runtime
|
9
|
+
|
10
|
+
def root
|
11
|
+
@root ||= :footnote
|
12
|
+
end
|
13
|
+
|
14
|
+
module Footnote0
|
15
|
+
def sequence
|
16
|
+
elements[1]
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
def _nt_footnote
|
22
|
+
start_index = index
|
23
|
+
if node_cache[:footnote].has_key?(index)
|
24
|
+
cached = node_cache[:footnote][index]
|
25
|
+
if cached
|
26
|
+
cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
|
27
|
+
@index = cached.interval.end
|
28
|
+
end
|
29
|
+
return cached
|
30
|
+
end
|
31
|
+
|
32
|
+
i0, s0 = index, []
|
33
|
+
if has_terminal?("\\footnote{", false, index)
|
34
|
+
r1 = instantiate_node(SyntaxNode,input, index...(index + 10))
|
35
|
+
@index += 10
|
36
|
+
else
|
37
|
+
terminal_parse_failure("\\footnote{")
|
38
|
+
r1 = nil
|
39
|
+
end
|
40
|
+
s0 << r1
|
41
|
+
if r1
|
42
|
+
s2, i2 = [], index
|
43
|
+
loop do
|
44
|
+
r3 = _nt_content
|
45
|
+
if r3
|
46
|
+
s2 << r3
|
47
|
+
else
|
48
|
+
break
|
49
|
+
end
|
50
|
+
end
|
51
|
+
r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
|
52
|
+
s0 << r2
|
53
|
+
if r2
|
54
|
+
if has_terminal?("}", false, index)
|
55
|
+
r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
56
|
+
@index += 1
|
57
|
+
else
|
58
|
+
terminal_parse_failure("}")
|
59
|
+
r4 = nil
|
60
|
+
end
|
61
|
+
s0 << r4
|
62
|
+
end
|
63
|
+
end
|
64
|
+
if s0.last
|
65
|
+
r0 = instantiate_node(FootnoteNode,input, i0...index, s0)
|
66
|
+
r0.extend(Footnote0)
|
67
|
+
else
|
68
|
+
@index = i0
|
69
|
+
r0 = nil
|
70
|
+
end
|
71
|
+
|
72
|
+
node_cache[:footnote][start_index] = r0
|
73
|
+
|
74
|
+
r0
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
class FootnoteParser < Treetop::Runtime::CompiledParser
|
80
|
+
include Footnote
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Hemingway
|
2
|
+
module FootnoteNode
|
3
|
+
# This is the method that will place the anchor tag and id of the
|
4
|
+
# footnote within the paragraph body itself.
|
5
|
+
def html(id)
|
6
|
+
inline_footnote_label = Build.tag("span", Build.tag("sup", id.to_s), :class => "inline-footnote-number")
|
7
|
+
Build.tag("a", inline_footnote_label, :href => "#footnote#{id}")
|
8
|
+
end
|
9
|
+
|
10
|
+
# This is the method that will actually spit out the div that the
|
11
|
+
# footnote's content is in. This will generally be called after all of the
|
12
|
+
# paragraph's text has been spit out so that the footnotes can be appended
|
13
|
+
# after. Note that it needs to be passed an id from the caller so that it
|
14
|
+
# can be linked to corretly with an anchor tag in the body of the main text.
|
15
|
+
def footnote_html(id)
|
16
|
+
footnote_label = Build.tag("span", Build.tag("sup", id.to_s), :class => "footnote-number")
|
17
|
+
footnote_content = sequence.elements.map { |s| s.html }.join
|
18
|
+
Build.tag("div", footnote_label + footnote_content, :id => "footnote#{id}", :class => "footnote")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|