sts 0.5.1 → 0.5.3

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 (197) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +3 -0
  3. data/.rubocop.yml +3 -0
  4. data/.rubocop_todo.yml +17 -3
  5. data/CLAUDE.md +72 -0
  6. data/Gemfile +1 -1
  7. data/lib/sts/content_groups/helpers.rb +27 -0
  8. data/lib/sts/enum_values.rb +17 -0
  9. data/lib/sts/iso_sts/app.rb +26 -1
  10. data/lib/sts/iso_sts/app_group.rb +1 -0
  11. data/lib/sts/iso_sts/array.rb +1 -0
  12. data/lib/sts/iso_sts/back.rb +1 -0
  13. data/lib/sts/iso_sts/body.rb +4 -0
  14. data/lib/sts/iso_sts/bold.rb +23 -11
  15. data/lib/sts/iso_sts/caption.rb +1 -0
  16. data/lib/sts/iso_sts/content_groups/highlight_elements.rb +285 -0
  17. data/lib/sts/iso_sts/def.rb +1 -0
  18. data/lib/sts/iso_sts/def_item.rb +1 -0
  19. data/lib/sts/iso_sts/def_list.rb +1 -0
  20. data/lib/sts/iso_sts/disp_formula.rb +5 -1
  21. data/lib/sts/iso_sts/document_identification.rb +1 -0
  22. data/lib/sts/iso_sts/fig.rb +1 -0
  23. data/lib/sts/iso_sts/fn.rb +1 -0
  24. data/lib/sts/iso_sts/fn_group.rb +1 -0
  25. data/lib/sts/iso_sts/front.rb +3 -0
  26. data/lib/sts/iso_sts/graphic.rb +5 -0
  27. data/lib/sts/iso_sts/inline_formula.rb +1 -1
  28. data/lib/sts/iso_sts/iso_meta.rb +2 -1
  29. data/lib/sts/iso_sts/italic.rb +23 -11
  30. data/lib/sts/iso_sts/list.rb +1 -0
  31. data/lib/sts/iso_sts/list_item.rb +7 -4
  32. data/lib/sts/iso_sts/mathml2/math.rb +20 -18
  33. data/lib/sts/iso_sts/mixed_citation.rb +34 -10
  34. data/lib/sts/iso_sts/nat_meta.rb +1 -0
  35. data/lib/sts/iso_sts/non_normative_example.rb +5 -0
  36. data/lib/sts/iso_sts/non_normative_note.rb +1 -0
  37. data/lib/sts/iso_sts/paragraph.rb +32 -20
  38. data/lib/sts/iso_sts/permissions.rb +1 -0
  39. data/lib/sts/iso_sts/preformat.rb +8 -5
  40. data/lib/sts/iso_sts/ref.rb +1 -0
  41. data/lib/sts/iso_sts/ref_list.rb +1 -0
  42. data/lib/sts/iso_sts/reg_meta.rb +1 -0
  43. data/lib/sts/iso_sts/sec.rb +10 -0
  44. data/lib/sts/iso_sts/standard.rb +6 -0
  45. data/lib/sts/iso_sts/standard_cross_reference.rb +1 -0
  46. data/lib/sts/iso_sts/standard_identification.rb +1 -0
  47. data/lib/sts/iso_sts/std.rb +4 -4
  48. data/lib/sts/iso_sts/styled_content.rb +17 -15
  49. data/lib/sts/iso_sts/table.rb +1 -0
  50. data/lib/sts/iso_sts/table_wrap.rb +1 -0
  51. data/lib/sts/iso_sts/table_wrap_foot.rb +1 -0
  52. data/lib/sts/iso_sts/td.rb +32 -14
  53. data/lib/sts/iso_sts/term.rb +1 -1
  54. data/lib/sts/iso_sts/term_sec.rb +1 -0
  55. data/lib/sts/iso_sts/th.rb +32 -14
  56. data/lib/sts/iso_sts/title.rb +15 -7
  57. data/lib/sts/iso_sts/title_wrap.rb +1 -0
  58. data/lib/sts/iso_sts/tr.rb +1 -0
  59. data/lib/sts/iso_sts.rb +2 -0
  60. data/lib/sts/{niso_sts/mathml.rb → mathml.rb} +1 -3
  61. data/lib/sts/namespaces.rb +1 -0
  62. data/lib/sts/niso_sts/abstract.rb +1 -0
  63. data/lib/sts/niso_sts/ack.rb +1 -1
  64. data/lib/sts/niso_sts/address.rb +1 -0
  65. data/lib/sts/niso_sts/adoption.rb +1 -1
  66. data/lib/sts/niso_sts/adoption_front.rb +1 -0
  67. data/lib/sts/niso_sts/alternatives.rb +1 -4
  68. data/lib/sts/niso_sts/annotation.rb +1 -3
  69. data/lib/sts/niso_sts/app.rb +14 -1
  70. data/lib/sts/niso_sts/app_group.rb +5 -0
  71. data/lib/sts/niso_sts/author_comment.rb +1 -3
  72. data/lib/sts/niso_sts/author_notes.rb +1 -1
  73. data/lib/sts/niso_sts/award_group.rb +1 -0
  74. data/lib/sts/niso_sts/back.rb +5 -4
  75. data/lib/sts/niso_sts/bio.rb +1 -3
  76. data/lib/sts/niso_sts/body.rb +36 -0
  77. data/lib/sts/niso_sts/boxed_text.rb +5 -1
  78. data/lib/sts/niso_sts/break.rb +11 -0
  79. data/lib/sts/niso_sts/caption.rb +7 -1
  80. data/lib/sts/niso_sts/chem_struct_wrap.rb +1 -0
  81. data/lib/sts/niso_sts/citation_alternatives.rb +1 -0
  82. data/lib/sts/niso_sts/collab.rb +8 -0
  83. data/lib/sts/niso_sts/conference.rb +1 -0
  84. data/lib/sts/niso_sts/content_groups/body_elements.rb +50 -0
  85. data/lib/sts/niso_sts/content_groups/citation_elements.rb +74 -0
  86. data/lib/sts/niso_sts/content_groups/emphasized_text.rb +67 -0
  87. data/lib/sts/niso_sts/content_groups/highlight_elements.rb +51 -0
  88. data/lib/sts/niso_sts/content_groups/inside_cell.rb +116 -0
  89. data/lib/sts/niso_sts/content_groups/p_elements.rb +41 -0
  90. data/lib/sts/niso_sts/content_groups/para_level.rb +67 -0
  91. data/lib/sts/niso_sts/content_groups/styled_content_elements.rb +93 -0
  92. data/lib/sts/niso_sts/content_groups/table_group_attributes.rb +62 -0
  93. data/lib/sts/niso_sts/content_groups.rb +8 -0
  94. data/lib/sts/niso_sts/contrib.rb +1 -0
  95. data/lib/sts/niso_sts/contrib_group.rb +1 -0
  96. data/lib/sts/niso_sts/counts.rb +1 -0
  97. data/lib/sts/niso_sts/custom_meta.rb +1 -0
  98. data/lib/sts/niso_sts/date.rb +1 -0
  99. data/lib/sts/niso_sts/def_item.rb +9 -0
  100. data/lib/sts/niso_sts/def_list.rb +6 -1
  101. data/lib/sts/niso_sts/disp_formula_group.rb +3 -4
  102. data/lib/sts/niso_sts/disp_quote.rb +1 -1
  103. data/lib/sts/niso_sts/display_formula.rb +12 -0
  104. data/lib/sts/niso_sts/document_identification.rb +1 -0
  105. data/lib/sts/niso_sts/editing_instruction.rb +1 -3
  106. data/lib/sts/niso_sts/element_citation.rb +1 -1
  107. data/lib/sts/niso_sts/ext_link.rb +16 -2
  108. data/lib/sts/niso_sts/fig_group.rb +1 -0
  109. data/lib/sts/niso_sts/figure.rb +14 -1
  110. data/lib/sts/niso_sts/floats_group.rb +1 -4
  111. data/lib/sts/niso_sts/fn.rb +2 -1
  112. data/lib/sts/niso_sts/front.rb +1 -0
  113. data/lib/sts/niso_sts/funding_group.rb +1 -0
  114. data/lib/sts/niso_sts/glossary.rb +1 -1
  115. data/lib/sts/niso_sts/graphic.rb +2 -0
  116. data/lib/sts/niso_sts/ics.rb +2 -0
  117. data/lib/sts/niso_sts/index_term.rb +1 -0
  118. data/lib/sts/niso_sts/inline_formula.rb +11 -0
  119. data/lib/sts/niso_sts/institution_wrap.rb +1 -0
  120. data/lib/sts/niso_sts/kwd_group.rb +1 -0
  121. data/lib/sts/niso_sts/label.rb +3 -2
  122. data/lib/sts/niso_sts/list.rb +7 -2
  123. data/lib/sts/niso_sts/list_item.rb +7 -2
  124. data/lib/sts/niso_sts/media.rb +1 -0
  125. data/lib/sts/niso_sts/meta_note.rb +1 -1
  126. data/lib/sts/niso_sts/metadata_iso.rb +1 -1
  127. data/lib/sts/niso_sts/metadata_std.rb +16 -6
  128. data/lib/sts/niso_sts/milestone_end.rb +1 -3
  129. data/lib/sts/niso_sts/milestone_start.rb +1 -3
  130. data/lib/sts/niso_sts/mixed_citation.rb +22 -0
  131. data/lib/sts/niso_sts/monospace.rb +9 -0
  132. data/lib/sts/niso_sts/name.rb +1 -0
  133. data/lib/sts/niso_sts/nat_meta.rb +1 -0
  134. data/lib/sts/niso_sts/nested_kwd.rb +1 -0
  135. data/lib/sts/niso_sts/nlm_citation.rb +1 -1
  136. data/lib/sts/niso_sts/non_normative_example.rb +15 -2
  137. data/lib/sts/niso_sts/non_normative_note.rb +12 -2
  138. data/lib/sts/niso_sts/normative_example.rb +1 -1
  139. data/lib/sts/niso_sts/normative_note.rb +1 -1
  140. data/lib/sts/niso_sts/note.rb +1 -1
  141. data/lib/sts/niso_sts/notes.rb +1 -1
  142. data/lib/sts/niso_sts/notes_group.rb +1 -0
  143. data/lib/sts/niso_sts/open_access.rb +1 -4
  144. data/lib/sts/niso_sts/paragraph.rb +37 -7
  145. data/lib/sts/niso_sts/permissions.rb +1 -0
  146. data/lib/sts/niso_sts/preformat.rb +15 -0
  147. data/lib/sts/niso_sts/private_char.rb +1 -3
  148. data/lib/sts/niso_sts/pub_date.rb +2 -0
  149. data/lib/sts/niso_sts/publisher.rb +1 -0
  150. data/lib/sts/niso_sts/reference.rb +1 -0
  151. data/lib/sts/niso_sts/reference_list.rb +6 -1
  152. data/lib/sts/niso_sts/reference_standard.rb +2 -0
  153. data/lib/sts/niso_sts/reg_meta.rb +1 -0
  154. data/lib/sts/niso_sts/release_date.rb +9 -6
  155. data/lib/sts/niso_sts/ruby.rb +1 -0
  156. data/lib/sts/niso_sts/section.rb +39 -4
  157. data/lib/sts/niso_sts/speech.rb +1 -1
  158. data/lib/sts/niso_sts/standard.rb +3 -0
  159. data/lib/sts/niso_sts/standard_identification.rb +1 -1
  160. data/lib/sts/niso_sts/statement.rb +1 -1
  161. data/lib/sts/niso_sts/std_doc_meta.rb +1 -0
  162. data/lib/sts/niso_sts/std_org.rb +1 -0
  163. data/lib/sts/niso_sts/styled_content.rb +37 -0
  164. data/lib/sts/niso_sts/sub.rb +11 -0
  165. data/lib/sts/niso_sts/subj_group.rb +1 -0
  166. data/lib/sts/niso_sts/sup.rb +13 -0
  167. data/lib/sts/niso_sts/supplementary_material.rb +1 -0
  168. data/lib/sts/niso_sts/term_display.rb +1 -0
  169. data/lib/sts/niso_sts/term_section.rb +3 -3
  170. data/lib/sts/niso_sts/title.rb +20 -0
  171. data/lib/sts/niso_sts/trans_abstract.rb +1 -0
  172. data/lib/sts/niso_sts/underline.rb +5 -0
  173. data/lib/sts/niso_sts/uri.rb +2 -0
  174. data/lib/sts/niso_sts/verse_group.rb +1 -1
  175. data/lib/sts/niso_sts/volume_issue_group.rb +1 -4
  176. data/lib/sts/tbx_iso_tml/bold.rb +28 -2
  177. data/lib/sts/tbx_iso_tml/col.rb +10 -0
  178. data/lib/sts/tbx_iso_tml/definition.rb +16 -2
  179. data/lib/sts/tbx_iso_tml/example.rb +9 -1
  180. data/lib/sts/tbx_iso_tml/fn.rb +3 -2
  181. data/lib/sts/tbx_iso_tml/italic.rb +25 -2
  182. data/lib/sts/tbx_iso_tml/msup.rb +2 -1
  183. data/lib/sts/tbx_iso_tml/note.rb +11 -7
  184. data/lib/sts/tbx_iso_tml/source.rb +4 -0
  185. data/lib/sts/tbx_iso_tml/table.rb +1 -0
  186. data/lib/sts/tbx_iso_tml/table_wrap.rb +3 -0
  187. data/lib/sts/tbx_iso_tml/table_wrap_foot.rb +1 -0
  188. data/lib/sts/tbx_iso_tml/tbody.rb +9 -1
  189. data/lib/sts/tbx_iso_tml/td.rb +22 -8
  190. data/lib/sts/tbx_iso_tml/term.rb +9 -5
  191. data/lib/sts/tbx_iso_tml/tfoot.rb +5 -1
  192. data/lib/sts/tbx_iso_tml/th.rb +27 -6
  193. data/lib/sts/tbx_iso_tml/thead.rb +9 -1
  194. data/lib/sts/tbx_iso_tml/tr.rb +16 -0
  195. data/lib/sts/version.rb +1 -1
  196. data/lib/sts.rb +10 -0
  197. metadata +19 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 17c28cffc24d00115affac9804d14b9f6f56f26184e878cac114b827552483aa
4
- data.tar.gz: 06656d33bbd336bdcb12303b4a76eb3f6f93d79f9ec731d5f5976cf553e09ce8
3
+ metadata.gz: 46ee1bd086e84d831f68bf02a8420e0aca91c321b29f975ed22abb8774042aec
4
+ data.tar.gz: 9339e5dc5256944c96799877a08ba2ccc1676f2a64156fc5c7bdce8bb12c50e1
5
5
  SHA512:
6
- metadata.gz: 502352aed49fd3006153cb4ffa6f8001429a24f88740a36816ad64fc61ac9167c759230b7a245932a47a35902f9d75b0b7a5c6139068370157ab8cc6cc2cebf7
7
- data.tar.gz: cf73317fa263fb9de07425702a1d7a0c806cfb98402961bb9f3bffd69bdb551405cdfd9f5fa18e068d099a0a6b52b47626829461cb9a137eb38c58c3589a1436
6
+ metadata.gz: 498eea9f817087d455c5338a632e9118427cf975c512f0f7be8b725fd7fee34f8e1ed29050b40e272ec6575fddfd47df8aa616117c83ba9732c042a66b395159
7
+ data.tar.gz: 0bb89062547d29d8506cf65cd9f9fbdc75723944ae40f8a8f67a68465a61a82adbdf2664ce3cd12443f755951d3af2edb6910c7529f9d742ca85f88b324e6d42
data/.gitmodules ADDED
@@ -0,0 +1,3 @@
1
+ [submodule "spec/fixtures/mn-samples-iso-private"]
2
+ path = spec/fixtures/mn-samples-iso-private
3
+ url = git@github.com:metanorma/mn-samples-iso-private.git
data/.rubocop.yml CHANGED
@@ -5,6 +5,9 @@ inherit_from:
5
5
  # local repo-specific modifications
6
6
  # ...
7
7
 
8
+ Metrics/BlockLength:
9
+ Max: 35
10
+
8
11
  AllCops:
9
12
  TargetRubyVersion: 2.6
10
13
  NewCops: enable
data/.rubocop_todo.yml CHANGED
@@ -1,20 +1,34 @@
1
1
  # This configuration was generated by
2
- # `rubocop --auto-gen-config`
3
- # on 2026-04-03 22:12:14 UTC using RuboCop version 1.86.0.
2
+ # `rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit 50`
3
+ # on 2026-05-06 01:14:05 UTC using RuboCop version 1.86.1.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
7
7
  # versions of RuboCop, may require this file to be generated again.
8
8
 
9
- # Offense count: 8
9
+ # Offense count: 18
10
10
  # This cop supports safe autocorrection (--autocorrect).
11
11
  # Configuration parameters: Max, AllowHeredoc, AllowURI, AllowQualifiedName, URISchemes, AllowRBSInlineAnnotation, AllowCopDirectives, AllowedPatterns, SplitStrings.
12
12
  # URISchemes: http, https
13
13
  Layout/LineLength:
14
14
  Exclude:
15
+ - 'lib/sts/iso_sts/content_groups/highlight_elements.rb'
16
+ - 'lib/sts/niso_sts/content_groups/body_elements.rb'
17
+ - 'lib/sts/niso_sts/content_groups/emphasized_text.rb'
18
+ - 'lib/sts/niso_sts/content_groups/highlight_elements.rb'
19
+ - 'lib/sts/niso_sts/content_groups/inside_cell.rb'
20
+ - 'lib/sts/niso_sts/content_groups/styled_content_elements.rb'
21
+ - 'lib/sts/niso_sts/content_groups/table_group_attributes.rb'
15
22
  - 'lib/sts/niso_sts/mml_content/containers.rb'
16
23
  - 'lib/sts/niso_sts/mml_content/linear_algebra.rb'
17
24
  - 'lib/sts/niso_sts/term.rb'
18
25
  - 'lib/sts/tbx_iso_tml/lang_set.rb'
19
26
  - 'lib/sts/tbx_iso_tml/term_type.rb'
27
+ - 'spec/round_trip/reference_docs_spec.rb'
20
28
  - 'spec/spec_helper.rb'
29
+
30
+ # Offense count: 1
31
+ # Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes, Max.
32
+ Metrics/AbcSize:
33
+ Exclude:
34
+ - 'lib/sts/iso_sts/mathml2/math.rb'
data/CLAUDE.md ADDED
@@ -0,0 +1,72 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## Build and Test Commands
6
+
7
+ ```bash
8
+ # Run tests
9
+ bundle exec rspec
10
+
11
+ # Run tests with specific file
12
+ bundle exec rspec spec/sts_spec.rb
13
+
14
+ # Run RuboCop linting
15
+ bundle exec rubocop
16
+
17
+ # Run both (default task)
18
+ bundle exec rake
19
+ ```
20
+
21
+ ## Architecture
22
+
23
+ This is a Ruby gem for parsing NISO STS (National Information Standards Organization - Science and Technical Standards) XML documents. It uses `lutaml-model` for XML serialization/deserialization.
24
+
25
+ ### Namespace Structure
26
+
27
+ ```
28
+ Sts
29
+ ├── NisoSts # NISO STS elements (lib/sts/niso_sts/)
30
+ │ ├── MmlContent # MathML content elements (autoloaded)
31
+ │ └── Xi, Ali # Module elements
32
+ ├── TbxIsoTml # TBX ISO TML elements (lib/sts/tbx_iso_tml/)
33
+ ├── Mathml # MathML namespace wrapper
34
+ └── Namespaces # XML namespace definitions
35
+ ```
36
+
37
+ ### Key Implementation Patterns
38
+
39
+ **Element Classes** (in `lib/sts/niso_sts/`):
40
+ - Inherit from `Lutaml::Model::Serializable`
41
+ - Define attributes and XML mapping in `xml do ... end` block
42
+ - Use `map_element` to map child elements, `map_content` for text content
43
+ - Use `mixed_content` for elements that contain both text and child elements
44
+
45
+ **Example element structure:**
46
+ ```ruby
47
+ module Sts
48
+ module NisoSts
49
+ class SomeElement < Lutaml::Model::Serializable
50
+ attribute :id, :string
51
+ attribute :content, :string
52
+ attribute :child, ::Sts::NisoSts::ChildElement
53
+
54
+ xml do
55
+ element "some-element"
56
+ map_attribute "id", to: :id
57
+ map_content to: :content
58
+ map_element "child", to: :child
59
+ end
60
+ end
61
+ end
62
+ end
63
+ ```
64
+
65
+ **Autoload Pattern**: Elements are autoloaded via `lib/sts/niso_sts.rb`. When adding new elements, add autoloads in alphabetical order.
66
+
67
+ **Bold/Italic Elements**: These use `::Sts::TbxIsoTml::Bold` and `::Sts::TbxIsoTml::Italic` types (not `:string`), enabling proper round-tripping of nested markup.
68
+
69
+ ### Reference Data
70
+
71
+ - XSD schema: `reference-docs/NISO-STS-extended-1-MathML3-XSD/`
72
+ - Test fixtures: `spec/fixtures/`
data/Gemfile CHANGED
@@ -6,7 +6,7 @@ source "https://rubygems.org"
6
6
  gemspec
7
7
 
8
8
  gem "canon"
9
- gem "lutaml-model", github: "lutaml/lutaml-model", branch: "main"
9
+ gem "lutaml-model", "~> 0.8.0"
10
10
  gem "rake"
11
11
  gem "rspec"
12
12
  gem "rubocop"
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Shared injection helpers for NisoSts and IsoSts ContentGroups.
4
+ #
5
+ # Element tuple formats:
6
+ # 3-tuple: [name, type, xml_name] -> collection
7
+ # 4-tuple: [name, type, xml_name, singular?] -> explicit
8
+
9
+ module Sts
10
+ module ContentGroups
11
+ module Helpers
12
+ def inject_elements(klass, elements)
13
+ elements.each do |name, type_name, _, is_collection|
14
+ type = Object.const_get(type_name)
15
+ coll = is_collection.nil? || is_collection
16
+ klass.attribute name, type, collection: coll
17
+ end
18
+ end
19
+
20
+ def inject_element_mappings(klass, elements)
21
+ elements.each do |name, _, xml_name, _|
22
+ klass.map_element xml_name, to: name
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sts
4
+ module EnumValues
5
+ ALIGN = %w[center char justify left right].freeze
6
+ VALIGN = %w[baseline bottom middle top].freeze
7
+ SCOPE = %w[col colgroup row rowgroup].freeze
8
+ ORIENTATION = %w[landscape portrait].freeze
9
+ POSITION = %w[anchor background float margin].freeze
10
+ FRAME = %w[above below border box hsides lhs rhs void vsides].freeze
11
+ RULES = %w[all cols groups none rows].freeze
12
+ TOGGLE = %w[no yes].freeze
13
+ ARRANGE = %w[stack stagger].freeze
14
+ NAME_STYLE = %w[eastern given-only islensk western].freeze
15
+ AUTHENTICATED = %w[false true].freeze
16
+ end
17
+ end
@@ -16,10 +16,24 @@ module Sts
16
16
  attribute :fn_group, ::Sts::IsoSts::FnGroup, collection: true
17
17
  attribute :ref_list, ::Sts::IsoSts::RefList, collection: true
18
18
  attribute :permissions, ::Sts::NisoSts::Permissions
19
- attribute :non_normative_note, ::Sts::IsoSts::NonNormativeNote
19
+ attribute :non_normative_note, ::Sts::IsoSts::NonNormativeNote,
20
+ collection: true
21
+ attribute :non_normative_example, ::Sts::IsoSts::NonNormativeExample,
22
+ collection: true
23
+ attribute :table_wrap, ::Sts::TbxIsoTml::TableWrap, collection: true
24
+ attribute :list, ::Sts::IsoSts::List, collection: true
25
+ attribute :def_list, ::Sts::IsoSts::DefList, collection: true
26
+ attribute :fig, ::Sts::IsoSts::Fig, collection: true
27
+ attribute :array, ::Sts::IsoSts::Array, collection: true
28
+ attribute :graphic, ::Sts::IsoSts::Graphic, collection: true
29
+ attribute :preformat, ::Sts::IsoSts::Preformat, collection: true
30
+ attribute :styled_content, ::Sts::IsoSts::StyledContent, collection: true
31
+ attribute :disp_formula, ::Sts::IsoSts::DispFormula, collection: true
32
+ attribute :inline_formula, ::Sts::IsoSts::InlineFormula, collection: true
20
33
 
21
34
  xml do
22
35
  element "app"
36
+ ordered
23
37
 
24
38
  map_attribute "id", to: :id
25
39
  map_attribute "content-type", to: :content_type
@@ -36,6 +50,17 @@ module Sts
36
50
  map_element "ref-list", to: :ref_list
37
51
  map_element "permissions", to: :permissions
38
52
  map_element "non-normative-note", to: :non_normative_note
53
+ map_element "non-normative-example", to: :non_normative_example
54
+ map_element "table-wrap", to: :table_wrap
55
+ map_element "list", to: :list
56
+ map_element "def-list", to: :def_list
57
+ map_element "fig", to: :fig
58
+ map_element "array", to: :array
59
+ map_element "graphic", to: :graphic
60
+ map_element "preformat", to: :preformat
61
+ map_element "styled-content", to: :styled_content
62
+ map_element "disp-formula", to: :disp_formula
63
+ map_element "inline-formula", to: :inline_formula
39
64
  end
40
65
  end
41
66
  end
@@ -15,6 +15,7 @@ module Sts
15
15
 
16
16
  xml do
17
17
  element "app-group"
18
+ ordered
18
19
 
19
20
  map_attribute "id", to: :id
20
21
  map_attribute "content-type", to: :content_type
@@ -16,6 +16,7 @@ module Sts
16
16
 
17
17
  xml do
18
18
  element "array"
19
+ ordered
19
20
 
20
21
  map_attribute "id", to: :id
21
22
  map_attribute "content-type", to: :content_type
@@ -12,6 +12,7 @@ module Sts
12
12
 
13
13
  xml do
14
14
  element "back"
15
+ ordered
15
16
 
16
17
  map_attribute "id", to: :id
17
18
  map_attribute "content-type", to: :content_type
@@ -22,9 +22,12 @@ module Sts
22
22
  attribute :array, ::Sts::IsoSts::Array, collection: true
23
23
  attribute :ref_list, ::Sts::IsoSts::RefList, collection: true
24
24
  attribute :disp_quote, ::Sts::NisoSts::DispQuote, collection: true
25
+ attribute :editing_instruction, ::Sts::NisoSts::EditingInstruction,
26
+ collection: true
25
27
 
26
28
  xml do
27
29
  element "body"
30
+ ordered
28
31
 
29
32
  map_attribute "id", to: :id
30
33
  map_attribute "content-type", to: :content_type
@@ -44,6 +47,7 @@ module Sts
44
47
  map_element "array", to: :array
45
48
  map_element "ref-list", to: :ref_list
46
49
  map_element "disp-quote", to: :disp_quote
50
+ map_element "editing-instruction", to: :editing_instruction
47
51
  end
48
52
  end
49
53
  end
@@ -6,17 +6,23 @@ module Sts
6
6
  attribute :id, :string
7
7
  attribute :specific_use, :string
8
8
  attribute :content, :string, collection: true
9
- attribute :bold, ::Sts::IsoSts::Bold
10
- attribute :italic, ::Sts::IsoSts::Italic
11
- attribute :sub, ::Sts::NisoSts::Sub
12
- attribute :sup, ::Sts::NisoSts::Sup
13
- attribute :xref, ::Sts::TbxIsoTml::Xref
14
- attribute :ext_link, ::Sts::NisoSts::ExtLink
15
- attribute :uri, ::Sts::NisoSts::Uri
16
- attribute :inline_formula, ::Sts::IsoSts::InlineFormula
17
- attribute :named_content, ::Sts::NisoSts::NamedContent
18
- attribute :styled_content, ::Sts::IsoSts::StyledContent
19
- attribute :break, ::Sts::IsoSts::Break
9
+ attribute :bold, ::Sts::IsoSts::Bold, collection: true
10
+ attribute :italic, ::Sts::IsoSts::Italic, collection: true
11
+ attribute :sub, ::Sts::NisoSts::Sub, collection: true
12
+ attribute :sup, ::Sts::NisoSts::Sup, collection: true
13
+ attribute :xref, ::Sts::TbxIsoTml::Xref, collection: true
14
+ attribute :ext_link, ::Sts::NisoSts::ExtLink, collection: true
15
+ attribute :uri, ::Sts::NisoSts::Uri, collection: true
16
+ attribute :inline_formula, ::Sts::IsoSts::InlineFormula, collection: true
17
+ attribute :named_content, ::Sts::NisoSts::NamedContent, collection: true
18
+ attribute :styled_content, ::Sts::IsoSts::StyledContent, collection: true
19
+ attribute :break, ::Sts::IsoSts::Break, collection: true
20
+ attribute :std_ref, ::Sts::IsoSts::StdRef, collection: true
21
+ attribute :monospace, ::Sts::NisoSts::Monospace, collection: true
22
+ attribute :sc, ::Sts::NisoSts::Sc, collection: true
23
+ attribute :strike, ::Sts::NisoSts::Strike, collection: true
24
+ attribute :underline, ::Sts::NisoSts::Underline, collection: true
25
+ attribute :fn, ::Sts::TbxIsoTml::Fn, collection: true
20
26
 
21
27
  xml do
22
28
  element "bold"
@@ -38,6 +44,12 @@ module Sts
38
44
  map_element "named-content", to: :named_content
39
45
  map_element "styled-content", to: :styled_content
40
46
  map_element "break", to: :break
47
+ map_element "std-ref", to: :std_ref
48
+ map_element "monospace", to: :monospace
49
+ map_element "sc", to: :sc
50
+ map_element "strike", to: :strike
51
+ map_element "underline", to: :underline
52
+ map_element "fn", to: :fn
41
53
  end
42
54
  end
43
55
  end
@@ -15,6 +15,7 @@ module Sts
15
15
 
16
16
  xml do
17
17
  element "caption"
18
+ ordered
18
19
 
19
20
  map_attribute "id", to: :id
20
21
  map_attribute "specific-use", to: :specific_use
@@ -0,0 +1,285 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../../content_groups/helpers"
4
+
5
+ # Shared content group methods for IsoSts models.
6
+ # Mirrors NisoSts::ContentGroups but uses IsoSts-specific type references.
7
+ #
8
+ # Content groups defined:
9
+ # - highlight_elements (21 elements) — used by Bold, Italic
10
+ # - styled_content_elements (31 elements) — used by StyledContent
11
+ # - p_elements (35 elements) — used by Paragraph
12
+ # - para_level (28 elements) — used by Sec, App, NonNormativeNote, NonNormativeExample, TermSec
13
+ # - inside_cell (40+ elements) — used by Td, Th
14
+
15
+ module Sts
16
+ module IsoSts
17
+ module ContentGroups
18
+ extend ::Sts::ContentGroups::Helpers
19
+
20
+ HIGHLIGHT_ELEMENTS = [
21
+ [:bold, "Sts::IsoSts::Bold", "bold"],
22
+ [:italic, "Sts::IsoSts::Italic", "italic"],
23
+ [:sub, "Sts::NisoSts::Sub", "sub"],
24
+ [:sup, "Sts::NisoSts::Sup", "sup"],
25
+ [:monospace, "Sts::NisoSts::Monospace", "monospace"],
26
+ [:sc, "Sts::NisoSts::Sc", "sc"],
27
+ [:std_ref, "Sts::IsoSts::StdRef", "std-ref"],
28
+ [:underline, "Sts::NisoSts::Underline", "underline"],
29
+ [:strike, "Sts::NisoSts::Strike", "strike"],
30
+ [:xref, "Sts::TbxIsoTml::Xref", "xref"],
31
+ [:ext_link, "Sts::NisoSts::ExtLink", "ext-link"],
32
+ [:fn, "Sts::TbxIsoTml::Fn", "fn"],
33
+ [:styled_content, "Sts::IsoSts::StyledContent", "styled-content"],
34
+ [:array, "Sts::IsoSts::Array", "array"],
35
+ [:break, "Sts::IsoSts::Break", "break"],
36
+ [:target, "Sts::NisoSts::Target", "target"],
37
+ [:overline, "Sts::NisoSts::Overline", "overline"],
38
+ [:roman, "Sts::NisoSts::Roman", "roman"],
39
+ [:sans_serif, "Sts::NisoSts::SansSerif", "sans-serif"],
40
+ [:ruby, "Sts::NisoSts::Ruby", "ruby"],
41
+ [:named_content, "Sts::NisoSts::NamedContent", "named-content"],
42
+ [:uri, "Sts::NisoSts::Uri", "uri"],
43
+ [:inline_formula, "Sts::IsoSts::InlineFormula", "inline-formula"],
44
+ ].freeze
45
+
46
+ def self.highlight_elements(klass)
47
+ inject_elements(klass, HIGHLIGHT_ELEMENTS)
48
+ end
49
+
50
+ def self.highlight_elements_mappings(klass)
51
+ inject_element_mappings(klass, HIGHLIGHT_ELEMENTS)
52
+ end
53
+
54
+ STYLED_CONTENT_ELEMENTS = [
55
+ *HIGHLIGHT_ELEMENTS,
56
+ [:disp_formula, "Sts::IsoSts::DispFormula", "disp-formula"],
57
+ [:disp_formula_group, "Sts::IsoSts::DispFormula", "disp-formula-group"],
58
+ [:std, "Sts::IsoSts::Std", "std"],
59
+ [:graphic, "Sts::IsoSts::Graphic", "graphic"],
60
+ [:list, "Sts::IsoSts::List", "list"],
61
+ [:def_list, "Sts::IsoSts::DefList", "def-list"],
62
+ [:fig, "Sts::IsoSts::Fig", "fig"],
63
+ [:boxed_text, "Sts::NisoSts::BoxedText", "boxed-text"],
64
+ [:email, "Sts::NisoSts::Email", "email"],
65
+ ].freeze
66
+
67
+ def self.styled_content_elements(klass)
68
+ inject_elements(klass, STYLED_CONTENT_ELEMENTS)
69
+ end
70
+
71
+ def self.styled_content_elements_mappings(klass)
72
+ inject_element_mappings(klass, STYLED_CONTENT_ELEMENTS)
73
+ end
74
+
75
+ P_ELEMENTS_EXTRA = [
76
+ [:non_normative_note, "Sts::IsoSts::NonNormativeNote",
77
+ "non-normative-note"],
78
+ [:non_normative_example, "Sts::IsoSts::NonNormativeExample",
79
+ "non-normative-example"],
80
+ [:math, "Sts::TbxIsoTml::Math", "math"],
81
+ [:preformat, "Sts::IsoSts::Preformat", "preformat"],
82
+ ].freeze
83
+
84
+ def self.p_elements(klass)
85
+ styled_content_elements(klass)
86
+ inject_elements(klass, P_ELEMENTS_EXTRA)
87
+ end
88
+
89
+ def self.p_elements_mappings(klass)
90
+ styled_content_elements_mappings(klass)
91
+ inject_element_mappings(klass, P_ELEMENTS_EXTRA)
92
+ end
93
+
94
+ PARA_LEVEL_ELEMENTS = [
95
+ [:label, "Sts::IsoSts::Label", "label"],
96
+ [:title, "Sts::IsoSts::Title", "title"],
97
+ [:p, "Sts::IsoSts::Paragraph", "p"],
98
+ [:list, "Sts::IsoSts::List", "list"],
99
+ [:def_list, "Sts::IsoSts::DefList", "def-list"],
100
+ [:disp_formula, "Sts::IsoSts::DispFormula", "disp-formula"],
101
+ [:inline_formula, "Sts::IsoSts::InlineFormula", "inline-formula"],
102
+ [:table_wrap, "Sts::TbxIsoTml::TableWrap", "table-wrap"],
103
+ [:fig, "Sts::IsoSts::Fig", "fig"],
104
+ [:non_normative_note, "Sts::IsoSts::NonNormativeNote",
105
+ "non-normative-note"],
106
+ [:non_normative_example, "Sts::IsoSts::NonNormativeExample",
107
+ "non-normative-example"],
108
+ [:preformat, "Sts::IsoSts::Preformat", "preformat"],
109
+ [:styled_content, "Sts::IsoSts::StyledContent", "styled-content"],
110
+ [:array, "Sts::IsoSts::Array", "array"],
111
+ [:graphic, "Sts::IsoSts::Graphic", "graphic"],
112
+ [:std, "Sts::IsoSts::Std", "std"],
113
+ [:ref_list, "Sts::IsoSts::RefList", "ref-list"],
114
+ [:fn_group, "Sts::IsoSts::FnGroup", "fn-group"],
115
+ [:xref, "Sts::TbxIsoTml::Xref", "xref"],
116
+ [:ext_link, "Sts::NisoSts::ExtLink", "ext-link"],
117
+ [:uri, "Sts::NisoSts::Uri", "uri"],
118
+ [:sec, "Sts::IsoSts::Sec", "sec"],
119
+ [:term_sec, "Sts::IsoSts::TermSec", "term-sec"],
120
+ [:disp_quote, "Sts::NisoSts::DispQuote", "disp-quote"],
121
+ [:fn, "Sts::TbxIsoTml::Fn", "fn"],
122
+ [:editing_instruction, "Sts::NisoSts::EditingInstruction",
123
+ "editing-instruction"],
124
+ ].freeze
125
+
126
+ def self.para_level(klass)
127
+ inject_elements(klass, PARA_LEVEL_ELEMENTS)
128
+ end
129
+
130
+ def self.para_level_mappings(klass)
131
+ inject_element_mappings(klass, PARA_LEVEL_ELEMENTS)
132
+ end
133
+
134
+ BODY_ELEMENTS = [
135
+ [:p, "Sts::IsoSts::Paragraph", "p"],
136
+ [:sec, "Sts::IsoSts::Sec", "sec"],
137
+ [:term_sec, "Sts::IsoSts::TermSec", "term-sec"],
138
+ [:list, "Sts::IsoSts::List", "list"],
139
+ [:def_list, "Sts::IsoSts::DefList", "def-list"],
140
+ [:disp_formula, "Sts::IsoSts::DispFormula", "disp-formula"],
141
+ [:table_wrap, "Sts::TbxIsoTml::TableWrap", "table-wrap"],
142
+ [:fig, "Sts::IsoSts::Fig", "fig"],
143
+ [:non_normative_note, "Sts::IsoSts::NonNormativeNote",
144
+ "non-normative-note"],
145
+ [:non_normative_example, "Sts::IsoSts::NonNormativeExample",
146
+ "non-normative-example"],
147
+ [:preformat, "Sts::IsoSts::Preformat", "preformat"],
148
+ [:styled_content, "Sts::IsoSts::StyledContent", "styled-content"],
149
+ [:array, "Sts::IsoSts::Array", "array"],
150
+ [:ref_list, "Sts::IsoSts::RefList", "ref-list"],
151
+ [:disp_quote, "Sts::NisoSts::DispQuote", "disp-quote"],
152
+ [:editing_instruction, "Sts::NisoSts::EditingInstruction",
153
+ "editing-instruction"],
154
+ ].freeze
155
+
156
+ def self.body_elements(klass)
157
+ inject_elements(klass, BODY_ELEMENTS)
158
+ end
159
+
160
+ def self.body_elements_mappings(klass)
161
+ inject_element_mappings(klass, BODY_ELEMENTS)
162
+ end
163
+
164
+ INSIDE_CELL_ELEMENTS = [
165
+ [:bold, "Sts::IsoSts::Bold", "bold"],
166
+ [:italic, "Sts::IsoSts::Italic", "italic"],
167
+ [:sub, "Sts::NisoSts::Sub", "sub"],
168
+ [:sup, "Sts::NisoSts::Sup", "sup"],
169
+ [:monospace, "Sts::NisoSts::Monospace", "monospace"],
170
+ [:sc, "Sts::NisoSts::Sc", "sc"],
171
+ [:underline, "Sts::NisoSts::Underline", "underline"],
172
+ [:overline, "Sts::NisoSts::Overline", "overline"],
173
+ [:roman, "Sts::NisoSts::Roman", "roman"],
174
+ [:sans_serif, "Sts::NisoSts::SansSerif", "sans-serif"],
175
+ [:strike, "Sts::NisoSts::Strike", "strike"],
176
+ [:xref, "Sts::TbxIsoTml::Xref", "xref"],
177
+ [:ext_link, "Sts::NisoSts::ExtLink", "ext-link"],
178
+ [:uri, "Sts::NisoSts::Uri", "uri"],
179
+ [:fn, "Sts::TbxIsoTml::Fn", "fn"],
180
+ [:styled_content, "Sts::IsoSts::StyledContent", "styled-content"],
181
+ [:array, "Sts::IsoSts::Array", "array"],
182
+ [:break, "Sts::IsoSts::Break", "break"],
183
+ [:target, "Sts::NisoSts::Target", "target"],
184
+ [:named_content, "Sts::NisoSts::NamedContent", "named-content"],
185
+ [:graphic, "Sts::IsoSts::Graphic", "graphic"],
186
+ [:list, "Sts::IsoSts::List", "list"],
187
+ [:def_list, "Sts::IsoSts::DefList", "def-list"],
188
+ [:p, "Sts::IsoSts::Paragraph", "p"],
189
+ [:non_normative_note, "Sts::IsoSts::NonNormativeNote",
190
+ "non-normative-note"],
191
+ [:non_normative_example, "Sts::IsoSts::NonNormativeExample",
192
+ "non-normative-example"],
193
+ [:inline_formula, "Sts::IsoSts::InlineFormula", "inline-formula"],
194
+ [:disp_formula, "Sts::IsoSts::DispFormula", "disp-formula"],
195
+ [:disp_formula_group, "Sts::IsoSts::DispFormula", "disp-formula-group"],
196
+ [:std, "Sts::IsoSts::Std", "std"],
197
+ [:fig, "Sts::IsoSts::Fig", "fig"],
198
+ [:math, "Sts::TbxIsoTml::Math", "math"],
199
+ [:ruby, "Sts::NisoSts::Ruby", "ruby"],
200
+ ].freeze
201
+
202
+ INSIDE_CELL_ATTRIBUTES = %i[id content_type style abbr axis headers scope
203
+ rowspan colspan align char charoff valign].freeze
204
+ INSIDE_CELL_ATTR_XML = {
205
+ id: "id", content_type: "content-type", style: "style",
206
+ abbr: "abbr", axis: "axis", headers: "headers", scope: "scope",
207
+ rowspan: "rowspan", colspan: "colspan", align: "align",
208
+ char: "char", charoff: "charoff", valign: "valign"
209
+ }.freeze
210
+
211
+ def self.inside_cell(klass)
212
+ inject_elements(klass, INSIDE_CELL_ELEMENTS)
213
+ end
214
+
215
+ def self.inside_cell_mappings(klass)
216
+ inject_element_mappings(klass, INSIDE_CELL_ELEMENTS)
217
+ end
218
+
219
+ def self.inside_cell_attributes(klass)
220
+ INSIDE_CELL_ATTRIBUTES.each do |name|
221
+ opts = case name
222
+ when :align then { values: EnumValues::ALIGN }
223
+ when :valign then { values: EnumValues::VALIGN }
224
+ when :scope then { values: EnumValues::SCOPE }
225
+ else {}
226
+ end
227
+ klass.attribute name, :string, **opts
228
+ end
229
+ end
230
+
231
+ def self.inside_cell_attribute_mappings(klass, char_value_map: false)
232
+ INSIDE_CELL_ATTR_XML.each do |name, xml_name|
233
+ opts = {}
234
+ if char_value_map && name == :char
235
+ opts[:value_map] = { to: { empty: :empty } }
236
+ end
237
+ klass.map_attribute xml_name, to: name, **opts
238
+ end
239
+ end
240
+
241
+ TABLE_GROUP_ATTRS = %i[id content_type style align char charoff
242
+ valign].freeze
243
+ TABLE_GROUP_ATTR_XML = {
244
+ id: "id", content_type: "content-type", style: "style",
245
+ align: "align", char: "char", charoff: "charoff", valign: "valign"
246
+ }.freeze
247
+
248
+ TABLE_COL_EXTRA_ATTRS = %i[span width].freeze
249
+ TABLE_COL_EXTRA_ATTR_XML = { span: "span", width: "width" }.freeze
250
+
251
+ def self.table_group_attributes(klass)
252
+ TABLE_GROUP_ATTRS.each do |name|
253
+ opts = case name
254
+ when :align then { values: EnumValues::ALIGN }
255
+ when :valign then { values: EnumValues::VALIGN }
256
+ else {}
257
+ end
258
+ klass.attribute name, :string, **opts
259
+ end
260
+ end
261
+
262
+ def self.table_group_attribute_mappings(klass, char_value_map: false)
263
+ TABLE_GROUP_ATTR_XML.each do |name, xml_name|
264
+ opts = {}
265
+ if char_value_map && name == :char
266
+ opts[:value_map] = { to: { empty: :empty } }
267
+ end
268
+ klass.map_attribute xml_name, to: name, **opts
269
+ end
270
+ end
271
+
272
+ def self.table_col_attributes(klass)
273
+ table_group_attributes(klass)
274
+ TABLE_COL_EXTRA_ATTRS.each { |name| klass.attribute name, :string }
275
+ end
276
+
277
+ def self.table_col_attribute_mappings(klass, char_value_map: false)
278
+ table_group_attribute_mappings(klass, char_value_map: char_value_map)
279
+ TABLE_COL_EXTRA_ATTR_XML.each do |name, xml_name|
280
+ klass.map_attribute xml_name, to: name
281
+ end
282
+ end
283
+ end
284
+ end
285
+ end
@@ -13,6 +13,7 @@ module Sts
13
13
 
14
14
  xml do
15
15
  element "def"
16
+ ordered
16
17
 
17
18
  map_attribute "rid", to: :rid
18
19
  map_attribute "id", to: :id
@@ -11,6 +11,7 @@ module Sts
11
11
 
12
12
  xml do
13
13
  element "def-item"
14
+ ordered
14
15
 
15
16
  map_attribute "id", to: :id
16
17
  map_attribute "specific-use", to: :specific_use
@@ -20,6 +20,7 @@ module Sts
20
20
 
21
21
  xml do
22
22
  element "def-list"
23
+ ordered
23
24
 
24
25
  map_attribute "id", to: :id
25
26
  map_attribute "list-type", to: :list_type