From ded6d960c0f9ccf389dcb3818c0c864d5891dc7d Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Tue, 14 Apr 2026 16:47:17 +0200 Subject: [PATCH] Allow to extend PatternMatcherFilters via method call Instead of requiring plugins to overwrite the .matchers method, they can now call .append_matcher with their custom matcher. --- config/initializers/text_formatting.rb | 39 +++++++++++++++++++ .../filters/pattern_matcher_filter.rb | 14 ++++--- 2 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 config/initializers/text_formatting.rb diff --git a/config/initializers/text_formatting.rb b/config/initializers/text_formatting.rb new file mode 100644 index 00000000000..e6a51576830 --- /dev/null +++ b/config/initializers/text_formatting.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# 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 COPYRIGHT and LICENSE files for more details. +#++ + +Rails.application.configure do |application| + application.config.to_prepare do + namespace = OpenProject::TextFormatting + + namespace::Filters::PatternMatcherFilter.append_matcher namespace::Matchers::ResourceLinksMatcher + namespace::Filters::PatternMatcherFilter.append_matcher namespace::Matchers::WikiLinksMatcher + namespace::Filters::PatternMatcherFilter.append_matcher namespace::Matchers::AttributeMacros + end +end diff --git a/lib/open_project/text_formatting/filters/pattern_matcher_filter.rb b/lib/open_project/text_formatting/filters/pattern_matcher_filter.rb index ab411734562..98096983d48 100644 --- a/lib/open_project/text_formatting/filters/pattern_matcher_filter.rb +++ b/lib/open_project/text_formatting/filters/pattern_matcher_filter.rb @@ -34,12 +34,14 @@ module OpenProject::TextFormatting # Skip text nodes that are within preformatted blocks PREFORMATTED_BLOCKS = %w(pre code).to_set - def self.matchers - [ - OpenProject::TextFormatting::Matchers::ResourceLinksMatcher, - OpenProject::TextFormatting::Matchers::WikiLinksMatcher, - OpenProject::TextFormatting::Matchers::AttributeMacros - ] + class << self + def append_matcher(matcher) + matchers << matcher + end + + def matchers + @matchers ||= [] + end end def call