diff --git a/lib/open_project/documents/engine.rb b/lib/open_project/documents/engine.rb index b01dc41c12..89d8428784 100644 --- a/lib/open_project/documents/engine.rb +++ b/lib/open_project/documents/engine.rb @@ -79,7 +79,11 @@ module OpenProject::Documents # Have to apply this one by hand and not via op_engine patches method # becauses the op_engine method does not allow for patching something # in the lib/open_project directory. Bummer. - require 'open_project/documents/patches/text_formatting_patch' + require_relative 'patches/text_formatting_patch' + OpenProject::Documents::Patches::ColonSeparatorPatch.mixin! + OpenProject::Documents::Patches::HashSeparatorPatch.mixin! + + require_dependency 'open_project/documents/patches/textile_converter_patch' end end end diff --git a/lib/open_project/documents/patches/text_formatting_patch.rb b/lib/open_project/documents/patches/text_formatting_patch.rb index 7c2640cf71..184947ef46 100644 --- a/lib/open_project/documents/patches/text_formatting_patch.rb +++ b/lib/open_project/documents/patches/text_formatting_patch.rb @@ -30,54 +30,58 @@ #++ module OpenProject::Documents::Patches - module TextFormattingPatch - def self.included(base) - base.class_eval do + module HashSeparatorPatch + def self.mixin! + base = ::OpenProject::TextFormatting::Matchers::LinkHandlers::HashSeparator + base.prepend InstanceMethods + base.singleton_class.prepend ClassMethods + end - def parse_redmine_links_with_documents(text, project, obj, attr, only_path, options) - text.gsub!(/([\s\(,\-\[\>]|^)(!)?(([a-z0-9\-_]+):)?(document)((#+|r)(\d+)|(:)([^"\s<>][^\s<>]*?|"[^"]+?"))(?=(?=[[:punct:]]\W)|,|\s|\]|<|$)/) do |_m| - leading = $1 - esc = $2 - project_prefix = $3 - project_identifier = $4 - prefix = $5 - sep = $7 || $9 - identifier = $8 || $10 - link = nil - if project_identifier - project = Project.visible.find_by_identifier(project_identifier) - end - if esc.nil? - if sep == '#' - oid = identifier.to_i - document = Document.visible.find_by_id(oid) - elsif sep == ':' && project - name = identifier.gsub(%r{^"(.*)"$}, "\\1") - document = project.documents.visible.find_by_title(name) - end - if document - link = link_to document.title, { - only_path: only_path, - controller: '/documents', - action: 'show', id: document }, + module InstanceMethods + def render_document + if document = Document.visible.find_by_id(oid) + link_to document.title, + { only_path: context[:only_path], + controller: '/documents', + action: 'show', + id: document }, class: 'document' - end - end - leading + (link || "#{project_prefix}#{prefix}#{sep}#{identifier}") - end - - parse_redmine_links_without_documents(text, project, obj, attr, only_path, options) end + end + end - alias_method :parse_redmine_links_without_documents, :parse_redmine_links - alias_method :parse_redmine_links, :parse_redmine_links_with_documents + module ClassMethods + def allowed_prefixes + super + %w[document] end + end + end + module ColonSeparatorPatch + def self.mixin! + base = ::OpenProject::TextFormatting::Matchers::LinkHandlers::ColonSeparator + base.prepend InstanceMethods + base.singleton_class.prepend ClassMethods end - end -end + module InstanceMethods + def render_document + name = identifier.gsub(%r{^"(.*)"$}, "\\1") + if document = project.documents.visible.find_by_title(name) + link_to document.title, + { only_path: context[:only_path], + controller: '/documents', + action: 'show', + id: document }, + class: 'document' + end + end + end -unless OpenProject::TextFormatting.included_modules.include?(OpenProject::Documents::Patches::TextFormattingPatch) - OpenProject::TextFormatting.send(:include, OpenProject::Documents::Patches::TextFormattingPatch) + module ClassMethods + def allowed_prefixes + super + %w[document] + end + end + end end diff --git a/lib/open_project/documents/patches/textile_converter_patch.rb b/lib/open_project/documents/patches/textile_converter_patch.rb new file mode 100644 index 0000000000..72d7253e6c --- /dev/null +++ b/lib/open_project/documents/patches/textile_converter_patch.rb @@ -0,0 +1,42 @@ +#-- copyright +# OpenProject Documents Plugin +# +# Former OpenProject Core functionality extracted into a plugin. +# +# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#+ + +module OpenProject::Documents::Patches + module TextileConverterPatch + def models_to_convert + super + { ::Document => [:description] } + end + end +end + +::OpenProject::TextFormatting::Formatters::Markdown::TextileConverter.prepend( + ::OpenProject::Documents::Patches::TextileConverterPatch +) \ No newline at end of file