diff --git a/lib/gollum.rb b/lib/gollum.rb index 4cd6764e..c88747ab 100644 --- a/lib/gollum.rb +++ b/lib/gollum.rb @@ -29,9 +29,10 @@ module Gollum @@filters[pattern] = replacement end - def self.apply_filters(data) + def self.apply_filters(wiki_page, data) @@filters.each do |pattern, replacement| - data.gsub!(pattern, replacement.call) + params = replacement.parameters.length == 0 ? nil : wiki_page + data.gsub!(pattern, replacement.call(*params)) end data end diff --git a/lib/gollum/app.rb b/lib/gollum/app.rb index 28e0fc39..7e3f57cf 100644 --- a/lib/gollum/app.rb +++ b/lib/gollum/app.rb @@ -369,7 +369,7 @@ module Precious @name = wikip.name @ext = wikip.ext @path = wikip.path - @template_page = load_template(@path) if settings.wiki_options[:template_page] + @template_page = load_template(wikip, @path) if settings.wiki_options[:template_page] @allow_uploads = wikip.wiki.allow_uploads @upload_dest = find_upload_dest(wikip.fullpath) @@ -661,9 +661,9 @@ module Precious end end - def load_template(path) + def load_template(wiki_page, path) template_page = wiki_page(::File.join(path, '_Template')).page || wiki_page('/_Template').page - template_page ? Gollum::TemplateFilter.apply_filters(template_page.text_data) : nil + template_page ? Gollum::TemplateFilter.apply_filters(wiki_page, template_page.text_data) : nil end def update_wiki_page(wiki, page, content, commit, name = nil, format = nil) diff --git a/test/test_app.rb b/test/test_app.rb index 5d78e006..d3710ee1 100644 --- a/test/test_app.rb +++ b/test/test_app.rb @@ -344,6 +344,45 @@ EOF Precious::App.set(:wiki_options, { :template_page => false }) end + test "create with template filter without parameter" do + Precious::App.set(:wiki_options, { :template_page => true }) + + # arrange + now = Time.parse('2022-04-16') + Gollum::TemplateFilter.add_filter("{{today}}", & -> () { now.strftime("%Y-%m-%d") }) + template_content = "# Daily Log, {{today}}" + + @wiki.write_page("daily-logs/_Template", + :markdown, + template_content) + # act + get "/gollum/create/daily-logs/test" + # assert + assert last_response.ok? + assert_match("# Daily Log, 2022-04-16", last_response.body) + + Precious::App.set(:wiki_options, { :template_page => false }) + end + + test "create with template filter with parameter" do + Precious::App.set(:wiki_options, { :template_page => true }) + + # arrange + Gollum::TemplateFilter.add_filter("{{page_name}}", & -> (page) { page.name }) + template_content = "# Daily Log, {{page_name}}" + + @wiki.write_page("daily-logs/_Template", + :markdown, + template_content) + # act + get "/gollum/create/daily-logs/2022-04-16" + # assert + assert last_response.ok? + assert_match("# Daily Log, 2022-04-16", last_response.body) + + Precious::App.set(:wiki_options, { :template_page => false }) + end + test "edit returns nil for non-existant page" do # post '/edit' fails. post '/edit/' works. page = 'not-real-page'