stepmod-utils 0.2.0 → 0.2.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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +42 -0
  3. data/.github/workflows/release.yml +23 -20
  4. data/Gemfile +2 -1
  5. data/Makefile +5 -0
  6. data/README.adoc +82 -1
  7. data/exe/stepmod-annotate-all +39 -0
  8. data/exe/stepmod-build-resource-docs-cache +19 -0
  9. data/exe/stepmod-convert-express-description +33 -0
  10. data/exe/stepmod-convert-express-resource +33 -0
  11. data/exe/stepmod-extract-terms +3 -3
  12. data/exe/stepmod-find-express-files +23 -0
  13. data/lib/stepmod/utils/cleaner.rb +11 -0
  14. data/lib/stepmod/utils/converters/a.rb +47 -0
  15. data/lib/stepmod/utils/converters/blockquote.rb +22 -0
  16. data/lib/stepmod/utils/converters/br.rb +15 -0
  17. data/lib/stepmod/utils/converters/bypass.rb +81 -0
  18. data/lib/stepmod/utils/converters/code.rb +19 -0
  19. data/lib/stepmod/utils/converters/comment.rb +16 -0
  20. data/lib/stepmod/utils/converters/dd.rb +15 -0
  21. data/lib/stepmod/utils/converters/def.rb +11 -4
  22. data/lib/stepmod/utils/converters/dl.rb +31 -0
  23. data/lib/stepmod/utils/converters/drop.rb +22 -0
  24. data/lib/stepmod/utils/converters/dt.rb +17 -0
  25. data/lib/stepmod/utils/converters/em_express_description.rb +22 -0
  26. data/lib/stepmod/utils/converters/eqn.rb +97 -0
  27. data/lib/stepmod/utils/converters/example.rb +1 -6
  28. data/lib/stepmod/utils/converters/express_g.rb +49 -0
  29. data/lib/stepmod/utils/converters/express_ref_express_description.rb +13 -0
  30. data/lib/stepmod/utils/converters/ext_description.rb +17 -0
  31. data/lib/stepmod/utils/converters/ext_descriptions.rb +14 -0
  32. data/lib/stepmod/utils/converters/fund_cons.rb +21 -0
  33. data/lib/stepmod/utils/converters/head.rb +22 -0
  34. data/lib/stepmod/utils/converters/hr.rb +15 -0
  35. data/lib/stepmod/utils/converters/ignore.rb +16 -0
  36. data/lib/stepmod/utils/converters/introduction.rb +15 -0
  37. data/lib/stepmod/utils/converters/note.rb +1 -6
  38. data/lib/stepmod/utils/converters/ol.rb +3 -2
  39. data/lib/stepmod/utils/converters/p.rb +21 -0
  40. data/lib/stepmod/utils/converters/pass_through.rb +13 -0
  41. data/lib/stepmod/utils/converters/q.rb +16 -0
  42. data/lib/stepmod/utils/converters/resource.rb +14 -0
  43. data/lib/stepmod/utils/converters/schema.rb +19 -0
  44. data/lib/stepmod/utils/converters/schema_diag.rb +14 -0
  45. data/lib/stepmod/utils/converters/strong.rb +41 -0
  46. data/lib/stepmod/utils/converters/sub.rb +24 -0
  47. data/lib/stepmod/utils/converters/sup.rb +22 -0
  48. data/lib/stepmod/utils/converters/table.rb +62 -0
  49. data/lib/stepmod/utils/converters/text.rb +68 -0
  50. data/lib/stepmod/utils/html_to_asciimath.rb +157 -0
  51. data/lib/stepmod/utils/smrl_description_converter.rb +49 -0
  52. data/lib/stepmod/utils/smrl_resource_converter.rb +67 -0
  53. data/lib/stepmod/utils/stepmod_file_annotator.rb +78 -0
  54. data/lib/stepmod/utils/version.rb +1 -1
  55. data/migrating_from_cvs.adoc +190 -0
  56. data/stepmod-utils.gemspec +1 -0
  57. metadata +69 -8
  58. data/.github/workflows/macos.yml +0 -39
  59. data/.github/workflows/ubuntu.yml +0 -53
  60. data/.github/workflows/windows.yml +0 -41
@@ -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
@@ -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
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class Dd < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ "#{node.text}\n"
9
+ end
10
+
11
+ ReverseAdoc::Converters.register :dd, Dd.new
12
+ end
13
+ end
14
+ end
15
+ end
@@ -20,11 +20,14 @@ module Stepmod
20
20
  previous = nil
21
21
  result = ''
22
22
  converted.each.with_index do |(child, content), i|
23
- if i == 0 || !block_tag?(child, previous)
24
- result += " #{content}"
23
+ if block_tag?(child, previous)
24
+ result += "\n\n"
25
+ elsif comment_tag?(child, previous)
26
+ result += "\n"
25
27
  else
26
- result += "\n\n#{content}"
28
+ result += ' '
27
29
  end
30
+ result += content
28
31
  previous = child
29
32
  end
30
33
  result.strip
@@ -32,7 +35,11 @@ module Stepmod
32
35
 
33
36
  def block_tag?(child, previous)
34
37
  %w[ul example note alt p].include?(child.name) ||
35
- (child.previous && %w[ul example note alt p].include?(child.previous.name))
38
+ (previous && %w[ul example note alt p].include?(previous.name))
39
+ end
40
+
41
+ def comment_tag?(child, previous)
42
+ child.name == 'comment' || (previous && previous.name === 'comment')
36
43
  end
37
44
 
38
45
  def additional_block(node)
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class Dl < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ cleaned_node = cleanup_trash_tags(node.clone)
9
+ treat_children(cleaned_node, state)
10
+ end
11
+
12
+ private
13
+
14
+ # https://github.com/metanorma/stepmod-utils/issues/48#issuecomment-784000377
15
+ # For simplicity reasons and so that we don't depend on the CVS repository's updates, we directly converting:
16
+ # <dt></dt><dd>a3ma &#160; : &#160; annotated 3d model assembly</dd> into a3ma:: annotated 3d model assembly
17
+ def cleanup_trash_tags(node)
18
+ inner_content = node.inner_html
19
+ inner_content
20
+ .gsub!(/<dt><\/dt>\s*?<dd>(.+?) &#xA0; : &#xA0; (.+?)<\/dd>/) do
21
+ "<dt>#{$1}</dt><dd>#{$2}</dd>"
22
+ end
23
+ node.inner_html = inner_content
24
+ node
25
+ end
26
+
27
+ ReverseAdoc::Converters.register :dl, Dl.new
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class Drop < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ ''
9
+ end
10
+ end
11
+
12
+ ReverseAdoc::Converters.register :caption, Drop.new
13
+ ReverseAdoc::Converters.register :figcaption, Drop.new
14
+ ReverseAdoc::Converters.register :title, Drop.new
15
+ ReverseAdoc::Converters.register :link, Drop.new
16
+ ReverseAdoc::Converters.register :style, Drop.new
17
+ ReverseAdoc::Converters.register :meta, Drop.new
18
+ ReverseAdoc::Converters.register :script, Drop.new
19
+ ReverseAdoc::Converters.register :comment, Drop.new
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class Dt < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ return "\n\n{blank}::" if node.text.strip.length.zero?
9
+
10
+ "\n\n#{node.text}:: "
11
+ end
12
+
13
+ ReverseAdoc::Converters.register :dt, Dt.new
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class Em < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ content = treat_children(node, state.merge(already_italic: true))
9
+ if content.strip.empty? || state[:already_italic]
10
+ content
11
+ else
12
+ "#{content[/^\s*/]}_#{content.strip}_#{content[/\s*$/]}"
13
+ end
14
+ end
15
+ end
16
+
17
+ ReverseAdoc::Converters.register :em, Em.new
18
+ ReverseAdoc::Converters.register :i, Em.new
19
+ ReverseAdoc::Converters.register :cite, Em.new
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'stepmod/utils/html_to_asciimath'
4
+
5
+ module Stepmod
6
+ module Utils
7
+ module Converters
8
+ class Eqn < ReverseAdoc::Converters::Base
9
+ TAGS_NOT_IN_CONTEXT = %w[b i].freeze
10
+
11
+ def convert(node, state = {})
12
+ cloned_node = node.clone
13
+ if definition_node?(cloned_node)
14
+ return definition_converted(cloned_node, state)
15
+ end
16
+
17
+ stem_converted(cloned_node, state)
18
+ end
19
+
20
+ private
21
+
22
+ def definition_node?(node)
23
+ first_strong_node = node
24
+ .children
25
+ .find do |n|
26
+ return false if !n.text? && n.name != 'b'
27
+
28
+ n.name == 'b'
29
+ end
30
+ first_strong_node &&
31
+ first_strong_node.next &&
32
+ first_strong_node.next.text? &&
33
+ first_strong_node.next.content =~ /\s+:/
34
+ end
35
+
36
+ def definition_converted(cloned_node, state)
37
+ first_strong_node = cloned_node
38
+ .children
39
+ .find do |n|
40
+ return false if !n.text? && n.name != 'b'
41
+
42
+ n.name == 'b'
43
+ end
44
+ first_strong_node.next.content = first_strong_node.next.content.gsub(/\s?:/, '')
45
+ term = first_strong_node.text.strip
46
+ first_strong_node.remove
47
+ "\n\n#{term}:: #{remove_trash_symbols(treat_children(cloned_node, state))}\n"
48
+ end
49
+
50
+ def stem_converted(cloned_node, state)
51
+ remove_tags_not_in_context(cloned_node)
52
+ internal_content = treat_children(cloned_node, state)
53
+ content = Stepmod::Utils::HtmlToAsciimath.new.call(internal_content)
54
+ res = <<~TEMPLATE
55
+
56
+ [stem]
57
+ ++++
58
+ #{remove_trash_symbols(content.strip)}
59
+ ++++
60
+
61
+ TEMPLATE
62
+ res = "[[#{cloned_node['id']}]]\n#{res}" if cloned_node['id'] && cloned_node['id'].length > 0
63
+ res
64
+ end
65
+
66
+ def remove_trash_symbols(content)
67
+ content
68
+ .gsub(/ /, '')
69
+ .strip
70
+ .gsub(/\(\d\)$/, '')
71
+ .gsub(/\b(\w*?[_]+\w+)\b/, '"\1"')
72
+ .gsub(/([^\s])\s+_{/, '\1_{')
73
+ .strip
74
+ end
75
+
76
+ # Remove all tags that make no sense in equations, eg: strong, italic
77
+ # Search for such tags, move their children into the root
78
+ # context and remove them
79
+ def remove_tags_not_in_context(node)
80
+ TAGS_NOT_IN_CONTEXT.each do |tag_name|
81
+ node
82
+ .children
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
89
+ end
90
+ end
91
+ end
92
+ end
93
+
94
+ ReverseAdoc::Converters.register :eqn, Eqn.new
95
+ end
96
+ end
97
+ end
@@ -5,12 +5,7 @@ module Stepmod
5
5
  module Converters
6
6
  class Example < ReverseAdoc::Converters::Base
7
7
  def convert(node, state = {})
8
- <<~TEMPLATE
9
- [example]
10
- ====
11
- #{treat_children(node, state).strip}
12
- ====
13
- TEMPLATE
8
+ "\n\n[example]\n====\n#{treat_children(node, state).strip}\n====\n\n"
14
9
  end
15
10
  end
16
11
  ReverseAdoc::Converters.register :example, Example.new
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class ExpressG < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ node.children.map do |child|
9
+ next unless child.name == 'imgfile'
10
+
11
+ parse_to_svg_reference(child['file'], state)
12
+ end.join("\n")
13
+ end
14
+
15
+ private
16
+
17
+ def parse_to_svg_reference(file, state)
18
+ return '' unless File.file?(file)
19
+
20
+ image_document = Nokogiri::XML(File.read(file))
21
+ svg_path = File.basename(image_document.xpath('//img').first['src'], '.*')
22
+ <<~SVGMAP
23
+
24
+ *)
25
+ (*"#{state.fetch(:schema_name)}.__expressg"
26
+ [.svgmap]
27
+ ====
28
+ image::#{svg_path}.svg[]
29
+
30
+ #{image_document.xpath('//img.area').map.with_index(1) {|n, i| schema_reference(n['href'], i) }.join("\n")}
31
+ ====
32
+ SVGMAP
33
+ end
34
+
35
+ def schema_reference(xml_path, index)
36
+ if xml_path =~ /#/
37
+ _,express_path_part = xml_path.split('#')
38
+ "* <<express:#{express_path_part.strip}>>; #{index}"
39
+ else
40
+ schema_name = File.basename(xml_path, '.*')
41
+ "* <<express:#{schema_name.strip}>>; #{index}"
42
+ end
43
+ end
44
+ end
45
+
46
+ ReverseAdoc::Converters.register 'express-g', ExpressG.new
47
+ end
48
+ end
49
+ end