phrase_assembler 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|