stepmod-utils 0.3.5 → 0.3.7

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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +1 -1
  3. data/.github/workflows/release.yml +4 -3
  4. data/.rubocop.yml +1 -1
  5. data/Gemfile +3 -3
  6. data/Rakefile +1 -1
  7. data/exe/stepmod-annotate-all +17 -11
  8. data/exe/stepmod-build-resource-docs-cache +8 -7
  9. data/exe/stepmod-convert-express-description +6 -4
  10. data/exe/stepmod-convert-express-resource +6 -4
  11. data/exe/stepmod-extract-terms +38 -25
  12. data/exe/stepmod-find-express-files +8 -7
  13. data/lib/stepmod/utils/bibdata.rb +31 -35
  14. data/lib/stepmod/utils/cleaner.rb +3 -3
  15. data/lib/stepmod/utils/concept.rb +30 -35
  16. data/lib/stepmod/utils/converters/a.rb +7 -10
  17. data/lib/stepmod/utils/converters/blockquote.rb +4 -4
  18. data/lib/stepmod/utils/converters/br.rb +1 -1
  19. data/lib/stepmod/utils/converters/bypass.rb +33 -33
  20. data/lib/stepmod/utils/converters/clause_ref.rb +3 -3
  21. data/lib/stepmod/utils/converters/code.rb +1 -1
  22. data/lib/stepmod/utils/converters/comment.rb +5 -3
  23. data/lib/stepmod/utils/converters/dd.rb +2 -2
  24. data/lib/stepmod/utils/converters/def.rb +19 -19
  25. data/lib/stepmod/utils/converters/drop.rb +2 -2
  26. data/lib/stepmod/utils/converters/dt.rb +2 -2
  27. data/lib/stepmod/utils/converters/em.rb +1 -1
  28. data/lib/stepmod/utils/converters/em_express_description.rb +1 -1
  29. data/lib/stepmod/utils/converters/eqn.rb +28 -26
  30. data/lib/stepmod/utils/converters/example.rb +5 -6
  31. data/lib/stepmod/utils/converters/express_g.rb +10 -9
  32. data/lib/stepmod/utils/converters/express_ref.rb +2 -2
  33. data/lib/stepmod/utils/converters/express_ref_express_description.rb +3 -2
  34. data/lib/stepmod/utils/converters/ext_description.rb +1 -1
  35. data/lib/stepmod/utils/converters/figure.rb +3 -3
  36. data/lib/stepmod/utils/converters/fund_cons.rb +1 -1
  37. data/lib/stepmod/utils/converters/head.rb +3 -2
  38. data/lib/stepmod/utils/converters/hr.rb +2 -2
  39. data/lib/stepmod/utils/converters/ignore.rb +3 -3
  40. data/lib/stepmod/utils/converters/introduction.rb +1 -1
  41. data/lib/stepmod/utils/converters/module_ref.rb +6 -6
  42. data/lib/stepmod/utils/converters/note.rb +5 -6
  43. data/lib/stepmod/utils/converters/ol.rb +5 -5
  44. data/lib/stepmod/utils/converters/p.rb +2 -2
  45. data/lib/stepmod/utils/converters/pass_through.rb +2 -2
  46. data/lib/stepmod/utils/converters/q.rb +1 -1
  47. data/lib/stepmod/utils/converters/schema.rb +1 -1
  48. data/lib/stepmod/utils/converters/stem.rb +1 -1
  49. data/lib/stepmod/utils/converters/stepmod_ext_description.rb +5 -4
  50. data/lib/stepmod/utils/converters/strong.rb +5 -4
  51. data/lib/stepmod/utils/converters/sub.rb +2 -2
  52. data/lib/stepmod/utils/converters/sup.rb +2 -2
  53. data/lib/stepmod/utils/converters/synonym.rb +2 -2
  54. data/lib/stepmod/utils/converters/table.rb +7 -9
  55. data/lib/stepmod/utils/converters/term.rb +18 -9
  56. data/lib/stepmod/utils/converters/text.rb +11 -13
  57. data/lib/stepmod/utils/converters/uof.rb +3 -4
  58. data/lib/stepmod/utils/html_to_asciimath.rb +91 -90
  59. data/lib/stepmod/utils/smrl_description_converter.rb +34 -33
  60. data/lib/stepmod/utils/smrl_resource_converter.rb +50 -49
  61. data/lib/stepmod/utils/stepmod_definition_converter.rb +39 -38
  62. data/lib/stepmod/utils/stepmod_file_annotator.rb +26 -19
  63. data/lib/stepmod/utils/terms_extractor.rb +138 -86
  64. data/lib/stepmod/utils/version.rb +1 -1
  65. data/stepmod-utils.gemspec +11 -5
  66. metadata +71 -15
@@ -1,43 +1,44 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'reverse_adoc'
4
- require 'stepmod/utils/converters/a'
5
- require 'stepmod/utils/converters/blockquote'
6
- require 'stepmod/utils/converters/br'
7
- require 'stepmod/utils/converters/bypass'
8
- require 'stepmod/utils/converters/code'
9
- require 'stepmod/utils/converters/drop'
10
- require 'stepmod/utils/converters/em_express_description'
11
- require 'stepmod/utils/converters/example'
12
- require 'stepmod/utils/converters/express_ref_express_description'
13
- require 'stepmod/utils/converters/ext_description'
14
- require 'stepmod/utils/converters/ext_descriptions'
15
- require 'stepmod/utils/converters/head'
16
- require 'stepmod/utils/converters/hr'
17
- require 'stepmod/utils/converters/ignore'
18
- require 'stepmod/utils/converters/note'
19
- require 'stepmod/utils/converters/p'
20
- require 'stepmod/utils/converters/pass_through'
21
- require 'stepmod/utils/converters/q'
22
- require 'stepmod/utils/converters/strong'
23
- require 'stepmod/utils/converters/sub'
24
- require 'stepmod/utils/converters/sup'
25
- require 'stepmod/utils/converters/text'
26
- require 'stepmod/utils/cleaner'
3
+ require "reverse_adoc"
4
+ require "stepmod/utils/converters/a"
5
+ require "stepmod/utils/converters/blockquote"
6
+ require "stepmod/utils/converters/br"
7
+ require "stepmod/utils/converters/bypass"
8
+ require "stepmod/utils/converters/code"
9
+ require "stepmod/utils/converters/drop"
10
+ require "stepmod/utils/converters/em_express_description"
11
+ require "stepmod/utils/converters/example"
12
+ require "stepmod/utils/converters/express_ref_express_description"
13
+ require "stepmod/utils/converters/ext_description"
14
+ require "stepmod/utils/converters/ext_descriptions"
15
+ require "stepmod/utils/converters/head"
16
+ require "stepmod/utils/converters/hr"
17
+ require "stepmod/utils/converters/ignore"
18
+ require "stepmod/utils/converters/note"
19
+ require "stepmod/utils/converters/p"
20
+ require "stepmod/utils/converters/pass_through"
21
+ require "stepmod/utils/converters/q"
22
+ require "stepmod/utils/converters/strong"
23
+ require "stepmod/utils/converters/sub"
24
+ require "stepmod/utils/converters/sup"
25
+ require "stepmod/utils/converters/text"
26
+ require "stepmod/utils/cleaner"
27
27
 
28
28
  module Stepmod
29
29
  module Utils
30
30
  class SmrlDescriptionConverter
31
31
  def self.convert(input, options = {})
32
- root = if input.is_a?(String)
33
- then Nokogiri::XML(input).root
34
- elsif input.is_a?(Nokogiri::XML::Document)
35
- then input.root
36
- elsif input.is_a?(Nokogiri::XML::Node)
37
- then input
38
- end
32
+ root = case input
33
+ when String
34
+ Nokogiri::XML(input).root
35
+ when Nokogiri::XML::Document
36
+ input.root
37
+ when Nokogiri::XML::Node
38
+ input
39
+ end
39
40
 
40
- root || (return '')
41
+ root || (return "")
41
42
 
42
43
  ReverseAdoc.config.with(options) do
43
44
  result = ReverseAdoc::Converters.lookup(root.name).convert(root)
@@ -46,4 +47,4 @@ module Stepmod
46
47
  end
47
48
  end
48
49
  end
49
- end
50
+ end
@@ -1,61 +1,62 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'reverse_adoc'
4
- require 'reverse_adoc/converters/bypass'
5
- require 'reverse_adoc/converters/pass_through'
6
- require 'stepmod/utils/converters/a'
7
- require 'stepmod/utils/converters/blockquote'
8
- require 'stepmod/utils/converters/br'
9
- require 'stepmod/utils/converters/bypass'
10
- require 'stepmod/utils/converters/code'
11
- require 'stepmod/utils/converters/comment'
12
- require 'stepmod/utils/converters/dd'
13
- require 'stepmod/utils/converters/dl'
14
- require 'stepmod/utils/converters/dt'
15
- require 'stepmod/utils/converters/drop'
16
- require 'stepmod/utils/converters/example'
17
- require 'stepmod/utils/converters/express_g'
18
- require 'stepmod/utils/converters/fund_cons'
19
- require 'stepmod/utils/converters/eqn'
20
- require 'stepmod/utils/converters/head'
21
- require 'stepmod/utils/converters/hr'
22
- require 'stepmod/utils/converters/ignore'
23
- require 'stepmod/utils/converters/introduction'
24
- require 'stepmod/utils/converters/note'
25
- require 'stepmod/utils/converters/ol'
26
- require 'stepmod/utils/converters/p'
27
- require 'stepmod/utils/converters/pass_through'
28
- require 'stepmod/utils/converters/q'
29
- require 'stepmod/utils/converters/resource'
30
- require 'stepmod/utils/converters/schema_diag'
31
- require 'stepmod/utils/converters/schema'
32
- require 'stepmod/utils/converters/strong'
33
- require 'stepmod/utils/converters/sub'
34
- require 'stepmod/utils/converters/sup'
35
- require 'stepmod/utils/converters/table'
36
- require 'stepmod/utils/converters/text'
37
- require 'stepmod/utils/cleaner'
3
+ require "reverse_adoc"
4
+ require "reverse_adoc/converters/bypass"
5
+ require "reverse_adoc/converters/pass_through"
6
+ require "stepmod/utils/converters/a"
7
+ require "stepmod/utils/converters/blockquote"
8
+ require "stepmod/utils/converters/br"
9
+ require "stepmod/utils/converters/bypass"
10
+ require "stepmod/utils/converters/code"
11
+ require "stepmod/utils/converters/comment"
12
+ require "stepmod/utils/converters/dd"
13
+ require "stepmod/utils/converters/dl"
14
+ require "stepmod/utils/converters/dt"
15
+ require "stepmod/utils/converters/drop"
16
+ require "stepmod/utils/converters/example"
17
+ require "stepmod/utils/converters/express_g"
18
+ require "stepmod/utils/converters/fund_cons"
19
+ require "stepmod/utils/converters/eqn"
20
+ require "stepmod/utils/converters/head"
21
+ require "stepmod/utils/converters/hr"
22
+ require "stepmod/utils/converters/ignore"
23
+ require "stepmod/utils/converters/introduction"
24
+ require "stepmod/utils/converters/note"
25
+ require "stepmod/utils/converters/ol"
26
+ require "stepmod/utils/converters/p"
27
+ require "stepmod/utils/converters/pass_through"
28
+ require "stepmod/utils/converters/q"
29
+ require "stepmod/utils/converters/resource"
30
+ require "stepmod/utils/converters/schema_diag"
31
+ require "stepmod/utils/converters/schema"
32
+ require "stepmod/utils/converters/strong"
33
+ require "stepmod/utils/converters/sub"
34
+ require "stepmod/utils/converters/sup"
35
+ require "stepmod/utils/converters/table"
36
+ require "stepmod/utils/converters/text"
37
+ require "stepmod/utils/cleaner"
38
38
 
39
- require 'reverse_adoc/converters/figure'
40
- require 'reverse_adoc/converters/img'
41
- require 'reverse_adoc/converters/li'
42
- require 'reverse_adoc/converters/tr'
43
- require 'reverse_adoc/converters/td'
44
- require 'reverse_adoc/converters/th'
39
+ require "reverse_adoc/converters/figure"
40
+ require "reverse_adoc/converters/img"
41
+ require "reverse_adoc/converters/li"
42
+ require "reverse_adoc/converters/tr"
43
+ require "reverse_adoc/converters/td"
44
+ require "reverse_adoc/converters/th"
45
45
 
46
46
  module Stepmod
47
47
  module Utils
48
48
  class SmrlResourceConverter
49
49
  def self.convert(input, options = {})
50
- root = if input.is_a?(String)
51
- then Nokogiri::XML(input).root
52
- elsif input.is_a?(Nokogiri::XML::Document)
53
- then input.root
54
- elsif input.is_a?(Nokogiri::XML::Node)
55
- then input
56
- end
50
+ root = case input
51
+ when String
52
+ Nokogiri::XML(input).root
53
+ when Nokogiri::XML::Document
54
+ input.root
55
+ when Nokogiri::XML::Node
56
+ input
57
+ end
57
58
 
58
- root || (return '')
59
+ root || (return "")
59
60
 
60
61
  ReverseAdoc.config.with(options) do
61
62
  result = ReverseAdoc::Converters.lookup(root.name).convert(root)
@@ -1,41 +1,40 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'reverse_adoc'
4
- require 'stepmod/utils/converters/arm'
5
- require 'stepmod/utils/converters/clause_ref'
6
- require 'stepmod/utils/converters/express_ref'
7
- require 'stepmod/utils/converters/module_ref'
8
- require 'stepmod/utils/converters/def'
9
- require 'stepmod/utils/converters/definition'
10
- require 'stepmod/utils/converters/em'
11
- require 'stepmod/utils/converters/example'
12
- require 'stepmod/utils/converters/note'
13
- require 'stepmod/utils/converters/ol'
14
- require 'stepmod/utils/converters/stem'
15
- require 'stepmod/utils/converters/stepmod_ext_description'
16
- require 'stepmod/utils/converters/term'
17
- require 'stepmod/utils/converters/synonym'
18
- require 'stepmod/utils/converters/uof'
19
- require 'stepmod/utils/converters/figure'
20
-
21
- require 'reverse_adoc/converters/a'
22
- require 'reverse_adoc/converters/blockquote'
23
- require 'reverse_adoc/converters/bypass'
24
- require 'reverse_adoc/converters/br'
25
- require 'reverse_adoc/converters/code'
26
- require 'reverse_adoc/converters/drop'
27
- require 'reverse_adoc/converters/head'
28
- require 'reverse_adoc/converters/hr'
29
- require 'reverse_adoc/converters/ignore'
30
- require 'reverse_adoc/converters/li'
31
- require 'reverse_adoc/converters/p'
32
- require 'reverse_adoc/converters/pass_through'
33
- require 'reverse_adoc/converters/q'
34
- require 'reverse_adoc/converters/strong'
35
- require 'reverse_adoc/converters/sup'
36
- require 'reverse_adoc/converters/sub'
37
- require 'reverse_adoc/converters/text'
3
+ require "reverse_adoc"
4
+ require "stepmod/utils/converters/arm"
5
+ require "stepmod/utils/converters/clause_ref"
6
+ require "stepmod/utils/converters/express_ref"
7
+ require "stepmod/utils/converters/module_ref"
8
+ require "stepmod/utils/converters/def"
9
+ require "stepmod/utils/converters/definition"
10
+ require "stepmod/utils/converters/em"
11
+ require "stepmod/utils/converters/example"
12
+ require "stepmod/utils/converters/note"
13
+ require "stepmod/utils/converters/ol"
14
+ require "stepmod/utils/converters/stem"
15
+ require "stepmod/utils/converters/stepmod_ext_description"
16
+ require "stepmod/utils/converters/term"
17
+ require "stepmod/utils/converters/synonym"
18
+ require "stepmod/utils/converters/uof"
19
+ require "stepmod/utils/converters/figure"
38
20
 
21
+ require "reverse_adoc/converters/a"
22
+ require "reverse_adoc/converters/blockquote"
23
+ require "reverse_adoc/converters/bypass"
24
+ require "reverse_adoc/converters/br"
25
+ require "reverse_adoc/converters/code"
26
+ require "reverse_adoc/converters/drop"
27
+ require "reverse_adoc/converters/head"
28
+ require "reverse_adoc/converters/hr"
29
+ require "reverse_adoc/converters/ignore"
30
+ require "reverse_adoc/converters/li"
31
+ require "reverse_adoc/converters/p"
32
+ require "reverse_adoc/converters/pass_through"
33
+ require "reverse_adoc/converters/q"
34
+ require "reverse_adoc/converters/strong"
35
+ require "reverse_adoc/converters/sup"
36
+ require "reverse_adoc/converters/sub"
37
+ require "reverse_adoc/converters/text"
39
38
 
40
39
  module Stepmod
41
40
  module Utils
@@ -50,11 +49,13 @@ module Stepmod
50
49
  input
51
50
  end
52
51
 
53
- return '' unless root
52
+ return "" unless root
54
53
 
55
54
  ReverseAdoc.config.with(options) do
56
- result = ReverseAdoc::Converters.lookup(root.name).convert(root, options)
57
- return '' unless result
55
+ result = ReverseAdoc::Converters.lookup(root.name).convert(root,
56
+ options)
57
+ return "" unless result
58
+
58
59
  ReverseAdoc.cleaner.tidy(result.dup)
59
60
  end
60
61
  end
@@ -1,6 +1,6 @@
1
- require 'json'
2
- require 'stepmod/utils/smrl_description_converter'
3
- require 'stepmod/utils/smrl_resource_converter'
1
+ require "json"
2
+ require "stepmod/utils/smrl_description_converter"
3
+ require "stepmod/utils/smrl_resource_converter"
4
4
 
5
5
  module Stepmod
6
6
  module Utils
@@ -17,35 +17,41 @@ module Stepmod
17
17
 
18
18
  def call
19
19
  match = File.basename(express_file).match('^(arm|mim|bom)\.exp$')
20
- descriptions_base = match ? "#{match.captures[0]}_descriptions.xml" : 'descriptions.xml'
21
- descriptions_file = File.join(File.dirname(express_file), descriptions_base)
20
+ descriptions_base = match ? "#{match.captures[0]}_descriptions.xml" : "descriptions.xml"
21
+ descriptions_file = File.join(File.dirname(express_file),
22
+ descriptions_base)
22
23
  output_express = File.read(express_file)
23
24
  resource_docs_cache = JSON.parse(File.read(resource_docs_cache_file))
24
25
 
25
26
  if File.exists?(descriptions_file)
26
27
  descriptions = Nokogiri::XML(File.read(descriptions_file)).root
27
28
  added_resource_descriptions = {}
28
- descriptions.xpath('ext_description').each do |description|
29
+ descriptions.xpath("ext_description").each do |description|
29
30
  # 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
+ base_linked = description["linkend"].to_s.split(".").first
31
32
  if added_resource_descriptions[base_linked].nil?
32
- base_reource_doc_dir = resource_docs_cache[description['linkend'].to_s.split('.').first]
33
+ base_reource_doc_dir = resource_docs_cache[description["linkend"].to_s.split(".").first]
33
34
  if base_reource_doc_dir
34
- output_express << convert_from_resource_file(base_reource_doc_dir, stepmod_dir, base_linked, descriptions_file)
35
+ output_express << convert_from_resource_file(
36
+ base_reource_doc_dir, stepmod_dir, base_linked, descriptions_file
37
+ )
35
38
  end
36
39
  added_resource_descriptions[base_linked] = true
37
40
  end
38
- resource_docs_dir = resource_docs_cache[description['linkend']]
41
+ resource_docs_dir = resource_docs_cache[description["linkend"]]
39
42
  # Convert content description
40
43
  # when a schema description is available from resource.xml and also descriptions.xml, the description from resource.xml is only used.
41
44
  # https://github.com/metanorma/annotated-express/issues/32#issuecomment-792609078
42
45
  if description.text.strip.length.positive? && resource_docs_dir.nil?
43
- output_express << convert_from_description_text(descriptions_file, description)
46
+ output_express << convert_from_description_text(
47
+ descriptions_file, description
48
+ )
44
49
  end
45
50
  # 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
51
+ if resource_docs_dir && added_resource_descriptions[description["linkend"]].nil?
52
+ output_express << convert_from_resource_file(resource_docs_dir,
53
+ stepmod_dir, description["linkend"], descriptions_file)
54
+ added_resource_descriptions[description["linkend"]] = true
49
55
  end
50
56
  end
51
57
  end
@@ -57,20 +63,21 @@ module Stepmod
57
63
 
58
64
  def convert_from_description_text(descriptions_file, description)
59
65
  Dir.chdir(File.dirname(descriptions_file)) do
60
- wrapper = "<ext_descriptions>#{description.to_s}</ext_descriptions>"
61
- "\n" + Stepmod::Utils::SmrlDescriptionConverter.convert(wrapper)
66
+ wrapper = "<ext_descriptions>#{description}</ext_descriptions>"
67
+ "\n#{Stepmod::Utils::SmrlDescriptionConverter.convert(wrapper)}"
62
68
  end
63
69
  end
64
70
 
65
71
  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')
72
+ resource_docs_file = File.join(stepmod_dir, "data/resource_docs",
73
+ resource_docs_dir, "resource.xml")
67
74
  puts(resource_docs_file)
68
75
  resource_docs = Nokogiri::XML(File.read(resource_docs_file)).root
69
76
  schema = resource_docs.xpath("schema[@name='#{linked}']")
70
77
 
71
78
  Dir.chdir(File.dirname(descriptions_file)) do
72
- wrapper = "<resource>#{schema.to_s}</resource>"
73
- "\n" + Stepmod::Utils::SmrlResourceConverter.convert(wrapper)
79
+ wrapper = "<resource>#{schema}</resource>"
80
+ "\n#{Stepmod::Utils::SmrlResourceConverter.convert(wrapper)}"
74
81
  end
75
82
  end
76
83
  end
@@ -1,6 +1,8 @@
1
- require 'stepmod/utils/stepmod_definition_converter'
2
- require 'stepmod/utils/bibdata'
3
- require 'stepmod/utils/concept'
1
+ require "stepmod/utils/stepmod_definition_converter"
2
+ require "stepmod/utils/bibdata"
3
+ require "stepmod/utils/concept"
4
+ require "glossarist"
5
+ require "securerandom"
4
6
 
5
7
  ReverseAdoc.config.unknown_tags = :bypass
6
8
 
@@ -8,21 +10,22 @@ module Stepmod
8
10
  module Utils
9
11
  class TermsExtractor
10
12
  # TODO: we may want a command line option to override this in the future
11
- ACCEPTED_STAGES = %w(IS DIS FDIS TS)
13
+ ACCEPTED_STAGES = %w(IS DIS FDIS TS).freeze
14
+ WITHDRAWN_STATUS = "withdrawn".freeze
12
15
 
13
16
  attr_reader :stepmod_path,
14
- :stepmod_dir,
15
- :general_concepts,
16
- :resource_concepts,
17
- :parsed_bibliography,
18
- :encountered_terms,
19
- :cvs_mode,
20
- :part_concepts,
21
- :part_resources,
22
- :part_modules,
23
- :stdout
24
-
25
- def self.call(stepmod_dir, stdout = STDOUT)
17
+ :stepmod_dir,
18
+ :general_concepts,
19
+ :resource_concepts,
20
+ :parsed_bibliography,
21
+ :encountered_terms,
22
+ :cvs_mode,
23
+ :part_concepts,
24
+ :part_resources,
25
+ :part_modules,
26
+ :stdout
27
+
28
+ def self.call(stepmod_dir, stdout = $stdout)
26
29
  new(stepmod_dir, stdout).call
27
30
  end
28
31
 
@@ -30,8 +33,8 @@ module Stepmod
30
33
  @stdout = stdout
31
34
  @stepmod_dir = stepmod_dir
32
35
  @stepmod_path = Pathname.new(stepmod_dir).realpath
33
- @general_concepts = []
34
- @resource_concepts = []
36
+ @general_concepts = Glossarist::Collection.new
37
+ @resource_concepts = Glossarist::Collection.new
35
38
  @parsed_bibliography = []
36
39
  @part_concepts = []
37
40
  @part_resources = []
@@ -39,13 +42,13 @@ module Stepmod
39
42
  @encountered_terms = {}
40
43
  end
41
44
 
42
- def log message
45
+ def log(message)
43
46
  stdout.puts "[stepmod-utils] #{message}"
44
47
  end
45
48
 
46
49
  def term_special_category(bibdata)
47
50
  case bibdata.part.to_i
48
- when 41,42,43,44,45,46,47,51
51
+ when 41, 42, 43, 44, 45, 46, 47, 51
49
52
  true
50
53
  when [56..112]
51
54
  true
@@ -56,47 +59,58 @@ module Stepmod
56
59
 
57
60
  def call
58
61
  # If we are using the stepmod CVS repository, provide the revision number per file
59
- @cvs_mode = if Dir.exists?(stepmod_path.join('CVS'))
60
- require 'ptools'
61
- # ptools provides File.which
62
- File.which("cvs")
63
- end
62
+ @cvs_mode = if Dir.exists?(stepmod_path.join("CVS"))
63
+ require "ptools"
64
+ # ptools provides File.which
65
+ File.which("cvs")
66
+ end
64
67
 
65
68
  log "INFO: STEPmod directory set to #{stepmod_dir}."
66
69
 
67
70
  if cvs_mode
68
- log "INFO: STEPmod directory is a CVS repository and will detect revisions."
69
- log "INFO: [CVS] Detecting file revisions can be slow, please be patient!"
71
+ log "INFO: STEPmod directory is a \
72
+ CVS repository and will detect revisions."
73
+ log "INFO: [CVS] Detecting file revisions can be slow, \
74
+ please be patient!"
70
75
  else
71
- log "INFO: STEPmod directory is not a CVS repository, skipping revision detection."
76
+ log "INFO: STEPmod directory is not a CVS repository, \
77
+ skipping revision detection."
72
78
  end
73
79
 
74
80
  log "INFO: Detecting paths..."
75
81
 
76
- repo_index = Nokogiri::XML(File.read(stepmod_path.join('repository_index.xml'))).root
82
+ repo_index = Nokogiri::XML(File.read(stepmod_path.join("repository_index.xml"))).root
77
83
 
78
84
  files = []
79
85
 
80
86
  # add module paths
81
- repo_index.xpath('//module').each do |x|
87
+ repo_index.xpath("//module").each do |x|
88
+ next if x['status'] == WITHDRAWN_STATUS
89
+
82
90
  path = Pathname.new("#{stepmod_dir}/modules/#{x['name']}/module.xml")
83
91
  files << path if File.exists? path
84
92
  end
85
93
 
86
94
  # add resource_docs paths
87
- repo_index.xpath('//resource_doc').each do |x|
95
+ repo_index.xpath("//resource_doc").each do |x|
96
+ next if x['status'] == WITHDRAWN_STATUS
97
+
88
98
  path = Pathname.new("#{stepmod_dir}/resource_docs/#{x['name']}/resource.xml")
89
99
  files << path if File.exists? path
90
100
  end
91
101
 
92
102
  # add business_object_models paths
93
- repo_index.xpath('//business_object_model').each do |x|
103
+ repo_index.xpath("//business_object_model").each do |x|
104
+ next if x['status'] == WITHDRAWN_STATUS
105
+
94
106
  path = Pathname.new("#{stepmod_dir}/business_object_models/#{x['name']}/business_object_model.xml")
95
107
  files << path if File.exists? path
96
108
  end
97
109
 
98
110
  # add application_protocols paths
99
- repo_index.xpath('//application_protocol').each do |x|
111
+ repo_index.xpath("//application_protocol").each do |x|
112
+ next if x['status'] == WITHDRAWN_STATUS
113
+
100
114
  path = Pathname.new("#{stepmod_dir}/application_protocols/#{x['name']}/application_protocol.xml")
101
115
  files << path if File.exists? path
102
116
  end
@@ -110,7 +124,7 @@ module Stepmod
110
124
  parsed_bibliography,
111
125
  part_concepts,
112
126
  part_resources,
113
- part_modules
127
+ part_modules,
114
128
  ]
115
129
  end
116
130
 
@@ -128,13 +142,14 @@ module Stepmod
128
142
  bibdata = nil
129
143
  begin
130
144
  bibdata = Stepmod::Utils::Bibdata.new(document: current_document)
131
- rescue
145
+ rescue StandardError
132
146
  log "WARNING: Unknown file #{fpath}, skipped"
133
147
  next
134
148
  end
135
149
 
136
150
  unless ACCEPTED_STAGES.include? bibdata.doctype
137
- log "INFO: skipped #{bibdata.docid} as it is not one of (#{ACCEPTED_STAGES.join(", ")})."
151
+ log "INFO: skipped #{bibdata.docid} as it is not \
152
+ one of (#{ACCEPTED_STAGES.join(', ')})."
138
153
  next
139
154
  end
140
155
 
@@ -153,9 +168,12 @@ module Stepmod
153
168
  status = `cvs status #{fpath}`
154
169
 
155
170
  unless status.empty?
156
- working_rev = status.split(/\n/).grep(/Working revision:/).first.match(/revision:\s+(.+)$/)[1]
157
- repo_rev = status.split(/\n/).grep(/Repository revision:/).first.match(/revision:\t(.+)\t/)[1]
158
- log "INFO: CVS working rev (#{working_rev}), repo rev (#{repo_rev})"
171
+ working_rev = status.split(/\n/).grep(/Working revision:/)
172
+ .first.match(/revision:\s+(.+)$/)[1]
173
+ repo_rev = status.split(/\n/).grep(/Repository revision:/)
174
+ .first.match(/revision:\t(.+)\t/)[1]
175
+ log "INFO: CVS working rev (#{working_rev}), \
176
+ repo rev (#{repo_rev})"
159
177
  revision_string = "\n// CVS working rev: (#{working_rev}), repo rev (#{repo_rev})\n" +
160
178
  "// CVS: revision #{working_rev == repo_rev ? 'up to date' : 'differs'}"
161
179
  end
@@ -163,11 +181,11 @@ module Stepmod
163
181
  end
164
182
 
165
183
  # read definitions
166
- current_part_concepts = []
184
+ current_part_concepts = Glossarist::Collection.new
167
185
  definition_index = 0
168
- current_document.xpath('//definition').each do |definition|
186
+ current_document.xpath("//definition").each do |definition|
169
187
  definition_index += 1
170
- term_id = definition['id']
188
+ term_id = definition["id"]
171
189
  unless term_id.nil?
172
190
  if encountered_terms[term_id]
173
191
  log "FATAL: Duplicated term with id: #{term_id}, #{fpath}"
@@ -183,22 +201,22 @@ module Stepmod
183
201
  definition,
184
202
  reference_anchor: bibdata.anchor,
185
203
  reference_clause: ref_clause,
186
- file_path: fpath + revision_string
204
+ file_path: fpath + revision_string,
187
205
  )
188
206
  next unless concept
189
207
 
190
- unless term_special_category(bibdata)
191
- # log "INFO: this part is generic"
192
- general_concepts << concept
193
- else
208
+ if term_special_category(bibdata)
194
209
  # log "INFO: this part is special"
195
- current_part_concepts << concept
210
+ find_or_initialize_concept(current_part_concepts, concept)
211
+ else
212
+ # log "INFO: this part is generic"
213
+ find_or_initialize_concept(general_concepts, concept)
196
214
  end
197
215
 
198
216
  parsed_bibliography << bibdata
199
217
  end
200
218
 
201
- current_part_resources = []
219
+ current_part_resources = Glossarist::Collection.new
202
220
  current_part_modules_arm = {}
203
221
  current_part_modules_mim = {}
204
222
 
@@ -207,10 +225,12 @@ module Stepmod
207
225
  when /resource.xml$/
208
226
  log "INFO: Processing resource.xml for #{file_path}"
209
227
  # Assumption: every schema is only linked by a single resource_docs document.
210
- current_document.xpath('//schema').each do |schema_node|
211
- schema_name = schema_node['name']
228
+ current_document.xpath("//schema").each do |schema_node|
229
+ schema_name = schema_node["name"]
212
230
  if parsed_schema_names[schema_name]
213
- log "ERROR: We have encountered this schema before: #{schema_name} from path #{parsed_schema_names[schema_name]}, now at #{file_path}"
231
+ log "ERROR: We have encountered this schema before: \
232
+ #{schema_name} from path \
233
+ #{parsed_schema_names[schema_name]}, now at #{file_path}"
214
234
  next
215
235
  else
216
236
  parsed_schema_names[schema_name] = file_path
@@ -219,24 +239,24 @@ module Stepmod
219
239
  Dir["#{stepmod_path}/resources/#{schema_name}/descriptions.xml"].each do |description_xml_path|
220
240
  log "INFO: Processing resources schema #{description_xml_path}"
221
241
  description_document = Nokogiri::XML(File.read(description_xml_path)).root
222
- description_document.xpath('//ext_description').each do |ext_description|
223
-
242
+ description_document.xpath("//ext_description").each do |ext_description|
224
243
  # log "INFO: Processing linkend[#{ext_description['linkend']}]"
225
244
 
226
245
  concept = Stepmod::Utils::Concept.parse(
227
246
  ext_description,
228
247
  reference_anchor: bibdata.anchor,
229
248
  reference_clause: nil,
230
- file_path: Pathname.new(description_xml_path).relative_path_from(stepmod_path)
249
+ file_path: Pathname.new(description_xml_path)
250
+ .relative_path_from(stepmod_path),
231
251
  )
232
252
  next unless concept
233
253
 
234
- unless term_special_category(bibdata)
235
- # log "INFO: this part is generic"
236
- resource_concepts << concept
237
- else
254
+ if term_special_category(bibdata)
238
255
  # log "INFO: this part is special"
239
- current_part_resources << concept
256
+ find_or_initialize_concept(current_part_resources, concept)
257
+ else
258
+ # log "INFO: this part is generic"
259
+ find_or_initialize_concept(resource_concepts, concept)
240
260
  end
241
261
 
242
262
  parsed_bibliography << bibdata
@@ -248,9 +268,11 @@ module Stepmod
248
268
  log "INFO: Processing module.xml for #{file_path}"
249
269
  # Assumption: every schema is only linked by a single module document.
250
270
  # puts current_document.xpath('//module').length
251
- schema_name = current_document.xpath('//module').first['name']
271
+ schema_name = current_document.xpath("//module").first["name"]
252
272
  if parsed_schema_names[schema_name]
253
- log "ERROR: We have encountered this schema before: #{schema_name} from path #{parsed_schema_names[schema_name]}, now at #{file_path}"
273
+ log "ERROR: We have encountered this schema before: \
274
+ #{schema_name} from path #{parsed_schema_names[schema_name]}, \
275
+ now at #{file_path}"
254
276
  next
255
277
  else
256
278
  parsed_schema_names[schema_name] = file_path
@@ -260,20 +282,25 @@ module Stepmod
260
282
  log "INFO: Processing modules schema #{description_xml_path}"
261
283
 
262
284
  if File.exists?(description_xml_path)
263
- description_document = Nokogiri::XML(File.read(description_xml_path)).root
264
- description_document.xpath('//ext_description').each do |ext_description|
265
-
266
- linkend_schema = ext_description['linkend'].split('.').first
285
+ description_document = Nokogiri::XML(
286
+ File.read(description_xml_path),
287
+ )
288
+ .root
289
+ description_document.xpath("//ext_description").each do |ext_description|
290
+ linkend_schema = ext_description["linkend"].split(".").first
267
291
  concept = Stepmod::Utils::Concept.parse(
268
292
  ext_description,
269
293
  reference_anchor: bibdata.anchor,
270
294
  reference_clause: nil,
271
- file_path: Pathname.new(description_xml_path).relative_path_from(stepmod_path)
295
+ file_path: Pathname.new(description_xml_path)
296
+ .relative_path_from(stepmod_path),
272
297
  )
273
298
  next unless concept
274
299
 
275
- current_part_modules_arm[linkend_schema] ||= []
276
- current_part_modules_arm[linkend_schema] << concept
300
+ current_part_modules_arm[linkend_schema] ||= Glossarist::Collection.new
301
+ find_or_initialize_concept(
302
+ current_part_modules_arm[linkend_schema], concept
303
+ )
277
304
  # puts part_modules_arm.inspect
278
305
  parsed_bibliography << bibdata
279
306
  end
@@ -283,21 +310,28 @@ module Stepmod
283
310
  log "INFO: Processing modules schema #{description_xml_path}"
284
311
 
285
312
  if File.exists?(description_xml_path)
286
- description_document = Nokogiri::XML(File.read(description_xml_path)).root
287
- description_document.xpath('//ext_description').each do |ext_description|
288
-
289
- linkend_schema = ext_description['linkend'].split('.').first
313
+ description_document = Nokogiri::XML(
314
+ File.read(description_xml_path),
315
+ )
316
+ .root
317
+ description_document.xpath("//ext_description").each do |ext_description|
318
+ linkend_schema = ext_description["linkend"].split(".").first
290
319
 
291
320
  concept = Stepmod::Utils::Concept.parse(
292
321
  ext_description,
293
322
  reference_anchor: bibdata.anchor,
294
323
  reference_clause: nil,
295
- file_path: Pathname.new(description_xml_path).relative_path_from(stepmod_path)
324
+ file_path: Pathname
325
+ .new(description_xml_path)
326
+ .relative_path_from(stepmod_path),
296
327
  )
297
328
  next unless concept
298
329
 
299
- current_part_modules_mim[linkend_schema] ||= []
300
- current_part_modules_mim[linkend_schema] << concept
330
+ current_part_modules_mim[linkend_schema] ||=
331
+ Glossarist::Collection.new
332
+ find_or_initialize_concept(
333
+ current_part_modules_mim[linkend_schema], concept
334
+ )
301
335
 
302
336
  parsed_bibliography << bibdata
303
337
  end
@@ -306,21 +340,39 @@ module Stepmod
306
340
  end
307
341
 
308
342
  log "INFO: Completed processing XML file #{fpath}"
309
- if current_part_concepts.empty?
310
- log "INFO: Skipping #{fpath} (#{bibdata.docid}) because it contains no concepts."
311
- elsif current_part_concepts.length < 3
312
- log "INFO: Skipping #{fpath} (#{bibdata.docid}) because it only has #{current_part_concepts.length} terms."
313
-
314
- current_part_concepts.each do |x|
315
- general_concepts << x
343
+ if current_part_concepts.to_a.empty?
344
+ log "INFO: Skipping #{fpath} (#{bibdata.docid}) \
345
+ because it contains no concepts."
346
+ elsif current_part_concepts.to_a.length < 3
347
+ log "INFO: Skipping #{fpath} (#{bibdata.docid}) \
348
+ because it only has #{current_part_concepts.to_a.length} terms."
349
+
350
+ current_part_concepts.to_a.each do |x|
351
+ general_concepts.store(x)
316
352
  end
317
353
  else
318
- part_concepts << [bibdata, current_part_concepts] unless current_part_concepts.empty?
354
+ unless current_part_concepts.to_a.empty?
355
+ part_concepts << [bibdata,
356
+ current_part_concepts]
357
+ end
358
+ end
359
+ unless current_part_resources.to_a.empty?
360
+ part_resources << [bibdata,
361
+ current_part_resources]
362
+ end
363
+ if (current_part_modules_arm.to_a.size +
364
+ current_part_modules_mim.to_a.size).positive?
365
+ part_modules << [bibdata, current_part_modules_arm,
366
+ current_part_modules_mim]
319
367
  end
320
- part_resources << [bibdata, current_part_resources] unless current_part_resources.empty?
321
- part_modules << [bibdata, current_part_modules_arm, current_part_modules_mim] if current_part_modules_arm.size + current_part_modules_mim.size > 0
322
368
  end
323
369
  end
370
+
371
+ def find_or_initialize_concept(collection, localized_concept)
372
+ concept = collection
373
+ .store(Glossarist::Concept.new(id: SecureRandom.uuid))
374
+ concept.add_l10n(localized_concept)
375
+ end
324
376
  end
325
377
  end
326
378
  end