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,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class Head < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ title = extract_title(node)
9
+ "= #{title}\n:stem:\n\n"
10
+ end
11
+
12
+ def extract_title(node)
13
+ title = node.at("./title")
14
+ return "(???)" if title.nil?
15
+ title.text
16
+ end
17
+ end
18
+
19
+ ReverseAdoc::Converters.register :head, Head.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 Hr < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ "\n* * *\n"
9
+ end
10
+ end
11
+
12
+ ReverseAdoc::Converters.register :hr, Hr.new
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class Ignore < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ '' # noop
9
+ end
10
+ end
11
+
12
+ ReverseAdoc::Converters.register :colgroup, Ignore.new
13
+ ReverseAdoc::Converters.register :col, Ignore.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 Introduction < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ "\n\n== Introduction\n\n#{treat_children(node, state).strip}\n\n"
9
+ end
10
+ end
11
+
12
+ ReverseAdoc::Converters.register :introduction, Introduction.new
13
+ end
14
+ end
15
+ end
@@ -3,7 +3,7 @@
3
3
  module Stepmod
4
4
  module Utils
5
5
  module Converters
6
- class ModuleRef < ReverseAsciidoctor::Converters::Base
6
+ class ModuleRef < ReverseAdoc::Converters::Base
7
7
  def convert(node, _state = {})
8
8
  ref = node['linkend']
9
9
  # #23:
@@ -27,7 +27,7 @@ module Stepmod
27
27
  ref.squeeze(' ').strip
28
28
  end
29
29
  end
30
- ReverseAsciidoctor::Converters.register :module_ref, ModuleRef.new
30
+ ReverseAdoc::Converters.register :module_ref, ModuleRef.new
31
31
  end
32
32
  end
33
33
  end
@@ -3,17 +3,12 @@
3
3
  module Stepmod
4
4
  module Utils
5
5
  module Converters
6
- class Note < ReverseAsciidoctor::Converters::Base
6
+ class Note < ReverseAdoc::Converters::Base
7
7
  def convert(node, state = {})
8
- <<~TEMPLATE
9
- [NOTE]
10
- --
11
- #{treat_children(node, state).strip}
12
- --
13
- TEMPLATE
8
+ "\n\n[NOTE]\n--\n#{treat_children(node, state).strip}\n--\n\n"
14
9
  end
15
10
  end
16
- ReverseAsciidoctor::Converters.register :note, Note.new
11
+ ReverseAdoc::Converters.register :note, Note.new
17
12
  end
18
13
  end
19
14
  end
@@ -3,14 +3,15 @@
3
3
  module Stepmod
4
4
  module Utils
5
5
  module Converters
6
- class Ol < ReverseAsciidoctor::Converters::Base
6
+ class Ol < ReverseAdoc::Converters::Base
7
7
  def convert(node, state = {})
8
8
  id = node['id']
9
9
  anchor = id ? "[[#{id}]]\n" : ""
10
10
  ol_count = state.fetch(:ol_count, 0) + 1
11
11
  attrs = ol_attrs(node)
12
- res = "\n#{anchor}#{attrs}#{treat_children(node, state.merge(ol_count: ol_count))}"
13
- res = "\n" + res if node.parent && node.parent.name == 'note'
12
+ res = "\n\n#{anchor}#{attrs}#{treat_children(node, state.merge(ol_count: ol_count))}\n"
13
+ # Why do we add this?
14
+ # res = "\n" + res if node.parent && node.parent.name == 'note'
14
15
  res
15
16
  end
16
17
 
@@ -44,9 +45,9 @@ module Stepmod
44
45
  end
45
46
  end
46
47
 
47
- ReverseAsciidoctor::Converters.register :ol, Ol.new
48
- ReverseAsciidoctor::Converters.register :ul, Ol.new
49
- ReverseAsciidoctor::Converters.register :dir, Ol.new
48
+ ReverseAdoc::Converters.register :ol, Ol.new
49
+ ReverseAdoc::Converters.register :ul, Ol.new
50
+ ReverseAdoc::Converters.register :dir, Ol.new
50
51
  end
51
52
  end
52
53
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class P < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ id = node['id']
9
+ anchor = id ? "[[#{id}]]\n" : ""
10
+ if state[:tdsinglepara]
11
+ "#{anchor}#{treat_children(node, state).strip}"
12
+ else
13
+ "\n\n#{anchor}#{treat_children(node, state).strip}\n\n"
14
+ end
15
+ end
16
+ end
17
+
18
+ ReverseAdoc::Converters.register :p, P.new
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class PassThrough < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ node.to_s
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class Q < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ content = treat_children(node, state)
9
+ "#{content[/^\s*/]}\"#{content.strip}\"#{content[/\s*$/]}"
10
+ end
11
+ end
12
+
13
+ ReverseAdoc::Converters.register :q, Q.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 Resource < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ treat_children(node, state)
9
+ end
10
+ end
11
+ ReverseAdoc::Converters.register :resource, Resource.new
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class Schema < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ <<~TEMPLATE
9
+ (*"#{node['name']}"
10
+ #{treat_children(node, state).strip}
11
+ *)
12
+ TEMPLATE
13
+ end
14
+ end
15
+ ReverseAdoc::Converters.register :schema, Schema.new
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class SchemaDiag < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ treat_children(node, state).strip
9
+ end
10
+ end
11
+ ReverseAdoc::Converters.register :schema_diag, SchemaDiag.new
12
+ end
13
+ end
14
+ end
@@ -5,7 +5,7 @@ require 'stepmod/utils/converters/em'
5
5
  module Stepmod
6
6
  module Utils
7
7
  module Converters
8
- class Stem < ReverseAsciidoctor::Converters::Base
8
+ class Stem < ReverseAdoc::Converters::Base
9
9
  def convert(node, state = {})
10
10
  return Em.new.convert(node, state) if node.text.strip.length > 8
11
11
 
@@ -13,7 +13,7 @@ module Stepmod
13
13
  end
14
14
  end
15
15
 
16
- ReverseAsciidoctor::Converters.register :i, Stem.new
16
+ ReverseAdoc::Converters.register :i, Stem.new
17
17
  end
18
18
  end
19
19
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class Strong < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ content = treat_children(node, state.merge(already_strong: true))
9
+ if content.strip.empty? || state[:already_strong]
10
+ content
11
+ else
12
+ "#{content[/^\s*/]}*#{content.strip}*#{content[/\s*$/]}"
13
+ end
14
+ end
15
+ end
16
+
17
+ ReverseAdoc::Converters.register :strong, Strong.new
18
+ ReverseAdoc::Converters.register :b, Strong.new
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class Sub < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ content = treat_children(node, state)
9
+ "#{content[/^\s*/]}~#{content.strip}~#{content[/\s*$/]}"
10
+ end
11
+ end
12
+
13
+ ReverseAdoc::Converters.register :sub, Sub.new
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class Sup < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ content = treat_children(node, state)
9
+ "#{content[/^\s*/]}^#{content.strip}^#{content[/\s*$/]}"
10
+ end
11
+ end
12
+
13
+ ReverseAdoc::Converters.register :sup, Sup.new
14
+ end
15
+ end
16
+ end
@@ -3,13 +3,13 @@
3
3
  module Stepmod
4
4
  module Utils
5
5
  module Converters
6
- class Synonym < ReverseAsciidoctor::Converters::Base
6
+ class Synonym < ReverseAdoc::Converters::Base
7
7
  def convert(node, state = {})
8
8
  "alt:[#{node.text.strip}]"
9
9
  end
10
10
  end
11
11
 
12
- ReverseAsciidoctor::Converters.register :synonym, Synonym.new
12
+ ReverseAdoc::Converters.register :synonym, Synonym.new
13
13
  end
14
14
  end
15
15
  end
@@ -5,7 +5,7 @@ require 'stepmod/utils/converters/synonym'
5
5
  module Stepmod
6
6
  module Utils
7
7
  module Converters
8
- class Term < ReverseAsciidoctor::Converters::Base
8
+ class Term < ReverseAdoc::Converters::Base
9
9
  def convert(node, state = {})
10
10
  first_child = node.children.find do |child|
11
11
  child.name == 'text' && !child.text.to_s.strip.empty?
@@ -23,7 +23,7 @@ module Stepmod
23
23
  end
24
24
  end
25
25
 
26
- ReverseAsciidoctor::Converters.register :term, Term.new
26
+ ReverseAdoc::Converters.register :term, Term.new
27
27
  end
28
28
  end
29
29
  end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stepmod
4
+ module Utils
5
+ module Converters
6
+ class Text < ReverseAdoc::Converters::Base
7
+ def convert(node, state = {})
8
+ if node.text.strip.empty?
9
+ treat_empty(node, state)
10
+ else
11
+ treat_text(node)
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def treat_empty(node, state)
18
+ parent = node.parent.name.to_sym
19
+ if [:ol, :ul].include?(parent) # Otherwise the identation is broken
20
+ ''
21
+ elsif state[:tdsinglepara]
22
+ ''
23
+ elsif node.text == ' ' # Regular whitespace text node
24
+ ' '
25
+ else
26
+ ''
27
+ end
28
+ end
29
+
30
+ def treat_text(node)
31
+ text = node.text
32
+ text = preserve_nbsp(text)
33
+ # text = remove_border_newlines(text)
34
+ text = remove_inner_newlines(text)
35
+
36
+ text = preserve_keychars_within_backticks(text)
37
+ text = preserve_tags(text)
38
+
39
+ text
40
+ end
41
+
42
+ def preserve_nbsp(text)
43
+ text.gsub(/\u00A0/, "&nbsp;")
44
+ end
45
+
46
+ def preserve_tags(text)
47
+ text.gsub(/[<>]/, '>' => '\>', '<' => '\<')
48
+ end
49
+
50
+ def remove_border_newlines(text)
51
+ text.gsub(/\A\n+/, '').gsub(/\n+\z/, '')
52
+ end
53
+
54
+ def remove_inner_newlines(text)
55
+ text.tr("\n\t", ' ').squeeze(' ')
56
+ end
57
+
58
+ def preserve_keychars_within_backticks(text)
59
+ text.gsub(/`.*?`/) do |match|
60
+ match.gsub('\_', '_').gsub('\*', '*')
61
+ end
62
+ end
63
+ end
64
+
65
+ ReverseAdoc::Converters.register :text, Text.new
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,157 @@
1
+ module Stepmod
2
+ module Utils
3
+ class HtmlToAsciimath
4
+ def call(input)
5
+ return input if input.nil? || input.empty?
6
+
7
+ to_asciimath = Nokogiri::HTML.fragment(input, "UTF-8")
8
+
9
+ to_asciimath.css('i').each do |math_element|
10
+ # puts "HTML MATH!! #{math_element.to_xml}"
11
+ # puts "HTML MATH!! #{math_element.text}"
12
+ decoded = text_to_asciimath(math_element.text)
13
+ case decoded.length
14
+ when 1..12
15
+ # puts "(#{math_element.text} to => #{decoded})"
16
+ math_element.replace "stem:[#{decoded}]"
17
+ when 0
18
+ math_element.remove
19
+ else
20
+ math_element.replace "_#{decoded}_"
21
+ end
22
+ end
23
+
24
+ to_asciimath.css('sub').each do |math_element|
25
+ case math_element.text.length
26
+ when 0
27
+ math_element.remove
28
+ else
29
+ math_element.replace "~#{text_to_asciimath(math_element.text)}~"
30
+ end
31
+ end
32
+
33
+ to_asciimath.css('sup').each do |math_element|
34
+ case math_element.text.length
35
+ when 0
36
+ math_element.remove
37
+ else
38
+ math_element.replace "^#{text_to_asciimath(math_element.text)}^"
39
+ end
40
+ end
41
+
42
+ to_asciimath.css('ol').each do |element|
43
+ element.css('li').each do |li|
44
+ li.replace ". #{li.text}"
45
+ end
46
+ end
47
+
48
+ to_asciimath.css('ul').each do |element|
49
+ element.css('li').each do |li|
50
+ li.replace "* #{li.text}"
51
+ end
52
+ end
53
+
54
+ # Replace sans-serif font with monospace
55
+ to_asciimath.css('font[style*="sans-serif"]').each do |x|
56
+ x.replace "`#{x.text}`"
57
+ end
58
+
59
+ html_entities_to_stem(
60
+ to_asciimath.children.to_s.gsub(/\]stem:\[/, '').gsub(/<\/?[uo]l>/, '')
61
+ )
62
+ end
63
+
64
+ def text_to_asciimath(text)
65
+ html_entities_to_asciimath(text.decode_html)
66
+ end
67
+
68
+ def html_entities_to_asciimath(x)
69
+ x.gsub("&alpha;", "alpha").
70
+ gsub("&beta;", "beta").
71
+ gsub("&gamma;", "gamma").
72
+ gsub("&Gamma;", "Gamma").
73
+ gsub("&delta;", "delta").
74
+ gsub("&Delta;", "Delta").
75
+ gsub("&epsilon;", "epsilon").
76
+ gsub("&varepsilon;", "varepsilon").
77
+ gsub("&zeta;", "zeta").
78
+ gsub("&eta;", "eta").
79
+ gsub("&theta;", "theta").
80
+ gsub("&Theta;", "Theta").
81
+ gsub("&vartheta;", "vartheta").
82
+ gsub("&iota;", "iota").
83
+ gsub("&kappa;", "kappa").
84
+ gsub("&lambda;", "lambda").
85
+ gsub("&Lambda;", "Lambda").
86
+ gsub("&mu;", "mu").
87
+ gsub("&nu;", "nu").
88
+ gsub("&xi;", "xi").
89
+ gsub("&Xi;", "Xi").
90
+ gsub("&pi;", "pi").
91
+ gsub("&Pi;", "Pi").
92
+ gsub("&rho;", "rho").
93
+ gsub("&beta;", "beta").
94
+ gsub("&sigma;", "sigma").
95
+ gsub("&Sigma;", "Sigma").
96
+ gsub("&tau;", "tau").
97
+ gsub("&upsilon;", "upsilon").
98
+ gsub("&phi;", "phi").
99
+ gsub("&Phi;", "Phi").
100
+ gsub("&varphi;", "varphi").
101
+ gsub("&chi;", "chi").
102
+ gsub("&psi;", "psi").
103
+ gsub("&Psi;", "Psi").
104
+ gsub("&omega;", "omega")
105
+ gsub("&#967", "χ").
106
+ gsub("&#215", "×").
107
+ gsub("&#931", "Σ").
108
+ gsub("&#961", "ρ").
109
+ gsub("&#963", "σ").
110
+ gsub("&#955", "λ").
111
+ gsub("&#964", "τ").
112
+ gsub("&#8706", "∂").
113
+ gsub("&#8804", "≤").
114
+ gsub("&#8805", "≥")
115
+ end
116
+
117
+ def html_entities_to_stem(x)
118
+ x.gsub("&alpha;", "stem:[alpha]").
119
+ gsub("&beta;", "stem:[beta]").
120
+ gsub("&gamma;", "stem:[gamma]").
121
+ gsub("&Gamma;", "stem:[Gamma]").
122
+ gsub("&delta;", "stem:[delta]").
123
+ gsub("&Delta;", "stem:[Delta]").
124
+ gsub("&epsilon;", "stem:[epsilon]").
125
+ gsub("&varepsilon;", "stem:[varepsilon]").
126
+ gsub("&zeta;", "stem:[zeta]").
127
+ gsub("&eta;", "stem:[eta]").
128
+ gsub("&theta;", "stem:[theta]").
129
+ gsub("&Theta;", "stem:[Theta]").
130
+ gsub("&vartheta;", "stem:[vartheta]").
131
+ gsub("&iota;", "stem:[iota]").
132
+ gsub("&kappa;", "stem:[kappa]").
133
+ gsub("&lambda;", "stem:[lambda]").
134
+ gsub("&Lambda;", "stem:[Lambda]").
135
+ gsub("&mu;", "stem:[mu]").
136
+ gsub("&nu;", "stem:[nu]").
137
+ gsub("&xi;", "stem:[xi]").
138
+ gsub("&Xi;", "stem:[Xi]").
139
+ gsub("&pi;", "stem:[pi]").
140
+ gsub("&Pi;", "stem:[Pi]").
141
+ gsub("&rho;", "stem:[rho]").
142
+ gsub("&beta;", "stem:[beta]").
143
+ gsub("&sigma;", "stem:[sigma]").
144
+ gsub("&Sigma;", "stem:[Sigma]").
145
+ gsub("&tau;", "stem:[tau]").
146
+ gsub("&upsilon;", "stem:[upsilon]").
147
+ gsub("&phi;", "stem:[phi]").
148
+ gsub("&Phi;", "stem:[Phi]").
149
+ gsub("&varphi;", "stem:[varphi]").
150
+ gsub("&chi;", "stem:[chi]").
151
+ gsub("&psi;", "stem:[psi]").
152
+ gsub("&Psi;", "stem:[Psi]").
153
+ gsub("&omega;", "stem:[omega]")
154
+ end
155
+ end
156
+ end
157
+ end