interscript 2.1.0 → 2.3.1

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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +6 -0
  3. data/Rakefile +9 -1
  4. data/bin/console +4 -8
  5. data/interscript.gemspec +2 -1
  6. data/lib/interscript.rb +78 -0
  7. data/lib/interscript/compiler/javascript.rb +6 -1
  8. data/lib/interscript/compiler/ruby.rb +5 -0
  9. data/lib/interscript/detector.rb +62 -0
  10. data/lib/interscript/dsl.rb +35 -2
  11. data/lib/interscript/dsl/document.rb +2 -1
  12. data/lib/interscript/dsl/group.rb +7 -6
  13. data/lib/interscript/dsl/group/parallel.rb +2 -2
  14. data/lib/interscript/dsl/tests.rb +2 -2
  15. data/lib/interscript/interpreter.rb +5 -1
  16. data/lib/interscript/node.rb +4 -0
  17. data/lib/interscript/node/alias_def.rb +6 -0
  18. data/lib/interscript/node/dependency.rb +16 -0
  19. data/lib/interscript/node/document.rb +34 -0
  20. data/lib/interscript/node/group.rb +13 -2
  21. data/lib/interscript/node/item.rb +4 -0
  22. data/lib/interscript/node/item/alias.rb +12 -0
  23. data/lib/interscript/node/item/any.rb +7 -0
  24. data/lib/interscript/node/item/capture.rb +11 -0
  25. data/lib/interscript/node/item/group.rb +29 -1
  26. data/lib/interscript/node/item/repeat.rb +4 -0
  27. data/lib/interscript/node/item/stage.rb +4 -0
  28. data/lib/interscript/node/item/string.rb +7 -0
  29. data/lib/interscript/node/metadata.rb +10 -0
  30. data/lib/interscript/node/rule.rb +3 -0
  31. data/lib/interscript/node/rule/funcall.rb +12 -2
  32. data/lib/interscript/node/rule/run.rb +16 -3
  33. data/lib/interscript/node/rule/sub.rb +165 -4
  34. data/lib/interscript/node/stage.rb +30 -4
  35. data/lib/interscript/node/tests.rb +10 -0
  36. data/lib/interscript/stdlib.rb +45 -3
  37. data/lib/interscript/utils/helpers.rb +39 -0
  38. data/lib/interscript/version.rb +1 -1
  39. data/lib/interscript/visualize/json.rb +12 -4
  40. metadata +17 -1
@@ -1,9 +1,11 @@
1
1
  class Interscript::Node::Stage < Interscript::Node::Group::Sequential
2
- attr_accessor :name, :doc_name
2
+ attr_accessor :name, :doc_name, :dont_reverse
3
3
 
4
- def initialize name = :main
4
+ def initialize(name = :main, reverse_run: nil, doc_name: nil, dont_reverse: false)
5
5
  @name = name
6
- super()
6
+ @doc_name = doc_name
7
+ @dont_reverse = dont_reverse
8
+ super(reverse_run: reverse_run)
7
9
  end
8
10
 
9
11
  def to_hash
@@ -12,8 +14,32 @@ class Interscript::Node::Stage < Interscript::Node::Group::Sequential
12
14
  :children => @children.map{|x| x.to_hash} }
13
15
  end
14
16
 
17
+ def reverse
18
+ return self if dont_reverse
19
+
20
+ @reverse ||= begin
21
+ self.class.new(name,
22
+ doc_name: Interscript::Node::Document.reverse_name(doc_name),
23
+ reverse_run: reverse_run.nil? ? nil : !reverse_run
24
+ ).tap do |r|
25
+ r.children = self.children.reverse.map(&:reverse)
26
+ end
27
+ end
28
+ end
29
+
30
+ def ==(other)
31
+ super &&
32
+ self.name == other.name &&
33
+ self.reverse_run == other.reverse_run &&
34
+ self.dont_reverse == other.dont_reverse
35
+ end
36
+
15
37
  def inspect
16
- name = "(#{@name})" if @name != :main
38
+ args = []
39
+ args << "#{@name}" if @name != :main
40
+ args << "dont_reverse: true" if dont_reverse
41
+ name = ""
42
+ name = "(#{args.join(", ")})" unless args.empty?
17
43
  "stage#{name} {\n#{super}\n}"
18
44
  end
19
45
  end
@@ -8,6 +8,16 @@ class Interscript::Node::Tests < Interscript::Node
8
8
  @data << pair
9
9
  end
10
10
 
11
+ def reverse
12
+ self.class.new(data.map do |from,to,reverse_run|
13
+ [to, from, reverse_run == nil ? nil : !reverse_run]
14
+ end)
15
+ end
16
+
17
+ def ==(other)
18
+ super && self.data == other.data
19
+ end
20
+
11
21
  def to_hash
12
22
  { :class => self.class.to_s,
13
23
  :data => @data }
@@ -22,6 +22,10 @@ class Interscript::Stdlib
22
22
  ! %i[none space].include?(a)
23
23
  end
24
24
 
25
+ def self.boundary_like_alias?(a)
26
+ %i[line_start line_end string_start string_end boundary non_word_boundary].include?(a)
27
+ end
28
+
25
29
  @treecache = {}
26
30
 
27
31
  def self.parallel_regexp_compile(subs_hash)
@@ -167,7 +171,20 @@ class Interscript::Stdlib
167
171
  end
168
172
 
169
173
  def self.available_functions
170
- %i[title_case downcase compose decompose separate secryst]
174
+ %i[title_case downcase compose decompose separate unseparate secryst rababa]
175
+ end
176
+
177
+ def self.reverse_function
178
+ {
179
+ title_case: :downcase, # Those two are best-effort,
180
+ downcase: :title_case, # but probably wrong.
181
+
182
+ compose: :decompose,
183
+ decompose: :compose,
184
+
185
+ separate: :unseparate,
186
+ unseparate: :separate
187
+ }
171
188
  end
172
189
 
173
190
  module Functions
@@ -177,8 +194,13 @@ class Interscript::Stdlib
177
194
  output
178
195
  end
179
196
 
180
- def self.downcase(output, _:nil)
181
- output.downcase
197
+ def self.downcase(output, word_separator: nil)
198
+ if word_separator
199
+ output = output.gsub(/^(.)/, &:downcase)
200
+ output = output.gsub(/#{word_separator}(.)/, &:downcase) unless word_separator == ''
201
+ else
202
+ output.downcase
203
+ end
182
204
  end
183
205
 
184
206
  def self.compose(output, _:nil)
@@ -193,6 +215,10 @@ class Interscript::Stdlib
193
215
  output.split("").join(separator)
194
216
  end
195
217
 
218
+ def self.unseparate(output, separator: " ")
219
+ output.split(separator).join("")
220
+ end
221
+
196
222
  @secryst_models = {}
197
223
  def self.secryst(output, model:)
198
224
  require "secryst" rescue nil # Try to load secryst, but don't fail hard if not possible.
@@ -207,5 +233,21 @@ class Interscript::Stdlib
207
233
  @secryst_models[model].translate(i)
208
234
  end.join("\n")
209
235
  end
236
+
237
+ def self.rababa(output, config:)
238
+ require "rababa" rescue nil # Try to load rababa, but don't fail hard if not possible.
239
+ unless defined? Rababa
240
+ raise StandardError, "Rababa is not loaded. Please read docs/Usage_with_Rababa.adoc"
241
+ end
242
+
243
+ config_value = Interscript.rababa_configs[config]
244
+ model_uri = config_value['model']
245
+ rababa_config = config_value['config']
246
+ model_path = Interscript.rababa_provision(config, model_uri)
247
+
248
+ @rababa_diacritizer ||= Rababa::Diacritizer.new(model_path, rababa_config)
249
+
250
+ @rababa_diacritizer.diacritize_text(output)
251
+ end
210
252
  end
211
253
  end
@@ -0,0 +1,39 @@
1
+ module Interscript::Utils
2
+ module Helpers
3
+ def document name=nil, &block
4
+ $example_id ||= 0
5
+ $example_id += 1
6
+ name ||= "example-#{$example_id}"
7
+
8
+ Interscript::DSL::Document.new(name, &block).node.tap do |i|
9
+ $documents ||= {}
10
+ $documents[name] = i
11
+ end
12
+ end
13
+
14
+ def stage &block
15
+ document {
16
+ stage(&block)
17
+ }
18
+ end
19
+ end
20
+ end
21
+
22
+ class Interscript::Node::Document
23
+ def call(str, stage=:main, compiler=$compiler || Interscript::Interpreter, **kwargs)
24
+ compiler.(self).(str, stage, **kwargs)
25
+ end
26
+ end
27
+
28
+ module Interscript::DSL
29
+ class << self
30
+ alias original_parse parse
31
+ def parse(map_name, **kwargs)
32
+ if $documents && $documents[map_name]
33
+ $documents[map_name]
34
+ else
35
+ original_parse(map_name, **kwargs)
36
+ end
37
+ end
38
+ end
39
+ end
@@ -1,3 +1,3 @@
1
1
  module Interscript
2
- VERSION = "2.1.0"
2
+ VERSION = "2.3.1"
3
3
  end
@@ -10,6 +10,7 @@ class Interscript::Node::Group
10
10
  more << "after: #{rule.after.to_html(map)}" if rule.after
11
11
  more << "<nobr>not before:</nobr> #{rule.not_before.to_html(map)}" if rule.not_before
12
12
  more << "<nobr>not after:</nobr> #{rule.not_after.to_html(map)}" if rule.not_after
13
+ more << "<nobr>reverse run:</nobr> #{rule.reverse_run}" unless rule.reverse_run.nil?
13
14
  more = more.join(", ")
14
15
 
15
16
  out << {
@@ -24,11 +25,14 @@ class Interscript::Node::Group
24
25
  children: rule.to_visualization_array(map)
25
26
  }
26
27
  when Interscript::Node::Rule::Funcall
28
+ more = rule.kwargs.map do |k,v|
29
+ "#{k.to_s.gsub("_", " ")}: #{v}"
30
+ end
31
+ more << "<nobr>reverse run:</nobr> #{rule.reverse_run}" unless rule.reverse_run.nil?
32
+
27
33
  out << {
28
34
  type: rule.name.to_s.gsub("_", " ").gsub(/^(.)/, &:upcase),
29
- more: rule.kwargs.map do |k,v|
30
- "#{k.to_s.gsub("_", " ")}: #{v}"
31
- end.join(", ")
35
+ more: more.join(", ")
32
36
  }
33
37
  when Interscript::Node::Rule::Run
34
38
  if rule.stage.map
@@ -39,10 +43,14 @@ class Interscript::Node::Group
39
43
  stage = rule.stage.name
40
44
  end
41
45
 
46
+ more = []
47
+ more << "<nobr>reverse run:</nobr> #{rule.reverse_run}" unless rule.reverse_run.nil?
48
+
42
49
  out << {
43
50
  type: "Run",
44
51
  doc: doc.name,
45
- stage: stage
52
+ stage: stage,
53
+ more: more.join(", "),
46
54
  }
47
55
  else
48
56
  out << {
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: interscript
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
@@ -26,6 +26,20 @@ dependencies:
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: interscript-maps
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 2.3.0a
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 2.3.0a
41
+ - !ruby/object:Gem::Dependency
42
+ name: text
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - ">="
@@ -70,6 +84,7 @@ files:
70
84
  - lib/interscript/compiler.rb
71
85
  - lib/interscript/compiler/javascript.rb
72
86
  - lib/interscript/compiler/ruby.rb
87
+ - lib/interscript/detector.rb
73
88
  - lib/interscript/dsl.rb
74
89
  - lib/interscript/dsl/aliases.rb
75
90
  - lib/interscript/dsl/document.rb
@@ -104,6 +119,7 @@ files:
104
119
  - lib/interscript/node/stage.rb
105
120
  - lib/interscript/node/tests.rb
106
121
  - lib/interscript/stdlib.rb
122
+ - lib/interscript/utils/helpers.rb
107
123
  - lib/interscript/utils/regexp_converter.rb
108
124
  - lib/interscript/version.rb
109
125
  - lib/interscript/visualize.rb