zena 1.2.1 → 1.2.2

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 (202) hide show
  1. data/History.txt +38 -1
  2. data/app/controllers/documents_controller.rb +7 -5
  3. data/app/controllers/nodes_controller.rb +47 -6
  4. data/app/controllers/user_sessions_controller.rb +12 -3
  5. data/app/controllers/virtual_classes_controller.rb +8 -2
  6. data/app/models/acl.rb +5 -2
  7. data/app/models/cached_page.rb +5 -5
  8. data/app/models/column.rb +27 -4
  9. data/app/models/group.rb +1 -1
  10. data/app/models/node.rb +106 -24
  11. data/app/models/note.rb +2 -1
  12. data/app/models/relation.rb +9 -4
  13. data/app/models/relation_proxy.rb +2 -2
  14. data/app/models/role.rb +12 -5
  15. data/app/models/site.rb +10 -9
  16. data/app/models/skin.rb +8 -0
  17. data/app/models/string_hash.rb +65 -0
  18. data/app/models/text_document.rb +1 -1
  19. data/app/models/user.rb +2 -0
  20. data/app/models/virtual_class.rb +43 -10
  21. data/app/views/comments/create.rjs +1 -32
  22. data/app/views/comments/edit.rjs +1 -1
  23. data/app/views/comments/update.rjs +1 -1
  24. data/app/views/documents/show.rhtml +1 -1
  25. data/app/views/groups/_form.rhtml +7 -0
  26. data/app/views/groups/_li.rhtml +1 -1
  27. data/app/views/nodes/500.html +2 -1
  28. data/app/views/nodes/destroy.rjs +2 -0
  29. data/app/views/sites/jobs.erb +2 -3
  30. data/app/views/templates/document_create_tabs/_file.rhtml +1 -1
  31. data/app/views/templates/document_create_tabs/_import.rhtml +4 -1
  32. data/app/views/templates/document_create_tabs/_template.rhtml +3 -0
  33. data/app/views/templates/document_create_tabs/_text_document.rhtml +3 -0
  34. data/app/views/versions/custom_tab.rhtml +1 -1
  35. data/app/views/versions/edit.rhtml +1 -1
  36. data/bricks/acls/lib/bricks/acls.rb +3 -3
  37. data/bricks/acls/zena/test/unit/acl_test.rb +15 -0
  38. data/bricks/fs_skin/lib/bricks/fs_skin.rb +190 -0
  39. data/bricks/fs_skin/zena/init.rb +1 -0
  40. data/bricks/fs_skin/zena/migrate/20110702010330_add_fs_skin_to_idx_templates.rb +12 -0
  41. data/bricks/{static → fs_skin}/zena/skins/blog/Image-edit.zafu +0 -0
  42. data/bricks/{static → fs_skin}/zena/skins/blog/Image.zafu +0 -0
  43. data/bricks/{static → fs_skin}/zena/skins/blog/Node-+index.zafu +0 -0
  44. data/bricks/{static → fs_skin}/zena/skins/blog/Node-+notFound.zafu +0 -0
  45. data/bricks/{static → fs_skin}/zena/skins/blog/Node-+search.zafu +0 -0
  46. data/bricks/{static → fs_skin}/zena/skins/blog/Node.zafu +1 -1
  47. data/bricks/{static → fs_skin}/zena/skins/blog/Post.zafu +0 -0
  48. data/bricks/{static → fs_skin}/zena/skins/blog/Project--kml.zafu +0 -0
  49. data/bricks/{static → fs_skin}/zena/skins/blog/Project.zafu +0 -0
  50. data/bricks/{static → fs_skin}/zena/skins/blog/comments.zafu +0 -0
  51. data/bricks/{static → fs_skin}/zena/skins/blog/dict.yml +0 -0
  52. data/bricks/{static → fs_skin}/zena/skins/blog/img/dateBg.jpg +0 -0
  53. data/bricks/{static → fs_skin}/zena/skins/blog/img/header.png +0 -0
  54. data/bricks/{static → fs_skin}/zena/skins/blog/img/mapPin.png +0 -0
  55. data/bricks/{static → fs_skin}/zena/skins/blog/img/menu.gif +0 -0
  56. data/bricks/{static → fs_skin}/zena/skins/blog/img/menuover.gif +0 -0
  57. data/bricks/{static → fs_skin}/zena/skins/blog/img/style.css +0 -0
  58. data/bricks/fs_skin/zena/tasks.rb +26 -0
  59. data/bricks/{static/zena/test/integration/static_integration_test.rb → fs_skin/zena/test/integration/fs_skin_integration_test.rb} +6 -6
  60. data/bricks/fs_skin/zena/test/unit/fs_skin_test.rb +33 -0
  61. data/bricks/grid/lib/bricks/grid.rb +4 -3
  62. data/bricks/tags/lib/bricks/tags.rb +1 -7
  63. data/bricks/zena/zena/migrate/20120605091558_add_ssl_login_to_site.rb +7 -0
  64. data/bricks/zena/zena/migrate/20120630123551_add_auto_publish_to_group.rb +9 -0
  65. data/config/bricks.yml +3 -3
  66. data/config/gems.yml +2 -3
  67. data/lib/tasks/zena.rake +7 -3
  68. data/lib/zafu.rb +7 -0
  69. data/lib/zafu/all.rb +21 -0
  70. data/lib/zafu/compiler.rb +7 -0
  71. data/lib/zafu/controller_methods.rb +58 -0
  72. data/lib/zafu/handler.rb +57 -0
  73. data/lib/zafu/info.rb +4 -0
  74. data/lib/zafu/markup.rb +309 -0
  75. data/lib/zafu/mock_helper.rb +42 -0
  76. data/lib/zafu/node_context.rb +203 -0
  77. data/lib/zafu/ordered_hash.rb +53 -0
  78. data/lib/zafu/parser.rb +676 -0
  79. data/lib/zafu/parsing_rules.rb +382 -0
  80. data/lib/zafu/process/ajax.rb +530 -0
  81. data/lib/zafu/process/conditional.rb +92 -0
  82. data/lib/zafu/process/context.rb +186 -0
  83. data/lib/zafu/process/forms.rb +143 -0
  84. data/lib/zafu/process/html.rb +186 -0
  85. data/lib/zafu/process/ruby_less_processing.rb +321 -0
  86. data/lib/zafu/security.rb +15 -0
  87. data/lib/zafu/template.rb +25 -0
  88. data/lib/zafu/test_helper.rb +19 -0
  89. data/lib/zafu/view_methods.rb +6 -0
  90. data/lib/zena.rb +1 -1
  91. data/lib/zena/acts/enrollable.rb +1 -1
  92. data/lib/zena/app.rb +4 -17
  93. data/lib/zena/console.rb +18 -1
  94. data/lib/zena/core_ext/file_utils.rb +13 -1
  95. data/lib/zena/core_ext/fixnum.rb +4 -0
  96. data/lib/zena/core_ext/float.rb +7 -0
  97. data/lib/zena/deploy.rb +4 -2
  98. data/lib/zena/deploy/app_init.rhtml +2 -1
  99. data/lib/zena/deploy/database.rhtml +1 -1
  100. data/lib/zena/info.rb +1 -1
  101. data/lib/zena/parser/zazen_rules.rb +4 -4
  102. data/lib/zena/routes.rb +1 -1
  103. data/lib/zena/test_controller.rb +1 -1
  104. data/lib/zena/use.rb +14 -1
  105. data/lib/zena/use/action.rb +4 -2
  106. data/lib/zena/use/ajax.rb +86 -38
  107. data/lib/zena/use/authlogic.rb +16 -1
  108. data/lib/zena/use/calendar.rb +37 -17
  109. data/lib/zena/use/conditional.rb +2 -2
  110. data/lib/zena/use/context.rb +30 -9
  111. data/lib/zena/use/dates.rb +39 -3
  112. data/lib/zena/use/display.rb +6 -19
  113. data/lib/zena/use/forms.rb +100 -79
  114. data/lib/zena/use/i18n.rb +40 -16
  115. data/lib/zena/use/query_builder.rb +0 -6
  116. data/lib/zena/use/query_node.rb +17 -4
  117. data/lib/zena/use/relations.rb +1 -3
  118. data/lib/zena/use/rendering.rb +10 -8
  119. data/lib/zena/use/scope_index.rb +5 -1
  120. data/lib/zena/use/search.rb +2 -1
  121. data/lib/zena/use/urls.rb +82 -77
  122. data/lib/zena/use/workflow.rb +12 -4
  123. data/lib/zena/use/zafu_safe_definitions.rb +37 -9
  124. data/lib/zena/use/zafu_templates.rb +49 -20
  125. data/lib/zena/use/zazen.rb +6 -2
  126. data/locale/it/LC_MESSAGES/zena.mo +0 -0
  127. data/locale/it/zena.mo +0 -0
  128. data/locale/it/zena.po +1982 -0
  129. data/public/images/arrow_back.png +0 -0
  130. data/public/images/remove_tag.png +0 -0
  131. data/public/javascripts/grid.js +800 -199
  132. data/public/javascripts/window.js +1 -1
  133. data/public/javascripts/zena.js +130 -21
  134. data/public/stylesheets/grid.css +11 -2
  135. data/public/stylesheets/zena.css +2 -1
  136. data/test/custom_queries/complex.host.yml +5 -0
  137. data/test/fixtures/files/TestNode.zafu +36 -0
  138. data/test/functional/nodes_controller_test.rb +18 -1
  139. data/test/integration/zafu_compiler/action.yml +2 -2
  140. data/test/integration/zafu_compiler/ajax.yml +44 -26
  141. data/test/integration/zafu_compiler/asset.yml +12 -2
  142. data/test/integration/zafu_compiler/basic.yml +0 -16
  143. data/test/integration/zafu_compiler/calendar.yml +6 -6
  144. data/test/integration/zafu_compiler/complex_ok.yml +23 -1
  145. data/test/integration/zafu_compiler/conditional.yml +5 -5
  146. data/test/integration/zafu_compiler/context.yml +6 -5
  147. data/test/integration/zafu_compiler/dates.yml +23 -2
  148. data/test/integration/zafu_compiler/display.yml +46 -2
  149. data/test/integration/zafu_compiler/errors.yml +2 -2
  150. data/test/integration/zafu_compiler/eval.yml +35 -7
  151. data/test/integration/zafu_compiler/forms.yml +47 -13
  152. data/test/integration/zafu_compiler/i18n.yml +2 -2
  153. data/test/integration/zafu_compiler/meta.yml +35 -1
  154. data/test/integration/zafu_compiler/query.yml +23 -4
  155. data/test/integration/zafu_compiler/relations.yml +10 -6
  156. data/test/integration/zafu_compiler/roles.yml +4 -4
  157. data/test/integration/zafu_compiler/rubyless.yml +11 -1
  158. data/test/integration/zafu_compiler/safe_definitions.yml +23 -5
  159. data/test/integration/zafu_compiler/security.yml +10 -6
  160. data/test/integration/zafu_compiler/urls.yml +23 -6
  161. data/test/integration/zafu_compiler/zafu_attributes.yml +1 -1
  162. data/test/integration/zafu_compiler/zazen.yml +14 -0
  163. data/test/selenium/Add/add3.rsel +8 -8
  164. data/test/selenium/Destroy/0setup.rsel +12 -0
  165. data/test/selenium/Destroy/destroy1.rsel +16 -0
  166. data/test/selenium/Edit/edit2.rsel +9 -9
  167. data/test/selenium/Edit/edit5.rsel +9 -9
  168. data/test/selenium/Edit/edit6.rsel +9 -9
  169. data/test/selenium/Form/form4.rsel +17 -0
  170. data/test/selenium/Toggle/toggle1.rsel +2 -0
  171. data/test/selenium/Toggle/toggle2.rsel +18 -0
  172. data/test/sites/zena/columns.yml +3 -0
  173. data/test/sites/zena/versions.yml +7 -0
  174. data/test/unit/cached_page_test.rb +13 -13
  175. data/test/unit/column_test.rb +26 -0
  176. data/test/unit/node_test.rb +16 -1
  177. data/test/unit/project_test.rb +6 -1
  178. data/test/unit/relation_test.rb +1 -1
  179. data/test/unit/role_test.rb +1 -1
  180. data/test/unit/string_hash_test.rb +30 -0
  181. data/test/unit/virtual_class_test.rb +31 -17
  182. data/test/unit/zafu_markup_test.rb +414 -0
  183. data/test/unit/zafu_node_context_test.rb +375 -0
  184. data/test/unit/zafu_ordered_hash_test.rb +69 -0
  185. data/test/unit/zena/acts/enrollable_test.rb +1 -1
  186. data/test/unit/zena/parser/zafu_asset.yml +0 -10
  187. data/test/unit/zena/parser/zazen.yml +1 -1
  188. data/test/unit/zena/parser_test.rb +1 -72
  189. data/test/unit/zena/use/dates_test.rb +1 -1
  190. data/test/unit/zena/use/rendering_test.rb +24 -7
  191. data/test/unit/zena/use/scope_index_test.rb +17 -0
  192. data/test/unit/zena/use/zazen_test.rb +2 -1
  193. data/zena.gemspec +71 -37
  194. metadata +104 -83
  195. data/app/views/nodes/destroy.erb +0 -0
  196. data/bricks/static/lib/bricks/static.rb +0 -151
  197. data/bricks/static/zena/init.rb +0 -1
  198. data/bricks/static/zena/migrate/20110702010330_add_static_to_idx_templates.rb +0 -12
  199. data/bricks/static/zena/test/unit/static_test.rb +0 -33
  200. data/lib/zena/parser/zafu_rules.rb +0 -244
  201. data/lib/zena/parser/zafu_tags.rb +0 -198
  202. data/lib/zena/parser/zena_rules.rb +0 -23
File without changes
@@ -1,151 +0,0 @@
1
- module Bricks
2
- module Static
3
- ELEM = "([a-zA-Z_]+)"
4
- ELEM_REGEXP = %r{^#{ELEM}$}
5
- SECURE_PATH_REGEXP = %r{^[a-zA-Z_/]+$}
6
- STATIC_SKIN_REGEXP = %r{^#{ELEM}-#{ELEM}$}
7
- ZAFU_URL_REGEXP = %r{^\$#{ELEM}-#{ELEM}/(.+)$}
8
- BRICK_NAME_REGEXP = %r{^#{RAILS_ROOT}/bricks/#{ELEM}/zena/skins$}
9
-
10
- module ControllerMethods
11
- def self.included(base)
12
- base.alias_method_chain :get_template_text, :static
13
- base.alias_method_chain :template_url_for_asset, :static
14
- base.alias_method_chain :get_best_template, :static
15
- end
16
-
17
- def get_template_text_with_static(path, section_id = nil)
18
- if path =~ ZAFU_URL_REGEXP
19
- brick_name, skin_name, path = $1, $2, $3
20
- text_from_static(brick_name, skin_name, path)
21
- elsif section_id.nil? && @static_brick_name && @static_skin_name
22
- text_from_static(@static_brick_name, @static_skin_name, path)
23
- else
24
- get_template_text_without_static(path, section_id)
25
- end
26
- end
27
-
28
- def template_url_for_asset_with_static(opts)
29
- # TODO
30
- template_url_for_asset_without_static(opts)
31
- end
32
-
33
- def get_best_template_with_static(kpaths, format, mode, skin)
34
- return get_best_template_without_static(kpaths, format, mode, skin) unless static = skin.z_static
35
- if idx_template = IdxTemplate.first(
36
- :conditions => ["tkpath IN (?) AND format = ? AND mode #{mode ? '=' : 'IS'} ? AND (skin_id = ? OR static = ?) AND site_id = ?",
37
- kpaths, format, mode, skin.id, static, skin.site_id],
38
- :order => "length(tkpath) DESC, skin_id DESC"
39
- )
40
- if idx_template.path.nil?
41
- template = secure(Template) { Template.find(idx_template.node_id) }
42
- get_best_template_without_static(kpaths, format, mode, skin, template)
43
- elsif static =~ STATIC_SKIN_REGEXP
44
- @static_brick_name, @static_skin_name = $1, $2
45
- if idx_template.path =~ SECURE_PATH_REGEXP
46
- zafu_url = "$#{@static_brick_name}-#{@static_skin_name}/#{idx_template.path}"
47
- template = Template.new
48
- template.tkpath = idx_template.tkpath
49
- [zafu_url, template]
50
- end
51
- end
52
- end
53
- end
54
-
55
- # TODO
56
- # Asset resolution: route = /static/static-blog/img/style.css
57
- # ===> static brick ==> brick path
58
- # ===> blog/img/style.css ==> brick path/zena/skins/ blog/img/style.css
59
- # Cache in public directory
60
- # FIXME: clear_cache should erase /home/static
61
-
62
- private
63
- def text_from_static(brick_name, skin_name, path)
64
- if path =~ SECURE_PATH_REGEXP
65
- abs_path = File.join(
66
- RAILS_ROOT, 'bricks', brick_name,
67
- 'zena', 'skins', skin_name, path + '.zafu')
68
- File.exist?(abs_path) ? File.read(abs_path) : nil
69
- end
70
- end
71
- end # ControllerMethods
72
-
73
- module SkinMethods
74
- def self.included(base)
75
- base.property do |p|
76
- p.string 'z_static'
77
- end
78
-
79
- base.validate :validate_z_static
80
- end
81
-
82
- private
83
- def validate_z_static
84
- if !(z_static.nil? || z_static =~ STATIC_SKIN_REGEXP)
85
- errors.add(:z_static, _('invalid'))
86
- end
87
- true
88
- end
89
- end # SkinMethods
90
-
91
- module SiteMethods
92
- def self.included(base)
93
- base.alias_method_chain :rebuild_index, :static
94
- end
95
-
96
- def rebuild_index_with_static(nodes = nil, page = nil, page_count = nil) if !page
97
- Zena::SiteWorker.perform(self, :rebuild_static_index, nil)
98
- end
99
- rebuild_index_without_static(nodes, page, page_count)
100
- end
101
-
102
- def rebuild_static_index
103
- Zena::Db.execute "DELETE FROM idx_templates WHERE node_id IS NULL AND site_id = #{id}"
104
- Bricks.paths_for('zena/skins').each do |p|
105
- if p =~ BRICK_NAME_REGEXP
106
- brick_name = $1
107
- list = []
108
- Dir.foreach(p) do |skin_name|
109
- if skin_name =~ ELEM_REGEXP
110
- build_static_index(brick_name, skin_name, "#{p}/#{skin_name}")
111
- end
112
- end
113
- end
114
- end
115
- end
116
-
117
- private
118
- def build_static_index(brick_name, skin_name, path)
119
- # path = absolute path
120
- # 1. Find all templates
121
- Dir.foreach(path) do |elem|
122
- next if elem =~ /^\./
123
- elem_path = File.join(path, elem)
124
- if File.directory?(elem_path)
125
- build_static_index(brick_name, skin_name, elem_path)
126
- elsif elem =~ Template::MODE_FORMAT_FROM_TITLE
127
- # 2. Get klass, mode, format
128
- klass = $1
129
- mode = $4.blank? ? nil : $4
130
- format = $6 || 'html'
131
- idx_path = elem_path[%r{^#{RAILS_ROOT}/bricks/#{brick_name}/zena/skins/#{skin_name}/(.+)\.zafu$}, 1]
132
- # 3. Get kpath
133
- if idx_path && vclass = VirtualClass[klass]
134
- tkpath = vclass.kpath
135
-
136
- # 4. insert idx_template entry (kpath, site_id, mode, format, path relative to bricks/brick/zena/skins/skin_name)
137
- IdxTemplate.create(
138
- :tkpath => tkpath,
139
- :mode => mode,
140
- :format => format,
141
- :site_id => id,
142
- :static => "#{brick_name}-#{skin_name}",
143
- :path => idx_path
144
- )
145
- end
146
- end
147
- end
148
- end
149
- end # SiteMethods
150
- end # Static
151
- end # Bricks
@@ -1 +0,0 @@
1
- Zena.use Bricks::Static
@@ -1,12 +0,0 @@
1
- class AddStaticToIdxTemplates < ActiveRecord::Migration
2
- def self.up
3
- add_column :idx_templates, :static, :string, :limit => 30
4
- add_column :idx_templates, :path, :string, :limit => 300
5
- add_index :idx_templates, [:static], :name => "index_idx_templates_on_static"
6
- end
7
-
8
- def self.down
9
- remove_index :idx_templates, :name => "index_idx_templates_on_static"
10
- remove_column :idx_templates, :static
11
- end
12
- end
@@ -1,33 +0,0 @@
1
- require File.dirname(__FILE__) + '/../../../../../test/test_helper'
2
-
3
- class StaticTest < Zena::Unit::TestCase
4
-
5
- context 'A Skin' do
6
- setup do
7
- login(:lion)
8
- end
9
-
10
- subject do
11
- secure(Node) { nodes(:wikiSkin) }
12
- end
13
-
14
- should 'have z_static prop' do
15
- subject.z_static = 'foo'
16
- assert_equal 'foo', subject.prop['z_static']
17
- end
18
-
19
- should 'allow brick-skin values' do
20
- assert subject.update_attributes(:z_static => 'static-blog')
21
- end
22
-
23
- should 'allow nil values' do
24
- assert subject.update_attributes(:z_static => 'static-blog')
25
- assert subject.update_attributes(:z_static => nil)
26
- end
27
-
28
- should 'not allow any value' do
29
- assert !subject.update_attributes(:z_static => '../foo-/bar/..')
30
- assert_equal 'invalid', subject.errors[:z_static]
31
- end
32
- end # A Skin
33
- end
@@ -1,244 +0,0 @@
1
- =begin
2
- FIXME: remove if tests pass.
3
- =end
4
- module Zena
5
- module Parser
6
-
7
- module ZafuRules
8
- attr_reader :context
9
- # This callback is run just after the block is initialized (Parser#initialize).
10
- def start(mode)
11
- # html_tag
12
- @html_tag = @options.delete(:html_tag)
13
- @html_tag_params = parse_params(@options.delete(:html_tag_params))
14
-
15
- # end_tag
16
- @end_tag = @html_tag || @options.delete(:end_do) || @options.delete(:end_tag) || "r:#{@method}"
17
- @end_tag_count = 1
18
-
19
- # code indentation
20
- @space_before = @options[:space_before]
21
- @options.delete(:space_before)
22
-
23
- # form capture (input, select, textarea, form)
24
- @options[:form] ||= true if @method == 'form'
25
-
26
- # puts "[#{@space_before}(#{@method})#{@space_after}]"
27
- if @params =~ /\A([^>]*?)do\s*=('|")([^\2]*?[^\\])\2([^>]*)\Z/
28
- #puts $~.to_a.inspect
29
- # we have a sub 'do'
30
- @params = parse_params($1)
31
- @sub_do = $3 # this is used by replace_with
32
-
33
- opts = {:method=>$3, :params=>$4}
34
-
35
- # the matching zafu tag will be parsed by the last 'do', we must inform it to halt properly :
36
- opts[:end_do] = @end_tag
37
-
38
- sub = make(:void, opts)
39
- @space_after = sub.instance_variable_get(:@space_after)
40
- sub.instance_variable_set(:@space_after,"")
41
- else
42
- @params = parse_params(@params)
43
- end
44
-
45
- # set name used for include/replace from html_tag if not allready set by superclass
46
- @name = @options[:name] || @params[:name] || @params[:id] || @html_tag_params[:id]
47
-
48
- if !@html_tag && (@html_tag = @params.delete(:tag))
49
- # get html tag parameters from @params
50
- @html_tag_params = {}
51
- [:class, :id].each do |k|
52
- next unless @params[k]
53
- @html_tag_params[k] = @params.delete(k)
54
- end
55
- end
56
-
57
- if @method == 'include'
58
- include_template
59
- elsif mode == :tag && !sub
60
- scan_tag
61
- elsif !sub
62
- enter(mode)
63
- end
64
- end
65
-
66
- # Dummy method. We only insert the error here so that 'r_include' can be overwriten
67
- # to enable recursion.
68
- def r_include
69
- parser_error("missing 'template' attribute", 'include')
70
- end
71
-
72
-
73
- def before_parse(text)
74
- text.gsub('<%', '&lt;%').gsub('%>', '%&gt;')
75
- end
76
-
77
- # scan rules
78
- def scan
79
- # puts "SCAN(#{@method}): [#{@text}]"
80
- if @text =~ /\A([^<]*?)(^ *|)</m
81
- flush $1
82
- eat $2
83
- if @text[1..1] == '/'
84
- store $2
85
- scan_close_tag
86
- elsif @text[0..3] == '<!--'
87
- scan_html_comment(:space_before=> $2)
88
- elsif @text[0..8] == '<![CDATA['
89
- flush '<![CDATA['
90
- else
91
- scan_tag(:space_before=> $2)
92
- end
93
- else
94
- # no more tags
95
- flush
96
- end
97
- end
98
-
99
- def scan_close_tag
100
- if @text =~ /\A<\/([^>]+)>( *\n+|)/m
101
- # puts "CLOSE:[#{$&}]}" # ztag
102
- # closing tag
103
- if $1 == @end_tag
104
- @end_tag_count -= 1
105
- if @end_tag_count == 0
106
- if @end_tag == 'script'
107
- flush $& # keep closing tag
108
- else
109
- eat $&
110
- end
111
- @space_after = $2
112
- leave
113
- else
114
- # keep the tag (false alert)
115
- flush $&
116
- end
117
- elsif $1[0..1] == 'r:'
118
- # /rtag
119
- eat $&
120
- if $1 != @end_tag
121
- # error bad closing rtag
122
- store "<span class='parser_error'>#{$&.gsub('<', '&lt;').gsub('>','&gt;')} should be &lt;/#{@end_tag}&gt;</span>"
123
- end
124
- leave
125
- else
126
- # other html tag closing
127
- flush $&
128
- end
129
- else
130
- # error
131
- flush
132
- end
133
- end
134
-
135
- def scan_html_comment(opts={})
136
- if @text =~ /\A<!--\|(.*?)-->/m
137
- # zafu html escaped
138
- eat $&
139
- @text = opts[:space_before] + $1 + @text
140
- elsif @text =~ /\A<!--.*?-->/m
141
- # html comment
142
- flush $&
143
- else
144
- # error
145
- flush
146
- end
147
- end
148
-
149
- def scan_tag(opts={})
150
- # puts "TAG(#{@method}): [#{@text}]"
151
- if @text =~ /\A<r:([\w_]+)([^>]*?)(\/?)>/
152
- # puts "RTAG:#{$~.to_a.inspect}" # ztag
153
- eat $&
154
- opts.merge!(:method=>$1, :params=>$2)
155
- opts.merge!(:text=>'') if $3 != ''
156
- make(:void, opts)
157
- #elsif @text =~ /\A<(\w+)([^>]*?)do\s*=('([^>]*?[^\\]|)'|"([^>]*?[^\\]|)")([^>]*?)(\/?)>/
158
- elsif @text =~ /\A<(\w+)([^>]*?)do\s*=('|")([^\3]*?[^\\])\3([^>]*?)(\/?)>/
159
- #puts "DO:#{$~.to_a.inspect}" # do tag
160
- eat $&
161
- opts.merge!(:method=> $4, :html_tag=>$1, :html_tag_params=>$2, :params=>$5)
162
- opts.merge!(:text=>'') if $6 != ''
163
- make(:void, opts)
164
- elsif @options[:form] && @text =~ /\A<(input|select|textarea|form)([^>]*?)(\/?)>/
165
- eat $&
166
- method = $1 == 'form' ? 'form_tag' : $1 # <form> ==> r_form_tag, <r:form> ==> r_form
167
- opts.merge!(:method=>method, :params=>$2)
168
- opts.merge!(:text=>'') if $3 != ''
169
- opts.merge!(:end_tag=>'form') if method == 'form_tag'
170
- make(:void, opts)
171
- elsif @text =~ /\A<(\w+)([^>]*?)id\s*=('[^>]*?[^\\]'|"[^>]*?[^\\]")([^>]*?)(\/?)>/
172
- #puts "ID:#{$~.to_a.inspect}" # id tag
173
- eat $&
174
- opts.merge!(:method=>'void', :html_tag=>$1, :params=>{:id => $3[1..-2]}, :html_tag_params=>"#{$2}id=#{$3}#{$4}")
175
- opts.merge!(:text=>'') if $5 != ''
176
- make(:void, opts)
177
- elsif @end_tag && @text =~ /\A<#{@end_tag}([^>]*?)(\/?)>/
178
- #puts "SAME:#{$~.to_a.inspect}" # simple html tag same as end_tag
179
- flush $&
180
- @end_tag_count += 1 unless $2 == '/'
181
- elsif @text =~ /\A<(link|img|script)/
182
- #puts "HTML:[#{$&}]" # html
183
- make(:asset)
184
- elsif @text =~ /\A<style>/
185
- flush $&
186
- make(:style)
187
- elsif @text =~ /\A[^>]*?>/
188
- # html tag
189
- #puts "OTHER:[#{$&}]"
190
- store opts[:space_before]
191
- flush $&
192
- else
193
- # never closed tag
194
- flush
195
- end
196
- end
197
-
198
- def scan_asset
199
- # puts "ASSET(#{object_id}) [#{@text}]"
200
- if @text =~ /\A<(\w*)([^>]*?)(\/?)>/
201
- eat $&
202
- @method = 'rename_asset'
203
- @html_tag = @end_tag = $1
204
- closed = ($3 != '')
205
- @params = parse_params($2)
206
- if closed
207
- leave(:asset)
208
- elsif @html_tag == 'script'
209
- enter(:void)
210
- else
211
- enter(:inside_asset)
212
- end
213
- else
214
- # error
215
- @method = 'void'
216
- flush
217
- end
218
- end
219
-
220
- def scan_inside_asset
221
- if @text =~ /\A(.*?)<\/#{@end_tag}>/m
222
- flush $&
223
- leave(:asset)
224
- else
225
- # never ending asset
226
- flush
227
- end
228
- end
229
-
230
- def scan_style
231
- if @text =~ /\A(.*?)<\/style>/m
232
- flush $&
233
- @method = 'rename_asset'
234
- @html_tag = 'style'
235
- leave(:style)
236
- else
237
- # error
238
- @method = 'void'
239
- flush
240
- end
241
- end
242
- end # ZafuRules
243
- end # Parser
244
- end # Zena
@@ -1,198 +0,0 @@
1
- # This should be removed (it is used by zazen but I do not know why)
2
- module Zena
3
- module Parser
4
- module ZafuTags
5
- attr_accessor :html_tag, :html_tag_params, :name, :sub_do
6
-
7
- # Replace the 'original' element in the included template with our new version.
8
- def replace_with(new_obj)
9
- super
10
- html_tag_params = new_obj.html_tag_params
11
- [:class, :id].each do |sym|
12
- html_tag_params[sym] = new_obj.params[sym] if new_obj.params.include?(sym)
13
- end
14
- @html_tag = new_obj.html_tag || @html_tag
15
- @html_tag_params.merge!(html_tag_params)
16
- if new_obj.params[:method]
17
- @method = new_obj.params[:method] if new_obj.params[:method]
18
- elsif new_obj.sub_do
19
- @method = 'void'
20
- end
21
- end
22
-
23
- # Pass the caller's 'html_tag' and 'html_tag_params' to the included part.
24
- def include_part(obj)
25
- obj.html_tag = @html_tag || obj.html_tag
26
- obj.html_tag_params = !@html_tag_params.empty? ? @html_tag_params : obj.html_tag_params
27
- @html_tag = nil
28
- @html_tag_params = {}
29
- super(obj)
30
- end
31
-
32
- def empty?
33
- super && @html_tag_params == {} && @html_tag.nil?
34
- end
35
-
36
- def before_render
37
- return unless super
38
- @html_tag_done = false
39
- unless @html_tag
40
- if @html_tag = @params.delete(:tag)
41
- @html_tag_params = {}
42
- [:id, :class].each do |k|
43
- next unless @params[k]
44
- @html_tag_params[k] = @params.delete(k)
45
- end
46
- end
47
- end
48
- # [each] is run many times with different roles. Some of these change html_tag_params.
49
- @html_tag_params_bak = @html_tag_params.dup
50
- true
51
- end
52
-
53
- def after_render(text)
54
- res = render_html_tag(super)
55
- @html_tag_params = @html_tag_params_bak
56
- res
57
- end
58
-
59
- def inspect
60
- @html_tag_done = false
61
- res = super
62
- if @html_tag
63
- if res =~ /\A\[(\w+)(.*)\/\]\Z/m
64
- res = "[#{$1}#{$2}]<#{@html_tag}/>[/#{$1}]"
65
- elsif res =~ /\A\[([^\]]+)\](.*)\[\/(\w+)\]\Z/m
66
- res = "[#{$1}]#{render_html_tag($2)}[/#{$3}]"
67
- end
68
- end
69
- res
70
- end
71
-
72
- def params_to_html(params)
73
- para = []
74
- params.each do |k,v|
75
- if v.kind_of?(Array)
76
- # Array is used to indicate that the code is already escaped.
77
- para << " #{k}=#{v}"
78
- elsif !v.to_s.include?("'")
79
- para << " #{k}='#{v}'"
80
- else
81
- para << " #{k}=\"#{v.to_s.gsub('"','\"')}\"" # TODO: do this work in all cases ?
82
- end
83
- end
84
- # puts para.inspect
85
- para.sort.join('')
86
- end
87
-
88
- def render_html_tag(text,*append)
89
- append ||= []
90
- return text if @html_tag_done
91
- if @html_tag
92
- if text.blank? && ['meta','input'].include?(@html_tag)
93
- res = "<#{@html_tag}#{params_to_html(@html_tag_params || {})}#{append.join('')}/>"
94
- else
95
- res = "<#{@html_tag}#{params_to_html(@html_tag_params || {})}#{append.join('')}>#{text}</#{@html_tag}>"
96
- end
97
- else
98
- res = text
99
- end
100
- @html_tag_done = true
101
- return res if @context && @context[:only] && !@context[:only].include?(:string)
102
- (@space_before || '') + res + (@space_after || '')
103
- end
104
-
105
- def r_ignore
106
- @html_tag_done = true
107
- ''
108
- end
109
-
110
- alias r_ r_ignore
111
-
112
- def r_rename_asset
113
- return expand_with unless @html_tag
114
- case @html_tag
115
- when 'link'
116
- key = :href
117
- if @params[:rel].downcase == 'stylesheet'
118
- type = :stylesheet
119
- else
120
- type = :link
121
- end
122
- when 'style'
123
- @html_tag_done = true
124
- return expand_with.gsub(/url\(('|")(.*?)\1\)/) do
125
- if $2[0..6] == 'http://'
126
- $&
127
- else
128
- quote = $1
129
- new_src = @options[:helper].send(:template_url_for_asset, :base_path => @options[:base_path], :src => $2)
130
- "url(#{quote}#{new_src}#{quote})"
131
- end
132
- end
133
- else
134
- key = :src
135
- type = @html_tag.to_sym
136
- end
137
-
138
- src = @params[key]
139
- if src && src[0..0] != '/' && src[0..6] != 'http://'
140
- @params[key] = @options[:helper].send(:template_url_for_asset, :src => src, :base_path => @options[:base_path], :type => type) || @params[key]
141
- end
142
-
143
- res = "<#{@html_tag}#{params_to_html(@params)}"
144
- @html_tag_done = true
145
- inner = expand_with
146
- if inner == ''
147
- res + "/>"
148
- else
149
- res + ">#{inner}"
150
- end
151
- end
152
-
153
- def r_form
154
- res = "<#{@html_tag}#{params_to_html(@params)}"
155
- @html_tag_done = true
156
- inner = expand_with
157
- if inner == ''
158
- res + "/>"
159
- else
160
- res + ">#{inner}"
161
- end
162
- end
163
-
164
- def r_select
165
- res = "<#{@html_tag}#{params_to_html(@params)}"
166
- @html_tag_done = true
167
- inner = expand_with
168
- if inner == ''
169
- res + "></#{@html_tag}>"
170
- else
171
- res + ">#{inner}"
172
- end
173
- end
174
-
175
- def r_input
176
- res = "<#{@html_tag}#{params_to_html(@params)}"
177
- @html_tag_done = true
178
- inner = expand_with
179
- if inner == ''
180
- res + "/>"
181
- else
182
- res + ">#{inner}"
183
- end
184
- end
185
-
186
- def r_textarea
187
- res = "<#{@html_tag}#{params_to_html(@params)}"
188
- @html_tag_done = true
189
- inner = expand_with
190
- if inner == ''
191
- res + "/>"
192
- else
193
- res + ">#{inner}"
194
- end
195
- end
196
- end # ZafuTags
197
- end # Parser
198
- end # Zena