annotate lib/redmine/wiki_formatting.rb @ 1478:5ca1f4a47171 bibplugin_db_migrations

Close obsolete branch bibplugin_db_migrations
author Chris Cannam
date Fri, 30 Nov 2012 14:40:50 +0000
parents cbb26bc654de
children 433d4f72a19b
rev   line source
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