isodoc 1.5.5 → 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/.github/workflows/rake.yml +2 -12
- data/.hound.yml +3 -1
- data/.rubocop.yml +3 -7
- data/Gemfile +2 -2
- data/Rakefile +2 -2
- data/bin/rspec +1 -2
- data/isodoc.gemspec +11 -11
- data/lib/isodoc-yaml/i18n-ar.yaml +152 -0
- data/lib/isodoc-yaml/i18n-de.yaml +149 -0
- data/lib/isodoc-yaml/i18n-es.yaml +151 -0
- data/lib/isodoc-yaml/i18n-ru.yaml +154 -0
- data/lib/isodoc.rb +0 -2
- data/lib/isodoc/base_style/all.css +7 -0
- data/lib/isodoc/base_style/metanorma_word.css +7 -0
- data/lib/isodoc/base_style/metanorma_word.scss +8 -0
- data/lib/isodoc/base_style/reset.css +7 -0
- data/lib/isodoc/base_style/reset.scss +9 -0
- data/lib/isodoc/base_style/scripts.html +187 -0
- data/lib/isodoc/class_utils.rb +6 -5
- data/lib/isodoc/common.rb +2 -0
- data/lib/isodoc/convert.rb +30 -17
- data/lib/isodoc/css.rb +43 -34
- data/lib/isodoc/function/blocks.rb +21 -4
- data/lib/isodoc/function/blocks_example_note.rb +2 -2
- data/lib/isodoc/function/cleanup.rb +53 -45
- data/lib/isodoc/function/form.rb +51 -0
- data/lib/isodoc/function/inline.rb +37 -15
- data/lib/isodoc/function/references.rb +55 -42
- data/lib/isodoc/function/section.rb +29 -16
- data/lib/isodoc/function/table.rb +1 -0
- data/lib/isodoc/function/to_word_html.rb +33 -29
- data/lib/isodoc/function/utils.rb +180 -159
- data/lib/isodoc/gem_tasks.rb +30 -31
- data/lib/isodoc/headlesshtml_convert.rb +8 -7
- data/lib/isodoc/html_convert.rb +6 -4
- data/lib/isodoc/html_function/comments.rb +2 -0
- data/lib/isodoc/html_function/footnotes.rb +14 -7
- data/lib/isodoc/html_function/form.rb +62 -0
- data/lib/isodoc/html_function/html.rb +30 -26
- data/lib/isodoc/html_function/postprocess.rb +41 -82
- data/lib/isodoc/html_function/postprocess_footnotes.rb +59 -0
- data/lib/isodoc/i18n.rb +33 -31
- data/lib/isodoc/pdf_convert.rb +12 -16
- data/lib/isodoc/presentation_function/bibdata.rb +54 -30
- data/lib/isodoc/presentation_function/block.rb +17 -8
- data/lib/isodoc/presentation_function/inline.rb +84 -120
- data/lib/isodoc/presentation_function/math.rb +84 -0
- data/lib/isodoc/presentation_function/section.rb +20 -22
- data/lib/isodoc/presentation_xml_convert.rb +2 -1
- data/lib/isodoc/sassc_importer.rb +1 -1
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/word_function/body.rb +28 -24
- data/lib/isodoc/word_function/footnotes.rb +22 -15
- data/lib/isodoc/word_function/postprocess.rb +50 -36
- data/lib/isodoc/xref.rb +9 -10
- data/lib/isodoc/xref/xref_counter.rb +32 -17
- data/lib/isodoc/xref/xref_gen.rb +33 -21
- data/lib/isodoc/xref/xref_gen_seq.rb +60 -35
- data/lib/isodoc/xref/xref_sect_gen.rb +37 -35
- data/lib/isodoc/xslfo_convert.rb +36 -27
- data/spec/assets/scripts_override.html +3 -0
- data/spec/isodoc/blocks_spec.rb +2490 -2591
- data/spec/isodoc/cleanup_spec.rb +1107 -1109
- data/spec/isodoc/footnotes_spec.rb +1 -16
- data/spec/isodoc/form_spec.rb +156 -0
- data/spec/isodoc/i18n_spec.rb +984 -972
- data/spec/isodoc/inline_spec.rb +1129 -912
- data/spec/isodoc/lists_spec.rb +316 -315
- data/spec/isodoc/postproc_spec.rb +1751 -1540
- data/spec/isodoc/presentation_xml_spec.rb +403 -323
- data/spec/isodoc/ref_spec.rb +718 -723
- data/spec/isodoc/section_spec.rb +910 -902
- data/spec/isodoc/table_spec.rb +566 -556
- data/spec/isodoc/terms_spec.rb +251 -255
- data/spec/isodoc/xref_spec.rb +3041 -2992
- data/spec/isodoc/xslfo_convert_spec.rb +39 -0
- data/spec/spec_helper.rb +30 -29
- metadata +77 -65
data/lib/isodoc/gem_tasks.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
3
|
+
require "sassc"
|
4
|
+
require "isodoc/sassc_importer"
|
5
|
+
require "rake/clean"
|
6
6
|
|
7
7
|
module IsoDoc
|
8
8
|
module GemTasks
|
@@ -11,7 +11,7 @@ module IsoDoc
|
|
11
11
|
module_function
|
12
12
|
|
13
13
|
def install
|
14
|
-
rule
|
14
|
+
rule ".css" => [proc { |tn| tn.sub(/\.css$/, ".scss") }] do |current_task|
|
15
15
|
begin
|
16
16
|
puts(current_task)
|
17
17
|
compile_scss_task(current_task)
|
@@ -20,23 +20,23 @@ module IsoDoc
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
scss_files = Rake::FileList[
|
24
|
-
source_files = scss_files.ext(
|
23
|
+
scss_files = Rake::FileList["lib/**/*.scss"]
|
24
|
+
source_files = scss_files.ext(".css")
|
25
25
|
|
26
26
|
task :comment_out_liquid do
|
27
27
|
process_css_files(scss_files) do |file_name|
|
28
|
-
comment_out_liquid(File.read(file_name, encoding:
|
28
|
+
comment_out_liquid(File.read(file_name, encoding: "UTF-8"))
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
32
|
task build_scss: [:comment_out_liquid].push(*source_files) do
|
33
33
|
process_css_files(scss_files) do |file_name|
|
34
|
-
uncomment_out_liquid(File.read(file_name, encoding:
|
34
|
+
uncomment_out_liquid(File.read(file_name, encoding: "UTF-8"))
|
35
35
|
end
|
36
|
-
git_cache_compiled_files && puts(
|
36
|
+
git_cache_compiled_files && puts("Built scss!")
|
37
37
|
end
|
38
38
|
|
39
|
-
Rake::Task[
|
39
|
+
Rake::Task["build"].enhance [:build_scss] do
|
40
40
|
git_rm_compiled_files
|
41
41
|
Rake::Task[:clean].invoke
|
42
42
|
end
|
@@ -44,7 +44,7 @@ module IsoDoc
|
|
44
44
|
|
45
45
|
def notify_borken_compilation(error, current_task)
|
46
46
|
puts("Cannot compile #{current_task} because of #{error.message}")
|
47
|
-
puts(
|
47
|
+
puts("continue anyway[y|n]?")
|
48
48
|
answer = STDIN.gets.strip
|
49
49
|
if %w[y yes].include?(answer.strip.downcase)
|
50
50
|
puts("Cannot compile #{current_task} because of #{error.message}")
|
@@ -68,7 +68,7 @@ module IsoDoc
|
|
68
68
|
def process_css_files(scss_files)
|
69
69
|
scss_files.each do |file_name|
|
70
70
|
result = yield(file_name)
|
71
|
-
File.open(file_name,
|
71
|
+
File.open(file_name, "w", encoding: "UTF-8") do |file|
|
72
72
|
file.puts(result)
|
73
73
|
end
|
74
74
|
end
|
@@ -81,42 +81,41 @@ module IsoDoc
|
|
81
81
|
else
|
82
82
|
line
|
83
83
|
end
|
84
|
-
end
|
85
|
-
.join("\n")
|
84
|
+
end.join("\n")
|
86
85
|
end
|
87
86
|
|
88
87
|
def uncomment_out_liquid(text)
|
89
88
|
text
|
90
|
-
.gsub(
|
91
|
-
.gsub(
|
92
|
-
.gsub('"{{', '{{').gsub('}}"',
|
89
|
+
.gsub("/* LIQUID_COMMENT", "")
|
90
|
+
.gsub("LIQUID_COMMENT */", "")
|
91
|
+
.gsub('"{{', '{{').gsub('}}"', "}}")
|
93
92
|
end
|
94
93
|
|
95
94
|
def fonts_placeholder
|
96
95
|
<<~TEXT
|
97
|
-
$bodyfont:
|
98
|
-
$headerfont:
|
99
|
-
$monospacefont:
|
100
|
-
$normalfontsize:
|
101
|
-
$smallerfontsize:
|
102
|
-
$footnotefontsize:
|
103
|
-
$monospacefontsize:
|
96
|
+
$bodyfont: "{{bodyfont}}";
|
97
|
+
$headerfont: "{{headerfont}}";
|
98
|
+
$monospacefont: "{{monospacefont}}";
|
99
|
+
$normalfontsize: "{{normalfontsize}}";
|
100
|
+
$smallerfontsize: "{{smallerfontsize}}";
|
101
|
+
$footnotefontsize: "{{footnotefontsize}}";
|
102
|
+
$monospacefontsize: "{{monospacefontsize}}";
|
104
103
|
TEXT
|
105
104
|
end
|
106
105
|
|
107
106
|
def compile_scss(filename)
|
108
|
-
require
|
107
|
+
require "sassc"
|
109
108
|
|
110
|
-
isodoc_path = if Gem.loaded_specs[
|
111
|
-
File.join(Gem.loaded_specs[
|
109
|
+
isodoc_path = if Gem.loaded_specs["isodoc"]
|
110
|
+
File.join(Gem.loaded_specs["isodoc"].full_gem_path, "lib", "isodoc")
|
112
111
|
else
|
113
|
-
File.join(
|
112
|
+
File.join("lib", "isodoc")
|
114
113
|
end
|
115
114
|
[isodoc_path,
|
116
115
|
File.dirname(filename)].each do |name|
|
117
116
|
SassC.load_paths << name
|
118
117
|
end
|
119
|
-
sheet_content = File.read(filename, encoding:
|
118
|
+
sheet_content = File.read(filename, encoding: "UTF-8")
|
120
119
|
SassC::Engine.new(fonts_placeholder + sheet_content,
|
121
120
|
syntax: :scss,
|
122
121
|
importer: SasscImporter)
|
@@ -125,10 +124,10 @@ module IsoDoc
|
|
125
124
|
|
126
125
|
def compile_scss_task(current_task)
|
127
126
|
filename = current_task.source
|
128
|
-
basename = File.basename(filename,
|
127
|
+
basename = File.basename(filename, ".*")
|
129
128
|
compiled_path = File.join(File.dirname(filename), "#{basename}.css")
|
130
129
|
content = uncomment_out_liquid(compile_scss(filename))
|
131
|
-
File.open(compiled_path,
|
130
|
+
File.open(compiled_path, "w:UTF-8") do |f|
|
132
131
|
f.write(content)
|
133
132
|
end
|
134
133
|
CLEAN << compiled_path
|
@@ -1,11 +1,10 @@
|
|
1
|
-
require_relative "html_function/comments
|
2
|
-
require_relative "html_function/footnotes
|
3
|
-
require_relative "html_function/html
|
1
|
+
require_relative "html_function/comments"
|
2
|
+
require_relative "html_function/footnotes"
|
3
|
+
require_relative "html_function/html"
|
4
4
|
require "fileutils"
|
5
5
|
|
6
6
|
module IsoDoc
|
7
7
|
class HeadlessHtmlConvert < ::IsoDoc::Convert
|
8
|
-
|
9
8
|
include HtmlFunction::Comments
|
10
9
|
include HtmlFunction::Footnotes
|
11
10
|
include HtmlFunction::Html
|
@@ -26,16 +25,18 @@ module IsoDoc
|
|
26
25
|
docxml, filename, dir = convert_init(file, input_filename, debug)
|
27
26
|
result = convert1(docxml, filename, dir)
|
28
27
|
return result if debug
|
29
|
-
|
28
|
+
|
29
|
+
postprocess(result, "#{filename}.tmp.html", dir)
|
30
30
|
FileUtils.rm_rf dir
|
31
|
-
strip_head(filename
|
31
|
+
strip_head("#{filename}.tmp.html",
|
32
|
+
output_filename || "#{filename}.#{@suffix}")
|
32
33
|
FileUtils.rm_rf ["#{filename}.tmp.html", tmpimagedir]
|
33
34
|
end
|
34
35
|
|
35
36
|
def strip_head(input, output)
|
36
37
|
file = File.read(input, encoding: "utf-8")
|
37
38
|
doc = Nokogiri::XML(file)
|
38
|
-
doc.xpath("//head").each
|
39
|
+
doc.xpath("//head").each(&:remove)
|
39
40
|
doc.xpath("//html").each { |x| x.name = "div" }
|
40
41
|
body = doc.at("//body")
|
41
42
|
body.replace(body.children)
|
data/lib/isodoc/html_convert.rb
CHANGED
@@ -1,13 +1,15 @@
|
|
1
|
-
require_relative "html_function/comments
|
2
|
-
require_relative "html_function/footnotes
|
3
|
-
require_relative "html_function/html
|
4
|
-
require_relative "html_function/
|
1
|
+
require_relative "html_function/comments"
|
2
|
+
require_relative "html_function/footnotes"
|
3
|
+
require_relative "html_function/html"
|
4
|
+
require_relative "html_function/form"
|
5
|
+
require_relative "html_function/postprocess"
|
5
6
|
|
6
7
|
module IsoDoc
|
7
8
|
class HtmlConvert < ::IsoDoc::Convert
|
8
9
|
|
9
10
|
include HtmlFunction::Comments
|
10
11
|
include HtmlFunction::Footnotes
|
12
|
+
include HtmlFunction::Form
|
11
13
|
include HtmlFunction::Html
|
12
14
|
|
13
15
|
def tmpimagedir_suffix
|
@@ -84,6 +84,7 @@ module IsoDoc::HtmlFunction
|
|
84
84
|
def comment_attributes(docxml, x)
|
85
85
|
fromlink = docxml.at("//*[@id='#{x['from']}']")
|
86
86
|
return(nil) if fromlink.nil?
|
87
|
+
|
87
88
|
tolink = docxml.at("//*[@id='#{x['to']}']") || fromlink
|
88
89
|
target = docxml.at("//*[@id='#{x['target']}']")
|
89
90
|
{ from: fromlink, to: tolink, target: target }
|
@@ -122,6 +123,7 @@ module IsoDoc::HtmlFunction
|
|
122
123
|
comments = []
|
123
124
|
docxml.xpath("//div[@style='mso-element:comment']").each do |c|
|
124
125
|
next unless c["id"] && !link_order[c["id"]].nil?
|
126
|
+
|
125
127
|
comments << { text: c.remove.to_s, id: c["id"] }
|
126
128
|
end
|
127
129
|
comments.sort! { |a, b| link_order[a[:id]] <=> link_order[b[:id]] }
|
@@ -3,6 +3,7 @@ module IsoDoc::HtmlFunction
|
|
3
3
|
|
4
4
|
def footnotes(div)
|
5
5
|
return if @footnotes.empty?
|
6
|
+
|
6
7
|
@footnotes.each { |fn| div.parent << fn }
|
7
8
|
end
|
8
9
|
|
@@ -44,15 +45,19 @@ module IsoDoc::HtmlFunction
|
|
44
45
|
def get_table_ancestor_id(node)
|
45
46
|
table = node.ancestors("table") || node.ancestors("figure")
|
46
47
|
return UUIDTools::UUID.random_create.to_s if table.empty?
|
48
|
+
|
47
49
|
table.last["id"]
|
48
50
|
end
|
49
51
|
|
52
|
+
# @seen_footnote:
|
53
|
+
# do not output footnote text if we have already seen it for this table
|
54
|
+
|
50
55
|
def table_footnote_parse(node, out)
|
51
56
|
fn = node["reference"] || UUIDTools::UUID.random_create.to_s
|
52
57
|
tid = get_table_ancestor_id(node)
|
53
58
|
make_table_footnote_link(out, tid + fn, fn)
|
54
|
-
# do not output footnote text if we have already seen it for this table
|
55
59
|
return if @seen_footnote.include?(tid + fn)
|
60
|
+
|
56
61
|
@in_footnote = true
|
57
62
|
out.aside **{ class: "footnote" } do |a|
|
58
63
|
a << make_table_footnote_text(node, tid + fn, fn)
|
@@ -62,8 +67,9 @@ module IsoDoc::HtmlFunction
|
|
62
67
|
end
|
63
68
|
|
64
69
|
def footnote_parse(node, out)
|
65
|
-
|
66
|
-
!node.ancestors.map
|
70
|
+
return table_footnote_parse(node, out) if (@in_table || @in_figure) &&
|
71
|
+
!node.ancestors.map(&:name).include?("name")
|
72
|
+
|
67
73
|
fn = node["reference"] || UUIDTools::UUID.random_create.to_s
|
68
74
|
attrs = { class: "FootnoteRef", href: "#fn:#{fn}" }
|
69
75
|
out.a **attrs do |a|
|
@@ -72,12 +78,13 @@ module IsoDoc::HtmlFunction
|
|
72
78
|
make_footnote(node, fn)
|
73
79
|
end
|
74
80
|
|
75
|
-
def make_footnote(node,
|
76
|
-
return if @seen_footnote.include?(
|
81
|
+
def make_footnote(node, fnote)
|
82
|
+
return if @seen_footnote.include?(fnote)
|
83
|
+
|
77
84
|
@in_footnote = true
|
78
|
-
@footnotes << make_generic_footnote_text(node,
|
85
|
+
@footnotes << make_generic_footnote_text(node, fnote)
|
79
86
|
@in_footnote = false
|
80
|
-
@seen_footnote <<
|
87
|
+
@seen_footnote << fnote
|
81
88
|
end
|
82
89
|
end
|
83
90
|
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module IsoDoc::HtmlFunction
|
2
|
+
module Form
|
3
|
+
def form_parse(node, out)
|
4
|
+
out.form **attr_code(id: node["id"], name: node["name"],
|
5
|
+
action: node["action"]) do |div|
|
6
|
+
node.children.each do |n|
|
7
|
+
parse(n, div)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def input_parse(node, out)
|
13
|
+
out.input nil, **attr_code(
|
14
|
+
id: node["id"], name: node["name"], type: node["type"],
|
15
|
+
value: node["value"], disabled: node["disabled"],
|
16
|
+
readonly: node["readonly"], checked: node["checked"],
|
17
|
+
maxlength: node["maxlength"], minlength: node["minlength"]
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
21
|
+
def select_parse(node, out)
|
22
|
+
selected = node.at(ns("./option[@value = '#{node['value']}']"))
|
23
|
+
selected and selected["selected"] = true
|
24
|
+
out.select **attr_code(
|
25
|
+
id: node["id"], name: node["name"], size: node["size"],
|
26
|
+
disabled: node["disabled"], multiple: node["multiple"]
|
27
|
+
) do |div|
|
28
|
+
node.children.each do |n|
|
29
|
+
parse(n, div)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def label_parse(node, out)
|
35
|
+
out.label **attr_code(for: node["for"]) do |div|
|
36
|
+
node.children.each do |n|
|
37
|
+
parse(n, div)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def option_parse(node, out)
|
43
|
+
out.option **attr_code(
|
44
|
+
disabled: node["disabled"], selected: node["selected"],
|
45
|
+
value: node["value"]
|
46
|
+
) do |o|
|
47
|
+
node.children.each do |n|
|
48
|
+
parse(n, o)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def textarea_parse(node, out)
|
54
|
+
out.textarea **attr_code(
|
55
|
+
id: node["id"], name: node["name"], rows: node["rows"],
|
56
|
+
cols: node["cols"]
|
57
|
+
) do |div|
|
58
|
+
node["value"] and div << node["value"]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -5,9 +5,9 @@ module IsoDoc::HtmlFunction
|
|
5
5
|
module Html
|
6
6
|
def convert1(docxml, filename, dir)
|
7
7
|
noko do |xml|
|
8
|
-
xml.html **{ lang:
|
8
|
+
xml.html **{ lang: @lang.to_s } do |html|
|
9
9
|
info docxml, nil
|
10
|
-
populate_css
|
10
|
+
populate_css
|
11
11
|
html.head { |head| define_head head, filename, dir }
|
12
12
|
make_body(html, docxml)
|
13
13
|
end
|
@@ -15,13 +15,17 @@ module IsoDoc::HtmlFunction
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def make_body1(body, _docxml)
|
18
|
+
return if @bare
|
19
|
+
|
18
20
|
body.div **{ class: "title-section" } do |div1|
|
19
21
|
div1.p { |p| p << " " } # placeholder
|
20
22
|
end
|
21
23
|
section_break(body)
|
22
24
|
end
|
23
25
|
|
24
|
-
def make_body2(body,
|
26
|
+
def make_body2(body, _docxml)
|
27
|
+
return if @bare
|
28
|
+
|
25
29
|
body.div **{ class: "prefatory-section" } do |div2|
|
26
30
|
div2.p { |p| p << " " } # placeholder
|
27
31
|
end
|
@@ -43,46 +47,47 @@ module IsoDoc::HtmlFunction
|
|
43
47
|
end
|
44
48
|
end
|
45
49
|
|
46
|
-
def googlefonts
|
50
|
+
def googlefonts
|
47
51
|
<<~HEAD.freeze
|
48
|
-
|
49
|
-
|
52
|
+
<link href="https://fonts.googleapis.com/css?family=Overpass:300,300i,600,900" rel="stylesheet">
|
53
|
+
<link href="https://fonts.googleapis.com/css?family=Lato:400,400i,700,900" rel="stylesheet">
|
50
54
|
HEAD
|
51
55
|
end
|
52
56
|
|
53
|
-
def html_head
|
57
|
+
def html_head
|
54
58
|
<<~HEAD.freeze
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
59
|
+
<title>#{@meta&.get&.dig(:doctitle)}</title>
|
60
|
+
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
|
61
|
+
|
62
|
+
<!--TOC script import-->
|
63
|
+
<script type="text/javascript" src="https://cdn.rawgit.com/jgallen23/toc/0.3.2/dist/toc.min.js"></script>
|
64
|
+
<script type="text/javascript">#{toclevel}</script>
|
65
|
+
|
66
|
+
<!--Google fonts-->
|
67
|
+
<link rel="preconnect" href="https://fonts.gstatic.com">#{' '}
|
68
|
+
#{googlefonts}
|
69
|
+
<!--Font awesome import for the link icon-->
|
70
|
+
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.8/css/solid.css" integrity="sha384-v2Tw72dyUXeU3y4aM2Y0tBJQkGfplr39mxZqlTBDUZAb9BGoC40+rdFCG0m10lXk" crossorigin="anonymous">
|
71
|
+
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.8/css/fontawesome.css" integrity="sha384-q3jl8XQu1OpdLgGFvNRnPdj5VIlCvgsDQTQB6owSOHWlAurxul7f+JpUOVdAiJ5P" crossorigin="anonymous">
|
72
|
+
<style class="anchorjs"></style>
|
69
73
|
HEAD
|
70
74
|
end
|
71
75
|
|
72
|
-
def html_button
|
76
|
+
def html_button
|
73
77
|
'<button onclick="topFunction()" id="myBtn" '\
|
74
78
|
'title="Go to top">Top</button>'.freeze
|
75
79
|
end
|
76
80
|
|
77
81
|
def html_main(docxml)
|
78
|
-
docxml.at("//head").add_child(html_head
|
82
|
+
docxml.at("//head").add_child(html_head)
|
79
83
|
d = docxml.at('//div[@class="main-section"]')
|
80
84
|
d.name = "main"
|
81
|
-
d.children.empty? or d.children.first.previous = html_button
|
85
|
+
d.children.empty? or d.children.first.previous = html_button
|
82
86
|
end
|
83
87
|
|
84
88
|
def sourcecodelang(lang)
|
85
89
|
return unless lang
|
90
|
+
|
86
91
|
case lang.downcase
|
87
92
|
when "javascript" then "lang-js"
|
88
93
|
when "c" then "lang-c"
|
@@ -117,7 +122,6 @@ module IsoDoc::HtmlFunction
|
|
117
122
|
end
|
118
123
|
end
|
119
124
|
|
120
|
-
def table_long_strings_cleanup(docxml)
|
121
|
-
end
|
125
|
+
def table_long_strings_cleanup(docxml); end
|
122
126
|
end
|
123
127
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require "isodoc/html_function/mathvariant_to_plain"
|
2
|
+
require_relative "postprocess_footnotes"
|
2
3
|
|
3
4
|
module IsoDoc::HtmlFunction
|
4
5
|
module Html
|
@@ -28,15 +29,15 @@ module IsoDoc::HtmlFunction
|
|
28
29
|
.sub(%r{<\?xml[^>]+>}, "")
|
29
30
|
end
|
30
31
|
|
31
|
-
def html_cleanup(
|
32
|
+
def html_cleanup(html)
|
32
33
|
mathml(
|
33
34
|
footnote_format(
|
34
35
|
footnote_backlinks(
|
35
36
|
html_toc(
|
36
|
-
term_header(html_footnote_filter(html_preface(htmlstyle(
|
37
|
-
)
|
38
|
-
)
|
39
|
-
)
|
37
|
+
term_header(html_footnote_filter(html_preface(htmlstyle(html)))),
|
38
|
+
),
|
39
|
+
),
|
40
|
+
),
|
40
41
|
)
|
41
42
|
end
|
42
43
|
|
@@ -46,6 +47,7 @@ module IsoDoc::HtmlFunction
|
|
46
47
|
|
47
48
|
def htmlstylesheet(file)
|
48
49
|
return if file.nil?
|
50
|
+
|
49
51
|
file.open if file.is_a?(Tempfile)
|
50
52
|
stylesheet = file.read
|
51
53
|
xml = Nokogiri::XML("<style/>")
|
@@ -57,7 +59,7 @@ module IsoDoc::HtmlFunction
|
|
57
59
|
|
58
60
|
def htmlstyle(docxml)
|
59
61
|
return docxml unless @htmlstylesheet
|
60
|
-
|
62
|
+
|
61
63
|
head = docxml.at("//*[local-name() = 'head']")
|
62
64
|
head << htmlstylesheet(@htmlstylesheet)
|
63
65
|
s = htmlstylesheet(@htmlstylesheet_override) and head << s
|
@@ -65,8 +67,8 @@ module IsoDoc::HtmlFunction
|
|
65
67
|
end
|
66
68
|
|
67
69
|
def html_preface(docxml)
|
68
|
-
html_cover(docxml) if @htmlcoverpage
|
69
|
-
html_intro(docxml) if @htmlintropage
|
70
|
+
html_cover(docxml) if @htmlcoverpage && !@bare
|
71
|
+
html_intro(docxml) if @htmlintropage && !@bare
|
70
72
|
docxml.at("//body") << mathjax(@openmathdelim, @closemathdelim)
|
71
73
|
docxml.at("//body") << sourcecode_highlighter
|
72
74
|
html_main(docxml)
|
@@ -76,8 +78,9 @@ module IsoDoc::HtmlFunction
|
|
76
78
|
|
77
79
|
def authority_cleanup1(docxml, klass)
|
78
80
|
dest = docxml.at("//div[@id = 'boilerplate-#{klass}-destination']")
|
79
|
-
auth = docxml.at("//div[@id = 'boilerplate-#{klass}' or
|
80
|
-
|
81
|
+
auth = docxml.at("//div[@id = 'boilerplate-#{klass}' or "\
|
82
|
+
"@class = 'boilerplate-#{klass}']")
|
83
|
+
auth&.xpath(".//h1[not(text())] | .//h2[not(text())]")&.each(&:remove)
|
81
84
|
auth&.xpath(".//h1 | .//h2")&.each { |h| h["class"] = "IntroTitle" }
|
82
85
|
dest and auth and dest.replace(auth.remove)
|
83
86
|
end
|
@@ -92,14 +95,18 @@ module IsoDoc::HtmlFunction
|
|
92
95
|
doc = to_xhtml_fragment(File.read(@htmlcoverpage, encoding: "UTF-8"))
|
93
96
|
d = docxml.at('//div[@class="title-section"]')
|
94
97
|
# d.children.first.add_previous_sibling doc.to_xml(encoding: "US-ASCII")
|
95
|
-
d.children.first.add_previous_sibling
|
98
|
+
d.children.first.add_previous_sibling(
|
99
|
+
populate_template(doc.to_xml(encoding: "US-ASCII"), :html),
|
100
|
+
)
|
96
101
|
end
|
97
102
|
|
98
103
|
def html_intro(docxml)
|
99
104
|
doc = to_xhtml_fragment(File.read(@htmlintropage, encoding: "UTF-8"))
|
100
105
|
d = docxml.at('//div[@class="prefatory-section"]')
|
101
106
|
# d.children.first.add_previous_sibling doc.to_xml(encoding: "US-ASCII")
|
102
|
-
d.children.first.add_previous_sibling
|
107
|
+
d.children.first.add_previous_sibling(
|
108
|
+
populate_template(doc.to_xml(encoding: "US-ASCII"), :html),
|
109
|
+
)
|
103
110
|
end
|
104
111
|
|
105
112
|
def html_toc_entry(level, header)
|
@@ -112,7 +119,9 @@ module IsoDoc::HtmlFunction
|
|
112
119
|
end
|
113
120
|
|
114
121
|
def toclevel
|
115
|
-
ret = toclevel_classes.map
|
122
|
+
ret = toclevel_classes.map do |l|
|
123
|
+
"#{l}:not(:empty):not(.TermNum):not(.noTOC)"
|
124
|
+
end
|
116
125
|
<<~HEAD.freeze
|
117
126
|
function toclevel() { return "#{ret.join(',')}";}
|
118
127
|
HEAD
|
@@ -140,99 +149,49 @@ module IsoDoc::HtmlFunction
|
|
140
149
|
docxml.xpath("//*[local-name() = 'img']").each do |i|
|
141
150
|
i["width"], i["height"] = Html2Doc.image_resize(i, image_localfile(i),
|
142
151
|
@maxheight, @maxwidth)
|
143
|
-
next if /^data:/.match i["src"]
|
152
|
+
next if /^data:/.match? i["src"]
|
153
|
+
|
144
154
|
@datauriimage ? datauri(i) : move_image1(i)
|
145
155
|
end
|
146
156
|
docxml
|
147
157
|
end
|
148
158
|
|
149
|
-
def datauri(
|
150
|
-
type =
|
159
|
+
def datauri(img)
|
160
|
+
type = img["src"].split(".")[-1]
|
151
161
|
supertype = type == "xml" ? "application" : "image"
|
152
|
-
bin = IO.binread(image_localfile(
|
162
|
+
bin = IO.binread(image_localfile(img))
|
153
163
|
data = Base64.strict_encode64(bin)
|
154
|
-
|
164
|
+
img["src"] = "data:#{supertype}/#{type};base64,#{data}"
|
155
165
|
end
|
156
166
|
|
157
|
-
def image_suffix(
|
158
|
-
type =
|
159
|
-
matched = /\.(?<suffix>[^. \r\n\t]+)$/.match
|
167
|
+
def image_suffix(img)
|
168
|
+
type = img["mimetype"]&.sub(%r{^[^/*]+/}, "")
|
169
|
+
matched = /\.(?<suffix>[^. \r\n\t]+)$/.match img["src"]
|
160
170
|
type and !type.empty? and return type
|
171
|
+
|
161
172
|
!matched.nil? and matched[:suffix] and return matched[:suffix]
|
162
173
|
"png"
|
163
174
|
end
|
164
175
|
|
165
|
-
def move_image1(
|
166
|
-
suffix = image_suffix(
|
176
|
+
def move_image1(img)
|
177
|
+
suffix = image_suffix(img)
|
167
178
|
uuid = UUIDTools::UUID.random_create.to_s
|
168
179
|
fname = "#{uuid}.#{suffix}"
|
169
180
|
new_full_filename = File.join(tmpimagedir, fname)
|
170
|
-
local_filename = image_localfile(
|
181
|
+
local_filename = image_localfile(img)
|
171
182
|
FileUtils.cp local_filename, new_full_filename
|
172
|
-
|
183
|
+
img["src"] = File.join(rel_tmpimagedir, fname)
|
173
184
|
end
|
174
185
|
|
175
186
|
def inject_script(doc)
|
176
187
|
return doc unless @scripts
|
188
|
+
|
177
189
|
scripts = File.read(@scripts, encoding: "UTF-8")
|
190
|
+
scripts_override = ""
|
191
|
+
@scripts_override and
|
192
|
+
scripts_override = File.read(@scripts_override, encoding: "UTF-8")
|
178
193
|
a = doc.split(%r{</body>})
|
179
|
-
a[0]
|
180
|
-
end
|
181
|
-
|
182
|
-
def update_footnote_filter(fn, x, i, seen)
|
183
|
-
if seen[fn.text]
|
184
|
-
x.at("./sup").content = seen[fn.text][:num].to_s
|
185
|
-
fn.remove unless x["href"] == seen[fn.text][:href]
|
186
|
-
x["href"] = seen[fn.text][:href]
|
187
|
-
else
|
188
|
-
seen[fn.text] = { num: i, href: x["href"] }
|
189
|
-
x.at("./sup").content = i.to_s
|
190
|
-
i += 1
|
191
|
-
end
|
192
|
-
[i, seen]
|
193
|
-
end
|
194
|
-
|
195
|
-
def html_footnote_filter(docxml)
|
196
|
-
seen = {}
|
197
|
-
i = 1
|
198
|
-
docxml.xpath('//a[@class = "FootnoteRef"]').each do |x|
|
199
|
-
fn = docxml.at(%<//*[@id = '#{x['href'].sub(/^#/, '')}']>) || next
|
200
|
-
i, seen = update_footnote_filter(fn, x, i, seen)
|
201
|
-
end
|
202
|
-
docxml
|
203
|
-
end
|
204
|
-
|
205
|
-
def footnote_backlinks1(x, fn)
|
206
|
-
xdup = x.dup
|
207
|
-
xdup.remove["id"]
|
208
|
-
if fn.elements.empty?
|
209
|
-
fn.children.first.previous = xdup
|
210
|
-
else
|
211
|
-
fn.elements.first.children.first.previous = xdup
|
212
|
-
end
|
213
|
-
end
|
214
|
-
|
215
|
-
def footnote_backlinks(docxml)
|
216
|
-
seen = {}
|
217
|
-
docxml.xpath('//a[@class = "FootnoteRef"]').each_with_index do |x, i|
|
218
|
-
seen[x["href"]] and next or seen[x["href"]] = true
|
219
|
-
fn = docxml.at(%<//*[@id = '#{x['href'].sub(/^#/, '')}']>) || next
|
220
|
-
footnote_backlinks1(x, fn)
|
221
|
-
x["id"] ||= "fnref:#{i + 1}"
|
222
|
-
fn.add_child "<a href='##{x['id']}'>↩</a>"
|
223
|
-
end
|
224
|
-
docxml
|
225
|
-
end
|
226
|
-
|
227
|
-
def footnote_format(docxml)
|
228
|
-
docxml.xpath("//a[@class = 'FootnoteRef']/sup").each do |x|
|
229
|
-
footnote_reference_format(x)
|
230
|
-
end
|
231
|
-
docxml.xpath("//a[@class = 'TableFootnoteRef'] | "\
|
232
|
-
"//span[@class = 'TableFootnoteRef']").each do |x|
|
233
|
-
table_footnote_reference_format(x)
|
234
|
-
end
|
235
|
-
docxml
|
194
|
+
"#{a[0]}#{scripts}#{scripts_override}</body>#{a[1]}"
|
236
195
|
end
|
237
196
|
|
238
197
|
def sourcecode_highlighter
|