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 executivesummary 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>



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

def adoc2xml(text, flavour)
  Nokogiri::XML(text).root and return text
  f = @flush_caches ? ":flush-caches:\n" : ""
  doc = <<~ADOC
    = X
    A
    :semantic-metadata-headless: true
    :no-isobib:
    #{f}:novalid:
    :!sectids:

    #{text}
  ADOC
  c = Asciidoctor.convert(doc, backend: flavour, header_footer: true)
  Nokogiri::XML(c).at("//xmlns:sections")
end

Instance Method Details

#asciimath_key(sym) ⇒ Object



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

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



85
86
87
# File 'lib/metanorma/standoc/utils.rb', line 85

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

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



89
90
91
# File 'lib/metanorma/standoc/utils.rb', line 89

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



161
162
163
164
165
# File 'lib/metanorma/standoc/utils.rb', line 161

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



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

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



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

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



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

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


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

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

quoted strings: key=“va,lue”,



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

def quoted_csv_split(text, delim = ",", eql = "=")
  c = HTMLEntities.new
  text = c.decode(text).gsub(/([a-zA-Z_]+)#{eql}(["'])(.*?)\2/) do |_|
    key = Regexp.last_match(1)
    value = Regexp.last_match(3).gsub(" ", "&#x20;")
    "\"#{key}#{eql}#{value}\""
  end
  Metanorma::Utils::csv_split(text, delim).map do |x|
    c.encode(x.sub(/^(["'])(.*?)\1$/, "\\2"),
             :basic, :hexadecimal)
  end
end

#refid?(ref) ⇒ Boolean

Returns:

  • (Boolean)


167
168
169
# File 'lib/metanorma/standoc/utils.rb', line 167

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

#section_containersObject



126
127
128
# File 'lib/metanorma/standoc/utils.rb', line 126

def section_containers
  SECTION_CONTAINERS
end

#term_expr(elem) ⇒ Object



93
94
95
# File 'lib/metanorma/standoc/utils.rb', line 93

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

#to_xml(node) ⇒ Object



70
71
72
73
# File 'lib/metanorma/standoc/utils.rb', line 70

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)


171
172
173
174
# File 'lib/metanorma/standoc/utils.rb', line 171

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



66
67
68
# File 'lib/metanorma/standoc/utils.rb', line 66

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

#xml_encode(text) ⇒ Object



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

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