hemingway 0.0.3 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +13 -0
- data/lib/hemingway/block/list/list_nodes.rb +2 -2
- data/lib/hemingway/footnote/footnote_nodes.rb +20 -10
- data/lib/hemingway/latex.rb +11 -3
- data/lib/hemingway/latex.treetop +3 -1
- data/lib/hemingway/latex_nodes.rb +17 -6
- data/lib/hemingway/override/override.rb +73 -0
- data/lib/hemingway/override/override.treetop +16 -0
- data/lib/hemingway/override/override_nodes.rb +21 -0
- data/lib/hemingway/text/text.rb +7 -2
- data/lib/hemingway/text/text.treetop +1 -1
- data/lib/hemingway/version.rb +1 -1
- data/spec/nodes/block/list_spec.rb +1 -1
- data/spec/nodes/footnote_spec.rb +8 -5
- data/spec/nodes/override_spec.rb +22 -0
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6be07dbe35ddfe1b586683f1c0b22794e7224eb6
|
4
|
+
data.tar.gz: f2289732a6e1250a13d475a4301caa3ff575c397
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c39102a201abc6ae4a602b91a0cbdbcebfb8c53d2022912688af99a9f973ebc129f12be862392acf1ab1d9a8d801fa17ea8b8ca879c7009e5088b833928b371
|
7
|
+
data.tar.gz: bf781c65504fbf222fcd6a9cb041a22645625818139cbe4cd2f835389215a6bfb2b4fc8f6849cf2df48ac80ef0a08e0843e67c84d61c22653f63f65a6aef0a34
|
data/README.md
CHANGED
@@ -253,6 +253,9 @@ And looks like this:
|
|
253
253
|
|
254
254
|
</div>
|
255
255
|
|
256
|
+
I've added a timestamp onto footnote hrefs and ids to make the unique incase
|
257
|
+
you are parsing multiple entries on a given HTML document.
|
258
|
+
|
256
259
|
###### Block Quotes
|
257
260
|
|
258
261
|
Pretty standard. You can put anything in there except a footnote. That seemed
|
@@ -304,6 +307,16 @@ The love, <span class="pull-right">Will</span>
|
|
304
307
|
Charm\'{e}e de vous voir. Je suis tr\`{e} contente de vous voir. : Charmée de vous voir. Je suis trè contente de vous voir.
|
305
308
|
```
|
306
309
|
|
310
|
+
###### Overrides
|
311
|
+
|
312
|
+
Some characters need a little help.
|
313
|
+
|
314
|
+
```html
|
315
|
+
--- : "—"
|
316
|
+
`` : "“"
|
317
|
+
'' : "”"
|
318
|
+
```
|
319
|
+
|
307
320
|
## Contributing
|
308
321
|
|
309
322
|
1. Fork it
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module Hemingway
|
1
|
+
module Hemingway
|
2
2
|
|
3
3
|
module ItemizeListNode
|
4
4
|
def html(block_content)
|
@@ -26,7 +26,7 @@ module Hemingway
|
|
26
26
|
|
27
27
|
def description_html
|
28
28
|
label_tag = label.empty? ? "" : Build.tag("dt", label.html)
|
29
|
-
Build.tag("dd",
|
29
|
+
label_tag + Build.tag("dd", sequence.elements.map { |e| e.html }.join)
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
@@ -1,21 +1,31 @@
|
|
1
1
|
module Hemingway
|
2
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
|
-
|
3
|
+
# This is the method that will place the anchor tag and id of the
|
4
|
+
# footnote within the paragraph body itself.
|
5
|
+
#
|
6
|
+
# I'm passing in a time variable here to make links unique. You see,
|
7
|
+
# if you parse many of these entries on a single HTML page you'll end up
|
8
|
+
# with multiple #footnote1 divs. To make them unique, we'll pass down
|
9
|
+
# a time variable from above to seed them.
|
10
|
+
def html(id, time)
|
6
11
|
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}")
|
12
|
+
Build.tag("a", inline_footnote_label, :href => "#footnote#{id}#{time}")
|
8
13
|
end
|
9
14
|
|
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
|
15
|
+
# This is the method that will actually spit out the div that the
|
16
|
+
# footnote's content is in. This will generally be called after all of the
|
12
17
|
# 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
|
-
|
18
|
+
# after. Note that it needs to be passed an id from the caller so that it
|
19
|
+
# can be linked to corretly with an anchor tag in the body of the main text.
|
20
|
+
#
|
21
|
+
# I'm passing in a time variable here to make links unique. You see,
|
22
|
+
# if you parse many of these entries on a single HTML page you'll end up
|
23
|
+
# with multiple #footnote1 divs. To make them unique, we'll pass down
|
24
|
+
# a time variable from above to seed them.
|
25
|
+
def footnote_html(id, time)
|
16
26
|
footnote_label = Build.tag("span", Build.tag("sup", id.to_s), :class => "footnote-number")
|
17
27
|
footnote_content = sequence.elements.map { |s| s.html }.join
|
18
|
-
Build.tag("div", footnote_label + footnote_content, :id => "footnote#{id}", :class => "footnote")
|
28
|
+
Build.tag("div", footnote_label + footnote_content, :id => "footnote#{id}#{time}", :class => "footnote")
|
19
29
|
end
|
20
30
|
end
|
21
31
|
end
|
data/lib/hemingway/latex.rb
CHANGED
@@ -6,6 +6,7 @@ require 'hemingway/latex_nodes'
|
|
6
6
|
require "hemingway/block/block"
|
7
7
|
require "hemingway/footnote/footnote"
|
8
8
|
require "hemingway/math/math"
|
9
|
+
require "hemingway/override/override"
|
9
10
|
require "hemingway/special/special"
|
10
11
|
require "hemingway/symbol/symbol"
|
11
12
|
require "hemingway/tag/tag"
|
@@ -25,6 +26,8 @@ module Hemingway
|
|
25
26
|
|
26
27
|
include Math
|
27
28
|
|
29
|
+
include Override
|
30
|
+
|
28
31
|
include Special
|
29
32
|
|
30
33
|
include Symbol
|
@@ -311,12 +314,17 @@ module Hemingway
|
|
311
314
|
if r4
|
312
315
|
r0 = r4
|
313
316
|
else
|
314
|
-
r5 =
|
317
|
+
r5 = _nt_override
|
315
318
|
if r5
|
316
319
|
r0 = r5
|
317
320
|
else
|
318
|
-
|
319
|
-
|
321
|
+
r6 = _nt_text
|
322
|
+
if r6
|
323
|
+
r0 = r6
|
324
|
+
else
|
325
|
+
@index = i0
|
326
|
+
r0 = nil
|
327
|
+
end
|
320
328
|
end
|
321
329
|
end
|
322
330
|
end
|
data/lib/hemingway/latex.treetop
CHANGED
@@ -3,6 +3,7 @@ require 'hemingway/latex_nodes'
|
|
3
3
|
require "hemingway/block/block"
|
4
4
|
require "hemingway/footnote/footnote"
|
5
5
|
require "hemingway/math/math"
|
6
|
+
require "hemingway/override/override"
|
6
7
|
require "hemingway/special/special"
|
7
8
|
require "hemingway/symbol/symbol"
|
8
9
|
require "hemingway/tag/tag"
|
@@ -14,6 +15,7 @@ module Hemingway
|
|
14
15
|
include Block
|
15
16
|
include Footnote
|
16
17
|
include Math
|
18
|
+
include Override
|
17
19
|
include Special
|
18
20
|
include Symbol
|
19
21
|
include Tag
|
@@ -53,7 +55,7 @@ module Hemingway
|
|
53
55
|
# method need not be defined on it because alas, it already exists as
|
54
56
|
# defined in the text rule itself!
|
55
57
|
rule content
|
56
|
-
special / tag / block / math / text
|
58
|
+
special / tag / block / math / override / text
|
57
59
|
end
|
58
60
|
|
59
61
|
# Treetop does not separate lexing from parsing. Must consume all input.
|
@@ -6,8 +6,10 @@ module Hemingway
|
|
6
6
|
paragraph_html = ""
|
7
7
|
|
8
8
|
elements.each do |e|
|
9
|
-
|
10
|
-
|
9
|
+
# Time.now.to_f => 123123.1231231
|
10
|
+
time = Time.now.to_f.to_s.gsub(".", "-")
|
11
|
+
paragraph_html += e.html(footnote_content.size, time)
|
12
|
+
footnote_content += e.footnote_html(footnote_content.size, time)
|
11
13
|
end
|
12
14
|
|
13
15
|
footnote_html = footnote_content.join
|
@@ -17,11 +19,16 @@ module Hemingway
|
|
17
19
|
end
|
18
20
|
|
19
21
|
module ParagraphNode
|
20
|
-
|
22
|
+
|
23
|
+
# I'm passing in a time variable here to make links unique. You see,
|
24
|
+
# if you parse many of these entries on a single HTML page you'll end up
|
25
|
+
# with multiple #footnote1 divs. To make them unique, we'll pass down
|
26
|
+
# a time variable from above to seed them.
|
27
|
+
def html(footnote_seed, time)
|
21
28
|
paragraph_content = sequence.elements.map do |element|
|
22
29
|
if element.respond_to?(:footnote_html)
|
23
30
|
footnote_seed += 1
|
24
|
-
element.html(footnote_seed)
|
31
|
+
element.html(footnote_seed, time)
|
25
32
|
elsif element.respond_to?(:newline)
|
26
33
|
element.newline.html
|
27
34
|
else
|
@@ -32,11 +39,15 @@ module Hemingway
|
|
32
39
|
Build.tag("p", paragraph_content)
|
33
40
|
end
|
34
41
|
|
35
|
-
|
42
|
+
# I'm passing in a time variable here to make links unique. You see,
|
43
|
+
# if you parse many of these entries on a single HTML page you'll end up
|
44
|
+
# with multiple #footnote1 divs. To make them unique, we'll pass down
|
45
|
+
# a time variable from above to seed them.
|
46
|
+
def footnote_html(footnote_seed, time)
|
36
47
|
footnote_content = sequence.elements.reduce([]) do |memo, element|
|
37
48
|
if element.respond_to?(:footnote_html)
|
38
49
|
footnote_seed += 1
|
39
|
-
memo + [element.footnote_html(footnote_seed)]
|
50
|
+
memo + [element.footnote_html(footnote_seed, time)]
|
40
51
|
else
|
41
52
|
memo
|
42
53
|
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# Autogenerated from a Treetop grammar. Edits may be lost.
|
2
|
+
|
3
|
+
|
4
|
+
require "hemingway/override/override_nodes"
|
5
|
+
|
6
|
+
module Hemingway
|
7
|
+
module Override
|
8
|
+
include Treetop::Runtime
|
9
|
+
|
10
|
+
def root
|
11
|
+
@root ||= :override
|
12
|
+
end
|
13
|
+
|
14
|
+
def _nt_override
|
15
|
+
start_index = index
|
16
|
+
if node_cache[:override].has_key?(index)
|
17
|
+
cached = node_cache[:override][index]
|
18
|
+
if cached
|
19
|
+
cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
|
20
|
+
@index = cached.interval.end
|
21
|
+
end
|
22
|
+
return cached
|
23
|
+
end
|
24
|
+
|
25
|
+
i0 = index
|
26
|
+
if has_terminal?("---", false, index)
|
27
|
+
r1 = instantiate_node(MDashNode,input, index...(index + 3))
|
28
|
+
@index += 3
|
29
|
+
else
|
30
|
+
terminal_parse_failure("---")
|
31
|
+
r1 = nil
|
32
|
+
end
|
33
|
+
if r1
|
34
|
+
r0 = r1
|
35
|
+
else
|
36
|
+
if has_terminal?("``", false, index)
|
37
|
+
r2 = instantiate_node(LeftQuoteNode,input, index...(index + 2))
|
38
|
+
@index += 2
|
39
|
+
else
|
40
|
+
terminal_parse_failure("``")
|
41
|
+
r2 = nil
|
42
|
+
end
|
43
|
+
if r2
|
44
|
+
r0 = r2
|
45
|
+
else
|
46
|
+
if has_terminal?("''", false, index)
|
47
|
+
r3 = instantiate_node(RightQuoteNode,input, index...(index + 2))
|
48
|
+
@index += 2
|
49
|
+
else
|
50
|
+
terminal_parse_failure("''")
|
51
|
+
r3 = nil
|
52
|
+
end
|
53
|
+
if r3
|
54
|
+
r0 = r3
|
55
|
+
else
|
56
|
+
@index = i0
|
57
|
+
r0 = nil
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
node_cache[:override][start_index] = r0
|
63
|
+
|
64
|
+
r0
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
class OverrideParser < Treetop::Runtime::CompiledParser
|
70
|
+
include Override
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "hemingway/override/override_nodes"
|
2
|
+
|
3
|
+
module Hemingway
|
4
|
+
grammar Override
|
5
|
+
|
6
|
+
# Plain text to be overridden with more appropriate characters
|
7
|
+
rule override
|
8
|
+
"---" <MDashNode>
|
9
|
+
/
|
10
|
+
"``" <LeftQuoteNode>
|
11
|
+
/
|
12
|
+
"''" <RightQuoteNode>
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
data/lib/hemingway/text/text.rb
CHANGED
data/lib/hemingway/version.rb
CHANGED
@@ -87,7 +87,7 @@ module Hemingway
|
|
87
87
|
|
88
88
|
it 'should wrap labels in the dictionary label tag' do
|
89
89
|
html = @parser.parse("\\begin{description} \\item [Frodo] Adventuerer \\item [Sam] Faithful Companion \\end{description}").html
|
90
|
-
html.should == "<div class='entry'><p><dl><
|
90
|
+
html.should == "<div class='entry'><p><dl><dt>Frodo</dt><dd> Adventuerer </dd><dt>Sam</dt><dd> Faithful Companion </dd></dl></p></div>"
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
data/spec/nodes/footnote_spec.rb
CHANGED
@@ -6,33 +6,36 @@ module Hemingway
|
|
6
6
|
|
7
7
|
before do
|
8
8
|
@parser = Parser.new
|
9
|
+
time = double()
|
10
|
+
Time.stub(:now) { time }
|
11
|
+
time.stub(:to_f) { 100.01 }
|
9
12
|
end
|
10
13
|
|
11
14
|
describe "#footnote" do
|
12
15
|
|
13
16
|
it "should put a footnote at the end of a paragraph" do
|
14
17
|
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='#
|
18
|
+
html.should == "<div class='entry'><p>You are what you redpoint<a href='#footnote1100-01'><span class='inline-footnote-number'><sup>1</sup></span></a>, after all.</p><div id='footnote1100-01' class='footnote'><span class='footnote-number'><sup>1</sup></span>sending a lead route</div></div>"
|
16
19
|
end
|
17
20
|
|
18
21
|
it "should put properly increment the footnote count per entry" do
|
19
22
|
html = @parser.parse("Slowly, Vader\\footnote{thug} approached Luke\\footnote{homeboy}").html
|
20
|
-
html.should == "<div class='entry'><p>Slowly, Vader<a href='#
|
23
|
+
html.should == "<div class='entry'><p>Slowly, Vader<a href='#footnote1100-01'><span class='inline-footnote-number'><sup>1</sup></span></a> approached Luke<a href='#footnote2100-01'><span class='inline-footnote-number'><sup>2</sup></span></a></p><div id='footnote1100-01' class='footnote'><span class='footnote-number'><sup>1</sup></span>thug</div><div id='footnote2100-01' class='footnote'><span class='footnote-number'><sup>2</sup></span>homeboy</div></div>"
|
21
24
|
end
|
22
25
|
|
23
26
|
it "should support any type of content in a footnote" do
|
24
27
|
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='#
|
28
|
+
html.should == "<div class='entry'><p>Dave Graham<a href='#footnote1100-01'><span class='inline-footnote-number'><sup>1</sup></span></a> makes the best mixtapes</p><div id='footnote1100-01' 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
29
|
end
|
27
30
|
|
28
31
|
it "should properly place footnotes from all paragraphs after all paragraphs an increment properly" do
|
29
32
|
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='#
|
33
|
+
html.should == "<div class='entry'><p>Freddie Gibbs<a href='#footnote1100-01'><span class='inline-footnote-number'><sup>1</sup></span></a> is hood<a href='#footnote2100-01'><span class='inline-footnote-number'><sup>2</sup></span></a> as all hell.</p><p> John Russel<a href='#footnote3100-01'><span class='inline-footnote-number'><sup>3</sup></span></a> almost got raped in Gary, ID<a href='#footnote4100-01'><span class='inline-footnote-number'><sup>4</sup></span></a></p><div id='footnote1100-01' class='footnote'><span class='footnote-number'><sup>1</sup></span>from Gary, Indiana</div><div id='footnote2100-01' class='footnote'><span class='footnote-number'><sup>2</sup></span>thug</div><div id='footnote3100-01' class='footnote'><span class='footnote-number'><sup>3</sup></span>of Short Bus fame</div><div id='footnote4100-01' class='footnote'><span class='footnote-number'><sup>4</sup></span>but not by Freddie Gibbs</div></div>"
|
31
34
|
end
|
32
35
|
|
33
36
|
it "will obviously allow me to drop a list in a footnote (this is just for my own satisfaction mostly)" do
|
34
37
|
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='#
|
38
|
+
html.should == "<div class='entry'><p>There are some rules<a href='#footnote1100-01'><span class='inline-footnote-number'><sup>1</sup></span></a> that we all must live by.</p><div id='footnote1100-01' 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
39
|
end
|
37
40
|
|
38
41
|
end
|
@@ -0,0 +1,22 @@
|
|
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 "#override" do
|
12
|
+
|
13
|
+
it 'should override a dash character' do
|
14
|
+
html = @parser.parse("Please--- wait for me.").html
|
15
|
+
html.should == "<div class='entry'><p>Please— wait for me.</p></div>"
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hemingway
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- William Myers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-04-
|
11
|
+
date: 2013-04-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -78,6 +78,9 @@ files:
|
|
78
78
|
- lib/hemingway/math/math.rb
|
79
79
|
- lib/hemingway/math/math.treetop
|
80
80
|
- lib/hemingway/math/math_nodes.rb
|
81
|
+
- lib/hemingway/override/override.rb
|
82
|
+
- lib/hemingway/override/override.treetop
|
83
|
+
- lib/hemingway/override/override_nodes.rb
|
81
84
|
- lib/hemingway/special/special.rb
|
82
85
|
- lib/hemingway/special/special.treetop
|
83
86
|
- lib/hemingway/special/special_nodes.rb
|
@@ -101,6 +104,7 @@ files:
|
|
101
104
|
- spec/nodes/block_spec.rb
|
102
105
|
- spec/nodes/footnote_spec.rb
|
103
106
|
- spec/nodes/math_spec.rb
|
107
|
+
- spec/nodes/override_spec.rb
|
104
108
|
- spec/nodes/special_spec.rb
|
105
109
|
- spec/nodes/tag_spec.rb
|
106
110
|
- spec/parser_spec.rb
|
@@ -138,6 +142,7 @@ test_files:
|
|
138
142
|
- spec/nodes/block_spec.rb
|
139
143
|
- spec/nodes/footnote_spec.rb
|
140
144
|
- spec/nodes/math_spec.rb
|
145
|
+
- spec/nodes/override_spec.rb
|
141
146
|
- spec/nodes/special_spec.rb
|
142
147
|
- spec/nodes/tag_spec.rb
|
143
148
|
- spec/parser_spec.rb
|