phrase_assembler 0.0.9
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.
- data/lib/PAProxies/PAAssembleProxy.rb +110 -0
- data/lib/PAProxies/PACacheProxy.rb +27 -0
- data/lib/PAProxies/PACompositeProxy.rb +32 -0
- data/lib/PAProxies/PALangProxy.rb +86 -0
- data/lib/PAProxies/PALinkProxy.rb +37 -0
- data/lib/PAProxies/PAProxy.rb +20 -0
- data/lib/PAProxies/PAProxyData.rb +39 -0
- data/lib/PAProxies/PAStringProxy.rb +12 -0
- data/lib/PAProxies/PATokenProxy.rb +97 -0
- data/lib/hash_add_on.rb +33 -0
- data/lib/phrase_assembler.rb +97 -0
- metadata +90 -0
@@ -0,0 +1,110 @@
|
|
1
|
+
require './lib/PAProxies/PALinkProxy'
|
2
|
+
class PAAssembleProxy < PALinkProxy
|
3
|
+
attr_accessor :max_tokens_level
|
4
|
+
|
5
|
+
def new_instance(p_data)
|
6
|
+
return self.class.new(p_data, self.logger, self.grammar, false, false, self.max_tokens_level)
|
7
|
+
end
|
8
|
+
|
9
|
+
def method_missing(sym, *args, &block)
|
10
|
+
if args[0].is_a? Integer
|
11
|
+
proxy = super(sym, *args, &block)
|
12
|
+
proxy = proxy[args[0]]
|
13
|
+
args.delete_at(0)
|
14
|
+
elsif args[0]== :r
|
15
|
+
proxy = super(sym, *args, &block)
|
16
|
+
proxy = proxy[rand(proxy.data_length)]
|
17
|
+
args.delete_at(0)
|
18
|
+
else
|
19
|
+
proxy = super(sym, *args, &block)
|
20
|
+
end
|
21
|
+
|
22
|
+
if ((args[0].is_a? String) and (!args[0].empty?))
|
23
|
+
tokens = args[0].split(':', 2)
|
24
|
+
if tokens.length >= 1
|
25
|
+
args[0] = tokens[1]
|
26
|
+
else
|
27
|
+
args.delete_at(0)
|
28
|
+
end
|
29
|
+
|
30
|
+
if tokens[0].index(/\[(\d+|r)\]/).nil?
|
31
|
+
proxy = proxy.send(tokens[0].to_sym, *args, &block)
|
32
|
+
else
|
33
|
+
token_name = tokens[0][/[^\[]+/]
|
34
|
+
token_index = tokens[0][/\[(\d+|r)\]/][1...-1]
|
35
|
+
if token_index == "r"
|
36
|
+
token_index = :r
|
37
|
+
else
|
38
|
+
token_index = token_index.to_i
|
39
|
+
end
|
40
|
+
args.insert(0, token_index)
|
41
|
+
proxy = proxy.send(token_name.to_sym, *args, &block)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
proxy
|
45
|
+
end
|
46
|
+
|
47
|
+
def data=(p_data)
|
48
|
+
@data = p_data
|
49
|
+
change_data(@data)
|
50
|
+
end
|
51
|
+
|
52
|
+
def change_data(p_data)
|
53
|
+
@data_changed = true
|
54
|
+
data_changing_iteration = 0
|
55
|
+
while(@data_changed)
|
56
|
+
@data_changed = false
|
57
|
+
change_sequence_tokens(p_data, p_data)
|
58
|
+
data_changing_iteration = data_changing_iteration + 1
|
59
|
+
raise "Tokens stack level too deep, max is: #{max_tokens_level}" if data_changing_iteration > max_tokens_level
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def initialize(p_data = {}, logger = nil, grammar = {}, init_grammar = true, init_data = true, p_max_tokens_level = 5)
|
64
|
+
self.max_tokens_level = p_max_tokens_level
|
65
|
+
if init_data
|
66
|
+
change_data(p_data)
|
67
|
+
end
|
68
|
+
super(p_data, logger, grammar, init_grammar)
|
69
|
+
end
|
70
|
+
|
71
|
+
def change_sequence_tokens(p_data, root_data)
|
72
|
+
if p_data.is_a? Hash
|
73
|
+
p_data.each_key{|k| change_sequence_tokens(p_data[k], root_data)}
|
74
|
+
elsif p_data.is_a? Array
|
75
|
+
p_data.each_index{|index| change_sequence_tokens(p_data[index], root_data)}
|
76
|
+
elsif p_data.is_a? String
|
77
|
+
return change_sequence_token(p_data, root_data)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def change_sequence_token(p_data, root_data)
|
82
|
+
#TODO srediti da je regex takav da ne mora imati * u [^\{\}\*] dijelu
|
83
|
+
#p_data.gsub!(/\{\*[^(\{\*)(\*\})](:[^(\{\*)(\*\})])+\*\}/){|token|
|
84
|
+
p_data.gsub!(/\{\*@[^\{\}\*\?]+(:[^\{\}\*]+)*\*\}/){|tokens_seq|
|
85
|
+
tokens = tokens_seq[3...-2].split(':')
|
86
|
+
temp_proxy = PAProxy.new(root_data, self.logger)
|
87
|
+
for i in 0..tokens.length-1
|
88
|
+
if tokens[i].index(/\[(\d+|r)\]/).nil?
|
89
|
+
temp_proxy = temp_proxy.create_new_proxy(tokens[i].to_sym)
|
90
|
+
@data_changed = true
|
91
|
+
else
|
92
|
+
token_name = tokens[i][/[^\[]+/]
|
93
|
+
token_index = tokens[i][/\[(\d+|r)\]/][1...-1]
|
94
|
+
temp_proxy = temp_proxy.create_new_proxy(token_name.to_sym)
|
95
|
+
if token_index != "r"
|
96
|
+
token_index = token_index.to_i
|
97
|
+
else
|
98
|
+
token_index = rand(temp_proxy.data.length)
|
99
|
+
end
|
100
|
+
temp_proxy = temp_proxy[token_index]
|
101
|
+
@data_changed = true
|
102
|
+
end
|
103
|
+
end
|
104
|
+
unless temp_proxy.data.is_a? String
|
105
|
+
raise 'Not assembled to end'
|
106
|
+
end
|
107
|
+
temp_proxy.data.to_s
|
108
|
+
}
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module PACacheProxy
|
2
|
+
def self.included(base)
|
3
|
+
base.send(:extend, ClassMethods)
|
4
|
+
end
|
5
|
+
|
6
|
+
module ClassMethods
|
7
|
+
def self.extended(base)
|
8
|
+
class << base
|
9
|
+
alias_method :new_without_cache, :new unless method_defined?(:new_without_cache)
|
10
|
+
alias_method :new, :new_with_cache
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def new_with_cache(*args)
|
15
|
+
t_cache_id = self.cache_id(*args)
|
16
|
+
unless (t_cache_id.nil?) or (self.proxy_cache[t_cache_id].nil?)
|
17
|
+
self.proxy_cache[t_cache_id].set_uncacheable_args(*args)
|
18
|
+
object = self.proxy_cache[t_cache_id]
|
19
|
+
else
|
20
|
+
object = self.new_without_cache(*args)
|
21
|
+
self.proxy_cache[t_cache_id] = object unless t_cache_id.nil?
|
22
|
+
end
|
23
|
+
object
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require './lib/PAProxies/PAAssembleProxy'
|
2
|
+
require './lib/PAProxies/PAStringProxy'
|
3
|
+
require './lib/PAProxies/PACacheProxy'
|
4
|
+
class PACompositeProxy < PAAssembleProxy
|
5
|
+
include PAStringProxy
|
6
|
+
include PACacheProxy
|
7
|
+
|
8
|
+
def new_instance(p_data)
|
9
|
+
return self.class.new(p_data, self.logger, self.grammar, false, false, self.max_tokens_level)
|
10
|
+
end
|
11
|
+
|
12
|
+
@@proxy_cache = {}
|
13
|
+
def self.proxy_cache
|
14
|
+
@@proxy_cache
|
15
|
+
end
|
16
|
+
|
17
|
+
def set_uncacheable_args(p_data = {}, p_logger = nil, p_grammar = {}, init_grammar = true, init_data = true, max_tokens_level = 5)
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_default_options
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.cache_id(p_data = {}, logger = nil, options = {}, grammar = {}, init_grammar = true, init_data = true, max_tokens_level = 5)
|
25
|
+
if p_data.nil?
|
26
|
+
return nil
|
27
|
+
else
|
28
|
+
return "PAID_#{p_data.object_id.to_s}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require './lib/PAProxies/PATokenProxy'
|
2
|
+
class PALangProxy < PATokenProxy
|
3
|
+
attr_accessor :grammar
|
4
|
+
|
5
|
+
def new_instance(p_data)
|
6
|
+
return self.class.new(p_data, self.logger, self.grammar, false)
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(data = {}, logger = nil, grammar = {}, init_grammar = true)
|
10
|
+
if init_grammar
|
11
|
+
set_grammar(grammar)
|
12
|
+
else
|
13
|
+
@grammar = grammar
|
14
|
+
end
|
15
|
+
super(data, logger)
|
16
|
+
end
|
17
|
+
|
18
|
+
def set_grammar(grammar)
|
19
|
+
@grammar = HashAddOn.symbolize_keys_recursive_for_hash(grammar, true)
|
20
|
+
@grammar.each{|k, v|
|
21
|
+
if (v.is_a? Hash and (!v.has_key? :default))
|
22
|
+
@grammar[k][:default] = v.values.sort{|a, b| a <=> b}.join('/')
|
23
|
+
end
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
def load_grammar(file_name)
|
28
|
+
set_grammar(YAML::load(File.read(file_name)))
|
29
|
+
self
|
30
|
+
end
|
31
|
+
|
32
|
+
def get_grammar_token(key, g_value, values)
|
33
|
+
if @grammar[key].nil?
|
34
|
+
raise 'Grammar key not existing'
|
35
|
+
elsif !@grammar[key][g_value].nil?
|
36
|
+
return values[@grammar[key][g_value].to_i]
|
37
|
+
else
|
38
|
+
return @grammar[key][:default].gsub(/\d+/){|index|
|
39
|
+
values[index.to_i]
|
40
|
+
}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def substitute_token(p_data, add_options = {}, p_options = {})
|
45
|
+
#TODO srediti da je regex takav da ne mora imati * u [^\{\}\*] dijelu
|
46
|
+
#p_data.gsub(/\{\*[^(\{\*)(\*\})\?]+\?[^(\{\*)(\*\}):]+(:[^(\{\*)(\*\}):]+)+\*\}/){|token|
|
47
|
+
p_data.gsub!(/\{\*[^\{\}\*\?]+\?[^\{\}\*:]+(:[^\{\}\*:]+)+\*\}/){|token|
|
48
|
+
clear_token = token[2...-2]
|
49
|
+
key = clear_token[/[^\?]+/]
|
50
|
+
opt_params = key[/\(.+\)/]
|
51
|
+
unless opt_params.nil?
|
52
|
+
opt_params = opt_params[1...-1].split(',').collect{|v|
|
53
|
+
raise 'No param' if p_options.options_hash[v.strip.to_sym].nil?
|
54
|
+
p_options.options_hash[v.strip.to_sym]
|
55
|
+
}
|
56
|
+
end
|
57
|
+
key = key[/[^(\(.+\))]+/]
|
58
|
+
keys = key.split('_')
|
59
|
+
if keys.length <= 1
|
60
|
+
options_key = "default"
|
61
|
+
grammar_key = keys[0]
|
62
|
+
else
|
63
|
+
options_key = keys[0]
|
64
|
+
grammar_key = keys[1]
|
65
|
+
end
|
66
|
+
|
67
|
+
values = clear_token[/\?.+/][1..-1].split(':')
|
68
|
+
if p_options.options_hash.has_key?(options_key.to_sym)
|
69
|
+
if opt_params.nil?
|
70
|
+
grammar_value = p_options.options_hash[options_key.to_sym].send(:"get_#{grammar_key}")
|
71
|
+
else
|
72
|
+
grammar_value = p_options.options_hash[options_key.to_sym].send(:"get_#{grammar_key}", opt_params)
|
73
|
+
end
|
74
|
+
elsif p_options.options_hash.has_key?("#{options_key}_#{grammar_key}".to_sym)
|
75
|
+
grammar_value = p_options.options_hash["#{options_key}_#{grammar_key}".to_sym]
|
76
|
+
end
|
77
|
+
if grammar_value.nil?
|
78
|
+
raise 'No token for lang'
|
79
|
+
end
|
80
|
+
add_options["!#{clear_token}"] = get_grammar_token(grammar_key.to_sym, grammar_value.to_sym, values)
|
81
|
+
"{*!#{clear_token}*}"
|
82
|
+
}
|
83
|
+
return super(p_data, add_options, p_options)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require './lib/PAProxies/PALangProxy'
|
2
|
+
class PALinkProxy < PALangProxy
|
3
|
+
def new_instance(p_data)
|
4
|
+
return self.class.new(p_data, self.logger, self.grammar, false)
|
5
|
+
end
|
6
|
+
|
7
|
+
def substitute_token(p_data, add_options = {}, p_options = {})
|
8
|
+
#TODO srediti da je regex takav da ne mora imati * u [^\{\}\*] dijelu
|
9
|
+
#@data.gsub!(/\{\*[^(\{\*)(\*\})]+->[^(\{\*)(\*\})]+\*\}/){|link_token|
|
10
|
+
p_data.gsub!(/\{\*[^\{\*\})]+->[^\{\*\})]+\*\}/){|link_token|
|
11
|
+
link_data = link_token.split("->")
|
12
|
+
link_text = link_data[0][2..-1]
|
13
|
+
link_url = link_data[1][0...-2]
|
14
|
+
|
15
|
+
unless(link_text.index(/'[^'"]+'/).nil? and link_text.index(/"[^'"]+"/).nil?)
|
16
|
+
link_text = "#{link_text[1...-1]}"
|
17
|
+
else
|
18
|
+
link_text = "{*#{link_text}*}"
|
19
|
+
end
|
20
|
+
|
21
|
+
if p_options.options_hash[link_url.to_sym].is_a? Hash
|
22
|
+
identifier = "!link_url_#{link_url.object_id}"
|
23
|
+
add_options[identifier] = p_options.options_hash[link_url.to_sym][:href]
|
24
|
+
add_attributes = ""
|
25
|
+
p_options.options_hash[link_url.to_sym].keys.sort{|a,b| a.to_s <=> b.to_s}.collect{|k|
|
26
|
+
add_attributes += " #{k} = '#{p_options.options_hash[link_url.to_sym][k]}'" if k != :href
|
27
|
+
}
|
28
|
+
result = "<a href = '{*#{identifier}*}'#{add_attributes}>#{link_text}</a>"
|
29
|
+
else
|
30
|
+
result = "<a href = '{*#{link_url}*}'>#{link_text}</a>"
|
31
|
+
end
|
32
|
+
|
33
|
+
result
|
34
|
+
}
|
35
|
+
return super(p_data, add_options, p_options)
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require './lib/PAProxies/PAProxyData'
|
2
|
+
class PAProxy < PAProxyData
|
3
|
+
def new_instance(p_data)
|
4
|
+
return self.class.new(p_data, self.logger)
|
5
|
+
end
|
6
|
+
|
7
|
+
def method_missing(sym, *args, &block)
|
8
|
+
create_new_proxy(sym)
|
9
|
+
end
|
10
|
+
|
11
|
+
def create_new_proxy(sym)
|
12
|
+
if @data.has_key?(sym)
|
13
|
+
return new_instance(@data[sym])
|
14
|
+
elsif @data.has_key?(sym.to_s)
|
15
|
+
return new_instance(@data[sym.to_s])
|
16
|
+
else
|
17
|
+
raise "Could not assemble: "
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
class PAProxyData
|
3
|
+
attr_accessor :data
|
4
|
+
attr_accessor :logger
|
5
|
+
|
6
|
+
def initialize(p_data = {}, p_logger = nil)
|
7
|
+
self.data = p_data
|
8
|
+
self.logger = p_logger
|
9
|
+
self
|
10
|
+
end
|
11
|
+
|
12
|
+
def data_length
|
13
|
+
@data.length
|
14
|
+
end
|
15
|
+
|
16
|
+
def load(file_name)
|
17
|
+
self.data = HashAddOn.symbolize_keys_recursive_for_hash(YAML::load(File.read(file_name)), true)
|
18
|
+
self
|
19
|
+
end
|
20
|
+
|
21
|
+
def new_instance(p_data)
|
22
|
+
return self.class.new(p_data, self.logger)
|
23
|
+
end
|
24
|
+
|
25
|
+
def [](index)
|
26
|
+
if @data.is_a? Array
|
27
|
+
if index == :r
|
28
|
+
return new_instance(@data[rand(@data.length)])
|
29
|
+
elsif index < @data.length
|
30
|
+
return new_instance(@data[index])
|
31
|
+
else
|
32
|
+
raise 'out of bonds'
|
33
|
+
end
|
34
|
+
else
|
35
|
+
raise 'Non array'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module PAStringProxy
|
2
|
+
def to_s(p_options = nil)
|
3
|
+
temp_data = get_data(p_options)
|
4
|
+
if temp_data.is_a? Array
|
5
|
+
raise "Can not put Array to String"
|
6
|
+
elsif temp_data.is_a? Hash
|
7
|
+
raise "Can not put Hash to String"
|
8
|
+
else
|
9
|
+
return temp_data.to_s
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require './lib/PAProxies/PAProxy'
|
2
|
+
class PATokenProxyOptions
|
3
|
+
attr_accessor :options_hash
|
4
|
+
attr_accessor :indices_hash
|
5
|
+
|
6
|
+
def self.new_if_needed(p_options)
|
7
|
+
if (p_options.is_a? PATokenProxyOptions)
|
8
|
+
return p_options
|
9
|
+
else
|
10
|
+
return self.new(p_options)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def reset
|
15
|
+
calculate_indices(options_hash) if !@added_indices
|
16
|
+
@added_indices = true
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(p_options)
|
20
|
+
self.options_hash = p_options
|
21
|
+
self.indices_hash = {}
|
22
|
+
reset
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_current_index(array)
|
26
|
+
return indices_hash[array.object_id.to_s]
|
27
|
+
end
|
28
|
+
|
29
|
+
def inc_index(array)
|
30
|
+
indices_hash[array.object_id.to_s] = indices_hash[array.object_id.to_s] + 1
|
31
|
+
if indices_hash[array.object_id.to_s] >= array.length
|
32
|
+
indices_hash[array.object_id.to_s]= 0
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
def calculate_indices(hash)
|
38
|
+
if hash.is_a? Array
|
39
|
+
indices_hash[hash.object_id.to_s] = 0
|
40
|
+
hash.each{|hash_element| calculate_indices(hash_element)}
|
41
|
+
elsif hash.is_a? Hash
|
42
|
+
hash.each_value{|val| calculate_indices(val)}
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class PATokenProxy < PAProxy
|
48
|
+
def new_instance(p_data)
|
49
|
+
return self.class.new(p_data, self.logger)
|
50
|
+
end
|
51
|
+
|
52
|
+
def get_data(p_options = {})
|
53
|
+
substitute_tokens(self.data, PATokenProxyOptions.new_if_needed(p_options))
|
54
|
+
end
|
55
|
+
|
56
|
+
def substitute_tokens(p_data, p_options)
|
57
|
+
if p_data.is_a? Hash
|
58
|
+
return substitute_hash(p_data, p_options)
|
59
|
+
elsif p_data.is_a? Array
|
60
|
+
return p_data.collect{|v| substitute_tokens(v, p_options)}
|
61
|
+
elsif p_data.is_a? String
|
62
|
+
return substitute_token(String.new(p_data), {}, p_options)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def substitute_hash(p_data, p_options)
|
67
|
+
t_hash = {}
|
68
|
+
p_data.keys.sort{|a, b| a.to_s <=> b.to_s}.each{|k| t_hash[k] = substitute_tokens(p_data[k], p_options)}
|
69
|
+
return t_hash
|
70
|
+
end
|
71
|
+
|
72
|
+
def substitute_token(p_data, add_options = {}, p_options = {})
|
73
|
+
#TODO srediti da je regex takav da ne mora imati * u [^\{\}\*] dijelu
|
74
|
+
#return_p_data = p_data.gsub(/\{\*[^(\{\*)(\*\})]+\*\}/){|token|
|
75
|
+
return_p_data = p_data.gsub(/\{\*[^\{\}\*]+\*\}/){|token|
|
76
|
+
sym_token = token[2...-2]
|
77
|
+
if sym_token[0...1]!="!"
|
78
|
+
sym_token = sym_token.to_sym
|
79
|
+
end
|
80
|
+
|
81
|
+
add_options.merge!(p_options.options_hash)
|
82
|
+
|
83
|
+
if add_options[sym_token].nil?
|
84
|
+
raise 'No token value'
|
85
|
+
elsif add_options[sym_token].is_a? Array
|
86
|
+
result = add_options[sym_token][p_options.get_current_index(add_options[sym_token])]
|
87
|
+
p_options.inc_index(add_options[sym_token])
|
88
|
+
else
|
89
|
+
result = add_options[sym_token]
|
90
|
+
end
|
91
|
+
|
92
|
+
result
|
93
|
+
}
|
94
|
+
return_p_data
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
data/lib/hash_add_on.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
module HashAddOn
|
2
|
+
def self.symbolize_keys_recursive_for_hash(hash, downcase)
|
3
|
+
if hash.is_a? Hash
|
4
|
+
sym_hash = {}
|
5
|
+
|
6
|
+
hash.each{|key, value|
|
7
|
+
if (downcase)
|
8
|
+
if (key.is_a? String)
|
9
|
+
down_key = key.downcase
|
10
|
+
else
|
11
|
+
down_key = key.to_s.downcase
|
12
|
+
end
|
13
|
+
else
|
14
|
+
down_key = key
|
15
|
+
end
|
16
|
+
sym_hash[down_key.to_sym] = value
|
17
|
+
}
|
18
|
+
|
19
|
+
sym_hash.keys.each{|key|
|
20
|
+
if (sym_hash[key].is_a? Hash or sym_hash[key].is_a? Array)
|
21
|
+
sym_hash[key] = self.symbolize_keys_recursive_for_hash(sym_hash[key], downcase)
|
22
|
+
end
|
23
|
+
}
|
24
|
+
return sym_hash
|
25
|
+
elsif hash.is_a? Array
|
26
|
+
hash = hash.collect{|val| self.symbolize_keys_recursive_for_hash(val, downcase)}
|
27
|
+
return hash
|
28
|
+
else
|
29
|
+
return hash
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require './lib/PAProxies/PACompositeProxy'
|
2
|
+
module PhraseAssembler
|
3
|
+
def supress_errors
|
4
|
+
@@supress_errors
|
5
|
+
end
|
6
|
+
|
7
|
+
def supress_errors=(value)
|
8
|
+
@@supress_errors = value
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.included(base)
|
12
|
+
base.send :extend, InitMethods
|
13
|
+
base.instance_eval do
|
14
|
+
def self._fields
|
15
|
+
self.send(:class_variable_get, :@@_fields)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self._fields=(value)
|
19
|
+
self.send(:class_variable_set, :@@_fields, value)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self._default_pref_language
|
23
|
+
self.send(:class_variable_get, :@@_default_pref_language)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self._default_pref_language=(value)
|
27
|
+
self.send(:class_variable_set, :@@_default_pref_language, value)
|
28
|
+
end
|
29
|
+
|
30
|
+
def self._languages
|
31
|
+
self.send(:class_variable_get, :@@_languages)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self._languages=(value)
|
35
|
+
self.send(:class_variable_set, :@@_languages, value)
|
36
|
+
end
|
37
|
+
|
38
|
+
def self._grammars
|
39
|
+
self.send(:class_variable_get, :@@_grammars)
|
40
|
+
end
|
41
|
+
|
42
|
+
def self._grammars=(value)
|
43
|
+
self.send(:class_variable_set, :@@_grammars, value)
|
44
|
+
end
|
45
|
+
|
46
|
+
def self._languages_files_path
|
47
|
+
self.send(:class_variable_get, :@@_languages_files_path)
|
48
|
+
end
|
49
|
+
|
50
|
+
def self._languages_files_path=(value)
|
51
|
+
self.send(:class_variable_set, :@@_languages_files_path, value)
|
52
|
+
end
|
53
|
+
|
54
|
+
def self._logger
|
55
|
+
self.send(:class_variable_get, :@@_logger)
|
56
|
+
end
|
57
|
+
|
58
|
+
def self._logger=(value)
|
59
|
+
self.send(:class_variable_set, :@@_logger, value)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
module InitMethods
|
65
|
+
|
66
|
+
def acts_as_phrase_assembler(options = {})
|
67
|
+
self._fields = (options[:fields] || {:sex => :sex, :pref_language => :pref_language} )
|
68
|
+
self._default_pref_language = (options[:default_pref_language] || 'hr')
|
69
|
+
self._languages = (options[:languages] || {'hr' => 'croatian.yml', 'rs' => 'serbian.yml', 'si' => 'slovenian.yml'})
|
70
|
+
self._grammars = (options[:grammars] || {'hr' => 'croatian_grammar.yml', 'rs' => 'serbian_grammar.yml', 'si' => 'slovenian_grammar.yml'})
|
71
|
+
self._languages_files_path = (options[:languages_files_path] || File.join(RAILS_ROOT, 'app', 'yaml', 'languages'))
|
72
|
+
self._logger = (options[:logger] || RAILS_DEFAULT_LOGGER)
|
73
|
+
|
74
|
+
send :include, InstanceMethods
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
module InstanceMethods
|
79
|
+
attr_reader :phrase
|
80
|
+
|
81
|
+
@@proxies = {}
|
82
|
+
def phrase
|
83
|
+
t_pref_language = self.send(self.class._fields[:pref_language])
|
84
|
+
t_pref_language = self.class._default_pref_language if (t_pref_language.nil? or t_pref_language.empty?)
|
85
|
+
if @@proxies[t_pref_language].nil?
|
86
|
+
@@proxies[t_pref_language] = PACompositeProxy.new(nil, self.class._logger)
|
87
|
+
@@proxies[t_pref_language].load(File.join(self.class._languages_files_path, self.class._languages[t_pref_language]) )
|
88
|
+
@@proxies[t_pref_language].load_grammar(File.join(self.class._languages_files_path, self.class._grammars[t_pref_language]))
|
89
|
+
end
|
90
|
+
@@proxies[t_pref_language]
|
91
|
+
end
|
92
|
+
|
93
|
+
def get_sex
|
94
|
+
self.send(self.class._fields[:sex])
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
metadata
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: phrase_assembler
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 13
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 9
|
10
|
+
version: 0.0.9
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- "Lovro \xC5\xBDmak, Radan Skori\xC4\x87, Drap"
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-02-09 00:00:00 +01:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: rspec
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
version: "0"
|
33
|
+
type: :development
|
34
|
+
version_requirements: *id001
|
35
|
+
description: Gem for building phrases from yml
|
36
|
+
email: lovro.zmak@drap.hr
|
37
|
+
executables: []
|
38
|
+
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files: []
|
42
|
+
|
43
|
+
files:
|
44
|
+
- lib/hash_add_on.rb
|
45
|
+
- lib/PAProxies/PAAssembleProxy.rb
|
46
|
+
- lib/PAProxies/PACacheProxy.rb
|
47
|
+
- lib/PAProxies/PACompositeProxy.rb
|
48
|
+
- lib/PAProxies/PALangProxy.rb
|
49
|
+
- lib/PAProxies/PALinkProxy.rb
|
50
|
+
- lib/PAProxies/PAProxy.rb
|
51
|
+
- lib/PAProxies/PAProxyData.rb
|
52
|
+
- lib/PAProxies/PAStringProxy.rb
|
53
|
+
- lib/PAProxies/PATokenProxy.rb
|
54
|
+
- lib/phrase_assembler.rb
|
55
|
+
has_rdoc: true
|
56
|
+
homepage: http://www.drap.hr
|
57
|
+
licenses: []
|
58
|
+
|
59
|
+
post_install_message:
|
60
|
+
rdoc_options: []
|
61
|
+
|
62
|
+
require_paths:
|
63
|
+
- lib
|
64
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
hash: 3
|
70
|
+
segments:
|
71
|
+
- 0
|
72
|
+
version: "0"
|
73
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
hash: 3
|
79
|
+
segments:
|
80
|
+
- 0
|
81
|
+
version: "0"
|
82
|
+
requirements: []
|
83
|
+
|
84
|
+
rubyforge_project: nowarning
|
85
|
+
rubygems_version: 1.4.2
|
86
|
+
signing_key:
|
87
|
+
specification_version: 3
|
88
|
+
summary: Gem for building phrases
|
89
|
+
test_files: []
|
90
|
+
|