tzispa_rig 0.2.6 → 0.2.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 484c207b444e399e36b3b280ec31d19bde762aaf
4
- data.tar.gz: d72e7fc08e477694bde0eb6d38ca6c415796fb8c
3
+ metadata.gz: 1aa4a9522b55f88d715802bab683693ae3ac267a
4
+ data.tar.gz: f1c4923b96b5e45a5198c4274386062d03c9dace
5
5
  SHA512:
6
- metadata.gz: a3d55a81e78788feb9c3eedd9a287ca467ec45024c244049a2e5d0553e47de5c9a6cd50a41ebc6cbbd991075d48256ee943e24e7e0764e45c76cbbe3fe91cd17
7
- data.tar.gz: f132ca420011439890b476f274bf145a6331da7b10a4ac63f89128dfe68132e2c7074195c3a9bdbf2e3a2cbca722275475205615175bcdc99e6fc920fd173115
6
+ metadata.gz: 776cfe3e0b6655dc2f0133c65b10b0914e1d4f94397a83862f34aa4c7c64cba9548c752586a3cf9735142074c1186b5d1c3df60800782c2a3b3ec42633bd9695
7
+ data.tar.gz: 88e84342bf54817050b45a06fe4226d2179ca5fee0ee5062ee6bac73aecf96d5410e2b6c73c0f45344cbd73770a1f4bff9d491cc7cd5d0f89c4b27d5ae18e11a
data/CHANGELOG.md CHANGED
@@ -2,6 +2,9 @@ Tzispa Rig
2
2
 
3
3
  Rig templates implementation
4
4
 
5
+ ## v0.2.7
6
+ - Add url template tag to build canonical urls
7
+
5
8
  ## v0.2.6
6
9
  - Add basic documentation
7
10
 
data/README.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  A general purpose template engine
4
4
 
5
+ ## Installation
6
+
7
+ ```shell
8
+ % gem install tzispa
9
+ ```
10
+
5
11
  ## Rig template types
6
12
 
7
13
  There are 3 template types: layout, static and block:
@@ -31,8 +37,8 @@ And metavariables with:
31
37
  ```
32
38
  {%name%}
33
39
  ```
34
- metavariables are used to make runtime template tags replacements
35
40
 
41
+ metavariables are used to make runtime template tags replacements
36
42
  ```html
37
43
  <fieldset>
38
44
  <div class='row'>
@@ -42,15 +48,13 @@ metavariables are used to make runtime template tags replacements
42
48
  </div>
43
49
  <div class='column column-20'>
44
50
  <label for='skey'>Código</label>
45
- <input type='text' name='skey' id='skey' maxlength="16" value='{%skey%}'/>
51
+ <input type='text' name='skey' id='skey' maxlength="16" value='<var:skey/>'/>
46
52
  </div>
53
+ <a href='<purl:site[layout=brand_edit,title=edit-brand,id0={%idb%}]/>'><i class='fa fa-edit'></i></a>
47
54
  </div>
48
- ....
49
-
50
55
  ```
51
56
 
52
- and in the template binder
53
-
57
+ in the template binder
54
58
  ```ruby
55
59
  def bind!
56
60
  @idb = context.router_params[:id0]
@@ -67,18 +71,21 @@ def load_brand
67
71
  data(
68
72
  idb: brand.id,
69
73
  name: brand.name,
70
- skey: brand.skey,
71
- long_name: brand.long_name,
72
- web: brand.web,
73
- manual_order: brand.manual_order,
74
- notes: brand.notes
74
+ skey: brand.skey
75
75
  )
76
76
  end
77
77
  ```
78
78
 
79
79
  ### Conditionals
80
80
 
81
- You can make decisions in your templates using conditionals:
81
+ You can make decisions in your templates using template ife tag:
82
+ ```
83
+ <ife:test> ..... <else:test/> .... </ife:test>
84
+
85
+ or without the else part
86
+
87
+ <ife:test> ..... </ife:test>
88
+ ```
82
89
 
83
90
  ```html
84
91
  <ife:customer_exist>
@@ -98,19 +105,23 @@ You can make decisions in your templates using conditionals:
98
105
  ```
99
106
 
100
107
  In the binder you must define customer_exist
101
-
102
108
  ```ruby
109
+
103
110
  def bind!
104
111
  idc = context.router_params[:id0]
105
112
  context.repository.use :ecomm_shop
106
113
  customer = context.repository[:customer][idb]
107
114
  data.customer_exist = !customer.nil?
108
115
  end
116
+
109
117
  ```
110
118
 
111
119
  ## Repeating
112
120
 
113
- To repeat a part in the template
121
+ To repeat a part in the template use loop tag
122
+ ```
123
+ <loop:ltag> ... </loop:ltag>
124
+ ```
114
125
 
115
126
  ```html
116
127
  <loop:lbrands>
@@ -127,7 +138,6 @@ To repeat a part in the template
127
138
  ```
128
139
 
129
140
  In the binder you must use the 'loop_binder' method
130
-
131
141
  ```ruby
132
142
 
133
143
  def bind!
@@ -150,7 +160,7 @@ def load_brands
150
160
  end
151
161
  ```
152
162
 
153
- ## Building urls
163
+ ## Template URLs
154
164
 
155
165
  Rig templates can build urls for you. There are 2 url types:
156
166
 
@@ -162,6 +172,7 @@ Site urls: used to provide links to site pages
162
172
  <purl:route_id/>
163
173
  <purl:route_id[param1=value,param2=value]/>
164
174
  ```
175
+
165
176
  ```html
166
177
  <purl:site[layout=brands,title=brand-list]/>
167
178
  <purl:index/>
@@ -176,8 +187,56 @@ Api urls: used to provide urls to the application Api
176
187
  <api:handler:verb/>
177
188
  <api:handler:verb:predicate/>
178
189
  ```
190
+
179
191
  ```html
180
192
  <api:customer:add:address/>
181
193
 
182
194
  <api:brand:{%verb%}/>
183
195
  ```
196
+
197
+ ## Building templates
198
+
199
+ You can include block and static rig templates using these tags:
200
+ ```
201
+ <blk:name[param1=value,param2=value, ... ]/>
202
+
203
+ <static:name/>
204
+ ```
205
+
206
+ As you can see, template parameters can be passed in the block tag.
207
+ These parameters will be available in the binder.
208
+ You can also use template subdomains using dot notation in the name
209
+ ```html
210
+ <!DOCTYPE html>
211
+ <html lang="es">
212
+ <head>
213
+ <meta charset="utf-8" />
214
+ <blk:metasense/>
215
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
216
+ <static:comassert/>
217
+ </head>
218
+ <body>
219
+ <blk:header/>
220
+ <div class="container m-bot-35 m-top-25 clearfix">
221
+ <div class="row">
222
+ <div class="three columns m-bot-25">
223
+ <blk:sidebar/>
224
+ </div>
225
+ <div class="nine columns m-bot-25">
226
+ <blk:folder.edit[doc=dokum]/>
227
+ </div>
228
+ </div>
229
+ </div>
230
+ <static:footer/>
231
+ <static:footscripts/>
232
+ </body>
233
+ </html>
234
+ ```
235
+
236
+ In the folder binder you can access template parameters
237
+ ```ruby
238
+ def bind!
239
+ context.repository.use :quality_dok
240
+ @doctype = params[:doc]
241
+ end
242
+ ```
@@ -71,7 +71,7 @@ module Tzispa
71
71
  end
72
72
 
73
73
  def self.for(template, context)
74
- if template.is_block?
74
+ if template.bindable?
75
75
  binder_class = template.binder_class
76
76
  binder_class.new( template, context ) if binder_class
77
77
  else
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'forwardable'
4
4
  require 'tzispa/utils/string'
5
+ require_relative 'syntax'
5
6
 
6
7
 
7
8
  module Tzispa
@@ -27,8 +28,10 @@ module Tzispa
27
28
  ParsedMeta.new parser, type, match[1]
28
29
  when :var
29
30
  ParsedVar.new parser, type, match[1], match[2]
30
- when :purl
31
+ when :url
31
32
  ParsedUrl.new parser, type, match[1], match[3]
33
+ when :purl
34
+ ParsedPurl.new parser, type, match[1], match[3]
32
35
  when :api
33
36
  ParsedApi.new parser, type, match[1], match[2], match[3], match[4]
34
37
  when :loop
@@ -100,7 +103,7 @@ module Tzispa
100
103
  end
101
104
 
102
105
 
103
- class ParsedUrl < ParsedEntity
106
+ class ParsedPurl < ParsedEntity
104
107
 
105
108
  def initialize(parser, type, path_id, params)
106
109
  super(parser, type)
@@ -118,6 +121,25 @@ module Tzispa
118
121
  end
119
122
 
120
123
 
124
+ class ParsedUrl < ParsedEntity
125
+
126
+ def initialize(parser, type, path_id, params)
127
+ super(parser, type)
128
+ @path_id = path_id.to_sym
129
+ @params = params
130
+ end
131
+
132
+ def render(binder)
133
+ b_params = @params.dup.gsub(RE_ANCHOR) { |match|
134
+ parser.the_parsed.select { |p| p.anchor == match}.first.render(binder)
135
+ } if @params
136
+ binder.context.canonical_url @path_id, Parameters.new(b_params).data
137
+ end
138
+
139
+ end
140
+
141
+
142
+
121
143
  class ParsedApi < ParsedEntity
122
144
 
123
145
  attr_reader :handler, :verb, :predicate
@@ -313,24 +335,7 @@ module Tzispa
313
335
 
314
336
  EMPTY_STRING = ''
315
337
 
316
- RIG_EMPTY = {
317
- :flags => /<flags:(\[(\w+=[^,\]]+(,\w+=[^,\]]+)*?)\])\/>/
318
- }.freeze
319
-
320
- RIG_EXPRESSIONS = {
321
- :meta => /\{%([^%]+?)%\}/.freeze,
322
- :var => /<var(\[%[A-Z]?[0-9]*[a-z]\])?:(\w+)\/>/,
323
- :purl => /<purl:(\w+(?:\.\w+)?)(\[(\w+=[^,\]]+(,\w+=[^,\]]+)*?)\])?\/>/,
324
- :api => /<api:([^:\.]+(?:\.[^:]+)?):([^:\/]+)(?::([^:\/]+))?(?::([^\/]+))?\/>/
325
- }.freeze
326
-
327
- RIG_STATEMENTS = /(<(loop):(\w+)>(.*?)<\/loop:\3>)|(<(ife):(\w+)>(.*?)(<else:\7\/>(.*?))?<\/ife:\7>)/m
328
-
329
- RIG_TEMPLATES = {
330
- :blk => /<(blk):(\w+(?:\.\w+)?)(?:\[(\w+=[^,\]]+(?:,\w+=[^,\]]+)*)\])?\/>/,
331
- :iblk => /<(iblk):(\w+):(\w+(?:\.\w+)?)(?:\[(\w+=[^,\]]+(?:,\w+=[^,\]]+)*)\])?:(\w+(?:\.\w+)?)(?:\[(\w+=[^,\]]+(?:,\w+=[^,\]]+)*)\])?\/>/,
332
- :static => /<(static):(\w+(?:\.\w+)?)(?:\[(\w+=[^,\]]+(?:,\w+=[^,\]]+)*)\])?\/>/
333
- }.freeze
338
+ include Tzispa::Rig::Syntax
334
339
 
335
340
  attr_reader :flags, :template, :the_parsed
336
341
 
@@ -343,7 +348,7 @@ module Tzispa
343
348
  def parse!
344
349
  @tags = nil
345
350
  parse_flags
346
- if @template.is_block?
351
+ if @template.bindable?
347
352
  parse_statements
348
353
  parse_expressions
349
354
  end
@@ -394,7 +399,6 @@ module Tzispa
394
399
 
395
400
  def parse_statements
396
401
  @inner_text.gsub!(RIG_STATEMENTS) { |match|
397
- #puts Regexp.last_match.inspect
398
402
  type = (Regexp.last_match[2] || String.new) << (Regexp.last_match[6] || String.new)
399
403
  pe = ParsedEntity.instance(self, type.to_sym, Regexp.last_match )
400
404
  @the_parsed << pe.parse!
@@ -0,0 +1,27 @@
1
+ module Tzispa
2
+ module Rig
3
+ module Syntax
4
+
5
+ RIG_EMPTY = {
6
+ :flags => /<flags:(\[(\w+=[^,\]]+(,\w+=[^,\]]+)*?)\])\/>/
7
+ }.freeze
8
+
9
+ RIG_EXPRESSIONS = {
10
+ :meta => /\{%([^%]+?)%\}/,
11
+ :var => /<var(\[%[A-Z]?[0-9]*[a-z]\])?:(\w+)\/>/,
12
+ :purl => /<purl:(\w+(?:\.\w+)?)(\[(\w+=[^,\]]+(,\w+=[^,\]]+)*?)\])?\/>/,
13
+ :url => /<url:(\w+(?:\.\w+)?)(\[(\w+=[^,\]]+(,\w+=[^,\]]+)*?)\])?\/>/,
14
+ :api => /<api:([^:\.]+(?:\.[^:]+)?):([^:\/]+)(?::([^:\/]+))?(?::([^\/]+))?\/>/
15
+ }.freeze
16
+
17
+ RIG_STATEMENTS = /(<(loop):(\w+)>(.*?)<\/loop:\3>)|(<(ife):(\w+)>(.*?)(<else:\7\/>(.*?))?<\/ife:\7>)/m
18
+
19
+ RIG_TEMPLATES = {
20
+ :blk => /<(blk):(\w+(?:\.\w+)?)(?:\[(\w+=[^,\]]+(?:,\w+=[^,\]]+)*)\])?\/>/,
21
+ :iblk => /<(iblk):(\w+):(\w+(?:\.\w+)?)(?:\[(\w+=[^,\]]+(?:,\w+=[^,\]]+)*)\])?:(\w+(?:\.\w+)?)(?:\[(\w+=[^,\]]+(?:,\w+=[^,\]]+)*)\])?\/>/,
22
+ :static => /<(static):(\w+(?:\.\w+)?)(?:\[(\w+=[^,\]]+(?:,\w+=[^,\]]+)*)\])?\/>/
23
+ }.freeze
24
+
25
+ end
26
+ end
27
+ end
@@ -3,6 +3,8 @@
3
3
  require 'forwardable'
4
4
  require 'fileutils'
5
5
  require 'tzispa/utils/string'
6
+ require 'tzispa/utils/indenter'
7
+ require 'tzispa/utils/cache'
6
8
  require 'tzispa/rig'
7
9
 
8
10
  module Tzispa
@@ -26,7 +28,7 @@ module Tzispa
26
28
  end
27
29
 
28
30
  def modified?
29
- @modified != File.mtime(@file)
31
+ @modified != ::File.mtime(@file)
30
32
  end
31
33
 
32
34
  def exist?
@@ -110,18 +112,22 @@ module Tzispa
110
112
  create_binder
111
113
  end
112
114
 
113
- def is_block?
115
+ def block?
114
116
  @type == :block
115
117
  end
116
118
 
117
- def is_layout?
119
+ def layout?
118
120
  @type == :layout
119
121
  end
120
122
 
121
- def is_static?
123
+ def static?
122
124
  @type == :static
123
125
  end
124
126
 
127
+ def bindable?
128
+ block? || layout?
129
+ end
130
+
125
131
  def params=(value)
126
132
  @params = Parameters.new(value)
127
133
  end
@@ -156,21 +162,27 @@ module Tzispa
156
162
 
157
163
  def create_binder
158
164
  ::File.open("#{domain.path}/#{binder_require}.rb", "w") { |f|
159
- binder_code = TzString.new
160
- f.puts binder_code.indenter("require 'tzispa/rig/binder'\n\n")
165
+ f.puts new_binder_code
166
+ } if @type == :block
167
+ end
168
+
169
+ def new_binder_code
170
+ Tzispa::Utils::Indenter.new(2).tap { |binder_code|
171
+ binder_code << "require 'tzispa/rig/binder'\n\n"
161
172
  level = 0
162
173
  binder_namespace.split('::').each { |ns|
163
- f.puts binder_code.indenter("module #{ns}\n", level > 0 ? 2 : 0).to_s
174
+ binder_code.indent if level > 0
175
+ binder_code << "module #{ns}\n"
164
176
  level += 1
165
177
  }
166
- f.puts binder_code.indenter("\nclass #{binder_class_name} < Tzispa::Rig::TemplateBinder\n\n", 2)
167
- f.puts binder_code.indenter("def bind!", 2)
168
- f.puts binder_code.indenter("end\n\n")
169
- f.puts binder_code.unindenter("end", 2)
178
+ binder_code.indent << "\nclass #{binder_class_name} < Tzispa::Rig::TemplateBinder\n\n"
179
+ binder_code.indent << "def bind!\n"
180
+ binder_code << "end\n\n"
181
+ binder_code.unindent << "end\n"
170
182
  binder_namespace.split('::').each { |ns|
171
- f.puts binder_code.unindenter("end\n", 2)
183
+ binder_code.unindent << "end\n"
172
184
  }
173
- } if @type == :block
185
+ }.to_s
174
186
  end
175
187
 
176
188
  end
@@ -180,9 +192,9 @@ module Tzispa
180
192
 
181
193
  attr_reader :app
182
194
 
183
- def initialize(app)
195
+ def initialize(app, cache_enabled, cache_size)
184
196
  @app = app
185
- @pool= Hash.new
197
+ @cache = Tzispa::Utils::LRUCache.new(cache_size) if cache_enabled
186
198
  @mutex = Mutex.new
187
199
  end
188
200
 
@@ -199,14 +211,20 @@ module Tzispa
199
211
  end
200
212
 
201
213
  def rig_template(name, type, format, params, parent)
202
- if @mutex.owned?
203
- tpl = @pool["#{type}__#{name}"] || Template.new( name: name, type: type, format: format, domain: @app.domain, params: params, parent: parent, engine: self )
204
- tpl.loaded? && !tpl.modified? ? tpl : tpl.load!.parse!
214
+ if @cache
215
+ ktpl = "#{type}__#{name}".to_sym
216
+ if @mutex.owned?
217
+ tpl = @cache[ktpl] || Template.new(name: name, type: type, format: format, domain: @app.domain, params: params, parent: parent, engine: self)
218
+ @cache[ktpl] = tpl.loaded? && !tpl.modified? ? tpl : tpl.load!.parse!
219
+ else
220
+ @mutex.synchronize {
221
+ tpl = @cache[ktpl] || Template.new(name: name, type: type, format: format, domain: @app.domain, params: params, parent: parent, engine: self)
222
+ @cache[ktpl] = tpl.loaded? && !tpl.modified? ? tpl : tpl.load!.parse!
223
+ }
224
+ end
205
225
  else
206
- @mutex.synchronize {
207
- tpl = @pool["#{type}__#{name}"] || Template.new( name: name, type: type, format: format, domain: @app.domain, params: params, parent: parent, engine: self )
208
- tpl.loaded? && !tpl.modified? ? tpl : tpl.load!.parse!
209
- }
226
+ tpl = Template.new(name: name, type: type, format: format, domain: @app.domain, params: params, parent: parent, engine: self)
227
+ tpl.load!.parse!
210
228
  end
211
229
  end
212
230
 
@@ -3,7 +3,7 @@
3
3
  module Tzispa
4
4
  module Rig
5
5
 
6
- VERSION = '0.2.6'
6
+ VERSION = '0.2.7'
7
7
  GEM_NAME = 'tzispa_rig'
8
8
 
9
9
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tzispa_rig
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.2.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Juan Antonio Piñero
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-27 00:00:00.000000000 Z
11
+ date: 2016-04-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tzispa_helpers
@@ -52,6 +52,7 @@ files:
52
52
  - lib/tzispa/rig/parameters.rb
53
53
  - lib/tzispa/rig/parser.rb
54
54
  - lib/tzispa/rig/parsernext.rb
55
+ - lib/tzispa/rig/syntax.rb
55
56
  - lib/tzispa/rig/template.rb
56
57
  - lib/tzispa/rig/version.rb
57
58
  - lib/tzispa_rig.rb