stepmod-utils 0.1.5 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
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