metanorma-utils 1.11.3 → 1.11.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bb5a317fefc85b76b0442eadf4805403c76e68384b9ea22685941442db330a3f
4
- data.tar.gz: 01cf01d1d045ab721fdba705d79757af0e18dd025f67f070731a7029f1736c1e
3
+ metadata.gz: a8c2df70df3cd5a6bef631ad7d34473f3f1784a9f768d1888dc4ac97f11e9498
4
+ data.tar.gz: dc3a32cdeed25c29f9e4a417f13f955b34ce7b71e20fa8ccfd5266dc507c8e89
5
5
  SHA512:
6
- metadata.gz: be7834de49cb96791995188b265fb1cf97fa29366ff367931007ea4101233aa16317f5a31e4b4cb837b9ea6418f92c68df0848575d3ba6b3fce8e50c072e9571
7
- data.tar.gz: 2f2b23b525347b8cb07d2cba54376685357c1ef1b2d78120504f91e91fa10eef1c0298cf5c4ef03ef1e97ee43d9ac9340b4c2657d2196980dfd548ee1b4f7a94
6
+ metadata.gz: bc965c8edc5dc9cbfe074e27991a0866c94c237720c73e953352a471d214a542a515bef6f24d309c87d681ea6508d1d2183b0a9da89baeac37e1a97a75598db1
7
+ data.tar.gz: a6744e87b03d506a040d6b4dde5c4855012f15a85b5a454cc234a8ad3103f6aaf46829859f8156d297e5a32fc86c407698d657c27a5fda3792a9d647f7744995
data/lib/utils/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Metanorma
2
2
  module Utils
3
- VERSION = "1.11.3".freeze
3
+ VERSION = "1.11.4".freeze
4
4
  end
5
5
  end
data/lib/utils/xml.rb CHANGED
@@ -6,12 +6,6 @@ require "nokogiri"
6
6
 
7
7
  module Metanorma
8
8
  module Utils
9
- NAMECHAR = "\u0000-\u002c\u002f\u003a-\u0040\\u005b-\u005e" \
10
- "\u0060\u007b-\u00b6\u00b8-\u00bf\u00d7\u00f7\u037e" \
11
- "\u2000-\u200b" \
12
- "\u200e-\u203e\u2041-\u206f\u2190-\u2bff\u2ff0-\u3000".freeze
13
- NAMESTARTCHAR = "\\u002d\u002e\u0030-\u0039\u00b7\u0300-\u036f" \
14
- "\u203f-\u2040".freeze
15
9
  NOKOHEAD = <<~HERE.freeze
16
10
  <!DOCTYPE html SYSTEM
17
11
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
@@ -27,54 +21,112 @@ module Metanorma
27
21
  end
28
22
  end
29
23
 
30
- def to_ncname(tag, asciionly: true)
31
- asciionly and tag = HTMLEntities.new.encode(tag, :basic,
32
- :hexadecimal)
33
- start = tag[0]
34
- ret1 = if %r([#{NAMECHAR}#])o.match?(start)
35
- "_"
36
- else
37
- (%r([#{NAMESTARTCHAR}#])o.match?(start) ? "_#{start}" : start)
38
- end
39
- ret2 = tag[1..-1] || ""
40
- (ret1 || "") + ret2.gsub(%r([#{NAMECHAR}#])o, "_")
41
- end
42
-
43
- # Following XML requirements: https://www.w3.org/TR/REC-xml/#NT-Name
44
- TAG_NAME_START_CODEPOINTS = "@:A-Z_a-z\u{C0}-\u{D6}\u{D8}-\u{F6}\u{F8}-\u{2FF}\u{370}-\u{37D}\u{37F}-\u{1FFF}" \
45
- "\u{200C}-\u{200D}\u{2070}-\u{218F}\u{2C00}-\u{2FEF}\u{3001}-\u{D7FF}\u{F900}-\u{FDCF}" \
46
- "\u{FDF0}-\u{FFFD}\u{10000}-\u{EFFFF}"
47
- INVALID_TAG_NAME_START_REGEXP = /[^#{TAG_NAME_START_CODEPOINTS}]/
48
- TAG_NAME_FOLLOWING_CODEPOINTS = "#{TAG_NAME_START_CODEPOINTS}\\-.0-9\u{B7}\u{0300}-\u{036F}\u{203F}-\u{2040}"
49
- INVALID_TAG_NAME_FOLLOWING_REGEXP = /[^#{TAG_NAME_FOLLOWING_CODEPOINTS}]/
50
- SAFE_XML_TAG_NAME_REGEXP = /\A[#{TAG_NAME_START_CODEPOINTS}][#{TAG_NAME_FOLLOWING_CODEPOINTS}]*\z/
51
- TAG_NAME_REPLACEMENT_CHAR = "_"
52
-
53
- # from: https://github.com/rails/rails/blob/3235827585d87661942c91bc81f64f56d710f0b2/activesupport/lib/active_support/core_ext/erb/util.rb
54
- # A utility method for escaping XML names of tags and names of attributes.
24
+ # Following XML requirements for NCName: https://www.w3.org/TR/xml-names/#NT-NCName
25
+ BASECHAR = "A-Za-z\u{C0}-\u{D6}\u{D8}-\u{F6}\u{F8}-\u{FF}\u{100}-\u{131}\u{134}-\u{13E}" \
26
+ "\u{141}-\u{148}\u{14A}-\u{17E}\u{180}-\u{1C3}\u{1CD}-\u{1F0}\u{1F4}-\u{1F5}" \
27
+ "\u{1FA}-\u{217}\u{250}-\u{2A8}\u{2BB}-\u{2C1}\u{386}\u{388}-\u{38A}\u{38C}" \
28
+ "\u{38E}-\u{3A1}\u{3A3}-\u{3CE}\u{3D0}-\u{3D6}\u{3DA}\u{3DC}\u{3DE}\u{3E0}" \
29
+ "\u{3E2}-\u{3F3}\u{401}-\u{40C}\u{40E}-\u{44F}\u{451}-\u{45C}\u{45E}-\u{481}" \
30
+ "\u{490}-\u{4C4}\u{4C7}-\u{4C8}\u{4CB}-\u{4CC}\u{4D0}-\u{4EB}\u{4EE}-\u{4F5}" \
31
+ "\u{4F8}-\u{4F9}\u{531}-\u{556}\u{559}\u{561}-\u{586}\u{5D0}-\u{5EA}" \
32
+ "\u{5F0}-\u{5F2}\u{621}-\u{63A}\u{641}-\u{64A}\u{671}-\u{6B7}\u{6BA}-\u{6BE}" \
33
+ "\u{6C0}-\u{6CE}\u{6D0}-\u{6D3}\u{6D5}\u{6E5}-\u{6E6}\u{905}-\u{939}\u{93D}" \
34
+ "\u{958}-\u{961}\u{985}-\u{98C}\u{98F}-\u{990}\u{993}-\u{9A8}\u{9AA}-\u{9B0}" \
35
+ "\u{9B2}\u{9B6}-\u{9B9}\u{9DC}-\u{9DD}\u{9DF}-\u{9E1}\u{9F0}-\u{9F1}" \
36
+ "\u{A05}-\u{A0A}\u{A0F}-\u{A10}\u{A13}-\u{A28}\u{A2A}-\u{A30}\u{A32}-\u{A33}" \
37
+ "\u{A35}-\u{A36}\u{A38}-\u{A39}\u{A59}-\u{A5C}\u{A5E}\u{A72}-\u{A74}" \
38
+ "\u{A85}-\u{A8B}\u{A8D}\u{A8F}-\u{A91}\u{A93}-\u{AA8}\u{AAA}-\u{AB0}" \
39
+ "\u{AB2}-\u{AB3}\u{AB5}-\u{AB9}\u{ABD}\u{AE0}\u{B05}-\u{B0C}\u{B0F}-\u{B10}" \
40
+ "\u{B13}-\u{B28}\u{B2A}-\u{B30}\u{B32}-\u{B33}\u{B36}-\u{B39}\u{B3D}" \
41
+ "\u{B5C}-\u{B5D}\u{B5F}-\u{B61}\u{B85}-\u{B8A}\u{B8E}-\u{B90}\u{B92}-\u{B95}" \
42
+ "\u{B99}-\u{B9A}\u{B9C}\u{B9E}-\u{B9F}\u{BA3}-\u{BA4}\u{BA8}-\u{BAA}" \
43
+ "\u{BAE}-\u{BB5}\u{BB7}-\u{BB9}\u{C05}-\u{C0C}\u{C0E}-\u{C10}\u{C12}-\u{C28}" \
44
+ "\u{C2A}-\u{C33}\u{C35}-\u{C39}\u{C60}-\u{C61}\u{C85}-\u{C8C}\u{C8E}-\u{C90}" \
45
+ "\u{C92}-\u{CA8}\u{CAA}-\u{CB3}\u{CB5}-\u{CB9}\u{CDE}\u{CE0}-\u{CE1}" \
46
+ "\u{D05}-\u{D0C}\u{D0E}-\u{D10}\u{D12}-\u{D28}\u{D2A}-\u{D39}\u{D60}-\u{D61}" \
47
+ "\u{E01}-\u{E2E}\u{E30}\u{E32}-\u{E33}\u{E40}-\u{E45}\u{E81}-\u{E82}\u{E84}" \
48
+ "\u{E87}-\u{E88}\u{E8A}\u{E8D}\u{E94}-\u{E97}\u{E99}-\u{E9F}\u{EA1}-\u{EA3}" \
49
+ "\u{EA5}\u{EA7}\u{EAA}-\u{EAB}\u{EAD}-\u{EAE}\u{EB0}\u{EB2}-\u{EB3}\u{EBD}" \
50
+ "\u{EC0}-\u{EC4}\u{F40}-\u{F47}\u{F49}-\u{F69}\u{10A0}-\u{10C5}\u{10D0}-\u{10F6}" \
51
+ "\u{1100}\u{1102}-\u{1103}\u{1105}-\u{1107}\u{1109}\u{110B}-\u{110C}" \
52
+ "\u{110E}-\u{1112}\u{113C}\u{113E}\u{1140}\u{114C}\u{114E}\u{1150}" \
53
+ "\u{1154}-\u{1155}\u{1159}\u{115F}-\u{1161}\u{1163}\u{1165}\u{1167}\u{1169}" \
54
+ "\u{116D}-\u{116E}\u{1172}-\u{1173}\u{1175}\u{119E}\u{11A8}\u{11AB}" \
55
+ "\u{11AE}-\u{11AF}\u{11B7}-\u{11B8}\u{11BA}\u{11BC}-\u{11C2}\u{11EB}\u{11F0}" \
56
+ "\u{11F9}\u{1E00}-\u{1E9B}\u{1EA0}-\u{1EF9}\u{1F00}-\u{1F15}\u{1F18}-\u{1F1D}" \
57
+ "\u{1F20}-\u{1F45}\u{1F48}-\u{1F4D}\u{1F50}-\u{1F57}\u{1F59}\u{1F5B}\u{1F5D}" \
58
+ "\u{1F5F}-\u{1F7D}\u{1F80}-\u{1FB4}\u{1FB6}-\u{1FBC}\u{1FBE}\u{1FC2}-\u{1FC4}" \
59
+ "\u{1FC6}-\u{1FCC}\u{1FD0}-\u{1FD3}\u{1FD6}-\u{1FDB}\u{1FE0}-\u{1FEC}" \
60
+ "\u{1FF2}-\u{1FF4}\u{1FF6}-\u{1FFC}\u{2126}\u{212A}-\u{212B}\u{212E}" \
61
+ "\u{2180}-\u{2182}\u{3041}-\u{3094}\u{30A1}-\u{30FA}\u{3105}-\u{312C}" \
62
+ "\u{AC00}-\u{D7A3}".freeze
63
+ IDEOGRAPHIC = "\u{4E00}-\u{9FA5}\u{3007}\u{3021}-\u{3029}".freeze
64
+ LETTER = "#{BASECHAR}#{IDEOGRAPHIC}".freeze
65
+ DIGIT = "0-9\u{0660}-\u{0669}\u{06F0}-\u{06F9}\u{0966}-\u{096F}\u{09E6}-\u{09EF}" \
66
+ "\u{0A66}-\u{0A6F}\u{0AE6}-\u{0AEF}\u{0B66}-\u{0B6F}\u{0BE7}-\u{0BEF}" \
67
+ "\u{0C66}-\u{0C6F}\u{0CE6}-\u{0CEF}\u{0D66}-\u{0D6F}\u{0E50}-\u{0E59}" \
68
+ "\u{0ED0}-\u{0ED9}\u{0F20}-\u{0F29}".freeze
69
+ COMBINING_CHAR = "\u{0300}-\u{0345}\u{0360}-\u{0361}\u{0483}-\u{0486}\u{0591}-\u{05A1}" \
70
+ "\u{05A3}-\u{05B9}\u{05BB}-\u{05BD}\u{05BF}\u{05C1}-\u{05C2}\u{05C4}" \
71
+ "\u{064B}-\u{0652}\u{0670}\u{06D6}-\u{06DC}\u{06DD}-\u{06DF}" \
72
+ "\u{06E0}-\u{06E4}\u{06E7}-\u{06E8}\u{06EA}-\u{06ED}\u{0901}-\u{0903}" \
73
+ "\u{093C}\u{093E}-\u{094C}\u{094D}\u{0951}-\u{0954}\u{0962}-\u{0963}" \
74
+ "\u{0981}-\u{0983}\u{09BC}\u{09BE}\u{09BF}\u{09C0}-\u{09C4}" \
75
+ "\u{09C7}-\u{09C8}\u{09CB}-\u{09CD}\u{09D7}\u{09E2}-\u{09E3}\u{0A02}" \
76
+ "\u{0A3C}\u{0A3E}\u{0A3F}\u{0A40}-\u{0A42}\u{0A47}-\u{0A48}" \
77
+ "\u{0A4B}-\u{0A4D}\u{0A70}-\u{0A71}\u{0A81}-\u{0A83}\u{0ABC}" \
78
+ "\u{0ABE}-\u{0AC5}\u{0AC7}-\u{0AC9}\u{0ACB}-\u{0ACD}\u{0B01}-\u{0B03}" \
79
+ "\u{0B3C}\u{0B3E}-\u{0B43}\u{0B47}-\u{0B48}\u{0B4B}-\u{0B4D}" \
80
+ "\u{0B56}-\u{0B57}\u{0B82}-\u{0B83}\u{0BBE}-\u{0BC2}\u{0BC6}-\u{0BC8}" \
81
+ "\u{0BCA}-\u{0BCD}\u{0BD7}\u{0C01}-\u{0C03}\u{0C3E}-\u{0C44}" \
82
+ "\u{0C46}-\u{0C48}\u{0C4A}-\u{0C4D}\u{0C55}-\u{0C56}\u{0C82}-\u{0C83}" \
83
+ "\u{0CBE}-\u{0CC4}\u{0CC6}-\u{0CC8}\u{0CCA}-\u{0CCD}\u{0CD5}-\u{0CD6}" \
84
+ "\u{0D02}-\u{0D03}\u{0D3E}-\u{0D43}\u{0D46}-\u{0D48}\u{0D4A}-\u{0D4D}" \
85
+ "\u{0D57}\u{0E31}\u{0E34}-\u{0E3A}\u{0E47}-\u{0E4E}\u{0EB1}" \
86
+ "\u{0EB4}-\u{0EB9}\u{0EBB}-\u{0EBC}\u{0EC8}-\u{0ECD}\u{0F18}-\u{0F19}" \
87
+ "\u{0F35}\u{0F37}\u{0F39}\u{0F3E}\u{0F3F}\u{0F71}-\u{0F84}" \
88
+ "\u{0F86}-\u{0F8B}\u{0F90}-\u{0F95}\u{0F97}\u{0F99}-\u{0FAD}" \
89
+ "\u{0FB1}-\u{0FB7}\u{0FB9}\u{20D0}-\u{20DC}\u{20E1}\u{302A}-\u{302F}" \
90
+ "\u{3099}\u{309A}".freeze
91
+ EXTENDER = "\u{00B7}\u{02D0}\u{02D1}\u{0387}\u{0640}\u{0E46}\u{0EC6}\u{3005}" \
92
+ "\u{3031}-\u{3035}\u{309D}-\u{309E}\u{30FC}-\u{30FE}".freeze
93
+
94
+ # NCName specific constants - NCName is "an XML Name, minus the :"
95
+ # NCName = (Letter | '_') (NCNameChar)*
96
+ NCNAME_START_CHAR = "#{LETTER}_".freeze
97
+ NCNAME_CHAR = "#{LETTER}#{DIGIT}._\\-#{COMBINING_CHAR}#{EXTENDER}".freeze
98
+ INVALID_NCNAME_START_REGEXP = /[^#{NCNAME_START_CHAR}]/.freeze
99
+ INVALID_NCNAME_CHAR_REGEXP = /[^#{NCNAME_CHAR}]/.freeze
100
+ SAFE_NCNAME_REGEXP = /\A[#{NCNAME_START_CHAR}][#{NCNAME_CHAR}]*\z/.freeze
101
+ NCNAME_INVALID = "_".freeze
102
+
103
+ # A utility method for escaping XML NCNames (XML Names without colons).
55
104
  #
56
- # xml_name_escape('1 < 2 & 3')
105
+ # to_ncname('1 < 2 & 3')
57
106
  # # => "1___2___3"
58
107
  #
59
- # It follows the requirements of the specification: https://www.w3.org/TR/REC-xml/#NT-Name
60
- def to_ncname(name, asciionly: true)
61
- name = name.to_s
62
- return "" if name.nil? || name.empty?
63
- return name if name.match?(SAFE_XML_TAG_NAME_REGEXP)
64
-
108
+ # It follows the requirements of the specification for NCName: https://www.w3.org/TR/xml-names/#NT-NCName
109
+ # NCName is "an XML Name, minus the :"
110
+ def to_ncname(name, asciionly: false)
111
+ name, valid = to_ncname_prep(name, asciionly)
112
+ valid and return name
65
113
  starting_char = name[0]
66
- starting_char.gsub!(INVALID_TAG_NAME_START_REGEXP,
67
- TAG_NAME_REPLACEMENT_CHAR)
68
-
69
- return starting_char if name.size == 1
70
-
114
+ starting_char.gsub!(INVALID_NCNAME_START_REGEXP, NCNAME_INVALID)
115
+ name.size == 1 and return starting_char
71
116
  following_chars = name[1..-1]
72
- following_chars.gsub!(INVALID_TAG_NAME_FOLLOWING_REGEXP,
73
- TAG_NAME_REPLACEMENT_CHAR)
74
-
117
+ following_chars.gsub!(INVALID_NCNAME_CHAR_REGEXP, NCNAME_INVALID)
118
+ following_chars.gsub!(":", NCNAME_INVALID)
75
119
  starting_char << following_chars
76
120
  end
77
121
 
122
+ def to_ncname_prep(name, asciionly)
123
+ name = name&.to_s
124
+ name.nil? and name = ""
125
+ asciionly and name = HTMLEntities.new.encode(name,
126
+ :basic, :hexadecimal)
127
+ [name, name.nil? || name.empty? || name.match?(SAFE_NCNAME_REGEXP)]
128
+ end
129
+
78
130
  def anchor_or_uuid(node = nil)
79
131
  uuid = UUIDTools::UUID.random_create
80
132
  node.nil? || node.id.nil? || node.id.empty? ? "_#{uuid}" : node.id
@@ -42,11 +42,10 @@ Gem::Specification.new do |spec|
42
42
  spec.add_development_dependency "rake", "~> 13.0"
43
43
  spec.add_development_dependency "rspec", "~> 3.6"
44
44
  spec.add_development_dependency "rubocop", "~> 1"
45
- spec.add_development_dependency "rubocop-performance"
45
+ spec.add_development_dependency "rubocop-performance"
46
46
  spec.add_development_dependency "simplecov", "~> 0.15"
47
47
  spec.add_development_dependency "timecop", "~> 0.9"
48
- spec.add_development_dependency "vcr", "~> 6.1.0"
49
48
  spec.add_development_dependency "webmock"
50
49
  spec.add_development_dependency "xml-c14n"
51
- #spec.metadata["rubygems_mfa_required"] = "true"
50
+ # spec.metadata["rubygems_mfa_required"] = "true"
52
51
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metanorma-utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.11.3
4
+ version: 1.11.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-05-26 00:00:00.000000000 Z
11
+ date: 2025-06-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciidoctor
@@ -262,20 +262,6 @@ dependencies:
262
262
  - - "~>"
263
263
  - !ruby/object:Gem::Version
264
264
  version: '0.9'
265
- - !ruby/object:Gem::Dependency
266
- name: vcr
267
- requirement: !ruby/object:Gem::Requirement
268
- requirements:
269
- - - "~>"
270
- - !ruby/object:Gem::Version
271
- version: 6.1.0
272
- type: :development
273
- prerelease: false
274
- version_requirements: !ruby/object:Gem::Requirement
275
- requirements:
276
- - - "~>"
277
- - !ruby/object:Gem::Version
278
- version: 6.1.0
279
265
  - !ruby/object:Gem::Dependency
280
266
  name: webmock
281
267
  requirement: !ruby/object:Gem::Requirement