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
@@ -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
@@ -2,7 +2,7 @@
2
2
  module Stepmod
3
3
  module Utils
4
4
  module Converters
5
- class Def < ReverseAsciidoctor::Converters::Base
5
+ class Def < ReverseAdoc::Converters::Base
6
6
  def convert(node, state = {})
7
7
  node = node.dup
8
8
  "#{additional_block(node)}#{treat_children(node, state)}"
@@ -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)
@@ -63,7 +70,7 @@ module Stepmod
63
70
  end
64
71
  end
65
72
 
66
- ReverseAsciidoctor::Converters.register :def, Def.new
73
+ ReverseAdoc::Converters.register :def, Def.new
67
74
  end
68
75
  end
69
76
  end
@@ -3,7 +3,7 @@
3
3
  module Stepmod
4
4
  module Utils
5
5
  module Converters
6
- class Definition < ReverseAsciidoctor::Converters::Base
6
+ class Definition < ReverseAdoc::Converters::Base
7
7
  def convert(node, state = {})
8
8
  treat_children(node, state)
9
9
  end
@@ -16,7 +16,7 @@ module Stepmod
16
16
  end
17
17
  end
18
18
 
19
- ReverseAsciidoctor::Converters.register :definition, Definition.new
19
+ ReverseAdoc::Converters.register :definition, Definition.new
20
20
  end
21
21
  end
22
22
  end
@@ -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
@@ -3,7 +3,7 @@
3
3
  module Stepmod
4
4
  module Utils
5
5
  module Converters
6
- class Em < ReverseAsciidoctor::Converters::Base
6
+ class Em < ReverseAdoc::Converters::Base
7
7
  def convert(node, state = {})
8
8
  content = treat_children(node, state.merge(already_italic: true))
9
9
  if content.strip.empty? || state[:already_italic]
@@ -14,8 +14,8 @@ module Stepmod
14
14
  end
15
15
  end
16
16
 
17
- ReverseAsciidoctor::Converters.register :em, Em.new
18
- ReverseAsciidoctor::Converters.register :cite, Em.new
17
+ ReverseAdoc::Converters.register :em, Em.new
18
+ ReverseAdoc::Converters.register :cite, Em.new
19
19
  end
20
20
  end
21
21
  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
@@ -3,17 +3,12 @@
3
3
  module Stepmod
4
4
  module Utils
5
5
  module Converters
6
- class Example < ReverseAsciidoctor::Converters::Base
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
- ReverseAsciidoctor::Converters.register :example, Example.new
11
+ ReverseAdoc::Converters.register :example, Example.new
17
12
  end
18
13
  end
19
14
  end
@@ -0,0 +1,46 @@
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'])
12
+ end.join("\n")
13
+ end
14
+
15
+ private
16
+
17
+ def parse_to_svg_reference(file)
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
+ [.svgmap]
24
+ ====
25
+ image::#{svg_path}.svg[]
26
+
27
+ #{image_document.xpath('//img.area').map.with_index(1) {|n, i| schema_reference(n['href'], i) }.join("\n")}
28
+ ====
29
+ SVGMAP
30
+ end
31
+
32
+ def schema_reference(xml_path, index)
33
+ if xml_path =~ /#/
34
+ _,express_path_part = xml_path.split('#')
35
+ "* <<express:#{express_path_part.strip}>>; #{index}"
36
+ else
37
+ schema_name = File.basename(xml_path, '.*')
38
+ "* <<express:#{schema_name.strip}>>; #{index}"
39
+ end
40
+ end
41
+ end
42
+
43
+ ReverseAdoc::Converters.register 'express-g', ExpressG.new
44
+ end
45
+ end
46
+ end
@@ -3,12 +3,12 @@
3
3
  module Stepmod
4
4
  module Utils
5
5
  module Converters
6
- class ExpressRef < ReverseAsciidoctor::Converters::Base
6
+ class ExpressRef < ReverseAdoc::Converters::Base
7
7
  def convert(node, _state = {})
8
8
  "*#{node['linkend'].to_s.split('.').last}*"
9
9
  end
10
10
  end
11
- ReverseAsciidoctor::Converters.register :express_ref, ExpressRef.new
11
+ ReverseAdoc::Converters.register :express_ref, ExpressRef.new
12
12
  end
13
13
  end
14
14
  end
@@ -0,0 +1,13 @@
1
+ module Stepmod
2
+ module Utils
3
+ module Converters
4
+ class ExpressRefExpressDescription < ReverseAdoc::Converters::Base
5
+ def convert(node, _state = {})
6
+ parts = node['linkend'].to_s.split(':').last.split('.')
7
+ "<<express:#{parts.join('.').strip},#{parts.last.strip}>>"
8
+ end
9
+ end
10
+ ReverseAdoc::Converters.register :express_ref, ExpressRefExpressDescription.new
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,16 @@
1
+ module Stepmod
2
+ module Utils
3
+ module Converters
4
+ class ExtDescription < ReverseAdoc::Converters::Base
5
+ def convert(node, state = {})
6
+ <<~TEMPLATE
7
+ (*"#{node['linkend']}"
8
+ #{treat_children(node, state).strip}
9
+ *)
10
+ TEMPLATE
11
+ end
12
+ end
13
+ ReverseAdoc::Converters.register :ext_description, ExtDescription.new
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class ExtDescriptions < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ treat_children(node, state)
9
+ end
10
+ end
11
+ ReverseAdoc::Converters.register :ext_descriptions, ExtDescriptions.new
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class FundCons < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ "\n\n== Fundamental concerns\n\n#{treat_children(node, state).strip}\n\n"
9
+ end
10
+ end
11
+
12
+ ReverseAdoc::Converters.register :fund_cons, FundCons.new
13
+ end
14
+ end
15
+ end