diff options
author | Marius Balteanu <marius.balteanu@zitec.com> | 2025-04-27 06:58:32 +0000 |
---|---|---|
committer | Marius Balteanu <marius.balteanu@zitec.com> | 2025-04-27 06:58:32 +0000 |
commit | 6faaf3d038d1ca6621653422c25df2c7fc231a61 (patch) | |
tree | 2a8cefdec85ebd97b21d94ba69d7dc2fc28685dc /lib/redmine/wiki_formatting/common_mark | |
parent | 235179d13ac23049a5696f5adf0f0d23aa94c773 (diff) | |
download | redmine-6faaf3d038d1ca6621653422c25df2c7fc231a61.tar.gz redmine-6faaf3d038d1ca6621653422c25df2c7fc231a61.zip |
Replaces deckar01-task_list gem with commonmarks tasklist extension (#42602).
git-svn-id: https://svn.redmine.org/redmine/trunk@23718 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'lib/redmine/wiki_formatting/common_mark')
-rw-r--r-- | lib/redmine/wiki_formatting/common_mark/formatter.rb | 7 | ||||
-rw-r--r-- | lib/redmine/wiki_formatting/common_mark/sanitization_filter.rb | 48 |
2 files changed, 46 insertions, 9 deletions
diff --git a/lib/redmine/wiki_formatting/common_mark/formatter.rb b/lib/redmine/wiki_formatting/common_mark/formatter.rb index eb765b6d6..b695fb854 100644 --- a/lib/redmine/wiki_formatting/common_mark/formatter.rb +++ b/lib/redmine/wiki_formatting/common_mark/formatter.rb @@ -18,7 +18,6 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. require 'html/pipeline' -require 'task_list/filter' module Redmine module WikiFormatting @@ -33,7 +32,7 @@ module Redmine autolink: true, footnotes: true, header_ids: nil, - tasklist: false, + tasklist: true, shortcodes: false, }.freeze, @@ -46,6 +45,7 @@ module Redmine unsafe: true, github_pre_lang: false, hardbreaks: Redmine::Configuration['common_mark_enable_hardbreaks'] == true, + tasklist_classes: true, }.freeze, commonmarker_plugins: { syntax_highlighter: nil @@ -57,8 +57,7 @@ module Redmine SanitizationFilter, SyntaxHighlightFilter, FixupAutoLinksFilter, - ExternalLinksFilter, - TaskList::Filter + ExternalLinksFilter ], PIPELINE_CONFIG class Formatter diff --git a/lib/redmine/wiki_formatting/common_mark/sanitization_filter.rb b/lib/redmine/wiki_formatting/common_mark/sanitization_filter.rb index cdefc372b..e603d9f7f 100644 --- a/lib/redmine/wiki_formatting/common_mark/sanitization_filter.rb +++ b/lib/redmine/wiki_formatting/common_mark/sanitization_filter.rb @@ -78,20 +78,58 @@ module Redmine # allowlist[:attributes]["td"] = %w(style) # allowlist[:css] = { properties: ["text-align"] } - # Allow `id` in a and li elements for footnotes - # and remove any `id` properties not matching for footnotes + # Allow `id` in a elements for footnotes allowlist[:attributes]["a"].push "id" - allowlist[:attributes]["li"] = %w(id) + # Remove any `id` property not matching for footnotes allowlist[:transformers].push lambda{|env| node = env[:node] - return unless node.name == "a" || node.name == "li" + return unless node.name == "a" return unless node.has_attribute?("id") return if node.name == "a" && node["id"] =~ /\Afnref-\d+\z/ - return if node.name == "li" && node["id"] =~ /\Afn-\d+\z/ node.remove_attribute("id") } + # allow `id` in li element for footnotes + # allow `class` in li element for task list items + allowlist[:attributes]["li"] = %w(id class) + allowlist[:transformers].push lambda{|env| + node = env[:node] + return unless node.name == "li" + + if node.has_attribute?("id") && !(node["id"] =~ /\Afn-\d+\z/) + node.remove_attribute("id") + end + + if node.has_attribute?("class") && node["class"] != "task-list-item" + node.remove_attribute("class") + end + } + + # allow input type = "checkbox" with class "task-list-item-checkbox" + # for task list items + allowlist[:elements].push('input') + allowlist[:attributes]["input"] = %w(class type) + allowlist[:transformers].push lambda{|env| + node = env[:node] + + return unless node.name == "input" + return if node['type'] == "checkbox" && node['class'] == "task-list-item-checkbox" + + node.replace(node.children) + } + + # allow class "contains-task-list" on ul for task list items + allowlist[:attributes]["ul"] = %w(class) + allowlist[:transformers].push lambda{|env| + node = env[:node] + + return unless node.name == "ul" + return if node["class"] == "contains-task-list" + + node.remove_attribute("class") + } + # https://github.com/rgrove/sanitize/issues/209 allowlist[:protocols].delete("a") allowlist[:transformers].push lambda{|env| |