zena 1.2.1 → 1.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +38 -1
- data/app/controllers/documents_controller.rb +7 -5
- data/app/controllers/nodes_controller.rb +47 -6
- data/app/controllers/user_sessions_controller.rb +12 -3
- data/app/controllers/virtual_classes_controller.rb +8 -2
- data/app/models/acl.rb +5 -2
- data/app/models/cached_page.rb +5 -5
- data/app/models/column.rb +27 -4
- data/app/models/group.rb +1 -1
- data/app/models/node.rb +106 -24
- data/app/models/note.rb +2 -1
- data/app/models/relation.rb +9 -4
- data/app/models/relation_proxy.rb +2 -2
- data/app/models/role.rb +12 -5
- data/app/models/site.rb +10 -9
- data/app/models/skin.rb +8 -0
- data/app/models/string_hash.rb +65 -0
- data/app/models/text_document.rb +1 -1
- data/app/models/user.rb +2 -0
- data/app/models/virtual_class.rb +43 -10
- data/app/views/comments/create.rjs +1 -32
- data/app/views/comments/edit.rjs +1 -1
- data/app/views/comments/update.rjs +1 -1
- data/app/views/documents/show.rhtml +1 -1
- data/app/views/groups/_form.rhtml +7 -0
- data/app/views/groups/_li.rhtml +1 -1
- data/app/views/nodes/500.html +2 -1
- data/app/views/nodes/destroy.rjs +2 -0
- data/app/views/sites/jobs.erb +2 -3
- data/app/views/templates/document_create_tabs/_file.rhtml +1 -1
- data/app/views/templates/document_create_tabs/_import.rhtml +4 -1
- data/app/views/templates/document_create_tabs/_template.rhtml +3 -0
- data/app/views/templates/document_create_tabs/_text_document.rhtml +3 -0
- data/app/views/versions/custom_tab.rhtml +1 -1
- data/app/views/versions/edit.rhtml +1 -1
- data/bricks/acls/lib/bricks/acls.rb +3 -3
- data/bricks/acls/zena/test/unit/acl_test.rb +15 -0
- data/bricks/fs_skin/lib/bricks/fs_skin.rb +190 -0
- data/bricks/fs_skin/zena/init.rb +1 -0
- data/bricks/fs_skin/zena/migrate/20110702010330_add_fs_skin_to_idx_templates.rb +12 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/Image-edit.zafu +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/Image.zafu +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/Node-+index.zafu +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/Node-+notFound.zafu +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/Node-+search.zafu +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/Node.zafu +1 -1
- data/bricks/{static → fs_skin}/zena/skins/blog/Post.zafu +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/Project--kml.zafu +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/Project.zafu +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/comments.zafu +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/dict.yml +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/img/dateBg.jpg +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/img/header.png +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/img/mapPin.png +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/img/menu.gif +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/img/menuover.gif +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/img/style.css +0 -0
- data/bricks/fs_skin/zena/tasks.rb +26 -0
- data/bricks/{static/zena/test/integration/static_integration_test.rb → fs_skin/zena/test/integration/fs_skin_integration_test.rb} +6 -6
- data/bricks/fs_skin/zena/test/unit/fs_skin_test.rb +33 -0
- data/bricks/grid/lib/bricks/grid.rb +4 -3
- data/bricks/tags/lib/bricks/tags.rb +1 -7
- data/bricks/zena/zena/migrate/20120605091558_add_ssl_login_to_site.rb +7 -0
- data/bricks/zena/zena/migrate/20120630123551_add_auto_publish_to_group.rb +9 -0
- data/config/bricks.yml +3 -3
- data/config/gems.yml +2 -3
- data/lib/tasks/zena.rake +7 -3
- data/lib/zafu.rb +7 -0
- data/lib/zafu/all.rb +21 -0
- data/lib/zafu/compiler.rb +7 -0
- data/lib/zafu/controller_methods.rb +58 -0
- data/lib/zafu/handler.rb +57 -0
- data/lib/zafu/info.rb +4 -0
- data/lib/zafu/markup.rb +309 -0
- data/lib/zafu/mock_helper.rb +42 -0
- data/lib/zafu/node_context.rb +203 -0
- data/lib/zafu/ordered_hash.rb +53 -0
- data/lib/zafu/parser.rb +676 -0
- data/lib/zafu/parsing_rules.rb +382 -0
- data/lib/zafu/process/ajax.rb +530 -0
- data/lib/zafu/process/conditional.rb +92 -0
- data/lib/zafu/process/context.rb +186 -0
- data/lib/zafu/process/forms.rb +143 -0
- data/lib/zafu/process/html.rb +186 -0
- data/lib/zafu/process/ruby_less_processing.rb +321 -0
- data/lib/zafu/security.rb +15 -0
- data/lib/zafu/template.rb +25 -0
- data/lib/zafu/test_helper.rb +19 -0
- data/lib/zafu/view_methods.rb +6 -0
- data/lib/zena.rb +1 -1
- data/lib/zena/acts/enrollable.rb +1 -1
- data/lib/zena/app.rb +4 -17
- data/lib/zena/console.rb +18 -1
- data/lib/zena/core_ext/file_utils.rb +13 -1
- data/lib/zena/core_ext/fixnum.rb +4 -0
- data/lib/zena/core_ext/float.rb +7 -0
- data/lib/zena/deploy.rb +4 -2
- data/lib/zena/deploy/app_init.rhtml +2 -1
- data/lib/zena/deploy/database.rhtml +1 -1
- data/lib/zena/info.rb +1 -1
- data/lib/zena/parser/zazen_rules.rb +4 -4
- data/lib/zena/routes.rb +1 -1
- data/lib/zena/test_controller.rb +1 -1
- data/lib/zena/use.rb +14 -1
- data/lib/zena/use/action.rb +4 -2
- data/lib/zena/use/ajax.rb +86 -38
- data/lib/zena/use/authlogic.rb +16 -1
- data/lib/zena/use/calendar.rb +37 -17
- data/lib/zena/use/conditional.rb +2 -2
- data/lib/zena/use/context.rb +30 -9
- data/lib/zena/use/dates.rb +39 -3
- data/lib/zena/use/display.rb +6 -19
- data/lib/zena/use/forms.rb +100 -79
- data/lib/zena/use/i18n.rb +40 -16
- data/lib/zena/use/query_builder.rb +0 -6
- data/lib/zena/use/query_node.rb +17 -4
- data/lib/zena/use/relations.rb +1 -3
- data/lib/zena/use/rendering.rb +10 -8
- data/lib/zena/use/scope_index.rb +5 -1
- data/lib/zena/use/search.rb +2 -1
- data/lib/zena/use/urls.rb +82 -77
- data/lib/zena/use/workflow.rb +12 -4
- data/lib/zena/use/zafu_safe_definitions.rb +37 -9
- data/lib/zena/use/zafu_templates.rb +49 -20
- data/lib/zena/use/zazen.rb +6 -2
- data/locale/it/LC_MESSAGES/zena.mo +0 -0
- data/locale/it/zena.mo +0 -0
- data/locale/it/zena.po +1982 -0
- data/public/images/arrow_back.png +0 -0
- data/public/images/remove_tag.png +0 -0
- data/public/javascripts/grid.js +800 -199
- data/public/javascripts/window.js +1 -1
- data/public/javascripts/zena.js +130 -21
- data/public/stylesheets/grid.css +11 -2
- data/public/stylesheets/zena.css +2 -1
- data/test/custom_queries/complex.host.yml +5 -0
- data/test/fixtures/files/TestNode.zafu +36 -0
- data/test/functional/nodes_controller_test.rb +18 -1
- data/test/integration/zafu_compiler/action.yml +2 -2
- data/test/integration/zafu_compiler/ajax.yml +44 -26
- data/test/integration/zafu_compiler/asset.yml +12 -2
- data/test/integration/zafu_compiler/basic.yml +0 -16
- data/test/integration/zafu_compiler/calendar.yml +6 -6
- data/test/integration/zafu_compiler/complex_ok.yml +23 -1
- data/test/integration/zafu_compiler/conditional.yml +5 -5
- data/test/integration/zafu_compiler/context.yml +6 -5
- data/test/integration/zafu_compiler/dates.yml +23 -2
- data/test/integration/zafu_compiler/display.yml +46 -2
- data/test/integration/zafu_compiler/errors.yml +2 -2
- data/test/integration/zafu_compiler/eval.yml +35 -7
- data/test/integration/zafu_compiler/forms.yml +47 -13
- data/test/integration/zafu_compiler/i18n.yml +2 -2
- data/test/integration/zafu_compiler/meta.yml +35 -1
- data/test/integration/zafu_compiler/query.yml +23 -4
- data/test/integration/zafu_compiler/relations.yml +10 -6
- data/test/integration/zafu_compiler/roles.yml +4 -4
- data/test/integration/zafu_compiler/rubyless.yml +11 -1
- data/test/integration/zafu_compiler/safe_definitions.yml +23 -5
- data/test/integration/zafu_compiler/security.yml +10 -6
- data/test/integration/zafu_compiler/urls.yml +23 -6
- data/test/integration/zafu_compiler/zafu_attributes.yml +1 -1
- data/test/integration/zafu_compiler/zazen.yml +14 -0
- data/test/selenium/Add/add3.rsel +8 -8
- data/test/selenium/Destroy/0setup.rsel +12 -0
- data/test/selenium/Destroy/destroy1.rsel +16 -0
- data/test/selenium/Edit/edit2.rsel +9 -9
- data/test/selenium/Edit/edit5.rsel +9 -9
- data/test/selenium/Edit/edit6.rsel +9 -9
- data/test/selenium/Form/form4.rsel +17 -0
- data/test/selenium/Toggle/toggle1.rsel +2 -0
- data/test/selenium/Toggle/toggle2.rsel +18 -0
- data/test/sites/zena/columns.yml +3 -0
- data/test/sites/zena/versions.yml +7 -0
- data/test/unit/cached_page_test.rb +13 -13
- data/test/unit/column_test.rb +26 -0
- data/test/unit/node_test.rb +16 -1
- data/test/unit/project_test.rb +6 -1
- data/test/unit/relation_test.rb +1 -1
- data/test/unit/role_test.rb +1 -1
- data/test/unit/string_hash_test.rb +30 -0
- data/test/unit/virtual_class_test.rb +31 -17
- data/test/unit/zafu_markup_test.rb +414 -0
- data/test/unit/zafu_node_context_test.rb +375 -0
- data/test/unit/zafu_ordered_hash_test.rb +69 -0
- data/test/unit/zena/acts/enrollable_test.rb +1 -1
- data/test/unit/zena/parser/zafu_asset.yml +0 -10
- data/test/unit/zena/parser/zazen.yml +1 -1
- data/test/unit/zena/parser_test.rb +1 -72
- data/test/unit/zena/use/dates_test.rb +1 -1
- data/test/unit/zena/use/rendering_test.rb +24 -7
- data/test/unit/zena/use/scope_index_test.rb +17 -0
- data/test/unit/zena/use/zazen_test.rb +2 -1
- data/zena.gemspec +71 -37
- metadata +104 -83
- data/app/views/nodes/destroy.erb +0 -0
- data/bricks/static/lib/bricks/static.rb +0 -151
- data/bricks/static/zena/init.rb +0 -1
- data/bricks/static/zena/migrate/20110702010330_add_static_to_idx_templates.rb +0 -12
- data/bricks/static/zena/test/unit/static_test.rb +0 -33
- data/lib/zena/parser/zafu_rules.rb +0 -244
- data/lib/zena/parser/zafu_tags.rb +0 -198
- data/lib/zena/parser/zena_rules.rb +0 -23
data/app/views/nodes/destroy.erb
DELETED
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
|
data/bricks/static/zena/init.rb
DELETED
@@ -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('<%', '<%').gsub('%>', '%>')
|
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('<', '<').gsub('>','>')} should be </#{@end_tag}></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
|