datagnan 1.1.5 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/datagnan.rb +76 -38
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4ff29956adae77378e8f4d320693f2319e3995bb
4
- data.tar.gz: e1401f2e12ed8faa80beb219b701145a0a0f0c97
3
+ metadata.gz: 881e2804b0516deffd9baa0fdd07a6b4dd9e5aa6
4
+ data.tar.gz: 3435fc4132a7ad4f77c84a0f8f78906bf058c527
5
5
  SHA512:
6
- metadata.gz: abf4aa468a7d5ac4d0242f61239fa9da1555d10f5c1996e1661c5f8e4cd1e44a353ccb796381929c8a759fc798454dd6926248b2d81c084568134f634f20f02b
7
- data.tar.gz: d982e33c22ebafc62fc1820e9e170038769a41d61f34c1da2f6145acda568815c55eb8ba1925c30e5ec25260721390b56e4c87543bb5a64e4b7fc4c4709702a8
6
+ metadata.gz: 65388ecda133e1669acf4cfea36067b8b203ab2fe67ed15ac25c91e40300957970f5c797621bfcd8af71bd778c2f5bba37c4b8f089b119620a3f06a3201fb674
7
+ data.tar.gz: 17245b721d824eef3654a2acce9a1cb7736019329f1a8d113e4f5834564750212f618157847508a26bdabd03fd23289b04363777bd6d55e50c20b6850976f499
@@ -10,18 +10,17 @@ class Datagnan
10
10
  # path to .html-template file
11
11
  # @param [Hash] options
12
12
  # options for parsing and filling the template
13
- # @option options [String] :attrs_sep (";") Separate string for 'data-attrs' attribute
14
- # @option options [Object] :scope (self) Scope for variables
15
- # @option options [Hash] :locals (locals || {}) Local variables for filling the template
16
13
  # @param [Hash] locals
17
14
  # local variables for filling the template
18
- def initialize(file_path, options = {}, locals = {})
19
- @doc = Oga.parse_html(File.read(file_path))
15
+ def initialize(file_path, options = {}, local_vars = {})
16
+ @doc = Oga.parse_html File.read(file_path)
20
17
  ## debug
21
18
  # puts "-- @doc = #{@doc}"
22
- @attrs_sep = options.delete(:attrs_sep) || ";"
23
- @scope = options.delete(:scope) || self
24
- @vars = options.delete(:locals) || locals || {}
19
+ @options = {}
20
+ @options[:attrs_sep] = options[:attrs_sep] || ";"
21
+ @options[:path_filters] = options[:path_filters] || {}
22
+ @scope = options[:scope] || self
23
+ @vars = (options[:local_vars] || {}).merge! local_vars
25
24
  @vars.merge! Hash[@scope.instance_variables.map { |name| [name.to_s, @scope.instance_variable_get(name)] } ] unless @scope.nil?
26
25
  ## debug
27
26
  # puts "-- Datagnan.new ( @vars = #{@vars} )"
@@ -34,13 +33,10 @@ class Datagnan
34
33
  # path to .html-template file
35
34
  # @param [Hash] options
36
35
  # options for parsing and filling the template
37
- # @option options [String] :attrs_sep (";") Separate string for 'data-attrs' attribute
38
- # @option options [Object] :scope (self) Scope for variables
39
- # @option options [Hash] :locals (locals || {}) Local variables for filling the template
40
36
  # @param [Hash] locals
41
37
  # local variables for filling the template
42
- def self.open(file_path, options = {}, locals = {})
43
- obj = Datagnan.new(file_path, options, locals).write
38
+ def self.open(file_path, options = {}, local_vars = {})
39
+ obj = Datagnan.new(file_path, options, local_vars).write
44
40
  yield obj if block_given?
45
41
  return obj
46
42
  end
@@ -51,13 +47,10 @@ class Datagnan
51
47
  # path to .html-template file
52
48
  # @param [Hash] options
53
49
  # options for parsing and filling the template
54
- # @option options [String] :attrs_sep (";") Separate string for 'data-attrs' attribute
55
- # @option options [Object] :scope (self) Scope for variables
56
- # @option options [Hash] :locals (locals || {}) Local variables for filling the template
57
50
  # @param [Hash] locals
58
51
  # local variables for filling the template
59
- def self.read(file_path, options = {}, locals = {})
60
- Datagnan.new(file_path, options, locals).write.read
52
+ def self.read(file_path, options = {}, local_vars = {})
53
+ Datagnan.new(file_path, options, local_vars).write.read
61
54
  end
62
55
 
63
56
  ## Return HTML-String. As File.new.read
@@ -101,6 +94,7 @@ class Datagnan
101
94
  # puts "Datagnan.write after vars ( root = #{root.to_xml} )"
102
95
  ## replace data-attrs
103
96
  data_attrs(vars, root)
97
+ data_attr(vars, root)
104
98
  ## debug
105
99
  # puts "Datagnan.write after attrs ( vars = #{vars} )"
106
100
  # puts "Datagnan.write after attrs ( root = #{root.to_xml} )"
@@ -126,6 +120,14 @@ private
126
120
  # puts "-- Datagnan.find_value ( vars = #{vars} )"
127
121
  # beginning_time = Time.now
128
122
  var = vars
123
+
124
+ ## path_filters for replace
125
+ ## Example:
126
+ ## path => '/foo/bar'
127
+ ## :path_filters = { /^\// => '', '/' => '.' }
128
+ ## path => 'foo.bar'
129
+ @options[:path_filters].each { |key, val| path.gsub!(key, val) }
130
+
129
131
  dot_keys = path.split('.')
130
132
  dot_keys = dot_keys.drop_while do |dot_key|
131
133
  ## debug
@@ -142,23 +144,25 @@ private
142
144
  # puts "-- Datagnan.find_value after drop_while ( var = #{var} )"
143
145
  # puts "-- Datagnan.find_value after drop_while ( dot_keys = #{dot_keys} )"
144
146
  # puts "-- Datagnan.find_value before eval ( dot_keys = #{dot_keys} )"
145
-
146
-
147
+
147
148
  begin
148
149
  ## debug
150
+ # puts "-- Datagnan.find_value before eval var.instance_eval"
149
151
  # puts "-- Datagnan.find_value before eval ( var.instance_eval(dot_keys.join('.')) = #{var.instance_eval(dot_keys.join('.'))} )"
150
152
  var = var.instance_eval(dot_keys.join('.'))
151
153
  rescue Exception => e
152
154
  begin
153
155
  ## debug
154
- # puts "-- Datagnan.find_value before eval ( @scope.instance_eval('var.'+dot_keys.join('.')) = #{@scope.instance_eval('var.'+dot_keys.join('.'))} )" if dot_keys.any?
156
+ # puts "-- Datagnan.find_value before eval @scope.instance_eval('var.')"
157
+ # puts "-- Datagnan.find_value before eval ( @scope.instance_eval('var.'+dot_keys.join('.')) = #{@scope.instance_eval('var.'+dot_keys.join('.'))} )"
155
158
  var = @scope.instance_eval('var.'+dot_keys.join('.'))
156
159
  rescue Exception => e
157
160
  begin
158
161
  ## debug
162
+ # puts "-- Datagnan.find_value before eval @scope.instance_eval"
159
163
  # puts "-- Datagnan.find_value before eval ( @scope.instance_eval(dot_keys.join('.')) = #{@scope.instance_eval(dot_keys.join('.'))} )"
160
164
  var = @scope.instance_eval(dot_keys.join('.'))
161
- rescue
165
+ rescue Exception => e
162
166
  var = nil
163
167
  end
164
168
  end
@@ -189,17 +193,43 @@ private
189
193
  # puts "Datagnan.data_var end ( root = #{root} )"
190
194
  end
191
195
 
196
+ ## node attributes (DOMtempl-comaptible)
197
+ # @since 1.2.0
198
+ def data_attr(vars, root)
199
+ root.xpath("//@*[starts-with(name(), 'data-attr-')]").each do |attr|
200
+ node = attr.element
201
+
202
+ key = attr.name.sub!('data-attr-', '')
203
+ val = attr.value
204
+
205
+ var = find_value(val, vars)
206
+
207
+ unless var.nil?
208
+ node.attributes.insert(
209
+ node.attributes.index(attr),
210
+ Oga::XML::Attribute.new(
211
+ :name => key,
212
+ :value => var.to_s,
213
+ :element => node
214
+ )
215
+ )
216
+ end
217
+ node.unset(attr.name)
218
+ end
219
+ end
220
+
192
221
  ## node attributes
193
222
  def data_attrs(vars, root)
194
223
  ## debug
195
224
  # puts "-- Datagnan.data_attrs ( vars = #{vars} )"
196
225
  # puts "-- Datagnan.data_attrs ( root = #{root.to_xml} )"
197
- # puts "-- Datagnan.data_attrs ( @attrs_sep = #{@attrs_sep} )"
226
+ # puts "-- Datagnan.data_attrs ( @options[:attrs_sep] = #{@options[:attrs_sep]} )"
198
227
  root.css('*[data-attrs]').each do |node|
199
228
  ## debug
200
229
  # puts "-- Datagnan.data_attrs each ( node = #{node} )"
201
230
  # puts "-- Datagnan.data_attrs each ( node.to_xml = #{node.to_xml} )"
202
- node.get('data-attrs').split(@attrs_sep).each do |attr|
231
+ node_data_attrs = node.attribute('data-attrs')
232
+ node_data_attrs.value.split(@options[:attrs_sep]).each do |attr|
203
233
  key_val = attr.split(':')
204
234
  key = key_val[0]
205
235
  val = key_val.size.odd? ? key_val[0] : key_val[1]
@@ -212,15 +242,19 @@ private
212
242
 
213
243
  unless var.nil?
214
244
  node.attributes.insert(
215
- node.attributes.index(node.attribute('data-attrs')),
216
- Oga::XML::Attribute.new(:name => key, :value => var.to_s)
245
+ node.attributes.index(node_data_attrs),
246
+ Oga::XML::Attribute.new(
247
+ :name => key,
248
+ :value => var.to_s,
249
+ :element => node
250
+ )
217
251
  )
218
252
  end
219
253
  # puts "-- Datagnan.data_attrs each ( node.to_xml = #{node.to_xml} )"
220
254
  ## TODO: if attr not exist remember it (maybe return to model)
221
255
  end
222
256
  node.unset('data-attrs')
223
- end
257
+ end
224
258
  end
225
259
 
226
260
  ## fill template by array
@@ -306,24 +340,28 @@ end
306
340
  # path to .html-template file
307
341
  # @param [Hash] options
308
342
  # options for parsing and filling the template
309
- # @option options [Object] :scope (self) Scope for variables
310
- # @option options [String] :views (scope.settings.views || "./views") Path to views directory
311
- # @option options [Hash] :locals (locals || {}) Local variables for filling the template
312
343
  # @param [Hash] locals
313
344
  # local variables for filling the template
314
- def datagnan(template_file, options = {}, locals = {})
345
+ def datagnan(template_file, options = {}, local_vars = {})
315
346
  # beginning_time = Time.now
316
347
  ## default options
317
- scope = options.delete(:scope) || self
318
- views = File.realpath(options.delete(:views) || scope.settings.views || "./views")
319
- locals = options.delete(:locals) || locals || {}
348
+ options[:scope] ||= self
349
+ options[:views_dir] = File.realpath(options[:views_dir] || (options[:scope].settings.views if options[:scope].settings) || "./views")
350
+ options[:layout_file] = File.join(options[:views_dir], options[:layout_file] || 'layout.html')
351
+ (options[:local_vars] ||= {}).merge! local_vars
352
+
353
+ ## prepare template filename
354
+ template_file = File.join(options[:views_dir], template_file.to_s)
355
+ template_file += '.html' unless File.exist? template_file
320
356
 
321
- html = Datagnan.read(File.join(views, template_file.to_s+'.html'), :scope => scope, :locals => locals)
357
+ ## render template
358
+ html = Datagnan.read(template_file, options)
322
359
  ## debug
323
360
  # puts "-- datagnan ( template = #{html} )"
324
- if File.exist? File.join(views, 'layout.html')
325
- locals['template'] = {'html' => html}
326
- html = Datagnan.read(File.join(views, 'layout.html'), :scope => scope, :locals => locals)
361
+ ## check for layout and wrap template if exist
362
+ if File.exist? options[:layout_file]
363
+ options[:local_vars]['template'] = { 'html' => html }
364
+ html = Datagnan.read(options[:layout_file], options)
327
365
  ## debug
328
366
  # puts "-- datagnan ( layout = #{html} )"
329
367
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datagnan
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.5
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Popov
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-05-18 00:00:00.000000000 Z
12
+ date: 2015-05-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: oga