Zum Hauptinhalt springen

Das Native-First-Hochleistungs-Markdown-Plugin für JavaScript

Zuletzt aktualisiert:

Markdown-Texteditor-Plugin, das einen nativen Textbereich in eine vollständige Bearbeitungssuite umwandelt – keine Synchronisierung erforderlich. WYSIWYG- und einfacher Markdown-Modus, Live-Vorschau, Suchen & Ersetzen, RTL-Unterstützung, Dunkelmodus. Funktioniert mit Django, Laravel, Rails, Node.js, PHP und jedem Stack.

Die Philosophie: „Native-First“

Die meisten Redakteure unterbrechen den Standard-Web-Workflow. MarkdownEditor ist davon überzeugt. Da es sich direkt über einem <textarea> befindet, müssen Sie keinen neuen Umgang mit Daten erlernen.

  • Keine Datenbindung erforderlich: Funktioniert sofort mit <form method="POST">
  • Standardzugriff: Verwenden Sie document.getElementById('editor').value wie eine normale Eingabe.
  • Backend-Agnostisch: Funktioniert mit jedem Backend (Python, Node.js, PHP usw.) wie ein normales Formularfeld

MarkdownEditor vs. EasyMDE / SimpleMDE

Die meisten JavaScript-Markdown-Editoren – EasyMDE, SimpleMDE, CodeMirror-basierte Editoren – ersetzen Ihren <textarea> durch ein benutzerdefiniertes Element. Das bedeutet, dass die Formularübermittlung unterbrochen wird, .value nichts zurückgibt und Sie zusätzlichen Code schreiben müssen, nur um den Inhalt wieder auszulesen. MarkdownEditor ist anders als – es erweitert Ihren vorhandenen Textbereich und ersetzt ihn niemals.

Besonderheit MarkdownEditor EasyMDE / SimpleMDE
Nativer Textbereich bleibt erhalten ❌ Ersetzt
Das Absenden des Formulars funktioniert unverändert ❌ Erfordert zusätzliches JS
Wert über .value abrufen/festlegen ❌ Benutzerdefinierte API erforderlich
WYSIWYG-Hybridmodus
Integriertes Suchen und Ersetzen
RTL-Unterstützung
CSP-kompatibel (kein Inline-JS)
Keine CSS-Konflikte
Dunkler Modus / Thematisierung Beschränkt
Bündelgröße ~116 KB ~300 KB+

Framework-Integration

Da MarkdownEditor das native <textarea> beibehält, lässt es sich ohne zusätzlichen Code in jedes Backend-Framework integrieren. Ihr Server empfängt den Markdown-Inhalt genau so, wie er es von jedem Standardformularfeld tun würde.

Django

Fügen Sie Ihrem Textbereichs-Widget ein class hinzu und initialisieren Sie den Editor – request.POST['content'] funktioniert ohne zusätzliche Schritte.

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

Verwenden Sie f.text_area mit einer Klasse – $request->input('content') empfängt den Markdown direkt.

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

Ruby auf Schienen

Funktioniert standardmäßig mit form_withparams[:content] enthält den Markdown. Verwenden Sie für Turbo Drive turbo:load anstelle von DOMContentLoaded.

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 erhält den Markdown beim Absenden des Formulars – kein Synchronisierungsschritt, keine benutzerdefinierte Extraktion.

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'] funktioniert genauso wie jeder Standard-Textbereich – fügen Sie es ein und Ihre bestehende Formularverarbeitung erfordert keine Änderungen.

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>

Hauptmerkmale

🖼️ Erweiterter Bild-Upload (SEO-optimiert)

Überladen Sie Ihre Datenbank nicht mit umfangreichen Base64-Strings. Konfigurieren Sie unsere API, um Bilder direkt auf Ihren Server oder S3-Bucket hochzuladen. Der Redakteur erhält die URL, wodurch Ihre Markdown-Dateien übersichtlich bleiben und das SEO-Ranking Ihrer Website hoch bleibt.

🔀 Hybrid- und Normalmodus

Bieten Sie Ihren Benutzern das Beste aus beiden Welten. Wechseln Sie zwischen einem Visual (WYSIWYG) Hybrid-Modus für einfache Formatierung und einem Plain Markdown-Modus für ablenkungsfreie, rohe Syntaxbearbeitung.

🌍 Global-Ready mit RTL-Unterstützung

Vollständige native Unterstützung für Rechts-nach-Links-Sprachen (RTL). Perfekt für Projekte, die Unterstützung für Arabisch, Urdu oder Farsi mit automatischer Ausrichtung der Textrichtung erfordern.

⚡ Leistung im Maßstab

  • Leicht: Ein winziger Platzbedarf von ca. 116 KB, der das Laden Ihrer Seite nicht verlangsamt
  • Unterstützung großer Dokumente: Optimiert für die Verarbeitung von Tausenden von Textzeilen ohne Eingabeverzögerung oder Einfrieren des Browsers
  • Intelligentes Rendering: Entprellte Vorschauaktualisierungen, zwischengespeicherte Stilberechnungen und konfliktfreie Tastaturbehandlung zwischen Listenfortsetzung und Einrückung – Tab und Eingabetaste machen also immer genau das Gleiche

♿ Standardmäßig zugänglich

Die vollständige ARIA-Unterstützung ist integriert und erfordert keine zusätzliche Konfiguration. Die Symbolleiste ist ein echtes role="toolbar"-Merkmal, das Vorschaufenster ist mit role="region" beschriftet, alle SVG-Symbole sind vor Bildschirmleseprogrammen verborgen, der Vorschau-Schalter zeigt seinen Ein-/Aus-Zustand über aria-pressed an und deaktivierte Symbolleistenschaltflächen verwenden sowohl disabled als auch aria-disabled, sodass die Hilfstechnologie niemals in die Irre geführt wird. Modale kehren beim Schließen zum Fokus auf die Auslösetaste zurück.

🛡️ Keine CSS-Konflikte

All editor styles are fully scoped to the .markdown-editor-wrapper element. Tailwind's global preflight (element resets for h1h6, a, button, etc.) is excluded, so the editor can live alongside Bootstrap, Tailwind, or any other CSS framework on the same page without breaking a single style.

🔒 XSS-sichere Vorschau

Die gerenderte Vorschau wird über DOMPurify bereinigt, bevor sie in das DOM geschrieben wird. Skript-Tags, Inline-Ereignishandler und schädliche URLs in manipulierten Markdown-Eingaben werden automatisch entfernt – keine Konfiguration erforderlich.

Demo zum Markdown-Editor

Schnelle Implementierung

1. Installation

NPM (Bundler: Vite, Webpack, Rollup usw.)

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

CDN: ES-Modul

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: globales Skript-Tag (IIFE)

Kein Import erforderlich – MarkdownEditor ist automatisch als globale Variable verfügbar.

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. Konfiguration und Initialisierung

Übergeben Sie ein Optionsobjekt, um den Editor anzupassen. Alle Optionen sind optional – lassen Sie alle weg, um den Standardwert zu verwenden.

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'],
});

Gefällt Ihnen der Markdown-Editor?

Es dauert 2 Sekunden und trägt zum Wachstum des Projekts bei. Es ist Teil von Frutjam, einer kostenlosen Tailwind-CSS-Komponentenbibliothek – ein Stern dort hilft auch.

Stern auf GitHub

4. Konfiguration und Anpassung

Sie können das Verhalten und die Benutzeroberfläche des Editors vollständig anpassen, indem Sie ein options-Objekt übergeben. Wenn Sie eine Option weglassen, wird der Standard-Wert verwendet.

Eigentum Typ Standard Zweck
mode string 'plain' Legt die anfängliche Ansicht fest. Verwenden Sie Hybrid für ein WYSIWYG-Erlebnis oder Plain für reine Syntax.
placeholder string 'Write...' Text, der angezeigt wird, wenn der Editor leer ist.
toolbar array [...] Definiert, welche Werkzeuge in welcher Reihenfolge angezeigt werden.
footer false | object alles sichtbar Steuert die Statusleiste, die unterhalb des Editors angezeigt wird. Auf false setzen, um es vollständig auszublenden, oder ein Objekt übergeben, um einzelne Statistiken umzuschalten.
theme string geerbt Legt explizit das Editor-Thema fest (hell, dunkel, schneebeere, dunkelbeere). Wenn es weggelassen wird, erbt der Editor data-theme vom nächstgelegenen Vorgängerelement oder vom <textarea> selbst.
minHeight number 200 Mindesthöhe in Pixel, auf die der Editor verkleinert wird, wenn der Inhalt kurz ist. Kombiniert mit maxHeight, um den Bereich für die automatische Vergrößerung festzulegen.
maxHeight number 500 Maximale Höhe in Pixel, auf die der Editor im Nicht-Vollbildmodus wachsen kann. Sobald der Inhalt diese Höhe überschreitet, erscheint im Editor eine Bildlaufleiste. Der Editor verfügt außerdem über einen Ziehgriff, sodass Benutzer die Größe manuell über diese Grenze hinaus ändern können.
onChange function undefined Bei jeder Inhaltsänderung wird ein Rückruf ausgelöst – Eingabe, Aktionen in der Symbolleiste, Rückgängigmachen/Wiederherstellen und Fortsetzung der Liste. Empfängt den aktuellen Markdown-String als einziges Argument.

🛠 Anpassung der Symbolleiste

Die Symbolleiste ist modular aufgebaut. Durch Modifizieren des Arrays können Sie ein minimales Erlebnis oder eine leistungsstarke Suite mit vollem Funktionsumfang schaffen.

Verfügbare Tools
Kategorie Werkzeugschlüssel
Typografie heading, bold, italic, strikethrough, blockquote
Listen ul (Kugel), ol (nummeriert), checklist
Code code (im Einklang), codeblock (eingezäunter Block)
Einlagen hr (horizontale Regel), table (Tabellenvorlage)
Medien link, image
Bearbeitung undo, redo, indent, outdent
Sicht preview
💡 Umsetzungstipps:
  • Neuordnung: Die Schaltflächen werden genau in der Reihenfolge angezeigt, in der Sie sie im Array auflisten
  • Entfernen: Lassen Sie einfach einen beliebigen Schlüssel (wie image) aus dem Array weg, um diese Funktion vollständig für den Benutzer zu deaktivieren
  • Native Fallback: Wenn Sie in JS keinen placeholder angeben, verwendet das Plugin automatisch das placeholder-Attribut aus Ihrem HTML-<textarea>

📊 Fußzeile (Statusleiste)

Die Fußzeile befindet sich unterhalb des Editors und zeigt die Zeile, Spalte des Cursors, die Zeichenanzahl des Dokuments und optional die Wortanzahl an – alles in Echtzeit aktualisiert. Es ist standardmäßig sichtbar und jede Statistik kann unabhängig umgeschaltet werden.

Schlüssel Typ Standard Beschreibung
line boolean true Zeigt die aktuelle Zeilennummer an.
col boolean true Zeigt die aktuelle Spaltennummer an.
chars boolean true Zeigt die Gesamtzahl der Zeichen an.
words boolean false Zeigt die Gesamtzahl der Wörter an. Standardmäßig deaktiviert – zum Aktivieren auf true setzen.
Anwendungsbeispiele
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. Abrufen, Festlegen und Senden von Inhalten

Eine der Hauptstärken von MarkdownEditor besteht darin, dass der zugrunde liegende <textarea> perfekt synchronisiert bleibt. Unabhängig davon, ob Sie ein modernes JavaScript-Framework oder ein traditionelles Backend wie Django, PHP oder Laravel verwenden, bleibt der Workflow einfach und nativ.

1. Der native Weg (empfohlen)

Da der Editor einen Standardtextbereich erweitert, können Sie bekannte DOM-Methoden verwenden. Dies ist der schnellste Weg, mit Ihren Daten zu interagieren, ohne eine neue API zu erlernen.

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. Verwenden einer Variablenreferenz

Wenn Sie einen Verweis auf das Textarea-Element haben, können Sie es direkt verwenden – es ist keine bibliotheksspezifische API erforderlich.

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. Inhalte einstellen und lesen

Die empfohlene Methode zum Festlegen des anfänglichen Inhalts ist direkt im <textarea>-HTML – dies funktioniert natürlich mit jedem Backend-Framework (Django, Laravel, Rails, PHP usw.) und der Editor rendert ihn automatisch bei init.

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

Um Inhalte zur Laufzeit zu lesen oder zu aktualisieren, verwenden Sie den nativen Wert textarea. Rufen Sie editor.render() nach einem Update auf, um die Vorschau- und Hybridebene zu aktualisieren.

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. Zerlegen des Editors – destroy()

Rufen Sie editor.destroy() auf, um den Editor-DOM-Wrapper zu entfernen und den ursprünglichen <textarea> an seiner Position im Dokument wiederherzustellen. Nützlich in Single-Page-Anwendungen beim Unmounten einer Ansicht.

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

// Remove the editor and restore the plain textarea
editor.destroy();
Mit onChange auf Änderungen reagieren

Übergeben Sie einen onChange-Rückruf, um bei jeder Inhaltsänderung benachrichtigt zu werden. Empfängt die aktuelle Markdown-Zeichenfolge.

javascript
1
2
3
4
5
const editor = new MarkdownEditor('#markdown-editor', {
    onChange(value) {
        console.log('Content changed:', value.length, 'characters');
    }
});
Automatisches Speichern des Entwurfs mit localStorage

Verwenden Sie onChange, um bei jedem Tastendruck einen Entwurf zu speichern. Stellen Sie es wieder her, indem Sie den Textbereich vorab ausfüllen, bevor Sie den Editor initialisieren.

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. Mühelose automatische Formularübermittlung

Da MarkdownEditor direkt auf dem nativen <textarea> aufbaut, ist er sofort mit jedem Backend-Framework (Django, Laravel, PHP, Ruby on Rails usw.) kompatibel.

Hier kommt die „Native-First“-Philosophie zum Tragen. Sie müssen die Daten vor dem Absenden eines Formulars nicht manuell synchronisieren. Der Browser behandelt den Editor genau wie ein Standard-Eingabefeld.

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>

Hinweis: Die Initialisierung des MarkdownEditor-Plugins ist erforderlich

Verwenden Sie einfach ein Standard-HTML-<form>. Das Attribut name im Textbereich wird von Ihrem Server zur Identifizierung des Inhalts verwendet.

🚀 Warum es ein Game-Changer für Backends ist

Da der Editor das native Verhalten von <textarea> beibehält, verarbeitet Ihr Server die Daten als Standardzeichenfolge. Es ist keine zusätzliche Logik erforderlich – kein preventDefault() und keine manuelle FormData-Konstruktion.

💡 Warum dies ein „Killer-Feature“ ist:

Die meisten Editoren (wie Quill, Editor.js, simpleMDE, easyMDE) speichern Daten in komplexen JSON-Strukturen. Wenn ein Entwickler diese verwendet, muss er sein Datenbankschema und seine Rendering-Logik neu schreiben.

Mit MarkdownEditor kann ein Entwickler eine alte Website übernehmen und einen einfachen <textarea> durch Ihren Editor ersetzen, und das Backend merkt nicht einmal, dass sich etwas geändert hat. Es erhält einfach den gleichen Rohtext wie immer, aber der Benutzer erhält ein zehnmal besseres Erlebnis.

Rahmen / Sprache So greifen Sie auf den Markdown-Inhalt zu
PHP $_POST['content']
Django request.POST.get('content')
Node.js (Express) req.body.content
Laravel $request->input('content')
Ruby on Rails params[:content]

Konfigurationsoptionen

🖼️ Erweiterter Bild-Upload

Die native Handhabung von Bild-Uploads – anstatt sich auf langsame, speicherintensive Base64-Strings zu verlassen – ist ein erheblicher Gewinn sowohl für die Leistung als auch für die Suchmaschinenoptimierung.

Konfigurationsoptionen

Das Image-Tool unterstützt eine fileInput-Konfiguration zur Verarbeitung direkter Server-Uploads.

  • accept: Definieren Sie ein Array zulässiger Bildformate (z. B. „webp“, „avif“).
  • uploadUrl: Geben Sie den Backend-Endpunkt an, an den das File-Objekt per POST gesendet wird
  • params: Optionales Objekt zum Senden zusätzlicher Daten (wie CSRF-Tokens, Benutzer-IDs oder Ordnernamen) neben der Bilddatei

Anwendungsbeispiel (Vollständige Konfiguration)

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);

📡 Details zur Serverintegration

1. Die Anfrage

Der Editor sendet eine POST-Anfrage als multipart/form-data. Standardmäßig umfasst es:

  • image_file: Das eigentliche Dateiobjekt
  • image_alt: Der vom Benutzer eingegebene Alternativtext
  • ...plus alle benutzerdefinierten Daten, die im params-Objekt definiert sind
2. Die erforderliche Reaktion

Um einen erfolgreichen Upload zu bestätigen und das Bild in den Editor einzufügen, muss Ihr Server die folgende JSON-Struktur zurückgeben:

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

Hinweis: Stellen Sie sicher, dass Sie den Schlüssel image_path für die URL des hochgeladenen Bildes verwenden.

Bild-Alt-Text-Validierung (altInput)

Um sicherzustellen, dass Ihre Inhalte zugänglich und SEO-freundlich bleiben, erzwingt MarkdownEditor standardmäßig die Alt-Text-Validierung. Sie können dieses Verhalten entweder mithilfe einer booleschen Abkürzung oder eines detaillierten Objekts konfigurieren.

  • Standardverhalten: Wenn altInput nicht definiert ist, wird standardmäßig { erforderlich: true verwendet
  • Barrierefreiheit erzwingen: Benutzer können kein Bild einfügen, bis eine Alternativbeschreibung bereitgestellt wird
Konfigurationsbeispiele:
1. Standard (keine Konfiguration erforderlich)
javascript
1
2
3
4
// Alt text is REQUIRED by default
image: {
  fileInput: { uploadUrl: '/api/upload' }
}
2. Abkürzung (Validierung deaktivieren)

Wenn Sie Bilder ohne Beschreibung zulassen möchten, setzen Sie einfach den booleschen Wert auf false.

javascript
1
2
3
image: {
  altInput: false // Users can now skip the alt text field
}
3. Objektbasiert (explizit)
javascript
1
2
3
4
5
image: {
    altInput: {
        required: false // Disables alt text validation — users can skip the alt field
    }
}

Standardbildverwendung (kein fileInput):

Wenn fileInput nicht konfiguriert ist, verwendet der Editor standardmäßig ein einfaches URL-basiertes Modal. Dies ist ideal, wenn Ihre Benutzer hauptsächlich auf externe Image-Hosts verlinken.

javascript
1
2
3
4
5
6
7
8
const options = {
  toolbar: [
    'link',
    'image',
    'preview'
  ],
}
const editor = new MarkdownEditor('#markdown-editor', options);
💡 Warum Parameter verwenden?

In Frameworks wie Laravel oder Django können Sie keine Dateien ohne CSRF-Token hochladen. Durch das Hinzufügen von _token zum params-Objekt wird Ihre Anfrage nahtlos durch die Sicherheits-Middleware des Backends geleitet und behält so die „Zero Logic“-Philosophie für Ihre serverseitigen Controller bei.

🔀 Bearbeitungsmodi

MarkdownEditor bietet zwei unterschiedliche Möglichkeiten zum Schreiben und Formatieren Ihrer Inhalte. Sie können zwischen einer traditionellen syntaxorientierten Ansicht und einem modernen, visuell ausgerichteten Erlebnis wechseln.

Konfiguration

Sie können den Startmodus mithilfe der Eigenschaft mode während der Initialisierung definieren.

  • plain (Standard): Eine saubere, leistungsstarke Markdown-Umgebung, in der die Syntax (wie **bold** oder # heading) sichtbar ist. Ideal für Entwickler und Markdown-Puristen
  • hybrid: Ein WYSIWYG-inspiriertes Erlebnis, das Formatierungen (Fett, Kursiv, Überschriften) während der Eingabe in Echtzeit wiedergibt und dabei die zugrunde liegende Markdown-Struktur beibehält.
Durchführung:
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'
});
Vorschau des Hybrid- und Normalmodus:
Hybridmodus

Visuelle Formatierungen werden während der Eingabe in Echtzeit gerendert.

Einfacher Modus (Standard)

Konzentriert sich auf die reine Markdown-Syntax für ein unkompliziertes Erlebnis.

Konfig Eigentum / Werkzeug Beschreibung
Optionsobjekt placeholder Legt den Platzhaltertext für den Textbereich fest (optional, da Sie auch das Standard-HTML-Textbereichsattribut verwenden können)
mode: 'hybrid' Ermöglicht ein WYSIWYG-inspiriertes Erlebnis, das Formatierungen (Fett, Kursiv, Überschriften) in Echtzeit während der Eingabe wiedergibt
toolbar: Bestimmt, welche Werkzeuge
in der Symbolleiste angezeigt werden und in welcher Reihenfolge.
heading Öffnet ein Dropdown-Menü zur Auswahl der Überschriftenebene H1–H6
bold Aktiviert die fette Textformatierung.
italic Aktiviert die kursive Textformatierung.
strikethrough Ermöglicht das Durchstreichen von Text.
ol (Geordnete Liste): Konvertiert Text in ein nummeriertes Listenformat.
ul (Ungeordnete Liste): Wandelt Text in eine Aufzählungspunktliste um.
checklist Fügt Ihrem Text Kontrollkästchen hinzu, wodurch er sich hervorragend für Aufgaben, To-Do-Listen oder die Verfolgung des Abschlussstatus eignet.
blockquote Markieren Sie zitierten oder hervorgehobenen Text.
code Umschließt ausgewählten Text für Inline-Code in einzelne Backticks. Durch erneutes Klicken werden die Backticks entfernt.
codeblock Umschließt ausgewählten Text in einen umzäunten Codeblock mit drei Backticks. Durch erneutes Klicken werden die Zäune entfernt.
hr Fügt eine horizontale Linie --- an der Cursorposition in einer eigenen Zeile ein.
table Fügt an der Cursorposition eine Starter-2x3-Markdown-Tabellenvorlage ein.
image Ermöglicht das Einfügen von Bildern über die Markdown-Syntax.
link Ermöglicht das Hinzufügen von Hyperlinks zu Ihrem Text.
undo Um die letzten Änderungen rückgängig zu machen.
redo Um die letzten rückgängig gemachten Änderungen erneut anzuwenden.
indent Um die Einrückungsebene zu erhöhen.
outdent Zum Verringern der Einrückungsebene.
preview Schaltet eine Vollbild-Vorschau nebeneinander um. Kontrollkästchen im Vorschaubereich sind anklickbar und aktualisieren die Markdown-Quelle sofort. Drücken Sie Escape, um den Vollbildmodus zu verlassen.
Erweiterte Bild-Upload-Funktion:
Ermöglicht das Konfigurieren von Bild-Uploads auf Ihren eigenen Server und das Festlegen des Bild-
-Pfads über eine API. Dies verbessert die Leistung und SEO.
fileInput accept: Array zulässiger Bilddateitypen (z. B. 'webp', 'avif').
uploadUrl: Backend-Endpunkt, an den die Datei per POST gesendet wird.
params: Optionales Objekt für zusätzliche Daten (CSRF-Tokens, Benutzer-IDs, Ordnernamen)
altInput erforderlich: false: Deaktiviert die Validierung der Alt-Text-Eingabe (Standard ist true)

⌨️ Tastaturkürzel

Gängige Formatierungsaktionen können direkt über die Tastatur ausgelöst werden, ohne die Symbolleiste zu berühren. Jede Verknüpfung wird auch im Tooltip der entsprechenden Symbolleistenschaltfläche angezeigt.

Abkürzung Aktion
Ctrl + B  /  ⌘ B Schalten Sie Fett um
Ctrl + I  /  ⌘ I Schalten Sie Kursiv um
Ctrl + K  /  ⌘ K Link einfügen
Ctrl + `  /  ⌘ ` Inline-Code umschalten
Ctrl + Shift + S  /  ⌘ ⇧ S Schalten Sie Durchgestrichen um
Ctrl + Z  /  ⌘ Z Rückgängig machen
Ctrl + Shift + Z  /  ⌘ ⇧ Z Wiederholen
Tab Ausgewählte Zeilen einrücken
Shift + Tab Ausgewählte Zeilen ausrücken
Ctrl + F  /  ⌘ F Öffnen Sie das Suchfeld
Ctrl + H  /  ⌘ H Öffnen Sie das Bedienfeld „Suchen und Ersetzen“.
Escape Schließen Sie das Suchfeld/Vollbildvorschau beenden

🔍 Finden & Ersetzen

Im Editor ist ein integriertes Such- und Ersetzungsfeld verfügbar – keine Browsererweiterung oder separates Tool erforderlich.

  • Drücken Sie Strg + F (oder ⌘ F), um das Feld Suchen zu öffnen
  • Drücken Sie Strg + H (oder ⌘ H), um das Suchen & Ersetzen Sie das Panel
  • Die Suche berücksichtigt Groß- und Kleinschreibung und zeigt einen Live-Match-Zähler an (z. B. 3 von 12).
  • Navigieren Sie durch Übereinstimmungen mit den Tasten ▲ / ▼ oder Eingabetaste / Umschalt + Eingabetaste
  • Ersetzen ersetzt die aktuell hervorgehobene Übereinstimmung; Alle ersetzen ersetzt jedes Vorkommen auf einmal
  • Drücken Sie Escape, um das Bedienfeld zu schließen und den Fokus wieder auf den Editor zu richten

Das Bedienfeld verschiebt sich in der oberen rechten Ecke des Editor-Inhaltsbereichs und unterbricht den Schreibvorgang nicht.

🌙 Thematisierung

MarkdownEditor erbt sein Design automatisch von der umgebenden Seite – keine Konfiguration erforderlich. Der Editor liest bei der Initialisierung data-theme vom nächstgelegenen Vorfahren, sodass es sofort mit dem Theme Ihrer Website synchronisiert bleibt.

Wie das Thema gelöst wird (Prioritätsreihenfolge)

  1. theme-Option – explizite Überschreibung, die im Optionsobjekt übergeben wird
  2. data-theme auf dem <textarea> – direkt auf dem Element festgelegt
  3. data-theme auf einem beliebigen Vorfahren – z.B. <html>, <body> oder ein Wrapper <div>

Verfügbare Themen

'light' (Standard), 'dark', 'snowberry', 'darkberry'

Option 1 – von <html> oder einem beliebigen Vorfahren erben (keine Konfiguration)
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>
Option 2 – data-theme direkt auf <textarea> festlegen
html
1
2
3
4
<textarea id="markdown-editor" data-theme="dark"></textarea>
<script>
  new MarkdownEditor('#markdown-editor');
</script>
Option 3 – explizite theme-Option (überschreibt alles)
javascript
1
2
3
new MarkdownEditor('#markdown-editor', {
    theme: 'dark'
});

🎨 Benutzerdefiniertes Design über CSS-Variablen

Sie können das Aussehen des Editors vollständig anpassen, indem Sie seine CSS-Variablen im Element .markdown-editor-wrapper oder einem beliebigen [data-theme]-Selektor überschreiben. Alle Farben verwenden den OKLCH-Farbraum für wahrnehmungsmäßig einheitliche Ergebnisse.

Variable Zweck Lichtstandard Dunkle Standardeinstellung
--color-base Hintergrund des Herausgebers oklch(100% 0 0) oklch(10.9% 0 0)
--color-on-base Primäre Textfarbe oklch(22% 0 0) oklch(98% 0 0)
--color-primary Primärer Akzent (Symbolleiste aktiv, Links) oklch(51.1% .262 277) oklch(66.4% .184 286)
--color-on-primary Text auf primärfarbigen Oberflächen oklch(96.2% .018 272) oklch(10% .01 270)
--color-secondary Sekundärer Akzent oklch(59.1% .293 323) oklch(65% .18 220)
--color-accent Hervorhebungsakzent (Inline-Code, kursiv) oklch(54.1% .281 293) oklch(75% .18 50)
--color-neutral Neutrale Flächen (Ränder, Trennwände) oklch(15% 0 0) oklch(85% 0 0)
--color-error Farbe des Fehlerstatus oklch(57.7% .245 27) oklch(60% .22 30)
--border-radius Eckenabrundung des Editorrahmens 0.25rem
Beispiel für ein benutzerdefiniertes Theme

Überschreiben Sie alle Variablen in .markdown-editor-wrapper, nachdem der Editor initialisiert wurde, oder definieren Sie einen benutzerdefinierten [data-theme]-Block in Ihrem Stylesheet:

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' });
  • Echtzeitvorschau: Sehen Sie, wie Ihr Markdown während der Eingabe sofort gerendert wird.
  • Syntaxhervorhebung: Verbesserte Lesbarkeit durch klaren Code und Markdown-Formatierung.
  • Einfache Integration: Nahtlose Integration in jedes Webprojekt mit minimalem Setup.
  • Anpassbare Symbolleiste: Konfigurieren Sie Symbolleistenoptionen wie Fettschrift, Kursivschrift und mehr dynamisch und ordnen Sie sie neu an.

Merkmale

🔌 Native Formularintegration

Funktioniert genau wie ein Standard-<textarea>. Keine komplexen APIs – verwenden Sie einfach das Attribut value oder name. Es „funktioniert einfach“ mit Standard-HTML-Formularübermittlungen in PHP, Django oder Node.js.

🖼️ Erweiterter Bild-Upload

Konfigurieren Sie native Server-Uploads über die API. Vermeiden Sie schwere Base64-Strings, um schnellere Seitenladevorgänge und eine bessere Suchmaschinenoptimierung zu gewährleisten, indem Sie Bilder auf Ihrem eigenen CDN hosten.

🔀 Hybrid- und Normalmodus

Wechseln Sie zwischen einem Hybrid (WYSIWYG)-Erlebnis für die visuelle Bearbeitung oder dem Plain Markdown-Modus für ein traditionelles Codierungsgefühl.

🚀 Hohe Leistung

Ein kleines ~116 KB-Paket, optimiert für „Heavy Content“. Verarbeitet umfangreiche Dokumente und große Dateien ohne Eingabeverzögerung oder Leistungseinbußen.

🌍 Integrierte RTL-Unterstützung

Native Unterstützung für Rechts-nach-Links-Sprachen wie Arabisch, Urdu und Farsi. Perfekt für die Erstellung global zugänglicher Anwendungen.

🌙 Adaptives Theming

Beinhaltet automatische Unterstützung für den Dunkelmodus. Es synchronisiert sich mit Ihren Systemeinstellungen oder der Frutjam UI-Bibliothek für ein nahtloses visuelles Erlebnis.

📝 Intelligente Bearbeitung

Automatische Listenfortsetzung im GitHub-Stil für geordnete Listen, ungeordnete Listen und Checklisten – drücken Sie die Eingabetaste und der Editor setzt das Muster fort. Kontrollkästchen im Vorschaubereich sind anklickbar und werden sofort wieder mit der Markdown-Quelle synchronisiert.

📱 Vollständig reaktionsfähig

Eine flüssige, auf Mobilgeräte ausgerichtete Benutzeroberfläche, die sich für die Bearbeitung unterwegs perfekt an Desktops, Tablets und Smartphones anpasst.

📦 Universelle Unterstützung

Kompatibel mit ESM, UMD, CommonJS und IIFE. Funktioniert sofort über CDN (<script src>), npm oder einen beliebigen Bundler (Vite, Webpack, Rollup) – keine zusätzliche Konfiguration erforderlich.

♿ Standardmäßig zugänglich

Vollständige ARIA-Unterstützung integriert – Wahrzeichen der Symbolleiste, beschrifteter Vorschaubereich, bildschirmleserfreundliche Schaltflächen, aria-pressed beim Vorschau-Schalter, deaktiviert und aria-disabled bei inaktiven Werkzeugen und korrekte Fokuswiederherstellung, wenn Modalitäten geschlossen werden.

🛡️ Keine CSS-Konflikte

Editor-Stile gelten vollständig für .markdown-editor-wrapper. Der globale Preflight von Tailwind ist ausgeschlossen, sodass der Editor sicher neben Bootstrap, Tailwind oder einem anderen Framework leben kann, ohne deren Stile zu brechen.

⌨️ Tastaturkürzel

Strg+B, Strg+I, Strg+K, Strg+`, Strg+Umschalt+S – gängige Formatierungsaktionen ohne Berührung der Maus. Jede Verknüpfung wird im Tooltip der Symbolleistenschaltfläche angezeigt.

🔍 Finden & Ersetzen

Drücken Sie Strg+F, um zu suchen, oder Strg+H, um die Such- und Suchfunktion zu öffnen. ersetzen. Suche ohne Berücksichtigung der Groß-/Kleinschreibung mit Live-Match-Zähler, Nächster/Vorheriger-Navigation, Einzelersetzen und Alle ersetzen – ohne den Editor zu verlassen.

Vollständiges Konfigurationsbeispiel

Verwenden Sie dieses umfassende Beispiel, um MarkdownEditor mit allen Hauptfunktionen zu initialisieren, einschließlich der benutzerdefinierten Symbolleistenreihenfolge und der erweiterten Handhabung des Bild-Uploads.

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();