metanorma-standoc 1.9.1 → 1.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +0 -2
  3. data/lib/asciidoctor/standoc/blocks.rb +18 -3
  4. data/lib/asciidoctor/standoc/blocks_notes.rb +29 -18
  5. data/lib/asciidoctor/standoc/cleanup.rb +1 -0
  6. data/lib/asciidoctor/standoc/cleanup_block.rb +30 -12
  7. data/lib/asciidoctor/standoc/cleanup_boilerplate.rb +23 -12
  8. data/lib/asciidoctor/standoc/cleanup_ref.rb +3 -2
  9. data/lib/asciidoctor/standoc/converter.rb +7 -2
  10. data/lib/asciidoctor/standoc/datamodel/plantuml_renderer.rb +67 -66
  11. data/lib/asciidoctor/standoc/isodoc.rng +174 -0
  12. data/lib/asciidoctor/standoc/macros.rb +11 -11
  13. data/lib/asciidoctor/standoc/macros_form.rb +63 -0
  14. data/lib/asciidoctor/standoc/ref_sect.rb +20 -17
  15. data/lib/asciidoctor/standoc/section.rb +3 -1
  16. data/lib/asciidoctor/standoc/terms.rb +24 -17
  17. data/lib/asciidoctor/standoc/utils.rb +3 -3
  18. data/lib/asciidoctor/standoc/validate.rb +18 -16
  19. data/lib/metanorma-standoc.rb +0 -1
  20. data/lib/metanorma/standoc/version.rb +1 -1
  21. data/metanorma-standoc.gemspec +1 -1
  22. data/spec/asciidoctor/blocks_spec.rb +829 -734
  23. data/spec/asciidoctor/cleanup_sections_spec.rb +38 -1
  24. data/spec/asciidoctor/isobib_cache_spec.rb +406 -358
  25. data/spec/asciidoctor/macros_spec.rb +537 -441
  26. data/spec/asciidoctor/macros_yaml2text_spec.rb +1 -1
  27. data/spec/asciidoctor/section_spec.rb +367 -297
  28. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +50 -50
  29. data/spec/vcr_cassettes/isobib_get_123.yml +12 -12
  30. data/spec/vcr_cassettes/isobib_get_123_1.yml +24 -24
  31. data/spec/vcr_cassettes/isobib_get_123_1_fr.yml +33 -33
  32. data/spec/vcr_cassettes/isobib_get_123_2001.yml +12 -12
  33. data/spec/vcr_cassettes/isobib_get_124.yml +12 -12
  34. data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +14 -14
  35. data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +46 -46
  36. metadata +5 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 03a2df03031208cf9cd54413c1dc342f748c3978a2e189f9cf4ae369fcc1820c
4
- data.tar.gz: fc94c4cc2a0e117c06f41d709d8e5d6a6f3f0ba6e1ffc8a6ccdfb60b91ed3ffd
3
+ metadata.gz: b3b789e06df237e881bdd055cfe9b90e191d781e71e82dd6a80c098f23b08934
4
+ data.tar.gz: 27f1499d7f7adccf29c2b9c9ac731e6ff1988a008530a4aa13e63adb4fbef490
5
5
  SHA512:
6
- metadata.gz: 32bac104b6523e30e510ada3e1e25861139b62c66c8d7bbcb782284648622b5f1da48acd8a6e97f511ead0baca45c7903ac7f31c1023596becc473d08deea87f
7
- data.tar.gz: 4c0ee4e816c81ca1e98d5bbbb47ad2c755feca016c0b5ddae5283688291813e0d1d511444835d7bee1979dc49ef3d664a7d1966938b46b3a5ad0f2dd9a0da6d2
6
+ metadata.gz: c72e91aac553b2e9d3151a59fde54b02ae5cb6340aeb0781dd4326d5a6bce3166e20fd2ece37d909c3e8b7f72d6d26892bd279d4256b190cf28dbe41e1bdbf3e
7
+ data.tar.gz: 8314c96a3af15b47d56c42cd040e369455616b40dafb37a3d2ee32d0ba46976293eee36f3b9ab99d3b2d94002df3f3bf0a319e98f262e0d5eb3049fb90c30d4f
data/.rubocop.yml CHANGED
@@ -10,5 +10,3 @@ AllCops:
10
10
  DisplayCopNames: false
11
11
  StyleGuideCopsOnly: false
12
12
  TargetRubyVersion: 2.4
13
- Rails:
14
- Enabled: true
@@ -30,6 +30,7 @@ module Asciidoctor
30
30
  def open(node)
31
31
  role = node.role || node.attr("style")
32
32
  reqt_subpart(role) and return requirement_subpart(node)
33
+ role == "form" and return form(node)
33
34
  result = []
34
35
  node.blocks.each do |b|
35
36
  result << send(b.context, b)
@@ -37,6 +38,17 @@ module Asciidoctor
37
38
  result
38
39
  end
39
40
 
41
+ def form(node)
42
+ noko do |xml|
43
+ xml.form **attr_code(
44
+ id: Metanorma::Utils::anchor_or_uuid,
45
+ name: node.attr("name"), action: node.attr("action")
46
+ ) do |f|
47
+ f << node.content
48
+ end
49
+ end
50
+ end
51
+
40
52
  def literal_attrs(node)
41
53
  attr_code(id_attr(node).merge(keep_attrs(node)))
42
54
  end
@@ -71,11 +83,14 @@ module Asciidoctor
71
83
 
72
84
  def example(node)
73
85
  return term_example(node) if in_terms?
86
+
74
87
  role = node.role || node.attr("style")
75
88
  %w(recommendation requirement permission).include?(role) and
76
89
  return requirement(node, role)
77
90
  return pseudocode_example(node) if role == "pseudocode"
78
91
  return svgmap_example(node) if role == "svgmap"
92
+ return form(node) if role == "form"
93
+
79
94
  example_proper(node)
80
95
  end
81
96
 
@@ -91,9 +106,9 @@ module Asciidoctor
91
106
  noko do |xml|
92
107
  xml.svgmap **attr_code(svgmap_attrs(node).merge(
93
108
  src: node.attr("src"), alt: node.attr("alt"))) do |ex|
94
- figure_title(node, ex)
95
- ex << node.content
96
- end
109
+ figure_title(node, ex)
110
+ ex << node.content
111
+ end
97
112
  end.join("\n")
98
113
  end
99
114
 
@@ -2,33 +2,41 @@ module Asciidoctor
2
2
  module Standoc
3
3
  module Blocks
4
4
  def termnote_attrs(node)
5
- attr_code(id_attr(node).merge(
6
- unnumbered: node.attr("unnumbered"),
7
- number: node.attr("number"),
8
- subsequence: node.attr("subsequence"),
9
- "keep-with-next": node.attr("keep-with-next"),
10
- "keep-lines-together": node.attr("keep-with-next"),
11
- "keep-separate": node.attr("keep-separate")))
5
+ attr_code(
6
+ id_attr(node).merge(
7
+ unnumbered: node.attr("unnumbered"),
8
+ number: node.attr("number"),
9
+ subsequence: node.attr("subsequence"),
10
+ "keep-with-next": node.attr("keep-with-next"),
11
+ "keep-lines-together": node.attr("keep-with-next"),
12
+ "keep-separate": node.attr("keep-separate")
13
+ )
14
+ )
12
15
  end
13
16
 
14
17
  def note_attrs(node)
15
- attr_code(termnote_attrs(node)
16
- .merge(
17
- type: node.attr("type"),
18
- beforeclauses: node.attr("beforeclauses") == "true" ? "true" : nil
19
- ))
18
+ attr_code(
19
+ termnote_attrs(node).merge(
20
+ type: node.attr("type"),
21
+ beforeclauses: node.attr("beforeclauses") == "true" ? "true" : nil
22
+ )
23
+ )
20
24
  end
21
25
 
22
26
  def sidebar_attrs(node)
23
- todo_attrs(node).merge(attr_code(
24
- from: node.attr("from"), to: node.attr("to") || node.attr("from") ))
27
+ todo_attrs(node).merge(
28
+ attr_code(
29
+ from: node.attr("from"),
30
+ to: node.attr("to") || node.attr("from")
31
+ )
32
+ )
25
33
  end
26
34
 
27
35
  def sidebar(node)
28
36
  return unless draft?
29
37
 
30
38
  noko do |xml|
31
- xml.review **(sidebar_attrs(node)) do |r|
39
+ xml.review **sidebar_attrs(node) do |r|
32
40
  wrap_in_para(node, r)
33
41
  end
34
42
  end
@@ -73,9 +81,12 @@ module Asciidoctor
73
81
  a = node.attr("type") and ["danger", "safety precautions"].each do |t|
74
82
  name = t if a.casecmp(t).zero?
75
83
  end
76
- attr_code(keep_attrs(node)
77
- .merge(id: Metanorma::Utils::anchor_or_uuid(node), type: name,
78
- beforeclauses: node.attr("beforeclauses") == "true" ? "true" : nil))
84
+ attr_code(
85
+ keep_attrs(node).merge(
86
+ id: Metanorma::Utils::anchor_or_uuid(node), type: name,
87
+ beforeclauses: node.attr("beforeclauses") == "true" ? "true" : nil
88
+ )
89
+ )
79
90
  end
80
91
 
81
92
  def admonition(node)
@@ -33,6 +33,7 @@ module Asciidoctor
33
33
  obligations_cleanup(xmldoc)
34
34
  table_cleanup(xmldoc)
35
35
  formula_cleanup(xmldoc)
36
+ form_cleanup(xmldoc)
36
37
  sourcecode_cleanup(xmldoc)
37
38
  figure_cleanup(xmldoc)
38
39
  element_name_cleanup(xmldoc)
@@ -37,15 +37,15 @@ module Asciidoctor
37
37
  end
38
38
  end
39
39
 
40
- def insert_thead(s)
41
- thead = s.at("./thead")
40
+ def insert_thead(table)
41
+ thead = table.at("./thead")
42
42
  return thead unless thead.nil?
43
43
 
44
- if tname = s.at("./name")
44
+ if tname = table.at("./name")
45
45
  thead = tname.add_next_sibling("<thead/>").first
46
46
  return thead
47
47
  end
48
- s.children.first.add_previous_sibling("<thead/>").first
48
+ table.children.first.add_previous_sibling("<thead/>").first
49
49
  end
50
50
 
51
51
  def header_rows_cleanup(xmldoc)
@@ -144,7 +144,7 @@ module Asciidoctor
144
144
  ELEMS_ALLOW_NOTES = %w[p formula ul ol dl figure].freeze
145
145
 
146
146
  # if a note is at the end of a section, it is left alone
147
- # if a note is followed by a non-note block,
147
+ # if a note is followed by a non-note block,
148
148
  # it is moved inside its preceding block if it is not delimited
149
149
  # (so there was no way of making that block include the note)
150
150
  def note_cleanup(xmldoc)
@@ -164,7 +164,7 @@ module Asciidoctor
164
164
 
165
165
  def link_callouts_to_annotations(callouts, annotations)
166
166
  callouts.each_with_index do |c, i|
167
- c["target"] = "_" + UUIDTools::UUID.random_create
167
+ c["target"] = "_#{UUIDTools::UUID.random_create}"
168
168
  annotations[i]["id"] = c["target"]
169
169
  end
170
170
  end
@@ -195,25 +195,43 @@ module Asciidoctor
195
195
  xmldoc.xpath("//sourcecode").each do |x|
196
196
  x.traverse do |n|
197
197
  next unless n.text?
198
- next unless /#{Regexp.escape(@sourcecode_markup_start)}/.match?(n.text)
198
+ next unless /#{Regexp.escape(@sourcecode_markup_start)}/
199
+ .match?(n.text)
199
200
 
200
201
  n.replace(sourcecode_markup(n))
201
202
  end
202
203
  end
203
204
  end
204
205
 
205
- def sourcecode_markup(n)
206
+ def safe_noko(text, doc)
207
+ Nokogiri::XML::Text.new(text, doc).to_xml(
208
+ encoding: "US-ASCII",
209
+ save_with: Nokogiri::XML::Node::SaveOptions::NO_DECLARATION
210
+ )
211
+ end
212
+
213
+ def sourcecode_markup(node)
206
214
  acc = []
207
- n.text.split(/(#{Regexp.escape(@sourcecode_markup_start)}|#{Regexp.escape(@sourcecode_markup_end)})/)
215
+ node.text.split(/(#{Regexp.escape(@sourcecode_markup_start)}|
216
+ #{Regexp.escape(@sourcecode_markup_end)})/x)
208
217
  .each_slice(4).map do |a|
209
- acc << Nokogiri::XML::Text.new(a[0], n.document)
210
- .to_xml(encoding: "US-ASCII", save_with: Nokogiri::XML::Node::SaveOptions::NO_DECLARATION)
218
+ acc << safe_noko(a[0], node.document)
211
219
  next unless a.size == 4
212
220
 
213
- acc << Asciidoctor.convert(a[2], backend: (self&.backend&.to_sym || :standoc), doctype: :inline)
221
+ acc << Asciidoctor.convert(
222
+ a[2], doctype: :inline, backend: (self&.backend&.to_sym || :standoc)
223
+ )
214
224
  end
215
225
  acc.join
216
226
  end
227
+
228
+ def form_cleanup(xmldoc)
229
+ xmldoc.xpath("//select").each do |s|
230
+ while s&.next_element&.name == "option"
231
+ s << s.next_element
232
+ end
233
+ end
234
+ end
217
235
  end
218
236
  end
219
237
  end
@@ -39,11 +39,15 @@ module Asciidoctor
39
39
  end
40
40
 
41
41
  def norm_ref_preface(ref)
42
- refs = ref.elements.select do |e|
43
- %w(references bibitem).include? e.name
42
+ if ref.at("./note[@type = 'boilerplate']")
43
+ unwrap_boilerplate_clauses(ref, ".")
44
+ else
45
+ refs = ref.elements.select do |e|
46
+ %w(references bibitem).include? e.name
47
+ end
48
+ pref = refs.empty? ? @i18n.norm_empty_pref : @i18n.norm_with_refs_pref
49
+ ref.at("./title").next = "<p>#{pref}</p>"
44
50
  end
45
- pref = refs.empty? ? @i18n.norm_empty_pref : @i18n.norm_with_refs_pref
46
- ref.at("./title").next = "<p>#{pref}</p>"
47
51
  end
48
52
 
49
53
  TERM_CLAUSE = "//sections/terms | "\
@@ -69,25 +73,32 @@ module Asciidoctor
69
73
  xmldoc.xpath("//terms/p | //terms/ul").each(&:remove)
70
74
  end
71
75
 
72
- def termdef_unwrap_boilerplate_clauses(xmldoc)
73
- xmldoc.xpath(self.class::TERM_CLAUSE).each do |f|
74
- f.xpath(".//clause[@type = 'boilerplate']").each do |c|
76
+ def unwrap_boilerplate_clauses(xmldoc, xpath)
77
+ xmldoc.xpath(xpath).each do |f|
78
+ f.xpath(".//clause[@type = 'boilerplate'] | "\
79
+ ".//note[@type = 'boilerplate']").each do |c|
75
80
  c&.at("./title")&.remove
76
81
  c.replace(c.children)
77
82
  end
78
83
  end
79
84
  end
80
85
 
81
- def boilerplate_cleanup(xmldoc)
82
- isodoc = boilerplate_isodoc(xmldoc)
83
- termdef_boilerplate_cleanup(xmldoc)
86
+ def termdef_boilerplate_insert(xmldoc, isodoc, once = false)
84
87
  xmldoc.xpath(self.class::TERM_CLAUSE).each do |f|
85
88
  next if f.at("./clause[@type = 'boilerplate']")
86
89
 
87
- term_defs_boilerplate(f.at("./title"), xmldoc.xpath(".//termdocsource"),
90
+ term_defs_boilerplate(f.at("./title"),
91
+ xmldoc.xpath(".//termdocsource"),
88
92
  f.at(".//term"), f.at(".//p"), isodoc)
93
+ break if once
89
94
  end
90
- termdef_unwrap_boilerplate_clauses(xmldoc)
95
+ end
96
+
97
+ def boilerplate_cleanup(xmldoc)
98
+ isodoc = boilerplate_isodoc(xmldoc)
99
+ termdef_boilerplate_cleanup(xmldoc)
100
+ termdef_boilerplate_insert(xmldoc, isodoc)
101
+ unwrap_boilerplate_clauses(xmldoc, self.class::TERM_CLAUSE)
91
102
  f = xmldoc.at(self.class::NORM_REF) and norm_ref_preface(f)
92
103
  initial_boilerplate(xmldoc, isodoc)
93
104
  end
@@ -74,8 +74,9 @@ module Asciidoctor
74
74
 
75
75
  def normref_cleanup(xmldoc)
76
76
  r = xmldoc.at(self.class::NORM_REF) || return
77
- preface = r.xpath("./title/following-sibling::*") & # intersection
78
- r.xpath("./bibitem[1]/preceding-sibling::*")
77
+ preface = ((r.xpath("./title/following-sibling::*") & # intersection
78
+ r.xpath("./bibitem[1]/preceding-sibling::*")) -
79
+ r.xpath("./note[@type = 'boilerplate']/descendant-or-self::*"))
79
80
  preface.each(&:remove)
80
81
  end
81
82
 
@@ -41,6 +41,11 @@ module Asciidoctor
41
41
  inline_macro Asciidoctor::Standoc::IndexRangeInlineMacro
42
42
  inline_macro Asciidoctor::Standoc::AddMacro
43
43
  inline_macro Asciidoctor::Standoc::DelMacro
44
+ inline_macro Asciidoctor::Standoc::FormInputMacro
45
+ inline_macro Asciidoctor::Standoc::FormLabelMacro
46
+ inline_macro Asciidoctor::Standoc::FormTextareaMacro
47
+ inline_macro Asciidoctor::Standoc::FormSelectMacro
48
+ inline_macro Asciidoctor::Standoc::FormOptionMacro
44
49
  block Asciidoctor::Standoc::ToDoAdmonitionBlock
45
50
  treeprocessor Asciidoctor::Standoc::ToDoInlineAdmonitionBlock
46
51
  block Asciidoctor::Standoc::PlantUMLBlockMacro
@@ -78,8 +83,8 @@ module Asciidoctor
78
83
  attr_accessor :_file
79
84
  end
80
85
 
81
- def self.inherited(k)
82
- k._file = caller_locations.first.absolute_path
86
+ def self.inherited(konv) # rubocop:disable Lint/MissingSuper
87
+ konv._file = caller_locations(1..1).first.absolute_path
83
88
  end
84
89
 
85
90
  # path to isodoc assets in child gems
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'erb'
3
+ require "erb"
4
4
 
5
5
  module Asciidoctor
6
6
  module Datamodel
7
7
  class PlantumlRenderer
8
- TEMPLATES_PATH = File.expand_path('../views/datamodel', __dir__).freeze
8
+ TEMPLATES_PATH = File.expand_path("../views/datamodel", __dir__).freeze
9
9
 
10
10
  attr_reader :yml, :plantuml_path
11
11
 
@@ -15,23 +15,23 @@ module Asciidoctor
15
15
  end
16
16
 
17
17
  def join_as_plantuml(*ary)
18
- ary.compact.join("\n").sub(/\s+\Z/, '')
18
+ ary.compact.join("\n").sub(/\s+\Z/, "")
19
19
  end
20
20
 
21
21
  def render
22
22
  ERB.new(
23
23
  File.read(
24
- File.join(TEMPLATES_PATH, 'plantuml_representation.adoc.erb')
24
+ File.join(TEMPLATES_PATH, "plantuml_representation.adoc.erb")
25
25
  )
26
26
  ).result(binding)
27
27
  end
28
28
 
29
29
  def diagram_caption
30
- yml['caption']
30
+ yml["caption"]
31
31
  end
32
32
 
33
33
  def imports_yml_to_plantuml
34
- return if empty?(yml, 'imports')
34
+ return if empty?(yml, "imports")
35
35
 
36
36
  <<~TEMPLATE
37
37
  '******* IMPORTS ******************************************************
@@ -40,7 +40,7 @@ module Asciidoctor
40
40
  end
41
41
 
42
42
  def class_defs_yml_to_plantuml
43
- return if empty?(yml, 'classes') && empty?(yml, 'enums')
43
+ return if empty?(yml, "classes") && empty?(yml, "enums")
44
44
 
45
45
  <<~TEMPLATE
46
46
  '******* CLASS DEFINITIONS ********************************************
@@ -52,7 +52,7 @@ module Asciidoctor
52
52
  end
53
53
 
54
54
  def class_groups_yml_to_plantuml
55
- return if empty?(yml, 'groups')
55
+ return if empty?(yml, "groups")
56
56
 
57
57
  <<~TEMPLATE
58
58
  '******* CLASS GROUPS *************************************************
@@ -63,7 +63,7 @@ module Asciidoctor
63
63
  end
64
64
 
65
65
  def class_relations_yml_to_plantuml
66
- return if empty?(yml, 'classes') && empty?(yml, 'relations')
66
+ return if empty?(yml, "classes") && empty?(yml, "relations")
67
67
 
68
68
  <<~TEMPLATE
69
69
  '******* CLASS RELATIONS **********************************************
@@ -75,7 +75,7 @@ module Asciidoctor
75
75
  end
76
76
 
77
77
  def diagram_options_yml_to_plantuml
78
- return if empty?(yml, 'diagram_options')
78
+ return if empty?(yml, "diagram_options")
79
79
 
80
80
  <<~TEMPLATE
81
81
  '******* DIAGRAM SPECIFIC CONFIG **************************************
@@ -86,7 +86,7 @@ module Asciidoctor
86
86
  end
87
87
 
88
88
  def bottom_yml_to_plantuml
89
- return if empty?(yml, 'bottom')
89
+ return if empty?(yml, "bottom")
90
90
 
91
91
  <<~TEMPLATE
92
92
  '******* BOTTOM OVERRIDE CONFIG **************************************
@@ -95,7 +95,7 @@ module Asciidoctor
95
95
  end
96
96
 
97
97
  def fidelity_yml_to_plantuml
98
- return if empty?(yml, 'fidelity')
98
+ return if empty?(yml, "fidelity")
99
99
 
100
100
  <<~TEMPLATE
101
101
  '******* FIDELITY *****************************************************
@@ -133,7 +133,7 @@ module Asciidoctor
133
133
 
134
134
  attributes.map do |(attr_name, attr_hash)|
135
135
  attribute_to_plantuml(attr_name, attr_hash)
136
- end.join('').sub(/\n\Z/, '')
136
+ end.join("").sub(/\n\Z/, "")
137
137
  end
138
138
 
139
139
  def attribute_to_plantuml(attr_name, attr_hash)
@@ -143,9 +143,10 @@ module Asciidoctor
143
143
  end
144
144
 
145
145
  def attribute_cardinality_plantuml(cardinality, with_bracket = true)
146
- return '' if cardinality.nil? ||
147
- (cardinality['min'] == cardinality['max'] &&
148
- cardinality['min'] == 1)
146
+ return "" if cardinality.nil? ||
147
+ (cardinality["min"] == cardinality["max"] &&
148
+ cardinality["min"] == 1)
149
+
149
150
  card = "#{cardinality['min']}..#{cardinality['max']}"
150
151
  return card unless with_bracket
151
152
 
@@ -172,7 +173,7 @@ module Asciidoctor
172
173
  def classes_to_relations_plantuml(classes)
173
174
  output_ary = classes.map do |(class_name, class_hash)|
174
175
  class_hash ||= {}
175
- relations = class_hash['relations']
176
+ relations = class_hash["relations"]
176
177
  relations_to_plantuml(class_name, relations)
177
178
  end
178
179
 
@@ -183,9 +184,9 @@ module Asciidoctor
183
184
  return unless relations
184
185
 
185
186
  output_ary = relations.map do |relation|
186
- source = class_name || relation['source']
187
+ source = class_name || relation["source"]
187
188
  relation_to_plantuml(source,
188
- relation['target'],
189
+ relation["target"],
189
190
  relation)
190
191
  end
191
192
 
@@ -194,41 +195,41 @@ module Asciidoctor
194
195
 
195
196
  def relation_arrow(relationship, relation)
196
197
  [
197
- relationship_type_to_plantuml('source',
198
- relationship['source']['type']),
199
- (relation['direction']).to_s,
200
- relationship_type_to_plantuml('target',
201
- relationship['target']['type'])
202
- ].compact.join('-')
198
+ relationship_type_to_plantuml("source",
199
+ relationship["source"]["type"]),
200
+ (relation["direction"]).to_s,
201
+ relationship_type_to_plantuml("target",
202
+ relationship["target"]["type"]),
203
+ ].compact.join("-")
203
204
  end
204
205
 
205
206
  def relation_label(action)
206
- return '' unless action
207
+ return "" unless action
207
208
 
208
- case action['direction']
209
- when 'source'
209
+ case action["direction"]
210
+ when "source"
210
211
  " : < #{action['verb']}"
211
- when 'target'
212
+ when "target"
212
213
  " : #{action['verb']} >"
213
214
  else
214
- ''
215
+ ""
215
216
  end
216
217
  end
217
218
 
218
219
  def source_arrow_end(source, relationship)
219
220
  source_attribute = relationship_cardinality_to_plantuml(
220
- relationship['source']['attribute']
221
+ relationship["source"]["attribute"]
221
222
  )
222
- [source, source_attribute].join(' ')
223
+ [source, source_attribute].join(" ")
223
224
  end
224
225
 
225
226
  def target_arrow_end(target, relationship, action)
226
227
  target_attribute = relationship_cardinality_to_plantuml(
227
- relationship['target']['attribute']
228
+ relationship["target"]["attribute"]
228
229
  )
229
230
  [
230
- [target_attribute, target].join(' '),
231
- relation_label(action)
231
+ [target_attribute, target].join(" "),
232
+ relation_label(action),
232
233
  ].join
233
234
  end
234
235
 
@@ -239,9 +240,9 @@ module Asciidoctor
239
240
  end
240
241
 
241
242
  def relation_to_plantuml(source, target, relation)
242
- relationship = relation['relationship'] || {}
243
- relationship['source'] ||= {}
244
- relationship['target'] ||= {}
243
+ relationship = relation["relationship"] || {}
244
+ relationship["source"] ||= {}
245
+ relationship["target"] ||= {}
245
246
  relation_output_lines(source, target, relation, relationship)
246
247
  end
247
248
 
@@ -249,22 +250,22 @@ module Asciidoctor
249
250
  output_lines = [
250
251
  source_arrow_end(source, relationship),
251
252
  relation_arrow(relationship, relation),
252
- target_arrow_end(target, relationship, relation['action']),
253
- relation_association(source, target, relationship['association'])
254
- ].join(' ')
253
+ target_arrow_end(target, relationship, relation["action"]),
254
+ relation_association(source, target, relationship["association"]),
255
+ ].join(" ")
255
256
 
256
257
  join_as_plantuml(*output_lines)
257
258
  end
258
259
 
259
260
  def relationship_type_to_plantuml(relation_end, relationship_type)
260
- is_source = (relation_end == 'source')
261
+ is_source = (relation_end == "source")
261
262
  mappings = {
262
- 'direct' => is_source ? '<' : '>',
263
- 'inheritance' => is_source ? '<|' : '|>',
264
- 'composition' => '*',
265
- 'aggregation' => 'o'
263
+ "direct" => is_source ? "<" : ">",
264
+ "inheritance" => is_source ? "<|" : "|>",
265
+ "composition" => "*",
266
+ "aggregation" => "o",
266
267
  }
267
- mappings.fetch(relationship_type, '')
268
+ mappings.fetch(relationship_type, "")
268
269
  end
269
270
 
270
271
  def relationship_cardinality_to_plantuml(attribute)
@@ -273,12 +274,12 @@ module Asciidoctor
273
274
  return unless attribute_name
274
275
 
275
276
  attribute_hash = attribute[attribute_name] || {}
276
- card = attribute_cardinality(attribute_hash['cardinality'])
277
+ card = attribute_cardinality(attribute_hash["cardinality"])
277
278
  "\"+#{attribute_name}#{card}\""
278
279
  end
279
280
 
280
281
  def attribute_cardinality(attribute_cardinality)
281
- cardinality = ''
282
+ cardinality = ""
282
283
  if attribute_cardinality
283
284
  cardinality = attribute_cardinality_plantuml(
284
285
  attribute_cardinality,
@@ -308,7 +309,7 @@ module Asciidoctor
308
309
  end
309
310
 
310
311
  def model_stereotype_to_plantuml(model_stereotype)
311
- return '' unless model_stereotype
312
+ return "" unless model_stereotype
312
313
 
313
314
  " <<#{model_stereotype}>>"
314
315
  end
@@ -325,7 +326,7 @@ module Asciidoctor
325
326
  groups ||= []
326
327
  return if groups.empty?
327
328
 
328
- groups.reduce('') do |output, group|
329
+ groups.reduce("") do |output, group|
329
330
  output += "\ntogether {\n"
330
331
  group.each do |class_name|
331
332
  output += "\nclass #{class_name}\n"
@@ -350,9 +351,9 @@ module Asciidoctor
350
351
  end
351
352
 
352
353
  def format_hidden_class(accum, fidelity_classes, class_hash)
353
- return accum if class_hash['relations'].nil?
354
+ return accum if class_hash["relations"].nil?
354
355
 
355
- class_hash['relations'].each_with_object(accum) do |relation, acc|
356
+ class_hash["relations"].each_with_object(accum) do |relation, acc|
356
357
  format_source_target_relation(relation, fidelity_classes, acc)
357
358
  format_association_relation(relation, fidelity_classes, acc)
358
359
  end
@@ -367,36 +368,36 @@ module Asciidoctor
367
368
  end
368
369
 
369
370
  def format_association_relation(relation, fidelity_classes, acc)
370
- return unless relation['relationship'] &&
371
- relation['relationship']['association']
371
+ return unless relation["relationship"] &&
372
+ relation["relationship"]["association"]
372
373
 
373
- association = relation['relationship']['association']
374
+ association = relation["relationship"]["association"]
374
375
  return unless association && !fidelity_classes.key?(association)
375
376
 
376
377
  acc.merge!(association => true)
377
378
  end
378
379
 
379
380
  def hide_other_classes(fidelity)
380
- return '' if fidelity.nil? || fidelity['classes'].nil?
381
+ return "" if fidelity.nil? || fidelity["classes"].nil?
381
382
 
382
- output = ''
383
- hidden_classes = fidelity['classes']
384
- .reduce({}) do |acc, (_class_name, class_hash)|
385
- format_hidden_class(acc, fidelity['classes'], class_hash)
383
+ output = ""
384
+ hidden_classes = fidelity["classes"]
385
+ .reduce({}) do |acc, (_class_name, class_hash)|
386
+ format_hidden_class(acc, fidelity["classes"], class_hash)
386
387
  end
387
388
 
388
- hidden_classes.keys.each do |hidden_class_name|
389
+ hidden_classes.each_key do |hidden_class_name|
389
390
  output += "\nhide #{hidden_class_name}\n"
390
391
  end
391
392
  output
392
393
  end
393
394
 
394
395
  def fidelity_to_plantuml(fidelity)
395
- return '' if fidelity.nil?
396
+ return "" if fidelity.nil?
396
397
 
397
- output = ''
398
- output += hide_other_classes(fidelity) if fidelity['hideOtherClasses']
399
- output += "\nhide members\n" if fidelity['hideMembers']
398
+ output = ""
399
+ output += hide_other_classes(fidelity) if fidelity["hideOtherClasses"]
400
+ output += "\nhide members\n" if fidelity["hideMembers"]
400
401
  output
401
402
  end
402
403