zena 0.15.2 → 0.16.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +20 -0
- data/CREDITS +27 -0
- data/Capfile +3 -0
- data/DEVELOPERS +46 -0
- data/History.txt +15 -0
- data/MIT-LICENSE +19 -0
- data/Rakefile +44 -0
- data/TODO +24 -0
- data/TODO_ZENA_1_0 +23 -0
- data/app/controllers/application_controller.rb +3 -0
- data/app/controllers/documents_controller.rb +22 -56
- data/app/controllers/nodes_controller.rb +42 -27
- data/app/controllers/pings_controller.rb +19 -0
- data/app/controllers/relations_controller.rb +5 -1
- data/app/controllers/sites_controller.rb +1 -46
- data/app/controllers/user_sessions_controller.rb +47 -0
- data/app/controllers/users_controller.rb +1 -0
- data/app/controllers/versions_controller.rb +25 -7
- data/app/controllers/virtual_classes_controller.rb +1 -1
- data/app/helpers/application_helper.rb +1 -1
- data/app/models/comment.rb +2 -1
- data/app/models/contact_content.rb +2 -2
- data/app/models/data_entry.rb +5 -6
- data/app/models/document.rb +14 -10
- data/app/models/document_content.rb +4 -6
- data/app/models/iformat.rb +2 -2
- data/app/models/image_content.rb +6 -9
- data/app/models/node.rb +106 -164
- data/app/models/page.rb +0 -20
- data/app/models/site.rb +42 -12
- data/app/models/template.rb +3 -8
- data/app/models/template_content.rb +2 -0
- data/app/models/text_document.rb +13 -8
- data/app/models/user.rb +47 -100
- data/app/models/user_session.rb +4 -0
- data/app/models/version.rb +1 -1
- data/app/views/comments/create.rjs +3 -3
- data/app/views/comments/edit.rjs +1 -1
- data/app/views/comments/update.rjs +1 -1
- data/app/views/nodes/_import_results.rhtml +1 -1
- data/app/views/nodes/create.rjs +3 -3
- data/app/views/templates/document_create_tabs/_file.rhtml +1 -2
- data/app/views/templates/document_create_tabs/_import.rhtml +7 -2
- data/app/views/templates/edit_tabs/_document.rhtml +1 -3
- data/app/views/templates/edit_tabs/_image.rhtml +1 -3
- data/app/views/versions/_tr.rhtml +1 -1
- data/app/views/versions/edit.rhtml +2 -26
- data/bin/zena +6 -1
- data/bricks/delayed_job/README +18 -0
- data/bricks/delayed_job/migrate/20091104191643_create_delayed_jobs_table.rb +19 -0
- data/bricks/delayed_job/misc/init.rb +8 -0
- data/bricks/delayed_job/misc/tasks.rb +2 -0
- data/bricks/math/patch/application_helper.rb +1 -1
- data/bricks/sphinx/MIT-LICENSE +19 -0
- data/bricks/sphinx/README +19 -0
- data/bricks/sphinx/lib/use_sphinx.rb +78 -0
- data/bricks/sphinx/migrate/20091102171258_add_delta_for_sphinx.rb +9 -0
- data/bricks/sphinx/misc/deploy.rb +20 -0
- data/bricks/sphinx/misc/sphinx.yml +12 -0
- data/bricks/sphinx/misc/tasks.rb +21 -0
- data/bricks/sphinx/patch/node.rb +8 -0
- data/bricks/tags/lib/has_tags.rb +5 -3
- data/bricks/tags/test/zafu/tags.yml +13 -1
- data/config/bricks.yml +35 -0
- data/config/deploy.rb +8 -1
- data/config/environment.rb +1 -1
- data/config/environments/production.rb +1 -1
- data/config/gems.yml +28 -5
- data/config/sphinx.yml +12 -0
- data/db/init/base/skins/default/Node-+popupLayout.zafu +1 -16
- data/db/migrate/20091026161708_add_persistence_token.rb +13 -0
- data/db/migrate/20091101184952_add_session_table.rb +16 -0
- data/db/migrate/20091123175137_add_single_access_token.rb +9 -0
- data/db/migrate/20091124161608_rebuild_fullpath.rb +11 -0
- data/db/schema.rb +21 -8
- data/doc/README_FOR_APP +24 -0
- data/doc/fixtures.graffle +19568 -0
- data/doc/fixtures.pdf +0 -0
- data/doc/template/LICENSE +184 -0
- data/doc/template/README +37 -0
- data/doc/template/allison.css +283 -0
- data/doc/template/allison.js +307 -0
- data/doc/template/allison.rb +260 -0
- data/doc/template/cache/BODY +588 -0
- data/doc/template/cache/CLASS_INDEX +4 -0
- data/doc/template/cache/CLASS_PAGE +1 -0
- data/doc/template/cache/FILE_INDEX +4 -0
- data/doc/template/cache/FILE_PAGE +1 -0
- data/doc/template/cache/FONTS +1 -0
- data/doc/template/cache/FR_INDEX_BODY +1 -0
- data/doc/template/cache/IMGPATH +1 -0
- data/doc/template/cache/INDEX +1 -0
- data/doc/template/cache/JAVASCRIPT +307 -0
- data/doc/template/cache/METHOD_INDEX +4 -0
- data/doc/template/cache/METHOD_LIST +1 -0
- data/doc/template/cache/SRC_PAGE +1 -0
- data/doc/template/cache/STYLE +283 -0
- data/doc/template/cache/URL +1 -0
- data/doc/zafu_changes.yml +29 -0
- data/lib/base_additions.rb +1 -1
- data/lib/bricks.rb +9 -0
- data/lib/bricks/loader.rb +86 -0
- data/lib/bricks/requirements_validation.rb +71 -0
- data/lib/tasks/zena.rake +42 -4
- data/lib/zafu/action.rb +285 -0
- data/lib/zafu/ajax.rb +93 -0
- data/lib/zafu/attributes.rb +117 -0
- data/lib/zafu/calendar.rb +159 -0
- data/lib/zafu/context.rb +330 -0
- data/lib/zafu/core/html.rb +102 -0
- data/lib/zafu/core/move_to_parser.rb +167 -0
- data/lib/zafu/dates.rb +58 -0
- data/lib/zafu/display.rb +502 -0
- data/lib/zafu/eval.rb +66 -0
- data/lib/zafu/experimental.rb +66 -0
- data/lib/zafu/i18n.rb +64 -0
- data/lib/zafu/meta.rb +25 -0
- data/lib/zafu/refactor.rb +73 -0
- data/lib/zafu/support/context.rb +265 -0
- data/lib/zafu/support/dom.rb +145 -0
- data/lib/zafu/support/erb.rb +62 -0
- data/lib/zafu/support/flow.rb +401 -0
- data/lib/zafu/support/forms.rb +461 -0
- data/lib/zafu/support/links.rb +306 -0
- data/lib/zafu_parser.rb +26 -2
- data/lib/zena.rb +34 -15
- data/lib/zena/acts/multiversion.rb +2 -2
- data/lib/zena/acts/secure.rb +41 -30
- data/lib/zena/app.rb +7 -10
- data/lib/zena/controller/test_case.rb +12 -7
- data/lib/zena/crypto_provider/initial.rb +15 -0
- data/lib/zena/db.rb +6 -1
- data/lib/zena/deploy.rb +34 -6
- data/lib/zena/deploy/logrotate_app.rhtml +9 -0
- data/lib/zena/deploy/logrotate_host.rhtml +34 -0
- data/lib/zena/deploy/template.rb +1 -9
- data/lib/zena/foxy_parser.rb +1 -1
- data/lib/zena/info.rb +3 -1
- data/lib/zena/migrator.rb +1 -1
- data/lib/zena/parser.rb +12 -4
- data/lib/zena/parser/zazen_rules.rb +6 -6
- data/lib/zena/parser/zena_rules.rb +1 -7
- data/lib/zena/routes.rb +5 -5
- data/lib/zena/test_controller.rb +7 -2
- data/lib/zena/unit/test_case.rb +6 -8
- data/lib/zena/use/ajax.rb +10 -10
- data/lib/zena/use/authlogic.rb +93 -0
- data/lib/zena/use/dyn_attributes.rb +5 -0
- data/lib/zena/use/html_tags.rb +16 -34
- data/lib/zena/use/i18n.rb +4 -1
- data/lib/zena/use/node_query_finders.rb +8 -4
- data/lib/zena/use/refactor.rb +8 -20
- data/lib/zena/use/relations.rb +1 -0
- data/lib/zena/use/rendering.rb +4 -2
- data/lib/zena/use/search.rb +52 -0
- data/lib/zena/use/test_helper.rb +27 -28
- data/lib/zena/use/upload.rb +188 -0
- data/lib/zena/use/urls.rb +16 -14
- data/lib/zena/use/zafu.rb +16 -63
- data/lib/zena/use/zazen.rb +8 -8
- data/lib/zena/view/test_case.rb +8 -4
- data/locale/en/LC_MESSAGES/zena.mo +0 -0
- data/locale/en/zena.po +3 -3
- data/public/.htaccess +40 -0
- data/public/javascripts/upload-progress.js +17 -8
- data/public/javascripts/zena.js +8 -2
- data/public/stylesheets/popup.css +1 -0
- data/script/about +3 -0
- data/script/apache_logging +25 -0
- data/script/breakpointer +3 -0
- data/script/console +3 -0
- data/script/dbconsole +3 -0
- data/script/destroy +3 -0
- data/script/generate +3 -0
- data/script/performance/benchmarker +3 -0
- data/script/performance/profiler +3 -0
- data/script/plugin +3 -0
- data/script/process/inspector +3 -0
- data/script/process/reaper +3 -0
- data/script/process/spawner +3 -0
- data/script/runner +3 -0
- data/script/server +3 -0
- data/script/set_revision +29 -0
- data/spec/controllers/versions_controller_spec.rb +11 -0
- data/test/fixtures/files/Node-test.zafu +1 -1
- data/test/functional/nodes_controller_test.rb +25 -0
- data/test/functional/pings_controller_test.rb +8 -0
- data/test/functional/user_sessions_controller_test.rb +59 -0
- data/test/functional/users_controller_test.rb +81 -19
- data/test/helpers/node_query/filters.yml +5 -0
- data/test/helpers/node_query_test.rb +3 -3
- data/test/integration/multiple_hosts_test.rb +1 -1
- data/test/integration/navigation_test.rb +1 -1
- data/test/sites/complex/users.yml +1 -1
- data/test/sites/ocean/users.yml +3 -3
- data/test/sites/zena/users.yml +5 -4
- data/test/test_zena.rb +38 -38
- data/test/unit/cached_page_test.rb +2 -2
- data/test/unit/comment_test.rb +0 -1
- data/test/unit/document_test.rb +23 -11
- data/test/unit/helpers/ping_helper_test.rb +4 -0
- data/test/unit/multiversion_test.rb +24 -16
- data/test/unit/node_test.rb +32 -93
- data/test/unit/note_test.rb +9 -0
- data/test/unit/page_test.rb +2 -2
- data/test/unit/secure_test.rb +2 -12
- data/test/unit/site_test.rb +43 -24
- data/test/unit/template_test.rb +45 -3
- data/test/unit/text_document_test.rb +4 -3
- data/test/unit/user_test.rb +13 -33
- data/test/unit/zena/db_test.rb +8 -0
- data/test/unit/zena/parser/zazen.yml +4 -4
- data/test/unit/zena/use/dates_view_methods_test.rb +2 -1
- data/test/unit/zena/use/html_tags_test.rb +12 -4
- data/test/unit/zena/use/refactor_test.rb +4 -3
- data/test/unit/zena/use/rendering_test.rb +1 -0
- data/test/unit/zena/use/upload_test.rb +76 -0
- data/test/unit/zena/use/urls_test.rb +4 -0
- data/test/unit/zena/use/zafu_test.rb +8 -0
- data/test/unit/zena/workflow/status_version_test.rb +6 -0
- data/test/unit/zena/zena_tags/ajax.yml +4 -4
- data/test/unit/zena/zena_tags/basic.yml +21 -10
- data/test/unit/zena/zena_tags/relations.yml +0 -6
- data/test/unit/zena/zena_tags/rubyless.yml +35 -0
- data/test/unit/zena/zena_tags/zazen.yml +4 -4
- data/test/unit/zena/zena_tags_test.rb +36 -4
- data/vendor/TextMate/Zena.tmbundle/Commands/Run all yaml tests.tmCommand +1 -1
- data/vendor/TextMate/Zena.tmbundle/Commands/Run focused yaml test.tmCommand +2 -3
- data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/catch_exception.rb +39 -0
- data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/run_script.rb +102 -58
- data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/stdin_dialog.rb +14 -0
- data/vendor/TextMate/Zena.tmbundle/info.plist +2 -0
- data/zena.gemspec +2085 -0
- metadata +265 -90
- data/app/controllers/sessions_controller.rb +0 -41
- data/app/views/sites/zena_up.html.erb +0 -11
- data/config/database.yml +0 -40
- data/db/production.sqlite3 +0 -0
- data/lib/bricks/patcher.rb +0 -68
- data/lib/zena/parser/zena_tags.rb +0 -3562
- data/lib/zena/use/authentification.rb +0 -120
- data/public/images/ext/contact_pv.png +0 -0
- data/public/images/ext/other_pv.png +0 -0
- data/public/images/ext/page_pv.png +0 -0
- data/public/images/ext/page_tiny.png +0 -0
- data/public/images/ext/pdf_pv.png +0 -0
- data/public/images/ext/post_pv.png +0 -0
- data/public/images/ext/post_tiny.png +0 -0
- data/public/images/ext/project_pv.png +0 -0
- data/public/images/ext/project_tiny.png +0 -0
- data/public/images/ext/tag_pv.png +0 -0
- data/public/images/ext/zip_pv.png +0 -0
- data/tasks/ann.rake +0 -80
- data/tasks/bones.rake +0 -20
- data/tasks/gem.rake +0 -201
- data/tasks/git.rake +0 -40
- data/tasks/notes.rake +0 -27
- data/tasks/post_load.rake +0 -34
- data/tasks/rdoc.rake +0 -51
- data/tasks/rubyforge.rake +0 -55
- data/tasks/setup.rb +0 -292
- data/tasks/spec.rake +0 -54
- data/tasks/svn.rake +0 -47
- data/tasks/test.rake +0 -40
- data/tasks/zentest.rake +0 -36
- data/test/fixtures/comments.yml +0 -126
- data/test/fixtures/contact_contents.yml +0 -132
- data/test/fixtures/data_entries.yml +0 -65
- data/test/fixtures/discussions.yml +0 -48
- data/test/fixtures/document_contents.yml +0 -108
- data/test/fixtures/dyn_attributes.yml +0 -66
- data/test/fixtures/groups.yml +0 -86
- data/test/fixtures/groups_users.yml +0 -81
- data/test/fixtures/iformats.yml +0 -29
- data/test/fixtures/links.yml +0 -313
- data/test/fixtures/nodes.yml +0 -2592
- data/test/fixtures/relations.yml +0 -126
- data/test/fixtures/sites.yml +0 -58
- data/test/fixtures/template_contents.yml +0 -172
- data/test/fixtures/users.yml +0 -167
- data/test/fixtures/versions.yml +0 -1911
- data/test/fixtures/virtual_classes.yml +0 -87
- data/test/fixtures/zips.yml +0 -15
- data/test/functional/sessions_controller_test.rb +0 -73
data/lib/zafu/eval.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
module Zafu
|
2
|
+
module Eval
|
3
|
+
|
4
|
+
def r_set
|
5
|
+
return parser_error("'var' missing") unless var_name = @params[:var]
|
6
|
+
return parser_error("bad value for 'var' (#{var_name.inspect})") unless var_name =~ /^[a-zA-Z_]+$/
|
7
|
+
return '' unless @context[:set]
|
8
|
+
if @params[:value]
|
9
|
+
out "<% set_#{var_name} = #{@params[:value].inspect} -%>"
|
10
|
+
# TODO: isn't @context[:vars] = @params[:value].inspect missing here ?
|
11
|
+
elsif @params[:eval]
|
12
|
+
return unless eval_string = parse_eval_parameter(@params[:eval])
|
13
|
+
out "<% set_#{var_name} = #{eval_string} -%>"
|
14
|
+
else
|
15
|
+
out "<% set_#{var_name} = capture do %>"
|
16
|
+
out expand_with(:set => false) # do not propagate
|
17
|
+
out "<% end -%>"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def parse_eval_parameter(str)
|
22
|
+
# evaluate an expression. Can only contain vars, '(', ')', '*', '+', '/', '-', '[attr]'
|
23
|
+
# FIXME: SECURITY (audit this)
|
24
|
+
vars = @context[:vars] || []
|
25
|
+
parts = str.split(/\s+/)
|
26
|
+
res = []
|
27
|
+
test = []
|
28
|
+
parts.each do |p|
|
29
|
+
if p =~ /\[([\w_]+)\]/
|
30
|
+
test << 1
|
31
|
+
res << (node_attribute($1) + '.to_f')
|
32
|
+
elsif p =~ /^[a-zA-Z_]+$/
|
33
|
+
unless vars.include?(p)
|
34
|
+
out parser_error("var #{p.inspect} not set in eval")
|
35
|
+
return nil
|
36
|
+
end
|
37
|
+
test << 1
|
38
|
+
res << "set_#{p}.to_f"
|
39
|
+
elsif ['(', ')', '*', '+', '/', '-'].include?(p)
|
40
|
+
res << p
|
41
|
+
test << p
|
42
|
+
elsif p =~ /^[0-9\.]+$/
|
43
|
+
res << p
|
44
|
+
test << p
|
45
|
+
else
|
46
|
+
out parser_error("bad argument #{p.inspect} in eval")
|
47
|
+
return nil
|
48
|
+
end
|
49
|
+
end
|
50
|
+
begin
|
51
|
+
begin
|
52
|
+
eval test.join(' ')
|
53
|
+
rescue
|
54
|
+
# rescue evaluation error
|
55
|
+
out parser_error("error in eval")
|
56
|
+
return nil
|
57
|
+
end
|
58
|
+
"(#{res.join(' ')})"
|
59
|
+
rescue SyntaxError => err
|
60
|
+
# rescue compilation error
|
61
|
+
out parser_error("compilation error in eval")
|
62
|
+
return nil
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end # Eval
|
66
|
+
end # Zafu
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Zafu
|
2
|
+
module Experimental
|
3
|
+
|
4
|
+
# part caching
|
5
|
+
def r_cache
|
6
|
+
kpath = @params[:kpath] || Page.kpath
|
7
|
+
out "<% #{cache} = Cache.with(visitor.id, visitor.group_ids, #{kpath.inspect}, #{helper.send(:lang).inspect}, #{template_url.inspect}) do capture do %>"
|
8
|
+
out expand_with
|
9
|
+
out "<% end; end %><%= #{cache} %>"
|
10
|
+
end
|
11
|
+
|
12
|
+
def cache
|
13
|
+
return @cache if @cache
|
14
|
+
if @context[:cache] =~ /^cache(\d+)$/
|
15
|
+
@cache = "cache#{$1.to_i + 1}"
|
16
|
+
else
|
17
|
+
@cache = "cache1"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def r_flash_messages
|
22
|
+
type = @params[:show] || 'both'
|
23
|
+
"<div id='messages'>" +
|
24
|
+
if (type == 'notice' || type == 'both')
|
25
|
+
"<% if flash[:notice] -%><div id='notice' class='flash' onclick='new Effect.Fade(\"error\")'><%= flash[:notice] %></div><% end -%>"
|
26
|
+
else
|
27
|
+
''
|
28
|
+
end +
|
29
|
+
if (type == 'error' || type == 'both')
|
30
|
+
"<% if flash[:error] -%><div id='error' class='flash' onclick='new Effect.Fade(\"error\")'><%= flash[:error] %></div><% end -%>"
|
31
|
+
else
|
32
|
+
''
|
33
|
+
end +
|
34
|
+
"</div>"
|
35
|
+
end
|
36
|
+
|
37
|
+
# Prepare stylesheet and xml content for xsl-fo post-processor
|
38
|
+
def r_fop
|
39
|
+
return parser_error("missing 'stylesheet' argument") unless @params[:stylesheet]
|
40
|
+
# get stylesheet text
|
41
|
+
xsl_content, absolute_url, doc = self.class.get_template_text(@params[:stylesheet], @options[:helper], @options[:current_folder])
|
42
|
+
return parser_error("stylesheet #{@params[:stylesheet].inspect} not found") unless doc
|
43
|
+
|
44
|
+
template_url = (self.template_url.split('/')[0..-2] + ['_main.xsl']).join('/')
|
45
|
+
helper.save_erb_to_url(xsl_content, template_url)
|
46
|
+
out "<?xml version='1.0' encoding='utf-8'?>\n"
|
47
|
+
out "<!-- xsl_id:#{doc[:id] } -->\n" if doc
|
48
|
+
out expand_with
|
49
|
+
end
|
50
|
+
|
51
|
+
# Prepare content for LateX post-processor
|
52
|
+
def r_latex
|
53
|
+
out "% latex\n"
|
54
|
+
# all content inside this will be informed to render for Latex output
|
55
|
+
out expand_with(:output_format => 'latex')
|
56
|
+
end
|
57
|
+
|
58
|
+
def r_inspect
|
59
|
+
out ["params: #{@params.inspect}",
|
60
|
+
"name: #{@context[:name]}",
|
61
|
+
"node: #{node}",
|
62
|
+
"list: #{list}"].join("<br/>")
|
63
|
+
end
|
64
|
+
|
65
|
+
end # Experimental
|
66
|
+
end # Zafu
|
data/lib/zafu/i18n.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
module Zafu
|
2
|
+
module I18n
|
3
|
+
def r_load
|
4
|
+
if dict = @params[:dictionary]
|
5
|
+
dict_content, absolute_url, doc = self.class.get_template_text(dict, @options[:helper], @options[:current_folder])
|
6
|
+
return parser_error("dictionary #{dict.inspect} not found") unless doc
|
7
|
+
@context[:dict] ||= {}
|
8
|
+
begin
|
9
|
+
definitions = YAML::load(dict_content)
|
10
|
+
definitions['translations'].each do |elem|
|
11
|
+
@context[:dict][elem[0]] = elem[1]
|
12
|
+
end
|
13
|
+
rescue
|
14
|
+
return parser_error("invalid dictionary content #{dict.inspect}")
|
15
|
+
end
|
16
|
+
else
|
17
|
+
return parser_error("missing 'dictionary'")
|
18
|
+
end
|
19
|
+
expand_with
|
20
|
+
end
|
21
|
+
|
22
|
+
def _(text)
|
23
|
+
if @context[:dict]
|
24
|
+
@context[:dict][text] || helper.send(:_,text)
|
25
|
+
else
|
26
|
+
helper.send(:_,text)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def r_trans
|
31
|
+
static = true
|
32
|
+
if @params[:text]
|
33
|
+
text = @params[:text]
|
34
|
+
elsif @params[:attr]
|
35
|
+
text = "#{node_attribute(@params[:attr])}"
|
36
|
+
static = false
|
37
|
+
else
|
38
|
+
res = []
|
39
|
+
text = ""
|
40
|
+
@blocks.each do |b|
|
41
|
+
if b.kind_of?(String)
|
42
|
+
res << b.inspect
|
43
|
+
text << b
|
44
|
+
elsif ['show', 'current_date'].include?(b.method)
|
45
|
+
res << expand_block(b, :trans=>true)
|
46
|
+
static = false
|
47
|
+
else
|
48
|
+
# ignore
|
49
|
+
end
|
50
|
+
end
|
51
|
+
unless static
|
52
|
+
text = res.join(' + ')
|
53
|
+
end
|
54
|
+
end
|
55
|
+
if static
|
56
|
+
_(text)
|
57
|
+
else
|
58
|
+
"<%= _(#{text}) %>"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
alias r_t r_trans
|
63
|
+
end # I18n
|
64
|
+
end # Zafu
|
data/lib/zafu/meta.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
module Zafu
|
2
|
+
module Meta
|
3
|
+
|
4
|
+
def r_debug
|
5
|
+
return '' unless @context[:dev]
|
6
|
+
add_html_class('debug')
|
7
|
+
out "<p>#{@params[:title] || @params[:message]}</p>" if @params[:title] || @params[:message]
|
8
|
+
(@params[:show] || '').split(',').map(&:strip).each do |what|
|
9
|
+
case what
|
10
|
+
when 'params'
|
11
|
+
out "<pre><%= params.inspect %></pre>"
|
12
|
+
when 'class'
|
13
|
+
out "<pre>expected: #{node_class} / got: <%= #{node}.class %></pre>"
|
14
|
+
else
|
15
|
+
parser_error("invalid element to show. Options are ['params', 'class'].")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
out expand_with
|
19
|
+
end
|
20
|
+
|
21
|
+
def parser_error(message, tag=@method)
|
22
|
+
"<span class='parser_error'>[#{tag}] #{message}</span>"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module Zafu
|
2
|
+
module Refactor
|
3
|
+
def r_node
|
4
|
+
@method = @params[:select] || 'node' # 'node' is for version.node
|
5
|
+
r_unknown
|
6
|
+
end
|
7
|
+
|
8
|
+
def base_class
|
9
|
+
if node_kind_of?(Node)
|
10
|
+
Node
|
11
|
+
elsif node_kind_of?(Version)
|
12
|
+
Version
|
13
|
+
else
|
14
|
+
node_class
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# get current output format
|
19
|
+
def output_format
|
20
|
+
@context[:output_format] || 'html'
|
21
|
+
end
|
22
|
+
|
23
|
+
# icon or first image (defined using build_finder_for instead of zafu_known_context for performance reasons).
|
24
|
+
def r_icon
|
25
|
+
if !@params[:in] && !@params[:where] && !@params[:from] && !@params[:find]
|
26
|
+
finder, klass = build_finder_for(:first, 'icon', @params.merge(:or => 'image', :order => 'l_id desc, position asc, name asc', :group => 'id,l_id'))
|
27
|
+
return unless finder
|
28
|
+
return parser_error("invalid class (#{klass})") unless klass.ancestors.include?(Node)
|
29
|
+
do_var(finder, :node_class => klass)
|
30
|
+
else
|
31
|
+
r_unknown
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# be carefull, this gives a list of 'versions', not 'nodes'
|
36
|
+
def r_traductions
|
37
|
+
if @params[:except]
|
38
|
+
case @params[:except]
|
39
|
+
when 'current'
|
40
|
+
opts = "(:conditions=>\"lang != '#{helper.lang}'\")"
|
41
|
+
else
|
42
|
+
# list of lang
|
43
|
+
# TODO: test
|
44
|
+
langs = @params[:except].split(',').map{|l| l.gsub(/[^a-z]/,'').strip }
|
45
|
+
opts = "(:conditions=>\"lang NOT IN ('#{langs.join("','")}')\")"
|
46
|
+
end
|
47
|
+
elsif @params[:only]
|
48
|
+
# TODO: test
|
49
|
+
case @params[:only]
|
50
|
+
when 'current'
|
51
|
+
opts = "(:conditions=>\"lang = '#{helper.lang}'\")"
|
52
|
+
else
|
53
|
+
# list of lang
|
54
|
+
# TODO: test
|
55
|
+
langs = @params[:only].split(',').map{|l| l.gsub(/[^a-z]/,'').strip }
|
56
|
+
opts = "(:conditions=>\"lang IN ('#{langs.join("','")}')\")"
|
57
|
+
end
|
58
|
+
else
|
59
|
+
opts = ""
|
60
|
+
end
|
61
|
+
out "<% if #{list_var} = #{node}.traductions#{opts} -%>"
|
62
|
+
out expand_with(:list=>list_var, :node_class => Version)
|
63
|
+
out "<% end -%>"
|
64
|
+
end
|
65
|
+
|
66
|
+
# TODO: test
|
67
|
+
def r_show_traductions
|
68
|
+
"<% if #{list_var} = #{node}.traductions -%>"
|
69
|
+
"#{_("Traductions:")} <span class='traductions'><%= #{list_var}.join(', ') %></span>"
|
70
|
+
"<%= traductions(:node=>#{node}).join(', ') %>"
|
71
|
+
end
|
72
|
+
end # Refactor
|
73
|
+
end # Zafu
|
@@ -0,0 +1,265 @@
|
|
1
|
+
module Zafu
|
2
|
+
module Support
|
3
|
+
module Context
|
4
|
+
|
5
|
+
# use all other tags as rubyless or relations
|
6
|
+
def r_unknown
|
7
|
+
context = change_context(@method)
|
8
|
+
open_context(context)
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
# Enter a new context (<r:context find='all' select='pages'>). This is the same as '<r:pages>...</r:pages>'). It is
|
13
|
+
# considered better style to use '<r:pages>...</r:pages>' instead of the more general '<r:context>' because the tags
|
14
|
+
# give a clue on the context at start and end. Another way to open a context is the 'do' syntax: "<div do='pages'>...</div>".
|
15
|
+
# FIXME: 'else' clause has been removed, find a solution to put it back.
|
16
|
+
def r_context
|
17
|
+
# DRY ! (build_finder_for, block)
|
18
|
+
return parser_error("missing 'select' parameter") unless method = @params[:select]
|
19
|
+
context = change_context(method, :skip_rubyless => true)
|
20
|
+
open_context(context)
|
21
|
+
|
22
|
+
#context = RubyLess::SafeClass.safe_method_type_for(node_class, [method]) if use_rubyless
|
23
|
+
#if context && @params.keys == [:select]
|
24
|
+
# open_context("#{node}.#{context[:method]}", context.dup)
|
25
|
+
#elsif node_kind_of?(Node)
|
26
|
+
# count = ['first','all','count'].include?(@params[:find]) ? @params[:find].to_sym : nil
|
27
|
+
# count ||= Node.plural_relation?(method) ? :all : :first
|
28
|
+
# finder, klass, query = build_finder_for(count, method, @params)
|
29
|
+
# return unless finder
|
30
|
+
# if node_kind_of?(Node) && !klass.ancestors.include?(Node)
|
31
|
+
# # moving out of node: store last Node
|
32
|
+
# @context[:previous_node] = node
|
33
|
+
# end
|
34
|
+
# if count == :all
|
35
|
+
# # plural
|
36
|
+
# do_list( finder, query, :node_class => klass)
|
37
|
+
# # elsif count == :count
|
38
|
+
# # "<%= #{build_finder_for(count, method, @params)} %>"
|
39
|
+
# else
|
40
|
+
# # singular
|
41
|
+
# do_var( finder, :node_class => klass)
|
42
|
+
# end
|
43
|
+
#else
|
44
|
+
# "unknown relation (#{method}) for #{node_class} class"
|
45
|
+
#end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Group elements in a list. Use :order to specify order.
|
49
|
+
def r_group
|
50
|
+
return parser_error("cannot be used outside of a list") unless list_var = @context[:list]
|
51
|
+
return parser_error("missing 'by' clause") unless key = @params[:by]
|
52
|
+
|
53
|
+
sort_key = @params[:sort] || 'name'
|
54
|
+
if node_kind_of?(DataEntry) && DataEntry::NodeLinkSymbols.include?(key.to_sym)
|
55
|
+
key = "#{key}_id"
|
56
|
+
sort_block = "{|e| (e.#{key} || {})[#{sort_key.to_sym.inspect}]}"
|
57
|
+
group_array = "group_array(#{list_var}) {|e| e.#{key}}"
|
58
|
+
elsif node_kind_of?(Node)
|
59
|
+
if ['project', 'parent', 'section'].include?(key)
|
60
|
+
sort_block = "{|e| (e.#{key} || {})[#{sort_key.to_sym.inspect}]}"
|
61
|
+
group_array = "group_array(#{list_var}) {|e| e.#{key}_id}"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
group_array ||= "group_array(#{list_var}) {|e| #{node_attribute(key, :node => 'e')}}"
|
66
|
+
|
67
|
+
if sort_block
|
68
|
+
out "<% grp_#{list_var} = sort_array(#{group_array}) #{sort_block} -%>"
|
69
|
+
else
|
70
|
+
out "<% grp_#{list_var} = #{group_array} -%>"
|
71
|
+
end
|
72
|
+
|
73
|
+
if descendant('each_group')
|
74
|
+
out expand_with(:group => "grp_#{list_var}")
|
75
|
+
else
|
76
|
+
@context[:group] = "grp_#{list_var}"
|
77
|
+
r_each_group
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
protected
|
82
|
+
|
83
|
+
# find the current node name in the context
|
84
|
+
def node(klass = self.node_class)
|
85
|
+
if klass == self.node_class
|
86
|
+
(@context[:saved_template] && @context[:main_node]) ? "@#{base_class.to_s.underscore}" : (@context[:node] || '@node')
|
87
|
+
elsif klass == Node
|
88
|
+
@context[:previous_node] || '@node'
|
89
|
+
else
|
90
|
+
# ?
|
91
|
+
out parser_error("could not find node_name for #{klass} (current class is #{node_class})")
|
92
|
+
'@node'
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def var
|
97
|
+
return @var if @var
|
98
|
+
if node =~ /^var(\d+)$/
|
99
|
+
@var = "var#{$1.to_i + 1}"
|
100
|
+
else
|
101
|
+
@var = "var1"
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def list_var
|
106
|
+
return @list_var if @list_var
|
107
|
+
if (list || "") =~ /^list(\d+)$/
|
108
|
+
@list_var = "list#{$1.to_i + 1}"
|
109
|
+
else
|
110
|
+
@list_var = "list1"
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# Class of the current 'node' object (can be Version, Comment, Node, DataEntry, etc)
|
115
|
+
def node_class
|
116
|
+
@context[:node_class] || Node
|
117
|
+
end
|
118
|
+
|
119
|
+
def node_kind_of?(ancestor)
|
120
|
+
node_class.ancestors.include?(ancestor)
|
121
|
+
end
|
122
|
+
|
123
|
+
def list
|
124
|
+
@context[:list]
|
125
|
+
end
|
126
|
+
|
127
|
+
def helper
|
128
|
+
@options[:helper]
|
129
|
+
end
|
130
|
+
|
131
|
+
# Return parameter value accessor
|
132
|
+
def get_param(key)
|
133
|
+
"params[:#{key}]"
|
134
|
+
end
|
135
|
+
|
136
|
+
def find_stored(klass, key)
|
137
|
+
if "#{klass}_#{key}" == "Node_start_node"
|
138
|
+
# main node before ajax stuff (the one in browser url)
|
139
|
+
"start_node"
|
140
|
+
else
|
141
|
+
@context["#{klass}_#{key}"]
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
def set_stored(klass, key, obj)
|
146
|
+
@context["#{klass}_#{key}"] = obj
|
147
|
+
end
|
148
|
+
|
149
|
+
def open_context(context)
|
150
|
+
return nil unless context
|
151
|
+
klass = context.delete(:class)
|
152
|
+
if klass.kind_of?(Class) && klass.ancestors.include?(String) && (@blocks.empty? || @blocks.size == 1 && @blocks[0].kind_of?(String))
|
153
|
+
out "<%= #{context[:method]} %>"
|
154
|
+
return
|
155
|
+
end
|
156
|
+
# hack to store last 'Node' context until we fix node(Node) stuff:
|
157
|
+
previous_node = node_kind_of?(Node) ? node : @context[:previous_node]
|
158
|
+
if klass.kind_of?(Array)
|
159
|
+
# plural
|
160
|
+
do_list( context[:method], context.merge(:node_class => klass[0], :previous_node => previous_node) )
|
161
|
+
else
|
162
|
+
# singular
|
163
|
+
do_var( context[:method], context.merge(:node_class => klass, :previous_node => previous_node) )
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def do_var(var_finder=nil, opts={})
|
168
|
+
clear_dom_scope
|
169
|
+
if var_finder == 'nil'
|
170
|
+
out "<% if nil -%>"
|
171
|
+
elsif var_finder
|
172
|
+
out "<% if #{var} = #{var_finder} -%>"
|
173
|
+
end
|
174
|
+
|
175
|
+
if descendant('unlink')
|
176
|
+
@html_tag ||= 'div'
|
177
|
+
new_dom_scope
|
178
|
+
@html_tag_params[:id] = erb_dom_id
|
179
|
+
end
|
180
|
+
|
181
|
+
res = expand_with(opts.merge(:node=>var, :in_if => false))
|
182
|
+
|
183
|
+
if var_finder
|
184
|
+
res += expand_with(opts.merge(:in_if => true, :only => ['else', 'elsif'], :html_tag_params => @html_tag_params, :html_tag => @html_tag))
|
185
|
+
end
|
186
|
+
out render_html_tag(res)
|
187
|
+
out "<% end -%>" if var_finder
|
188
|
+
end
|
189
|
+
|
190
|
+
def do_list(list_finder, opts={})
|
191
|
+
clear_dom_scope
|
192
|
+
query = opts[:query]
|
193
|
+
|
194
|
+
@context.merge!(opts) # pass options from 'safe_method_type_for' to @context
|
195
|
+
|
196
|
+
if (each_block = descendant('each')) && (each_block.descendant('edit') || descendant('add') || descendant('add_document') || (descendant('swap') && descendant('swap').parent.method != 'block') || ['block', 'drop'].include?(each_block.single_child_method))
|
197
|
+
new_dom_scope
|
198
|
+
# ajax, build template. We could merge the following code with 'r_block'.
|
199
|
+
add_block = descendant('add')
|
200
|
+
form_block = descendant('form') || each_block
|
201
|
+
|
202
|
+
@context[:need_link_id] = form_block.need_link_id
|
203
|
+
|
204
|
+
out "<% if (#{list_var} = #{list_finder}) || (#{node}.#{node_kind_of?(Comment) ? "can_comment?" : "can_write?"} && #{list_var}=[]) -%>"
|
205
|
+
if query && (pagination_key = query.pagination_key)
|
206
|
+
out "<% set_#{pagination_key}_nodes = #{query.finder(:count)}; set_#{pagination_key}_count = (set_#{pagination_key}_nodes / #{query.page_size.to_f}).ceil; set_#{pagination_key} = [1,params[:#{pagination_key}].to_i].max -%>"
|
207
|
+
@context[:paginate] = pagination_key
|
208
|
+
@context[:vars] ||= []
|
209
|
+
@context[:vars] << "#{pagination_key}_nodes"
|
210
|
+
@context[:vars] << "#{pagination_key}_count"
|
211
|
+
@context[:vars] << pagination_key
|
212
|
+
end
|
213
|
+
|
214
|
+
# should we publish ?
|
215
|
+
publish_after_save ||= form_block ? form_block.params[:publish] : nil
|
216
|
+
publish_after_save ||= descendant('edit') ? descendant('edit').params[:publish] : nil
|
217
|
+
|
218
|
+
# class name for create form
|
219
|
+
klass = add_block ? add_block.params[:klass] : nil
|
220
|
+
klass ||= form_block ? form_block.params[:klass] : nil
|
221
|
+
|
222
|
+
# INLINE ==========
|
223
|
+
# 'r_add' needs the form when rendering. Send with :form.
|
224
|
+
out render_html_tag(expand_with(:list=>list_var, :in_if => false, :form=>form_block, :publish_after_save => publish_after_save, :ignore => ['form'], :klass => klass))
|
225
|
+
out expand_with(:in_if=>true, :only=>['elsif', 'else'], :html_tag => @html_tag, :html_tag_params => @html_tag_params)
|
226
|
+
out "<% end -%>"
|
227
|
+
|
228
|
+
# SAVED TEMPLATE ========
|
229
|
+
template = expand_block(each_block, :list=>false, :klass => klass, :saved_template => true)
|
230
|
+
out helper.save_erb_to_url(template, template_url)
|
231
|
+
|
232
|
+
# FORM ============
|
233
|
+
if each_block != form_block
|
234
|
+
form = expand_block(form_block, :klass => klass, :add=>add_block, :publish_after_save => publish_after_save, :saved_template => true)
|
235
|
+
else
|
236
|
+
form = expand_block(form_block, :klass => klass, :add=>add_block, :make_form=>true, :publish_after_save => publish_after_save, :saved_template => true)
|
237
|
+
end
|
238
|
+
out helper.save_erb_to_url(form, form_url)
|
239
|
+
else
|
240
|
+
# no form, render, edit and add are not ajax
|
241
|
+
if descendant('add') || descendant('add_document')
|
242
|
+
out "<% if (#{list_var} = #{list_finder}) || (#{node}.#{node_kind_of?(Comment) ? "can_comment?" : "can_write?"} && #{list_var}=[]) -%>"
|
243
|
+
elsif list_finder != 'nil'
|
244
|
+
out "<% if #{list_var} = #{list_finder} -%>"
|
245
|
+
else
|
246
|
+
out "<% if nil -%>"
|
247
|
+
end
|
248
|
+
|
249
|
+
if query && (pagination_key = query.pagination_key)
|
250
|
+
out "<% set_#{pagination_key}_nodes = #{query.finder(:count)}; set_#{pagination_key}_count = (set_#{pagination_key}_nodes / #{query.page_size.to_f}).ceil; set_#{pagination_key} = [1,params[:#{pagination_key}].to_i].max -%>"
|
251
|
+
@context[:paginate] = pagination_key
|
252
|
+
@context[:vars] ||= []
|
253
|
+
@context[:vars] << "#{pagination_key}_nodes"
|
254
|
+
@context[:vars] << "#{pagination_key}_count"
|
255
|
+
@context[:vars] << "#{pagination_key}"
|
256
|
+
end
|
257
|
+
|
258
|
+
out render_html_tag(expand_with(:list=>list_var, :in_if => false))
|
259
|
+
out expand_with(:in_if=>true, :only=>['elsif', 'else'], :html_tag => @html_tag, :html_tag_params => @html_tag_params)
|
260
|
+
out "<% end -%>"
|
261
|
+
end
|
262
|
+
end
|
263
|
+
end # Context
|
264
|
+
end # Support
|
265
|
+
end # Zafu
|