5 |
5 |
# modify it under the terms of the GNU General Public License
|
6 |
6 |
# as published by the Free Software Foundation; either version 2
|
7 |
7 |
# of the License, or (at your option) any later version.
|
8 |
|
#
|
|
8 |
#
|
9 |
9 |
# This program is distributed in the hope that it will be useful,
|
10 |
10 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11 |
11 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12 |
12 |
# GNU General Public License for more details.
|
13 |
|
#
|
|
13 |
#
|
14 |
14 |
# You should have received a copy of the GNU General Public License
|
15 |
15 |
# along with this program; if not, write to the Free Software
|
16 |
16 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
... | ... | |
24 |
24 |
send(method_name, obj, args) if respond_to?(method_name)
|
25 |
25 |
end
|
26 |
26 |
end
|
27 |
|
|
|
27 |
|
28 |
28 |
@@available_macros = {}
|
29 |
|
|
|
29 |
|
30 |
30 |
class << self
|
31 |
31 |
# Called with a block to define additional macros.
|
32 |
32 |
# Macro blocks accept 2 arguments:
|
33 |
33 |
# * obj: the object that is rendered
|
34 |
34 |
# * args: macro arguments
|
35 |
|
#
|
|
35 |
#
|
36 |
36 |
# Plugins can use this method to define new macros:
|
37 |
|
#
|
|
37 |
#
|
38 |
38 |
# Redmine::WikiFormatting::Macros.register do
|
39 |
39 |
# desc "This is my macro"
|
40 |
40 |
# macro :my_macro do |obj, args|
|
... | ... | |
44 |
44 |
def register(&block)
|
45 |
45 |
class_eval(&block) if block_given?
|
46 |
46 |
end
|
47 |
|
|
|
47 |
|
48 |
48 |
private
|
49 |
49 |
# Defines a new macro with the given name and block.
|
50 |
50 |
def macro(name, &block)
|
... | ... | |
54 |
54 |
raise "Can not create a macro without a block!" unless block_given?
|
55 |
55 |
Definitions.send :define_method, "macro_#{name}".downcase, &block
|
56 |
56 |
end
|
57 |
|
|
|
57 |
|
58 |
58 |
# Sets description for the next macro to be defined
|
59 |
59 |
def desc(txt)
|
60 |
60 |
@@desc = txt
|
61 |
61 |
end
|
62 |
62 |
end
|
63 |
|
|
|
63 |
|
64 |
64 |
# Builtin macros
|
65 |
65 |
desc "Sample macro."
|
66 |
66 |
macro :hello_world do |obj, args|
|
67 |
67 |
"Hello world! Object: #{obj.class.name}, " + (args.empty? ? "Called with no argument." : "Arguments: #{args.join(', ')}")
|
68 |
68 |
end
|
69 |
|
|
|
69 |
|
70 |
70 |
desc "Displays a list of all available macros, including description if available."
|
71 |
71 |
macro :macro_list do
|
72 |
72 |
out = ''
|
... | ... | |
76 |
76 |
end
|
77 |
77 |
content_tag('dl', out)
|
78 |
78 |
end
|
79 |
|
|
|
79 |
|
80 |
80 |
desc "Displays a list of child pages."
|
81 |
81 |
macro :child_pages do |obj, args|
|
82 |
82 |
raise 'This macro applies to wiki pages only.' unless obj.is_a?(WikiContent)
|
83 |
83 |
render_page_hierarchy(obj.page.descendants.group_by(&:parent_id), obj.page.id)
|
84 |
84 |
end
|
85 |
|
|
|
85 |
|
86 |
86 |
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)}}"
|
87 |
87 |
macro :include do |obj, args|
|
88 |
88 |
project = @project
|
... | ... | |
102 |
102 |
@included_wiki_pages.pop
|
103 |
103 |
out
|
104 |
104 |
end
|
|
105 |
|
|
106 |
desc "Attachment links."
|
|
107 |
macro :file do |obj, args|
|
|
108 |
out = ''
|
|
109 |
id = args.first.to_s
|
|
110 |
title = id
|
|
111 |
if title =~ %r{^([^\:]+)\:(.*)$}
|
|
112 |
id, title = $1, $2
|
|
113 |
end
|
|
114 |
out << "<a href=\"/attachments/download/#{id}\">#{title}</a>"
|
|
115 |
out
|
|
116 |
end
|
|
117 |
|
105 |
118 |
end
|
106 |
119 |
end
|
107 |
120 |
end
|