From 6452ebf49f753507f26a73f9acbfc181a395e7f0 Mon Sep 17 00:00:00 2001 From: MAEDA Go Date: Sun, 18 Oct 2026 16:15:41 +0900 Subject: [PATCH 1/2] Describe Mermaid diagrams in the wiki syntax help pages Add a Mermaid diagrams row to the quick reference and a section to the detailed help for both Textile and CommonMark Markdown, in English and Japanese. The section explains that diagrams are rendered only when the administrator has installed Mermaid.js, and that a rendered diagram can be downloaded as a PNG image. The example diagrams are PNG images saved with the download link of rendered Mermaid diagrams, so that the help pages show what users actually get and the images can be regenerated in the same way. The images have twice the display resolution, and their width is specified so that they look sharp on high-density displays. The labels are in English and the images are shared by all languages. Images in the quick reference are limited to the cell width so that they do not overflow narrow windows. Co-Authored-By: Claude Opus 5.5 --- .../help/mermaid_flowchart_decision.png | Bin 0 -> 31768 bytes .../images/help/mermaid_flowchart_simple.png | Bin 0 -> 7203 bytes app/assets/stylesheets/wiki_syntax.css | 1 + .../en/wiki_syntax_common_mark.html.erb | 3 ++ .../wiki_syntax_detailed_common_mark.html.erb | 32 ++++++++++++++++++ .../ja/wiki_syntax_common_mark.html.erb | 3 ++ .../wiki_syntax_detailed_common_mark.html.erb | 32 ++++++++++++++++++ .../en/wiki_syntax_detailed_textile.html.erb | 32 ++++++++++++++++++ .../textile/en/wiki_syntax_textile.html.erb | 3 ++ .../ja/wiki_syntax_detailed_textile.html.erb | 32 ++++++++++++++++++ .../textile/ja/wiki_syntax_textile.html.erb | 3 ++ test/functional/help_controller_test.rb | 12 +++++++ 12 files changed, 153 insertions(+) create mode 100644 app/assets/images/help/mermaid_flowchart_decision.png create mode 100644 app/assets/images/help/mermaid_flowchart_simple.png diff --git a/app/assets/images/help/mermaid_flowchart_decision.png b/app/assets/images/help/mermaid_flowchart_decision.png new file mode 100644 index 0000000000000000000000000000000000000000..f009dfefef85f412ed3114d6741a7974cb09470b GIT binary patch literal 31768 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 KCz6gCd;SkVHk6hC literal 0 HcmV?d00001 diff --git a/app/assets/images/help/mermaid_flowchart_simple.png b/app/assets/images/help/mermaid_flowchart_simple.png new file mode 100644 index 0000000000000000000000000000000000000000..8aa038c18ebf18a5e7a44eb16e8d657ae8fa165a GIT binary patch literal 7203 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 literal 0 HcmV?d00001 diff --git a/app/assets/stylesheets/wiki_syntax.css b/app/assets/stylesheets/wiki_syntax.css index 9699f4dc6..ae69d4a82 100644 --- a/app/assets/stylesheets/wiki_syntax.css +++ b/app/assets/stylesheets/wiki_syntax.css @@ -58,6 +58,7 @@ table th .syntax-pre:before { } table td { background-color: var(--oc-gray-0); block-size: 2em; vertical-align: middle;} table td code { font-size: 1.2em; } +table td img { max-width: 100%; } table td h1 { font-size: 1.8em; text-align: start; } table td h2 { font-size: 1.4em; text-align: start; } table td h3 { font-size: 1.2em; text-align: start; } diff --git a/app/views/help/wiki_syntax/common_mark/en/wiki_syntax_common_mark.html.erb b/app/views/help/wiki_syntax/common_mark/en/wiki_syntax_common_mark.html.erb index a0e7f005d..0b99cf06e 100644 --- a/app/views/help/wiki_syntax/common_mark/en/wiki_syntax_common_mark.html.erb +++ b/app/views/help/wiki_syntax/common_mark/en/wiki_syntax_common_mark.html.erb @@ -30,6 +30,9 @@ +Mermaid diagrams (" target="_blank">more) +```mermaid
flowchart TD
  A[Start] --> B[End]
```<%= image_tag("help/mermaid_flowchart_simple.png", width: 168, alt: "Flowchart from Start to End") %> + Line breaks and Paragraphs An empty line

creates
a new paragraph.

An empty line

creates a new paragraph.

End a line with a backslash\
or two spaces to insert a manual line break.

End a line with a backslash
or two spaces to insert a manual line break.

diff --git a/app/views/help/wiki_syntax/common_mark/en/wiki_syntax_detailed_common_mark.html.erb b/app/views/help/wiki_syntax/common_mark/en/wiki_syntax_detailed_common_mark.html.erb index 3f9793eba..7b4954396 100644 --- a/app/views/help/wiki_syntax/common_mark/en/wiki_syntax_detailed_common_mark.html.erb +++ b/app/views/help/wiki_syntax/common_mark/en/wiki_syntax_detailed_common_mark.html.erb @@ -26,6 +26,7 @@
  • Macros
  • Code highlighting
  • +
  • Mermaid diagrams
  • Raw HTML
  • Alerts
  • @@ -346,6 +347,37 @@ It can be expanded by clicking a link. end +

    Mermaid diagrams

    + +

    Code blocks written in the mermaid language are rendered as diagrams, such as flowcharts, sequence diagrams and Gantt charts, by Mermaid.js. Please refer to the Mermaid syntax reference for the available diagrams and their syntax.<% if Redmine::Mermaid.installed_version %> Please note that the reference describes the latest version of Mermaid.js, and some of the syntax described there may not be supported by the installed version, <%= Redmine::Mermaid.installed_version %>.<% end %>

    + +

    Mermaid.js is not bundled with Redmine, and diagrams are rendered only if the administrator has installed it. Otherwise, the code is displayed as a plain code block.

    + +

    You can draw a diagram at any place that supports wiki formatting using this syntax:

    + +
    +```mermaid
    +  Place your diagram definition here.
    +```
    +
    + +

    Example:

    + +
    +```mermaid
    +flowchart LR
    +  A[New issue] --> B{Reproducible?}
    +  B -->|Yes| C[Fix]
    +  B -->|No| D[Close]
    +```
    +
    + +

    yields

    + +<%= image_tag("help/mermaid_flowchart_decision.png", width: 635, alt: "Flowchart: a new issue is fixed if it is reproducible, and closed otherwise") %> + +

    A rendered diagram can be downloaded as a PNG image.

    +

    Raw HTML

    You may use raw HTML for more complex formatting tasks, i.e. complex tables with cells spanning multiple rows or columns:

    diff --git a/app/views/help/wiki_syntax/common_mark/ja/wiki_syntax_common_mark.html.erb b/app/views/help/wiki_syntax/common_mark/ja/wiki_syntax_common_mark.html.erb index 2e6c1314e..c59864cb3 100644 --- a/app/views/help/wiki_syntax/common_mark/ja/wiki_syntax_common_mark.html.erb +++ b/app/views/help/wiki_syntax/common_mark/ja/wiki_syntax_common_mark.html.erb @@ -30,6 +30,9 @@ +Mermaidによる図 (" target="_blank">詳細) +```mermaid
    flowchart TD
      A[Start] --> B[End]
    ```<%= image_tag("help/mermaid_flowchart_simple.png", width: 168, alt: "StartからEndへのフローチャート") %> + 改行と段落 空行は

    新しい段落を
    作ります

    空行は

    新しい段落を作ります

    バックスラッシュで終わる行\
    または半角スペース2個で改行を挿入します

    バックスラッシュで終わる行
    または空白2個で改行を挿入します

    diff --git a/app/views/help/wiki_syntax/common_mark/ja/wiki_syntax_detailed_common_mark.html.erb b/app/views/help/wiki_syntax/common_mark/ja/wiki_syntax_detailed_common_mark.html.erb index 83ce78646..ceb6af97b 100644 --- a/app/views/help/wiki_syntax/common_mark/ja/wiki_syntax_detailed_common_mark.html.erb +++ b/app/views/help/wiki_syntax/common_mark/ja/wiki_syntax_detailed_common_mark.html.erb @@ -26,6 +26,7 @@
  • マクロ
  • コードハイライト
  • +
  • Mermaidによる図
  • HTMLを直接使用する
  • アラートボックス
  • @@ -346,6 +347,37 @@ To go live, all you need to add is a database and a web server. end +

    Mermaidによる図

    + +

    言語に mermaid を指定したコードブロックは、Mermaid.js によってフローチャート・シーケンス図・ガントチャートなどの図として表示されます。利用できる図の種類と記法は Mermaidの記法リファレンス を参照してください。<% if Redmine::Mermaid.installed_version %>なお、記法リファレンスは最新バージョンのMermaid.jsについて書かれているため、記載されている記法の一部はインストールされているバージョン(<%= Redmine::Mermaid.installed_version %>)では使用できない場合があります。<% end %>

    + +

    Mermaid.js はRedmineには同梱されておらず、管理者がインストールした場合にのみ図が表示されます。インストールされていない場合は通常のコードブロックとして表示されます。

    + +

    Wiki記法に対応している箇所であればどこでも以下の記述により図を描くことができます:

    + +
    +```mermaid
    +  Place your diagram definition here.
    +```
    +
    + +

    表示例:

    + +
    +```mermaid
    +flowchart LR
    +  A[New issue] --> B{Reproducible?}
    +  B -->|Yes| C[Fix]
    +  B -->|No| D[Close]
    +```
    +
    + +

    以下のようになります

    + +<%= image_tag("help/mermaid_flowchart_decision.png", width: 635, alt: "New issueがReproducible?ならFix、そうでなければCloseに進むフローチャート") %> + +

    表示された図はPNG画像としてダウンロードできます。

    +

    HTMLを直接使用する

    複数の行や列がが結合している表のような複雑なフォーマットを記述したいときはMarkdown記法を使わずHTMLを直接書くこともできます。

    diff --git a/app/views/help/wiki_syntax/textile/en/wiki_syntax_detailed_textile.html.erb b/app/views/help/wiki_syntax/textile/en/wiki_syntax_detailed_textile.html.erb index ff262a401..6abcc2b79 100644 --- a/app/views/help/wiki_syntax/textile/en/wiki_syntax_detailed_textile.html.erb +++ b/app/views/help/wiki_syntax/textile/en/wiki_syntax_detailed_textile.html.erb @@ -27,6 +27,7 @@
  • Macros
  • Code highlighting
  • +
  • Mermaid diagrams
  • Links

    @@ -351,5 +352,36 @@ It can be expanded by clicking a link. end end + +

    Mermaid diagrams

    + +

    Code blocks written in the mermaid language are rendered as diagrams, such as flowcharts, sequence diagrams and Gantt charts, by Mermaid.js. Please refer to the Mermaid syntax reference for the available diagrams and their syntax.<% if Redmine::Mermaid.installed_version %> Please note that the reference describes the latest version of Mermaid.js, and some of the syntax described there may not be supported by the installed version, <%= Redmine::Mermaid.installed_version %>.<% end %>

    + +

    Mermaid.js is not bundled with Redmine, and diagrams are rendered only if the administrator has installed it. Otherwise, the code is displayed as a plain code block.

    + +

    You can draw a diagram at any place that supports wiki formatting using this syntax:

    + +
    +<pre><code class="mermaid">
    +  Place your diagram definition here.
    +</code></pre>
    +
    + +

    Example:

    + +
    +<pre><code class="mermaid">
    +flowchart LR
    +  A[New issue] --> B{Reproducible?}
    +  B -->|Yes| C[Fix]
    +  B -->|No| D[Close]
    +</code></pre>
    +
    + +

    yields

    + +<%= image_tag("help/mermaid_flowchart_decision.png", width: 635, alt: "Flowchart: a new issue is fixed if it is reproducible, and closed otherwise") %> + +

    A rendered diagram can be downloaded as a PNG image.

    diff --git a/app/views/help/wiki_syntax/textile/en/wiki_syntax_textile.html.erb b/app/views/help/wiki_syntax/textile/en/wiki_syntax_textile.html.erb index f02d5ac45..939f2b9cc 100644 --- a/app/views/help/wiki_syntax/textile/en/wiki_syntax_textile.html.erb +++ b/app/views/help/wiki_syntax/textile/en/wiki_syntax_textile.html.erb @@ -32,6 +32,9 @@ +Mermaid diagrams (" target="_blank">more) +<pre><code class="mermaid">
    flowchart TD
      A[Start] --> B[End]
    </code></pre><%= image_tag("help/mermaid_flowchart_simple.png", width: 168, alt: "Flowchart from Start to End") %> + Lists <%= image_tag("jstoolbar/list.svg", { alt: "Unordered list" }) %>* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    <%= image_tag("jstoolbar/list-numbers.svg", { alt: "Ordered list" }) %># Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    diff --git a/app/views/help/wiki_syntax/textile/ja/wiki_syntax_detailed_textile.html.erb b/app/views/help/wiki_syntax/textile/ja/wiki_syntax_detailed_textile.html.erb index 5a6008c89..03bdaf017 100644 --- a/app/views/help/wiki_syntax/textile/ja/wiki_syntax_detailed_textile.html.erb +++ b/app/views/help/wiki_syntax/textile/ja/wiki_syntax_detailed_textile.html.erb @@ -27,6 +27,7 @@
  • マクロ
  • コードハイライト
  • +
  • Mermaidによる図
  • リンク

    @@ -351,5 +352,36 @@ To go live, all you need to add is a database and a web server. end end + +

    Mermaidによる図

    + +

    言語に mermaid を指定したコードブロックは、Mermaid.js によってフローチャート・シーケンス図・ガントチャートなどの図として表示されます。利用できる図の種類と記法は Mermaidの記法リファレンス を参照してください。<% if Redmine::Mermaid.installed_version %>なお、記法リファレンスは最新バージョンのMermaid.jsについて書かれているため、記載されている記法の一部はインストールされているバージョン(<%= Redmine::Mermaid.installed_version %>)では使用できない場合があります。<% end %>

    + +

    Mermaid.js はRedmineには同梱されておらず、管理者がインストールした場合にのみ図が表示されます。インストールされていない場合は通常のコードブロックとして表示されます。

    + +

    Wiki記法に対応している箇所であればどこでも以下の記述により図を描くことができます:

    + +
    +<pre><code class="mermaid">
    +  Place your diagram definition here.
    +</code></pre>
    +
    + +

    表示例:

    + +
    +<pre><code class="mermaid">
    +flowchart LR
    +  A[New issue] --> B{Reproducible?}
    +  B -->|Yes| C[Fix]
    +  B -->|No| D[Close]
    +</code></pre>
    +
    + +

    以下のようになります

    + +<%= image_tag("help/mermaid_flowchart_decision.png", width: 635, alt: "New issueがReproducible?ならFix、そうでなければCloseに進むフローチャート") %> + +

    表示された図はPNG画像としてダウンロードできます。

    diff --git a/app/views/help/wiki_syntax/textile/ja/wiki_syntax_textile.html.erb b/app/views/help/wiki_syntax/textile/ja/wiki_syntax_textile.html.erb index 35cbaf948..317937255 100644 --- a/app/views/help/wiki_syntax/textile/ja/wiki_syntax_textile.html.erb +++ b/app/views/help/wiki_syntax/textile/ja/wiki_syntax_textile.html.erb @@ -32,6 +32,9 @@ +Mermaidによる図 (" target="_blank">詳細) +<pre><code class="mermaid">
    flowchart TD
      A[Start] --> B[End]
    </code></pre><%= image_tag("help/mermaid_flowchart_simple.png", width: 168, alt: "StartからEndへのフローチャート") %> + リスト <%= image_tag("jstoolbar/list.svg", { alt: "リスト" }) %>* 項目1
    ** 下位階層の項目
    * 項目2
    • 項目1
      • 下位階層の項目
    • 項目2
    <%= image_tag("jstoolbar/list-numbers.svg", { alt: "順序付きリスト" }) %># 項目1
    ## 下位階層の項目
    # 項目2
    1. 項目1
      1. 下位階層の項目
    2. 項目2
    diff --git a/test/functional/help_controller_test.rb b/test/functional/help_controller_test.rb index 0aeaba5da..8b5b9d8ea 100644 --- a/test/functional/help_controller_test.rb +++ b/test/functional/help_controller_test.rb @@ -54,6 +54,18 @@ class HelpControllerTest < Redmine::ControllerTest end end + def test_get_help_wiki_syntax_detailed_should_show_installed_mermaid_version + Redmine::Mermaid.stubs(:installed_version).returns('12.0.0') + get :show_wiki_syntax, :params => {:type => 'detailed'} + assert_response :success + assert_select 'p', :text => /not be supported by the installed version, 12\.0\.0\./ + + Redmine::Mermaid.stubs(:installed_version).returns(nil) + get :show_wiki_syntax, :params => {:type => 'detailed'} + assert_response :success + assert_select 'p', :text => /installed version/, :count => 0 + end + def test_get_help_wiki_syntax_should_return_lang_if_available user = User.find(2) user.language = 'de' -- 2.55.0