Use the setting formatter to replace the static base url

pull/9530/head
Oliver Günther 3 years ago
parent ee95ed34ed
commit 5ccb5af99e
No known key found for this signature in database
GPG Key ID: A3A8BDAD7C0C552C
  1. 2
      app/seeders/seeder.rb
  2. 3
      lib/open_project/text_formatting/filters/pattern_matcher_filter.rb
  3. 53
      lib/open_project/text_formatting/filters/setting_macros_filter.rb
  4. 1
      lib/open_project/text_formatting/formats/markdown/formatter.rb
  5. 2
      lib/open_project/text_formatting/formats/plain/formatter.rb
  6. 53
      spec/features/homescreen/index_spec.rb
  7. 6
      spec/lib/open_project/text_formatting/markdown/setting_variable_spec.rb

@ -66,7 +66,7 @@ class Seeder
# Translate the given string with the fixed interpolation for base_url
# Deep interpolation is required in order for interpolations on hashes to work!
def translate_with_base_url(string)
I18n.t(string, deep_interpolation: true, base_url: OpenProject::Configuration.rails_relative_url_root)
I18n.t(string, deep_interpolation: true, base_url: "opSetting:base_url")
end
def edition_data_for(key)

@ -38,8 +38,7 @@ module OpenProject::TextFormatting
[
OpenProject::TextFormatting::Matchers::ResourceLinksMatcher,
OpenProject::TextFormatting::Matchers::WikiLinksMatcher,
OpenProject::TextFormatting::Matchers::AttributeMacros,
OpenProject::TextFormatting::Matchers::SettingMacros
OpenProject::TextFormatting::Matchers::AttributeMacros
]
end

@ -0,0 +1,53 @@
#-- encoding: UTF-8
#-- copyright
# OpenProject is an open source project management software.
# Copyright (C) 2012-2021 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 docs/COPYRIGHT.rdoc for more details.
#++
module OpenProject::TextFormatting
module Filters
class SettingMacrosFilter < PatternMatcherFilter
def self.matchers
[
OpenProject::TextFormatting::Matchers::SettingMacros
]
end
def call
doc.search('.//text()|.//a[@href]').each do |node|
next if has_ancestor?(node, PREFORMATTED_BLOCKS)
self.class.matchers.each do |matcher|
matcher.call(node, doc: doc, context: context)
end
end
doc
end
end
end
end

@ -45,6 +45,7 @@ module OpenProject::TextFormatting::Formats::Markdown
def filters
%i[
markdown
setting_macros
sanitization
task_list
table_of_contents

@ -40,7 +40,7 @@ module OpenProject::TextFormatting::Formats
end
def filters
%i(plain pattern_matcher)
%i(plain setting_macros pattern_matcher)
end
def self.format

@ -0,0 +1,53 @@
#-- copyright
# OpenProject is an open source project management software.
# Copyright (C) 2012-2021 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 docs/COPYRIGHT.rdoc for more details.
#++
require 'spec_helper'
describe 'Homescreen index', type: :feature do
let!(:user) { FactoryBot.build_stubbed(:user) }
let!(:project) { FactoryBot.create(:public_project, identifier: 'public-project') }
before do
login_as user
visit root_url
end
describe 'with a dynamic URL in the welcome text',
with_settings: {
welcome_text: "With [a link to the public project](opSetting:base_url/projects/public-project)",
welcome_on_homescreen?: true
} do
it 'renders the correct link' do
expect(page)
.to have_selector("a[href=\"#{OpenProject::Application.root_url}/projects/public-project\"]")
click_link "a link to the public project"
expect(page).to have_current_path project_path(project)
end
end
end

@ -41,6 +41,8 @@ describe OpenProject::TextFormatting,
Inline reference to base_url variable: opSetting:base_url
[Link with setting](opSetting:base_url/foo/bar)
Inline reference to invalid variable: opSetting:smtp_password
Inline reference to missing variable: opSetting:does_not_exist
@ -55,6 +57,10 @@ describe OpenProject::TextFormatting,
<p class="op-uc-p">
Inline reference to base_url variable: #{OpenProject::Application.root_url}
</p>
<p class="op-uc-p">
<a href="#{OpenProject::Application.root_url}/foo/bar" rel="noopener noreferrer"
class="op-uc-link">Link with setting</a>
</p>
<p class="op-uc-p">
Inline reference to invalid variable: opSetting:smtp_password
</p>

Loading…
Cancel
Save