require "asciidoctor"
require "asciidoctor/standoc/converter"
require "fileutils"
require_relative "./front.rb"
require_relative "./validate.rb"
require_relative "./cleanup.rb"
require_relative "./macros.rb"
module Asciidoctor
module ITU
# A {Converter} implementation that generates RSD output, and a document
# schema encapsulation of the document for validation
#
class Converter < Standoc::Converter
XML_ROOT_TAG = "itu-standard".freeze
XML_NAMESPACE = "https://www.metanorma.org/ns/itu".freeze
register_for "itu"
Asciidoctor::Extensions.register do
inline_macro AddMacro
inline_macro DelMacro
end
def title_validate(root)
nil
end
def init(node)
super
@smartquotes = node.attr("smartquotes") == "true"
end
def makexml(node)
@draft = node.attributes.has_key?("draft")
super
end
def doctype(node)
ret = node.attr("doctype") || "recommendation"
ret = "recommendation" if ret == "article"
ret
end
def olist(node)
noko do |xml|
xml.ol **attr_code(id: Asciidoctor::Standoc::Utils::anchor_or_uuid(node),
class: node.attr("class")) do |xml_ol|
node.items.each { |item| li(xml_ol, item) }
end
end.join("\n")
end
def clause_parse(attrs, xml, node)
attrs[:preface] = true if node.attr("style") == "preface"
super
end
def move_sections_into_preface(x, preface)
x.xpath("//clause[@preface]").each do |c|
c.delete("preface")
preface.add_child c.remove
end
end
def make_preface(x, s)
s.add_previous_sibling("
#{@internal_terms_boilerplate}
" internal and internal&.next_element == nil and internal.next = "#{@no_terms_boilerplate}
" external&.next_element&.name == "term" and external.next = "#{@external_terms_boilerplate}
" external and external&.next_element == nil and external.next = "#{@no_terms_boilerplate}
" !internal and !external and %w(term terms).include? div&.next_element&.name and div.next = "#{@term_def_boilerplate}
" end NORM_REF = "//bibliography/references[title = 'References']".freeze def load_yaml(lang, script) y = if @i18nyaml then YAML.load_file(@i18nyaml) elsif lang == "en" YAML.load_file(File.join(File.dirname(__FILE__), "i18n-en.yaml")) else YAML.load_file(File.join(File.dirname(__FILE__), "i18n-en.yaml")) end @symbols_boilerplate = y["symbols_boilerplate"] || "" super.merge(y) end def i18n_init(lang, script) super end def html_extract_attributes(node) super.merge(hierarchical_assets: node.attr("hierarchical-assets")) end def doc_extract_attributes(node) super.merge(hierarchical_assets: node.attr("hierarchical-assets")) end def html_converter(node) IsoDoc::ITU::HtmlConvert.new(html_extract_attributes(node)) end def pdf_converter(node) IsoDoc::ITU::PdfConvert.new(html_extract_attributes(node)) end def word_converter(node) IsoDoc::ITU::WordConvert.new(doc_extract_attributes(node)) end end end end