プロジェクト毎のフォーマッタ

Redmine は Wiki フォーマッタがプラガブルになっているので、プラグインを入れて複数のフォーマットから選択することができます。

Redmine 404 error によると、Redmin 標準の Textile の他に Markdown, Markdown Extra, RD, reStructuredText, WikiCreole などがあるようです。

ですが、フォーマッタは Redmine システム全体で一つしか選択することができません。新しいプロジェクトに Markdown を使いたいけど、古いプロジェクトの Wiki を今さら変更できないからしょうがなく Textile を使ったりしてました。

ということで、プロジェクト毎にフォーマッタを選択できるようなパッチを作ってみました(プラグイン化しようとしたんですが断念しました)。

--- app/helpers/application_helper.rb.orig	2010-08-23 04:49:31.000000000 +0900
+++ app/helpers/application_helper.rb	2010-09-23 14:20:05.000000000 +0900
@@ -448,7 +448,7 @@
     project = options[:project] || @project || (obj && obj.respond_to?(:project) ? obj.project : nil)
     only_path = options.delete(:only_path) == false ? false : true
 
-    text = Redmine::WikiFormatting.to_html(Setting.text_formatting, text, :object => obj, :attribute => attr) { |macro, args| exec_macro(macro, obj, args) }
+    text = Redmine::WikiFormatting.to_html(project_formatter(project), text, :object => obj, :attribute => attr) { |macro, args| exec_macro(macro, obj, args) }
       
     parse_non_pre_blocks(text) do |text|
       [:parse_inline_attachments, :parse_wiki_links, :parse_redmine_links].each do |method_name|
@@ -823,7 +823,7 @@
   private
 
   def wiki_helper
-    helper = Redmine::WikiFormatting.helper_for(Setting.text_formatting)
+    helper = Redmine::WikiFormatting.helper_for(project_formatter(@project))
     extend helper
     return self
   end
@@ -835,4 +835,16 @@
     )
   end
   
+  def project_formatter(project)
+    return Setting.text_formatting unless project
+    project.custom_field_values.each do |v|
+      if v.custom_field.name == "formatter"
+        if Redmine::WikiFormatting.format_names.include? v.value
+          return v.value
+        end
+        break
+      end
+    end
+    Setting.text_formatting
+  end
 end
  1. 使用したいフォーマッタのプラグインをインストール
  2. このパッチを適用
  3. 管理→カスタムフィールド→プロジェクト→新しいカスタムフィールドを作成 で、formatter という名前のカスタムフィールドを作成
  4. 各プロジェクトの 設定→情報の formatter にフォーマッタの名前(「Markdown Extra」等)を指定

以上でプロジェクトの Wiki, チケット, 概要等に指定したフォーマッタを使用することができます。

当然、フォーマッタが異なる別のプロジェクトにチケット移動した場合は、表示が崩れるのでご注意を。