stepmod-utils 0.3.22 → 0.3.24
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -0
- data/exe/stepmod-annotate-all +1 -1
- data/exe/stepmod-extract-terms +14 -6
- data/exe/stepmod-extract-yaml-terms +149 -0
- data/lib/stepmod/utils/concept.rb +42 -12
- data/lib/stepmod/utils/converters/express_figure.rb +25 -0
- data/lib/stepmod/utils/converters/express_table.rb +25 -0
- data/lib/stepmod/utils/converters/figure.rb +19 -1
- data/lib/stepmod/utils/converters/module_ref.rb +55 -17
- data/lib/stepmod/utils/converters/module_ref_express_description.rb +44 -2
- data/lib/stepmod/utils/converters/table.rb +14 -1
- data/lib/stepmod/utils/express_bibdata.rb +111 -0
- data/lib/stepmod/utils/smrl_description_converter.rb +1 -0
- data/lib/stepmod/utils/smrl_resource_converter.rb +2 -1
- data/lib/stepmod/utils/stepmod_definition_converter.rb +1 -0
- data/lib/stepmod/utils/stepmod_file_annotator.rb +236 -12
- data/lib/stepmod/utils/term.rb +18 -5
- data/lib/stepmod/utils/terms_extractor.rb +253 -298
- data/lib/stepmod/utils/version.rb +1 -1
- data/stepmod-utils.gemspec +2 -1
- metadata +25 -6
@@ -0,0 +1,111 @@
|
|
1
|
+
module Stepmod
|
2
|
+
module Utils
|
3
|
+
class ExpressBibdata
|
4
|
+
DOCNUMBER = 10303
|
5
|
+
|
6
|
+
attr_accessor *%w(
|
7
|
+
type doctype part title_en version pub_year pubid published_info number
|
8
|
+
)
|
9
|
+
|
10
|
+
def initialize(schema:)
|
11
|
+
# module, resource, application_protocol, business_object_model
|
12
|
+
# @type = document.name
|
13
|
+
|
14
|
+
# raise "UnknownFileError" unless %w(module resource
|
15
|
+
# application_protocol business_object_model).include?(@type)
|
16
|
+
|
17
|
+
@published_info = schema.find("__published_in")&.remarks&.first
|
18
|
+
@number = schema.find("__identifier")&.remarks&.first&.split("N")&.last
|
19
|
+
@schema = schema
|
20
|
+
|
21
|
+
if !published_info.nil?
|
22
|
+
@pubid = Pubid::Iso::Identifier.parse(published_info)
|
23
|
+
|
24
|
+
@part = pubid.part
|
25
|
+
@version = pubid.edition
|
26
|
+
@pub_year = pubid.year
|
27
|
+
elsif !schema.version.nil?
|
28
|
+
@part = schema.version.items.find { |i| i.name == "part" }.value
|
29
|
+
@version = schema.version.items.find { |i| i.name == "part" }.value
|
30
|
+
@pub_year = schema.version.items.find { |i| i.name == "part" }.value
|
31
|
+
else
|
32
|
+
raise "PublishedInfoNotFound"
|
33
|
+
end
|
34
|
+
|
35
|
+
@doctype = schema.find("__status")&.remarks&.first
|
36
|
+
self
|
37
|
+
end
|
38
|
+
|
39
|
+
def title_en
|
40
|
+
@title_en ||= @schema.find("__title")
|
41
|
+
.remarks
|
42
|
+
.first
|
43
|
+
.gsub("_", " ")
|
44
|
+
.capitalize
|
45
|
+
.gsub("2d", "2D")
|
46
|
+
.gsub("3d", "3D")
|
47
|
+
end
|
48
|
+
|
49
|
+
def docid
|
50
|
+
no_date = case doctype
|
51
|
+
when "IS"
|
52
|
+
"ISO #{DOCNUMBER}-#{part}"
|
53
|
+
when "WD"
|
54
|
+
"ISO/WD #{DOCNUMBER}-#{part}"
|
55
|
+
when "CD"
|
56
|
+
"ISO/CD #{DOCNUMBER}-#{part}"
|
57
|
+
when "DIS"
|
58
|
+
"ISO/DIS #{DOCNUMBER}-#{part}"
|
59
|
+
when "FDIS"
|
60
|
+
"ISO/FDIS #{DOCNUMBER}-#{part}"
|
61
|
+
when "TS"
|
62
|
+
"ISO/TS #{DOCNUMBER}-#{part}"
|
63
|
+
when "CD-TS"
|
64
|
+
"ISO/CD TS #{DOCNUMBER}-#{part}"
|
65
|
+
else
|
66
|
+
"UNKNOWN DOCTYPE: (#{doctype})"
|
67
|
+
end
|
68
|
+
|
69
|
+
if pub_year
|
70
|
+
"#{no_date}:#{pub_year}"
|
71
|
+
else
|
72
|
+
no_date
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def part_title
|
77
|
+
case part
|
78
|
+
when [200..299]
|
79
|
+
"Application protocol: #{title_en}"
|
80
|
+
when [300..399]
|
81
|
+
"Abstract test suite: #{title_en}"
|
82
|
+
when [400..499]
|
83
|
+
"Application module: #{title_en}"
|
84
|
+
when [500..599]
|
85
|
+
"Application interpreted construct: #{title_en}"
|
86
|
+
when [1000..1799]
|
87
|
+
"Application module: #{title_en}"
|
88
|
+
else
|
89
|
+
title_en
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def full_title
|
94
|
+
"Industrial automation systems and integration -- Product data" \
|
95
|
+
" representation and exchange -- Part #{part}: #{part_title}"
|
96
|
+
end
|
97
|
+
|
98
|
+
def anchor
|
99
|
+
docid.gsub("/", "-").gsub(" ", "_").gsub(":", "_")
|
100
|
+
end
|
101
|
+
|
102
|
+
def to_mn_adoc
|
103
|
+
if title_en
|
104
|
+
"* [[[#{anchor},#{docid}]]], _#{full_title}_"
|
105
|
+
else
|
106
|
+
"* [[[#{anchor},#{docid}]]]"
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -15,6 +15,7 @@ require "stepmod/utils/converters/ext_descriptions"
|
|
15
15
|
require "stepmod/utils/converters/head"
|
16
16
|
require "stepmod/utils/converters/hr"
|
17
17
|
require "stepmod/utils/converters/ignore"
|
18
|
+
require "stepmod/utils/converters/module_ref_express_description"
|
18
19
|
require "stepmod/utils/converters/note"
|
19
20
|
require "stepmod/utils/converters/p"
|
20
21
|
require "stepmod/utils/converters/pass_through"
|
@@ -15,6 +15,7 @@ require "stepmod/utils/converters/dt"
|
|
15
15
|
require "stepmod/utils/converters/drop"
|
16
16
|
require "stepmod/utils/converters/example"
|
17
17
|
require "stepmod/utils/converters/express_g"
|
18
|
+
require "stepmod/utils/converters/figure"
|
18
19
|
require "stepmod/utils/converters/fund_cons"
|
19
20
|
require "stepmod/utils/converters/eqn"
|
20
21
|
require "stepmod/utils/converters/head"
|
@@ -25,6 +26,7 @@ require "stepmod/utils/converters/note"
|
|
25
26
|
require "stepmod/utils/converters/ol"
|
26
27
|
require "stepmod/utils/converters/p"
|
27
28
|
require "stepmod/utils/converters/pass_through"
|
29
|
+
require "stepmod/utils/converters/module_ref"
|
28
30
|
require "stepmod/utils/converters/q"
|
29
31
|
require "stepmod/utils/converters/resource"
|
30
32
|
require "stepmod/utils/converters/schema_diag"
|
@@ -36,7 +38,6 @@ require "stepmod/utils/converters/table"
|
|
36
38
|
require "stepmod/utils/converters/text"
|
37
39
|
require "stepmod/utils/cleaner"
|
38
40
|
|
39
|
-
require "reverse_adoc/converters/figure"
|
40
41
|
require "reverse_adoc/converters/img"
|
41
42
|
require "reverse_adoc/converters/li"
|
42
43
|
require "reverse_adoc/converters/tr"
|
@@ -17,6 +17,7 @@ require "stepmod/utils/converters/term"
|
|
17
17
|
require "stepmod/utils/converters/synonym"
|
18
18
|
require "stepmod/utils/converters/uof"
|
19
19
|
require "stepmod/utils/converters/figure"
|
20
|
+
require "stepmod/utils/converters/table"
|
20
21
|
require "stepmod/utils/cleaner"
|
21
22
|
|
22
23
|
require "reverse_adoc/converters/a"
|
@@ -3,6 +3,11 @@ require "stepmod/utils/smrl_description_converter"
|
|
3
3
|
require "stepmod/utils/smrl_resource_converter"
|
4
4
|
require "stepmod/utils/converters/express_note"
|
5
5
|
require "stepmod/utils/converters/express_example"
|
6
|
+
require "stepmod/utils/converters/express_figure"
|
7
|
+
require "stepmod/utils/converters/express_table"
|
8
|
+
require "expressir"
|
9
|
+
require "expressir/express/parser"
|
10
|
+
require "pubid-iso"
|
6
11
|
|
7
12
|
module Stepmod
|
8
13
|
module Utils
|
@@ -15,26 +20,37 @@ module Stepmod
|
|
15
20
|
@express_file = express_file
|
16
21
|
@resource_docs_cache_file = resource_docs_cache_file
|
17
22
|
@stepmod_dir = stepmod_dir || Dir.pwd
|
23
|
+
@added_bibdata = {}
|
24
|
+
|
25
|
+
@schema_name = Expressir::Express::Parser.from_file(express_file)
|
26
|
+
.schemas
|
27
|
+
.first
|
28
|
+
.id
|
18
29
|
end
|
19
30
|
|
20
31
|
def call
|
21
32
|
match = File.basename(express_file).match('^(arm|mim|bom)\.exp$')
|
22
33
|
descriptions_base = match ? "#{match.captures[0]}_descriptions.xml" : "descriptions.xml"
|
34
|
+
|
23
35
|
descriptions_file = File.join(File.dirname(express_file),
|
24
36
|
descriptions_base)
|
37
|
+
|
25
38
|
output_express = File.read(express_file)
|
26
|
-
|
39
|
+
converted_description = ""
|
40
|
+
base_linked = ""
|
27
41
|
|
28
42
|
if File.exists?(descriptions_file)
|
29
43
|
descriptions = Nokogiri::XML(File.read(descriptions_file)).root
|
30
44
|
added_resource_descriptions = {}
|
45
|
+
|
31
46
|
descriptions.xpath("ext_description").each do |description|
|
32
47
|
# Add base resource from linked path if exists, eg "language_schema.language.wr:WR1" -> "language_schema"
|
33
48
|
base_linked = description["linkend"].to_s.split(".").first
|
49
|
+
|
34
50
|
if added_resource_descriptions[base_linked].nil?
|
35
51
|
base_reource_doc_dir = resource_docs_cache[description["linkend"].to_s.split(".").first]
|
36
52
|
if base_reource_doc_dir
|
37
|
-
|
53
|
+
converted_description << convert_from_resource_file(
|
38
54
|
base_reource_doc_dir, stepmod_dir, base_linked, descriptions_file
|
39
55
|
)
|
40
56
|
end
|
@@ -45,7 +61,7 @@ module Stepmod
|
|
45
61
|
# when a schema description is available from resource.xml and also descriptions.xml, the description from resource.xml is only used.
|
46
62
|
# https://github.com/metanorma/annotated-express/issues/32#issuecomment-792609078
|
47
63
|
if description.text.strip.length.positive? && resource_docs_dir.nil?
|
48
|
-
|
64
|
+
converted_description << convert_from_description_text(
|
49
65
|
descriptions_file, description
|
50
66
|
)
|
51
67
|
end
|
@@ -58,26 +74,70 @@ module Stepmod
|
|
58
74
|
end
|
59
75
|
end
|
60
76
|
|
61
|
-
|
77
|
+
bib_file_name = extract_bib_file_name(match, resource_docs_cache[@schema_name || ""])
|
78
|
+
bib_file = if match
|
79
|
+
File.join(File.dirname(express_file), bib_file_name)
|
80
|
+
else
|
81
|
+
resource_docs_file_path(stepmod_dir, bib_file_name)
|
82
|
+
end
|
83
|
+
|
84
|
+
output_express << if bib_file && File.exists?(bib_file)
|
85
|
+
prepend_bibdata(
|
86
|
+
converted_description || "",
|
87
|
+
# bib_file will not be present for resouces
|
88
|
+
# that are not in resource_docs cache.
|
89
|
+
# e.g hierarchy_schema
|
90
|
+
bib_file,
|
91
|
+
@schema_name,
|
92
|
+
match,
|
93
|
+
)
|
94
|
+
else
|
95
|
+
converted_description
|
96
|
+
end
|
97
|
+
|
98
|
+
sanitize(output_express)
|
99
|
+
rescue StandardError => e
|
100
|
+
puts "[ERROR]!!! #{e.message}"
|
101
|
+
puts e.backtrace
|
62
102
|
end
|
63
103
|
|
64
104
|
private
|
65
105
|
|
106
|
+
def sanitize(file_content)
|
107
|
+
file_content.gsub("(*)", "(`*`)")
|
108
|
+
end
|
109
|
+
|
110
|
+
def resource_docs_cache
|
111
|
+
@resource_docs_cache ||= JSON.parse(File.read(resource_docs_cache_file))
|
112
|
+
end
|
113
|
+
|
66
114
|
def convert_from_description_text(descriptions_file, description)
|
67
115
|
Dir.chdir(File.dirname(descriptions_file)) do
|
68
116
|
wrapper = "<ext_descriptions>#{description}</ext_descriptions>"
|
69
117
|
notes = description.xpath("note")
|
70
118
|
examples = description.xpath("example")
|
119
|
+
figures = description.xpath("figure")
|
120
|
+
tables = description.xpath("table")
|
71
121
|
|
72
122
|
converted_description = <<~DESCRIPTION
|
73
123
|
|
74
124
|
#{Stepmod::Utils::SmrlDescriptionConverter.convert(wrapper, no_notes_examples: true)}
|
75
125
|
DESCRIPTION
|
76
126
|
|
77
|
-
|
78
|
-
|
127
|
+
if description["linkend"].nil?
|
128
|
+
raise StandardError.new("[stepmod-file-annotator] ERROR: no linkend for #{descriptions_file}!")
|
129
|
+
end
|
130
|
+
|
131
|
+
converted_figures = figures.map do |figure|
|
132
|
+
Stepmod::Utils::Converters::ExpressFigure
|
79
133
|
.new
|
80
|
-
.convert(
|
134
|
+
.convert(figure, schema_and_entity: description["linkend"])
|
135
|
+
end.join
|
136
|
+
|
137
|
+
converted_tables = tables.map do |table|
|
138
|
+
Stepmod::Utils::Converters::ExpressTable
|
139
|
+
.new
|
140
|
+
.convert(table, schema_and_entity: description["linkend"])
|
81
141
|
end.join
|
82
142
|
|
83
143
|
converted_notes = notes.map do |note|
|
@@ -86,22 +146,186 @@ module Stepmod
|
|
86
146
|
.convert(note, schema_and_entity: description["linkend"])
|
87
147
|
end.join
|
88
148
|
|
89
|
-
|
149
|
+
converted_examples = examples.map do |example|
|
150
|
+
Stepmod::Utils::Converters::ExpressExample
|
151
|
+
.new
|
152
|
+
.convert(example, schema_and_entity: description["linkend"])
|
153
|
+
end.join
|
154
|
+
|
155
|
+
[
|
156
|
+
converted_description,
|
157
|
+
converted_figures,
|
158
|
+
converted_tables,
|
159
|
+
converted_examples,
|
160
|
+
converted_notes,
|
161
|
+
].join("")
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
def prepend_bibdata(description, bibdata_file, schema_and_entity, match)
|
166
|
+
bib = Nokogiri::XML(File.read(bibdata_file)).root
|
167
|
+
bibdata = extract_bib_data(match, bib, schema_and_entity)
|
168
|
+
|
169
|
+
return description.to_s if @added_bibdata[schema_and_entity]
|
170
|
+
|
171
|
+
published_in = <<~PUBLISHED_IN
|
172
|
+
|
173
|
+
(*"#{schema_and_entity}.__published_in"
|
174
|
+
#{bibdata[:identifier]}
|
175
|
+
*)
|
176
|
+
PUBLISHED_IN
|
177
|
+
|
178
|
+
identifier = <<~IDENTIFIER if bibdata[:number]
|
179
|
+
(*"#{schema_and_entity}.__identifier"
|
180
|
+
ISO/TC 184/SC 4/WG 12 N#{bibdata[:number]}
|
181
|
+
*)
|
182
|
+
IDENTIFIER
|
183
|
+
|
184
|
+
supersedes = <<~SUPERSEDES if bibdata[:supersedes_concept]
|
185
|
+
(*"#{schema_and_entity}.__supersedes"
|
186
|
+
ISO/TC 184/SC 4/WG 12 N#{bibdata[:supersedes_concept]}
|
187
|
+
*)
|
188
|
+
SUPERSEDES
|
189
|
+
|
190
|
+
status = <<~STATUS if bibdata[:status]
|
191
|
+
(*"#{schema_and_entity}.__status"
|
192
|
+
#{bibdata[:status]}
|
193
|
+
*)
|
194
|
+
STATUS
|
195
|
+
|
196
|
+
title = <<~TITLE if bibdata[:title]
|
197
|
+
(*"#{schema_and_entity}.__title"
|
198
|
+
#{bibdata[:title]}
|
199
|
+
*)
|
200
|
+
TITLE
|
201
|
+
|
202
|
+
document = <<~DOCUMENT if bibdata_file
|
203
|
+
(*"#{schema_and_entity}.__schema_file"
|
204
|
+
#{Pathname(bibdata_file).relative_path_from(@stepmod_dir)}
|
205
|
+
*)
|
206
|
+
DOCUMENT
|
207
|
+
|
208
|
+
@added_bibdata[schema_and_entity] = true
|
209
|
+
|
210
|
+
[
|
211
|
+
published_in,
|
212
|
+
identifier,
|
213
|
+
supersedes,
|
214
|
+
status,
|
215
|
+
title,
|
216
|
+
description,
|
217
|
+
document,
|
218
|
+
].compact.join("\n")
|
219
|
+
end
|
220
|
+
|
221
|
+
def module?(match)
|
222
|
+
match && %w[arm mim].include?(match.captures[0])
|
223
|
+
end
|
224
|
+
|
225
|
+
def bom?(match)
|
226
|
+
match && %w[bom].include?(match.captures[0])
|
227
|
+
end
|
228
|
+
|
229
|
+
def extract_bib_file_name(match, default_file_name = "")
|
230
|
+
return default_file_name || "" unless match
|
231
|
+
|
232
|
+
if %w[arm mim].include?(match.captures[0])
|
233
|
+
"module.xml"
|
234
|
+
else
|
235
|
+
"business_object_model.xml"
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
def extract_bib_data(match, bib, schema_and_entity)
|
240
|
+
return resource_bib_data(bib, schema_and_entity) unless match
|
241
|
+
|
242
|
+
if module?(match)
|
243
|
+
module_bib_data(bib, match.captures[0])
|
244
|
+
elsif bom?(match)
|
245
|
+
bom_bib_data(bib)
|
90
246
|
end
|
91
247
|
end
|
92
248
|
|
249
|
+
def identifier(bib)
|
250
|
+
part = bib.attributes["part"].value
|
251
|
+
year = bib.attributes["publication.year"].value
|
252
|
+
|
253
|
+
# year="tbd" in data/modules/geometric_tolerance/module.xml and
|
254
|
+
# probabaly in some other places as well
|
255
|
+
year = "" if year == "tbd"
|
256
|
+
edition = bib.attributes["version"].value
|
257
|
+
|
258
|
+
pubid = Pubid::Iso::Identifier.new(
|
259
|
+
publisher: "ISO",
|
260
|
+
number: 10303,
|
261
|
+
)
|
262
|
+
|
263
|
+
pubid.part = part if part && !part.empty?
|
264
|
+
pubid.year = year.split("-").first if year && !year.empty?
|
265
|
+
pubid.edition = edition if edition && !edition.empty?
|
266
|
+
|
267
|
+
pubid.to_s(with_edition: true)
|
268
|
+
end
|
269
|
+
|
270
|
+
def resource_bib_data(bib, schema_and_entity)
|
271
|
+
schema = bib.xpath("schema[@name='#{schema_and_entity}']").first
|
272
|
+
|
273
|
+
{
|
274
|
+
identifier: identifier(bib),
|
275
|
+
number: schema.attributes["number"],
|
276
|
+
supersedes_concept: schema.attributes["number.supersedes"],
|
277
|
+
status: bib.attributes["status"],
|
278
|
+
title: bib.attributes["title"] || bib.attributes["name"],
|
279
|
+
}
|
280
|
+
end
|
281
|
+
|
282
|
+
def module_bib_data(bib, type)
|
283
|
+
{
|
284
|
+
identifier: identifier(bib),
|
285
|
+
number: bib.attributes["wg.number.#{type}"],
|
286
|
+
supersedes_concept: bib.attributes["wg.number.#{type}.supersedes"],
|
287
|
+
status: bib.attributes["status"],
|
288
|
+
title: bib.attributes["title"] || bib.attributes["name"],
|
289
|
+
}
|
290
|
+
end
|
291
|
+
|
292
|
+
def bom_bib_data(bib)
|
293
|
+
{
|
294
|
+
identifier: identifier(bib),
|
295
|
+
number: bib.attributes["wg.number.bom.exp"],
|
296
|
+
supersedes_concept: bib.attributes["wg.number.bom.supersedes"],
|
297
|
+
status: bib.attributes["status"],
|
298
|
+
title: bib.attributes["title"] || bib.attributes["name"],
|
299
|
+
}
|
300
|
+
end
|
301
|
+
|
93
302
|
def convert_from_resource_file(resource_docs_dir, stepmod_dir, linked, descriptions_file)
|
94
|
-
resource_docs_file =
|
95
|
-
|
96
|
-
puts(resource_docs_file)
|
303
|
+
resource_docs_file = resource_docs_file_path(stepmod_dir, resource_docs_dir)
|
304
|
+
|
97
305
|
resource_docs = Nokogiri::XML(File.read(resource_docs_file)).root
|
98
306
|
schema = resource_docs.xpath("schema[@name='#{linked}']")
|
99
307
|
|
100
308
|
Dir.chdir(File.dirname(descriptions_file)) do
|
101
309
|
wrapper = "<resource>#{schema}</resource>"
|
102
|
-
|
310
|
+
|
311
|
+
"\n" + Stepmod::Utils::SmrlResourceConverter.convert(
|
312
|
+
wrapper,
|
313
|
+
{
|
314
|
+
no_notes_examples: false,
|
315
|
+
schema_and_entity: linked,
|
316
|
+
},
|
317
|
+
)
|
103
318
|
end
|
104
319
|
end
|
320
|
+
|
321
|
+
def resource_docs_file_path(stepmod_dir, resource_docs_dir)
|
322
|
+
File.join(
|
323
|
+
stepmod_dir,
|
324
|
+
"data/resource_docs",
|
325
|
+
resource_docs_dir,
|
326
|
+
"resource.xml",
|
327
|
+
)
|
328
|
+
end
|
105
329
|
end
|
106
330
|
end
|
107
331
|
end
|
data/lib/stepmod/utils/term.rb
CHANGED
@@ -7,9 +7,9 @@ module Stepmod
|
|
7
7
|
attr_accessor :acronym
|
8
8
|
|
9
9
|
def to_mn_adoc
|
10
|
-
mn_adoc = ["=== #{definition}"]
|
10
|
+
mn_adoc = ["=== #{definition.map(&:content).join}"]
|
11
11
|
mn_adoc << "\nalt:[#{acronym}]" if acronym
|
12
|
-
mn_adoc << "\n\n#{designations.join(", ")}" if designations&.any?
|
12
|
+
mn_adoc << "\n\n#{designations.map(&:designation).join(", ")}" if designations&.any?
|
13
13
|
|
14
14
|
mn_adoc.join
|
15
15
|
end
|
@@ -18,15 +18,28 @@ module Stepmod
|
|
18
18
|
def from_h(hash)
|
19
19
|
_, definition, acronym = treat_acronym(hash["definition"])
|
20
20
|
|
21
|
-
hash["definition"] = definition
|
21
|
+
hash["definition"] = [definition]
|
22
|
+
|
22
23
|
hash["acronym"] = acronym.gsub(/\(|\)/, "") if acronym
|
23
|
-
hash["
|
24
|
+
add_designations(hash, hash["synonyms"]) if hash["synonyms"]
|
24
25
|
|
25
|
-
|
26
|
+
new(hash.reject { |k, _| k == "synonyms" })
|
26
27
|
end
|
27
28
|
|
28
29
|
private
|
29
30
|
|
31
|
+
def add_designations(hash, synonyms)
|
32
|
+
hash["designations"] ||= []
|
33
|
+
hash["designations"] << designation_hash(synonyms) if synonyms
|
34
|
+
end
|
35
|
+
|
36
|
+
def designation_hash(value, type = "expression")
|
37
|
+
{
|
38
|
+
"designation" => value,
|
39
|
+
"type" => type,
|
40
|
+
}
|
41
|
+
end
|
42
|
+
|
30
43
|
def treat_acronym(term_def)
|
31
44
|
return [nil, term_def.strip, nil] unless term_def.match?(/.+\(.+?\)$/)
|
32
45
|
|