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').valuewie 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.
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'}), } |
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.
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_with – params[:content] enthält den Markdown. Verwenden Sie für Turbo Drive turbo:load anstelle von DOMContentLoaded.
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.
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.
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 h1–h6, 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.)
npm install markdown-text-editor |
1 2 | import MarkdownEditor from 'markdown-text-editor'; new MarkdownEditor('#markdown-editor'); |
CDN: ES-Modul
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.
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.
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.
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
placeholderangeben, verwendet das Plugin automatisch dasplaceholder-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
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.
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.
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.
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.
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.
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.
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.
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.
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 dasFile-Objekt perPOSTgesendet wirdparams: Optionales Objekt zum Senden zusätzlicher Daten (wie CSRF-Tokens, Benutzer-IDs oder Ordnernamen) neben der Bilddatei
Anwendungsbeispiel (Vollständige Konfiguration)
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 Dateiobjektimage_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:
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
altInputnicht definiert ist, wird standardmäßig{ erforderlich: trueverwendet - Barrierefreiheit erzwingen: Benutzer können kein Bild einfügen, bis eine Alternativbeschreibung bereitgestellt wird
Konfigurationsbeispiele:
1. Standard (keine Konfiguration erforderlich)
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.
1 2 3 | image: { altInput: false // Users can now skip the alt text field } |
3. Objektbasiert (explizit)
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.
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-Puristenhybrid: 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:
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 Werkzeugein 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 |
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)
theme-Option – explizite Überschreibung, die im Optionsobjekt übergeben wirddata-themeauf dem<textarea>– direkt auf dem Element festgelegtdata-themeauf 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)
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
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)
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:
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; } |
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.
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(); |