diff options
author | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2008-11-22 11:44:07 +0000 |
---|---|---|
committer | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2008-11-22 11:44:07 +0000 |
commit | 06266c8fecd78d620b7eb55c7d9df1b65340b5b1 (patch) | |
tree | 1c6938e22bf0b3fe52c7f2f4c2d9ade991224339 /lib | |
parent | af7e586b063398fe75104837b1d11d0886139b7e (diff) | |
download | redmine-06266c8fecd78d620b7eb55c7d9df1b65340b5b1.tar.gz redmine-06266c8fecd78d620b7eb55c7d9df1b65340b5b1.zip |
Extends child_pages macro to display child pages based on page parameter (#1975).
It can also be called from anywhere now (not only from wiki pages).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2053 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'lib')
-rw-r--r-- | lib/redmine/wiki_formatting/macros.rb | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/lib/redmine/wiki_formatting/macros.rb b/lib/redmine/wiki_formatting/macros.rb index adfc590e4..abc07b947 100644 --- a/lib/redmine/wiki_formatting/macros.rb +++ b/lib/redmine/wiki_formatting/macros.rb @@ -23,6 +23,15 @@ module Redmine method_name = "macro_#{name}" send(method_name, obj, args) if respond_to?(method_name) end + + def extract_macro_options(args, *keys) + options = {} + while args.last.to_s.strip =~ %r{^(.+)\=(.+)$} && keys.include?($1.downcase.to_sym) + options[$1.downcase.to_sym] = $2 + args.pop + end + return [args, options] + end end @@available_macros = {} @@ -77,24 +86,29 @@ module Redmine content_tag('dl', out) end - desc "Displays a list of child pages." + desc "Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:\n\n" + + " !{{child_pages}} -- can be used from a wiki page only\n" + + " !{{child_pages(Foo)}} -- lists all children of page Foo\n" + + " !{{child_pages(Foo, parent=1)}} -- same as above with a link to page Foo" macro :child_pages do |obj, args| - raise 'This macro applies to wiki pages only.' unless obj.is_a?(WikiContent) - render_page_hierarchy(obj.page.descendants.group_by(&:parent_id), obj.page.id) + args, options = extract_macro_options(args, :parent) + page = nil + if args.size > 0 + page = Wiki.find_page(args.first.to_s, :project => @project) + elsif obj.is_a?(WikiContent) + page = obj.page + else + raise 'With no argument, this macro can be called from wiki pages only.' + end + raise 'Page not found' if page.nil? || !User.current.allowed_to?(:view_wiki_pages, page.wiki.project) + pages = ([page] + page.descendants).group_by(&:parent_id) + render_page_hierarchy(pages, options[:parent] ? page.parent_id : page.id) end desc "Include a wiki page. Example:\n\n !{{include(Foo)}}\n\nor to include a page of a specific project wiki:\n\n !{{include(projectname:Foo)}}" macro :include do |obj, args| - project = @project - title = args.first.to_s - if title =~ %r{^([^\:]+)\:(.*)$} - project_identifier, title = $1, $2 - project = Project.find_by_identifier(project_identifier) || Project.find_by_name(project_identifier) - end - raise 'Unknow project' unless project && User.current.allowed_to?(:view_wiki_pages, project) - raise 'No wiki for this project' unless !project.wiki.nil? - page = project.wiki.find_page(title) - raise "Page #{args.first} doesn't exist" unless page && page.content + page = Wiki.find_page(args.first.to_s, :project => @project) + raise 'Page not found' if page.nil? || !User.current.allowed_to?(:view_wiki_pages, page.wiki.project) @included_wiki_pages ||= [] raise 'Circular inclusion detected' if @included_wiki_pages.include?(page.title) @included_wiki_pages << page.title |