polytexnic 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +37 -0
  3. data/.pull_requests/1371777257 +0 -0
  4. data/.pull_requests/1371927975 +0 -0
  5. data/.pull_requests/1372804345 +0 -0
  6. data/.pull_requests/1374784075 +0 -0
  7. data/.pull_requests/1375304853 +0 -0
  8. data/.pull_requests/1375408308 +0 -0
  9. data/.pull_requests/1375409462 +0 -0
  10. data/.pull_requests/1375410668 +0 -0
  11. data/.pull_requests/1375472132 +0 -0
  12. data/.pull_requests/1375485496 +0 -0
  13. data/.pull_requests/1375487548 +0 -0
  14. data/.pull_requests/1375492835 +0 -0
  15. data/.pull_requests/1375497765 +0 -0
  16. data/.pull_requests/1375559547 +0 -0
  17. data/.pull_requests/1375589063 +0 -0
  18. data/.pull_requests/1375841786 +0 -0
  19. data/.pull_requests/1376352634 +0 -0
  20. data/.pull_requests/1376353299 +0 -0
  21. data/.pull_requests/1376449284 +0 -0
  22. data/.pull_requests/1376452696 +0 -0
  23. data/.pull_requests/1376454166 +0 -0
  24. data/.pull_requests/1376532291 +0 -0
  25. data/.pull_requests/1376625487 +0 -0
  26. data/.pull_requests/1376690108 +0 -0
  27. data/.pull_requests/1376699046 +0 -0
  28. data/.pull_requests/1376707642 +0 -0
  29. data/.pull_requests/1377230284 +0 -0
  30. data/.pull_requests/1379118478 +0 -0
  31. data/.pull_requests/1379123150 +0 -0
  32. data/.pull_requests/1380221847 +0 -0
  33. data/.pull_requests/1380589654 +0 -0
  34. data/.pull_requests/1380673142 +0 -0
  35. data/.pull_requests/1380850800 +0 -0
  36. data/.pull_requests/1381001264 +0 -0
  37. data/.pull_requests/1381005204 +0 -0
  38. data/.pull_requests/1381103022 +0 -0
  39. data/.pull_requests/1381252832 +0 -0
  40. data/.pull_requests/1381276624 +0 -0
  41. data/.pull_requests/1381344234 +0 -0
  42. data/.pull_requests/1381385297 +0 -0
  43. data/.pull_requests/1381427498 +0 -0
  44. data/.pull_requests/1381429761 +0 -0
  45. data/.pull_requests/1381873684 +0 -0
  46. data/.pull_requests/1382045490 +0 -0
  47. data/.pull_requests/1382056384 +0 -0
  48. data/.pull_requests/1382405223 +0 -0
  49. data/.pull_requests/1382478400 +0 -0
  50. data/.pull_requests/1382479780 +0 -0
  51. data/.pull_requests/1382485483 +0 -0
  52. data/.pull_requests/1382569911 +0 -0
  53. data/.pull_requests/1382646199 +0 -0
  54. data/.pull_requests/1382649778 +0 -0
  55. data/.pull_requests/1382660987 +0 -0
  56. data/.pull_requests/1382743927 +0 -0
  57. data/.pull_requests/1382840347 +0 -0
  58. data/.pull_requests/1383077676 +0 -0
  59. data/.pull_requests/1383086948 +0 -0
  60. data/.pull_requests/1383161978 +0 -0
  61. data/.pull_requests/1383263695 +0 -0
  62. data/.pull_requests/1383274008 +0 -0
  63. data/.pull_requests/1383327328 +0 -0
  64. data/.rspec +2 -0
  65. data/.ruby-gemset +1 -0
  66. data/.ruby-version +1 -0
  67. data/Gemfile +15 -0
  68. data/Guardfile +15 -0
  69. data/LICENSE.txt +22 -0
  70. data/README.md +21 -0
  71. data/Rakefile +2 -0
  72. data/lib/polytexnic/literal.rb +299 -0
  73. data/lib/polytexnic/postprocessor.rb +28 -0
  74. data/lib/polytexnic/postprocessors/html.rb +1139 -0
  75. data/lib/polytexnic/postprocessors/latex.rb +18 -0
  76. data/lib/polytexnic/postprocessors/polytex.rb +44 -0
  77. data/lib/polytexnic/preprocessor.rb +23 -0
  78. data/lib/polytexnic/preprocessors/html.rb +349 -0
  79. data/lib/polytexnic/preprocessors/latex.rb +43 -0
  80. data/lib/polytexnic/preprocessors/polytex.rb +127 -0
  81. data/lib/polytexnic/utils.rb +176 -0
  82. data/lib/polytexnic/version.rb +3 -0
  83. data/lib/polytexnic.rb +92 -0
  84. data/notes/pandoc.md +41 -0
  85. data/polytexnic.gemspec +28 -0
  86. data/polytexnic_commands.sty +5 -0
  87. data/precompiled_binaries/tralics +0 -0
  88. data/spec/fixtures/code_listing.tex +14 -0
  89. data/spec/fixtures/figures.tex +8 -0
  90. data/spec/fixtures/inline_math.html +4 -0
  91. data/spec/fixtures/inline_math.tex +3 -0
  92. data/spec/fixtures/math_environments.html +50 -0
  93. data/spec/fixtures/math_environments.tex +56 -0
  94. data/spec/fixtures/section_xrefs.tex +9 -0
  95. data/spec/fixtures/sidebar.tex +10 -0
  96. data/spec/fixtures/tables.tex +8 -0
  97. data/spec/fixtures/verbatim_environments.html +11 -0
  98. data/spec/fixtures/verbatim_environments.tex +13 -0
  99. data/spec/integration_spec.rb +34 -0
  100. data/spec/markdown_to_polytex_spec.rb +192 -0
  101. data/spec/resemble_matcher_spec.rb +69 -0
  102. data/spec/spec_helper.rb +38 -0
  103. data/spec/support/resemble_matcher.rb +100 -0
  104. data/spec/to_html/asides_spec.rb +42 -0
  105. data/spec/to_html/chapters_and_sections_spec.rb +268 -0
  106. data/spec/to_html/characters_and_punctuation_spec.rb +138 -0
  107. data/spec/to_html/codelistings_spec.rb +70 -0
  108. data/spec/to_html/core_spec.rb +227 -0
  109. data/spec/to_html/eqref_spec.rb +32 -0
  110. data/spec/to_html/footnote_spec.rb +164 -0
  111. data/spec/to_html/graphics_and_figures_spec.rb +358 -0
  112. data/spec/to_html/lists_spec.rb +103 -0
  113. data/spec/to_html/literal_environments/code_spec.rb +141 -0
  114. data/spec/to_html/literal_environments/math_spec.rb +255 -0
  115. data/spec/to_html/literal_environments/unicode_spec.rb +12 -0
  116. data/spec/to_html/literal_environments/verbatim_spec.rb +168 -0
  117. data/spec/to_html/quotations_and_verse_spec.rb +86 -0
  118. data/spec/to_html/table_of_contents_spec.rb +93 -0
  119. data/spec/to_html/table_spec.rb +269 -0
  120. data/spec/to_html/text_formatting_spec.rb +50 -0
  121. data/spec/to_latex_spec.rb +197 -0
  122. data/tasks/bin/ruby_tests +41 -0
  123. data/tasks/run_tests_with_both_rubies.rake +5 -0
  124. data/tmp/.gitkeep +0 -0
  125. metadata +286 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c16ad8d5728f4ac2d87b81744b76c4a854e26d88
4
+ data.tar.gz: 5859a31e6722957809d2fd080c5170a05be7b5e1
5
+ SHA512:
6
+ metadata.gz: 12e8c475ee247533ce1dcf0b1db8ad7cf3806a2cf81cf5726b935fbc0d23ac60ccc1998e7e38c5a234911be9ff370abdac44f6782caf5b5f1f28a3608240f3b2
7
+ data.tar.gz: 54b074f7a0df5e183cf333a52ceb5d4fa1b7addc3085c5b082da3c15f693a7afe03fba5295a8b140b85d48dfece737a8e74d258a021420935d497301007e584c
data/.gitignore ADDED
@@ -0,0 +1,37 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ log
19
+ .highlight_cache
20
+
21
+ # Compiled Object files
22
+ *.slo
23
+ *.lo
24
+ *.o
25
+
26
+ # Compiled Dynamic libraries
27
+ *.so
28
+ *.dylib
29
+
30
+ # Compiled Static libraries
31
+ *.lai
32
+ *.la
33
+ *.a
34
+
35
+ .DS_Store
36
+ .api_token
37
+ .project_id
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ polytexnic
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.0.0-p247
data/Gemfile ADDED
@@ -0,0 +1,15 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :test do
6
+ gem 'debugger2' unless RUBY_VERSION < "2.0"
7
+ gem 'coveralls', require: false
8
+ gem 'growl'
9
+ end
10
+
11
+ group :development do
12
+ gem 'rspec', '~> 2.13'
13
+ gem 'guard-rspec'
14
+ gem 'rake'
15
+ end
data/Guardfile ADDED
@@ -0,0 +1,15 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard :rspec do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { "spec" }
7
+ ## Uncomment & edit below (and comment out above) to watch particular specs.
8
+ # watch(%r{^lib/(.+)\.rb$}) do
9
+ # [
10
+ # "spec/to_html/asides_spec.rb",
11
+ # "spec/to_html/codelistings_spec.rb"
12
+ # ]
13
+ # end
14
+ watch('spec/spec_helper.rb') { "spec" }
15
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Michael Hartl and Nick Merwin
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,21 @@
1
+ # polytexnic
2
+
3
+ This is the `polytexnic` gem, which converts input in Markdown or PolyTeX to HTML and LaTeX. It currently has no standalone applications, but rather exists to support the `polytexnic` gem.
4
+
5
+ ## Installation
6
+
7
+ This gem is installed automatically as a dependency of the `polytexnic` gem:
8
+
9
+ $ gem install polytexnic
10
+
11
+ ## Usage
12
+
13
+ See [*The PolyTeXnic Book*](http://polytexnic.org/book) for more information.
14
+
15
+ ## Contributing
16
+
17
+ 1. Fork it
18
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
19
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
20
+ 4. Push to the branch (`git push origin my-new-feature`)
21
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+ Dir["tasks/**/*.rake"].sort.each { |ext| load ext }
@@ -0,0 +1,299 @@
1
+ module Polytexnic
2
+ module Literal
3
+
4
+ # Matches the line for syntax highlighting.
5
+ # %= lang:<language>
6
+ LANG_REGEX = /^\s*%=\s+lang:\s*(\w+)/
7
+
8
+ # Matches the line for code inclusion.
9
+ # %= <</path/to/code.ext
10
+ CODE_INCLUSION_REGEX = /^\s*%=\s+<<\s*\( # opening
11
+ \s*([\w\/]+\.?(\w*)) # path
12
+ (?:,\s*lang:\s*(\w+))? # optional lang
13
+ \s*\) # closing paren
14
+ /x
15
+
16
+ # Makes the caches for literal environments.
17
+ def cache_literal(polytex, format = :html)
18
+ output = []
19
+ lines = polytex.split("\n")
20
+ cache_literal_environments(lines, output, format)
21
+ output.join("\n")
22
+ end
23
+
24
+ # Handles environments that should be passed through the pipeline intact.
25
+ # The includes verbatim environments ('verbatim', 'Verbatim') and all the
26
+ # equation environments handled by MathJax ('equation', 'align', etc.).
27
+ # We take care to keep count of the number of begins we see so that the
28
+ # code handles nested environments correctly. I.e.,
29
+ # \begin{verbatim}
30
+ # \begin{verbatim}
31
+ # \emph{foo bar}
32
+ # \end{verbatim}
33
+ # \end{verbatim}
34
+ # lorem ipsum
35
+ # includes the internal literal text without stopping after the first
36
+ # \end{verbatim}.
37
+ #
38
+ # The control flow here is really nasty, but attempts to refactor it
39
+ # into a multi-pass solution have only resulted in even more complexity,
40
+ # and even then I've failed to get it to work. Thus, it shall for now
41
+ # follow the "ball of mud" pattern. (The only saving grace is that it's
42
+ # very thoroughly tested.)
43
+ def cache_literal_environments(lines, output, format)
44
+ latex = (format == :latex)
45
+ language = nil
46
+ in_verbatim = false
47
+ in_codelisting = false
48
+ while (line = lines.shift)
49
+ if line =~ LANG_REGEX && !in_verbatim
50
+ language = $1
51
+ elsif line =~ /\s*\\begin\{codelisting\}/ && !in_verbatim
52
+ in_codelisting = true
53
+ output << line
54
+ elsif line =~ /\s*\\end\{codelisting\}/ && !in_verbatim
55
+ in_codelisting = false
56
+ output << line
57
+ elsif line =~ CODE_INCLUSION_REGEX && !in_verbatim
58
+ # Reduce to a previously solved problem.
59
+ # We transform
60
+ # %= <<(/path/to/file.rb)
61
+ # to
62
+ # %= lang:rb
63
+ # \begin{code}
64
+ # <content of file.rb>
65
+ # \end{code}
66
+ # and then prepend the code to the current `lines` array.
67
+ filename = $1
68
+ if File.exist?(filename)
69
+ language = $3 || $2 || 'text'
70
+ code = ["%= lang:#{language}"]
71
+ code << '\begin{code}'
72
+ code.concat(File.read($1).split("\n"))
73
+ code << '\end{code}'
74
+ lines.unshift(*code)
75
+ else
76
+ lines.unshift("\\verb+ERROR: File '#{filename}' does not exist+")
77
+ end
78
+ elsif line.begin_literal?
79
+ in_verbatim = true
80
+ literal_type = line.literal_type
81
+ skip = line.math_environment? || latex
82
+ if line.math_environment? && !latex
83
+ output << '\begin{xmlelement*}{equation}'
84
+ output << '\begin{equation}'
85
+ end
86
+ math = line.math_environment?
87
+ label = nil
88
+ output << xmlelement(element(literal_type), skip) do
89
+ count = 1
90
+ text = []
91
+ text << line if line.math_environment? || (latex && !language)
92
+ while (line = lines.shift)
93
+ if line.begin_literal?(literal_type)
94
+ count += 1
95
+ elsif line.end_literal?(literal_type)
96
+ count -= 1
97
+ if count.zero?
98
+ in_verbatim = false
99
+ text << line if line.math_environment? || (latex && !language)
100
+ break
101
+ end
102
+ end
103
+ label = line if math && line =~ /^\s*\\label{.*?}\s*$/
104
+ text << line
105
+ end
106
+ raise "Missing \\end{#{line.literal_type}}" if count != 0
107
+ content = text.join("\n")
108
+ if math
109
+ key = digest(content)
110
+ literal_cache[key] = content
111
+ elsif language.nil?
112
+ key = digest(content)
113
+ literal_cache[key] = content
114
+ tag = 'literal'
115
+ else
116
+ format = latex ? 'latex' : 'html'
117
+ id = "#{content}--#{language}--#{format}--#{in_codelisting}"
118
+ key = digest(id, salt: code_salt)
119
+ code_cache[key] = [content, language, in_codelisting]
120
+ tag = 'code'
121
+ end
122
+ if latex || tag == 'code' || math
123
+ key
124
+ else
125
+ xmlelement(tag) { key }
126
+ end
127
+ end
128
+ if math && !latex
129
+ unless label.nil?
130
+ key = digest(label)
131
+ math_label_cache[key] = label
132
+ output << key
133
+ end
134
+ output << '\end{equation}'
135
+ unless label.nil?
136
+ string = label.scan(/\{(.*?)\}/).flatten.first
137
+ string = string.gsub(':', '-').gsub('_', underscore_digest)
138
+ output << "\\xbox{data-label}{#{string}}"
139
+ end
140
+ output << '\end{xmlelement*}'
141
+ end
142
+ language = nil
143
+ (output << '') unless latex # Force the next element to be a paragraph
144
+ else
145
+ output << line
146
+ end
147
+ end
148
+ end
149
+
150
+ # Returns a permanent salt syntax highlighting cache.
151
+ def code_salt
152
+ 'fbbc13ed4a51e27608037365e1d27a5f992b6339'
153
+ end
154
+
155
+ # Caches both display and inline math.
156
+ def cache_display_inline_math(output)
157
+ output.tap do
158
+ cache_display_math(output)
159
+ cache_inline_math(output)
160
+ end
161
+ end
162
+
163
+ # Caches display math.
164
+ # We support both TeX-style $$...$$ and LaTeX-style \[ ... \].
165
+ def cache_display_math(output)
166
+ output.gsub!(/\\\[(.*?)\\\]|\$\$(.*?)\$\$/m) do
167
+ math = "\\[ #{$1 || $2} \\]"
168
+ equation_element(math)
169
+ end
170
+ end
171
+
172
+ # Returns an equation element while caching the given content.
173
+ # We use this only for unnumbered, display equations, which requires using
174
+ # the `equation*` environment in place of `equation`.
175
+ def equation_element(content)
176
+ key = digest(content)
177
+ literal_cache[key] = content
178
+ "\\begin{xmlelement*}{equation}
179
+ \\begin{equation*}
180
+ #{key}
181
+ \\end{equation*}
182
+ \\end{xmlelement*}"
183
+ end
184
+
185
+ # Caches inline math.
186
+ # We support both TeX-style $...$ and LaTeX-style \( ... \).
187
+ # There's an annoying edge case involving literal dollar signs, as in \$.
188
+ # Handling it significantly complicates the regex, and necessesitates
189
+ # introducing an additional group to catch the character before the math
190
+ # dollar sign in $2 and prepend it to the inline math element.
191
+ def cache_inline_math(output)
192
+ output.gsub!(/(?:\\\((.*?)\\\)|([^\\]|^)\$(.*?[^\\])\$)/m) do
193
+ math = "\\( #{$1 || $3} \\)"
194
+ key = digest(math)
195
+ literal_cache[key] = math
196
+ $2.to_s + xmlelement('inline') { key }
197
+ end
198
+ end
199
+
200
+ # Converts references to hyperrefs.
201
+ # We want to convert
202
+ # Chapter~\ref{cha:foo}
203
+ # to
204
+ # \hyperref[cha:foo]{Chapter~\ref{cha:foo}
205
+ # which is then handled by LaTeX's hyperref package
206
+ # or by Tralics (where it converted to a link
207
+ # by the postprocessor).
208
+ # For completeness, we handle the case where the author neglects to
209
+ # use the nonbreak space ~.
210
+ def hyperrefs(string)
211
+ linked_item = "(Chapter|Section|Table|Box|Figure|Fig\.|Listing" +
212
+ "|Equation|Eq\.)"
213
+ ref = /(?:#{linked_item}(~| ))*(\\(?:eq)*ref){(.*?)}/i
214
+ string.gsub!(ref) do
215
+ "\\hyperref[#{$4}]{#{$1}#{$2}#{$3}{#{$4}}}"
216
+ end
217
+ end
218
+
219
+ # Handles non-ASCII Unicode characters.
220
+ # The Tralics part of the pipeline doesn't properly handle Unicode,
221
+ # which is odd since Tralics is a French project. Nevertheless,
222
+ # we can hack around the restriction by treating non-ASCII Unicode
223
+ # characters as literal elements and simply pass them through the
224
+ # pipeline intact.
225
+ def cache_unicode(string)
226
+ non_ascii_unicode = /([^\x00-\x7F]+)/
227
+ string.gsub(non_ascii_unicode) do
228
+ key = digest($1)
229
+ literal_cache[key] = $1
230
+ xmlelement('unicode') { key }
231
+ end
232
+ end
233
+
234
+ def element(literal_type)
235
+ if math_environments.include?(literal_type)
236
+ 'equation'
237
+ else
238
+ literal_type
239
+ end
240
+ end
241
+ end
242
+ end
243
+
244
+ # Returns supported math environments.
245
+ # Note that the custom AMS-TeX environments are supported
246
+ # in addition to the LaTeX defaults.
247
+ def math_environments
248
+ %w[align align*
249
+ eqnarray eqnarray* equation equation*
250
+ gather gather* gathered
251
+ multline multline*
252
+ ]
253
+ end
254
+
255
+ class String
256
+
257
+ # Returns true if self matches \begin{...} where ... is a literal environment.
258
+ # Note: Support for the 'metacode' environment exists solely to allow
259
+ # meta-discussion of the 'code' environment.
260
+ def begin_literal?(literal_type = nil)
261
+ return false unless include?('\begin')
262
+ literal_type ||= "(?:verbatim|Verbatim|code|metacode|" +
263
+ "#{math_environment_regex})"
264
+ match(/^\s*\\begin{#{literal_type}}\s*$/)
265
+ end
266
+
267
+ # Returns true if self matches \end{...} where ... is a literal environment.
268
+ def end_literal?(literal_type)
269
+ return false unless include?('\end')
270
+ match(/^\s*\\end{#{Regexp.escape(literal_type)}}\s*$/)
271
+ end
272
+
273
+ # Returns the type of literal environment.
274
+ # '\begin{verbatim}' => 'verbatim'
275
+ # '\begin{equation}' => 'equation'
276
+ # '\[' => 'display'
277
+ def literal_type
278
+ scan(/\\begin{(.*?)}/).flatten.first || 'display'
279
+ end
280
+
281
+ # Returns true if self begins a math environment.
282
+ def begin_math?
283
+ return false unless include?('\begin')
284
+ literal_type = "(?:#{math_environment_regex})"
285
+ match(/^\s*\\begin{#{literal_type}}\s*$/)
286
+ end
287
+
288
+ # Returns true if self matches a valid math environment.
289
+ def math_environment?
290
+ match(/(?:#{math_environment_regex})/)
291
+ end
292
+
293
+ private
294
+
295
+ # Returns a regex matching valid math environments.
296
+ def math_environment_regex
297
+ math_environments.map { |s| Regexp.escape(s) }.join('|')
298
+ end
299
+ end
@@ -0,0 +1,28 @@
1
+ # encoding=utf-8
2
+ require 'cgi'
3
+ require 'polytexnic/postprocessors/html'
4
+ require 'polytexnic/postprocessors/latex'
5
+ require 'polytexnic/postprocessors/polytex'
6
+
7
+ module Polytexnic
8
+ module Postprocessor
9
+ include Html
10
+ include Latex
11
+ include Polytex
12
+
13
+ def postprocess(format)
14
+ case format
15
+ when :html
16
+ @html = xml_to_html(@xml)
17
+ when :latex
18
+ hyperrefs(@polytex)
19
+ raw_source = replace_hashes(@polytex)
20
+ @latex = highlight_source_code(raw_source)
21
+ when :polytex
22
+ remove_hypertarget
23
+ fix_verbatim_bug
24
+ write_polytex_code
25
+ end
26
+ end
27
+ end
28
+ end