stepmod-utils 0.3.23 → 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-extract-yaml-terms +149 -0
- data/lib/stepmod/utils/concept.rb +40 -10
- data/lib/stepmod/utils/express_bibdata.rb +111 -0
- data/lib/stepmod/utils/stepmod_file_annotator.rb +197 -9
- data/lib/stepmod/utils/term.rb +18 -5
- data/lib/stepmod/utils/terms_extractor.rb +245 -291
- data/lib/stepmod/utils/version.rb +1 -1
- data/stepmod-utils.gemspec +2 -1
- metadata +23 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 92d04b3c30620d813fbff40cfa84ed809f0129440dd1f6be45c4206aaa44a12e
|
4
|
+
data.tar.gz: 54289d1067ccba3a61cd0ca07bd5455081efe70aae946811cf8028f6e77afb9a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e83145314175c1797f8de0fe08bdbf3ba95e06346b49f80beb3cdadb31d1b2423cb60230d869b91850de3685b0fb6c805a2b4ddebbfd72ff2b55ffde234f4d9f
|
7
|
+
data.tar.gz: 309a341bead6e54225f14101c3bea989f2f7873409c4d8e1fedbc6e8b2144d3e21ed2034c5ebcfd76279d73234a84e8d0d67c86fb77e1e1b715f6f1ba2ad661b
|
data/.rubocop.yml
CHANGED
@@ -0,0 +1,149 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
require "pry"
|
5
|
+
# resolve bin path, ignoring symlinks
|
6
|
+
require "pathname"
|
7
|
+
bin_file = Pathname.new(__FILE__).realpath
|
8
|
+
|
9
|
+
# add self to libpath
|
10
|
+
$:.unshift File.expand_path("../../lib", bin_file)
|
11
|
+
|
12
|
+
# Fixes https://github.com/rubygems/rubygems/issues/1420
|
13
|
+
require "rubygems/specification"
|
14
|
+
|
15
|
+
module Gem
|
16
|
+
class Specification
|
17
|
+
def this; self; end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
require "bundler/setup"
|
22
|
+
require_relative "../lib/stepmod/utils/terms_extractor"
|
23
|
+
require "optparse"
|
24
|
+
|
25
|
+
def log(message)
|
26
|
+
puts "[stepmod-utils] #{message}"
|
27
|
+
end
|
28
|
+
|
29
|
+
options = {}
|
30
|
+
OptionParser.new do |opts|
|
31
|
+
opts.banner = "Usage: #{$0} [options]"
|
32
|
+
|
33
|
+
opts.on(
|
34
|
+
"-p",
|
35
|
+
"--path STEPMOD_DATA_PATH",
|
36
|
+
String,
|
37
|
+
"Path to STEPmod data directory",
|
38
|
+
) do |path|
|
39
|
+
options[:stepmod_dir] = path
|
40
|
+
end
|
41
|
+
|
42
|
+
opts.on(
|
43
|
+
"-i",
|
44
|
+
"--index INDEX_PATH",
|
45
|
+
String,
|
46
|
+
"Path to repository_index.xml",
|
47
|
+
) do |path|
|
48
|
+
unless path.nil?
|
49
|
+
options[:index_path] = Pathname.new(path).to_s
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
54
|
+
puts opts
|
55
|
+
exit
|
56
|
+
end
|
57
|
+
end.parse!
|
58
|
+
|
59
|
+
stepmod_dir = options[:stepmod_dir]
|
60
|
+
if stepmod_dir.nil?
|
61
|
+
raise StandardError.new(
|
62
|
+
"STEPmod data path not set, set with the `-p` option.",
|
63
|
+
)
|
64
|
+
else
|
65
|
+
log "STEPmod data path: `#{stepmod_dir}`"
|
66
|
+
end
|
67
|
+
|
68
|
+
default_index_path = File.join(stepmod_dir, "repository_index.xml")
|
69
|
+
index_path = options[:index_path] || default_index_path
|
70
|
+
if File.exists?(index_path)
|
71
|
+
log "Repository index path: `#{index_path}`"
|
72
|
+
else
|
73
|
+
raise StandardError.new(
|
74
|
+
"Index file not present at #{index_path}, set with the `-i` option.",
|
75
|
+
)
|
76
|
+
end
|
77
|
+
|
78
|
+
_general_concepts,
|
79
|
+
resource_concepts,
|
80
|
+
_parsed_bibliography,
|
81
|
+
_part_concepts,
|
82
|
+
part_resources,
|
83
|
+
part_modules = Stepmod::Utils::TermsExtractor.call(stepmod_dir, index_path)
|
84
|
+
|
85
|
+
def part_to_title(bibdata)
|
86
|
+
{
|
87
|
+
41 => "Fundamentals of product description and support",
|
88
|
+
42 => "Geometric and topological representation",
|
89
|
+
43 => "Foundation representation",
|
90
|
+
44 => "Product structure, concept and configuration",
|
91
|
+
45 => "Material and other engineering properties",
|
92
|
+
46 => "Visual presentation",
|
93
|
+
47 => "Shape tolerance",
|
94
|
+
51 => "Mathematical representation",
|
95
|
+
}[bibdata.part.to_i] || bibdata.title_en
|
96
|
+
end
|
97
|
+
|
98
|
+
# rubocop:disable Layout/LineLength
|
99
|
+
IMAGE_REPLACEMENTS = {
|
100
|
+
"image::eq01.gif[]" => "stem:[H(A,B) = max {h(A, B), h(B,A)}]",
|
101
|
+
"image::eq02.gif[]" => "stem:[max_{a in A} { min_{b in B} d(a,b) }]",
|
102
|
+
"image::vector_z_c.gif[]" => "stem:[bar z_{c}]",
|
103
|
+
"image::one_direction_repeat_factor_expression.gif[]" => "stem:[I + k cdot R; k = -1, 1]",
|
104
|
+
"image::two_direction_repeat_factor_expression.gif[]" => "stem:[I + k_1 cdot R_1 + k_2 cdot R_2; k_1, k_2 = -1, 0, 1, k^2_1 + k^2_2 != 0]",
|
105
|
+
}.freeze
|
106
|
+
|
107
|
+
TEXT_REPLACEMENTS = {
|
108
|
+
' (see <module_ref linkend="ply_orientation_specification:4_entities:figure:f2"> Figure 2</module_ref>)' => "",
|
109
|
+
' (see <module_ref linkend="ply_orientation_specification:4_entities:figure:f3"> Figure 3</module_ref>)' => "",
|
110
|
+
}.freeze
|
111
|
+
# rubocop:enable Layout/LineLength
|
112
|
+
|
113
|
+
def replace_content(content)
|
114
|
+
IMAGE_REPLACEMENTS.each_pair do |k, v|
|
115
|
+
content.gsub!(k, v)
|
116
|
+
end
|
117
|
+
TEXT_REPLACEMENTS.each_pair do |k, v|
|
118
|
+
content.gsub!(k, v)
|
119
|
+
end
|
120
|
+
|
121
|
+
content
|
122
|
+
end
|
123
|
+
|
124
|
+
part_resources.each do |(_bibdata, current_part_resources)|
|
125
|
+
current_part_resources.save_to_files("./")
|
126
|
+
end
|
127
|
+
log "INFO: part_resources written to yaml files"
|
128
|
+
|
129
|
+
|
130
|
+
log "INFO: written summary file to: 04x-stepmod-entities-resources.adoc"
|
131
|
+
part_modules.sort_by do |(bibdata, _part_modules_arm, _part_modules_mim)|
|
132
|
+
bibdata.part.to_i
|
133
|
+
end.each do |(_bibdata, part_modules_arm, part_modules_mim)|
|
134
|
+
unless part_modules_arm.empty?
|
135
|
+
part_modules_arm.values.map do |managed_concept|
|
136
|
+
managed_concept.save_to_files("./")
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
unless part_modules_mim.empty?
|
141
|
+
part_modules_mim.values.map do |managed_concept|
|
142
|
+
managed_concept.save_to_files("./")
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
log "INFO: part_modules written to yaml files"
|
147
|
+
|
148
|
+
resource_concepts.save_to_files("./")
|
149
|
+
log "INFO: resource_concepts written to yaml files"
|
@@ -8,6 +8,10 @@ module Stepmod
|
|
8
8
|
reference_anchor
|
9
9
|
converted_definition
|
10
10
|
file_path
|
11
|
+
schema
|
12
|
+
part
|
13
|
+
domain
|
14
|
+
document
|
11
15
|
)
|
12
16
|
|
13
17
|
# TODO: converted_definition is not supposed to be an attribute, it is
|
@@ -40,8 +44,8 @@ module Stepmod
|
|
40
44
|
# TODO: `designations:` should include the `alt:[...]` terms here,
|
41
45
|
# they are now only included in definition_xml_converted_definition.
|
42
46
|
new(
|
43
|
-
designations:
|
44
|
-
definition: definition,
|
47
|
+
designations: designation,
|
48
|
+
definition: [definition],
|
45
49
|
converted_definition: converted_definition,
|
46
50
|
id: "#{reference_anchor}.#{reference_clause}",
|
47
51
|
reference_anchor: reference_anchor,
|
@@ -65,11 +69,16 @@ module Stepmod
|
|
65
69
|
definition_xml.xpath(".//term").first
|
66
70
|
)
|
67
71
|
|
68
|
-
{
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
72
|
+
# [4..-1] because we want to skip the initial `=== {title}`
|
73
|
+
designations = [
|
74
|
+
{ "designation" => term[4..-1], "type" => "expression", "normative_status" => "preferred" },
|
75
|
+
]
|
76
|
+
|
77
|
+
alts.each do |alt|
|
78
|
+
designations << { "designation" => alt, "type" => "expression" }
|
79
|
+
end
|
80
|
+
|
81
|
+
designations
|
73
82
|
end
|
74
83
|
|
75
84
|
def definition_xml_definition(definition_xml, reference_anchor)
|
@@ -95,12 +104,24 @@ module Stepmod
|
|
95
104
|
end
|
96
105
|
|
97
106
|
def definition_xml_converted_definition(designation, definition)
|
98
|
-
|
99
|
-
|
107
|
+
accepted_designation = designation.select do |des|
|
108
|
+
des["normative_status"] == "preferred"
|
109
|
+
end
|
110
|
+
|
111
|
+
alt_designations = designation.reject do |des|
|
112
|
+
des["normative_status"] == "preferred"
|
113
|
+
end
|
114
|
+
|
115
|
+
if alt_designations.length.positive?
|
116
|
+
alt_designations_text = alt_designations.map do |d|
|
117
|
+
d["designation"].strip
|
118
|
+
end.join(",")
|
119
|
+
|
120
|
+
alt_notation = "alt:[#{alt_designations_text}]"
|
100
121
|
end
|
101
122
|
|
102
123
|
result = <<~TEXT
|
103
|
-
=== #{designation
|
124
|
+
=== #{accepted_designation.map { |d| d['designation'].strip }.join(',')}
|
104
125
|
TEXT
|
105
126
|
|
106
127
|
if alt_notation
|
@@ -117,6 +138,15 @@ module Stepmod
|
|
117
138
|
end
|
118
139
|
end
|
119
140
|
|
141
|
+
def to_h
|
142
|
+
super.merge({
|
143
|
+
"domain" => domain,
|
144
|
+
"part" => part,
|
145
|
+
"schema" => schema,
|
146
|
+
"document" => document,
|
147
|
+
}.compact)
|
148
|
+
end
|
149
|
+
|
120
150
|
def to_mn_adoc
|
121
151
|
<<~TEXT
|
122
152
|
// STEPmod path:#{file_path.empty? ? '' : " #{file_path}"}
|
@@ -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
|
@@ -5,6 +5,9 @@ require "stepmod/utils/converters/express_note"
|
|
5
5
|
require "stepmod/utils/converters/express_example"
|
6
6
|
require "stepmod/utils/converters/express_figure"
|
7
7
|
require "stepmod/utils/converters/express_table"
|
8
|
+
require "expressir"
|
9
|
+
require "expressir/express/parser"
|
10
|
+
require "pubid-iso"
|
8
11
|
|
9
12
|
module Stepmod
|
10
13
|
module Utils
|
@@ -17,26 +20,37 @@ module Stepmod
|
|
17
20
|
@express_file = express_file
|
18
21
|
@resource_docs_cache_file = resource_docs_cache_file
|
19
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
|
20
29
|
end
|
21
30
|
|
22
31
|
def call
|
23
32
|
match = File.basename(express_file).match('^(arm|mim|bom)\.exp$')
|
24
33
|
descriptions_base = match ? "#{match.captures[0]}_descriptions.xml" : "descriptions.xml"
|
34
|
+
|
25
35
|
descriptions_file = File.join(File.dirname(express_file),
|
26
36
|
descriptions_base)
|
37
|
+
|
27
38
|
output_express = File.read(express_file)
|
28
|
-
|
39
|
+
converted_description = ""
|
40
|
+
base_linked = ""
|
29
41
|
|
30
42
|
if File.exists?(descriptions_file)
|
31
43
|
descriptions = Nokogiri::XML(File.read(descriptions_file)).root
|
32
44
|
added_resource_descriptions = {}
|
45
|
+
|
33
46
|
descriptions.xpath("ext_description").each do |description|
|
34
47
|
# Add base resource from linked path if exists, eg "language_schema.language.wr:WR1" -> "language_schema"
|
35
48
|
base_linked = description["linkend"].to_s.split(".").first
|
49
|
+
|
36
50
|
if added_resource_descriptions[base_linked].nil?
|
37
51
|
base_reource_doc_dir = resource_docs_cache[description["linkend"].to_s.split(".").first]
|
38
52
|
if base_reource_doc_dir
|
39
|
-
|
53
|
+
converted_description << convert_from_resource_file(
|
40
54
|
base_reource_doc_dir, stepmod_dir, base_linked, descriptions_file
|
41
55
|
)
|
42
56
|
end
|
@@ -47,7 +61,7 @@ module Stepmod
|
|
47
61
|
# when a schema description is available from resource.xml and also descriptions.xml, the description from resource.xml is only used.
|
48
62
|
# https://github.com/metanorma/annotated-express/issues/32#issuecomment-792609078
|
49
63
|
if description.text.strip.length.positive? && resource_docs_dir.nil?
|
50
|
-
|
64
|
+
converted_description << convert_from_description_text(
|
51
65
|
descriptions_file, description
|
52
66
|
)
|
53
67
|
end
|
@@ -60,7 +74,28 @@ module Stepmod
|
|
60
74
|
end
|
61
75
|
end
|
62
76
|
|
63
|
-
|
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)
|
64
99
|
rescue StandardError => e
|
65
100
|
puts "[ERROR]!!! #{e.message}"
|
66
101
|
puts e.backtrace
|
@@ -68,6 +103,14 @@ module Stepmod
|
|
68
103
|
|
69
104
|
private
|
70
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
|
+
|
71
114
|
def convert_from_description_text(descriptions_file, description)
|
72
115
|
Dir.chdir(File.dirname(descriptions_file)) do
|
73
116
|
wrapper = "<ext_descriptions>#{description}</ext_descriptions>"
|
@@ -119,10 +162,146 @@ module Stepmod
|
|
119
162
|
end
|
120
163
|
end
|
121
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)
|
246
|
+
end
|
247
|
+
end
|
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
|
+
|
122
302
|
def convert_from_resource_file(resource_docs_dir, stepmod_dir, linked, descriptions_file)
|
123
|
-
resource_docs_file =
|
124
|
-
|
125
|
-
# puts(resource_docs_file)
|
303
|
+
resource_docs_file = resource_docs_file_path(stepmod_dir, resource_docs_dir)
|
304
|
+
|
126
305
|
resource_docs = Nokogiri::XML(File.read(resource_docs_file)).root
|
127
306
|
schema = resource_docs.xpath("schema[@name='#{linked}']")
|
128
307
|
|
@@ -133,11 +312,20 @@ module Stepmod
|
|
133
312
|
wrapper,
|
134
313
|
{
|
135
314
|
no_notes_examples: false,
|
136
|
-
schema_and_entity: linked
|
137
|
-
}
|
315
|
+
schema_and_entity: linked,
|
316
|
+
},
|
138
317
|
)
|
139
318
|
end
|
140
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
|
141
329
|
end
|
142
330
|
end
|
143
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
|
|