metanorma-utils 1.6.5 → 1.7.1
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 +4 -4
- data/Gemfile +2 -8
- data/lib/utils/image.rb +2 -183
- data/lib/utils/namespace.rb +26 -0
- data/lib/utils/version.rb +1 -1
- data/metanorma-utils.gemspec +0 -2
- metadata +3 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e00e0a899351896ba101b0522ec633f60959dd6a8ca8623c5f3b35445a9e8afb
|
4
|
+
data.tar.gz: 1b08d89297e4fc0dfff8dde93301389878cf2cb8a24789bab2876e77c059f62a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a8fc3672c7ab49cc9e6f49405e47e8df92308b6685e1d0b87ad58afc0377f00ece6e5384552d42eafe866bd40ea87d8c7e2fa935c455006d5d9b49e618527860
|
7
|
+
data.tar.gz: 344fae6f2c4499b43dfc12e4da4928cea45a727cc879ed49f6aba4f9fd6edf568c2e4beef40c7779b00a18980aba45e796a60b9f1599658a0516cf7647137bda
|
data/Gemfile
CHANGED
@@ -4,12 +4,6 @@ Encoding.default_internal = Encoding::UTF_8
|
|
4
4
|
source "https://rubygems.org"
|
5
5
|
git_source(:github) { |repo| "https://github.com/#{repo}" }
|
6
6
|
|
7
|
-
group :development, :test do
|
8
|
-
gem "rspec"
|
9
|
-
end
|
10
|
-
|
11
|
-
if File.exist? "Gemfile.devel"
|
12
|
-
eval File.read("Gemfile.devel"), nil, "Gemfile.devel" # rubocop:disable Security/Eval
|
13
|
-
end
|
14
|
-
|
15
7
|
gemspec
|
8
|
+
|
9
|
+
eval_gemfile("Gemfile.devel") rescue nil
|
data/lib/utils/image.rb
CHANGED
@@ -1,188 +1,7 @@
|
|
1
|
-
|
2
|
-
require "marcel"
|
3
|
-
require "base64"
|
1
|
+
require_relative "namespace"
|
4
2
|
|
5
3
|
module Metanorma
|
4
|
+
# Image methods were moved to the Vectory gem
|
6
5
|
module Utils
|
7
|
-
class << self
|
8
|
-
class Namespace
|
9
|
-
def initialize(xmldoc)
|
10
|
-
@namespace = xmldoc.root.namespace
|
11
|
-
end
|
12
|
-
|
13
|
-
def ns(path)
|
14
|
-
return path if @namespace.nil?
|
15
|
-
|
16
|
-
path.gsub(%r{/([a-zA-z])}, "/xmlns:\\1")
|
17
|
-
.gsub(%r{::([a-zA-z])}, "::xmlns:\\1")
|
18
|
-
.gsub(%r{\[([a-zA-z][a-z0-9A-Z@/]* ?=)}, "[xmlns:\\1")
|
19
|
-
.gsub(%r{\[([a-zA-z][a-z0-9A-Z@/]*\])}, "[xmlns:\\1")
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def save_dataimage(uri)
|
24
|
-
%r{^data:(?:image|application)/(?<imgtype>[^;]+);(?:charset=[^;]+;)?base64,(?<imgdata>.+)$} =~ uri
|
25
|
-
imgtype.sub!(/\+[a-z0-9]+$/, "") # svg+xml
|
26
|
-
imgtype = "png" unless /^[a-z0-9]+$/.match? imgtype
|
27
|
-
Tempfile.open(["image", ".#{imgtype}"]) do |f|
|
28
|
-
f.binmode
|
29
|
-
f.write(Base64.strict_decode64(imgdata))
|
30
|
-
f.path
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
SVG_NS = "http://www.w3.org/2000/svg".freeze
|
35
|
-
|
36
|
-
def svgmap_rewrite(xmldoc, localdirectory = "")
|
37
|
-
n = Namespace.new(xmldoc)
|
38
|
-
xmldoc.xpath(n.ns("//svgmap")).each_with_index do |s, i|
|
39
|
-
next unless svgmap_rewrite0(s, n, localdirectory, i)
|
40
|
-
next if s.at(n.ns("./target/eref"))
|
41
|
-
|
42
|
-
s.replace(s.at(n.ns("./figure")))
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def svgmap_rewrite0(svgmap, namespace, localdirectory, idx)
|
47
|
-
if (i = svgmap.at(namespace.ns(".//image"))) &&
|
48
|
-
(src = i["src"]) && !src.empty?
|
49
|
-
path = svgmap_rewrite0_path(src, localdirectory)
|
50
|
-
File.file?(path) or return false
|
51
|
-
svg = Nokogiri::XML(File.read(path, encoding: "utf-8"))
|
52
|
-
i.replace(svgmap_rewrite1(svgmap, svg.root, namespace, idx))
|
53
|
-
/^data:/.match(src) and i["src"] = datauri(path)
|
54
|
-
elsif i = svgmap.at(".//m:svg", "m" => SVG_NS)
|
55
|
-
i.replace(svgmap_rewrite1(svgmap, i, namespace, idx))
|
56
|
-
else return false
|
57
|
-
end
|
58
|
-
true
|
59
|
-
end
|
60
|
-
|
61
|
-
def svgmap_rewrite0_path(src, localdirectory)
|
62
|
-
if /^data:/.match?(src)
|
63
|
-
save_dataimage(src)
|
64
|
-
else
|
65
|
-
File.file?(src) ? src : localdirectory + src
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
def svgmap_rewrite1(svgmap, svg, namespace, idx)
|
70
|
-
svg_update_href(svgmap, svg, namespace)
|
71
|
-
svg_update_ids(svg, idx)
|
72
|
-
svg.xpath("processing-instruction()|.//processing-instruction()").remove
|
73
|
-
svg.to_xml
|
74
|
-
end
|
75
|
-
|
76
|
-
def svg_update_href(svgmap, svg, namespace)
|
77
|
-
targ = svgmap_rewrite1_targets(svgmap, namespace)
|
78
|
-
svg.xpath(".//m:a", "m" => SVG_NS).each do |a|
|
79
|
-
["xlink:href", "href"].each do |p|
|
80
|
-
a[p] and x = targ[File.expand_path(a[p])] and a[p] = x
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
def svgmap_rewrite1_targets(svgmap, namespace)
|
86
|
-
svgmap.xpath(namespace.ns("./target"))
|
87
|
-
.each_with_object({}) do |t, m|
|
88
|
-
x = t.at(namespace.ns("./xref")) and
|
89
|
-
m[File.expand_path(t["href"])] = "##{x['target']}"
|
90
|
-
x = t.at(namespace.ns("./link")) and
|
91
|
-
m[File.expand_path(t["href"])] = x["target"]
|
92
|
-
t.remove if t.at(namespace.ns("./xref | ./link"))
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
def svg_update_ids(svg, idx)
|
97
|
-
ids = svg.xpath("./@id | .//@id")
|
98
|
-
.each_with_object([]) { |i, m| m << i.value }
|
99
|
-
return if ids.empty?
|
100
|
-
|
101
|
-
svg_update_ids_attrs(svg, ids, idx)
|
102
|
-
svg_update_ids_css(svg, ids, idx)
|
103
|
-
end
|
104
|
-
|
105
|
-
def svg_update_ids_attrs(svg, ids, idx)
|
106
|
-
svg.xpath(". | .//*[@*]").each do |a|
|
107
|
-
a.attribute_nodes.each do |x|
|
108
|
-
ids.include?(x.value) and x.value += sprintf("_%09d", idx)
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
def svg_update_ids_css(svg, ids, idx)
|
114
|
-
svg.xpath("//m:style", "m" => SVG_NS).each do |s|
|
115
|
-
c = s.children.to_xml
|
116
|
-
ids.each do |i|
|
117
|
-
c = c.gsub(%r[##{i}\b],
|
118
|
-
sprintf("#%<id>s_%<idx>09d", id: i, idx: idx))
|
119
|
-
.gsub(%r(\[id\s*=\s*['"]?#{i}['"]?\]),
|
120
|
-
sprintf("[id='%<id>s_%<idx>09d']", id: i, idx: idx))
|
121
|
-
end
|
122
|
-
s.children = c
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
# sources/plantuml/plantuml20200524-90467-1iqek5i.png
|
127
|
-
# already includes localdir
|
128
|
-
# Check whether just the local path or the other specified relative path
|
129
|
-
# works.
|
130
|
-
def datauri(uri, local_dir = ".")
|
131
|
-
(datauri?(uri) || url?(uri)) and return uri
|
132
|
-
options = absolute_path?(uri) ? [uri] : [uri, File.join(local_dir, uri)]
|
133
|
-
path = options.detect do |p|
|
134
|
-
File.exist?(p) ? p : nil
|
135
|
-
end
|
136
|
-
path and return encode_datauri(path)
|
137
|
-
warn "Image specified at `#{uri}` does not exist."
|
138
|
-
uri # Return original provided location
|
139
|
-
end
|
140
|
-
|
141
|
-
def encode_datauri(path)
|
142
|
-
return nil unless File.exist?(path)
|
143
|
-
|
144
|
-
type = Marcel::MimeType.for(Pathname.new(path)) ||
|
145
|
-
'text/plain; charset="utf-8"'
|
146
|
-
|
147
|
-
bin = File.binread(path)
|
148
|
-
data = Base64.strict_encode64(bin)
|
149
|
-
"data:#{type};base64,#{data}"
|
150
|
-
rescue StandardError
|
151
|
-
warn "Data-URI encoding of `#{path}` failed."
|
152
|
-
nil
|
153
|
-
end
|
154
|
-
|
155
|
-
def datauri?(uri)
|
156
|
-
/^data:/.match?(uri)
|
157
|
-
end
|
158
|
-
|
159
|
-
def url?(url)
|
160
|
-
%r{^[A-Z]{2,}://}i.match?(url)
|
161
|
-
end
|
162
|
-
|
163
|
-
def absolute_path?(uri)
|
164
|
-
%r{^/}.match?(uri) || %r{^[A-Z]:/}.match?(uri)
|
165
|
-
end
|
166
|
-
|
167
|
-
def decode_datauri(uri)
|
168
|
-
%r{^data:(?<mimetype>[^;]+);base64,(?<mimedata>.+)$} =~ uri
|
169
|
-
return nil unless mimetype && mimedata
|
170
|
-
|
171
|
-
data = Base64.strict_decode64(mimedata)
|
172
|
-
{
|
173
|
-
type_declared: mimetype,
|
174
|
-
type_detected: Marcel::MimeType.for(data, declared_type: mimetype),
|
175
|
-
data: data,
|
176
|
-
}
|
177
|
-
end
|
178
|
-
|
179
|
-
# FIXME: This method should ONLY return 1 type, remove Array wrapper
|
180
|
-
def datauri2mime(uri)
|
181
|
-
output = decode_datauri(uri)
|
182
|
-
return nil unless output && output[:type_detected]
|
183
|
-
|
184
|
-
[output[:type_detected]]
|
185
|
-
end
|
186
|
-
end
|
187
6
|
end
|
188
7
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Metanorma
|
2
|
+
module Utils
|
3
|
+
class << self
|
4
|
+
# NOTE: It was used in methods of an eigenclass of Metanorma::Utils.
|
5
|
+
# Not sure if it's still used somewhere but could be.
|
6
|
+
class Namespace
|
7
|
+
def initialize(xmldoc)
|
8
|
+
@namespace = xmldoc.root.namespace
|
9
|
+
end
|
10
|
+
|
11
|
+
def ns(path)
|
12
|
+
return path if @namespace.nil?
|
13
|
+
|
14
|
+
path.gsub(%r{/([a-zA-Z])}, "/xmlns:\\1")
|
15
|
+
.gsub(%r{::([a-zA-Z])}, "::xmlns:\\1")
|
16
|
+
.gsub(%r{\[([a-zA-Z][a-z0-9A-Z@/]* ?=)}, "[xmlns:\\1")
|
17
|
+
.gsub(%r{\[([a-zA-Z][a-z0-9A-Z@/]*\])}, "[xmlns:\\1")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def create_namespace(xmldoc)
|
22
|
+
Namespace.new(xmldoc)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/utils/version.rb
CHANGED
data/metanorma-utils.gemspec
CHANGED
@@ -30,8 +30,6 @@ Gem::Specification.new do |spec|
|
|
30
30
|
spec.add_dependency "concurrent-ruby"
|
31
31
|
spec.add_dependency "csv"
|
32
32
|
spec.add_dependency "htmlentities", "~> 4.3.4"
|
33
|
-
spec.add_dependency "marcel", "~> 1.0.0"
|
34
|
-
spec.add_dependency "mime-types"
|
35
33
|
spec.add_dependency "nokogiri", ">= 1.11"
|
36
34
|
spec.add_dependency "sterile", "~> 1.0.14"
|
37
35
|
spec.add_dependency "uuidtools"
|
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.
|
4
|
+
version: 1.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-02-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: asciidoctor
|
@@ -66,34 +66,6 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 4.3.4
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: marcel
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: 1.0.0
|
76
|
-
type: :runtime
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: 1.0.0
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: mime-types
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :runtime
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
69
|
- !ruby/object:Gem::Dependency
|
98
70
|
name: nokogiri
|
99
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -324,6 +296,7 @@ files:
|
|
324
296
|
- lib/utils/image.rb
|
325
297
|
- lib/utils/log.rb
|
326
298
|
- lib/utils/main.rb
|
299
|
+
- lib/utils/namespace.rb
|
327
300
|
- lib/utils/version.rb
|
328
301
|
- lib/utils/xml.rb
|
329
302
|
- metanorma-utils.gemspec
|