polytexnic 1.5.16 → 1.6.4
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 +4 -4
- data/Gemfile +1 -1
- data/Gemfile.lock +24 -23
- data/bin/polytexnic +77 -12
- data/lib/polytexnic/postprocessors/html.rb +1 -1
- data/lib/polytexnic/preprocessors/html.rb +1 -1
- data/lib/polytexnic/utils.rb +10 -2
- data/lib/polytexnic/version.rb +1 -1
- data/polytexnic.gemspec +4 -4
- data/spec/to_html/core_spec.rb +9 -0
- data/spec/to_html/literal_environments/code_spec.rb +34 -8
- data/spec/to_html/text_formatting_spec.rb +1 -1
- data/spec/to_latex_spec.rb +2 -2
- metadata +25 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6d7799a38185640239ca691d3139570d4abbb14a35fbf9c900946bff62cc41eb
|
4
|
+
data.tar.gz: 513c2c37e46535fd6abdd66448f6593daee2329be52c4768146205d74c0f17e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 79102ce8772b68e4a4d25a3b7ff3db533f06fff37804ba87ec347a5be785d5a290731232aa94849b17e725080f84863b1108a218550e70fffea224b2163993e4
|
7
|
+
data.tar.gz: 4f0dc0d6b4d507bdab09071011f3168043d27627fdbe030d6ad2046531d8a6b544284f7aede474d6c13dd0bd4a91b02a77bc7c4427348eebed0669e56d0f9987
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
polytexnic (1.
|
4
|
+
polytexnic (1.6.4)
|
5
5
|
json (~> 2.3.0)
|
6
|
-
kramdown (
|
6
|
+
kramdown (>= 2.0, < 3.0)
|
7
7
|
msgpack (~> 1.2.0)
|
8
|
-
nokogiri (
|
9
|
-
pygments.rb (~>
|
8
|
+
nokogiri (>= 1.6.0, < 2.0)
|
9
|
+
pygments.rb (~> 2.1)
|
10
10
|
|
11
11
|
GEM
|
12
12
|
remote: https://rubygems.org/
|
13
13
|
specs:
|
14
|
-
coderay (1.1.
|
14
|
+
coderay (1.1.3)
|
15
15
|
columnize (0.9.0)
|
16
16
|
coveralls (0.7.2)
|
17
17
|
multi_json (~> 1.3)
|
@@ -23,9 +23,9 @@ GEM
|
|
23
23
|
debugger2 (1.0.0.beta2)
|
24
24
|
columnize (>= 0.3.1)
|
25
25
|
debugger-linecache (~> 1.2.0)
|
26
|
-
diff-lcs (1.
|
26
|
+
diff-lcs (1.4.4)
|
27
27
|
docile (1.1.5)
|
28
|
-
ffi (1.
|
28
|
+
ffi (1.15.0)
|
29
29
|
formatador (0.2.5)
|
30
30
|
growl (1.0.3)
|
31
31
|
guard (2.16.2)
|
@@ -42,36 +42,37 @@ GEM
|
|
42
42
|
guard (~> 2.1)
|
43
43
|
guard-compat (~> 1.1)
|
44
44
|
rspec (>= 2.99.0, < 4.0)
|
45
|
-
json (2.3.
|
46
|
-
kramdown (
|
47
|
-
|
45
|
+
json (2.3.1)
|
46
|
+
kramdown (2.3.1)
|
47
|
+
rexml
|
48
|
+
listen (3.5.1)
|
48
49
|
rb-fsevent (~> 0.10, >= 0.10.3)
|
49
50
|
rb-inotify (~> 0.9, >= 0.9.10)
|
50
|
-
lumberjack (1.2.
|
51
|
+
lumberjack (1.2.8)
|
51
52
|
method_source (1.0.0)
|
52
53
|
mime-types (3.3.1)
|
53
54
|
mime-types-data (~> 3.2015)
|
54
|
-
mime-types-data (3.
|
55
|
-
mini_portile2 (2.4.0)
|
55
|
+
mime-types-data (3.2021.0225)
|
56
56
|
msgpack (1.2.10)
|
57
|
-
multi_json (1.
|
57
|
+
multi_json (1.15.0)
|
58
58
|
nenv (0.3.0)
|
59
|
-
nokogiri (1.
|
60
|
-
|
59
|
+
nokogiri (1.11.3-x86_64-darwin)
|
60
|
+
racc (~> 1.4)
|
61
61
|
notiffany (0.1.3)
|
62
62
|
nenv (~> 0.1)
|
63
63
|
shellany (~> 0.0)
|
64
|
-
pry (0.
|
64
|
+
pry (0.14.1)
|
65
65
|
coderay (~> 1.1)
|
66
66
|
method_source (~> 1.0)
|
67
|
-
pygments.rb (
|
68
|
-
|
69
|
-
rake (13.0.
|
70
|
-
rb-fsevent (0.10.
|
67
|
+
pygments.rb (2.2.0)
|
68
|
+
racc (1.5.2)
|
69
|
+
rake (13.0.3)
|
70
|
+
rb-fsevent (0.10.4)
|
71
71
|
rb-inotify (0.10.1)
|
72
72
|
ffi (~> 1.0)
|
73
73
|
rest-client (1.6.7)
|
74
74
|
mime-types (>= 1.16)
|
75
|
+
rexml (3.2.5)
|
75
76
|
rspec (2.99.0)
|
76
77
|
rspec-core (~> 2.99.0)
|
77
78
|
rspec-expectations (~> 2.99.0)
|
@@ -92,7 +93,7 @@ GEM
|
|
92
93
|
tins (0.13.2)
|
93
94
|
|
94
95
|
PLATFORMS
|
95
|
-
|
96
|
+
x86_64-darwin-19
|
96
97
|
|
97
98
|
DEPENDENCIES
|
98
99
|
coveralls
|
@@ -105,4 +106,4 @@ DEPENDENCIES
|
|
105
106
|
simplecov (~> 0.15.1)
|
106
107
|
|
107
108
|
BUNDLED WITH
|
108
|
-
2.
|
109
|
+
2.2.13
|
data/bin/polytexnic
CHANGED
@@ -1,19 +1,84 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require "polytexnic"
|
3
|
+
require 'optparse'
|
4
|
+
require 'fileutils'
|
3
5
|
|
4
|
-
|
5
|
-
|
6
|
+
# polytexnic command-line script
|
7
|
+
# The polytexnic script converts Markdown to HTML or LaTeX
|
8
|
+
# using the PolyTeXnic HTML pipeline.
|
9
|
+
|
10
|
+
examples = %(
|
11
|
+
The polytexnic script converts Markdown to HTML or LaTeX
|
12
|
+
using the PolyTeXnic HTML pipeline.
|
13
|
+
|
14
|
+
Examples:
|
15
|
+
polytexnic example.md example.html
|
16
|
+
polytexnic example.md > example.html
|
17
|
+
polytexnic < example.md > example.html
|
18
|
+
cat example.md | polytexnic > example.html
|
19
|
+
polytexnic -i example.md > example.html
|
20
|
+
polytexnic -i example.md -o example.tex
|
21
|
+
polytexnic -f tex example.md)
|
22
|
+
|
23
|
+
options = {}
|
24
|
+
OptionParser.new do |opts|
|
25
|
+
opts.banner = "Usage: polytexnic [options]\n#{examples}\n\n"
|
26
|
+
|
27
|
+
opts.on("-i", "--input=INPUT", "Use file input") do |infile|
|
28
|
+
options[:infile] = infile
|
29
|
+
end
|
30
|
+
|
31
|
+
opts.on("-o", "--output=OUTPUT", "Use file output") do |outfile|
|
32
|
+
options[:outfile] = outfile
|
33
|
+
end
|
34
|
+
|
35
|
+
opts.on("-f", "--format", "Use output format [html, tex]") do |format|
|
36
|
+
options[:format] = format
|
37
|
+
end
|
38
|
+
end.parse!
|
39
|
+
|
40
|
+
# Returns the file format based on extension.
|
41
|
+
# Should be 'html' or 'tex'.
|
42
|
+
def format(filename)
|
43
|
+
filename.split('.').last
|
44
|
+
rescue
|
45
|
+
nil
|
46
|
+
end
|
47
|
+
|
48
|
+
# Defines a valid HTML template.
|
49
|
+
def html_template(title, body)
|
50
|
+
%(<!DOCTYPE html>
|
51
|
+
<html>
|
52
|
+
<head>
|
53
|
+
<title>#{title}</title>
|
54
|
+
<meta charset="utf-8">
|
55
|
+
</head>
|
56
|
+
<body>
|
57
|
+
#{body}
|
58
|
+
</body>
|
59
|
+
</html>
|
60
|
+
)
|
6
61
|
end
|
7
62
|
|
8
|
-
if ARGV.
|
9
|
-
|
63
|
+
if (infile = options[:infile] || ARGV.shift)
|
64
|
+
puts infile
|
65
|
+
input = File.read(infile)
|
10
66
|
else
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
67
|
+
input = STDIN.read
|
68
|
+
end
|
69
|
+
outfile = options[:outfile] || ARGV.shift
|
70
|
+
puts outfile
|
71
|
+
pipeline = Polytexnic::Pipeline.new(input, article: true)
|
72
|
+
format = options[:format] || format(outfile) || "html"
|
73
|
+
if format == "html"
|
74
|
+
output = html_template("HTML output", pipeline.to_html)
|
75
|
+
elsif format == "tex"
|
76
|
+
output = pipeline.to_polytex
|
77
|
+
else
|
78
|
+
raise ArgumentError, "Invalid format: #{format}"
|
79
|
+
end
|
80
|
+
if outfile
|
81
|
+
File.write(outfile, output)
|
82
|
+
else
|
83
|
+
puts output.strip
|
19
84
|
end
|
@@ -140,7 +140,7 @@ module Polytexnic
|
|
140
140
|
# Removes commented-out lines.
|
141
141
|
# Contents of the special sequence `%=` are converted to literal HTML.
|
142
142
|
def remove_comments(output)
|
143
|
-
output.gsub!(/[^\\]%[^=]
|
143
|
+
output.gsub!(/([^\\])(%[^=].*$)/, '\1')
|
144
144
|
output.gsub!(/[^\\]%=(.*)$/) do
|
145
145
|
key = digest($1)
|
146
146
|
literal_html_cache[key] = $1
|
data/lib/polytexnic/utils.rb
CHANGED
@@ -206,9 +206,17 @@ module Polytexnic
|
|
206
206
|
# Inline numbers look much better in HTML but are invalid in LaTeX.
|
207
207
|
options['linenos'] = 'inline'
|
208
208
|
end
|
209
|
-
|
209
|
+
if (lines = options['hl_lines'])
|
210
|
+
content_lines = content.split("\n")
|
211
|
+
if lines.max > content_lines.length
|
212
|
+
err = "\nHighlight line(s) out of range: #{lines.inspect}\n"
|
213
|
+
err += content
|
214
|
+
raise err
|
215
|
+
end
|
216
|
+
end
|
217
|
+
highlight_cache[key] ||= Pygments.highlight(content, lexer: language,
|
210
218
|
formatter: formatter,
|
211
|
-
options:
|
219
|
+
options: options)
|
212
220
|
end
|
213
221
|
|
214
222
|
# Adds some verbatim font info (including size).
|
data/lib/polytexnic/version.rb
CHANGED
data/polytexnic.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |gem|
|
|
10
10
|
gem.email = ["michael@softcover.io"]
|
11
11
|
gem.description = %q{Core translation engine for the softcover gem}
|
12
12
|
gem.summary = %q{Convert from PolyTeX & Markdown to HTML & LaTeX}
|
13
|
-
gem.homepage = "https://
|
13
|
+
gem.homepage = "https://github.com/softcover/polytexnic"
|
14
14
|
gem.license = "MIT"
|
15
15
|
|
16
16
|
gem.files = `git ls-files`.split($/)
|
@@ -18,10 +18,10 @@ Gem::Specification.new do |gem|
|
|
18
18
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
19
19
|
gem.require_paths = ["lib"]
|
20
20
|
|
21
|
-
gem.add_dependency 'nokogiri', '
|
22
|
-
gem.add_dependency 'pygments.rb', '~>
|
21
|
+
gem.add_dependency 'nokogiri', '>= 1.6.0', '< 2.0'
|
22
|
+
gem.add_dependency 'pygments.rb', '~> 2.1'
|
23
23
|
gem.add_dependency 'msgpack', '~> 1.2.0'
|
24
|
-
gem.add_dependency 'kramdown', '
|
24
|
+
gem.add_dependency 'kramdown', '>= 2.0', '< 3.0'
|
25
25
|
gem.add_dependency 'json', '~> 2.3.0'
|
26
26
|
|
27
27
|
gem.add_development_dependency 'rspec', '~> 2.14'
|
data/spec/to_html/core_spec.rb
CHANGED
@@ -9,6 +9,15 @@ describe 'Polytexnic::Pipeline#to_html' do
|
|
9
9
|
let(:polytex) { "% A LaTeX comment" }
|
10
10
|
it { should eq '' }
|
11
11
|
|
12
|
+
context "occurring a the end of a line" do
|
13
|
+
let(:polytex) do <<-'EOS'
|
14
|
+
lorem ipsum
|
15
|
+
dolor sit amet.%this is a comment
|
16
|
+
EOS
|
17
|
+
end
|
18
|
+
it { should include("amet.") }
|
19
|
+
end
|
20
|
+
|
12
21
|
context "with a section and label" do
|
13
22
|
let(:polytex) do <<-'EOS'
|
14
23
|
% \section{Foo}
|
@@ -98,7 +98,7 @@ describe Polytexnic::Pipeline do
|
|
98
98
|
<div class="code">
|
99
99
|
<div class="highlight">
|
100
100
|
<pre>
|
101
|
-
<span></span>
|
101
|
+
<span></span>
|
102
102
|
<span class="k">def</span> <span class="nf">foo</span>
|
103
103
|
<span class="s2">"bar"</span>
|
104
104
|
<span class="k">end</span>
|
@@ -126,15 +126,15 @@ describe Polytexnic::Pipeline do
|
|
126
126
|
<div class="highlight">
|
127
127
|
<pre>
|
128
128
|
<span></span>
|
129
|
-
<span class="lineno">1</span>
|
130
129
|
<span class="hll">
|
130
|
+
<span class="linenos">1</span>
|
131
131
|
<span class="k">def</span> <span class="nf">foo</span>
|
132
132
|
</span>
|
133
|
-
<span class="lineno">2</span>
|
134
133
|
<span class="hll">
|
134
|
+
<span class="linenos">2</span>
|
135
135
|
<span class="s2">"bar"</span>
|
136
136
|
</span>
|
137
|
-
<span class="
|
137
|
+
<span class="linenos">3</span>
|
138
138
|
<span class="k">end</span>
|
139
139
|
</pre>
|
140
140
|
</div>
|
@@ -143,9 +143,25 @@ describe Polytexnic::Pipeline do
|
|
143
143
|
end
|
144
144
|
end
|
145
145
|
|
146
|
+
context "when highlighting HTML" do
|
147
|
+
let(:polytex) do <<-'EOS'
|
148
|
+
%= lang:html, options: "hl_lines": [3], "linenos": true
|
149
|
+
\begin{code}
|
150
|
+
---
|
151
|
+
layout: default
|
152
|
+
title: Gallery for Learn Enough JavaScript to Be Dangerous
|
153
|
+
---
|
154
|
+
|
155
|
+
<div class="gallery col-three">
|
156
|
+
<div class="col col-nav gallery-thumbs" id="gallery-thumbs">
|
157
|
+
\end{code}
|
158
|
+
end
|
159
|
+
it should include('class="linenos"')
|
160
|
+
end
|
161
|
+
|
146
162
|
context "with highlight line out of range" do
|
147
163
|
let(:polytex) do <<-'EOS'
|
148
|
-
%= lang:ruby, options: "hl_lines": [
|
164
|
+
%= lang:ruby, options: "hl_lines": [4], "linenos": true
|
149
165
|
\begin{code}
|
150
166
|
def foo
|
151
167
|
"bar"
|
@@ -155,7 +171,7 @@ describe Polytexnic::Pipeline do
|
|
155
171
|
end
|
156
172
|
|
157
173
|
it "should emit a warning" do
|
158
|
-
|
174
|
+
expect { processed_text }.to raise_error
|
159
175
|
end
|
160
176
|
end
|
161
177
|
|
@@ -238,7 +254,7 @@ describe Polytexnic::Pipeline do
|
|
238
254
|
|
239
255
|
context "with custom options" do
|
240
256
|
let(:polytex) do <<-'EOS'
|
241
|
-
%= <<(polytexnic_commands.sty, lang: tex, options: "hl_lines": [
|
257
|
+
%= <<(polytexnic_commands.sty, lang: tex, options: "hl_lines": [1])
|
242
258
|
EOS
|
243
259
|
end
|
244
260
|
let(:output) do <<-'EOS'
|
@@ -377,7 +393,17 @@ describe Polytexnic::Pipeline do
|
|
377
393
|
|
378
394
|
context "with repo, tag, lang and options" do
|
379
395
|
let(:polytex) do <<-'EOS'
|
380
|
-
%= <<(tagged_file.rb, git: {tag: v0.9.4, repo:"repo_path/.git"}, lang: tex, options: "hl_lines": [
|
396
|
+
%= <<(tagged_file.rb, git: {tag: v0.9.4, repo:"repo_path/.git"}, lang: tex, options: "hl_lines": [2])
|
397
|
+
EOS
|
398
|
+
end
|
399
|
+
let(:output) do <<-'EOS'
|
400
|
+
<div class="code">
|
401
|
+
<div class="highlight">
|
402
|
+
<pre><span></span>Fake data
|
403
|
+
<span class="hll">second line
|
404
|
+
</span></pre>
|
405
|
+
</div>
|
406
|
+
</div>
|
381
407
|
EOS
|
382
408
|
end
|
383
409
|
it_behaves_like "an inclusion"
|
@@ -29,7 +29,7 @@ describe 'Polytexnic::Pipeline#to_html' do
|
|
29
29
|
|
30
30
|
describe "small caps" do
|
31
31
|
let(:polytex) { '\textsc{small caps}' }
|
32
|
-
it { should resemble '<span class="
|
32
|
+
it { should resemble '<span class="smallcaps">small caps</span>' }
|
33
33
|
end
|
34
34
|
|
35
35
|
describe "small text" do
|
data/spec/to_latex_spec.rb
CHANGED
@@ -29,7 +29,7 @@ Make a code listing as in Listing~\ref{code:hello}.
|
|
29
29
|
\begin{codelisting}
|
30
30
|
\label{code:hello}
|
31
31
|
\codecaption{A hello program in Ruby.}
|
32
|
-
%= lang:ruby, options: "hl_lines": [
|
32
|
+
%= lang:ruby, options: "hl_lines": [2]
|
33
33
|
\begin{code}
|
34
34
|
def hello
|
35
35
|
"hello, world!"
|
@@ -262,4 +262,4 @@ end
|
|
262
262
|
it { should_not include 'xmlelement' }
|
263
263
|
end
|
264
264
|
end
|
265
|
-
end
|
265
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: polytexnic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Hartl
|
@@ -9,36 +9,42 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2021-05-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- - "
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 1.6.0
|
21
|
+
- - "<"
|
19
22
|
- !ruby/object:Gem::Version
|
20
|
-
version:
|
23
|
+
version: '2.0'
|
21
24
|
type: :runtime
|
22
25
|
prerelease: false
|
23
26
|
version_requirements: !ruby/object:Gem::Requirement
|
24
27
|
requirements:
|
25
|
-
- - "
|
28
|
+
- - ">="
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: 1.6.0
|
31
|
+
- - "<"
|
26
32
|
- !ruby/object:Gem::Version
|
27
|
-
version:
|
33
|
+
version: '2.0'
|
28
34
|
- !ruby/object:Gem::Dependency
|
29
35
|
name: pygments.rb
|
30
36
|
requirement: !ruby/object:Gem::Requirement
|
31
37
|
requirements:
|
32
38
|
- - "~>"
|
33
39
|
- !ruby/object:Gem::Version
|
34
|
-
version:
|
40
|
+
version: '2.1'
|
35
41
|
type: :runtime
|
36
42
|
prerelease: false
|
37
43
|
version_requirements: !ruby/object:Gem::Requirement
|
38
44
|
requirements:
|
39
45
|
- - "~>"
|
40
46
|
- !ruby/object:Gem::Version
|
41
|
-
version:
|
47
|
+
version: '2.1'
|
42
48
|
- !ruby/object:Gem::Dependency
|
43
49
|
name: msgpack
|
44
50
|
requirement: !ruby/object:Gem::Requirement
|
@@ -57,16 +63,22 @@ dependencies:
|
|
57
63
|
name: kramdown
|
58
64
|
requirement: !ruby/object:Gem::Requirement
|
59
65
|
requirements:
|
60
|
-
- - "
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '2.0'
|
69
|
+
- - "<"
|
61
70
|
- !ruby/object:Gem::Version
|
62
|
-
version: '
|
71
|
+
version: '3.0'
|
63
72
|
type: :runtime
|
64
73
|
prerelease: false
|
65
74
|
version_requirements: !ruby/object:Gem::Requirement
|
66
75
|
requirements:
|
67
|
-
- - "
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '2.0'
|
79
|
+
- - "<"
|
68
80
|
- !ruby/object:Gem::Version
|
69
|
-
version: '
|
81
|
+
version: '3.0'
|
70
82
|
- !ruby/object:Gem::Dependency
|
71
83
|
name: json
|
72
84
|
requirement: !ruby/object:Gem::Requirement
|
@@ -277,7 +289,7 @@ files:
|
|
277
289
|
- tasks/bin/ruby_tests
|
278
290
|
- tasks/run_tests_with_both_rubies.rake
|
279
291
|
- tmp/.gitkeep
|
280
|
-
homepage: https://
|
292
|
+
homepage: https://github.com/softcover/polytexnic
|
281
293
|
licenses:
|
282
294
|
- MIT
|
283
295
|
metadata: {}
|