hemingway 0.0.0 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.travis.yml +4 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +297 -0
  7. data/Rakefile +1 -0
  8. data/hemingway.gemspec +23 -0
  9. data/lib/hemingway/block/block.rb +378 -0
  10. data/lib/hemingway/block/block.treetop +36 -0
  11. data/lib/hemingway/block/block_nodes.rb +9 -0
  12. data/lib/hemingway/block/list/list.rb +412 -0
  13. data/lib/hemingway/block/list/list.treetop +51 -0
  14. data/lib/hemingway/block/list/list_nodes.rb +39 -0
  15. data/lib/hemingway/block/quote/quote.rb +192 -0
  16. data/lib/hemingway/block/quote/quote.treetop +27 -0
  17. data/lib/hemingway/block/quote/quote_nodes.rb +25 -0
  18. data/lib/hemingway/block/verbatim/verbatim.rb +159 -0
  19. data/lib/hemingway/block/verbatim/verbatim.treetop +21 -0
  20. data/lib/hemingway/block/verbatim/verbatim_nodes.rb +9 -0
  21. data/lib/hemingway/build.rb +65 -0
  22. data/lib/hemingway/footnote/footnote.rb +83 -0
  23. data/lib/hemingway/footnote/footnote.treetop +11 -0
  24. data/lib/hemingway/footnote/footnote_nodes.rb +21 -0
  25. data/lib/hemingway/latex.rb +409 -0
  26. data/lib/hemingway/latex.treetop +81 -0
  27. data/lib/hemingway/latex_nodes.rb +45 -0
  28. data/lib/hemingway/math/math.rb +135 -0
  29. data/lib/hemingway/math/math.treetop +29 -0
  30. data/lib/hemingway/math/math_nodes.rb +7 -0
  31. data/lib/hemingway/special/special.rb +164 -0
  32. data/lib/hemingway/special/special.treetop +17 -0
  33. data/lib/hemingway/special/special_nodes.rb +7 -0
  34. data/lib/hemingway/symbol/symbol.rb +460 -0
  35. data/lib/hemingway/symbol/symbol.treetop +47 -0
  36. data/lib/hemingway/symbol/symbol_nodes.rb +7 -0
  37. data/lib/hemingway/tag/tag.rb +538 -0
  38. data/lib/hemingway/tag/tag.treetop +63 -0
  39. data/lib/hemingway/tag/tag_nodes.rb +49 -0
  40. data/lib/hemingway/text/text.rb +121 -0
  41. data/lib/hemingway/text/text.treetop +35 -0
  42. data/lib/hemingway/text/text_nodes.rb +7 -0
  43. data/lib/hemingway/version.rb +3 -0
  44. data/lib/hemingway.rb +7 -0
  45. data/script/build +22 -0
  46. data/script/test +2 -0
  47. data/spec/build_spec.rb +65 -0
  48. data/spec/nodes/block/list_spec.rb +91 -0
  49. data/spec/nodes/block/quote_spec.rb +31 -0
  50. data/spec/nodes/block/verbatim_spec.rb +27 -0
  51. data/spec/nodes/block_spec.rb +21 -0
  52. data/spec/nodes/footnote_spec.rb +42 -0
  53. data/spec/nodes/math_spec.rb +31 -0
  54. data/spec/nodes/special_spec.rb +27 -0
  55. data/spec/nodes/tag_spec.rb +98 -0
  56. data/spec/parser_spec.rb +48 -0
  57. data/spec/spec_helper.rb +5 -0
  58. metadata +110 -18
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bf15765814157f6a98fa3980ffe6e0c8d8c43861
4
+ data.tar.gz: 88cf015095d95839cbd00b93bf1891124f97b06c
5
+ SHA512:
6
+ metadata.gz: 2aab3777d099f030d8685f2f0e74080e71891ad9fb8d25a964a0f9f5e4b9135f4edf25f471386d44c335f5781a171cf0c7c4a27eab819b8ecc42502470d0da25
7
+ data.tar.gz: c201f4340c352d73cea3fdf80b076e13a705801d18806cd628aba1e9eb39a00417e92004b0b628948dcd6aeac275ee63f43dc857fc3a1af16c417fd365d1d437
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ .DS_Store
2
+ *.gem
3
+ *.rbc
4
+ .bundle
5
+ .config
6
+ .yardoc
7
+ *.tex
8
+ Gemfile.lock
9
+ InstalledFiles
10
+ _yardoc
11
+ coverage
12
+ doc/
13
+ lib/bundler/man
14
+ pkg
15
+ rdoc
16
+ spec/reports
17
+ test/tmp
18
+ test/version_tmp
19
+ tmp
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - "2.0.0"
4
+ script: bundle exec rspec
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Gem dependencies
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 William Myers
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,297 @@
1
+ # Hemingway [![Build Status](https://travis-ci.org/griffinmyers/hemingway.png?branch=master)](https://travis-ci.org/griffinmyers/hemingway)
2
+
3
+ Hemingway can translate a very rigid subset of LaTeX commands into HTML markup that can then be styled at the user's whim.
4
+
5
+ The parser was created using Treetop, so it might be useful to consult the [Treetop Documentation](http://treetop.rubyforge.org/syntactic_recognition.html) to learn more about the inner workings.
6
+
7
+ Throughout you'll notice this character: `\\`. This is the string represntation of the `\` character.
8
+
9
+ So if your latex is coming from a file you would just write `\emph{wookies}`, and if it were programatically coming from a string
10
+ you would write `\\emph{wookies}`
11
+
12
+ ## Installation
13
+
14
+ Add this line to your application's Gemfile:
15
+
16
+ ```ruby
17
+ gem 'hemingway'
18
+ ```
19
+
20
+ And then execute:
21
+
22
+ $ bundle
23
+
24
+ Or install it yourself as:
25
+
26
+ $ gem install hemingway
27
+
28
+ ## Usage
29
+
30
+ First, instantiate the parser.
31
+
32
+ ```ruby
33
+ parser = Hemingway::Parser.new
34
+ ```
35
+
36
+ Next, chuck some Latex markup into it.
37
+
38
+ ```ruby
39
+ result = parser.parse("do, or do not, there is no \\emph{try}")
40
+ ```
41
+
42
+ Finally, convert the result to html markup.
43
+
44
+ ```ruby
45
+ markup = result.html
46
+ ```
47
+
48
+ If something goes really wrong, the parse method will return `nil`. If that's the case, you can say something like
49
+
50
+ ```ruby
51
+ parser.failure_reason
52
+ ```
53
+
54
+ to figure out what happened. `Hemingway::Parser` is a delegator for a Treetop parser, so check out the [Treetop Documentation](http://treetop.rubyforge.org/syntactic_recognition.html) to see what other useful methods you can use in case of something going wrong.
55
+
56
+ ## Supported Syntax
57
+ Here is a breakdown of supported latex and its markup equivalent.
58
+ In most examples, I only show the interesting bits of conversion. Note that at the
59
+ top level, everything is wrapped in
60
+
61
+ ```html
62
+ <div class='entry'></div>
63
+ ```
64
+
65
+ but I'm omitting that detail from the examples for brevity. Throughout this,
66
+ the `:` operator simply says the LHS maps to the RHS.
67
+
68
+ ###### Newlines
69
+
70
+ Delimits paragraphs
71
+
72
+ ```html
73
+ wookie\n\nbreakfast : <p>wookie></p><p>breakfast</p>
74
+ ```
75
+
76
+ ###### Tags
77
+
78
+ Adds inline styling
79
+
80
+ ```html
81
+ That’s no moon, \\emph{it’s a space station.} : That’s no moon, <em>it’s a space station.</em>
82
+
83
+ \\textbf{The Force} : <strong>The Force</strong>
84
+
85
+ \\texttt{R2-D2} : <code>R2-D2</code>
86
+
87
+ \\textsc{Death Star} : <span class='textsc'>Death Star</span>
88
+ ```
89
+
90
+ Or some vertical padding
91
+
92
+ ```html
93
+ \\vspace{5mm} : <div class='vspace5'></div>
94
+ ```
95
+
96
+ ###### Maths
97
+
98
+ Adds math symbols
99
+
100
+ ```html
101
+ $\\Gamma$" : &Gamma;
102
+ $\\Delta$" : &Delta;
103
+ $\\Theta$" : &Theta;
104
+ $\\Lambda$" : &Lambda;
105
+ $\\Xi$" : &Xi;
106
+ $\\Pi$" : &Pi;
107
+ $\\Sigma$" : &Sigma;
108
+ $\\Upsilon$" : &Upsilon;
109
+ $\\Phi$" : &Phi;
110
+ $\\Psi$" : &Psi;
111
+ $\\Omega$" : &Omega;
112
+ $\\alpha$" : &alpha;
113
+ $\\beta$" : &beta;
114
+ $\\gamma$" : &gamma;
115
+ $\\delta$" : &delta;
116
+ $\\epsilon$" : &epsilon;
117
+ $\\zeta$" : &zeta;
118
+ $\\eta$" : &eta;
119
+ $\\theta$" : &theta;
120
+ $\\iota$" : &iota;
121
+ $\\kappa$" : &kappa;
122
+ $\\lambda$" : &lambda;
123
+ $\\mu$" : &mu;
124
+ $\\nu$" : &nu;
125
+ $\\xi$" : &xi;
126
+ $\\pi$" : &pi;
127
+ $\\rho$" : &rho;
128
+ $\\varsigma$" : &sigmaf;
129
+ $\\sigma$" : &sigma;
130
+ $\\tau$" : &tau;
131
+ $\\upsilon$" : &upsilon;
132
+ $\\phi$" : &phi;
133
+ $\\chi$" : &chi;
134
+ $\\psi$" : &psi;
135
+ $\\omega$" : &omega;
136
+ ```
137
+
138
+
139
+ ###### Special Characters
140
+
141
+ ```html
142
+ \\# : #
143
+ \\$ : $
144
+ \\% : %
145
+ \\& : &
146
+ \\_ : _
147
+ \\{ : {
148
+ \\} : }
149
+ ```
150
+
151
+ ###### Blocks
152
+
153
+ You can make lists with `itemize`, `description`, or `enumerate`.
154
+
155
+ ```html
156
+ \\begin{itemize}\\item Wookie \\item Jedi \\end{itemize} : <ul><li>Wookie </li><li>Jedi </li></ul>
157
+
158
+ \\begin{enumerate} \\item Frodo \\item Sam \\end{enumerate} : <ol><li>Frodo </li><li>Sam </li></ol>
159
+
160
+ \\begin{description} \\item Ginger-Nut \\item Turkey \\end{description} : <dl><dd>Ginger-Nut </dd><dd>Turkey </dd></dl>
161
+ ```
162
+
163
+ Add labels to a list with `\item[label]`:
164
+
165
+ ```html
166
+ \\begin{itemize}\\item[bros] before hoes \\item \\n [chicks] before dicks \\end{itemize} : <ul><li><span class='list-label'>bros</span> before hoes </li><li><span class='list-label'>chicks</span> before dicks </li></ul>
167
+
168
+ \\begin{description} \\item [Frodo] Intrepid Adventurer \\item [Sam] Faithful Companion \\end{description} : <dl><dd><dt>Frodo</dt> Intrepid Adventurer </dd><dd><dt>Sam</dt> Faithful Companion </dd></dl>
169
+ ```
170
+
171
+ Go ahead, nest lists in all sorts of interesting ways. No reason you couldn't chuck some empahsized text in a label either.
172
+
173
+ Enter in preformatted text:
174
+
175
+ ```html
176
+ \\begin{verbatim} don't we \n \n all wish \n \n for a little sleep? \\end{verbatim}") : <pre>don't we \n \n all wish \n \n for a little sleep? </pre>
177
+ ```
178
+
179
+ ###### Footnotes
180
+
181
+ Putting in a bunch of footnotes inline with your content is an awesome idea. All footnotes within an entry
182
+ will be yanked out, linked with an anchor tag, and placed after all paragraphs in the entry. Naturally
183
+ you can put just about whatever you want in a footnote (save another footnote).
184
+
185
+ I might have made a bad assumption here and used the `<sup>` tag for the footnote number because it assumes formatting, something I've been trying to avoid. If you'd like that assumption removed, you're just a pull request away.
186
+
187
+ For example this latex markup:
188
+
189
+ > So we met up with Han and saw his ship, The Millennium Falcon\\footnote{a total piece of junk}. I had no idea how that thing was supposed to get us to Alderaan\\footnote{location of the \\emph{hidden rebel base}}.
190
+
191
+ > On board we found homely accommodations including a Dejarik\\footnote{much like chess} set that I indulged in with Chewbacca\\footnote{Han's carpety first mate}.
192
+
193
+ Renders to this html:
194
+
195
+ ```html
196
+ <div class='entry'>
197
+ <p>
198
+ So we met up with Han and saw his ship, The Millenium Falcon<a href='#footnote1'><span class='inline-footnote-number'><sup>1</sup></span></a>. I had no idea how that thing was supposed to get us to Alderaan<a href='#footnote2'><span class='inline-footnote-number'><sup>2</sup></span></a>.
199
+ </p>
200
+ <p>
201
+ On board we found homely accommodations including a Dejarik<a href='#footnote3'><span class='inline-footnote-number'><sup>3</sup></span></a> set that I indulged in with Chewbacca<a href='#footnote4'><span class='inline-footnote-number'><sup>4</sup></span></a>.
202
+ </p>
203
+
204
+ <div id='footnote1' class='footnote'>
205
+ <span class='footnote-number'><sup>1</sup></span>a total piece of junk
206
+ </div>
207
+
208
+ <div id='footnote2' class='footnote'>
209
+ <span class='footnote-number'><sup>2</sup></span>location of the <em>hidden rebel base</em>
210
+ </div>
211
+
212
+ <div id='footnote3' class='footnote'>
213
+ <span class='footnote-number'><sup>3</sup></span>much like chess
214
+ </div>
215
+
216
+ <div id='footnote4' class='footnote'>
217
+ <span class='footnote-number'><sup>4</sup></span>Han's carpety first mate
218
+ </div>
219
+
220
+ </div>
221
+ ```
222
+
223
+ And looks like this:
224
+
225
+ <div class='entry'>
226
+ <p>
227
+ So we met up with Han and saw his ship, The Millennium Falcon<a href='#footnote1'><span class='inline-footnote-number'><sup>1</sup></span></a>. I had no idea how that thing was supposed to get us to Alderaan<a href='#footnote2'><span class='inline-footnote-number'><sup>2</sup></span></a>.
228
+ </p>
229
+ <p>
230
+ On board we found homely accommodations including a Dejarik<a href='#footnote3'><span class='inline-footnote-number'><sup>3</sup></span></a> set that I indulged in with Chewbacca<a href='#footnote4'><span class='inline-footnote-number'><sup>4</sup></span></a>.
231
+ </p>
232
+
233
+ <div id='footnote1' class='footnote'>
234
+ <span class='footnote-number'><sup>1</sup></span>a total piece of junk
235
+ </div>
236
+
237
+ <div id='footnote2' class='footnote'>
238
+ <span class='footnote-number'><sup>2</sup></span>location of the <em>hidden rebel base</em>
239
+ </div>
240
+
241
+ <div id='footnote3' class='footnote'>
242
+ <span class='footnote-number'><sup>3</sup></span>much like chess
243
+ </div>
244
+
245
+ <div id='footnote4' class='footnote'>
246
+ <span class='footnote-number'><sup>4</sup></span>Han's carpety first mate
247
+ </div>
248
+
249
+ </div>
250
+
251
+ ###### Block Quotes
252
+
253
+ Pretty standard. You can put anything in there except a footnote. That seemed
254
+ excessive.
255
+
256
+ ```html
257
+ \\begin{quote}
258
+ Have you guys ever heard the song \\emph{Blow} by \\emph{MILF}?
259
+ \\end{quote}
260
+ ```
261
+
262
+ maps to
263
+
264
+ ```html
265
+ <blockquote>
266
+ <p>
267
+ Have you guys ever heard the song <em>Blow</em> by <em>MILF</em>?
268
+ </p>
269
+ </blockquote>
270
+ ```
271
+
272
+ ###### Inline Right Justification
273
+
274
+ ```html
275
+ The love, \\hfill Will
276
+ ```
277
+
278
+ maps to
279
+
280
+ ```html
281
+ The love, <span class="pull-right">Will</span>
282
+ ```
283
+
284
+ ###### Horizontal Rules
285
+
286
+ ```html
287
+ \\neatline : <hr class='neatline'>
288
+ ```
289
+
290
+ ## Contributing
291
+
292
+ 1. Fork it
293
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
294
+ 3. Write and run tests (`script/test`)
295
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
296
+ 4. Push to the branch (`git push origin my-new-feature`)
297
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/hemingway.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'hemingway/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "hemingway"
8
+ gem.version = Hemingway::VERSION
9
+ gem.authors = ["William Myers"]
10
+ gem.email = ["griffin.myers@gmail.com"]
11
+ gem.description = %q{A LaTeX to HTML parser.}
12
+ gem.summary = %q{Hemingway is a LaTeX to HTML parser.}
13
+ gem.homepage = "https://rubygems.org/gems/hemingway"
14
+ gem.licenses = "MIT"
15
+
16
+ gem.add_development_dependency "rspec"
17
+ gem.add_runtime_dependency "treetop"
18
+
19
+ gem.files = `git ls-files`.split($/)
20
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
21
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
22
+ gem.require_paths = ["lib"]
23
+ end