metanorma-standoc 1.4.4 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/macos.yml +4 -9
- data/.github/workflows/ubuntu.yml +1 -5
- data/.github/workflows/windows.yml +2 -12
- data/.rubocop.yml +1 -1
- data/lib/asciidoctor/standoc/base.rb +11 -5
- data/lib/asciidoctor/standoc/base_structured_text_preprocessor.rb +123 -0
- data/lib/asciidoctor/standoc/basicdoc.rng +23 -0
- data/lib/asciidoctor/standoc/cleanup.rb +32 -12
- data/lib/asciidoctor/standoc/cleanup_amend.rb +54 -0
- data/lib/asciidoctor/standoc/cleanup_block.rb +0 -2
- data/lib/asciidoctor/standoc/cleanup_boilerplate.rb +11 -24
- data/lib/asciidoctor/standoc/cleanup_footnotes.rb +0 -3
- data/lib/asciidoctor/standoc/cleanup_inline.rb +62 -1
- data/lib/asciidoctor/standoc/cleanup_ref.rb +10 -7
- data/lib/asciidoctor/standoc/cleanup_section.rb +91 -8
- data/lib/asciidoctor/standoc/cleanup_terms.rb +12 -2
- data/lib/asciidoctor/standoc/converter.rb +3 -3
- data/lib/asciidoctor/standoc/front.rb +0 -12
- data/lib/asciidoctor/standoc/front_contributor.rb +51 -10
- data/lib/asciidoctor/standoc/inline.rb +21 -31
- data/lib/asciidoctor/standoc/isodoc.rng +137 -21
- data/lib/asciidoctor/standoc/json2_text_preprocessor.rb +44 -0
- data/lib/asciidoctor/standoc/log.rb +10 -1
- data/lib/asciidoctor/standoc/macros.rb +45 -33
- data/lib/asciidoctor/standoc/ref.rb +45 -45
- data/lib/asciidoctor/standoc/section.rb +39 -30
- data/lib/asciidoctor/standoc/table.rb +3 -2
- data/lib/asciidoctor/standoc/utils.rb +18 -1
- data/lib/asciidoctor/standoc/validate.rb +30 -18
- data/lib/asciidoctor/standoc/validate_section.rb +1 -1
- data/lib/asciidoctor/standoc/views/datamodel/model_representation.adoc.erb +10 -10
- data/lib/asciidoctor/standoc/yaml2_text_preprocessor.rb +46 -0
- data/lib/liquid/custom_blocks/key_iterator.rb +21 -0
- data/lib/liquid/custom_filters/values.rb +7 -0
- data/lib/metanorma/standoc.rb +0 -5
- data/lib/metanorma/standoc/version.rb +20 -1
- data/metanorma-standoc.gemspec +4 -5
- data/spec/asciidoctor-standoc/base_spec.rb +140 -7
- data/spec/asciidoctor-standoc/blocks_spec.rb +275 -149
- data/spec/asciidoctor-standoc/cleanup_spec.rb +1372 -56
- data/spec/asciidoctor-standoc/inline_spec.rb +133 -6
- data/spec/asciidoctor-standoc/isobib_cache_spec.rb +9 -7
- data/spec/asciidoctor-standoc/macros_json2text_spec.rb +10 -0
- data/spec/asciidoctor-standoc/macros_spec.rb +43 -23
- data/spec/asciidoctor-standoc/macros_yaml2text_spec.rb +5 -560
- data/spec/asciidoctor-standoc/refs_dl_spec.rb +9 -7
- data/spec/asciidoctor-standoc/refs_spec.rb +43 -34
- data/spec/asciidoctor-standoc/section_spec.rb +42 -39
- data/spec/asciidoctor-standoc/table_spec.rb +119 -113
- data/spec/asciidoctor-standoc/validate_spec.rb +45 -1
- data/spec/assets/i18n.yaml +17 -2
- data/spec/examples/codes_table.html +1365 -1365
- data/spec/fixtures/macros_datamodel/address_class_profile.xml +46 -46
- data/spec/fixtures/macros_datamodel/address_component_profile.xml +21 -21
- data/spec/fixtures/macros_datamodel/blank_definition_profile.xml +21 -21
- data/spec/metanorma/processor_spec.rb +1 -2
- data/spec/spec_helper.rb +110 -109
- data/spec/support/shared_examples/structured_data_2_text_preprocessor.rb +629 -0
- data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +71 -71
- data/spec/vcr_cassettes/isobib_get_123.yml +16 -16
- data/spec/vcr_cassettes/isobib_get_123_1.yml +36 -36
- data/spec/vcr_cassettes/isobib_get_123_2001.yml +16 -16
- data/spec/vcr_cassettes/isobib_get_124.yml +17 -17
- data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +8 -8
- data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +39 -37
- metadata +29 -14
- data/lib/asciidoctor-yaml/i18n-en.yaml +0 -20
- data/lib/asciidoctor-yaml/i18n-fr.yaml +0 -13
- data/lib/asciidoctor-yaml/i18n-zh-Hans.yaml +0 -15
- data/lib/asciidoctor/standoc/i18n.rb +0 -39
- data/lib/asciidoctor/standoc/macros_yaml2text.rb +0 -165
- data/lib/metanorma/standoc/latexml_requirement.rb +0 -62
- data/lib/metanorma/standoc/requirement.rb +0 -13
@@ -3,7 +3,8 @@ require "htmlentities"
|
|
3
3
|
require "unicode2latex"
|
4
4
|
require "mime/types"
|
5
5
|
require "base64"
|
6
|
-
require
|
6
|
+
require "English"
|
7
|
+
require "latexmath"
|
7
8
|
|
8
9
|
module Asciidoctor
|
9
10
|
module Standoc
|
@@ -32,18 +33,28 @@ module Asciidoctor
|
|
32
33
|
end
|
33
34
|
|
34
35
|
def inline_anchor_xref(node)
|
35
|
-
m = /^(?<case>capital%|lowercase%)?(?<fn>fn(:\s*(?<text>.*))?)?$/.match node.text
|
36
|
-
casing = m.nil? ? nil : m[:case]&.sub(/%$/, "")
|
37
|
-
f = (m.nil? || m[:fn].nil?) ? "inline" : "footnote"
|
38
|
-
c = (!m.nil? && (!m[:fn].nil? || !m[:case].nil?)) ? m[:text] : node.text
|
39
|
-
t = node.target.gsub(/^#/, "").gsub(%r{(\.xml|\.adoc)(#.*$)}, "\\2")
|
40
36
|
noko do |xml|
|
41
|
-
|
37
|
+
attrs = inline_anchor_xref_attrs(node)
|
38
|
+
c = attrs[:text]
|
39
|
+
attrs.delete(:text) unless c.nil?
|
40
|
+
xml.xref **attr_code(attrs) do |x|
|
42
41
|
x << c
|
43
42
|
end
|
44
43
|
end.join
|
45
44
|
end
|
46
45
|
|
46
|
+
def inline_anchor_xref_attrs(node)
|
47
|
+
m = /^(?<drop>droploc%)?(?<case>capital%|lowercase%)?(?<drop2>droploc%)?
|
48
|
+
(?<fn>fn(:\s*(?<text>.*))?)?$/x.match node.text
|
49
|
+
casing = m.nil? ? nil : m[:case]&.sub(/%$/, "")
|
50
|
+
droploc = m.nil? ? nil : ((m[:drop].nil? && m[:drop2].nil?) ? nil: true)
|
51
|
+
f = (m.nil? || m[:fn].nil?) ? "inline" : "footnote"
|
52
|
+
c = (!m.nil? && (%i[case fn drop drop2].any? { |x| !m[x].nil? })) ?
|
53
|
+
m[:text] : node.text
|
54
|
+
t = node.target.gsub(/^#/, "").gsub(%r{(\.xml|\.adoc)(#.*$)}, "\\2")
|
55
|
+
{ target: t, type: f, case: casing, droploc: droploc, text: c }
|
56
|
+
end
|
57
|
+
|
47
58
|
def inline_anchor_link(node)
|
48
59
|
contents = node.text
|
49
60
|
contents = "" if node.target.gsub(%r{^mailto:}, "") == node.text
|
@@ -105,33 +116,12 @@ module Asciidoctor
|
|
105
116
|
HTMLEntities.new.encode(text, :basic, :hexadecimal).
|
106
117
|
gsub(/&gt;/, ">").gsub(/\&lt;/, "<").gsub(/&amp;/, "&").
|
107
118
|
gsub(/>/, ">").gsub(/</, "<").gsub(/&/, "&").
|
108
|
-
gsub(/"/, '"').gsub(/
/, "\n")
|
109
|
-
end
|
110
|
-
|
111
|
-
def latex_run1(lxm_input, cmd)
|
112
|
-
IO.popen(cmd, "r+", external_encoding: "UTF-8") do |io|
|
113
|
-
io.write(lxm_input)
|
114
|
-
io.close_write
|
115
|
-
io.read
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
def latex_run(lxm_input)
|
120
|
-
results = nil
|
121
|
-
Metanorma::Standoc::Requirements[:latexml].cmd.each_with_index do |cmd, i|
|
122
|
-
warn "Retrying with #{cmd}" if i > 0
|
123
|
-
results = latex_run1(lxm_input, cmd)
|
124
|
-
if $CHILD_STATUS.to_i.zero?
|
125
|
-
warn "Success!" if i > 0
|
126
|
-
break
|
127
|
-
end
|
128
|
-
end
|
129
|
-
$CHILD_STATUS.to_i.zero? ? results : nil
|
119
|
+
gsub(/"/, '"').gsub(/
/, "\n").gsub(/&#/, "&#")
|
130
120
|
end
|
131
121
|
|
132
122
|
def latex_parse(text)
|
133
123
|
lxm_input = Unicode2LaTeX.unicode2latex(HTMLEntities.new.decode(text))
|
134
|
-
results =
|
124
|
+
results = Latexmath.parse(lxm_input).to_mathml
|
135
125
|
results.nil? and
|
136
126
|
@log.add('Math', nil,
|
137
127
|
"latexmlmath failed to process equation:\n#{lxm_input}")
|
@@ -151,7 +141,7 @@ module Asciidoctor
|
|
151
141
|
s.parent.children = math
|
152
142
|
end
|
153
143
|
else
|
154
|
-
xml.stem text, **{ type: "AsciiMath" }
|
144
|
+
xml.stem text&.gsub(/\&#/, "&#"), **{ type: "AsciiMath" }
|
155
145
|
end
|
156
146
|
end
|
157
147
|
|
@@ -42,8 +42,11 @@
|
|
42
42
|
</define>
|
43
43
|
<define name="xref">
|
44
44
|
<element name="xref">
|
45
|
+
<!-- attribute target { xsd:IDREF }, -->
|
45
46
|
<attribute name="target">
|
46
|
-
<data type="
|
47
|
+
<data type="string">
|
48
|
+
<param name="pattern">\i\c*|\c+#\c+</param>
|
49
|
+
</data>
|
47
50
|
</attribute>
|
48
51
|
<optional>
|
49
52
|
<attribute name="type">
|
@@ -61,6 +64,11 @@
|
|
61
64
|
</choice>
|
62
65
|
</attribute>
|
63
66
|
</optional>
|
67
|
+
<optional>
|
68
|
+
<attribute name="droploc">
|
69
|
+
<data type="boolean"/>
|
70
|
+
</attribute>
|
71
|
+
</optional>
|
64
72
|
<text/>
|
65
73
|
</element>
|
66
74
|
</define>
|
@@ -578,6 +586,8 @@
|
|
578
586
|
<ref name="ol"/>
|
579
587
|
<ref name="dl"/>
|
580
588
|
<ref name="formula"/>
|
589
|
+
<ref name="quote"/>
|
590
|
+
<ref name="sourcecode"/>
|
581
591
|
</choice>
|
582
592
|
</oneOrMore>
|
583
593
|
</element>
|
@@ -661,6 +671,16 @@
|
|
661
671
|
</choice>
|
662
672
|
</attribute>
|
663
673
|
</optional>
|
674
|
+
<optional>
|
675
|
+
<attribute name="valign">
|
676
|
+
<choice>
|
677
|
+
<value>top</value>
|
678
|
+
<value>middle</value>
|
679
|
+
<value>bottom</value>
|
680
|
+
<value>baseline</value>
|
681
|
+
</choice>
|
682
|
+
</attribute>
|
683
|
+
</optional>
|
664
684
|
<choice>
|
665
685
|
<zeroOrMore>
|
666
686
|
<choice>
|
@@ -697,6 +717,16 @@
|
|
697
717
|
</choice>
|
698
718
|
</attribute>
|
699
719
|
</optional>
|
720
|
+
<optional>
|
721
|
+
<attribute name="valign">
|
722
|
+
<choice>
|
723
|
+
<value>top</value>
|
724
|
+
<value>middle</value>
|
725
|
+
<value>bottom</value>
|
726
|
+
<value>baseline</value>
|
727
|
+
</choice>
|
728
|
+
</attribute>
|
729
|
+
</optional>
|
700
730
|
<choice>
|
701
731
|
<zeroOrMore>
|
702
732
|
<choice>
|
@@ -834,6 +864,13 @@
|
|
834
864
|
</define>
|
835
865
|
<define name="standard-document">
|
836
866
|
<element name="standard-document">
|
867
|
+
<attribute name="version"/>
|
868
|
+
<attribute name="type">
|
869
|
+
<choice>
|
870
|
+
<value>semantic</value>
|
871
|
+
<value>presentation</value>
|
872
|
+
</choice>
|
873
|
+
</attribute>
|
837
874
|
<ref name="bibdata"/>
|
838
875
|
<optional>
|
839
876
|
<ref name="boilerplate"/>
|
@@ -855,7 +892,7 @@
|
|
855
892
|
<oneOrMore>
|
856
893
|
<choice>
|
857
894
|
<ref name="content"/>
|
858
|
-
<ref name="
|
895
|
+
<ref name="abstract"/>
|
859
896
|
<ref name="foreword"/>
|
860
897
|
<ref name="introduction"/>
|
861
898
|
<ref name="acknowledgements"/>
|
@@ -922,6 +959,9 @@
|
|
922
959
|
<optional>
|
923
960
|
<attribute name="script"/>
|
924
961
|
</optional>
|
962
|
+
<optional>
|
963
|
+
<attribute name="type"/>
|
964
|
+
</optional>
|
925
965
|
<optional>
|
926
966
|
<attribute name="obligation">
|
927
967
|
<choice>
|
@@ -961,9 +1001,6 @@
|
|
961
1001
|
</define>
|
962
1002
|
<define name="content-subsection">
|
963
1003
|
<element name="clause">
|
964
|
-
<optional>
|
965
|
-
<attribute name="type"/>
|
966
|
-
</optional>
|
967
1004
|
<ref name="Content-Section"/>
|
968
1005
|
</element>
|
969
1006
|
</define>
|
@@ -992,6 +1029,9 @@
|
|
992
1029
|
</choice>
|
993
1030
|
</attribute>
|
994
1031
|
</optional>
|
1032
|
+
<optional>
|
1033
|
+
<attribute name="type"/>
|
1034
|
+
</optional>
|
995
1035
|
<optional>
|
996
1036
|
<ref name="section-title"/>
|
997
1037
|
</optional>
|
@@ -1011,9 +1051,6 @@
|
|
1011
1051
|
</define>
|
1012
1052
|
<define name="clause">
|
1013
1053
|
<element name="clause">
|
1014
|
-
<optional>
|
1015
|
-
<attribute name="type"/>
|
1016
|
-
</optional>
|
1017
1054
|
<ref name="Clause-Section"/>
|
1018
1055
|
</element>
|
1019
1056
|
</define>
|
@@ -1042,18 +1079,24 @@
|
|
1042
1079
|
</choice>
|
1043
1080
|
</attribute>
|
1044
1081
|
</optional>
|
1082
|
+
<optional>
|
1083
|
+
<attribute name="type"/>
|
1084
|
+
</optional>
|
1045
1085
|
<optional>
|
1046
1086
|
<ref name="section-title"/>
|
1047
1087
|
</optional>
|
1048
1088
|
<group>
|
1049
|
-
<
|
1050
|
-
<
|
1051
|
-
<
|
1052
|
-
|
1053
|
-
|
1054
|
-
<
|
1055
|
-
|
1056
|
-
|
1089
|
+
<choice>
|
1090
|
+
<group>
|
1091
|
+
<zeroOrMore>
|
1092
|
+
<ref name="BasicBlock"/>
|
1093
|
+
</zeroOrMore>
|
1094
|
+
<zeroOrMore>
|
1095
|
+
<ref name="note"/>
|
1096
|
+
</zeroOrMore>
|
1097
|
+
</group>
|
1098
|
+
<ref name="amend"/>
|
1099
|
+
</choice>
|
1057
1100
|
<zeroOrMore>
|
1058
1101
|
<choice>
|
1059
1102
|
<ref name="clause-subsection"/>
|
@@ -1180,6 +1223,9 @@
|
|
1180
1223
|
<optional>
|
1181
1224
|
<attribute name="script"/>
|
1182
1225
|
</optional>
|
1226
|
+
<optional>
|
1227
|
+
<attribute name="type"/>
|
1228
|
+
</optional>
|
1183
1229
|
<optional>
|
1184
1230
|
<attribute name="obligation">
|
1185
1231
|
<choice>
|
@@ -1447,11 +1493,6 @@
|
|
1447
1493
|
</optional>
|
1448
1494
|
</element>
|
1449
1495
|
</define>
|
1450
|
-
<define name="preface_abstract">
|
1451
|
-
<element name="abstract">
|
1452
|
-
<ref name="Basic-Section"/>
|
1453
|
-
</element>
|
1454
|
-
</define>
|
1455
1496
|
<define name="term-clause">
|
1456
1497
|
<element name="clause">
|
1457
1498
|
<optional>
|
@@ -1501,4 +1542,79 @@
|
|
1501
1542
|
<ref name="CitationType"/>
|
1502
1543
|
</element>
|
1503
1544
|
</define>
|
1545
|
+
<define name="amend">
|
1546
|
+
<element name="amend">
|
1547
|
+
<optional>
|
1548
|
+
<attribute name="id">
|
1549
|
+
<data type="ID"/>
|
1550
|
+
</attribute>
|
1551
|
+
</optional>
|
1552
|
+
<attribute name="change">
|
1553
|
+
<choice>
|
1554
|
+
<value>add</value>
|
1555
|
+
<value>modify</value>
|
1556
|
+
<value>delete</value>
|
1557
|
+
</choice>
|
1558
|
+
</attribute>
|
1559
|
+
<optional>
|
1560
|
+
<attribute name="path"/>
|
1561
|
+
</optional>
|
1562
|
+
<optional>
|
1563
|
+
<attribute name="path_end"/>
|
1564
|
+
</optional>
|
1565
|
+
<optional>
|
1566
|
+
<attribute name="title"/>
|
1567
|
+
</optional>
|
1568
|
+
<optional>
|
1569
|
+
<element name="location">
|
1570
|
+
<zeroOrMore>
|
1571
|
+
<ref name="locality"/>
|
1572
|
+
</zeroOrMore>
|
1573
|
+
</element>
|
1574
|
+
</optional>
|
1575
|
+
<zeroOrMore>
|
1576
|
+
<ref name="autonumber"/>
|
1577
|
+
</zeroOrMore>
|
1578
|
+
<optional>
|
1579
|
+
<element name="description">
|
1580
|
+
<zeroOrMore>
|
1581
|
+
<ref name="BasicBlock"/>
|
1582
|
+
</zeroOrMore>
|
1583
|
+
</element>
|
1584
|
+
</optional>
|
1585
|
+
<optional>
|
1586
|
+
<element name="newcontent">
|
1587
|
+
<zeroOrMore>
|
1588
|
+
<ref name="BasicBlock"/>
|
1589
|
+
</zeroOrMore>
|
1590
|
+
</element>
|
1591
|
+
</optional>
|
1592
|
+
<optional>
|
1593
|
+
<element name="description">
|
1594
|
+
<zeroOrMore>
|
1595
|
+
<ref name="BasicBlock"/>
|
1596
|
+
</zeroOrMore>
|
1597
|
+
</element>
|
1598
|
+
</optional>
|
1599
|
+
</element>
|
1600
|
+
</define>
|
1601
|
+
<define name="autonumber">
|
1602
|
+
<element name="autonumber">
|
1603
|
+
<attribute name="type">
|
1604
|
+
<choice>
|
1605
|
+
<value>requirement</value>
|
1606
|
+
<value>recommendation</value>
|
1607
|
+
<value>permission</value>
|
1608
|
+
<value>table</value>
|
1609
|
+
<value>figure</value>
|
1610
|
+
<value>admonition</value>
|
1611
|
+
<value>formula</value>
|
1612
|
+
<value>sourcecode</value>
|
1613
|
+
<value>example</value>
|
1614
|
+
<value>note</value>
|
1615
|
+
</choice>
|
1616
|
+
</attribute>
|
1617
|
+
<text/>
|
1618
|
+
</element>
|
1619
|
+
</define>
|
1504
1620
|
</grammar>
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "asciidoctor/standoc/base_structured_text_preprocessor"
|
4
|
+
|
5
|
+
module Asciidoctor
|
6
|
+
module Standoc
|
7
|
+
class Json2TextPreprocessor < BaseStructuredTextPreprocessor
|
8
|
+
# search document for block `yaml2text`
|
9
|
+
# after that take template from block and read file into this template
|
10
|
+
# example:
|
11
|
+
# [yaml2text,foobar.yaml]
|
12
|
+
# ----
|
13
|
+
# === {item.name}
|
14
|
+
# {item.desc}
|
15
|
+
#
|
16
|
+
# {item.symbol}:: {item.symbol_def}
|
17
|
+
# ----
|
18
|
+
#
|
19
|
+
# with content of `foobar.yaml` file equal to:
|
20
|
+
# - name: spaghetti
|
21
|
+
# desc: wheat noodles of 9mm diameter
|
22
|
+
# symbol: SPAG
|
23
|
+
# symbol_def: the situation is message like spaghetti at a kid's
|
24
|
+
#
|
25
|
+
# will produce:
|
26
|
+
# === spaghetti
|
27
|
+
# wheat noodles of 9mm diameter
|
28
|
+
#
|
29
|
+
# SPAG:: the situation is message like spaghetti at a kid's meal
|
30
|
+
|
31
|
+
def initialize(config = {})
|
32
|
+
super
|
33
|
+
@config[:block_name] = "json2text"
|
34
|
+
end
|
35
|
+
|
36
|
+
protected
|
37
|
+
|
38
|
+
def content_from_file(document, file_path)
|
39
|
+
JSON.parse(File.read(relative_file_path(document, file_path),
|
40
|
+
encoding: "UTF-8"))
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -8,7 +8,8 @@ module Asciidoctor
|
|
8
8
|
def add(category, loc, msg)
|
9
9
|
return if @novalid
|
10
10
|
@log[category] = [] unless @log[category]
|
11
|
-
@log[category] << { location: current_location(loc), message: msg
|
11
|
+
@log[category] << { location: current_location(loc), message: msg,
|
12
|
+
context: context(loc) }
|
12
13
|
loc = loc.nil? ? "" : "(#{current_location(loc)}): "
|
13
14
|
warn "#{category}: #{loc}#{msg}"
|
14
15
|
end
|
@@ -31,6 +32,13 @@ module Asciidoctor
|
|
31
32
|
"??"
|
32
33
|
end
|
33
34
|
|
35
|
+
def context(n)
|
36
|
+
return nil if n.is_a? String
|
37
|
+
n.respond_to?(:to_xml) and return n.to_xml
|
38
|
+
n.respond_to?(:to_s) and return n.to_s
|
39
|
+
nil
|
40
|
+
end
|
41
|
+
|
34
42
|
def write(file)
|
35
43
|
File.open(file, "w:UTF-8") do |f|
|
36
44
|
f.puts "#{file} errors"
|
@@ -41,6 +49,7 @@ module Asciidoctor
|
|
41
49
|
end.each do |n|
|
42
50
|
loc = n[:location] ? "(#{n[:location]}): " : ""
|
43
51
|
f.puts "#{loc}#{n[:message]}"
|
52
|
+
n[:context]&.split(/\n/)&.first(5)&.each { |l| f.puts "\t#{l}" }
|
44
53
|
end
|
45
54
|
end
|
46
55
|
end
|
@@ -1,11 +1,12 @@
|
|
1
1
|
require "asciidoctor/extensions"
|
2
2
|
require "fileutils"
|
3
3
|
require "uuidtools"
|
4
|
-
require
|
5
|
-
require_relative
|
6
|
-
require_relative
|
7
|
-
require_relative
|
8
|
-
require_relative
|
4
|
+
require "yaml"
|
5
|
+
require_relative "./macros_plantuml.rb"
|
6
|
+
require_relative "./datamodel/attributes_table_preprocessor.rb"
|
7
|
+
require_relative "./datamodel/diagram_preprocessor.rb"
|
8
|
+
require_relative "./yaml2_text_preprocessor.rb"
|
9
|
+
require_relative "./json2_text_preprocessor.rb"
|
9
10
|
|
10
11
|
module Asciidoctor
|
11
12
|
module Standoc
|
@@ -61,17 +62,17 @@ module Asciidoctor
|
|
61
62
|
use_dsl
|
62
63
|
named :concept
|
63
64
|
name_positional_attributes "id", "word", "term"
|
64
|
-
#match %r{concept:(?<target>[^\[]*)\[(?<content>|.*?[^\\])\]$}
|
65
|
+
# match %r{concept:(?<target>[^\[]*)\[(?<content>|.*?[^\\])\]$}
|
65
66
|
match /\{\{(?<content>|.*?[^\\])\}\}/
|
66
67
|
using_format :short
|
67
68
|
|
68
69
|
# deal with locality attrs and their disruption of positional attrs
|
69
70
|
def preprocess_attrs(attrs)
|
70
|
-
attrs.delete("term") if attrs["term"]
|
71
|
+
attrs.delete("term") if attrs["term"] && !attrs["word"]
|
71
72
|
attrs.delete(3) if attrs[3] == attrs["term"]
|
72
|
-
a = attrs.keys.reject { |k| k.is_a?
|
73
|
-
attrs["word"] ||= attrs[a[0]] if a.
|
74
|
-
attrs["term"] ||= attrs[a[1]] if a.length
|
73
|
+
a = attrs.keys.reject { |k| k.is_a?(String) || [1, 2].include?(k) }
|
74
|
+
attrs["word"] ||= attrs[a[0]] if !a.empty?
|
75
|
+
attrs["term"] ||= attrs[a[1]] if a.length > 1
|
75
76
|
attrs
|
76
77
|
end
|
77
78
|
|
@@ -94,30 +95,30 @@ module Asciidoctor
|
|
94
95
|
|
95
96
|
def init_indent(s)
|
96
97
|
/^(?<prefix>[ \t]*)(?<suffix>.*)$/ =~ s
|
97
|
-
prefix = prefix.gsub(/\t/, "\u00a0\u00a0\u00a0\u00a0")
|
98
|
-
gsub(/ /, "\u00a0")
|
98
|
+
prefix = prefix.gsub(/\t/, "\u00a0\u00a0\u00a0\u00a0")
|
99
|
+
.gsub(/ /, "\u00a0")
|
99
100
|
prefix + suffix
|
100
101
|
end
|
101
102
|
|
102
103
|
def supply_br(lines)
|
103
104
|
ignore = false
|
104
105
|
lines.each_with_index do |l, i|
|
105
|
-
/^(--+|====+|\|===|\.\.\.\.+|\*\*\*\*+|\+\+\+\++|\`\`\`\`+|____\+)$/.match(l)
|
106
|
-
ignore = !ignore
|
106
|
+
/^(--+|====+|\|===|\.\.\.\.+|\*\*\*\*+|\+\+\+\++|\`\`\`\`+|____\+)$/.match(l) &&
|
107
|
+
(ignore = !ignore)
|
107
108
|
next if l.empty? || l.match(/ \+$/)
|
108
109
|
next if /^\[.*\]$/.match(l)
|
109
110
|
next if ignore
|
110
|
-
next if i == lines.size - 1 || i < lines.size - 1 && lines[i+1].empty?
|
111
|
+
next if i == lines.size - 1 || i < lines.size - 1 && lines[i + 1].empty?
|
111
112
|
lines[i] += " +"
|
112
113
|
end
|
113
114
|
lines
|
114
115
|
end
|
115
116
|
|
116
|
-
def process
|
117
|
-
attrs[
|
117
|
+
def process(parent, reader, attrs)
|
118
|
+
attrs["role"] = "pseudocode"
|
118
119
|
lines = reader.lines.map { |m| init_indent(m) }
|
119
120
|
ret = create_block(parent, :example, supply_br(lines),
|
120
|
-
|
121
|
+
attrs, content_model: :compound)
|
121
122
|
ret
|
122
123
|
end
|
123
124
|
end
|
@@ -128,19 +129,19 @@ module Asciidoctor
|
|
128
129
|
parse_content_as :text
|
129
130
|
option :pos_attrs, %w(rpbegin rt rpend)
|
130
131
|
|
131
|
-
def process(
|
132
|
-
rpbegin =
|
133
|
-
rpend =
|
134
|
-
if attributes.size == 1
|
132
|
+
def process(_parent, target, attributes)
|
133
|
+
rpbegin = "("
|
134
|
+
rpend = ")"
|
135
|
+
if (attributes.size == 1) && attributes.key?("text")
|
135
136
|
rt = attributes["text"]
|
136
|
-
elsif attributes.size == 2
|
137
|
-
|
137
|
+
elsif (attributes.size == 2) && attributes.key?(1) &&
|
138
|
+
attributes.key?("rpbegin")
|
138
139
|
# for example, html5ruby:楽聖少女[がくせいしょうじょ]
|
139
140
|
rt = attributes[1] || ""
|
140
141
|
else
|
141
|
-
rpbegin = attributes[
|
142
|
-
rt = attributes[
|
143
|
-
rpend = attributes[
|
142
|
+
rpbegin = attributes["rpbegin"]
|
143
|
+
rt = attributes["rt"]
|
144
|
+
rpend = attributes["rpend"]
|
144
145
|
end
|
145
146
|
|
146
147
|
"<ruby>#{target}<rp>#{rpbegin}</rp><rt>#{rt}</rt>"\
|
@@ -153,16 +154,16 @@ module Asciidoctor
|
|
153
154
|
named :TODO
|
154
155
|
on_contexts :example, :paragraph
|
155
156
|
|
156
|
-
def process
|
157
|
-
attrs[
|
158
|
-
attrs[
|
157
|
+
def process(parent, reader, attrs)
|
158
|
+
attrs["name"] = "todo"
|
159
|
+
attrs["caption"] = "TODO"
|
159
160
|
create_block parent, :admonition, reader.lines, attrs,
|
160
|
-
|
161
|
+
content_model: :compound
|
161
162
|
end
|
162
163
|
end
|
163
164
|
|
164
165
|
class ToDoInlineAdmonitionBlock < Extensions::Treeprocessor
|
165
|
-
def process
|
166
|
+
def process(document)
|
166
167
|
(document.find_by context: :paragraph).each do |para|
|
167
168
|
next unless /^TODO: /.match para.lines[0]
|
168
169
|
parent = para.parent
|
@@ -170,10 +171,21 @@ module Asciidoctor
|
|
170
171
|
para.set_attr("caption", "TODO")
|
171
172
|
para.lines[0].sub!(/^TODO: /, "")
|
172
173
|
todo = Block.new parent, :admonition, attributes: para.attributes,
|
173
|
-
|
174
|
+
source: para.lines, content_model: :compound
|
174
175
|
parent.blocks[parent.blocks.index(para)] = todo
|
175
176
|
end
|
176
177
|
end
|
177
178
|
end
|
179
|
+
|
180
|
+
class AutonumberInlineMacro < Extensions::InlineMacroProcessor
|
181
|
+
use_dsl
|
182
|
+
named :autonumber
|
183
|
+
parse_content_as :text
|
184
|
+
|
185
|
+
def process(parent, target, attrs)
|
186
|
+
out = Asciidoctor::Inline.new(parent, :quoted, attrs["text"]).convert
|
187
|
+
%{<autonumber type=#{target}>#{out}</autonumber>}
|
188
|
+
end
|
189
|
+
end
|
178
190
|
end
|
179
191
|
end
|