Module: Metanorma::Standoc::Utils

Included in:
Cleanup::SpansToBibitem, Converter, NumberInlineMacro, TermLookupCleanup
Defined in:
lib/metanorma/standoc/utils.rb

Defined Under Namespace

Classes: EmptyAttr

Constant Summary collapse

SUBCLAUSE_XPATH =
"//clause[not(parent::sections)]" \
"[not(ancestor::boilerplate)]".freeze
SECTION_CONTAINERS =
%w(foreword introduction acknowledgements abstract
clause references terms definitions annex appendix indexsect 
executivesummary).freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.adoc2xml(text, flavour) ⇒ Object

wrapped in <sections>



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/metanorma/standoc/utils.rb', line 129

def adoc2xml(text, flavour)
  Nokogiri::XML(text).root and return text
  f = @flush_caches ? ":flush-caches:\n" : ""
  doc = "    = X\n    A\n    :semantic-metadata-headless: true\n    :no-isobib:\n    \#{f}:novalid:\n    :!sectids:\n\n    \#{text}\n  ADOC\n  c = Asciidoctor.convert(doc, backend: flavour, header_footer: true)\n  Nokogiri::XML(c).at(\"//xmlns:sections\")\nend\n"

Instance Method Details

#asciimath_key(sym) ⇒ Object



146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/metanorma/standoc/utils.rb', line 146

def asciimath_key(sym)
  key = sym.dup
  key.traverse do |n|
    if n.name == "stem" && a = n.at(".//asciimath")
      n.children = @c.encode(
        @c.decode(grkletters(a.text)), :basic
      )
    end
  end
  key.xpath(".//asciimath").each(&:remove)
  Nokogiri::XML(key.to_xml)
end

#attr_code(attributes) ⇒ Object



34
35
36
# File 'lib/metanorma/standoc/utils.rb', line 34

def attr_code(attributes)
  Metanorma::Utils::attr_code(attributes)
end

#convert(node, transform = nil, opts = {}) ⇒ Object



11
12
13
14
# File 'lib/metanorma/standoc/utils.rb', line 11

def convert(node, transform = nil, opts = {})
  transform ||= node.node_name
  opts.empty? ? (send transform, node) : (send transform, node, opts)
end

#csv_split(text, delim = ";") ⇒ Object



38
39
40
41
# File 'lib/metanorma/standoc/utils.rb', line 38

def csv_split(text, delim = ";")
  Metanorma::Utils::csv_split(@c.decode(text), delim)
    .map { |x| @c.encode(x, :basic, :hexadecimal) }
end

#dl_to_attrs(elem, dlist, name) ⇒ Object



83
84
85
# File 'lib/metanorma/standoc/utils.rb', line 83

def dl_to_attrs(elem, dlist, name)
  Metanorma::Utils::dl_to_attrs(elem, dlist, name)
end

#dl_to_elems(ins, elem, dlist, name) ⇒ Object



87
88
89
# File 'lib/metanorma/standoc/utils.rb', line 87

def dl_to_elems(ins, elem, dlist, name)
  Metanorma::Utils::dl_to_elems(ins, elem, dlist, name)
end

#document_ns_attributes(_doc) ⇒ Object



26
27
28
# File 'lib/metanorma/standoc/utils.rb', line 26

def document_ns_attributes(_doc)
  nil
end

#grkletters(text) ⇒ Object



159
160
161
162
163
# File 'lib/metanorma/standoc/utils.rb', line 159

def grkletters(text)
  text.gsub(/\b(alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|
                lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|
                psi|omega)\b/xi, "&\\1;")
end

#insert_before(xmldoc, xpath) ⇒ Object



103
104
105
106
107
108
109
# File 'lib/metanorma/standoc/utils.rb', line 103

def insert_before(xmldoc, xpath)
  unless ins = xmldoc.at(xpath).children.first
    xmldoc.at(xpath) << " "
    ins = xmldoc.at(xpath).children.first
  end
  ins
end

#isodoc(lang, script, locale, i18nyaml = nil) ⇒ Object



76
77
78
79
80
81
# File 'lib/metanorma/standoc/utils.rb', line 76

def isodoc(lang, script, locale, i18nyaml = nil)
  conv = presentation_xml_converter(EmptyAttr.new)
  i18n = conv.i18n_init(lang, script, locale, i18nyaml)
  conv.(lang, script, locale, i18n)
  conv
end

#kv_parse(text, delim = ",", eql = "=") ⇒ Object



55
56
57
58
59
60
61
62
# File 'lib/metanorma/standoc/utils.rb', line 55

def kv_parse(text, delim = ",", eql = "=")
  text or return {}
  c = HTMLEntities.new
  quoted_csv_split(text, delim).each_with_object({}) do |k, m|
    x = k.split(eql, 2)
    m[x[0]] = c.decode(x[1])
  end
end


95
96
97
98
99
100
101
# File 'lib/metanorma/standoc/utils.rb', line 95

def link_unwrap(para)
  elems = para.elements
  if elems.size == 1 && elems[0].name == "link"
    para.at("./link").replace(elems[0]["target"].strip)
  end
  para
end

#nokoObject



30
31
32
# File 'lib/metanorma/standoc/utils.rb', line 30

def noko(&)
  Metanorma::Utils::noko(@script, &)
end

#processorObject



16
17
18
19
20
21
22
23
24
# File 'lib/metanorma/standoc/utils.rb', line 16

def processor
  parent_type = self.class.name.split("::")[0...-1]
  parent_type << "Processor"
  begin
    Object.const_get(parent_type.join("::"))
  rescue NameError
    nil
  end
end

#quoted_csv_split(text, delim = ",", eql = "=") ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
# File 'lib/metanorma/standoc/utils.rb', line 43

def quoted_csv_split(text, delim = ",", eql = "=")
  # quoted strings: key="va,lue",
  c = HTMLEntities.new
  text = c.decode(text).gsub(/([a-zA-Z_]+)#{eql}(["'])(.+?)\2/,
                             %("\\1#{eql}\\3"))
  Metanorma::Utils::csv_split(text, delim)
    .map do |x|
      c.encode(x.sub(/^(["'])(.+)\1$/, "\\2"),
               :basic, :hexadecimal)
    end
end

#refid?(ref) ⇒ Boolean

Returns:

  • (Boolean)


165
166
167
# File 'lib/metanorma/standoc/utils.rb', line 165

def refid?(ref)
  @refids.include? ref
end

#section_containersObject



124
125
126
# File 'lib/metanorma/standoc/utils.rb', line 124

def section_containers
  SECTION_CONTAINERS
end

#term_expr(elem) ⇒ Object



91
92
93
# File 'lib/metanorma/standoc/utils.rb', line 91

def term_expr(elem)
  "<expression><name>#{elem}</name></expression>"
end

#to_xml(node) ⇒ Object



68
69
70
71
# File 'lib/metanorma/standoc/utils.rb', line 68

def to_xml(node)
  node.to_xml(encoding: "UTF-8", indent: 2,
              save_with: Nokogiri::XML::Node::SaveOptions::AS_XML)
end

#uuid?(ref) ⇒ Boolean

Returns:

  • (Boolean)


169
170
171
172
# File 'lib/metanorma/standoc/utils.rb', line 169

def uuid?(ref)
  /^_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/
    .match?(ref)
end

#wrap_in_para(node, out) ⇒ Object



64
65
66
# File 'lib/metanorma/standoc/utils.rb', line 64

def wrap_in_para(node, out)
  Metanorma::Utils::wrap_in_para(node, out)
end

#xml_encode(text) ⇒ Object



111
112
113
114
115
116
117
# File 'lib/metanorma/standoc/utils.rb', line 111

def xml_encode(text)
  @c.encode(text, :basic, :hexadecimal)
    .gsub("&amp;gt;", ">").gsub("&amp;lt;", "<").gsub("&amp;amp;", "&")
    .gsub("&gt;", ">").gsub("&lt;", "<").gsub("&amp;", "&")
    .gsub("&quot;", '"').gsub("&#xa;", "\n").gsub("&amp;#", "&#")
    .gsub("&apos;", "'")
end