stepmod-utils 0.2.3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 30293492d1d3224173ac5070db26552c4cb1df8d6d56059e8180a461e85b6fed
4
- data.tar.gz: b784155408f9c0cef9ad0c3665bfe5defa35a3458ad5b9ffda75ca0aa612476a
3
+ metadata.gz: 1006db3b3828bc38932f36a4f410cf6f8a0d5669bf0c3357c7a204c84e587a44
4
+ data.tar.gz: 7fa819c6ee34eef23ad8ab20fd3a833296a36bf99ca48cb624a81a04049871ff
5
5
  SHA512:
6
- metadata.gz: adb0dd04f01590a002552dedb5975d07bcb0897c1c2fe443e5d3ff865ab7c7c1ebc774e1414febabd2305c24abef5560ad4f1b24034aeba05fe0f89f956a9c36
7
- data.tar.gz: 48dca001c264cc71a3c415ad255f7c7161cebfb4f3cb91990a2b4e538cb72b404d8e12fa3f1f046c65b8538a32cbca0004846ac0f517c3756f47bfaee9a127fa
6
+ metadata.gz: 40f09784e7aeac5e8e35c24079e84c5119dc9cd00f9555a4c24c1ce389e4b28bb32e0f6ec8c4408b3a1fea0445cfa16ca3700a263517b28c935c9ddca7de8cbb
7
+ data.tar.gz: dd35cce57f836527e31a6bd36576f6966494f558d1a0cc87486632c3149b1eecf66f37493f188f0a1ff685b804ddedb33bc13c1c6d45e5142335710ea7dea88c
@@ -30,7 +30,9 @@ jobs:
30
30
  os: 'macos-latest'
31
31
  experimental: true
32
32
  steps:
33
- - uses: actions/checkout@master
33
+ - uses: actions/checkout@v2
34
+ with:
35
+ submodules: true
34
36
 
35
37
  - uses: ruby/setup-ruby@v1
36
38
  with:
@@ -38,14 +40,3 @@ jobs:
38
40
  bundler-cache: true
39
41
 
40
42
  - run: bundle exec rake
41
-
42
- tests-passed:
43
- needs: rake
44
- runs-on: ubuntu-latest
45
- steps:
46
- - uses: peter-evans/repository-dispatch@v1
47
- with:
48
- token: ${{ secrets.METANORMA_CI_PAT_TOKEN || secrets.GITHUB_TOKEN }}
49
- repository: ${{ github.repository }}
50
- event-type: notify
51
- client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}"}'
@@ -1,3 +1,5 @@
1
+ # Auto-generated by Cimas: Do not edit it manually!
2
+ # See https://github.com/metanorma/cimas
1
3
  name: release
2
4
 
3
5
  on:
@@ -8,6 +10,8 @@ on:
8
10
  Next release version. Possible values: x.y.z, major, minor, patch or pre|rc|etc
9
11
  required: true
10
12
  default: 'patch'
13
+ push:
14
+ tags: [ v* ]
11
15
 
12
16
  jobs:
13
17
  release:
@@ -19,9 +23,10 @@ jobs:
19
23
  with:
20
24
  ruby-version: '2.6'
21
25
 
22
- - run: gem install gem-release
26
+ - run: gem install gem-release
23
27
 
24
- - run: |
28
+ - if: ${{ github.event_name == 'workflow_dispatch' }}
29
+ run: |
25
30
  git config user.name github-actions
26
31
  git config user.email github-actions@github.com
27
32
  gem bump --version ${{ github.event.inputs.next_version }} --tag --push
data/Makefile CHANGED
@@ -1,2 +1,5 @@
1
1
  convert_stepmod_repo:
2
- bundle exec ./exe/stepmod-annotate-all ../iso-10303-stepmod
2
+ bundle exec ./exe/stepmod-annotate-all $(10303_stepmod_path)
3
+
4
+ create_svgs:
5
+ java -jar $(stepmod2mn_jar_path) $(10303_stepmod_path) -svg
@@ -24,12 +24,12 @@ files.each_slice(MAX_QUEUE_SIZE) do |batch|
24
24
  puts("Queueing next batch")
25
25
  batch.each do |file|
26
26
  pool.post do
27
- puts("Queued processing #{file}")
27
+ puts("#{Thread.current.object_id}: Queued processing #{file}")
28
28
  annotated = Stepmod::Utils::StepmodFileAnnotator.new(express_file: file, resource_docs_cache_file: resource_docs_cache_file, stepmod_dir: stepmod_dir).call
29
29
  File.open(File.join(File.dirname(file), "#{File.basename(file, '.exp')}_annotated.exp"), 'w') do |file|
30
30
  file.puts(annotated)
31
31
  end
32
- puts("Done processing #{file}")
32
+ puts("#{Thread.current.object_id}: Done processing #{file}")
33
33
  end
34
34
  end
35
35
  pool.shutdown
@@ -24,7 +24,12 @@ require 'ptools'
24
24
 
25
25
  ReverseAdoc.config.unknown_tags = :bypass
26
26
 
27
- parsed_terms = []
27
+ # TODO: we may want a command line option to override this in the future
28
+ ACCEPTED_STAGES = %w(IS DIS FDIS TS)
29
+
30
+ general_concepts = []
31
+ resource_concepts = []
32
+ module_concepts = []
28
33
  parsed_bibliography = []
29
34
  encountered_terms = {}
30
35
 
@@ -34,6 +39,40 @@ def log message
34
39
  puts "[stepmod-utils] #{message}"
35
40
  end
36
41
 
42
+ def term_special_category(bibdata)
43
+ case bibdata.part.to_i
44
+ when 41,42,43,44,45,46,47,51
45
+ true
46
+ when [56..112]
47
+ true
48
+ else
49
+ false
50
+ end
51
+ end
52
+
53
+ def part_to_title(bibdata)
54
+ case bibdata.part.to_i
55
+ when 41
56
+ "Part 41"
57
+ when 42
58
+ "Geometric and topological representation"
59
+ when 43
60
+ "Foundation representation"
61
+ when 44
62
+ "Product structure, concept and configuration"
63
+ when 45
64
+ "Part 45"
65
+ when 46
66
+ "Visual presentation"
67
+ when 47
68
+ "Shape tolerance"
69
+ when 51
70
+ "Mathematical representation"
71
+ else
72
+ bibdata.title_en
73
+ end
74
+ end
75
+
37
76
  stepmod_path = Pathname.new(stepmod_dir).realpath
38
77
 
39
78
  # If we are using the stepmod CVS repository, provide the revision number per file
@@ -57,9 +96,14 @@ files = %w(
57
96
  business_object_model.xml
58
97
  module.xml
59
98
  ).inject([]) do |acc, t|
60
- acc << Dir["#{stepmod_dir}/**/#{t}"]
99
+
100
+ candidate_paths = Dir["#{stepmod_dir}/**/#{t}"]
101
+ acc << candidate_paths
102
+
61
103
  end.flatten.sort.uniq
62
104
 
105
+ max_encountered_refs_indexes = {}
106
+
63
107
  files.each do |file_path|
64
108
  file_path = Pathname.new(file_path).realpath
65
109
  fpath = file_path.relative_path_from(stepmod_path)
@@ -75,9 +119,8 @@ files.each do |file_path|
75
119
  next
76
120
  end
77
121
 
78
- # TODO: we may want a command line option to override this in the future
79
- unless %w(IS DIS TS).include? bibdata.doctype
80
- log "INFO: skipped #{bibdata.docid} as it is not IS, DIS or TS"
122
+ unless ACCEPTED_STAGES.include? bibdata.doctype
123
+ log "INFO: skipped #{bibdata.docid} as it is not one of (#{ACCEPTED_STAGES.join(", ")})."
81
124
  next
82
125
  end
83
126
 
@@ -106,8 +149,9 @@ files.each do |file_path|
106
149
  end
107
150
 
108
151
  # read definitions
109
- current_document.xpath('//definition').each.with_index(1) do |definition, index|
110
-
152
+ part_concepts = []
153
+ current_document.xpath('//definition').each do |definition|
154
+ index = max_encountered_refs_indexes[bibdata.anchor] || 1
111
155
  term_id = definition['id']
112
156
  unless term_id.nil?
113
157
  if encountered_terms[term_id]
@@ -127,24 +171,107 @@ files.each do |file_path|
127
171
  file_path: fpath + revision_string
128
172
  )
129
173
 
130
- parsed_terms << concept
174
+ unless term_special_category(bibdata)
175
+ # log "INFO: this part is generic"
176
+ general_concepts << concept
177
+ else
178
+ # log "INFO: this part is special"
179
+ part_concepts << concept
180
+ end
181
+
182
+ max_encountered_refs_indexes[bibdata.anchor] = index + 1
131
183
  parsed_bibliography << bibdata
132
184
  end
133
185
 
186
+ current_document.xpath('//arm').each do |arm_node|
187
+ index = max_encountered_refs_indexes[bibdata.anchor] || 1
188
+
189
+ concept = Stepmod::Utils::Concept.parse(
190
+ arm_node,
191
+ reference_anchor: bibdata.anchor,
192
+ reference_clause: nil,
193
+ file_path: fpath + revision_string
194
+ )
195
+
196
+ module_concepts << concept
197
+ # unless term_special_category(bibdata)
198
+ # # log "INFO: this part is generic"
199
+ # general_concepts << concept
200
+ # else
201
+ # # log "INFO: this part is special"
202
+ # part_concepts << concept
203
+ # end
204
+
205
+ max_encountered_refs_indexes[bibdata.anchor] = index + 1
206
+ parsed_bibliography << bibdata
207
+ end
208
+
209
+ current_document.xpath('//schema').each do |schema_node|
210
+ Dir["#{stepmod_dir}/**/#{schema_node['name']}/descriptions.xml"].each do |description|
211
+ description_document = Nokogiri::XML(File.read(description)).root
212
+ description_document.xpath('//ext_description').each do |ext_description|
213
+ index = max_encountered_refs_indexes[bibdata.anchor] || 1
214
+
215
+ concept = Stepmod::Utils::Concept.parse(
216
+ ext_description,
217
+ reference_anchor: bibdata.anchor,
218
+ reference_clause: nil,
219
+ file_path: fpath + revision_string
220
+ )
221
+
222
+ resource_concepts << concept
223
+ # unless term_special_category(bibdata)
224
+ # # log "INFO: this part is generic"
225
+ # general_concepts << concept
226
+ # else
227
+ # # log "INFO: this part is special"
228
+ # part_concepts << concept
229
+ # end
230
+
231
+ max_encountered_refs_indexes[bibdata.anchor] = index + 1
232
+ parsed_bibliography << bibdata
233
+ end
234
+ end
235
+ end
236
+
134
237
  log "INFO: Completed processing XML file #{fpath}"
135
238
 
239
+ if part_concepts.length == 0
240
+ log "INFO: Skipping #{fpath} (#{bibdata.docid}) because it contains no concepts."
241
+ next
242
+ elsif part_concepts.length < 3
243
+ log "INFO: Skipping #{fpath} (#{bibdata.docid}) because it only has #{part_concepts.length} terms."
244
+
245
+ part_concepts.each do |x|
246
+ general_concepts << x
247
+ end
248
+ else
249
+ fn = "03x-stepmod-#{bibdata.part}.adoc"
250
+ File.open(fn, 'w') { |file|
251
+ file.puts("== #{part_to_title(bibdata)}\n\n")
252
+ file.puts(part_concepts.map(&:to_mn_adoc).join("\n"))
253
+ }
254
+ log "INFO: written to: #{fn}"
255
+ end
256
+
136
257
  end
137
258
 
138
- parsed_bibliography.uniq!
259
+ File.open('031-stepmod-general.adoc', 'w') { |file|
260
+ file.puts(general_concepts.map(&:to_mn_adoc).join("\n"))
261
+ }
262
+
263
+ File.open('04-stepmod-entities-resources.adoc', 'w') { |file|
264
+ file.puts(resource_concepts.map(&:to_mn_adoc).join("\n"))
265
+ }
139
266
 
140
- File.open('031-generated-terms.adoc', 'w') { |file|
141
- file.puts(parsed_terms.map(&:to_mn_adoc).join("\n"))
267
+ File.open('05-stepmod-entities-modules.adoc', 'w') { |file|
268
+ file.puts(module_concepts.map(&:to_mn_adoc).join("\n"))
142
269
  }
143
270
 
144
- log "INFO: written to: 031-generated-terms.adoc"
271
+ log "INFO: written to: 031-stepmod-general.adoc"
145
272
 
146
273
  File.open('991-generated-bibliography.adoc', 'w') { |file|
147
- file.puts(parsed_bibliography.map(&:to_mn_adoc).join("\n"))
274
+ file.puts(parsed_bibliography.map(&:to_mn_adoc).sort.uniq.join("\n"))
148
275
  }
149
276
 
150
277
  log "INFO: written to: 991-generated-bibliography.adoc"
@@ -67,6 +67,8 @@ module Stepmod
67
67
  "ISO/CD #{DOCNUMBER}-#{part}"
68
68
  when "DIS"
69
69
  "ISO/DIS #{DOCNUMBER}-#{part}"
70
+ when "FDIS"
71
+ "ISO/FDIS #{DOCNUMBER}-#{part}"
70
72
  when "TS"
71
73
  "ISO/TS #{DOCNUMBER}-#{part}"
72
74
  when "CD-TS"
@@ -21,8 +21,18 @@ module Stepmod
21
21
  end
22
22
 
23
23
  def self.parse(definition_xml, reference_anchor:, reference_clause:, file_path:)
24
+ converted_definition = Stepmod::Utils::StepmodDefinitionConverter
25
+ .convert(definition_xml, { reference_anchor: reference_anchor })
26
+ if definition_xml.name == 'arm' || definition_xml.name == 'ext_description'
27
+ converted_definition = <<~TEXT
28
+ #{converted_definition.split("\n")[0..3].join("\n")}
29
+
30
+ NOTE: This term is incompletely defined in this document.
31
+ Reference <<#{reference_anchor}>> for the complete definition.
32
+ TEXT
33
+ end
24
34
  new(
25
- converted_definition: Stepmod::Utils::StepmodDefinitionConverter.convert(definition_xml),
35
+ converted_definition: converted_definition,
26
36
  reference_anchor: reference_anchor,
27
37
  reference_clause: reference_clause,
28
38
  file_path: file_path
@@ -35,7 +45,7 @@ module Stepmod
35
45
  #{converted_definition}
36
46
 
37
47
  [.source]
38
- <<#{reference_anchor},clause=#{reference_clause}>>
48
+ <<#{reference_anchor}#{reference_clause ? ",clause=" + reference_clause : ""}>>
39
49
 
40
50
  TEXT
41
51
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class Arm < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ treat_children(node, state)
9
+ end
10
+
11
+ private
12
+
13
+ def treat_children(node, state)
14
+ res = node.children.map { |child| treat(child, state) }
15
+ res.map(&:strip).reject(&:empty?).join("\n\n")
16
+ end
17
+ end
18
+
19
+ ReverseAdoc::Converters.register :arm, Arm.new
20
+ end
21
+ end
22
+ end
@@ -71,6 +71,7 @@ module Stepmod
71
71
  end
72
72
 
73
73
  ReverseAdoc::Converters.register :def, Def.new
74
+ ReverseAdoc::Converters.register :description, Def.new
74
75
  end
75
76
  end
76
77
  end
@@ -44,7 +44,7 @@ module Stepmod
44
44
  first_strong_node.next.content = first_strong_node.next.content.gsub(/\s?:/, '')
45
45
  term = first_strong_node.text.strip
46
46
  first_strong_node.remove
47
- "#{term}:: #{treat_children(cloned_node, state)}"
47
+ "\n\n#{term}:: #{remove_trash_symbols(treat_children(cloned_node, state))}\n"
48
48
  end
49
49
 
50
50
  def stem_converted(cloned_node, state)
@@ -69,6 +69,7 @@ module Stepmod
69
69
  .strip
70
70
  .gsub(/\(\d\)$/, '')
71
71
  .gsub(/\b(\w*?[_]+\w+)\b/, '"\1"')
72
+ .gsub(/([^\s])\s+_{/, '\1_{')
72
73
  .strip
73
74
  end
74
75
 
@@ -79,14 +80,14 @@ module Stepmod
79
80
  TAGS_NOT_IN_CONTEXT.each do |tag_name|
80
81
  node
81
82
  .children
82
- .xpath("./#{tag_name}")
83
- .map do |n|
84
- n.tap{ |n| n.add_previous_sibling(n.children) }.remove
83
+ .each do |n|
84
+ remove_tags_not_in_context(n) if n.children.length > 0
85
+ next if n.name != tag_name
86
+
87
+ n.add_previous_sibling(n.children)
88
+ n.unlink
85
89
  end
86
90
  end
87
- node.traverse do |descendant|
88
- descendant.content = descendant.content.gsub('#8195;', '')
89
- end
90
91
  end
91
92
  end
92
93
 
@@ -8,18 +8,21 @@ module Stepmod
8
8
  node.children.map do |child|
9
9
  next unless child.name == 'imgfile'
10
10
 
11
- parse_to_svg_reference(child['file'])
11
+ parse_to_svg_reference(child['file'], state)
12
12
  end.join("\n")
13
13
  end
14
14
 
15
15
  private
16
16
 
17
- def parse_to_svg_reference(file)
17
+ def parse_to_svg_reference(file, state)
18
18
  return '' unless File.file?(file)
19
19
 
20
20
  image_document = Nokogiri::XML(File.read(file))
21
21
  svg_path = File.basename(image_document.xpath('//img').first['src'], '.*')
22
22
  <<~SVGMAP
23
+
24
+ *)
25
+ (*"#{state.fetch(:schema_name)}.__expressg"
23
26
  [.svgmap]
24
27
  ====
25
28
  image::#{svg_path}.svg[]
@@ -3,6 +3,7 @@ module Stepmod
3
3
  module Converters
4
4
  class ExtDescription < ReverseAdoc::Converters::Base
5
5
  def convert(node, state = {})
6
+ state = state.merge(schema_name: node['linkend'])
6
7
  <<~TEMPLATE
7
8
  (*"#{node['linkend']}"
8
9
  #{treat_children(node, state).strip}
@@ -5,7 +5,13 @@ module Stepmod
5
5
  module Converters
6
6
  class FundCons < ReverseAdoc::Converters::Base
7
7
  def convert(node, state = {})
8
- "\n\n== Fundamental concerns\n\n#{treat_children(node, state).strip}\n\n"
8
+ <<~TEXT
9
+
10
+ *)
11
+ (*"#{state.fetch(:schema_name)}.__fund_cons"
12
+
13
+ #{treat_children(node, state).strip}
14
+ TEXT
9
15
  end
10
16
  end
11
17
 
@@ -5,7 +5,7 @@ module Stepmod
5
5
  module Converters
6
6
  class Introduction < ReverseAdoc::Converters::Base
7
7
  def convert(node, state = {})
8
- "\n\n== Introduction\n\n#{treat_children(node, state).strip}\n\n"
8
+ treat_children(node, state)
9
9
  end
10
10
  end
11
11
 
@@ -9,7 +9,7 @@ module Stepmod
9
9
  anchor = id ? "[[#{id}]]\n" : ""
10
10
  ol_count = state.fetch(:ol_count, 0) + 1
11
11
  attrs = ol_attrs(node)
12
- res = "\n\n#{anchor}#{attrs}#{treat_children(node, state.merge(ol_count: ol_count))}\n"
12
+ res = "\n\n#{anchor}#{attrs}#{treat_children(node, state.merge(ol_count: ol_count, tdsinglepara: true))}\n"
13
13
  # Why do we add this?
14
14
  # res = "\n" + res if node.parent && node.parent.name == 'note'
15
15
  res
@@ -5,6 +5,7 @@ module Stepmod
5
5
  module Converters
6
6
  class Schema < ReverseAdoc::Converters::Base
7
7
  def convert(node, state = {})
8
+ state = state.merge(schema_name: node['name'])
8
9
  <<~TEMPLATE
9
10
  (*"#{node['name']}"
10
11
  #{treat_children(node, state).strip}
@@ -0,0 +1,17 @@
1
+ module Stepmod
2
+ module Utils
3
+ module Converters
4
+ class StepmodExtDescription < ReverseAdoc::Converters::Base
5
+ def convert(node, state = {})
6
+ state = state.merge(schema_name: node['linkend'])
7
+ <<~TEMPLATE
8
+ === #{node['linkend'].split('.').last}
9
+
10
+ <STEP resource> #{treat_children(node, state).strip}
11
+ TEMPLATE
12
+ end
13
+ end
14
+ ReverseAdoc::Converters.register :ext_description, StepmodExtDescription.new
15
+ end
16
+ end
17
+ end
@@ -4,13 +4,33 @@ module Stepmod
4
4
  module Utils
5
5
  module Converters
6
6
  class Strong < ReverseAdoc::Converters::Base
7
+ BLANK_CHARS = "{blank}".freeze
8
+
7
9
  def convert(node, state = {})
8
10
  content = treat_children(node, state.merge(already_strong: true))
9
11
  if content.strip.empty? || state[:already_strong]
10
12
  content
11
13
  else
12
- "#{content[/^\s*/]}*#{content.strip}*#{content[/\s*$/]}"
14
+ handle_express_escape_seq(node, "#{content[/^\s*/]}*#{content.strip}*#{content[/\s*$/]}")
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def handle_express_escape_seq(node, content)
21
+ res = content
22
+ if braces_sibling?(node.previous, true)
23
+ res = "#{BLANK_CHARS}#{res}"
24
+ end
25
+ if braces_sibling?(node.next)
26
+ res = "#{res}#{BLANK_CHARS}"
13
27
  end
28
+ res
29
+ end
30
+
31
+ def braces_sibling?(sibling, end_of_text = false)
32
+ match = end_of_text ? /\($/ : /^\)/
33
+ sibling && sibling.text? && sibling.text =~ match
14
34
  end
15
35
  end
16
36
 
@@ -6,8 +6,16 @@ module Stepmod
6
6
  class Sub < ReverseAdoc::Converters::Base
7
7
  def convert(node, state = {})
8
8
  content = treat_children(node, state)
9
+ return stem_notation(content) if node.parent.name == 'eqn'
10
+
9
11
  "#{content[/^\s*/]}~#{content.strip}~#{content[/\s*$/]}"
10
12
  end
13
+
14
+ private
15
+
16
+ def stem_notation(content)
17
+ "_{#{content}}"
18
+ end
11
19
  end
12
20
 
13
21
  ReverseAdoc::Converters.register :sub, Sub.new
@@ -6,8 +6,14 @@ module Stepmod
6
6
  class Sup < ReverseAdoc::Converters::Base
7
7
  def convert(node, state = {})
8
8
  content = treat_children(node, state)
9
+ return stem_notation(content) if node.parent.name == 'eqn'
10
+
9
11
  "#{content[/^\s*/]}^#{content.strip}^#{content[/\s*$/]}"
10
12
  end
13
+
14
+ def stem_notation(content)
15
+ "^{#{content}}"
16
+ end
11
17
  end
12
18
 
13
19
  ReverseAdoc::Converters.register :sup, Sup.new
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class Table < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ id = node['id']
9
+ anchor = id ? "[[#{id}]]\n" : ""
10
+ title = node['caption'].to_s
11
+ title = ".#{title}\n" unless title.empty?
12
+ attrs = style(node)
13
+ "\n\n#{anchor}#{attrs}#{title}|===\n#{treat_children(node, state)}\n|===\n"
14
+ end
15
+
16
+ def frame(node)
17
+ case node["frame"]
18
+ when "void"
19
+ "frame=none"
20
+ when "hsides"
21
+ "frame=topbot"
22
+ when "vsides"
23
+ "frame=sides"
24
+ when "box", "border"
25
+ "frame=all"
26
+ else
27
+ nil
28
+ end
29
+ end
30
+
31
+ def rules(node)
32
+ case node["rules"]
33
+ when "all"
34
+ "rules=all"
35
+ when "rows"
36
+ "rules=rows"
37
+ when "cols"
38
+ "rules=cols"
39
+ when "none"
40
+ "rules=none"
41
+ else
42
+ nil
43
+ end
44
+ end
45
+
46
+ def style(node)
47
+ width = "width=#{node['width']}" if node['width']
48
+ attrs = []
49
+ frame_attr = frame(node)
50
+ rules_attr = rules(node)
51
+ attrs += width if width
52
+ attrs += frame_attr if frame_attr
53
+ attrs += rules_attr if rules_attr
54
+ return "" if attrs.empty?
55
+ "[#{attrs.join(',')}]\n"
56
+ end
57
+ end
58
+
59
+ ReverseAdoc::Converters.register :table, Table.new
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'stepmod/utils/converters/synonym'
4
+
5
+ module Stepmod
6
+ module Utils
7
+ module Converters
8
+ class Uof < ReverseAdoc::Converters::Base
9
+ def convert(node, state = {})
10
+ <<~TEXT
11
+ === #{node['name'].strip}
12
+
13
+ <STEP module> #{treat_children(node, state).strip}
14
+ TEXT
15
+ end
16
+ end
17
+
18
+ ReverseAdoc::Converters.register :uof, Uof.new
19
+ end
20
+ end
21
+ end
@@ -32,13 +32,13 @@ require 'stepmod/utils/converters/schema'
32
32
  require 'stepmod/utils/converters/strong'
33
33
  require 'stepmod/utils/converters/sub'
34
34
  require 'stepmod/utils/converters/sup'
35
+ require 'stepmod/utils/converters/table'
35
36
  require 'stepmod/utils/converters/text'
36
37
  require 'stepmod/utils/cleaner'
37
38
 
38
39
  require 'reverse_adoc/converters/figure'
39
40
  require 'reverse_adoc/converters/img'
40
41
  require 'reverse_adoc/converters/li'
41
- require 'reverse_adoc/converters/table'
42
42
  require 'reverse_adoc/converters/tr'
43
43
  require 'reverse_adoc/converters/td'
44
44
  require 'reverse_adoc/converters/th'
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'reverse_adoc'
4
+ require 'stepmod/utils/converters/arm'
4
5
  require 'stepmod/utils/converters/clause_ref'
5
6
  require 'stepmod/utils/converters/express_ref'
6
7
  require 'stepmod/utils/converters/module_ref'
@@ -11,8 +12,10 @@ require 'stepmod/utils/converters/example'
11
12
  require 'stepmod/utils/converters/note'
12
13
  require 'stepmod/utils/converters/ol'
13
14
  require 'stepmod/utils/converters/stem'
15
+ require 'stepmod/utils/converters/stepmod_ext_description'
14
16
  require 'stepmod/utils/converters/term'
15
17
  require 'stepmod/utils/converters/synonym'
18
+ require 'stepmod/utils/converters/uof'
16
19
 
17
20
  require 'reverse_adoc/converters/a'
18
21
  require 'reverse_adoc/converters/blockquote'
@@ -24,31 +24,55 @@ module Stepmod
24
24
 
25
25
  if File.exists?(descriptions_file)
26
26
  descriptions = Nokogiri::XML(File.read(descriptions_file)).root
27
+ added_resource_descriptions = {}
27
28
  descriptions.xpath('ext_description').each do |description|
28
- unless description.text.strip.empty? then
29
- Dir.chdir(File.dirname(descriptions_file)) do
30
- wrapper = "<ext_descriptions>#{description.to_s}</ext_descriptions>"
31
- output_express << "\n" + Stepmod::Utils::SmrlDescriptionConverter.convert(wrapper)
32
- end
33
- else
34
- # remark is empty, fallback to resource_docs_cache
35
- resource_docs_dir = resource_docs_cache[description['linkend']]
36
- if resource_docs_dir
37
- resource_docs_file = File.join(stepmod_dir, 'data/resource_docs', resource_docs_dir, 'resource.xml')
38
- resource_docs = Nokogiri::XML(File.read(resource_docs_file)).root
39
- schema = resource_docs.xpath("schema[@name='#{description['linkend']}']")
40
-
41
- Dir.chdir(File.dirname(descriptions_file)) do
42
- wrapper = "<resource>#{schema.to_s}</resource>"
43
- output_express << "\n" + Stepmod::Utils::SmrlResourceConverter.convert(wrapper)
44
- end
29
+ # Add base resource from linked path if exists, eg "language_schema.language.wr:WR1" -> "language_schema"
30
+ base_linked = description['linkend'].to_s.split('.').first
31
+ if added_resource_descriptions[base_linked].nil?
32
+ base_reource_doc_dir = resource_docs_cache[description['linkend'].to_s.split('.').first]
33
+ if base_reource_doc_dir
34
+ output_express << convert_from_resource_file(base_reource_doc_dir, stepmod_dir, base_linked, descriptions_file)
45
35
  end
36
+ added_resource_descriptions[base_linked] = true
37
+ end
38
+ resource_docs_dir = resource_docs_cache[description['linkend']]
39
+ # Convert content description
40
+ # when a schema description is available from resource.xml and also descriptions.xml, the description from resource.xml is only used.
41
+ # https://github.com/metanorma/annotated-express/issues/32#issuecomment-792609078
42
+ if description.text.strip.length.positive? && resource_docs_dir.nil?
43
+ output_express << convert_from_description_text(descriptions_file, description)
44
+ end
45
+ # Add converted description from exact linked path
46
+ if resource_docs_dir && added_resource_descriptions[description['linkend']].nil?
47
+ output_express << convert_from_resource_file(resource_docs_dir, stepmod_dir, description['linkend'], descriptions_file)
48
+ added_resource_descriptions[description['linkend']] = true
46
49
  end
47
50
  end
48
51
  end
49
52
 
50
53
  output_express
51
54
  end
55
+
56
+ private
57
+
58
+ def convert_from_description_text(descriptions_file, description)
59
+ Dir.chdir(File.dirname(descriptions_file)) do
60
+ wrapper = "<ext_descriptions>#{description.to_s}</ext_descriptions>"
61
+ "\n" + Stepmod::Utils::SmrlDescriptionConverter.convert(wrapper)
62
+ end
63
+ end
64
+
65
+ def convert_from_resource_file(resource_docs_dir, stepmod_dir, linked, descriptions_file)
66
+ resource_docs_file = File.join(stepmod_dir, 'data/resource_docs', resource_docs_dir, 'resource.xml')
67
+ puts(resource_docs_file)
68
+ resource_docs = Nokogiri::XML(File.read(resource_docs_file)).root
69
+ schema = resource_docs.xpath("schema[@name='#{linked}']")
70
+
71
+ Dir.chdir(File.dirname(descriptions_file)) do
72
+ wrapper = "<resource>#{schema.to_s}</resource>"
73
+ "\n" + Stepmod::Utils::SmrlResourceConverter.convert(wrapper)
74
+ end
75
+ end
52
76
  end
53
77
  end
54
78
  end
@@ -1,5 +1,5 @@
1
1
  module Stepmod
2
2
  module Utils
3
- VERSION = "0.2.3"
3
+ VERSION = "0.3.0"
4
4
  end
5
5
  end
@@ -32,5 +32,6 @@ Gem::Specification.new do |spec|
32
32
  spec.add_runtime_dependency "thor", ">= 0.20.3"
33
33
  spec.add_runtime_dependency "reverse_adoc", ">= 0.2.9"
34
34
  spec.add_runtime_dependency "ptools", '~> 1.3'
35
+ spec.add_runtime_dependency "concurrent-ruby"
35
36
  spec.add_development_dependency "byebug", "~> 11.1"
36
37
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stepmod-utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-02-24 00:00:00.000000000 Z
11
+ date: 2021-05-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: concurrent-ruby
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: byebug
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -68,11 +82,10 @@ dependencies:
68
82
  version: '11.1'
69
83
  description: 'Stepmod-utils is a toolkit that works on STEPmod data.
70
84
 
71
- '
85
+ '
72
86
  email:
73
87
  - open.source@ribose.com
74
88
  executables:
75
- - stepmod-annotate
76
89
  - stepmod-annotate-all
77
90
  - stepmod-build-resource-docs-cache
78
91
  - stepmod-convert-express-description
@@ -93,7 +106,6 @@ files:
93
106
  - Rakefile
94
107
  - bin/console
95
108
  - bin/setup
96
- - exe/stepmod-annotate
97
109
  - exe/stepmod-annotate-all
98
110
  - exe/stepmod-build-resource-docs-cache
99
111
  - exe/stepmod-convert-express-description
@@ -105,6 +117,7 @@ files:
105
117
  - lib/stepmod/utils/cleaner.rb
106
118
  - lib/stepmod/utils/concept.rb
107
119
  - lib/stepmod/utils/converters/a.rb
120
+ - lib/stepmod/utils/converters/arm.rb
108
121
  - lib/stepmod/utils/converters/blockquote.rb
109
122
  - lib/stepmod/utils/converters/br.rb
110
123
  - lib/stepmod/utils/converters/bypass.rb
@@ -141,12 +154,15 @@ files:
141
154
  - lib/stepmod/utils/converters/schema.rb
142
155
  - lib/stepmod/utils/converters/schema_diag.rb
143
156
  - lib/stepmod/utils/converters/stem.rb
157
+ - lib/stepmod/utils/converters/stepmod_ext_description.rb
144
158
  - lib/stepmod/utils/converters/strong.rb
145
159
  - lib/stepmod/utils/converters/sub.rb
146
160
  - lib/stepmod/utils/converters/sup.rb
147
161
  - lib/stepmod/utils/converters/synonym.rb
162
+ - lib/stepmod/utils/converters/table.rb
148
163
  - lib/stepmod/utils/converters/term.rb
149
164
  - lib/stepmod/utils/converters/text.rb
165
+ - lib/stepmod/utils/converters/uof.rb
150
166
  - lib/stepmod/utils/html_to_asciimath.rb
151
167
  - lib/stepmod/utils/smrl_description_converter.rb
152
168
  - lib/stepmod/utils/smrl_resource_converter.rb
@@ -160,7 +176,7 @@ homepage: https://github.com/metanorma/stepmod-utils
160
176
  licenses:
161
177
  - BSD-2-Clause
162
178
  metadata: {}
163
- post_install_message:
179
+ post_install_message:
164
180
  rdoc_options: []
165
181
  require_paths:
166
182
  - lib
@@ -176,7 +192,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
176
192
  version: '0'
177
193
  requirements: []
178
194
  rubygems_version: 3.0.3
179
- signing_key:
195
+ signing_key:
180
196
  specification_version: 4
181
197
  summary: Stepmod-utils is a toolkit that works on STEPmod data.
182
198
  test_files: []
data/exe/stepmod-annotate DELETED
@@ -1,44 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'json'
4
- require 'stepmod/utils/smrl_description_converter'
5
- require 'stepmod/utils/smrl_resource_converter'
6
-
7
- express_file = ARGV.shift
8
- resource_docs_cache_file = ARGV.shift # output of ./stepmod-build-resource-docs-cache
9
- stepmod_dir = ARGV.first || Dir.pwd
10
-
11
- match = File.basename(express_file).match('^(arm|mim|bom)\.exp$')
12
- descriptions_base = match ? "#{match.captures[0]}_descriptions.xml" : 'descriptions.xml'
13
- descriptions_file = File.join(File.dirname(express_file), descriptions_base)
14
-
15
- output_express = File.read(express_file)
16
-
17
- resource_docs_cache = JSON.parse(File.read(resource_docs_cache_file))
18
-
19
- if File.exists?(descriptions_file)
20
- descriptions = Nokogiri::XML(File.read(descriptions_file)).root
21
- descriptions.xpath('ext_description').each do |description|
22
- unless description.text.strip.empty? then
23
- Dir.chdir(File.dirname(descriptions_file)) do
24
- wrapper = "<ext_descriptions>#{description.to_s}</ext_descriptions>"
25
- output_express << "\n" + Stepmod::Utils::SmrlDescriptionConverter.convert(wrapper)
26
- end
27
- else
28
- # remark is empty, fallback to resource_docs_cache
29
- resource_docs_dir = resource_docs_cache[description['linkend']]
30
- if resource_docs_dir
31
- resource_docs_file = File.join(stepmod_dir, 'data/resource_docs', resource_docs_dir, 'resource.xml')
32
- resource_docs = Nokogiri::XML(File.read(resource_docs_file)).root
33
- schema = resource_docs.xpath("schema[@name='#{description['linkend']}']")
34
-
35
- Dir.chdir(File.dirname(descriptions_file)) do
36
- wrapper = "<resource>#{schema.to_s}</resource>"
37
- output_express << "\n" + Stepmod::Utils::SmrlResourceConverter.convert(wrapper)
38
- end
39
- end
40
- end
41
- end
42
- end
43
-
44
- puts output_express