stepmod-utils 0.2.0 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) 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 -1
  5. data/Makefile +2 -0
  6. data/README.adoc +82 -1
  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-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 +96 -0
  27. data/lib/stepmod/utils/converters/example.rb +1 -6
  28. data/lib/stepmod/utils/converters/express_g.rb +46 -0
  29. data/lib/stepmod/utils/converters/express_ref_express_description.rb +13 -0
  30. data/lib/stepmod/utils/converters/ext_description.rb +16 -0
  31. data/lib/stepmod/utils/converters/ext_descriptions.rb +14 -0
  32. data/lib/stepmod/utils/converters/fund_cons.rb +15 -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 +18 -0
  44. data/lib/stepmod/utils/converters/schema_diag.rb +14 -0
  45. data/lib/stepmod/utils/converters/strong.rb +21 -0
  46. data/lib/stepmod/utils/converters/sub.rb +16 -0
  47. data/lib/stepmod/utils/converters/sup.rb +16 -0
  48. data/lib/stepmod/utils/converters/text.rb +68 -0
  49. data/lib/stepmod/utils/html_to_asciimath.rb +157 -0
  50. data/lib/stepmod/utils/smrl_description_converter.rb +49 -0
  51. data/lib/stepmod/utils/smrl_resource_converter.rb +67 -0
  52. data/lib/stepmod/utils/stepmod_file_annotator.rb +54 -0
  53. data/lib/stepmod/utils/version.rb +1 -1
  54. data/migrating_from_cvs.adoc +190 -0
  55. metadata +54 -6
  56. data/.github/workflows/macos.yml +0 -39
  57. data/.github/workflows/ubuntu.yml +0 -53
  58. data/.github/workflows/windows.yml +0 -41
@@ -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
@@ -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,96 @@
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
+ "#{term}:: #{treat_children(cloned_node, state)}"
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
+ .strip
73
+ end
74
+
75
+ # Remove all tags that make no sense in equations, eg: strong, italic
76
+ # Search for such tags, move their children into the root
77
+ # context and remove them
78
+ def remove_tags_not_in_context(node)
79
+ TAGS_NOT_IN_CONTEXT.each do |tag_name|
80
+ node
81
+ .children
82
+ .xpath("./#{tag_name}")
83
+ .map do |n|
84
+ n.tap{ |n| n.add_previous_sibling(n.children) }.remove
85
+ end
86
+ end
87
+ node.traverse do |descendant|
88
+ descendant.content = descendant.content.gsub('#8195;', '')
89
+ end
90
+ end
91
+ end
92
+
93
+ ReverseAdoc::Converters.register :eqn, Eqn.new
94
+ end
95
+ end
96
+ end