zena 1.2.1 → 1.2.2

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