asciidoctor-latex 1.5.0.dev
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE.adoc +22 -0
- data/README.adoc +213 -0
- data/Rakefile +55 -0
- data/bin/asciidoctor-latex +22 -0
- data/data/asciidoc_tex_macros.tex +42 -0
- data/data/preamble_article.tex +45 -0
- data/data/preamble_book.tex +44 -0
- data/lib/asciidoctor-latex.rb +1 -0
- data/lib/asciidoctor/latex.rb +8 -0
- data/lib/asciidoctor/latex/chem.rb +24 -0
- data/lib/asciidoctor/latex/click_block.rb +121 -0
- data/lib/asciidoctor/latex/converter.rb +358 -0
- data/lib/asciidoctor/latex/core_ext/colored_string.rb +35 -0
- data/lib/asciidoctor/latex/dollar.rb +28 -0
- data/lib/asciidoctor/latex/ent_to_uni.rb +17 -0
- data/lib/asciidoctor/latex/environment_block.rb +190 -0
- data/lib/asciidoctor/latex/inject_html.rb +49 -0
- data/lib/asciidoctor/latex/inline_macros.rb +20 -0
- data/lib/asciidoctor/latex/macro_insert.rb +49 -0
- data/lib/asciidoctor/latex/node_processors.rb +695 -0
- data/lib/asciidoctor/latex/prepend_processor.rb +36 -0
- data/lib/asciidoctor/latex/preprocess.rb +37 -0
- data/lib/asciidoctor/latex/tex_block.rb +108 -0
- data/lib/asciidoctor/latex/tex_postprocessor.rb +44 -0
- data/lib/asciidoctor/latex/tex_preprocessor.rb +65 -0
- data/lib/asciidoctor/latex/version.rb +5 -0
- data/manual.adoc +285 -0
- data/rake/cacert.pem +3894 -0
- data/rake/jdk_helper.rb +105 -0
- data/rake/tar-licence +19 -0
- data/rake/tar.rb +38 -0
- data/rspec/README.adoc +45 -0
- data/rspec/a.rb +79 -0
- data/rspec/b.rb +111 -0
- data/rspec/c.rb +121 -0
- data/rspec/data/tex1 +65 -0
- data/rspec/data/tex2 +5 -0
- data/rspec/data/tex2.expect +5 -0
- data/rspec/transform.rb +36 -0
- data/spec/README.adoc +45 -0
- data/spec/a.rb +79 -0
- data/spec/b.rb +111 -0
- data/spec/c.rb +121 -0
- data/spec/data/foo +1 -0
- data/spec/data/lorem +1 -0
- data/spec/data/tex1 +65 -0
- data/spec/data/tex2 +5 -0
- data/spec/data/tex2.expect +5 -0
- data/spec/transform.rb +36 -0
- data/test/examples/adoc/env.adoc +16 -0
- data/test/examples/adoc/eq.adoc +12 -0
- data/test/examples/adoc/zero.adoc +3 -0
- data/test/examples/asciidoc-html/block_open.adoc +17 -0
- data/test/examples/tex/env.tex +132 -0
- data/test/examples/tex/eq.tex +132 -0
- data/test/examples/tex/zero.tex +121 -0
- data/test/html_test.rb +8 -0
- data/test/latex_test.rb +8 -0
- data/test/test_helper.rb +4 -0
- data/test_jc/admonition.adoc +4 -0
- data/test_jc/click.adoc +7 -0
- data/test_jc/env.adoc +31 -0
- data/test_jc/example.adoc +17 -0
- data/test_jc/floating_title.adoc +15 -0
- data/test_jc/image.adoc +84 -0
- data/test_jc/images/frog.jpg +0 -0
- data/test_jc/images/red_frog.jpeg +0 -0
- data/test_jc/images/yellow_frog.jpeg +0 -0
- data/test_jc/listing.adoc +9 -0
- data/test_jc/lists.adoc +20 -0
- data/test_jc/math.adoc +10 -0
- data/test_jc/preamble.adoc +14 -0
- data/test_jc/section-numbered.adoc +9 -0
- data/test_jc/section.adoc +7 -0
- data/test_jc/sidebar.adoc +61 -0
- data/test_jc/verse.adoc +15 -0
- data/try-out/README.adoc +348 -0
- data/try-out/click.adoc +108 -0
- data/try-out/code.adoc +122 -0
- data/try-out/env.adoc +139 -0
- data/try-out/eq-latex.adoc +37 -0
- data/try-out/eq-stem.adoc +41 -0
- data/try-out/eqno-latex.adoc +120 -0
- data/try-out/math_article.adoc +138 -0
- data/try-out/pyth-stem.adoc +52 -0
- data/try-out/theorem-latex.adoc +50 -0
- data/try-out/xref-equations.adoc +28 -0
- metadata +210 -0
@@ -0,0 +1 @@
|
|
1
|
+
require 'asciidoctor/latex'
|
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
require 'asciidoctor'
|
4
|
+
require 'asciidoctor/extensions'
|
5
|
+
|
6
|
+
# Modify the default mathJax script to run mhchem instead
|
7
|
+
# of autonumbuering of equations -- which is taken care of
|
8
|
+
# by [env.equation], [env.equationalign]
|
9
|
+
#
|
10
|
+
# See http://www.noteshare.io/section/the-chem-environment
|
11
|
+
#
|
12
|
+
module Asciidoctor::LaTeX
|
13
|
+
# Map @@DOLLAR: to $
|
14
|
+
class Chem < Asciidoctor::Extensions::Postprocessor
|
15
|
+
|
16
|
+
def process document, output
|
17
|
+
output = output.gsub($tex_snippet, $chem_snippet)
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
$tex_snippet = 'TeX: { equationNumbers: { autoNumber: "none" } }'
|
24
|
+
$chem_snippet = 'TeX: { extensions: ["mhchem.js"] }'
|
@@ -0,0 +1,121 @@
|
|
1
|
+
# Test doc: work/click.adoc
|
2
|
+
|
3
|
+
|
4
|
+
# ClickBlock implements the construct
|
5
|
+
#
|
6
|
+
# [click.answer]
|
7
|
+
# --
|
8
|
+
# 73
|
9
|
+
# --
|
10
|
+
#
|
11
|
+
# See http://epsilon.my.noteshare.io/lessons/click-blocks-jc
|
12
|
+
#
|
13
|
+
# Documents containing click-blocks must be rendered with
|
14
|
+
#
|
15
|
+
# asciidoctor-latex -b html -a click_extras=include
|
16
|
+
#
|
17
|
+
require 'asciidoctor'
|
18
|
+
require 'asciidoctor/extensions'
|
19
|
+
require 'asciidoctor/latex/core_ext/colored_string'
|
20
|
+
|
21
|
+
|
22
|
+
module Asciidoctor::LaTeX
|
23
|
+
class ClickBlock < Asciidoctor::Extensions::BlockProcessor
|
24
|
+
|
25
|
+
use_dsl
|
26
|
+
# ^^^ don't know what this is. Could you explain?
|
27
|
+
|
28
|
+
named :click
|
29
|
+
on_context :open
|
30
|
+
# parse_context_as :complex
|
31
|
+
# ^^^ The above line gave me an error. I'm not sure what do to with it.
|
32
|
+
|
33
|
+
# Hash to count the number of times each environment is encountered
|
34
|
+
# Global variables again. Is there a better way?
|
35
|
+
$counter = {}
|
36
|
+
|
37
|
+
def process parent, reader, attrs
|
38
|
+
|
39
|
+
warn "env: attributes = #{attrs}".yellow if $VERBOSE
|
40
|
+
|
41
|
+
click_name = attrs["role"]
|
42
|
+
original_title = attrs['title']
|
43
|
+
|
44
|
+
# Ensure that role is defined
|
45
|
+
original_role = attrs['role']
|
46
|
+
if attrs['role'] == nil
|
47
|
+
role = 'item'
|
48
|
+
else
|
49
|
+
role = attrs['role']
|
50
|
+
end
|
51
|
+
|
52
|
+
# Use the value of the role to determine
|
53
|
+
# whether this is a numbered block
|
54
|
+
numbered = false
|
55
|
+
if attrs['options'] and attrs['options'].include? 'number'
|
56
|
+
numbered = true
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
# If the block is numbered, update the counter
|
61
|
+
if numbered
|
62
|
+
env_name = role ############## 'click-'+role
|
63
|
+
if $counter[env_name] == nil
|
64
|
+
$counter[env_name] = 1
|
65
|
+
else
|
66
|
+
$counter[env_name] += 1
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
# Set title
|
72
|
+
if role == 'code'
|
73
|
+
title = 'Listing'
|
74
|
+
else
|
75
|
+
title = role.capitalize
|
76
|
+
end
|
77
|
+
if numbered
|
78
|
+
title = title + ' ' + $counter[env_name].to_s
|
79
|
+
end
|
80
|
+
if attrs['title']
|
81
|
+
if numbered
|
82
|
+
title = title + '. ' + attrs['title'].capitalize
|
83
|
+
else
|
84
|
+
title = title + ': ' + attrs['title'].capitalize
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
if original_role == nil
|
89
|
+
title = original_title
|
90
|
+
end
|
91
|
+
|
92
|
+
if role != 'equation'
|
93
|
+
attrs['title'] = title
|
94
|
+
else
|
95
|
+
if numbered
|
96
|
+
attrs['equation_number'] = $counter[env_name].to_s
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
attrs['title'] = title
|
102
|
+
|
103
|
+
|
104
|
+
if attrs['role'] == 'code'
|
105
|
+
role = 'listing'
|
106
|
+
else
|
107
|
+
role = 'click'
|
108
|
+
end
|
109
|
+
attrs['role'] = 'click'
|
110
|
+
|
111
|
+
if role == 'listing'
|
112
|
+
create_block parent, :listing, reader.lines, attrs
|
113
|
+
else
|
114
|
+
create_block parent, :click, reader.lines, attrs
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
@@ -0,0 +1,358 @@
|
|
1
|
+
|
2
|
+
#
|
3
|
+
# File: latex-converter.rb
|
4
|
+
# Author: J. Carlson (jxxcarlson@gmail.com)
|
5
|
+
# First commit: 9/26/2014
|
6
|
+
# Date: 2/20/1015
|
7
|
+
#
|
8
|
+
# OVERVIEW
|
9
|
+
#
|
10
|
+
# Asciidoctor-latex does two things:
|
11
|
+
#
|
12
|
+
# -- provides an HTML backend which adds latex-like features to asciidoctor
|
13
|
+
# asciidoc(tor) with these additional features will be called 'asciidoctor-latex'
|
14
|
+
#
|
15
|
+
# -- provides a converter from asciidoctor-latex to asciidoctor. This converter
|
16
|
+
# is 'usable' but has limited coverage of asciidoctor-latex
|
17
|
+
#
|
18
|
+
# See http://www.noteshare.io/section/asciidoctor-latex-manual-intro
|
19
|
+
# for a description (with examples) of asciidoctor-latex.
|
20
|
+
#
|
21
|
+
# INSTALLATION
|
22
|
+
#
|
23
|
+
# Run 'rake install' to install the asciidoctor-latex gem locally.
|
24
|
+
#
|
25
|
+
# USAGE (1: html)
|
26
|
+
#
|
27
|
+
# Run
|
28
|
+
#
|
29
|
+
# 'asciidoctor-latex -b html foo.adoc'
|
30
|
+
#
|
31
|
+
# to render an asciidoctor-latex document to html
|
32
|
+
#
|
33
|
+
# Some documents (those with 'click blocks', see http://www.noteshare.io/section/homework-problems)
|
34
|
+
# For these, run
|
35
|
+
#
|
36
|
+
# 'asciidoctor-latex -b html -a click_extras=include foo.adoc'
|
37
|
+
#
|
38
|
+
# In both cases the output is 'foo.html'
|
39
|
+
#
|
40
|
+
# USAGE (2: latex)
|
41
|
+
#
|
42
|
+
# Run
|
43
|
+
#
|
44
|
+
# 'asciidoctor-latex foo.adoc'
|
45
|
+
#
|
46
|
+
# to convert foo.adoc to foo.tex. This feature
|
47
|
+
# needs a lot of work.
|
48
|
+
#
|
49
|
+
# to convert foo.tex to the latex file foo.latex
|
50
|
+
# You can put files 'macros.tex' and 'preamble.tex' to
|
51
|
+
# replace the default preamble and set of macros.
|
52
|
+
# Define your own 'newEnvironments.tex' to use yours
|
53
|
+
# as opposed to the default definitons of environments
|
54
|
+
# in tex mapping to [tex.ENVIRNOMENT] in asciidoctor-latex.
|
55
|
+
#
|
56
|
+
# TECHNICAL NOTES
|
57
|
+
#
|
58
|
+
# This is a first step towards writing a LaTeX backend
|
59
|
+
# for Asciidoctor. It is based on the
|
60
|
+
# Dan Allen's demo-converter.rb. The "convert" method
|
61
|
+
# is unchanged, the methods "document node" and "section node"
|
62
|
+
# have been redefined, and several new methods have been added.
|
63
|
+
#
|
64
|
+
# The main work will be in identifying asciidoc elements
|
65
|
+
# that need to be transformed and adding a method for
|
66
|
+
# each such element. As noted below, the "warn" clause
|
67
|
+
# in the "convert" method is a useful tool for this task.
|
68
|
+
#
|
69
|
+
# Usage:
|
70
|
+
#
|
71
|
+
# $ asciidoctor -r ./latex-converter.rb -b latex test/sample1.adoc
|
72
|
+
#
|
73
|
+
# Comments
|
74
|
+
#
|
75
|
+
# 1. The "warn" clause in the converter code is quite useful.
|
76
|
+
# For example, you will discover in running the converter on
|
77
|
+
# "test/sample-1.adoc" that you have not implemented code for
|
78
|
+
# the "olist" node. Thus you can work through ever more complex
|
79
|
+
# examples to discover what you need to do to increase the coverage
|
80
|
+
# of the converter. Hackish and ad hoc, but a process nonetheless.
|
81
|
+
#
|
82
|
+
# 2. The converter simply passes on what it does not understand, e.g.,
|
83
|
+
# LaTeX, This is good. However, we will have to map constructs
|
84
|
+
# like"+\( a^2 = b^2 \)+" to $ a^2 + b^2 $, etc.
|
85
|
+
# This can be done at the preprocessor level.
|
86
|
+
#
|
87
|
+
# 3. In view of the preceding, we may need to chain a frontend
|
88
|
+
# (preprocessor) to the backend. In any case, the main work
|
89
|
+
# is in transforming Asciidoc elements to TeX elements.
|
90
|
+
# Other than the asciidoc -> tex mapping, the tex-converter
|
91
|
+
# does not need to understand tex.
|
92
|
+
#
|
93
|
+
# 4. Included in this repo are the files "test/sample1.adoc", "test/sample2.adoc",
|
94
|
+
# and "test/elliptic.adoc" which can be used to test the code
|
95
|
+
#
|
96
|
+
# 5. Beginning with version 0.0.2 we use a new dispatch mechanism
|
97
|
+
# which should permit one to better manage growth of the code
|
98
|
+
# as the coverage of the converter increases. Briefly, the
|
99
|
+
# main convert method, whose duty is to process nodes, looks
|
100
|
+
# at node.node_name, then makes the method call node.tex_process
|
101
|
+
# if the node_name is registered in NODE_TYPES. The method
|
102
|
+
# tex_process is defined by extending the various classes to
|
103
|
+
# which the node might belong, e.g., Asciidoctor::Block,
|
104
|
+
# Asciidoctor::Inline, etc. See the file "node_processor.rb",
|
105
|
+
# where these extensions are housed for the time being.
|
106
|
+
#
|
107
|
+
# If node.node_name is not found in NODE_TYPES, then
|
108
|
+
# a warning message is issued. We can use it as a clue
|
109
|
+
# to find what to do to handle this node. All the code
|
110
|
+
# in "node_processors.rb" to date was written using this
|
111
|
+
# hackish process.
|
112
|
+
#
|
113
|
+
#
|
114
|
+
# CURRENT STATUS
|
115
|
+
#
|
116
|
+
# The following constructs are processed
|
117
|
+
#
|
118
|
+
# * sections to a depth of five, e.g., == foo, === foobar, etc.
|
119
|
+
# * ordered and unordered lists, though nestings is untested and
|
120
|
+
# likely does not work.
|
121
|
+
# * *bold* and _italic_
|
122
|
+
# * hyperlinks like http://foo.com[Nerdy Stuff]
|
123
|
+
#
|
124
|
+
|
125
|
+
require 'asciidoctor'
|
126
|
+
require 'asciidoctor/converter/html5'
|
127
|
+
require 'asciidoctor/latex/inline_macros'
|
128
|
+
require 'asciidoctor/latex/core_ext/colored_string'
|
129
|
+
require 'asciidoctor/latex/click_block'
|
130
|
+
require 'asciidoctor/latex/inject_html'
|
131
|
+
require 'asciidoctor/latex/ent_to_uni'
|
132
|
+
require 'asciidoctor/latex/environment_block'
|
133
|
+
require 'asciidoctor/latex/node_processors'
|
134
|
+
require 'asciidoctor/latex/prepend_processor'
|
135
|
+
require 'asciidoctor/latex/macro_insert'
|
136
|
+
require 'asciidoctor/latex/tex_block'
|
137
|
+
require 'asciidoctor/latex/tex_preprocessor'
|
138
|
+
require 'asciidoctor/latex/dollar'
|
139
|
+
require 'asciidoctor/latex/tex_postprocessor'
|
140
|
+
require 'asciidoctor/latex/chem'
|
141
|
+
|
142
|
+
|
143
|
+
|
144
|
+
# require 'asciidoctor/latex/preamble_processor'
|
145
|
+
|
146
|
+
$VERBOSE = true
|
147
|
+
|
148
|
+
|
149
|
+
# code for Html5ConverterExtension & its insertion
|
150
|
+
# template by @mojavelinux
|
151
|
+
module Asciidoctor::LaTeX
|
152
|
+
module Html5ConverterExtensions
|
153
|
+
|
154
|
+
ENV_CSS = "+++<div style='line-height:1.5em;font-size:1.05em;font-style:oblique;margin-bottom:1.5em'>+++"
|
155
|
+
DIV_END = '+++</div>+++'
|
156
|
+
TABLE_ROW_END = '+++</tr></table>+++'
|
157
|
+
|
158
|
+
def info node
|
159
|
+
|
160
|
+
attrs = node.attributes
|
161
|
+
|
162
|
+
warn "\n HTMLConverter, node: #{node.node_name}".red
|
163
|
+
# warn " title: #{attrs['title']}".cyan
|
164
|
+
# warn " role: #{attrs['role']}".cyan
|
165
|
+
# warn " options: #{attrs['options']}".cyan
|
166
|
+
|
167
|
+
end
|
168
|
+
|
169
|
+
def environment node
|
170
|
+
|
171
|
+
# info node if $VERBOSE
|
172
|
+
options = node.attributes['options']
|
173
|
+
attrs = node.attributes
|
174
|
+
|
175
|
+
warn "env role = #{attrs['role']}".yellow if $VERBOSE
|
176
|
+
|
177
|
+
if attrs['role'] == 'equation'
|
178
|
+
node.title = nil
|
179
|
+
number_part = '<td style="text-align:right">' + "(#{node.caption}) </td>"
|
180
|
+
number_part = ["+++ #{number_part} +++"]
|
181
|
+
equation_part = ['+++<td style="width:100%";>+++'] + ['\\['] + node.lines + ['\\]'] + ['+++</td>+++']
|
182
|
+
table_style='style="width:100%; border-collapse:collapse;border:0" class="zero" '
|
183
|
+
row_style='style="border-collapse: collapse; border:0; font-size: 12pt; "'
|
184
|
+
if options['numbered']
|
185
|
+
node.lines = ["+++<table #{table_style}><tr #{row_style}>+++"] + equation_part + number_part + [TABLE_ROW_END]
|
186
|
+
else
|
187
|
+
node.lines = ["+++<table #{table_style}><tr #{row_style}>+++"] + equation_part + [TABLE_ROW_END]
|
188
|
+
end
|
189
|
+
elsif attrs['role'] == 'equationalign'
|
190
|
+
warn "execting env role = #{attrs['role']}".yellow if $VERBOSE
|
191
|
+
node.title = nil
|
192
|
+
number_part = '<td style="text-align:right">' + "(#{node.caption}) </td>"
|
193
|
+
number_part = ["+++ #{number_part} +++"]
|
194
|
+
equation_part = ['+++<td style="width:100%";>+++'] + ['\\[\\begin{split}'] + node.lines + ['\\end{split}\\]'] + ['+++</td>+++']
|
195
|
+
table_style='style="width:100%; border-collapse:collapse;border:0" class="zero" '
|
196
|
+
row_style='style="border-collapse: collapse; border:0; font-size: 12pt; "'
|
197
|
+
if options['numbered']
|
198
|
+
node.lines = ["+++<table #{table_style}><tr #{row_style}>+++"] + equation_part + number_part + [TABLE_ROW_END]
|
199
|
+
else
|
200
|
+
node.lines = ["+++<table #{table_style}><tr #{row_style}>+++"] + equation_part + [TABLE_ROW_END]
|
201
|
+
end
|
202
|
+
elsif node.attributes['role'] == 'chem'
|
203
|
+
node.title = nil
|
204
|
+
number_part = '<td style="text-align:right">' + "(#{node.caption}) </td>"
|
205
|
+
number_part = ["+++ #{number_part} +++"]
|
206
|
+
equation_part = ['+++<td style="width:100%;">+++'] + [' \\[\\ce{' + node.lines[0] + '}\\] '] + ['+++</td>+++']
|
207
|
+
table_style='class="zero" style="width:100%; border-collapse:collapse; border:0"'
|
208
|
+
row_style='class="zero" style="border-collapse: collapse; border:0; font-size: 10pt; "'
|
209
|
+
node.lines = ["+++<table #{table_style}><tr #{row_style}>+++"] + equation_part + number_part +['+++</tr></table>+++']
|
210
|
+
elsif attrs['role'] == 'jsxgraph'
|
211
|
+
if attrs['box'] == nil
|
212
|
+
attrs['box'] = 'box'
|
213
|
+
end
|
214
|
+
if attrs['width'] == nil
|
215
|
+
attrs['width'] = 450
|
216
|
+
end
|
217
|
+
if attrs['height'] == nil
|
218
|
+
attrs['height'] = 450
|
219
|
+
end
|
220
|
+
warn "jxxgraph attributes: #{attrs}".cyan if $VERBOSE
|
221
|
+
line_array = ["\n+++\n"]
|
222
|
+
# line_array += ["<link rel='stylesheet' type='text/css' href='jsxgraph.css' />"]
|
223
|
+
|
224
|
+
line_array += ["<link rel='stylesheet' type='text/css' href='http://jsxgraph.uni-bayreuth.de/distrib/jsxgraph.css' />"]
|
225
|
+
line_array += ['<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jsxgraph/0.99.3/jsxgraphcore.js"></script>']
|
226
|
+
line_array += ["<script src='http://jsxgraph.uni-bayreuth.de/distrib/GeonextReader.js' type='text/javascript'></script>"]
|
227
|
+
# line_array += ['<div id="box" class="jxgbox" style="width:500px; height:500px;"></div>']
|
228
|
+
line_array += ["<div id='#{attrs['box']}' class='jxgbox' style='width:" + "#{attrs['width']}" + "px; height:" + "#{attrs['height']}" +"px;'></div>"]
|
229
|
+
line_array += ['<script type="text/javascript">']
|
230
|
+
|
231
|
+
# line_array += ["<link rel='stylesheet' type='text/css' href='http://jsxgraph.uni-bayreuth.de/distrib/jsxgraph.css' />"]
|
232
|
+
# line_array += ["<script src='http://jsxgraph.uni-bayreuth.de/distrib/jsxgraphcore.js' type='text/javascript'></script>"]
|
233
|
+
# line_array += ["<script src='http://jsxgraph.uni-bayreuth.de/distrib/GeonextReader.js' type='text/javascript'></script>"]
|
234
|
+
# line_array += ["<div id='jxgbox' class='jxgbox' style='width:500px; height:500px;'></div>"]
|
235
|
+
# line_array += ["<script type='text/javascript'>"]
|
236
|
+
|
237
|
+
line_array += node.lines
|
238
|
+
line_array += ['</script>']
|
239
|
+
line_array += ['<br/>']
|
240
|
+
line_array += ["\n+++\n"]
|
241
|
+
node.lines = line_array
|
242
|
+
else
|
243
|
+
node.lines = [ENV_CSS] + node.lines + [DIV_END]
|
244
|
+
end
|
245
|
+
|
246
|
+
node.attributes['roles'] = (node.roles + ['environment']) * ' '
|
247
|
+
self.open node
|
248
|
+
end
|
249
|
+
|
250
|
+
def click node
|
251
|
+
|
252
|
+
# info node if $VERBOSE
|
253
|
+
node.lines = [ENV_CSS] + node.lines + [DIV_END]
|
254
|
+
node.attributes['roles'] = (node.roles + ['click']) * ' '
|
255
|
+
self.open node
|
256
|
+
end
|
257
|
+
|
258
|
+
def inline_anchor node
|
259
|
+
|
260
|
+
case node.type.to_s
|
261
|
+
when 'xref'
|
262
|
+
refid = node.attributes['refid']
|
263
|
+
if refid and refid[0] == '_'
|
264
|
+
output = "<a href=\##{refid}>#{refid.gsub('_',' ')}</a>"
|
265
|
+
else
|
266
|
+
refs = node.parent.document.references[:ids]
|
267
|
+
# FIXME: the next line is HACKISH (and it crashes the app when refs[refid]) is nil)
|
268
|
+
# FIXME: and with the fix for nil results is even more hackish
|
269
|
+
if refs[refid]
|
270
|
+
reftext = refs[refid].gsub('.', '')
|
271
|
+
reftext = reftext.gsub(/:.*/,'')
|
272
|
+
if refid =~ /\Aeq-/
|
273
|
+
output = "<span><a href=\##{refid}>equation #{reftext}</a></span>"
|
274
|
+
elsif refid =~ /\Aformula-/
|
275
|
+
output = "<span><a href=\##{refid}>formula #{reftext}</a></span>"
|
276
|
+
elsif refid =~ /\Areaction-/
|
277
|
+
output = "<span><a href=\##{refid}>reaction #{reftext}</a></span>"
|
278
|
+
else
|
279
|
+
output = "<span><a href=\##{refid} style='text-decoration:none'>#{reftext}</a></span>"
|
280
|
+
end
|
281
|
+
else
|
282
|
+
output = 'ERROR: refs[refid] was nil'
|
283
|
+
end
|
284
|
+
end
|
285
|
+
when 'link'
|
286
|
+
output = "<a href=#{node.target}>#{node.text}</a>"
|
287
|
+
else
|
288
|
+
output = 'FOOBAR'
|
289
|
+
end
|
290
|
+
output
|
291
|
+
end
|
292
|
+
|
293
|
+
end
|
294
|
+
|
295
|
+
|
296
|
+
class Converter
|
297
|
+
include Asciidoctor::Converter
|
298
|
+
|
299
|
+
register_for 'latex'
|
300
|
+
|
301
|
+
|
302
|
+
Asciidoctor::Extensions.register do
|
303
|
+
preprocessor TeXPreprocessor
|
304
|
+
preprocessor MacroInsert if File.exist? 'macros.tex' and document.basebackend? 'html'
|
305
|
+
block EnvironmentBlock
|
306
|
+
block ClickBlock
|
307
|
+
inline_macro ChemInlineMacro
|
308
|
+
# preprocessor ClickStyleInsert if document.attributes['click_extras'] == 'include2'
|
309
|
+
postprocessor InjectHTML unless document.attributes['noteshare'] == 'yes'
|
310
|
+
postprocessor EntToUni if document.basebackend? 'tex' unless document.attributes['unicode'] == 'no'
|
311
|
+
postprocessor Chem if document.basebackend? 'html'
|
312
|
+
postprocessor HTMLPostprocessor if document.basebackend? 'html'
|
313
|
+
postprocessor TexPostprocessor if document.basebackend? 'tex'
|
314
|
+
end
|
315
|
+
|
316
|
+
|
317
|
+
Asciidoctor::Extensions.register :latex do
|
318
|
+
# EnvironmentBlock
|
319
|
+
end
|
320
|
+
|
321
|
+
|
322
|
+
|
323
|
+
TOP_TYPES = %w(document section)
|
324
|
+
LIST_TYPES = %w(dlist olist ulist)
|
325
|
+
INLINE_TYPES = %w(inline_anchor inline_break inline_footnote inline_quoted)
|
326
|
+
BLOCK_TYPES = %w(admonition listing literal page_break paragraph stem pass open quote \
|
327
|
+
example floating_title image click preamble sidebar verse)
|
328
|
+
OTHER_TYPES = %w(environment table)
|
329
|
+
NODE_TYPES = TOP_TYPES + LIST_TYPES + INLINE_TYPES + BLOCK_TYPES + OTHER_TYPES
|
330
|
+
|
331
|
+
def initialize backend, opts
|
332
|
+
super
|
333
|
+
basebackend 'tex'
|
334
|
+
outfilesuffix '.tex'
|
335
|
+
end
|
336
|
+
|
337
|
+
$latex_environment_names = []
|
338
|
+
$label_counter = 0
|
339
|
+
|
340
|
+
def convert node, transform = nil
|
341
|
+
|
342
|
+
if NODE_TYPES.include? node.node_name
|
343
|
+
node.tex_process
|
344
|
+
else
|
345
|
+
warn %(Node to implement: #{node.node_name}, class = #{node.class}).magenta if $VERBOSE
|
346
|
+
# This warning should not be switched off by $VERBOSE
|
347
|
+
end
|
348
|
+
|
349
|
+
end
|
350
|
+
|
351
|
+
end
|
352
|
+
end
|
353
|
+
|
354
|
+
|
355
|
+
class Asciidoctor::Converter::Html5Converter
|
356
|
+
# inject our custom code into the existing Html5Converter class (Ruby 2.0 and above)
|
357
|
+
prepend Asciidoctor::LaTeX::Html5ConverterExtensions
|
358
|
+
end
|