Chris@0
|
1 # Redmine - project management software
|
Chris@909
|
2 # Copyright (C) 2006-2011 Jean-Philippe Lang
|
Chris@0
|
3 #
|
Chris@0
|
4 # This program is free software; you can redistribute it and/or
|
Chris@0
|
5 # modify it under the terms of the GNU General Public License
|
Chris@0
|
6 # as published by the Free Software Foundation; either version 2
|
Chris@0
|
7 # of the License, or (at your option) any later version.
|
Chris@909
|
8 #
|
Chris@0
|
9 # This program is distributed in the hope that it will be useful,
|
Chris@0
|
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
|
Chris@0
|
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
Chris@0
|
12 # GNU General Public License for more details.
|
Chris@909
|
13 #
|
Chris@0
|
14 # You should have received a copy of the GNU General Public License
|
Chris@0
|
15 # along with this program; if not, write to the Free Software
|
Chris@0
|
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
Chris@0
|
17
|
Chris@0
|
18 module Redmine
|
Chris@0
|
19 module WikiFormatting
|
Chris@909
|
20 class StaleSectionError < Exception; end
|
Chris@909
|
21
|
Chris@0
|
22 @@formatters = {}
|
Chris@0
|
23
|
Chris@0
|
24 class << self
|
Chris@0
|
25 def map
|
Chris@0
|
26 yield self
|
Chris@0
|
27 end
|
Chris@909
|
28
|
Chris@0
|
29 def register(name, formatter, helper)
|
Chris@0
|
30 raise ArgumentError, "format name '#{name}' is already taken" if @@formatters[name.to_s]
|
Chris@0
|
31 @@formatters[name.to_s] = {:formatter => formatter, :helper => helper}
|
Chris@0
|
32 end
|
Chris@909
|
33
|
Chris@909
|
34 def formatter
|
Chris@909
|
35 formatter_for(Setting.text_formatting)
|
Chris@909
|
36 end
|
Chris@909
|
37
|
Chris@0
|
38 def formatter_for(name)
|
Chris@0
|
39 entry = @@formatters[name.to_s]
|
Chris@0
|
40 (entry && entry[:formatter]) || Redmine::WikiFormatting::NullFormatter::Formatter
|
Chris@0
|
41 end
|
Chris@909
|
42
|
Chris@0
|
43 def helper_for(name)
|
Chris@0
|
44 entry = @@formatters[name.to_s]
|
Chris@0
|
45 (entry && entry[:helper]) || Redmine::WikiFormatting::NullFormatter::Helper
|
Chris@0
|
46 end
|
Chris@909
|
47
|
Chris@0
|
48 def format_names
|
Chris@0
|
49 @@formatters.keys.map
|
Chris@0
|
50 end
|
Chris@909
|
51
|
Chris@909
|
52 def to_html(format, text, options = {})
|
Chris@0
|
53 text = if Setting.cache_formatted_text? && text.size > 2.kilobyte && cache_store && cache_key = cache_key_for(format, options[:object], options[:attribute])
|
Chris@0
|
54 # Text retrieved from the cache store may be frozen
|
Chris@0
|
55 # We need to dup it so we can do in-place substitutions with gsub!
|
Chris@0
|
56 cache_store.fetch cache_key do
|
Chris@0
|
57 formatter_for(format).new(text).to_html
|
Chris@0
|
58 end.dup
|
Chris@0
|
59 else
|
Chris@0
|
60 formatter_for(format).new(text).to_html
|
Chris@0
|
61 end
|
Chris@0
|
62 text
|
Chris@0
|
63 end
|
Chris@0
|
64
|
Chris@909
|
65 # Returns true if the text formatter supports single section edit
|
Chris@909
|
66 def supports_section_edit?
|
Chris@909
|
67 (formatter.instance_methods & ['update_section', :update_section]).any?
|
Chris@909
|
68 end
|
Chris@909
|
69
|
Chris@0
|
70 # Returns a cache key for the given text +format+, +object+ and +attribute+ or nil if no caching should be done
|
Chris@0
|
71 def cache_key_for(format, object, attribute)
|
Chris@0
|
72 if object && attribute && !object.new_record? && object.respond_to?(:updated_on) && !format.blank?
|
Chris@0
|
73 "formatted_text/#{format}/#{object.class.model_name.cache_key}/#{object.id}-#{attribute}-#{object.updated_on.to_s(:number)}"
|
Chris@0
|
74 end
|
Chris@0
|
75 end
|
Chris@909
|
76
|
Chris@0
|
77 # Returns the cache store used to cache HTML output
|
Chris@0
|
78 def cache_store
|
Chris@0
|
79 ActionController::Base.cache_store
|
Chris@0
|
80 end
|
Chris@0
|
81 end
|
Chris@909
|
82
|
Chris@0
|
83 # Default formatter module
|
Chris@0
|
84 module NullFormatter
|
Chris@0
|
85 class Formatter
|
Chris@0
|
86 include ActionView::Helpers::TagHelper
|
Chris@0
|
87 include ActionView::Helpers::TextHelper
|
Chris@0
|
88 include ActionView::Helpers::UrlHelper
|
Chris@909
|
89
|
Chris@0
|
90 def initialize(text)
|
Chris@0
|
91 @text = text
|
Chris@0
|
92 end
|
Chris@909
|
93
|
Chris@0
|
94 def to_html(*args)
|
Chris@0
|
95 simple_format(auto_link(CGI::escapeHTML(@text)))
|
Chris@0
|
96 end
|
Chris@0
|
97 end
|
Chris@909
|
98
|
Chris@0
|
99 module Helper
|
Chris@0
|
100 def wikitoolbar_for(field_id)
|
Chris@0
|
101 end
|
Chris@909
|
102
|
Chris@0
|
103 def heads_for_wiki_formatter
|
Chris@0
|
104 end
|
Chris@909
|
105
|
Chris@0
|
106 def initial_page_content(page)
|
Chris@0
|
107 page.pretty_title.to_s
|
Chris@0
|
108 end
|
Chris@0
|
109 end
|
Chris@0
|
110 end
|
Chris@0
|
111 end
|
Chris@0
|
112 end
|