hemingway 0.0.0 → 0.0.2
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 +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,121 @@
|
|
1
|
+
# Autogenerated from a Treetop grammar. Edits may be lost.
|
2
|
+
|
3
|
+
|
4
|
+
require "hemingway/text/text_nodes"
|
5
|
+
|
6
|
+
module Hemingway
|
7
|
+
module Text
|
8
|
+
include Treetop::Runtime
|
9
|
+
|
10
|
+
def root
|
11
|
+
@root ||= :text
|
12
|
+
end
|
13
|
+
|
14
|
+
module Text0
|
15
|
+
end
|
16
|
+
|
17
|
+
def _nt_text
|
18
|
+
start_index = index
|
19
|
+
if node_cache[:text].has_key?(index)
|
20
|
+
cached = node_cache[:text][index]
|
21
|
+
if cached
|
22
|
+
cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
|
23
|
+
@index = cached.interval.end
|
24
|
+
end
|
25
|
+
return cached
|
26
|
+
end
|
27
|
+
|
28
|
+
s0, i0 = [], index
|
29
|
+
loop do
|
30
|
+
i1, s1 = index, []
|
31
|
+
i2 = index
|
32
|
+
r3 = _nt_non_text
|
33
|
+
if r3
|
34
|
+
r2 = nil
|
35
|
+
else
|
36
|
+
@index = i2
|
37
|
+
r2 = instantiate_node(SyntaxNode,input, index...index)
|
38
|
+
end
|
39
|
+
s1 << r2
|
40
|
+
if r2
|
41
|
+
if index < input_length
|
42
|
+
r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
43
|
+
@index += 1
|
44
|
+
else
|
45
|
+
terminal_parse_failure("any character")
|
46
|
+
r4 = nil
|
47
|
+
end
|
48
|
+
s1 << r4
|
49
|
+
end
|
50
|
+
if s1.last
|
51
|
+
r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
|
52
|
+
r1.extend(Text0)
|
53
|
+
else
|
54
|
+
@index = i1
|
55
|
+
r1 = nil
|
56
|
+
end
|
57
|
+
if r1
|
58
|
+
s0 << r1
|
59
|
+
else
|
60
|
+
break
|
61
|
+
end
|
62
|
+
end
|
63
|
+
if s0.empty?
|
64
|
+
@index = i0
|
65
|
+
r0 = nil
|
66
|
+
else
|
67
|
+
r0 = instantiate_node(TextNode,input, i0...index, s0)
|
68
|
+
end
|
69
|
+
|
70
|
+
node_cache[:text][start_index] = r0
|
71
|
+
|
72
|
+
r0
|
73
|
+
end
|
74
|
+
|
75
|
+
def _nt_non_text
|
76
|
+
start_index = index
|
77
|
+
if node_cache[:non_text].has_key?(index)
|
78
|
+
cached = node_cache[:non_text][index]
|
79
|
+
if cached
|
80
|
+
cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
|
81
|
+
@index = cached.interval.end
|
82
|
+
end
|
83
|
+
return cached
|
84
|
+
end
|
85
|
+
|
86
|
+
i0 = index
|
87
|
+
r1 = _nt_escape
|
88
|
+
if r1
|
89
|
+
r0 = r1
|
90
|
+
else
|
91
|
+
r2 = _nt_tag_end
|
92
|
+
if r2
|
93
|
+
r0 = r2
|
94
|
+
else
|
95
|
+
r3 = _nt_math_start
|
96
|
+
if r3
|
97
|
+
r0 = r3
|
98
|
+
else
|
99
|
+
r4 = _nt_newline
|
100
|
+
if r4
|
101
|
+
r0 = r4
|
102
|
+
else
|
103
|
+
@index = i0
|
104
|
+
r0 = nil
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
node_cache[:non_text][start_index] = r0
|
111
|
+
|
112
|
+
r0
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
|
117
|
+
class TextParser < Treetop::Runtime::CompiledParser
|
118
|
+
include Text
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "hemingway/text/text_nodes"
|
2
|
+
|
3
|
+
module Hemingway
|
4
|
+
grammar Text
|
5
|
+
|
6
|
+
# Example: blah blah blah
|
7
|
+
# Notes:
|
8
|
+
# - Okay so this is midly confusing. It's super important to keep the idea
|
9
|
+
# of what text is consumed in mind. If I just have the rule as
|
10
|
+
#
|
11
|
+
# !( non_text / eop)+
|
12
|
+
#
|
13
|
+
# it will never consume any text [because negative lookahead assertions
|
14
|
+
# don't consume text]. When this runs it would just sit on the first
|
15
|
+
# character and continually check for non_text, causing a deadspin if it
|
16
|
+
# wasn't a non_text. To fix this, make it a sequence with '.'. The '.' will
|
17
|
+
# consume any input and keep that index moving along until in fact we find
|
18
|
+
# our non_text.
|
19
|
+
# - Okay another super important consideration: I MUST use
|
20
|
+
# the + rather than the *. If I use *, then the empty string will match
|
21
|
+
# text, and because the parent rule of paragraph has zero or more texts in
|
22
|
+
# a sequence, it will forever match the empty string and never move onto
|
23
|
+
# eop. We much only match text when there is one or more characters, a
|
24
|
+
# totally reasonable rule.
|
25
|
+
rule text
|
26
|
+
( !non_text . )+ <TextNode>
|
27
|
+
end
|
28
|
+
|
29
|
+
# If you hit any of these while chomping on text you should pop out
|
30
|
+
rule non_text
|
31
|
+
escape / tag_end / math_start / newline
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
data/lib/hemingway.rb
CHANGED
data/script/build
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
def compile_and_recurse
|
4
|
+
|
5
|
+
# Compile all of the treetop files in the pwd
|
6
|
+
Dir.glob("*.treetop").each do |treetop_file|
|
7
|
+
system "tt -f #{treetop_file}"
|
8
|
+
end
|
9
|
+
|
10
|
+
# Get a list of all the directories in the pwd
|
11
|
+
Dir.glob("*").select do |file_name|
|
12
|
+
Dir.exists?(file_name)
|
13
|
+
end.each do |dir|
|
14
|
+
Dir.chdir(dir)
|
15
|
+
compile_and_recurse
|
16
|
+
Dir.chdir("..")
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
Dir.chdir("lib/hemingway")
|
22
|
+
compile_and_recurse
|
data/script/test
ADDED
data/spec/build_spec.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Hemingway
|
4
|
+
|
5
|
+
describe Build do
|
6
|
+
|
7
|
+
describe "#tag" do
|
8
|
+
let(:attribute) { "div" }
|
9
|
+
let(:content) { "king of the dinos" }
|
10
|
+
let(:klass) { "trex" }
|
11
|
+
let(:id) { "tom" }
|
12
|
+
let(:href) { "http://t-bone.org" }
|
13
|
+
|
14
|
+
it 'should generate a tag with no content or class' do
|
15
|
+
Build.tag(attribute).should == "<#{attribute}></#{attribute}>"
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should generate a tag with content' do
|
19
|
+
Build.tag(attribute, content).should == "<#{attribute}>#{content}</#{attribute}>"
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should generate a tag with content and a class' do
|
23
|
+
Build.tag(attribute, content, :class => klass).should == "<#{attribute} class='#{klass}'>#{content}</#{attribute}>"
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should generate a tag with content and an id' do
|
27
|
+
Build.tag(attribute, content, :id => id).should == "<#{attribute} id='#{id}'>#{content}</#{attribute}>"
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should generate a tag with content and an href' do
|
31
|
+
Build.tag(attribute, content, :href => href).should == "<#{attribute} href='#{href}'>#{content}</#{attribute}>"
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should generate a tag with content and an id and a class' do
|
35
|
+
Build.tag(attribute, content, :id => id, :class => klass).should == "<#{attribute} id='#{id}' class='#{klass}'>#{content}</#{attribute}>"
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should generate a tag with content and an id and a class and an href' do
|
39
|
+
Build.tag(attribute, content, :id => id, :class => klass, :href => href).should == "<#{attribute} id='#{id}' class='#{klass}' href='#{href}'>#{content}</#{attribute}>"
|
40
|
+
end
|
41
|
+
|
42
|
+
# Can't wait for Ruby 2.0
|
43
|
+
it 'should generate a tag with content and a class and no content' do
|
44
|
+
Build.tag(attribute, nil, :class => klass).should == "<#{attribute} class='#{klass}'></#{attribute}>"
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should allow me to create a tag that doesnt close' do
|
48
|
+
Build.tag("hr", nil, :close_tag => false).should == "<hr>"
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "#symbol" do
|
54
|
+
|
55
|
+
let(:symbol) { "\\Delta" }
|
56
|
+
|
57
|
+
it 'should translate the Latex symbol into an html equiavalent' do
|
58
|
+
Build.symbol(symbol).should == "Δ"
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Hemingway
|
4
|
+
|
5
|
+
describe Parser do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@parser = Parser.new
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#itemize" do
|
12
|
+
|
13
|
+
it 'allows me to create an itemized list' do
|
14
|
+
html = @parser.parse("\\begin{itemize}\\item thing 1 \\item thing 2 \\end{itemize}").html
|
15
|
+
html.should == "<div class='entry'><p><ul><li>thing 1 </li><li>thing 2 </li></ul></p></div>"
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'eats up any extra newlines and such between items' do
|
19
|
+
html = @parser.parse("\\begin{itemize}\\item thing 1 \n\n\n \\item thing 2 \n \\end{itemize}").html
|
20
|
+
html.should == "<div class='entry'><p><ul><li>thing 1 </li><li>thing 2 </li></ul></p></div>"
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'supports text, tags, special chars, math inline' do
|
24
|
+
html = @parser.parse("\\begin{itemize}\\item hey \\emph{$\\lambda$} \\$ buddies \\end{itemize}").html
|
25
|
+
html.should == "<div class='entry'><p><ul><li>hey <em>λ</em> $ buddies </li></ul></p></div>"
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'supports items to have labels on them with various spacing' do
|
29
|
+
html = @parser.parse("\\begin{itemize}\\item[bros] over hoes \\item \n [chicks] before dicks \\end{itemize}").html
|
30
|
+
html.should == "<div class='entry'><p><ul><li><span class='list-label'>bros</span> over hoes </li><li><span class='list-label'>chicks</span> before dicks </li></ul></p></div>"
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'supports text, tags, special chars, and math in labels' do
|
34
|
+
html = @parser.parse("\\begin{itemize}\\item[so many \\emph{vibes} $\\lambda$ \\$ \\$] to be had \\end{itemize}").html
|
35
|
+
html.should == "<div class='entry'><p><ul><li><span class='list-label'>so many <em>vibes</em> λ $ $</span> to be had </li></ul></p></div>"
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'supports empty labels' do
|
39
|
+
html = @parser.parse("\\begin{itemize}\\item[] do or do not \\end{itemize}").html
|
40
|
+
html.should == "<div class='entry'><p><ul><li><span class='list-label'></span> do or do not </li></ul></p></div>"
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'supports empty items with labels' do
|
44
|
+
html = @parser.parse("\\begin{itemize}\\item[Millenium \\emph{Falcon}] \\item Slave-1 \\end{itemize}").html
|
45
|
+
html.should == "<div class='entry'><p><ul><li><span class='list-label'>Millenium <em>Falcon</em></span> </li><li>Slave-1 </li></ul></p></div>"
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'supports empty items without labels' do
|
49
|
+
html = @parser.parse("\\begin{itemize}\\item \\item ears off a gundart \\end{itemize}").html
|
50
|
+
html.should == "<div class='entry'><p><ul><li></li><li>ears off a gundart </li></ul></p></div>"
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'should allow me to nest some lists' do
|
54
|
+
html = @parser.parse("\\begin{itemize} \\item[another list] \\begin{itemize} \\item[nesting \\emph{vibes}] over here \\end{itemize} \\item for good measure \\end{itemize}").html
|
55
|
+
html.should == "<div class='entry'><p><ul><li><span class='list-label'>another list</span> <ul><li><span class='list-label'>nesting <em>vibes</em></span> over here </li></ul> </li><li>for good measure </li></ul></p></div>"
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'should nest 3 layers deep just for fun' do
|
59
|
+
html = @parser.parse("\\begin{itemize} \\item \\begin{itemize} \\item \\begin{itemize} \\item hey \\end{itemize} \\end{itemize} \\end{itemize}").html
|
60
|
+
html.should == "<div class='entry'><p><ul><li><ul><li><ul><li>hey </li></ul> </li></ul> </li></ul></p></div>"
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "#enumerate" do
|
66
|
+
it 'should allow me to create an ordered list' do
|
67
|
+
html = @parser.parse("\\begin{enumerate} \\item Frodo \\item Sam \\end{enumerate}").html
|
68
|
+
html.should == "<div class='entry'><p><ol><li>Frodo </li><li>Sam </li></ol></p></div>"
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'should allow me to nest an unordered list in an ordered list' do
|
72
|
+
html = @parser.parse("\\begin{enumerate} \\item \\begin{itemize} \\item Frodo \\item Pippin \\end{itemize} \\item Sam \\end{enumerate}").html
|
73
|
+
html.should == "<div class='entry'><p><ol><li><ul><li>Frodo </li><li>Pippin </li></ul> </li><li>Sam </li></ol></p></div>"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe "#description" do
|
78
|
+
it 'should allow me to create a dictionary list' do
|
79
|
+
html = @parser.parse("\\begin{description} \\item Frodo \\item Sam \\end{description}").html
|
80
|
+
html.should == "<div class='entry'><p><dl><dd>Frodo </dd><dd>Sam </dd></dl></p></div>"
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'should wrap labels in the dictionary label tag' do
|
84
|
+
html = @parser.parse("\\begin{description} \\item [Frodo] Adventuerer \\item [Sam] Faithful Companion \\end{description}").html
|
85
|
+
html.should == "<div class='entry'><p><dl><dd><dt>Frodo</dt> Adventuerer </dd><dd><dt>Sam</dt> Faithful Companion </dd></dl></p></div>"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Hemingway
|
4
|
+
|
5
|
+
describe Parser do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@parser = Parser.new
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#quote" do
|
12
|
+
|
13
|
+
it 'parses simple block quotes' do
|
14
|
+
html = @parser.parse("\\begin{quote}\nHave you guys ever heard the song \\emph{Blow} by \\emph{MILF}?\n\\end{quote}").html
|
15
|
+
html.should == "<div class='entry'><p><blockquote><p>Have you guys ever heard the song <em>Blow</em> by <em>MILF</em>?</p></blockquote></p></div>"
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'parses multi-paragraph block quotes' do
|
19
|
+
html = @parser.parse("\\begin{quote}\n We really ought to listen to The Smiths more. \n\n Melancholy can be a good thing. \n\\end{quote}").html
|
20
|
+
html.should == "<div class='entry'><p><blockquote><p>We really ought to listen to The Smiths more. </p><p> Melancholy can be a good thing. </p></blockquote></p></div>"
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'doesnt support footnotes' do
|
24
|
+
@parser.parse("\\begin{quote}\n T-Rex\\footnote{King of the Dinos} \n\\end{quote}").should be_nil
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Hemingway
|
4
|
+
|
5
|
+
describe Parser do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@parser = Parser.new
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#verbatim" do
|
12
|
+
|
13
|
+
it 'allows me to instantiate pre-formatted text' do
|
14
|
+
html = @parser.parse("\\begin{verbatim} don't we \n \n all wish \n \n for a little sleep? \\end{verbatim}").html
|
15
|
+
html.should == "<div class='entry'><p><pre>don't we \n \n all wish \n \n for a little sleep? </pre></p></div>"
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'allows me to write tex markup that isnt parses' do
|
19
|
+
html = @parser.parse("\\begin{verbatim} Emphasized text uses the \\emph{} tag. \\end{verbatim}").html
|
20
|
+
html.should == "<div class='entry'><p><pre>Emphasized text uses the \\emph{} tag. </pre></p></div>"
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Hemingway
|
4
|
+
|
5
|
+
describe Parser do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@parser = Parser.new
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#block" do
|
12
|
+
|
13
|
+
it "should only parse blocks with matching begin and end tags" do
|
14
|
+
@parser.parse("\\begin{itemize} \\item hey \\end{description}").should be_nil
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Hemingway
|
4
|
+
|
5
|
+
describe Parser do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@parser = Parser.new
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#footnote" do
|
12
|
+
|
13
|
+
it "should put a footnote at the end of a paragraph" do
|
14
|
+
html = @parser.parse("You are what you redpoint\\footnote{sending a lead route}, after all.").html
|
15
|
+
html.should == "<div class='entry'><p>You are what you redpoint<a href='#footnote1'><span class='inline-footnote-number'><sup>1</sup></span></a>, after all.</p><div id='footnote1' class='footnote'><span class='footnote-number'><sup>1</sup></span>sending a lead route</div></div>"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should put properly increment the footnote count per entry" do
|
19
|
+
html = @parser.parse("Slowly, Vader\\footnote{thug} approached Luke\\footnote{homeboy}").html
|
20
|
+
html.should == "<div class='entry'><p>Slowly, Vader<a href='#footnote1'><span class='inline-footnote-number'><sup>1</sup></span></a> approached Luke<a href='#footnote2'><span class='inline-footnote-number'><sup>2</sup></span></a></p><div id='footnote1' class='footnote'><span class='footnote-number'><sup>1</sup></span>thug</div><div id='footnote2' class='footnote'><span class='footnote-number'><sup>2</sup></span>homeboy</div></div>"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should support any type of content in a footnote" do
|
24
|
+
html = @parser.parse("Dave Graham\\footnote{\\emph{Boulderer}, and \& all around \\textsc{good} guy $\\gamma$} makes the best mixtapes").html
|
25
|
+
html.should == "<div class='entry'><p>Dave Graham<a href='#footnote1'><span class='inline-footnote-number'><sup>1</sup></span></a> makes the best mixtapes</p><div id='footnote1' class='footnote'><span class='footnote-number'><sup>1</sup></span><em>Boulderer</em>, and & all around <span class='textsc'>good</span> guy γ</div></div>"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should properly place footnotes from all paragraphs after all paragraphs an increment properly" do
|
29
|
+
html = @parser.parse("Freddie Gibbs\\footnote{from Gary, Indiana} is hood\\footnote{thug} as all hell.\n\n John Russel\\footnote{of Short Bus fame} almost got raped in Gary, ID\\footnote{but not by Freddie Gibbs}").html
|
30
|
+
html.should == "<div class='entry'><p>Freddie Gibbs<a href='#footnote1'><span class='inline-footnote-number'><sup>1</sup></span></a> is hood<a href='#footnote2'><span class='inline-footnote-number'><sup>2</sup></span></a> as all hell.</p><p> John Russel<a href='#footnote3'><span class='inline-footnote-number'><sup>3</sup></span></a> almost got raped in Gary, ID<a href='#footnote4'><span class='inline-footnote-number'><sup>4</sup></span></a></p><div id='footnote1' class='footnote'><span class='footnote-number'><sup>1</sup></span>from Gary, Indiana</div><div id='footnote2' class='footnote'><span class='footnote-number'><sup>2</sup></span>thug</div><div id='footnote3' class='footnote'><span class='footnote-number'><sup>3</sup></span>of Short Bus fame</div><div id='footnote4' class='footnote'><span class='footnote-number'><sup>4</sup></span>but not by Freddie Gibbs</div></div>"
|
31
|
+
end
|
32
|
+
|
33
|
+
it "will obviously allow me to drop a list in a footnote (this is just for my own satisfaction mostly)" do
|
34
|
+
html = @parser.parse("There are some rules\\footnote{\\begin{itemize} \\item Steezy socks always \\item Brosend often \\item Everything for the ladies \\end{itemize}} that we all must live by.").html
|
35
|
+
html.should == "<div class='entry'><p>There are some rules<a href='#footnote1'><span class='inline-footnote-number'><sup>1</sup></span></a> that we all must live by.</p><div id='footnote1' class='footnote'><span class='footnote-number'><sup>1</sup></span><ul><li>Steezy socks always </li><li>Brosend often </li><li>Everything for the ladies </li></ul></div></div>"
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Hemingway
|
4
|
+
|
5
|
+
describe Parser do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@parser = Parser.new
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#math" do
|
12
|
+
it 'should parse out a math symbol' do
|
13
|
+
html = @parser.parse("$\\Delta$").html
|
14
|
+
html.should == "<div class='entry'><p>Δ</p></div>"
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should allow me to nest math symbols in a tag' do
|
18
|
+
html = @parser.parse("\\emph{$\\Delta$}").html
|
19
|
+
html.should == "<div class='entry'><p><em>Δ</em></p></div>"
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should escape text properly into a math symbol' do
|
23
|
+
html = @parser.parse("hello $\\Delta$").html
|
24
|
+
html.should == "<div class='entry'><p>hello Δ</p></div>"
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Hemingway
|
4
|
+
|
5
|
+
describe Parser do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@parser = Parser.new
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#special" do
|
12
|
+
|
13
|
+
it 'should escape a special character' do
|
14
|
+
html = @parser.parse("War \\& Peace").html
|
15
|
+
html.should == "<div class='entry'><p>War & Peace</p></div>"
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should allow for special chars and tags in sequence' do
|
19
|
+
html = @parser.parse("War \\& Peace \\textbf{Tolstoy} \\#").html
|
20
|
+
html.should == "<div class='entry'><p>War & Peace <strong>Tolstoy</strong> #</p></div>"
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Hemingway
|
4
|
+
|
5
|
+
describe Parser do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@parser = Parser.new
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#tag" do
|
12
|
+
|
13
|
+
it 'should parse an emph tag' do
|
14
|
+
html = @parser.parse("a \\emph{hey} b").html
|
15
|
+
html.should == "<div class='entry'><p>a <em>hey</em> b</p></div>"
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should parse a texttt tag' do
|
19
|
+
html = @parser.parse("\\texttt{hey}").html
|
20
|
+
html.should == "<div class='entry'><p><code>hey</code></p></div>"
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should parse a textbf tag' do
|
24
|
+
html = @parser.parse("\\textbf{hey}").html
|
25
|
+
html.should == "<div class='entry'><p><strong>hey</strong></p></div>"
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should parse a textsc tag' do
|
29
|
+
html = @parser.parse("\\textsc{hey}").html
|
30
|
+
html.should == "<div class='entry'><p><span class='textsc'>hey</span></p></div>"
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should allow sequences of content within a tag' do
|
34
|
+
html = @parser.parse("\\textsc{hey \\emph{vibes} \& times}").html
|
35
|
+
html.should == "<div class='entry'><p><span class='textsc'>hey <em>vibes</em> & times</span></p></div>"
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "#nesting" do
|
41
|
+
|
42
|
+
it 'should allow me to nest tags' do
|
43
|
+
html = @parser.parse("\\emph{\\texttt{hey}}").html
|
44
|
+
html.should == "<div class='entry'><p><em><code>hey</code></em></p></div>"
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should REALLY allow me to next tags' do
|
48
|
+
html = @parser.parse("\\emph{\\texttt{\\texttt{hey}}}").html
|
49
|
+
html.should == "<div class='entry'><p><em><code><code>hey</code></code></em></p></div>"
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should escape special characters in a tag' do
|
53
|
+
html = @parser.parse("\\emph{War \\& Peace}").html
|
54
|
+
html.should == "<div class='entry'><p><em>War & Peace</em></p></div>"
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "#vspace" do
|
60
|
+
|
61
|
+
it 'should build vertical space taking divs' do
|
62
|
+
html = @parser.parse("\\vspace{5mm}").html
|
63
|
+
html.should == "<div class='entry'><p><div class='vspace5'></div></p></div>"
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should build vertical space taking divs with double digit heights' do
|
67
|
+
html = @parser.parse("\\vspace{12mm}").html
|
68
|
+
html.should == "<div class='entry'><p><div class='vspace12'></div></p></div>"
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
describe '#hfill' do
|
74
|
+
|
75
|
+
it 'supports right justifying on a line' do
|
76
|
+
html = @parser.parse("The love, \\hfill Will").html
|
77
|
+
html.should == "<div class='entry'><p>The love, <span class='pull-right'>Will</span></p></div>"
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'allows me to put all the good shit in' do
|
81
|
+
html = @parser.parse("The love, \\hfill \\emph{Will} \\textsc{Tha Thrill} $\\delta$ \\textbf{Myers}").html
|
82
|
+
html.should == "<div class='entry'><p>The love, <span class='pull-right'><em>Will</em> <span class='textsc'>Tha Thrill</span> δ <strong>Myers</strong></span></p></div>"
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
describe '#neatline' do
|
88
|
+
|
89
|
+
it 'allows me to add fancy <hr>s to a page' do
|
90
|
+
html = @parser.parse("\\neatline").html
|
91
|
+
html.should == "<div class='entry'><p><hr class='neatline'></p></div>"
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|