metanorma-standoc 1.9.1 → 1.9.2

Sign up to get free protection for your applications and to get access to all the features.
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