Module: Asciidoctor::Standoc::Base

Included in:
Converter
Defined in:
lib/asciidoctor/standoc/base.rb

Constant Summary collapse

XML_ROOT_TAG =
"standard-document".freeze
XML_NAMESPACE =
"https://www.metanorma.org/ns/standoc".freeze
TERM_REFERENCE_RE_STR =
<<~REGEXP.freeze
  ^(?<xref><(xref|concept)[^>]+>([^<]*</(xref|concept)>)?)
         (,\s(?<text>.*))?
  $
REGEXP
TERM_REFERENCE_RE =
Regexp.new(TERM_REFERENCE_RE_STR.gsub(/\s/, "").gsub(/_/, "\\s"),
Regexp::IGNORECASE | Regexp::MULTILINE)

Instance Method Summary collapse

Instance Method Details

#add_term_source(xml_t, seen_xref, m) ⇒ Object



193
194
195
196
197
198
199
200
201
202
# File 'lib/asciidoctor/standoc/base.rb', line 193

def add_term_source(xml_t, seen_xref, m)
  if seen_xref.children[0].name == "concept"
    xml_t.origin { |o| o << seen_xref.children[0].to_xml }
  else
    xml_t.origin seen_xref.children[0].content, **attr_code(term_source_attrs(seen_xref))
  end
  m[:text] && xml_t.modification do |mod|
    mod.p { |p| p << m[:text].sub(/^\s+/, "") }
  end
end

#clean_exitObject



147
148
149
150
# File 'lib/asciidoctor/standoc/base.rb', line 147

def clean_exit
  @log.write(@output_dir + @filename + ".err") unless @novalid
  @files_to_delete.each { |f| FileUtils.rm f }
end

#content(node) ⇒ Object



25
26
27
# File 'lib/asciidoctor/standoc/base.rb', line 25

def content(node)
  node.content
end

#default_fonts(node) ⇒ Object



118
119
120
121
122
123
124
125
# File 'lib/asciidoctor/standoc/base.rb', line 118

def default_fonts(node)
  b = node.attr("body-font") ||
    (node.attr("script") == "Hans" ? '"SimSun",serif' : '"Cambria",serif')
  h = node.attr("header-font") ||
    (node.attr("script") == "Hans" ? '"SimHei",sans-serif' : '"Cambria",serif')
  m = node.attr("monospace-font") || '"Courier New",monospace'
  "$bodyfont: #{b};\n$headerfont: #{h};\n$monospacefont: #{m};\n"
end

#doc_converter(node) ⇒ Object



81
82
83
# File 'lib/asciidoctor/standoc/base.rb', line 81

def doc_converter(node)
  IsoDoc::WordConvert.new(doc_extract_attributes(node))
end

#doc_extract_attributes(node) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/asciidoctor/standoc/base.rb', line 60

def doc_extract_attributes(node)
  {
    script: node.attr("script"),
    bodyfont: node.attr("body-font"),
    headerfont: node.attr("header-font"),
    monospacefont: node.attr("monospace-font"),
    i18nyaml: node.attr("i18nyaml"),
    scope: node.attr("scope"),
    wordstylesheet: node.attr("wordstylesheet"),
    standardstylesheet: node.attr("standardstylesheet"),
    header: node.attr("header"),
    wordcoverpage: node.attr("wordcoverpage"),
    wordintropage: node.attr("wordintropage"),
    ulstyle: node.attr("ulstyle"),
    olstyle: node.attr("olstyle"),
    htmltoclevels: node.attr("htmltoclevels") || node.attr("toclevels"),
    doctoclevels: node.attr("doctoclevels") || node.attr("toclevels"),
    break_up_urls_in_tables: node.attr("break-up-urls-in-tables"),
  }
end

#doctype(node) ⇒ Object



172
173
174
# File 'lib/asciidoctor/standoc/base.rb', line 172

def doctype(node)
  node.attr("doctype")&.gsub(/\s+/, "-")&.downcase
end

#document(node) ⇒ Object



134
135
136
137
138
139
140
# File 'lib/asciidoctor/standoc/base.rb', line 134

def document(node)
  init(node)
  ret = makexml(node).to_xml(indent: 2)
  outputs(node, ret) unless node.attr("nodoc") || !node.attr("docfile")
  clean_exit
  ret
end

#draft?Boolean

Returns:

  • (Boolean)


168
169
170
# File 'lib/asciidoctor/standoc/base.rb', line 168

def draft?
  @draft
end

#extract_termsource_refs(text, node) ⇒ Object



213
214
215
216
217
# File 'lib/asciidoctor/standoc/base.rb', line 213

def extract_termsource_refs(text, node)
  matched = TERM_REFERENCE_RE.match text
  matched.nil? and @log.add("AsciiDoc Input", node, "term reference not in expected format: #{text}")
  matched
end

#front(node, xml) ⇒ Object



176
177
178
179
180
# File 'lib/asciidoctor/standoc/base.rb', line 176

def front(node, xml)
  xml.bibdata **attr_code(type: "standard") do |b|
     node, b
  end
end

#html_converter(node) ⇒ Object



56
57
58
# File 'lib/asciidoctor/standoc/base.rb', line 56

def html_converter(node)
  IsoDoc::HtmlConvert.new(html_extract_attributes(node))
end

#html_extract_attributes(node) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/asciidoctor/standoc/base.rb', line 36

def html_extract_attributes(node)
  {
    script: node.attr("script"),
    bodyfont: node.attr("body-font"),
    headerfont: node.attr("header-font"),
    monospacefont: node.attr("monospace-font"),
    i18nyaml: node.attr("i18nyaml"),
    scope: node.attr("scope"),
    htmlstylesheet: node.attr("htmlstylesheet"),
    htmlcoverpage: node.attr("htmlcoverpage"),
    htmlintropage: node.attr("htmlintropage"),
    scripts: node.attr("scripts"),
    scripts_pdf: node.attr("scripts-pdf"),
    datauriimage: node.attr("data-uri-image"),
    htmltoclevels: node.attr("htmltoclevels") || node.attr("toclevels"),
    doctoclevels: node.attr("doctoclevels") || node.attr("toclevels"),
    break_up_urls_in_tables: node.attr("break-up-urls-in-tables"),
  }
end

#init(node) ⇒ Object



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/asciidoctor/standoc/base.rb', line 89

def init(node)
  @fn_number ||= 0
  @draft = false
  @refids = Set.new
  @anchors = {}
  @draft = node.attributes.has_key?("draft")
  @novalid = node.attr("novalid")
  @smartquotes = node.attr("smartquotes") != "false"
  @keepasciimath = node.attr("mn-keep-asciimath") && node.attr("mn-keep-asciimath") != "false"
  @fontheader = default_fonts(node)
  @files_to_delete = []
  @filename = node.attr("docfile") ?  File.basename(node.attr("docfile")).gsub(/\.adoc$/, "") : ""
  @localdir = Utils::localdir(node)
  @output_dir = outputdir node
  @no_isobib_cache = node.attr("no-isobib-cache")
  @no_isobib = node.attr("no-isobib")
  @bibdb = nil
  @seen_headers = []
  @datauriimage = node.attr("data-uri-image")
  @boilerplateauthority = node.attr("boilerplate-authority")
  @log = Asciidoctor::Standoc::Log.new
  init_bib_caches(node)
  init_iev_caches(node)
  @lang = (node.attr("language") || "en")
  @script = (node.attr("script") || "Latn")
  @isodoc = isodoc(@lang, @script, node.attr("i18nyaml"))
  @i18n = @isodoc.i18n
end

#makexml(node) ⇒ Object



160
161
162
163
164
165
166
# File 'lib/asciidoctor/standoc/base.rb', line 160

def makexml(node)
  result = makexml1(node)
  ret1 = cleanup(Nokogiri::XML(result))
  ret1.root.add_namespace(nil, xml_namespace)
  validate(ret1) unless @novalid
  ret1
end

#makexml1(node) ⇒ Object



152
153
154
155
156
157
158
# File 'lib/asciidoctor/standoc/base.rb', line 152

def makexml1(node)
  result = ["<?xml version='1.0' encoding='UTF-8'?>", "<#{xml_root_tag} type='semantic' version='#{version}'>"]
  result << noko { |ixml| front node, ixml }
  result << noko { |ixml| middle node, ixml }
  result << "</#{xml_root_tag}>"
  textcleanup(result)
end

#middle(node, xml) ⇒ Object



182
183
184
185
186
# File 'lib/asciidoctor/standoc/base.rb', line 182

def middle(node, xml)
  xml.sections do |s|
    s << node.content if node.blocks?
  end
end

#outputs(node, ret) ⇒ Object



127
128
129
130
131
132
# File 'lib/asciidoctor/standoc/base.rb', line 127

def outputs(node, ret)
  File.open(@filename + ".xml", "w:UTF-8") { |f| f.write(ret) }
  presentation_xml_converter(node).convert(@filename + ".xml")
  html_converter(node).convert(@filename + ".presentation.xml", nil, false, "#{@filename}.html")
  doc_converter(node).convert(@filename + ".presentation.xml", nil, false, "#{@filename}.doc")
end

#presentation_xml_converter(node) ⇒ Object



85
86
87
# File 'lib/asciidoctor/standoc/base.rb', line 85

def presentation_xml_converter(node)
  IsoDoc::PresentationXMLConvert.new(html_extract_attributes(node))
end

#skip(node, name = nil) ⇒ Object



29
30
31
32
33
34
# File 'lib/asciidoctor/standoc/base.rb', line 29

def skip(node, name = nil)
  name = name || node.node_name
  w = "converter missing for #{name} node in Metanorma backend"
  @log.add("AsciiDoc Input", node, w)
  nil
end

#term_source_attrs(seen_xref) ⇒ Object



188
189
190
191
# File 'lib/asciidoctor/standoc/base.rb', line 188

def term_source_attrs(seen_xref)
  { bibitemid: seen_xref.children[0]["target"],
    format: seen_xref.children[0]["format"], type: "inline" }
end

#termsource(node) ⇒ Object



219
220
221
222
223
224
225
226
227
228
# File 'lib/asciidoctor/standoc/base.rb', line 219

def termsource(node)
  matched = extract_termsource_refs(node.content, node) || return
  noko do |xml|
    attrs = { status: matched[:text] ? "modified" : "identical" }
    xml.termsource **attrs do |xml_t|
      seen_xref = Nokogiri::XML.fragment(matched[:xref])
      add_term_source(xml_t, seen_xref, matched)
    end
  end.join("\n")
end

#versionObject



142
143
144
145
# File 'lib/asciidoctor/standoc/base.rb', line 142

def version
  flavour = self.class.name.sub(/::Converter$/, "").sub(/^.+::/, "")
  Metanorma.versioned(Metanorma, flavour)[-1]::VERSION
end

#xml_namespaceObject



21
22
23
# File 'lib/asciidoctor/standoc/base.rb', line 21

def xml_namespace
  self.class::XML_NAMESPACE
end

#xml_root_tagObject



17
18
19
# File 'lib/asciidoctor/standoc/base.rb', line 17

def xml_root_tag
  self.class::XML_ROOT_TAG
end