Patch #3274 » wiki_page_categories.patch
redmine/app/controllers/wiki_controller.rb 2009-04-30 13:18:51 +0200 | ||
---|---|---|
156 | 156 |
export = render_to_string :action => 'export_multiple', :layout => false |
157 | 157 |
send_data(export, :type => 'text/html', :filename => "wiki.html") |
158 | 158 |
return |
159 |
when 'category' |
|
160 |
@category = params[:category].gsub(/_/, ' ') |
|
161 |
@pages = @wiki.find_pages_in_category(@category) |
|
159 | 162 |
else |
160 | 163 |
# requested special page doesn't exist, redirect to default page |
161 | 164 |
redirect_to :action => 'index', :id => @project, :page => nil and return |
redmine/app/helpers/application_helper.rb 2009-04-30 13:13:41 +0200 | ||
---|---|---|
320 | 320 | |
321 | 321 |
project = options[:project] || @project || (obj && obj.respond_to?(:project) ? obj.project : nil) |
322 | 322 | |
323 |
# Wiki category links |
|
324 |
# |
|
325 |
# Examples: |
|
326 |
# [[category:mycategory]] |
|
327 |
# [[category:mycategory|mytext]] |
|
328 |
# wiki links can refer other project wikis, using project name or identifier: |
|
329 |
# [[myproject:category:mycategory]] |
|
330 |
# [[myproject:category:mycategory|mytext]] |
|
331 |
text = text.gsub(/(!)?(\[\[(?:(.+?):)?category:(.+?)(?:\|(.+?))?\]\])/) do |m| |
|
332 |
esc, all, link_project, category, title = $1, $2, $3, $4, $5 |
|
333 |
if esc.nil? |
|
334 |
if link_project.nil? |
|
335 |
link_project = project |
|
336 |
else |
|
337 |
link_project = Project.find_by_name(link_project) || Project.find_by_identifier(link_project) |
|
338 |
end |
|
339 |
if link_project && link_project.wiki |
|
340 |
link_to((title || category), :only_path => only_path, :controller => 'wiki', :id => project, :action => 'special', :page => 'category', :category => Wiki.titleize(category)) |
|
341 |
else |
|
342 |
title || category |
|
343 |
end |
|
344 |
else |
|
345 |
'!' + all |
|
346 |
end |
|
347 |
end |
|
348 | ||
323 | 349 |
# Wiki links |
324 | 350 |
# |
325 | 351 |
# Examples: |
redmine/app/models/wiki.rb 2009-04-30 13:19:23 +0200 | ||
---|---|---|
42 | 42 |
end |
43 | 43 |
page |
44 | 44 |
end |
45 | ||
46 |
# find pages which belong to a certain category |
|
47 |
def find_pages_in_category(category) |
|
48 |
pages.find :all, :conditions => [ "LOWER(categories) LIKE LOWER(?)", "%|#{category.downcase}|%"], :order=> 'title' |
|
49 |
end |
|
45 | 50 |
|
46 | 51 |
# Finds a page by title |
47 | 52 |
# The given string can be of one of the forms: "title" or "project:title" |
... | ... | |
62 | 67 |
end |
63 | 68 |
end |
64 | 69 |
|
70 |
def self.upcase_first(title) |
|
71 |
title = (title.slice(0..0).upcase + (title.slice(1..-1) || '')) if title |
|
72 |
end |
|
73 | ||
65 | 74 |
# turn a string into a valid page title |
66 | 75 |
def self.titleize(title) |
67 | 76 |
# replace spaces with _ and remove unwanted caracters |
68 | 77 |
title = title.gsub(/\s+/, '_').delete(',./?;|:') if title |
69 | 78 |
# upcase the first letter |
70 |
title = (title.slice(0..0).upcase + (title.slice(1..-1) || '')) if title
|
|
79 |
title = self.upcase_first(title)
|
|
71 | 80 |
title |
72 | 81 |
end |
73 | 82 |
end |
redmine/app/models/wiki_content.rb 2009-04-30 12:23:33 +0200 | ||
---|---|---|
22 | 22 |
belongs_to :page, :class_name => 'WikiPage', :foreign_key => 'page_id' |
23 | 23 |
belongs_to :author, :class_name => 'User', :foreign_key => 'author_id' |
24 | 24 |
validates_presence_of :text |
25 | ||
26 |
def after_save |
|
27 |
page.categories = categories.join('|') |
|
28 |
page.categories = '|' + page.categories + '|' if !categories.empty? |
|
29 |
page.save! |
|
30 |
end |
|
31 | ||
32 |
def categories |
|
33 |
if text.match(/\{\{categor(?:y|ies)\((.+?)\)\}\}/) |
|
34 |
$1.split(/\s*,\s*/).map { |c| Wiki.upcase_first(c) } |
|
35 |
else |
|
36 |
[] |
|
37 |
end |
|
38 |
end |
|
25 | 39 |
|
26 | 40 |
acts_as_versioned |
27 | 41 |
class Version |
redmine/app/views/wiki/_sidebar.rhtml 2009-04-30 12:30:47 +0200 | ||
---|---|---|
3 | 3 |
<%= link_to l(:field_start_page), {:action => 'index', :page => nil} %><br /> |
4 | 4 |
<%= link_to l(:label_index_by_title), {:action => 'special', :page => 'Page_index'} %><br /> |
5 | 5 |
<%= link_to l(:label_index_by_date), {:action => 'special', :page => 'Date_index'} %><br /> |
6 | ||
7 |
<% if wiki_categories = @page.categories.sub(/^\|(.*)\|$/, '\1').split('|') rescue nil %> |
|
8 |
<% if (!wiki_categories.empty?) %> |
|
9 |
<h3><%= l((wiki_categories.length==1)?(:label_wiki_category):(:label_wiki_category_plural)) %></h3> |
|
10 |
<% wiki_categories.sort.each do |category| %> |
|
11 |
<%= link_to category, {:action => 'special', :page => 'category', :category => Wiki.titleize(category)} %><br /> |
|
12 |
<% end %> |
|
13 |
<% end %> |
|
14 |
<% end %> |
redmine/app/views/wiki/special_category.rhtml 2009-04-29 21:34:30 +0200 | ||
---|---|---|
1 |
<h2><%= l(:label_wiki_category) %>: <%= @category %></h2> |
|
2 | ||
3 |
<% if @pages.empty? %> |
|
4 |
<p class="nodata"><%= l(:label_no_data) %></p> |
|
5 |
<% end %> |
|
6 | ||
7 |
<% content_for :sidebar do %> |
|
8 |
<%= render :partial => 'sidebar' %> |
|
9 |
<% end %> |
|
10 | ||
11 |
<% unless @pages.empty? %> |
|
12 |
<p> |
|
13 |
<ul> |
|
14 |
<% @pages.each do |page| %> |
|
15 |
<% if page.title[0,1].upcase != (group rescue nil) %> |
|
16 |
</ul><h4><%= group = page.title[0,1].upcase %></h4><ul> |
|
17 |
<% end %> |
|
18 |
<li><%= link_to page.pretty_title, {:action => 'index', :page => page.title} %></li> |
|
19 |
<% end %> |
|
20 |
</ul> |
|
21 |
</p> |
|
22 |
<% end %> |
|
23 |
redmine/config/routes.rb 2009-04-29 23:47:27 +0200 | ||
---|---|---|
15 | 15 |
map.signin 'login', :controller => 'account', :action => 'login' |
16 | 16 |
map.signout 'logout', :controller => 'account', :action => 'logout' |
17 | 17 |
|
18 |
map.connect 'wiki/:id/category/:category', :controller => 'wiki', :page => 'category', :action => 'special', :category => nil |
|
18 | 19 |
map.connect 'wiki/:id/:page/:action', :controller => 'wiki', :page => nil |
19 | 20 |
map.connect 'roles/workflow/:id/:role_id/:tracker_id', :controller => 'roles', :action => 'workflow' |
20 | 21 |
map.connect 'help/:ctrl/:page', :controller => 'help' |
redmine/db/migrate/102_add_wiki_pages_categories.rb 2009-04-19 19:40:12 +0200 | ||
---|---|---|
1 |
class AddWikiPagesCategories < ActiveRecord::Migration |
|
2 |
def self.up |
|
3 |
add_column :wiki_pages, :categories, :string |
|
4 |
end |
|
5 | ||
6 |
def self.down |
|
7 |
remove_column :wiki_pages, :categories |
|
8 |
end |
|
9 |
end |
redmine/lang/en.yml 2009-04-29 19:01:43 +0200 | ||
---|---|---|
484 | 484 |
label_wiki_edit_plural: Wiki edits |
485 | 485 |
label_wiki_page: Wiki page |
486 | 486 |
label_wiki_page_plural: Wiki pages |
487 |
label_wiki_category: Category |
|
488 |
label_wiki_category_plural: Categories |
|
487 | 489 |
label_index_by_title: Index by title |
488 | 490 |
label_index_by_date: Index by date |
489 | 491 |
label_current_version: Current version |
redmine/lib/redmine/wiki_formatting/macros.rb 2009-04-30 12:28:39 +0200 | ||
---|---|---|
116 | 116 |
@included_wiki_pages.pop |
117 | 117 |
out |
118 | 118 |
end |
119 | ||
120 |
desc "Add the current wiki page to a category.\nExample: !{{category(Help)}}" |
|
121 |
macro :category do |obj, args| |
|
122 |
'' # categories are listed in the sidebar |
|
123 |
end |
|
124 | ||
125 |
desc "Add the current wiki page to several categories.\nExample: !{{categories(Help, Snippets)}}" |
|
126 |
macro :categories do |obj, args| |
|
127 |
'' # categories are listed in the sidebar |
|
128 |
end |
|
129 | ||
130 |
desc "Display a list of pages which belong to the specified category.\nExample: !{{pages_in_category(Help)}}" |
|
131 |
macro :pages_in_category do |obj, args| |
|
132 |
if !args.first.nil? |
|
133 |
content_tag :ul, :class => :pages_in_category do |
|
134 |
@wiki.find_pages_in_category(args.first).map do |p| |
|
135 |
content_tag :li do |
|
136 |
link_to p.pretty_title, {:action => 'index', :page => p.title} |
|
137 |
end |
|
138 |
end |
|
139 |
end |
|
140 |
end |
|
141 |
end |
|
119 | 142 |
end |
120 | 143 |
end |
121 | 144 |
end |