stepmod-utils 0.1.5 → 0.2.3

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 (70) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +51 -0
  3. data/.github/workflows/release.yml +20 -22
  4. data/Gemfile +2 -0
  5. data/Makefile +2 -0
  6. data/README.adoc +136 -2
  7. data/exe/stepmod-annotate +44 -0
  8. data/exe/stepmod-annotate-all +39 -0
  9. data/exe/stepmod-build-resource-docs-cache +19 -0
  10. data/exe/stepmod-convert-express-description +33 -0
  11. data/exe/stepmod-convert-express-resource +33 -0
  12. data/exe/stepmod-extract-terms +62 -13
  13. data/exe/stepmod-find-express-files +23 -0
  14. data/lib/stepmod/utils/cleaner.rb +11 -0
  15. data/lib/stepmod/utils/concept.rb +16 -3
  16. data/lib/stepmod/utils/converters/a.rb +47 -0
  17. data/lib/stepmod/utils/converters/blockquote.rb +22 -0
  18. data/lib/stepmod/utils/converters/br.rb +15 -0
  19. data/lib/stepmod/utils/converters/bypass.rb +81 -0
  20. data/lib/stepmod/utils/converters/clause_ref.rb +2 -2
  21. data/lib/stepmod/utils/converters/code.rb +19 -0
  22. data/lib/stepmod/utils/converters/comment.rb +16 -0
  23. data/lib/stepmod/utils/converters/dd.rb +15 -0
  24. data/lib/stepmod/utils/converters/def.rb +13 -6
  25. data/lib/stepmod/utils/converters/definition.rb +2 -2
  26. data/lib/stepmod/utils/converters/dl.rb +31 -0
  27. data/lib/stepmod/utils/converters/drop.rb +22 -0
  28. data/lib/stepmod/utils/converters/dt.rb +17 -0
  29. data/lib/stepmod/utils/converters/em.rb +3 -3
  30. data/lib/stepmod/utils/converters/em_express_description.rb +22 -0
  31. data/lib/stepmod/utils/converters/eqn.rb +96 -0
  32. data/lib/stepmod/utils/converters/example.rb +3 -8
  33. data/lib/stepmod/utils/converters/express_g.rb +46 -0
  34. data/lib/stepmod/utils/converters/express_ref.rb +2 -2
  35. data/lib/stepmod/utils/converters/express_ref_express_description.rb +13 -0
  36. data/lib/stepmod/utils/converters/ext_description.rb +16 -0
  37. data/lib/stepmod/utils/converters/ext_descriptions.rb +14 -0
  38. data/lib/stepmod/utils/converters/fund_cons.rb +15 -0
  39. data/lib/stepmod/utils/converters/head.rb +22 -0
  40. data/lib/stepmod/utils/converters/hr.rb +15 -0
  41. data/lib/stepmod/utils/converters/ignore.rb +16 -0
  42. data/lib/stepmod/utils/converters/introduction.rb +15 -0
  43. data/lib/stepmod/utils/converters/module_ref.rb +2 -2
  44. data/lib/stepmod/utils/converters/note.rb +3 -8
  45. data/lib/stepmod/utils/converters/ol.rb +7 -6
  46. data/lib/stepmod/utils/converters/p.rb +21 -0
  47. data/lib/stepmod/utils/converters/pass_through.rb +13 -0
  48. data/lib/stepmod/utils/converters/q.rb +16 -0
  49. data/lib/stepmod/utils/converters/resource.rb +14 -0
  50. data/lib/stepmod/utils/converters/schema.rb +18 -0
  51. data/lib/stepmod/utils/converters/schema_diag.rb +14 -0
  52. data/lib/stepmod/utils/converters/stem.rb +2 -2
  53. data/lib/stepmod/utils/converters/strong.rb +21 -0
  54. data/lib/stepmod/utils/converters/sub.rb +16 -0
  55. data/lib/stepmod/utils/converters/sup.rb +16 -0
  56. data/lib/stepmod/utils/converters/synonym.rb +2 -2
  57. data/lib/stepmod/utils/converters/term.rb +2 -2
  58. data/lib/stepmod/utils/converters/text.rb +68 -0
  59. data/lib/stepmod/utils/html_to_asciimath.rb +157 -0
  60. data/lib/stepmod/utils/smrl_description_converter.rb +49 -0
  61. data/lib/stepmod/utils/smrl_resource_converter.rb +67 -0
  62. data/lib/stepmod/utils/stepmod_definition_converter.rb +21 -21
  63. data/lib/stepmod/utils/stepmod_file_annotator.rb +54 -0
  64. data/lib/stepmod/utils/version.rb +1 -1
  65. data/migrating_from_cvs.adoc +190 -0
  66. data/stepmod-utils.gemspec +2 -1
  67. metadata +70 -8
  68. data/.github/workflows/macos.yml +0 -39
  69. data/.github/workflows/ubuntu.yml +0 -53
  70. data/.github/workflows/windows.yml +0 -41
@@ -1,8 +1,7 @@
1
- #!/usr/bin/env ruby
2
-
3
1
  #!/usr/bin/env ruby
4
2
  # encoding: UTF-8
5
3
 
4
+ require 'pry'
6
5
  # resolve bin path, ignoring symlinks
7
6
  require "pathname"
8
7
  bin_file = Pathname.new(__FILE__).realpath
@@ -21,8 +20,9 @@ require 'bundler/setup'
21
20
  require 'stepmod/utils/stepmod_definition_converter'
22
21
  require 'stepmod/utils/bibdata'
23
22
  require 'stepmod/utils/concept'
23
+ require 'ptools'
24
24
 
25
- ReverseAsciidoctor.config.unknown_tags = :bypass
25
+ ReverseAdoc.config.unknown_tags = :bypass
26
26
 
27
27
  parsed_terms = []
28
28
  parsed_bibliography = []
@@ -34,7 +34,22 @@ def log message
34
34
  puts "[stepmod-utils] #{message}"
35
35
  end
36
36
 
37
- log "STEPmod directory set to #{stepmod_dir}. Detecting paths..."
37
+ stepmod_path = Pathname.new(stepmod_dir).realpath
38
+
39
+ # If we are using the stepmod CVS repository, provide the revision number per file
40
+ has_cvs = File.which("cvs")
41
+ cvs_mode = has_cvs && Dir.exists?(stepmod_path.join('CVS'))
42
+
43
+ log "INFO: STEPmod directory set to #{stepmod_dir}."
44
+
45
+ if cvs_mode
46
+ log "INFO: STEPmod directory is a CVS repository and will detect revisions."
47
+ log "INFO: [CVS] Detecting file revisions can be slow, please be patient!"
48
+ else
49
+ log "INFO: STEPmod directory is not a CVS repository, skipping revision detection."
50
+ end
51
+
52
+ log "INFO: Detecting paths..."
38
53
 
39
54
  files = %w(
40
55
  resource.xml
@@ -46,19 +61,48 @@ files = %w(
46
61
  end.flatten.sort.uniq
47
62
 
48
63
  files.each do |file_path|
49
- log "Processing XML file #{file_path}"
64
+ file_path = Pathname.new(file_path).realpath
65
+ fpath = file_path.relative_path_from(stepmod_path)
66
+
67
+ log "INFO: Processing XML file #{fpath}"
50
68
  current_document = Nokogiri::XML(File.read(file_path)).root
51
69
 
52
70
  bibdata = nil
53
71
  begin
54
72
  bibdata = Stepmod::Utils::Bibdata.new(document: current_document)
55
73
  rescue
56
- log "WARNING: Unknown file #{file_path}, skipped"
74
+ log "WARNING: Unknown file #{fpath}, skipped"
75
+ next
76
+ end
77
+
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"
57
81
  next
58
82
  end
59
83
 
60
84
  if bibdata.part.to_s.empty?
61
- log "FATAL: missing `part` attribute: #{file_path}"
85
+ log "FATAL: missing `part` attribute: #{fpath}"
86
+ log "INFO: skipped #{bibdata.docid} as it is missing `part` attribute."
87
+ next
88
+ end
89
+
90
+ revision_string = "\n// CVS: revision not detected"
91
+ if cvs_mode
92
+ # Run `cvs status` to find out version
93
+
94
+ log "INFO: Detecting CVS revision..."
95
+ Dir.chdir(stepmod_path) do
96
+ status = `cvs status #{fpath}`
97
+
98
+ unless status.empty?
99
+ working_rev = status.split(/\n/).grep(/Working revision:/).first.match(/revision:\s+(.+)$/)[1]
100
+ repo_rev = status.split(/\n/).grep(/Repository revision:/).first.match(/revision:\t(.+)\t/)[1]
101
+ log "INFO: CVS working rev (#{working_rev}), repo rev (#{repo_rev})"
102
+ revision_string = "\n// CVS working rev: (#{working_rev}), repo rev (#{repo_rev})\n" +
103
+ "// CVS: revision #{working_rev == repo_rev ? 'up to date' : 'differs'}"
104
+ end
105
+ end
62
106
  end
63
107
 
64
108
  # read definitions
@@ -67,23 +111,28 @@ files.each do |file_path|
67
111
  term_id = definition['id']
68
112
  unless term_id.nil?
69
113
  if encountered_terms[term_id]
70
- log "FATAL: Duplicated term with id: #{term_id}, #{file_path}"
114
+ log "FATAL: Duplicated term with id: #{term_id}, #{fpath}"
71
115
  end
72
116
  encountered_terms[term_id] = true
73
117
  end
74
118
 
119
+ # Assume that definition is located in clause 3 of the ISO document
120
+ # in order. We really don't have a good reference here.
121
+ ref_clause = "3.#{index}"
122
+
75
123
  concept = Stepmod::Utils::Concept.parse(
76
124
  definition,
77
125
  reference_anchor: bibdata.anchor,
78
- # Assume that definition is located in clause 3 of the ISO document
79
- # in order. We really don't have a good reference here.
80
- reference_clause: "3.#{index}"
126
+ reference_clause: ref_clause,
127
+ file_path: fpath + revision_string
81
128
  )
82
129
 
83
130
  parsed_terms << concept
84
131
  parsed_bibliography << bibdata
85
132
  end
86
133
 
134
+ log "INFO: Completed processing XML file #{fpath}"
135
+
87
136
  end
88
137
 
89
138
  parsed_bibliography.uniq!
@@ -92,10 +141,10 @@ File.open('031-generated-terms.adoc', 'w') { |file|
92
141
  file.puts(parsed_terms.map(&:to_mn_adoc).join("\n"))
93
142
  }
94
143
 
95
- log "written to: 031-generated-terms.adoc"
144
+ log "INFO: written to: 031-generated-terms.adoc"
96
145
 
97
146
  File.open('991-generated-bibliography.adoc', 'w') { |file|
98
147
  file.puts(parsed_bibliography.map(&:to_mn_adoc).join("\n"))
99
148
  }
100
149
 
101
- log "written to: 991-generated-bibliography.adoc"
150
+ log "INFO: written to: 991-generated-bibliography.adoc"
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'nokogiri'
4
+
5
+ stepmod_dir = ARGV.first || Dir.pwd
6
+
7
+ index = Nokogiri::XML(File.read(File.join(stepmod_dir, 'repository_index.xml'))).root
8
+
9
+ files = []
10
+ index.xpath('modules/module').each do |item|
11
+ files << "#{stepmod_dir}/data/modules/#{item['name']}/arm.exp"
12
+ files << "#{stepmod_dir}/data/modules/#{item['name']}/mim.exp"
13
+ end
14
+ index.xpath('resources/resource').each do |item|
15
+ files << "#{stepmod_dir}/data/resources/#{item['name']}/#{item['name']}.exp"
16
+ end
17
+ index.xpath('business_object_models/business_object_model').each do |item|
18
+ files << "#{stepmod_dir}/data/business_object_models/#{item['name']}/bom.exp"
19
+ files << "#{stepmod_dir}/data/business_object_models/#{item['name']}/DomainModel.exp"
20
+ end
21
+
22
+ existing_files = files.filter{|file| File.exists?(file)}
23
+ puts existing_files
@@ -0,0 +1,11 @@
1
+ require 'reverse_adoc/cleaner'
2
+
3
+ module Stepmod
4
+ module Utils
5
+ class Cleaner < ReverseAdoc::Cleaner
6
+ def tidy(string)
7
+ super.gsub(/^ +/, '')
8
+ end
9
+ end
10
+ end
11
+ end
@@ -2,7 +2,17 @@ module Stepmod
2
2
  module Utils
3
3
 
4
4
  class Concept
5
- attr_accessor *%w(designation definition reference_anchor reference_clause examples notes synonym converted_definition)
5
+ attr_accessor *%w(
6
+ designation
7
+ definition
8
+ reference_anchor
9
+ reference_clause
10
+ examples
11
+ notes
12
+ synonym
13
+ converted_definition
14
+ file_path
15
+ )
6
16
 
7
17
  def initialize(options)
8
18
  options.each_pair do |k, v|
@@ -10,20 +20,23 @@ module Stepmod
10
20
  end
11
21
  end
12
22
 
13
- def self.parse(definition_xml, reference_anchor:, reference_clause:)
23
+ def self.parse(definition_xml, reference_anchor:, reference_clause:, file_path:)
14
24
  new(
15
25
  converted_definition: Stepmod::Utils::StepmodDefinitionConverter.convert(definition_xml),
16
26
  reference_anchor: reference_anchor,
17
- reference_clause: reference_clause
27
+ reference_clause: reference_clause,
28
+ file_path: file_path
18
29
  )
19
30
  end
20
31
 
21
32
  def to_mn_adoc
22
33
  <<~TEXT
34
+ // STEPmod path: #{file_path}
23
35
  #{converted_definition}
24
36
 
25
37
  [.source]
26
38
  <<#{reference_anchor},clause=#{reference_clause}>>
39
+
27
40
  TEXT
28
41
  end
29
42
 
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "uri"
4
+
5
+ module Stepmod
6
+ module Utils
7
+ module Converters
8
+ class A < ReverseAdoc::Converters::Base
9
+ def convert(node, state = {})
10
+ name = treat_children(node, state)
11
+ href = node['href']
12
+ title = extract_title(node)
13
+ id = node['id'] || node['name']
14
+
15
+ id = id&.gsub(/\s/, "")&.gsub(/__+/, "_")
16
+
17
+ if /^_Toc\d+$|^_GoBack$/.match id
18
+ ""
19
+ elsif !id.nil? && !id.empty?
20
+ "[[#{id}]]"
21
+ elsif href.to_s.start_with?('#')
22
+ href = href.sub(/^#/, "").gsub(/\s/, "").gsub(/__+/, "_")
23
+ if name.empty?
24
+ "<<#{href}>>"
25
+ else
26
+ "<<#{href},#{name}>>"
27
+ end
28
+ elsif href.to_s.empty?
29
+ name
30
+ else
31
+ name = title if name.empty?
32
+ href = "link:#{href}" unless href.to_s =~ URI::DEFAULT_PARSER.make_regexp
33
+ link = "#{href}[#{name}]"
34
+ # link.prepend(' ')
35
+ link = " #{link}"
36
+ link
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ end
43
+
44
+ ReverseAdoc::Converters.register :a, A.new
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class Blockquote < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ id = node['id']
9
+ anchor = id ? "[[#{id}]]\n" : ""
10
+ cite = node['cite']
11
+ attrs = cite ? "[quote, #{cite}]\n" : ""
12
+ content = treat_children(node, state).strip
13
+ content = ReverseAdoc.cleaner.remove_newlines(content)
14
+ #"\n\n> " << content.lines.to_a.join('> ') << "\n\n"
15
+ "\n\n#{attrs}____\n" << content.lines.to_a.join('') << "\n____\n\n"
16
+ end
17
+ end
18
+
19
+ ReverseAdoc::Converters.register :blockquote, Blockquote.new
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class Br < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ " +\n"
9
+ end
10
+ end
11
+
12
+ ReverseAdoc::Converters.register :br, Br.new
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class Bypass < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ treat_children(node, state)
9
+ end
10
+ end
11
+
12
+ ReverseAdoc::Converters.register :document, Bypass.new
13
+ ReverseAdoc::Converters.register :html, Bypass.new
14
+ ReverseAdoc::Converters.register :body, Bypass.new
15
+ ReverseAdoc::Converters.register :span, Bypass.new
16
+ ReverseAdoc::Converters.register :thead, Bypass.new
17
+ ReverseAdoc::Converters.register :tbody, Bypass.new
18
+ ReverseAdoc::Converters.register :tfoot, Bypass.new
19
+ ReverseAdoc::Converters.register :abbr, Bypass.new
20
+ ReverseAdoc::Converters.register :acronym, Bypass.new
21
+ ReverseAdoc::Converters.register :address, Bypass.new
22
+ ReverseAdoc::Converters.register :applet, Bypass.new
23
+ ReverseAdoc::Converters.register :map, Bypass.new
24
+ ReverseAdoc::Converters.register :area, Bypass.new
25
+ ReverseAdoc::Converters.register :bdi, Bypass.new
26
+ ReverseAdoc::Converters.register :bdo, Bypass.new
27
+ ReverseAdoc::Converters.register :big, Bypass.new
28
+ ReverseAdoc::Converters.register :button, Bypass.new
29
+ ReverseAdoc::Converters.register :canvas, Bypass.new
30
+ ReverseAdoc::Converters.register :data, Bypass.new
31
+ ReverseAdoc::Converters.register :datalist, Bypass.new
32
+ ReverseAdoc::Converters.register :del, Bypass.new
33
+ ReverseAdoc::Converters.register :ins, Bypass.new
34
+ ReverseAdoc::Converters.register :dfn, Bypass.new
35
+ ReverseAdoc::Converters.register :dialog, Bypass.new
36
+ ReverseAdoc::Converters.register :embed, Bypass.new
37
+ ReverseAdoc::Converters.register :fieldset, Bypass.new
38
+ ReverseAdoc::Converters.register :font, Bypass.new
39
+ ReverseAdoc::Converters.register :footer, Bypass.new
40
+ ReverseAdoc::Converters.register :form, Bypass.new
41
+ ReverseAdoc::Converters.register :frame, Bypass.new
42
+ ReverseAdoc::Converters.register :frameset, Bypass.new
43
+ ReverseAdoc::Converters.register :header, Bypass.new
44
+ ReverseAdoc::Converters.register :iframe, Bypass.new
45
+ ReverseAdoc::Converters.register :input, Bypass.new
46
+ ReverseAdoc::Converters.register :label, Bypass.new
47
+ ReverseAdoc::Converters.register :legend, Bypass.new
48
+ ReverseAdoc::Converters.register :main, Bypass.new
49
+ ReverseAdoc::Converters.register :menu, Bypass.new
50
+ ReverseAdoc::Converters.register :menulist, Bypass.new
51
+ ReverseAdoc::Converters.register :meter, Bypass.new
52
+ ReverseAdoc::Converters.register :nav, Bypass.new
53
+ ReverseAdoc::Converters.register :noframes, Bypass.new
54
+ ReverseAdoc::Converters.register :noscript, Bypass.new
55
+ ReverseAdoc::Converters.register :object, Bypass.new
56
+ ReverseAdoc::Converters.register :optgroup, Bypass.new
57
+ ReverseAdoc::Converters.register :option, Bypass.new
58
+ ReverseAdoc::Converters.register :output, Bypass.new
59
+ ReverseAdoc::Converters.register :param, Bypass.new
60
+ ReverseAdoc::Converters.register :picture, Bypass.new
61
+ ReverseAdoc::Converters.register :progress, Bypass.new
62
+ ReverseAdoc::Converters.register :ruby, Bypass.new
63
+ ReverseAdoc::Converters.register :rt, Bypass.new
64
+ ReverseAdoc::Converters.register :rp, Bypass.new
65
+ ReverseAdoc::Converters.register :s, Bypass.new
66
+ ReverseAdoc::Converters.register :select, Bypass.new
67
+ ReverseAdoc::Converters.register :small, Bypass.new
68
+ ReverseAdoc::Converters.register :span, Bypass.new
69
+ ReverseAdoc::Converters.register :strike, Bypass.new
70
+ ReverseAdoc::Converters.register :details, Bypass.new
71
+ ReverseAdoc::Converters.register :section, Bypass.new
72
+ ReverseAdoc::Converters.register :summary, Bypass.new
73
+ ReverseAdoc::Converters.register :svg, Bypass.new
74
+ ReverseAdoc::Converters.register :template, Bypass.new
75
+ ReverseAdoc::Converters.register :textarea, Bypass.new
76
+ ReverseAdoc::Converters.register :track, Bypass.new
77
+ ReverseAdoc::Converters.register :u, Bypass.new
78
+ ReverseAdoc::Converters.register :wbr, Bypass.new
79
+ end
80
+ end
81
+ end
@@ -3,7 +3,7 @@
3
3
  module Stepmod
4
4
  module Utils
5
5
  module Converters
6
- class ClauseRef < ReverseAsciidoctor::Converters::Base
6
+ class ClauseRef < ReverseAdoc::Converters::Base
7
7
  def convert(node, _state = {})
8
8
  " term:[#{normalized_ref(node['linkend'])}] "
9
9
  end
@@ -16,7 +16,7 @@ module Stepmod
16
16
  ref.to_s.split(':').last.squeeze(' ').strip
17
17
  end
18
18
  end
19
- ReverseAsciidoctor::Converters.register :clause_ref, ClauseRef.new
19
+ ReverseAdoc::Converters.register :clause_ref, ClauseRef.new
20
20
  end
21
21
  end
22
22
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class Code < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ "`#{node.text}`"
9
+ end
10
+ end
11
+
12
+ ReverseAdoc::Converters.register :code, Code.new
13
+ ReverseAdoc::Converters.register :tt, Code.new
14
+ ReverseAdoc::Converters.register :kbd, Code.new
15
+ ReverseAdoc::Converters.register :samp, Code.new
16
+ ReverseAdoc::Converters.register :var, Code.new
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class Comment < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ comment = node.text.strip.split("\n").map{|line| "// #{line}"}.join("\n")
9
+ "#{comment}\n"
10
+ end
11
+ end
12
+
13
+ ReverseAdoc::Converters.register :comment, Comment.new
14
+ end
15
+ end
16
+ end