Pandoc の HTML 出力における改行コードは、デフォルトでプラットフォーム依存です。 Windows では \r\n (CRLF)、Linux や macOS では \n (LF) が使用されます。ただし、この動作は --eol オプションで明示的に制御可能であり、HTML 出力特有の実装ではなく、全てのテキスト形式の出力に適用されるファイル出力レベルの機能として設計されています。重要なのは、HTML Writer モジュール自体には改行コード処理のロジックが含まれておらず、出力パイプラインの最終段階で変換が行われることです。この設計により、クロスプラットフォーム開発における一貫性の問題に対処しながら、多くのユーザーが期待する OS 標準の動作も維持しています。
Pandoc のソースコード調査により、改行コード処理が個別の Writer モジュールではなく、ファイル出力ハンドラで実装されていることが判明しました。具体的な処理フローは以下の通りです。
入力ドキュメントが Reader で Pandoc AST (抽象構文木) に変換され、フィルタや変換処理を経た後、HTML Writer (src/Text/Pandoc/Writers/HTML.hs) が AST 構造を HTML 文字列に変換します。この段階では、HTML Writer は標準的な \n (LF) を使用してコンテンツを生成します。その後、Output Handler が --eol 設定に基づいて改行コードを変換し、最終的にファイルに書き込まれます。
ソースコードのディレクトリ構造では、以下のファイルが改行コード処理に関連しています。
src/Text/Pandoc/Options.hs - WriterOptions データ構造を定義 (EOL 設定を含む)src/Text/Pandoc/App/CommandLineOptions.hs - --eol を含むコマンドライン引数を解析src/Text/Pandoc/App/OutputSettings.hs - 出力設定と改行コード変換を処理src/Text/Pandoc/Writers/HTML.hs - HTML Writer 実装 (改行コードは直接処理しない)src/Text/Pandoc/Writers/Shared.hs - Writer 共通ユーティリティこの設計により、全ての出力フォーマット (HTML、Markdown、LaTeX、プレーンテキストなど) で統一的な改行コード処理が実現されています。
Pandoc は Haskell の条件付きコンパイルディレクティブを使用して Windows 環境を検出しています。ソースコード内には以下のようなパターンが見られます。
#ifdef _WINDOWS
import Data.List (isPrefixOf)
#endifこの #ifdef _WINDOWS ディレクティブにより、コンパイル時に Windows 特有のコードが組み込まれます。デフォルトの「native」モードでは、このプラットフォーム検出により、Windows では自動的に CRLF、Unix 系システムでは LF が使用される仕組みとなっています。
具体的な変換メカニズムは以下の通りです。
\n を \r\n に変換\n がそのまま維持される--eol=lf 指定 - 全プラットフォームで変換を抑制し、Unix 改行コードを維持--eol=crlf 指定 - 全プラットフォームで Windows 改行コードを強制この機能は段階的に開発されました。
ユーザーから、Linux と Windows 間で同じ入力ファイルから生成された HTML 出力の改行コードが異なることで、Git リポジトリ内で不要な差分が発生する問題が報告されました。ユーザーは以下を期待していました。
正式な機能リクエストが提出され、開発者コミュニティで議論されました。Issue 内の重要な引用は以下の通りです。
“OS 標準の EOL を使用することは、通常の使用では多くのユーザーが期待することかもしれません。しかし、クロスプラットフォームプロジェクトでは、このオプションにより標準を強制できるようになります。”
Stefan Dresselhaus によって実装され、以下の機能が追加されました。
--eol=crlf|lf|native コマンドラインフラグ現在の --eol オプションは以下の 3 つの値を受け付けます。
pandoc input.md -o output.html --eol=lf
pandoc input.md -o output.html --eol=crlf
pandoc input.md -o output.html --eol=native
pandoc input.md -o output.htmleol: lf # または crlf、nativeoutput:
html_document:
pandoc_args: --eol=lfビルドスクリプトで --eol=lf を明示的に指定し、全ての開発者の環境で一貫した出力を生成します。
CI 設定ファイルで --eol=lf (または組織の標準) を強制指定します。
self_contained: no オプション使用時に --eol=lf の効果が失われるレンダリング後に手動で改行コード変換を実行、または Pandoc の後処理フックを使用します。
入力ドキュメント
↓
[Reader] AST に解析
↓
[Filters/Transforms] フィルタと変換処理
↓
[Writer] AST → テキスト変換 (\n 使用)
↓
[Output Handler] --eol 設定に基づいて改行コード変換
↓
ファイル出力 (プラットフォーム適切または指定された改行コード)
以下の設計原則に基づいて実装されています。
--eol コマンドラインオプションで制御可能--eol オプションは以下のテキストベース出力フォーマットに影響します。
以下のように判断されています。
以下のフィードバックが得られています。
--eol オプション自体にプラットフォーム固有のバグや問題は報告されていない以下の対応を推奨します。
--eol=lf を指定して一貫性を保証.gitattributes と組み合わせて多層防御推奨設定例 (.gitattributes) を以下に示します。
*.html text eol=lf
*.md text eol=lf
以下の対応を推奨します。
--eol=lf を使用 (Unix 規則が標準).gitattributes と組み合わせて使用以下の対応を推奨します。
--eol=native が一般的に適切Pandoc の改行コード処理は、バグではなく意図的な設計判断です。調査により以下が明らかになりました。
src/Text/Pandoc/Writers/HTML.hs) から分離され、出力ハンドラ (src/Text/Pandoc/App/OutputSettings.hs) で実装#ifdef _WINDOWS 条件付きコンパイルを使用WriterOptions データ構造に EOL 設定を含め、柔軟性を提供--eol オプションにより、CI/CD パイプライン、Git リポジトリ管理、自動ドキュメント生成など、クロスプラットフォーム要件に対応\r\n (CRLF) がデフォルト、Linux では \n (LF) がデフォルト--eol=lf または --eol=crlf を指定することで統一可能