メインコンテンツへスキップ

JavaScript 用のネイティブファーストの高性能 Markdown プラグイン

最終更新日:

ネイティブ テキストエリアを完全な編集スイートに変換するマークダウン テキスト エディター プラグイン。同期は必要ありません。 WYSIWYG およびプレーン Markdown モード、ライブ プレビュー、検索と置換、RTL サポート、ダーク モード。 Django、Laravel、Rails、Node.js、PHP、およびあらゆるスタックで動作します。

理念:「ネイティブファースト」

ほとんどのエディターは標準的な Web ワークフローを破っています。 MarkdownEditor はこれを採用しています。 <textarea> の最上位に直接配置されるため、データを処理する新しい方法を学ぶ必要はありません。

  • データ バインディングは不要: すぐに <form method="POST"> で動作します。
  • 標準アクセス: 通常の入力と同じように document.getElementById('editor').value を使用します。
  • バックエンドに依存しない: 通常のフォーム フィールドと同様に、あらゆるバックエンド (Python、Node.js、PHP など) で動作します。

MarkdownEditor と EasyMDE / SimpleMDE の比較

ほとんどの JavaScript マークダウン エディター (EasyMDE、SimpleMDE、CodeMirror ベースのエディター) - <textarea> をカスタム要素に置き換えます。つまり、フォームの送信が中断され、.value は何も返さず、コンテンツを読み戻すためだけに追加のコードを記述する必要があります。 MarkdownEditor は とは異なります。既存のテキストエリアを拡張するものであり、置き換えることはありません。

特徴 マークダウンエディタ EasyMDE / SimpleMDE
ネイティブのテキストエリアが保持される ❌ 交換されました
フォーム送信はそのまま機能します ❌ 追加の JS が必要
.value 経由で値を取得/設定します ❌ カスタム API が必要
WYSIWYGハイブリッドモード
組み込みの検索と置換
RTLのサポート
CSP互換(インラインJSなし)
CSS 競合なし
ダークモード/テーマ設定 限定
バンドルサイズ ~116KB ~300KB以上

フレームワークの統合

MarkdownEditor はネイティブ <textarea> を保持するため、追加のコードなしですべてのバックエンド フレームワークと統合されます。サーバーは、標準のフォーム フィールドから受け取る場合とまったく同じように、マークダウン コンテンツを受け取ります。

Django

class をテキストエリア ウィジェットに追加し、エディタを初期化します。request.POST['content'] は追加の手順なしで機能します。

python
1
2
3
4
5
6
7
8
# forms.py
class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['content']
        widgets = {
            'content': forms.Textarea(attrs={'class': 'markdown-editor'}),
        }
javascript
1
2
new MarkdownEditor('.markdown-editor');
// request.POST['content'] contains the markdown on submit

Laravel

f.text_area をクラスで使用します。$request->input('content') はマークダウンを直接受け取ります。

html
1
2
<textarea name="content" class="markdown-editor">{{ old('content') }}</textarea>
<script>new MarkdownEditor('.markdown-editor');</script>

ルビー・オン・レール

そのまま form_with で動作します。params[:content] にはマークダウンが含まれています。ターボ ドライブの場合は、DOMContentLoaded の代わりに turbo:load を使用します。

javascript
1
2
3
4
5
6
document.addEventListener('turbo:load', () => {
    document.querySelectorAll('.markdown-editor:not([data-mde-init])').forEach(el => {
        el.setAttribute('data-mde-init', 'true');
        new MarkdownEditor(el);
    });
});

Node.js / Express

req.body.content は、フォーム送信時にマークダウンを受け取ります。同期ステップやカスタム抽出はありません。

html
1
2
3
<textarea name="content" class="markdown-editor"></textarea>
<script src="https://cdn.jsdelivr.net/npm/markdown-text-editor"></script>
<script>new MarkdownEditor('.markdown-editor');</script>

PHP

$_POST['content'] は、標準のテキストエリアとまったく同じように機能します。これをドロップすれば、既存のフォーム処理を変更する必要はありません。

html
1
2
3
4
5
6
<form method="POST" action="save.php">
  <textarea name="content" class="markdown-editor"></textarea>
  <button type="submit">Save</button>
</form>
<script src="https://cdn.jsdelivr.net/npm/markdown-text-editor"></script>
<script>new MarkdownEditor('.markdown-editor');</script>

主な特長

🖼️ 高度な画像アップロード (SEO に最適化)

重い Base64 文字列を使用してデータベースを肥大化させないでください。画像をサーバーまたは S3 バケットに直接アップロードするように API を設定します。エディターは URL を受け取り、Markdown ファイルを軽量に保ち、サイトの SEO ランキングを高く保ちます。

🔀 ハイブリッドモードとプレーンモード

両方の長所をユーザーに提供します。簡単な書式設定のためのビジュアル (WYSIWYG) ハイブリッド モードと、気を散らすことなく生の構文編集のためのプレーン マークダウン モードを切り替えます。

🌍 RTL サポートによるグローバル対応

Right-to-Left (RTL) 言語の完全なネイティブ サポート。自動テキスト方向調整によるアラビア語、ウルドゥー語、 ペルシャ語のサポートが必要なプロジェクトに最適です。

⚡ 大規模なパフォーマンス

  • 軽量: フットプリントが約 116 KB と小さいため、ページの読み込みが遅くなりません。
  • 大規模ドキュメントのサポート: 入力遅延やブラウザのフリーズを発生させずに数千行のテキストを処理できるように最適化されています。
  • スマート レンダリング: デバウンスされたプレビュー更新、キャッシュされたスタイル計算、リストの継続とインデント間の競合のないキーボード処理 - そのため、Tab と Enter は常に 1 つのことを実行します。

♿ デフォルトでアクセス可能

完全な ARIA サポートが組み込まれており、追加の構成は必要ありません。ツールバーは適切な role="toolbar" ランドマークであり、プレビュー ペインには role="region" というラベルが付けられ、すべての SVG アイコンはスクリーン リーダーから非表示になり、プレビュー トグルは aria-pressed を介してオン/オフ状態を公開し、無効化されたツールバー ボタンは disabledaria-disabled の両方を使用するため、支援技術が誤解されることはありません。モーダルは、閉じるとトリガー ボタンにフォーカスを戻します。

🛡️ CSS 競合ゼロ

すべてのエディター スタイルは、.markdown-editor-wrapper 要素に完全にスコープされます。 Tailwind のグローバル プリフライト (h1h6abutton などの要素のリセット) が除外されるため、エディターは単一のスタイルを壊すことなく、Bootstrap、Tailwind、またはその他の CSS フレームワークと同じページ上で共存できます。

🔒 XSS セーフプレビュー

レンダリングされたプレビューは、DOM に書き込まれる前に、DOMPurify によってサニタイズされます。細工されたマークダウン入力内のスクリプト タグ、インライン イベント ハンドラー、悪意のある URL は自動的に削除されます。構成は必要ありません。

マークダウン エディターのデモ

迅速な実装

1. インストール

NPM (バンドラー: Vite、webpack、Rollup など)

bash
npm install markdown-text-editor
javascript
1
2
import MarkdownEditor from 'markdown-text-editor';
new MarkdownEditor('#markdown-editor');

CDN:ESモジュール

html
1
2
3
4
<script type="module">
  import MarkdownEditor from 'https://cdn.jsdelivr.net/npm/markdown-text-editor/dist/markdown-text-editor.es.js';
  new MarkdownEditor('#markdown-editor');
</script>

CDN: グローバル スクリプト タグ (IIFE)

インポートは必要ありません — MarkdownEditor はグローバル変数として自動的に使用可能です。

html
1
2
3
4
5
6
7
8
9
<form action="/api/save" method="POST">
  <textarea id="markdown-editor" name="content"># Hello World</textarea>
  <button type="submit">Save Content</button>
</form>

<script src="https://cdn.jsdelivr.net/npm/markdown-text-editor"></script>
<script>
  new MarkdownEditor('#markdown-editor');
</script>

2. 設定と初期化

エディターをカスタマイズするには、オプション オブジェクトを渡します。すべてのオプションはオプションです。デフォルト値を使用する場合は省略します。

javascript
1
2
3
4
const editor = new MarkdownEditor('#markdown-editor', {
  placeholder: 'Write your markdown...',
  toolbar: ['heading', 'bold', 'italic', 'strikethrough', 'ul', 'ol', 'checklist', 'blockquote', 'link', 'preview'],
});

Markdown エディターを楽しんでいますか?

所要時間は 2 秒で、プロジェクトの成長に役立ちます。これは、無料の Tailwind CSS コンポーネント ライブラリである Frutjam の一部です。スターも役立ちます。

GitHub でスターを付ける

4. 設定とカスタマイズ

options オブジェクトを渡すことで、エディターの動作とインターフェイスを完全にカスタマイズできます。オプションを省略した場合はデフォルト値が使用されます。

財産 タイプ デフォルト 目的
mode string 'plain' 初期ビューを設定します。 WYSIWYG エクスペリエンスにはハイブリッドを使用し、生の構文にはプレーンを使用します。
placeholder string 'Write...' エディターが空の場合に表示されるテキスト。
toolbar array [...] どのツールがどのような順序で表示されるかを定義します。
footer false | object すべて見える エディタの下に表示されるステータス バーを制御します。 false に設定して完全に非表示にするか、オブジェクトを渡して個々の統計を切り替えます。
theme string 継承された エディターのテーマ (ライト、ダーク、スノーベリー、ダークベリー) を明示的に設定します。省略した場合、エディターは最も近い祖先要素または <textarea> 自体から data-theme を継承します。
minHeight number 200 コンテンツが短い場合にエディターが縮小する最小の高さ (ピクセル単位)。 maxHeight と組み合わせて、自動拡張範囲を設定します。
maxHeight number 500 非全画面モードでエディターが拡大できるピクセル単位の最大高さ。コンテンツがこの高さを超えると、エディター内にスクロールバーが表示されます。エディターにはドラッグ ハンドルもあるので、ユーザーはこの制限を超えて手動でサイズを変更できます。
onChange function undefined コンテンツの変更 (入力、ツールバーのアクション、元に戻す/やり直し、リストの継続) ごとにコールバックが発生します。現在のマークダウン文字列を唯一の引数として受け取ります。

🛠 ツールバーのカスタマイズ

ツールバーはモジュール式です。アレイを変更することで、最小限のエクスペリエンスまたはフル機能のパワー スイートを作成できます。

利用可能なツール
カテゴリ ツールキー
タイポグラフィ heading, bold, italic, strikethrough, blockquote
リスト ul (弾丸), ol (番号付き), checklist
コード code (列をなして), codeblock (フェンスで囲まれたブロック)
インサート hr (横罫), table (テーブルテンプレート)
メディア link, image
編集 undo, redo, indent, outdent
ビュー preview
💡 実装のヒント:
  • 並べ替え: ボタンは、配列にリストしたとおりの順序で表示されます。
  • 削除: 配列からキー (image など) を省略するだけで、ユーザーに対してその機能を完全に無効にできます。
  • ネイティブ フォールバック: JS で placeholder を指定しない場合、プラグインは HTML <textarea>placeholder 属性を自動的に使用します。

📊 フッター (ステータスバー)

フッターはエディターの下にあり、 カーソルの、 ドキュメントの文字数、 オプションで単語数が表示され、すべてリアルタイムで更新されます。これはデフォルトで表示され、各統計を個別に切り替えることができます。

タイプ デフォルト 説明
line boolean true 現在の行番号を表示します。
col boolean true 現在の列番号を表示します。
chars boolean true 総文字数を表示します。
words boolean false 総単語数を表示します。デフォルトではオフ — 有効にするには true に設定します。
使用例
javascript
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
// Default — line, col, and chars visible
new MarkdownEditor('#editor');

// Disable the footer entirely
new MarkdownEditor('#editor', { footer: false });

// Hide only character count
new MarkdownEditor('#editor', { footer: { chars: false } });

// Hide line and column, keep character count
new MarkdownEditor('#editor', { footer: { line: false, col: false } });

// Show only line number
new MarkdownEditor('#editor', { footer: { col: false, chars: false } });

// Enable word count alongside the defaults
new MarkdownEditor('#editor', { footer: { words: true } });

// Show word count only
new MarkdownEditor('#editor', { footer: { line: false, col: false, chars: false, words: true } });

5. コンテンツの取得、設定、送信

MarkdownEditor の主な強みの 1 つは、基礎となる <textarea> の完全な同期を維持できることです。最新の JavaScript フレームワークを使用している場合でも、Django、PHP、Laravel などの従来のバックエンドを使用している場合でも、ワークフローはシンプルかつネイティブのままです。

1. ネイティブの方法 (推奨)

エディターは標準のテキストエリアを拡張するため、使い慣れた DOM メソッドを使用できます。これは、新しい API を学習せずにデータを操作する最も速い方法です。

javascript
1
2
3
4
5
// Retrieve content via ID
const markdown = document.getElementById('markdown-editor').value;

// Set content via ID (The editor UI updates automatically)
document.getElementById('markdown-editor').value = "# New Heading Content";

2. 変数参照の使用

textarea 要素への参照がある場合は、それを直接使用できます。ライブラリ固有の API は必要ありません。

javascript
1
2
3
4
5
6
7
const textarea = document.getElementById('markdown-editor');

// Retrieve content
const markdown = textarea.value;

// Set content (the editor UI reflects this immediately)
textarea.value = "## Updated via JS";

3. 内容の設定と読み込み

初期コンテンツを設定する推奨方法は、<textarea> HTML 内で直接設定することです。これはあらゆるバックエンド フレームワーク (Django、Laravel、Rails、PHP など) で自然に動作し、エディターが init 時に自動的にレンダリングします。

html
1
2
<!-- Recommended: set content server-side -->
<textarea id="markdown-editor"># Hello World</textarea>

実行時にコンテンツを読み取りまたは更新するには、ネイティブの textarea 値を使用します。更新後に editor.render() を呼び出して、プレビュー層とハイブリッド層を更新します。

javascript
1
2
3
4
5
6
7
8
const textarea = document.getElementById('markdown-editor');

// Read
const markdown = textarea.value;

// Update at runtime
textarea.value = '# New content';
editor.render();

4. エディターの破棄 — destroy()

editor.destroy() を呼び出してエディタ DOM ラッパーを削除し、元の <textarea> をドキュメント内のその位置に復元します。単一ページのアプリケーションでビューをアンマウントするときに便利です。

javascript
1
2
3
4
const editor = new MarkdownEditor('#markdown-editor');

// Remove the editor and restore the plain textarea
editor.destroy();
onChange による変更への反応

onChange コールバックを渡して、コンテンツが変更されるたびに通知を受け取ります。現在のマークダウン文字列を受け取ります。

javascript
1
2
3
4
5
const editor = new MarkdownEditor('#markdown-editor', {
    onChange(value) {
        console.log('Content changed:', value.length, 'characters');
    }
});
localStorage によるドラフトの自動保存

onChange を使用して、キーストロークごとに下書きを保存します。エディタを初期化する前にテキストエリアを事前に入力して復元します。

javascript
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
const DRAFT_KEY = 'my-page-draft';

// Restore saved draft before init (only if textarea starts empty)
const textarea = document.getElementById('markdown-editor');
const saved = localStorage.getItem(DRAFT_KEY);
if (saved && !textarea.value) textarea.value = saved;

// Save on every change
const editor = new MarkdownEditor('#markdown-editor', {
    onChange(value) {
        localStorage.setItem(DRAFT_KEY, value);
    }
});

// Clear draft after successful form submission
document.querySelector('form').addEventListener('submit', () => {
    localStorage.removeItem(DRAFT_KEY);
});

4. 簡単な自動フォーム送信

MarkdownEditor はネイティブ <textarea> 上に直接構築されているため、すぐにあらゆるバックエンド フレームワーク (Django、Laravel、PHP、Ruby on Rails など) と互換性があります。

ここで「ネイティブファースト」の哲学が光ります。フォームを送信する前にデータを手動で同期する必要はありません。ブラウザはエディタを標準の入力フィールドとまったく同じように扱います。

html
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<form method="POST" action="/api/submit">
  <textarea id="markdown-editor" name="content" class="h-48" rows="5">
    # Initial Content
  </textarea>

  <button type="submit">Submit to Server</button>
</form>

<script>
  // Just initialize it. That's it.
  new MarkdownEditor('#markdown-editor');
</script>

注: MarkdownEditor プラグインの初期化は必須です

標準の HTML <form> を使用するだけです。テキストエリアの name 属性は、サーバーがコンテンツを識別するために使用するものです。

🚀 バックエンドにとって大きな変革となる理由

エディターはネイティブの <textarea> の動作を保持するため、サーバーはデータを標準文字列として処理します。追加のロジックは必要ありません。preventDefault() や手動の FormData 構築は必要ありません。

💡 これが「キラー機能」である理由:

ほとんどのエディター (Quill、Editor.js、simpleMDE、easyMDE など) は、データを複雑な JSON 構造で保存します。開発者がこれらを使用する場合、データベース スキーマとレンダリング ロジックを書き直す必要があります。

MarkdownEditor を使用すると、開発者は古い Web サイトを使用して、プレーンな <textarea> をエディタに置き換えることができます。バックエンドはそれが変更されたことさえ認識しません。いつもと同じ生のテキストを受け取るだけですが、ユーザーは 10 倍優れたエクスペリエンスを得ることができます。

フレームワーク/言語 Markdown コンテンツにアクセスする方法
PHP $_POST['content']
Django request.POST.get('content')
Node.js (Express) req.body.content
Laravel $request->input('content')
Ruby on Rails params[:content]

構成オプション

🖼️ 高度な画像アップロード

遅くてメモリを大量に消費する Base64 文字列に依存するのではなく、画像のアップロードをネイティブに処理することは、パフォーマンスと SEO の両方において大きなメリットとなります。

構成オプション

画像ツールは、サーバーへの直接アップロードを処理するための fileInput 構成をサポートしています。

  • accept: 許可される画像形式の配列を定義します (例: 「webp」、「avif」)
  • uploadUrl: File オブジェクトが POST 経由で送信されるバックエンド エンドポイントを指定します。
  • params: 画像ファイルと一緒に追加データ (CSRF トークン、ユーザー ID、フォルダー名など) を送信するためのオプションのオブジェクト

使用例(フルコンフィグ)

javascript
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
const options = {
  placeholder: 'Start writing...',
  toolbar: [
    'link',
    {
      image: {
        fileInput: {
            accept: ['webp', 'avif'], // restrict the image upload format
            uploadUrl: '/api/upload', // Your upload endpoint
            params: {
                _token: 'your_csrf_token_here', // Essential for Laravel/Django
                folder: 'blog_posts'
            }
        },
        // Supports boolean: true/false OR object: { required: true }
        altInput: { required: true }
      }
    },
    'preview'
  ],
}
const editor = new MarkdownEditor('#markdown-editor', options);

📡 サーバー統合の詳細

1. リクエスト

エディターは、POST リクエストを multipart/form-data として送信します。デフォルトでは、次のものが含まれます。

  • image_file: 実際のファイル オブジェクト
  • image_alt: ユーザーが入力した代替テキスト
  • ...さらに、params オブジェクトで定義されたカスタム データ
2. 必要な対応

アップロードが成功したことを確認し、画像をエディタに挿入するには、サーバーが次の JSON 構造を返す必要があります。

json
1
2
3
4
{
  "success": true,
  "image_path": "https://cdn.yourdomain.com/uploads/image.webp"
}

: アップロードした画像の URL には必ずキー image_path を使用してください。

画像代替テキストの検証 (altInput)

コンテンツがアクセス可能で SEO フレンドリーであることを保証するために、MarkdownEditor はデフォルトで代替テキストの検証を強制します。この動作は、ブール値の省略表現または詳細オブジェクトを使用して構成できます。

  • デフォルトの動作: altInput が定義されていない場合、デフォルトの { required: true } になります。
  • アクセシビリティを強制する: 代替説明が提供されるまで、ユーザーは画像を挿入できません。
構成例:
1. デフォルト (設定は必要ありません)
javascript
1
2
3
4
// Alt text is REQUIRED by default
image: {
  fileInput: { uploadUrl: '/api/upload' }
}
2. 省略表現 (検証を無効にする)

説明のない画像を許可したい場合は、ブール値を false に設定するだけです。

javascript
1
2
3
image: {
  altInput: false // Users can now skip the alt text field
}
3. オブジェクトベース (明示的)
javascript
1
2
3
4
5
image: {
    altInput: {
        required: false // Disables alt text validation — users can skip the alt field
    }
}

標準的な画像の使用法 (fileInput なし):

fileInput が構成されていない場合、エディターはデフォルトで単純な URL ベースのモーダルを使用します。これは、ユーザーが主に外部イメージ ホストにリンクしている場合に最適です。

javascript
1
2
3
4
5
6
7
8
const options = {
  toolbar: [
    'link',
    'image',
    'preview'
  ],
}
const editor = new MarkdownEditor('#markdown-editor', options);
💡 params を使用する理由?

Laravel や Django などのフレームワークでは、CSRF トークンがないとファイルをアップロードできません。 _tokenparams オブジェクトに追加すると、リクエストはバックエンドのセキュリティ ミドルウェアをシームレスに通過し、サーバー側コントローラーの「ゼロ ロジック」哲学が維持されます。

🔀 編集モード

MarkdownEditor は、コンテンツを記述してフォーマットする 2 つの異なる方法を提供します。従来の構文重視のビューと、視覚重視の最新のエクスペリエンスを切り替えることができます。

構成

初期化中に mode プロパティを使用して開始モードを定義できます。

  • plain (デフォルト): 構文 (**bold**#Heading など) が表示されるクリーンで高パフォーマンスの Markdown 環境。開発者やマークダウン純粋主義者に最適
  • ハイブリッド: WYSIWYG にインスピレーションを得たエクスペリエンスで、基礎となる Markdown 構造を維持しながら、入力時に書式設定 (太字、斜体、見出し) をリアルタイムでレンダリングします。
実装:
javascript
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// Default initialization (Plain Mode)
new MarkdownEditor('#markdown-editor');

// Explicit Plain Mode
new MarkdownEditor('#markdown-editor', {
    mode: 'plain'
});

// Hybrid (Visual) Mode
new MarkdownEditor('#markdown-editor', {
    mode: 'hybrid'
});
ハイブリッド モードとプレーン モードのプレビュー:
ハイブリッドモード

視覚的な書式設定は、入力中にリアルタイムでレンダリングされます。

プレーンモード (デフォルト)

軽量なエクスペリエンスを実現するために、生の Markdown 構文に焦点を当てています。

構成 プロパティ/ツール 説明
オプションオブジェクト placeholder textarea のプレースホルダー テキストを設定します (標準の HTML textarea 属性も使用できるため、オプション)
mode: 'hybrid' 入力時にリアルタイムで書式設定 (太字、斜体、見出し) をレンダリングする WYSIWYG 風のエクスペリエンスを実現します。
toolbar: ツールバーに表示されるツール
とその順序を決定します。
heading ドロップダウンを開いて見出しレベル H1 ~ H6 を選択します
bold 太字のテキストの書式設定を有効にします。
italic 斜体のテキストの書式設定を有効にします。
strikethrough テキストの取り消し線を許可します。
ol (順序付きリスト): テキストを番号付きリスト形式に変換します。
ul (順序なしリスト): テキストを箇条書きリストに変換します。
checklist テキストにチェックボックスを追加して、タスク、To-Do リスト、または完了ステータスの追跡に最適にします。
blockquote 引用または強調されたテキストを強調表示します。
code インライン コードの場合、選択したテキストを単一のバッククォートで囲みます。 Clicking again removes the backticks.
codeblock 選択したテキストを 3 つのバッククォートで囲まれたコード ブロックで囲みます。もう一度クリックするとフェンスが削除されます。
hr --- 水平罫線をその行のカーソル位置に挿入します。
table スターター 2x3 マークダウン テーブル テンプレートをカーソル位置に挿入します。
image マークダウン構文を使用して画像を挿入できます。
link テキストにハイパーリンクを追加できます。
undo 最後の変更を元に戻すには。
redo 最後に元に戻した変更を再適用します。
indent インデントレベルを上げるには。
outdent インデントレベルを下げるには。
preview 全画面の並べてプレビューを切り替えます。プレビュー ペインのチェックボックスはクリック可能で、マークダウン ソースが即座に更新されます。全画面表示を終了するには、Esc キーを押します。
高度な画像アップロード機能:
独自のサーバーへの画像アップロードの構成と、API 経由の画像パスの設定が可能になります。
これにより、パフォーマンスと SEO が向上します。
fileInput accept: 許可される画像ファイル タイプの配列 (例: 'webp''avif')。
uploadUrl: ファイルが POST 経由で送信されるバックエンド エンドポイント。
params: 追加データのオプションのオブジェクト (CSRF トークン、ユーザー ID、フォルダー名)
altInput required: false: 代替テキストの入力検証を無効にします (デフォルトは true)

⌨️ キーボード ショートカット

一般的な書式設定アクションは、ツールバーに触れずにキーボードから直接トリガーできます。各ショートカットは、対応するツールバー ボタンのツールチップにも表示されます。

ショートカット アクション
Ctrl + B  /  ⌘ B 太字を切り替えます
Ctrl + I  /  ⌘ I 斜体を切り替えます
Ctrl + K  /  ⌘ K リンクの挿入
Ctrl + `  /  ⌘ ` インライン コード を切り替えます
Ctrl + Shift + S  /  ⌘ ⇧ S 取り消し線を切り替えます
Ctrl + Z  /  ⌘ Z 元に戻す
Ctrl + Shift + Z  /  ⌘ ⇧ Z やり直し
Tab 選択した行をインデントします
Shift + Tab 選択した行のインデントを解除する
Ctrl + F  /  ⌘ F 検索パネルを開く
Ctrl + H  /  ⌘ H 検索と置換パネルを開く
Escape 検索パネルを閉じる / 全画面プレビューを終了する

🔍 見つけて交換する

組み込みの検索および置換パネルはエディタ内で使用できます。ブラウザ拡張機能や別個のツールは必要ありません。

  • Ctrl + F (または ⌘ F) を押して、検索パネルを開きます。
  • Ctrl + H (または ⌘ H) を押して、検索と検索 を開きます。パネルを交換します。
  • 検索では大文字と小文字が区別されず、ライブ一致カウンターが表示されます (例: 3 of 12)。
  • ▲ / ▼ ボタンまたは Enter / Shift + Enter を使用して一致に移動します。
  • 置換は、現在ハイライト表示されている一致を置換します。 [すべて置換] では、すべての出現箇所を一度に置換します。
  • Escape を押してパネルを閉じ、エディタにフォーカスを戻します。

パネルはエディターのコンテンツ領域の右上隅にフロートしており、書き込みを中断しません。

🌙 テーマ

MarkdownEditor は周囲のページからテーマを自動的に継承します。設定は必要ありません。エディターは初期化時に最も近い祖先から data-theme を読み取るため、すぐに使えるサイトのテーマとの同期が保たれます。

テーマの解決方法(優先順位)

  1. theme オプション - オプション オブジェクトで渡される明示的なオーバーライド
  2. <textarea>data-theme — 要素に直接設定
  3. 任意の祖先 上の data-theme — 例: <html><body>、またはラッパー <div>

利用可能なテーマ

'light' (デフォルト)、'dark''snowberry''darkberry'

オプション 1 — <html> または任意の祖先から継承 (ゼロ構成)
html
1
2
3
4
5
6
<html data-theme="dark">
  ...
  <textarea id="markdown-editor"></textarea>
  <script>
    new MarkdownEditor('#markdown-editor'); // picks up dark automatically
  </script>
オプション 2 — data-theme<textarea> に直接設定します
html
1
2
3
4
<textarea id="markdown-editor" data-theme="dark"></textarea>
<script>
  new MarkdownEditor('#markdown-editor');
</script>
オプション 3 — 明示的な theme オプション (すべてをオーバーライドします)
javascript
1
2
3
new MarkdownEditor('#markdown-editor', {
    theme: 'dark'
});

🎨 CSS変数によるカスタムテーマ

.markdown-editor-wrapper 要素または任意の [data-theme] セレクターで CSS 変数をオーバーライドすることで、エディターの外観を完全にカスタマイズできます。すべての色は、知覚的に均一な結果を得るために OKLCH カラー スペース を使用します。

変数 目的 ライトデフォルト ダークデフォルト
--color-base 編集者の背景 oklch(100% 0 0) oklch(10.9% 0 0)
--color-on-base 主要なテキストの色 oklch(22% 0 0) oklch(98% 0 0)
--color-primary プライマリアクセント (ツールバーがアクティブ、リンク) oklch(51.1% .262 277) oklch(66.4% .184 286)
--color-on-primary 原色の表面上の文字 oklch(96.2% .018 272) oklch(10% .01 270)
--color-secondary 第二アクセント oklch(59.1% .293 323) oklch(65% .18 220)
--color-accent アクセントを強調表示 (インライン コード、斜体) oklch(54.1% .281 293) oklch(75% .18 50)
--color-neutral ニュートラルなサーフェス(境界線、仕切り) oklch(15% 0 0) oklch(85% 0 0)
--color-error エラー状態の色 oklch(57.7% .245 27) oklch(60% .22 30)
--border-radius エディターフレームの角丸め 0.25rem
カスタムテーマの例

エディターの初期化後に .markdown-editor-wrapper の変数をオーバーライドするか、スタイルシートでカスタム [data-theme] ブロックを定義します。

css
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
/* Override individual variables */
.markdown-editor-wrapper {
    --color-primary: oklch(60% 0.2 30);   /* orange accent */
    --border-radius: 0.5rem;
}

/* Or define a full custom theme */
[data-theme="brand"] .markdown-editor-wrapper,
.markdown-editor-wrapper[data-theme="brand"] {
    --color-base:       oklch(15% 0.01 250);
    --color-on-base:    oklch(95% 0 0);
    --color-primary:    oklch(65% 0.22 145);   /* green */
    --color-on-primary: oklch(10% 0 0);
    --color-accent:     oklch(75% 0.18 60);
    --color-neutral:    oklch(80% 0 0);
    --border-radius:    0.75rem;
}
javascript
new MarkdownEditor('#markdown-editor', { theme: 'brand' });
  • リアルタイム プレビュー: 入力すると即座にマークダウンがレンダリングされるのを確認します。
  • 構文のハイライト: 明確なコードとマークダウン形式により読みやすさが向上しました。
  • 簡単な統合: 最小限のセットアップであらゆる Web プロジェクトにシームレスに統合できます。
  • カスタマイズ可能なツールバー: 太字、斜体などのツールバー オプションを動的に構成および並べ替えます。

特徴

🔌 ネイティブフォームの統合

標準の <textarea> とまったく同じように機能します。複雑な API は必要ありません。value または name 属性を使用するだけです。これは、PHP、Django、または Node.js での標準の HTML フォーム送信で「機能」します。

🖼️ 高度な画像アップロード

API 経由でネイティブ サーバーのアップロードを構成します。独自の CDN で画像をホストすることで、ページの読み込みを高速化し、優れた SEO を実現するには、重い Base64 文字列を避けてください。

🔀 ハイブリッドモードとプレーンモード

ビジュアル編集のためのハイブリッド (WYSIWYG) モードと、従来のコーディング感覚のための プレーン マークダウン モードを切り替えます。

🚀 高性能

「ヘビー コンテンツ」向けに最適化された小さな ~ 116 KB のバンドル。入力遅延やパフォーマンスの低下を引き起こすことなく、大量のドキュメントや大きなファイルを処理できます。

🌍 組み込みの RTL サポート

アラビア語、ウルドゥー語、ペルシア語などの右から左に記述する言語のネイティブ サポート。グローバルにアクセス可能なアプリケーションの構築に最適です。

🌙 アダプティブテーマ

自動ダークモードのサポートが含まれます。システム設定またはFrutjam UI ライブラリと同期して、シームレスな視覚体験を実現します。

📝 スマート編集

順序付きリスト、順序なしリスト、チェックリストに対する GitHub スタイルの自動リスト継続 — Enter を押すと、エディターがパターンを継続します。プレビュー ペインのチェックボックスはクリック可能で、マークダウン ソースに即座に同期されます。

📱 完全にレスポンシブ

デスクトップ、タブレット、スマートフォンに完璧に適応する流動的なモバイルファースト UI により、外出先での編集が可能です。

📦 ユニバーサルサポート

ESM、UMD、CommonJS、IIFEと互換性があります。 CDN (<script src>)、npm、または任意のバンドラー (Vite、webpack、Rollup) 経由ですぐに使用でき、追加の構成は必要ありません。

♿ デフォルトでアクセス可能

完全な ARIA サポートが組み込まれています — ツールバーのランドマーク、ラベル付きプレビュー領域、スクリーン リーダー対応ボタン、プレビュー トグルの aria-pressed、非アクティブなツールの disabled および aria-disabled、モーダルが閉じたときの正しいフォーカス復元。

🛡️ CSS 競合ゼロ

エディター スタイルは、.markdown-editor-wrapper に完全にスコープされます。 Tailwind のグローバル プリフライトは除外されているため、エディターは Bootstrap、Tailwind、またはその他のフレームワークと安全に共存でき、それらのスタイルを損なうことはありません。

⌨️ キーボード ショートカット

Ctrl+BCtrl+ICtrl+KCtrl+`Ctrl+Shift+S — マウスに触れずに行う一般的なフォーマット操作。各ショートカットは、ツールバー ボタンのツールチップに表示されます。

🔍 見つけて交換する

Ctrl+F を押して検索するか、Ctrl+H を押して検索と検索を開きます。交換する。エディターを離れることなく、ライブ一致カウンター、次/前のナビゲーション、単一置換、およびすべて置換による大文字と小文字を区別しない検索。

完全な構成例

この包括的な例を使用して、カスタム ツールバーの順序付けや高度な画像アップロード処理など、すべての主要な機能を備えた MarkdownEditor を初期化します。

javascript
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
const editor = new MarkdownEditor('#markdown-editor', {
    mode: 'hybrid',
    placeholder: 'Start writing...',
    footer: {
        line: true,
        col: true,
        chars: true,
        words: true,
    },
    onChange(value) {
        console.log('Content updated:', value.length, 'characters');
    },
    toolbar: [
        'heading', 'bold', 'italic', 'strikethrough', 'blockquote',
        'ul', 'ol', 'checklist',
        'code', 'codeblock', 'hr', 'table',
        {
            image: {
                fileInput: {
                    accept: ['webp', 'avif', 'png'],
                    uploadUrl: '/api/upload'
                }
            }
        },
        'link', 'undo', 'redo', 'indent', 'outdent', 'preview'
    ],
});

// Read content natively
const markdown = document.getElementById('markdown-editor').value;

// Update content programmatically (dispatch input to keep preview in sync)
// const ta = document.getElementById('markdown-editor');
// ta.value = '# New content';
// ta.dispatchEvent(new Event('input', { bubbles: true }));

// destroy() when the view unmounts (SPAs)
// editor.destroy();