JavaScript için Yerel İlk, Yüksek Performanslı Markdown Eklentisi
Son güncelleme:
Yerel bir metin alanını tam bir düzenleme paketine dönüştüren Markdown metin düzenleyici eklentisi; senkronizasyon gerekmez. WYSIWYG ve düz Markdown modları, canlı önizleme, bul ve değiştir, RTL desteği, karanlık mod. Django, Laravel, Rails, Node.js, PHP ve herhangi bir yığınla çalışır.
Felsefe: "Önce Yerli"
Çoğu editör standart web iş akışını bozar. MarkdownEditor bunu benimsiyor.
Doğrudan bir <textarea>'ın üzerinde yer aldığından, verileri işlemenin yeni bir yolunu öğrenmenize gerek yoktur.
- Veri Bağlamaya Gerek Yok: Kutudan çıktığı haliyle
<form method="POST">ile çalışır - Standart Erişim:
document.getElementById('editor').value'u normal bir giriş gibi kullanın. - Arka Uç Agnostik: Normal bir form alanı gibi herhangi bir arka uçla (Python, Node.js, PHP vb.) çalışır
MarkdownEditor vs EasyMDE / SimpleMDE
Çoğu JavaScript işaretleme düzenleyicisi - EasyMDE, SimpleMDE, CodeMirror tabanlı düzenleyiciler - <textarea>'inizi özel bir öğeyle değiştirin. Bu, form gönderiminin kesintiye uğradığı, .value'in hiçbir şey döndürmediği ve yalnızca içeriği tekrar okumak için fazladan kod yazmanız gerektiği anlamına gelir. MarkdownEditor farklıdır — mevcut metin alanınızı geliştirir ve asla onun yerini almaz.
| Özellik | Markdown Düzenleyicisi | EasyMDE / SimpleMDE |
|---|---|---|
| Yerel metin alanı korundu | ✅ | ❌ Değiştirildi |
| Form gönderimi olduğu gibi çalışır | ✅ | ❌ Ekstra JS gerektirir |
.value aracılığıyla değeri al/ayarla |
✅ | ❌ Özel API gerekli |
| WYSIWYG hibrit modu | ✅ | ❌ |
| Yerleşik Bul ve Değiştir | ✅ | ❌ |
| Sağdan sola destek | ✅ | ❌ |
| CSP uyumlu (satır içi JS yok) | ✅ | ❌ |
| Sıfır CSS çakışması | ✅ | ❌ |
| Karanlık mod / tema | ✅ | Sınırlı |
| Paket boyutu | ~116KB | ~300KB+ |
Çerçeve Entegrasyonu
MarkdownEditor yerel <textarea>'i koruduğu için herhangi bir ekstra kod olmadan her arka uç çerçevesiyle bütünleşir. Sunucunuz işaretleme içeriğini tam olarak herhangi bir standart form alanından aldığı gibi alır.
Django
Textarea widget'ınıza bir class ekleyin ve düzenleyiciyi başlatın — request.POST['content'], hiçbir ekstra adım olmadan çalışır.
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
f.text_area'i bir sınıfla kullanın — $request->input('content'), işaretlemeyi doğrudan alır.
1 2 | <textarea name="content" class="markdown-editor">{{ old('content') }}</textarea> <script>new MarkdownEditor('.markdown-editor');</script> |
Ruby on Rails
Kutudan çıktığı haliyle form_with ile çalışır — params[:content] işaretlemeyi içerir. Turbo Drive için DOMContentLoaded yerine turbo:load kullanın.
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 / Ekspres
req.body.content, form gönderiminde indirimi alır; senkronizasyon adımı yok, özel çıkarma yok.
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'] tam olarak herhangi bir standart metin alanıyla aynı şekilde çalışır; onu bırakın ve mevcut form işlemeniz sıfır değişiklik gerektirir.
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> |
Temel Özellikler
🖼️ Gelişmiş Resim Yükleme (SEO Optimize Edilmiş)
Veritabanınızı ağır Base64 dizeleriyle şişirmeyin. Görüntüleri doğrudan sunucunuza veya S3 klasörünüze yüklemek için API'mizi yapılandırın. Düzenleyici URL'yi alarak Markdown dosyalarınızı hafif ve sitenizin SEO sıralamasını yüksek tutar.
🔀 Hibrit ve Sade Modlar
Kullanıcılarınıza her iki dünyanın da en iyisini sunun. Kolay biçimlendirme için Görsel (WYSIWYG) Karma mod ile dikkat dağıtmayan, ham sözdizimi düzenleme için Düz İşaretleme modu arasında geçiş yapın.
🌍 RTL Desteğiyle Global Kullanıma Hazır
Sağdan Sola (RTL) diller için tam yerel destek. Otomatik metin yönü hizalamayla Arapça, Urduca veya Farsça desteği gerektiren projeler için mükemmeldir.
⚡ Geniş Ölçekte Performans
- Hafif: Sayfa yüklemenizi yavaşlatmayacak, yaklaşık 116 KB'lik küçük bir alan
- Büyük Belge Desteği: Giriş gecikmesi veya tarayıcının donması olmadan binlerce satırlık metni işleyecek şekilde optimize edildi
- Akıllı İşleme: Geri dönen önizleme güncellemeleri, önbelleğe alınmış stil hesaplamaları ve liste devamı ile girinti arasında çakışmayan klavye kullanımı; böylece Sekme ve Enter her zaman tam olarak tek bir şey yapar
♿ Varsayılan Olarak Erişilebilir
Tam ARIA desteği yerleşiktir ve ekstra yapılandırma gerektirmez. Araç çubuğu uygun bir role="toolbar" yer işaretidir, önizleme bölmesi role="region" etiketlidir, tüm SVG simgeleri ekran okuyuculardan gizlenmiştir, önizleme geçişi açık/kapalı durumunu aria-pressed aracılığıyla gösterir ve devre dışı bırakılan araç çubuğu düğmeleri hem disabled hem de aria-disabled kullanır, böylece yardımcı teknoloji asla yanıltılmaz. Modlar kapatıldığında odağı tetikleme düğmesine döndürür.
🛡️ Sıfır CSS Çatışması
Tüm düzenleyici stilleri tamamen .markdown-editor-wrapper öğesinin kapsamına alınmıştır. Tailwind'in genel ön kontrolü (h1–h6, a, button, vb. için öğe sıfırlamaları) hariç tutulur, böylece düzenleyici tek bir stili bozmadan aynı sayfada Bootstrap, Tailwind veya başka herhangi bir CSS çerçevesiyle birlikte yaşayabilir.
🔒 XSS Güvenli Önizleme
Oluşturulan önizleme, DOM'a yazılmadan önce DOMPurify aracılığıyla temizlenir. Hazırlanan etiketleme girişindeki komut dosyası etiketleri, satır içi olay işleyicileri ve kötü amaçlı URL'ler otomatik olarak çıkarılır; hiçbir yapılandırma gerekmez.
Markdown Düzenleyici Demosu
Hızlı Uygulama
1. Kurulum
NPM (paketleyiciler: Vite, webpack, Rollup vb.)
npm install markdown-text-editor |
1 2 | import MarkdownEditor from 'markdown-text-editor'; new MarkdownEditor('#markdown-editor'); |
CDN: ES modülü
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: global komut dosyası etiketi (IIFE)
İçe aktarmaya gerek yok — MarkdownEditor otomatik olarak global bir değişken olarak kullanılabilir.
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. Yapılandırma ve Başlatma
Düzenleyiciyi özelleştirmek için bir seçenekler nesnesi iletin. Tüm seçenekler isteğe bağlıdır; varsayılan değeri kullanmak için herhangi birini atlayın.
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 Düzenleyiciyi beğeniyor musunuz?
2 saniye sürer ve projenin büyümesine yardımcı olur. Bu, ücretsiz bir Tailwind CSS bileşen kitaplığı olan Frutjam'in bir parçasıdır; oradaki bir yıldız da yardımcı olur.
4. Yapılandırma ve Özelleştirme
Bir options nesnesi ileterek düzenleyicinin davranışını ve arayüzünü tamamen özelleştirebilirsiniz. Bir seçeneği atlarsanız varsayılan değer kullanılır.
| Mülk | Tip | Varsayılan | Amaç |
|---|---|---|---|
mode |
string |
'plain' |
Başlangıç görünümünü ayarlar. WYSIWYG deneyimi için hibrit kullanın veya ham sözdizimi için düz kullanın. |
placeholder |
string |
'Write...' |
Düzenleyici boş olduğunda gösterilen metin. |
toolbar |
array |
[...] |
Hangi araçların hangi sırayla görüneceğini tanımlar. |
footer |
false | object |
hepsi görünür | Düzenleyicinin altında gösterilen durum çubuğunu kontrol eder. Tamamen gizlemek için false olarak ayarlayın veya istatistikleri tek tek değiştirmek için bir nesne iletin. |
theme |
string |
miras alınan | Düzenleyici temasını (açık, koyu, kar meyvesi, kara meyve) açıkça ayarlar. Atlanırsa düzenleyici, data-theme'i en yakın üst öğeden veya <textarea>'in kendisinden devralır. |
minHeight |
number |
200 |
İçerik kısa olduğunda düzenleyicinin küçüleceği piksel cinsinden minimum yükseklik. Otomatik büyüme aralığını ayarlamak için maxHeight ile eşleşir. |
maxHeight |
number |
500 |
Düzenleyicinin tam ekran olmayan modda büyüyebileceği maksimum piksel yüksekliği. İçerik bu yüksekliği aştığında düzenleyicinin içinde bir kaydırma çubuğu görünür. Düzenleyicinin ayrıca bir sürükleme kolu vardır, böylece kullanıcılar bu sınırın ötesinde manuel olarak yeniden boyutlandırabilirler. |
onChange |
function |
undefined |
Yazma, araç çubuğu eylemleri, geri alma/yineleme ve listenin devamı gibi her içerik değişikliğinde geri arama tetiklendi. Geçerli işaretleme dizesini tek bağımsız değişken olarak alır. |
🛠 Araç Çubuğu Özelleştirmesi
Araç çubuğu modülerdir. Diziyi değiştirerek minimal bir deneyim veya tam özellikli bir güç paketi oluşturabilirsiniz.
Mevcut Araçlar
| Kategori | Araç Tuşları |
|---|---|
| Tipografi | heading, bold, italic, strikethrough, blockquote |
| Listeler | ul (kurşun), ol (sayılı), checklist |
| Kod | code (Çizgide), codeblock (çitle çevrili blok) |
| Ekler | hr (yatay cetvel), table (masa şablonu) |
| Medya | link, image |
| Düzenleme | undo, redo, indent, outdent |
| Görüş | preview |
💡 Uygulama İpuçları:
- Yeniden sıralama: Düğmeler, dizide tam olarak listelediğiniz sırayla görünür
- Kaldırma: Bu özelliği kullanıcı açısından tamamen devre dışı bırakmak için dizideki herhangi bir anahtarı (
imagegibi) çıkarmanız yeterlidir. - Yerel Geri Dönüş: JS'de bir
yer tutucusağlamazsanız, eklenti otomatik olarak HTML<textarea>'ınızdakiplaceholderözelliğini kullanır.
📊 Alt Bilgi (Durum Çubuğu)
Alt bilgi, düzenleyicinin altında bulunur ve imlecin satırını, sütununu, belgenin karakter sayısını ve isteğe bağlı olarak kelime sayısını gösterir; tümü gerçek zamanlı olarak güncellenir. Varsayılan olarak görünür ve her istatistik bağımsız olarak değiştirilebilir.
| Anahtar | Tip | Varsayılan | Tanım |
|---|---|---|---|
line |
boolean |
true |
Geçerli satır numarasını göster. |
col |
boolean |
true |
Geçerli sütun numarasını göster. |
chars |
boolean |
true |
Toplam karakter sayısını göster. |
words |
boolean |
false |
Toplam kelime sayısını göster. Varsayılan olarak kapalı — etkinleştirmek için true olarak ayarlayın. |
Kullanım Örnekleri
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. İçerik Alma, Ayarlama ve Gönderme
MarkdownEditor'ün temel güçlü yönlerinden biri, temeldeki <textarea>'ı mükemmel şekilde senkronize tutmasıdır. İster modern bir JavaScript çerçevesi ister Django, PHP veya Laravel gibi geleneksel bir arka uç kullanıyor olun, iş akışı basit ve yerel kalır.
1. Yerli Yol (Önerilir)
Düzenleyici standart bir metin alanını geliştirdiğinden, tanıdık DOM yöntemlerini kullanabilirsiniz. Bu, yeni bir API öğrenmeden verilerinizle etkileşim kurmanın en hızlı yoludur.
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. Değişken Referans Kullanma
Textarea öğesine bir referansınız varsa onu doğrudan kullanabilirsiniz; kitaplığa özgü API gerekmez.
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. İçeriği ayarlama ve okuma
Başlangıç içeriğini ayarlamanın önerilen yolu doğrudan <textarea> HTML'sindedir; bu, her arka uç çerçevesinde (Django, Laravel, Rails, PHP, vb.) doğal olarak çalışır ve düzenleyici bunu init'te otomatik olarak oluşturur.
1 2 | <!-- Recommended: set content server-side --> <textarea id="markdown-editor"># Hello World</textarea> |
İçeriği çalışma zamanında okumak veya güncellemek için yerel textarea değerini kullanın. Önizleme ve hibrit katmanı yenilemek için güncellemeden sonra editor.render()'ı çağırın.
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. Düzenleyiciyi yıkmak — destroy()
Düzenleyici DOM sarmalayıcısını kaldırmak ve orijinal <textarea> dosyasını belgedeki konumuna geri yüklemek için editor.destroy()'u çağırın. Bir görünümün bağlantısını keserken tek sayfalı uygulamalarda kullanışlıdır.
1 2 3 4 | const editor = new MarkdownEditor('#markdown-editor'); // Remove the editor and restore the plain textarea editor.destroy(); |
onChange ile değişikliklere tepki verme
Her içerik değişikliğinde bilgilendirilmek için bir onChange geri çağrısı iletin. Geçerli işaretleme dizesini alır.
1 2 3 4 5 | const editor = new MarkdownEditor('#markdown-editor', { onChange(value) { console.log('Content changed:', value.length, 'characters'); } }); |
localStorage ile taslak otomatik kaydetme
Her tuş vuruşunda bir taslak kaydetmek için onChange'i kullanın. Düzenleyiciyi başlatmadan önce metin alanını önceden doldurarak geri yükleyin.
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. Zahmetsiz Otomatik Form Gönderimi
MarkdownEditor doğrudan yerel <textarea> üzerinde oluşturulduğundan, kutudan çıktığı anda her arka uç çerçevesiyle (Django, Laravel, PHP, Ruby on Rails, vb.) uyumludur.
Burası "Önce Yerli" felsefesinin parladığı yerdir. Formu göndermeden önce verileri manuel olarak senkronize etmeniz gerekmez. Tarayıcı, düzenleyiciye tam olarak standart bir giriş alanı gibi davranır.
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> |
Not: MarkdownEditor eklentisinin başlatılması zorunludur
Sadece standart bir HTML <form> kullanın. Textarea'daki name özelliği, sunucunuzun içeriği tanımlamak için kullanacağı özelliktir.
🚀 Neden Arka Uçlar İçin Oyunun Kurallarını Değiştiriyor?
Düzenleyici yerel <textarea> davranışını koruduğu için, sunucunuz verileri standart bir dize olarak işler. Hiçbir ekstra mantık gerekmez; preventDefault() yok ve manüel FormData yapısı yok.
💡 Bu neden bir "Öldürücü Özellik":
Çoğu düzenleyici (Quill, Editor.js, simpleMDE, easyMDE gibi) verileri karmaşık JSON yapılarında kaydeder. Bir geliştirici bunları kullanıyorsa, veritabanı şemasını ve oluşturma mantığını yeniden yazması gerekir.
MarkdownEditor ile bir geliştirici eski bir web sitesini alıp düz bir <textarea> dosyasını editörünüzle değiştirebilir ve arka uç bunun değiştiğini bile bilmez. Her zaman aldığı ham metni alır ancak kullanıcı 10 kat daha iyi bir deneyim yaşar.
| Çerçeve / Dil | Markdown içeriğine nasıl erişilir? |
|---|---|
| PHP | $_POST['content'] |
| Django | request.POST.get('content') |
| Node.js (Express) | req.body.content |
| Laravel | $request->input('content') |
| Ruby on Rails | params[:content] |
Yapılandırma Seçenekleri
🖼️ Gelişmiş resim yükleme
Yavaş, bellek ağırlıklı Base64 dizelerine güvenmek yerine, görüntü yüklemelerini yerel olarak yönetmek, hem performans hem de SEO açısından önemli bir kazançtır.
Yapılandırma Seçenekleri
Resim aracı, doğrudan sunucuya yüklemeleri gerçekleştirmek için bir fileInput yapılandırmasını destekler.
kabul et: İzin verilen resim formatlarının bir dizisini tanımlayın (ör. 'webp', 'avif')uploadUrl:FilenesnesininPOSTyoluyla gönderileceği arka uç uç noktasını belirtinparams: Görüntü dosyasının yanında ek veriler (CSRF belirteçleri, kullanıcı kimlikleri veya klasör adları gibi) göndermek için isteğe bağlı nesne
Kullanım örneği (Tam Yapılandırma)
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); |
📡 Sunucu Entegrasyon Detayları
1. Talep
Düzenleyici, multipart/form-data olarak bir POST isteği gönderir. Varsayılan olarak şunları içerir:
resim_dosyası: Gerçek dosya nesnesiimage_alt: Kullanıcının girdiği alternatif metin- ...artı
paramsnesnesinde tanımlanan tüm özel veriler
2. Gerekli Yanıt
Başarılı bir yüklemeyi onaylamak ve resmi düzenleyiciye eklemek için sunucunuzun aşağıdaki JSON yapısını döndürmesi gerekir:
1 2 3 4 | { "success": true, "image_path": "https://cdn.yourdomain.com/uploads/image.webp" } |
Not: Yüklenen resmin URL'si için resim_yolu anahtarını kullandığınızdan emin olun.
Resim Alternatif Metin Doğrulaması (altInput)
İçeriğinizin erişilebilir ve SEO dostu kalmasını sağlamak için MarkdownEditor, varsayılan olarak alternatif metin doğrulamasını zorunlu kılar. Bu davranışı bir boole kısayolu veya ayrıntılı bir nesne kullanarak yapılandırabilirsiniz.
- Varsayılan Davranış:
altInputtanımlanmamışsa, varsayılan olarak{ gerekli: trueolur - Erişilebilirliği Zorunlu Hale Getirin: Bir alternatif açıklama sağlanana kadar kullanıcıların resim eklemesi engellenir
Yapılandırma Örnekleri:
1. Varsayılan (Yapılandırma gerekmez)
1 2 3 4 | // Alt text is REQUIRED by default image: { fileInput: { uploadUrl: '/api/upload' } } |
2. Kısa Yol (Doğrulamayı Devre Dışı Bırak)
Açıklamaları olmayan görsellere izin vermek istiyorsanız boole değerini false olarak ayarlamanız yeterlidir.
1 2 3 | image: { altInput: false // Users can now skip the alt text field } |
3. Nesne tabanlı (Açık)
1 2 3 4 5 | image: { altInput: { required: false // Disables alt text validation — users can skip the alt field } } |
Standart Görüntü Kullanımı (fileInput Yok):
fileInput yapılandırılmamışsa, düzenleyici varsayılan olarak basit bir URL tabanlı modal kullanır. Kullanıcılarınız çoğunlukla harici resim barındırıcılarına bağlantı veriyorsa bu idealdir.
1 2 3 4 5 6 7 8 | const options = { toolbar: [ 'link', 'image', 'preview' ], } const editor = new MarkdownEditor('#markdown-editor', options); |
💡 Param'ları neden kullanmalıyım?
Laravel veya Django gibi çerçevelerde CSRF belirteci olmadan dosya yükleyemezsiniz. params nesnesine _token eklendiğinde, isteğiniz arka ucun güvenlik ara yazılımından sorunsuz bir şekilde geçecek ve sunucu tarafı denetleyicileriniz için "Sıfır Mantık" felsefesini koruyacaktır.
🔀 Düzenleme Modları
MarkdownEditor içeriğinizi yazmanız ve biçimlendirmeniz için iki farklı yol sunar. Geleneksel sözdizimi odaklı görünüm veya modern, görsel öncelikli deneyim arasında geçiş yapabilirsiniz.
Yapılandırma
Başlatma sırasında mode özelliğini kullanarak başlatma modunu tanımlayabilirsiniz.
plain(Varsayılan): Sözdiziminin (**kalın**veya# başlıkgibi) görünür olduğu temiz, yüksek performanslı bir Markdown ortamı. Geliştiriciler ve Markdown'a sadık olanlar için idealkarma: Siz yazarken biçimlendirmeyi (Kalın, İtalik, Başlıklar) gerçek zamanlı olarak oluşturan ve aynı zamanda temeldeki Markdown yapısını koruyan, WYSIWYG'den ilham alan bir deneyim.
Uygulama:
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' }); |
Hibrit ve Düz Mod Önizlemesi:
Hibrit Mod
Siz yazarken görsel biçimlendirme gerçek zamanlı olarak oluşturulur.
Düz Mod (Varsayılan)
Hafif bir deneyim için ham Markdown sözdizimine odaklanır.
| Yapılandırma | Özellik / Araç | Tanım |
|---|---|---|
| Seçenekler nesnesi | placeholder |
Textarea için yer tutucu metni ayarlar (standart HTML textarea niteliğini de kullanabildiğiniz için isteğe bağlıdır) |
mode: 'hybrid' |
Siz yazarken biçimlendirmeyi (kalın, italik, başlıklar) gerçek zamanlı olarak işleyen, WYSIWYG'den ilham alan bir deneyim sağlar | |
araç çubuğu: Araç çubuğunda hangi araçlarıngörüneceğini ve bunların sırasını belirler. |
heading |
H1–H6 başlık düzeyini seçmek için bir açılır menü açar |
bold |
Kalın metin biçimlendirmesini etkinleştirir. | |
italic |
İtalik metin biçimlendirmesini etkinleştirir. | |
strikethrough |
Metnin üstü çizili olmasına izin verir. | |
ol |
(Sıralı Liste): Metni numaralı liste biçimine dönüştürür. | |
ul |
(Sırasız Liste): Metni madde işareti listesine dönüştürür. | |
checklist |
Metninize onay kutuları ekleyerek onu görevler, yapılacaklar listeleri veya tamamlanma durumunu izlemek için mükemmel hale getirir. | |
blockquote |
Alıntılanan veya vurgulanan metni vurgulayın. | |
code |
Satır içi kod için seçilen metni tek geri tırnaklara sarar. Tekrar tıklamak geri tıklamaları kaldırır. | |
codeblock |
Seçili metni üçlü geri tırnaklı çitli kod bloğuna sarar. Tekrar tıklamak çitleri kaldırır. | |
hr |
Kendi satırındaki imleç konumuna bir --- yatay kuralı ekler. |
|
table |
İmleç konumuna bir başlangıç 2x3 işaretleme tablosu şablonu ekler. | |
image |
İşaretleme sözdizimi yoluyla resim eklemenizi sağlar. | |
link |
Metninize köprüler eklemenizi sağlar. | |
undo |
Son değişiklikleri geri almak için. | |
redo |
Geri alınan son değişiklikleri yeniden uygulamak için. | |
indent |
Girinti düzeyini artırmak için. | |
outdent |
Girinti seviyesini azaltmak için. | |
preview |
Tam ekran yan yana önizlemeyi değiştirir. Önizleme bölmesindeki onay kutuları tıklanabilir ve işaretleme kaynağını anında günceller. Tam ekrandan çıkmak için Escape tuşuna basın. | |
| Gelişmiş resim yükleme özelliği: Kendi sunucunuza resim yüklemelerini yapılandırmanıza ve bir API aracılığıyla resim yolunu ayarlamanıza olanak tanır. Bu, performansı ve SEO'yu artırır. |
fileInput |
accept: İzin verilen resim dosyası türleri dizisi (ör. 'webp', 'avif').uploadUrl: Dosyanın POST aracılığıyla gönderildiği arka uç uç noktası.params: Ekstra veriler için isteğe bağlı nesne (CSRF belirteçleri, kullanıcı kimlikleri, klasör adları)
|
altInput |
gerekli: false: Alternatif metin girişi doğrulamasını devre dışı bırakır (varsayılan true'dur) |
⌨️ Klavye Kısayolları
Yaygın biçimlendirme eylemleri, araç çubuğuna dokunmadan doğrudan klavyeden tetiklenebilir. Her kısayol aynı zamanda karşılık gelen araç çubuğu düğmesinin araç ipucunda da gösterilir.
| Kısayol | Aksiyon |
|---|---|
Ctrl + B / ⌘ B |
Kalın'a geçiş yapın |
Ctrl + I / ⌘ I |
İtalik'e geçiş yap |
Ctrl + K / ⌘ K |
Bağlantı Ekle |
Ctrl + ` / ⌘ ` |
Satır içi Kod'u değiştir |
Ctrl + Shift + S / ⌘ ⇧ S |
|
Ctrl + Z / ⌘ Z |
Geri al |
Ctrl + Shift + Z / ⌘ ⇧ Z |
Yinele |
Tab |
Seçilen satırları girintile |
Shift + Tab |
Seçili satırların girintisini artır |
Ctrl + F / ⌘ F |
Bul panelini aç |
Ctrl + H / ⌘ H |
Bul ve Değiştir panelini aç |
Escape |
Bul panelini kapat / Tam ekran önizlemeden çık |
🔍 Bul ve bul Yer değiştirmek
Düzenleyicinin içinde yerleşik bir bul ve değiştir paneli mevcuttur; tarayıcı uzantısına veya ayrı bir araca gerek yoktur.
- Bul panelini açmak için
Ctrl + F(veya⌘ F) tuşlarına basın - Bul ve Bul'u açmak için
Ctrl + H(veya⌘ H) tuşlarına basın. Paneli değiştirin - Arama büyük/küçük harfe duyarlı değildir ve canlı bir eşleşme sayacı gösterir (ör. 3/12)
- ▲ / ▼ düğmelerini veya
Enter/Shift + Entertuşlarını kullanarak eşleşmelerde gezinin - Değiştir, vurgulanan mevcut eşleşmenin yerini alır; Tümünü Değiştir her tekrarı aynı anda değiştirir
- Paneli kapatmak ve odağı düzenleyiciye geri döndürmek için
Escapetuşuna basın
Panel, düzenleyici içerik alanının sağ üst köşesinde kayar ve yazmayı kesintiye uğratmaz.
🌙 Temalama
MarkdownEditor, temasını çevredeki sayfadan otomatik olarak devralır; herhangi bir yapılandırma gerekmez. Düzenleyici, başlatma sırasında en yakın atadan data-theme'i okur, böylece kutudan çıktığı haliyle sitenizin temasıyla senkronize kalır.
Tema nasıl çözümlenir (öncelik sırası)
themeoption — seçenekler nesnesinde iletilen açık geçersiz kılma<textarea>üzerindedata-theme— doğrudan öğe üzerinde ayarlanır- Herhangi bir atadaki
veri teması- ör.<html>,<body>veya sarmalayıcı<div>
Mevcut temalar
'açık' (varsayılan), 'dark', 'snowberry', 'darkberry'
Seçenek 1 — <html> veya herhangi bir üst öğeden devralın (sıfır yapılandırma)
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> |
Seçenek 2 — data-theme'i doğrudan <textarea> üzerinde ayarlayın
1 2 3 4 | <textarea id="markdown-editor" data-theme="dark"></textarea> <script> new MarkdownEditor('#markdown-editor'); </script> |
Seçenek 3 — açık theme seçeneği (her şeyi geçersiz kılar)
1 2 3 | new MarkdownEditor('#markdown-editor', { theme: 'dark' }); |
🎨 CSS Değişkenleri aracılığıyla Özel Tema
.markdown-editor-wrapper öğesinde veya herhangi bir [data-theme] seçicide CSS değişkenlerini geçersiz kılarak düzenleyicinin görünümünü tamamen özelleştirebilirsiniz. Tüm renkler, algısal olarak tekdüze sonuçlar için OKLCH renk alanını kullanır.
| Değişken | Amaç | Işık varsayılanı | Koyu varsayılan |
|---|---|---|---|
--color-base |
Düzenleyici arka planı | oklch(100% 0 0) |
oklch(10.9% 0 0) |
--color-on-base |
Birincil metin rengi | oklch(22% 0 0) |
oklch(98% 0 0) |
--color-primary |
Birincil vurgu (araç çubuğu etkin, bağlantılar) | oklch(51.1% .262 277) |
oklch(66.4% .184 286) |
--color-on-primary |
Ana renkli yüzeylerdeki metin | oklch(96.2% .018 272) |
oklch(10% .01 270) |
--color-secondary |
İkincil vurgu | oklch(59.1% .293 323) |
oklch(65% .18 220) |
--color-accent |
Vurguyu vurgulayın (satır içi kod, italik) | oklch(54.1% .281 293) |
oklch(75% .18 50) |
--color-neutral |
Nötr yüzeyler (kenarlıklar, bölücüler) | oklch(15% 0 0) |
oklch(85% 0 0) |
--color-error |
Hata durumu rengi | oklch(57.7% .245 27) |
oklch(60% .22 30) |
--border-radius |
Editör çerçevesinin köşelerinin yuvarlatılması | 0.25rem |
|
Özel tema örneği
Düzenleyici başlatıldıktan sonra .markdown-editor-wrapper'daki herhangi bir değişkeni geçersiz kılın veya stil sayfanızda özel bir [data-theme] bloğu tanımlayın:
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' }); |
- Gerçek Zamanlı Önizleme: Siz yazarken işaretlemenizin anında oluşturulduğunu görün.
- Sözdizimi Vurgulama: Anlaşılır kod ve işaretleme biçimlendirmesiyle gelişmiş okunabilirlik.
- Kolay Entegrasyon: Minimum kurulumla herhangi bir web projesine sorunsuz bir şekilde entegre olun.
- Özelleştirilebilir Araç Çubuğu: Kalın, italik ve daha fazlası gibi araç çubuğu seçeneklerini dinamik olarak yapılandırın ve yeniden sıralayın.
Özellikler
🔌 Yerel Form Entegrasyonu
Tam olarak standart bir <textarea> gibi çalışır. Karmaşık API'ler yok; yalnızca value veya name özelliğini kullanın. PHP, Django veya Node.js'deki standart HTML form gönderimleriyle "sadece çalışır".
🖼️ Gelişmiş Resim Yükleme
Yerel sunucu yüklemelerini API aracılığıyla yapılandırın. Resimleri kendi CDN'nizde barındırarak sayfaların daha hızlı yüklenmesini ve üstün SEO'yu sağlamak için ağır Base64 dizelerinden kaçının.
🔀 Hibrit ve Sade Modlar
Görsel düzenleme için Karma (WYSIWYG) deneyimi veya geleneksel kodlama hissi için Düz İşaretleme modu arasında geçiş yapın.
🚀 Yüksek Performans
"Ağır İçerik" için optimize edilmiş küçük bir ~116 KB paket. Çok büyük belgeleri ve büyük dosyaları herhangi bir giriş gecikmesi veya performans düşüşü olmadan yönetir.
🌍 Dahili RTL Desteği
Arapça, Urduca ve Farsça gibi Sağdan Sola diller için yerel destek. Küresel olarak erişilebilir uygulamalar oluşturmak için mükemmeldir.
🌙 Uyarlanabilir Tema
Otomatik Karanlık Mod desteğini içerir. Sorunsuz bir görsel deneyim için sistem ayarlarınızla veya Frutjam UI kitaplığıyla senkronize edilir.
📝 Akıllı Düzenleme
Sıralı listeler, sırasız listeler ve kontrol listeleri için GitHub tarzı otomatik liste devamı — Enter tuşuna bastığınızda düzenleyici deseni sürdürür. Önizleme bölmesindeki onay kutuları tıklanabilir ve işaretleme kaynağına anında senkronize edilir.
📱 Tamamen duyarlı
Hareket halindeyken düzenleme yapmak için masaüstü bilgisayarlara, tabletlere ve akıllı telefonlara mükemmel şekilde uyum sağlayan akıcı, mobil odaklı bir kullanıcı arayüzü.
📦 Evrensel Destek
ESM, UMD, CommonJS ve IIFE ile uyumludur. CDN (<script src>), npm veya herhangi bir paketleyici (Vite, webpack, Rollup) aracılığıyla kutudan çıktığı gibi çalışır; ekstra yapılandırmaya gerek yoktur.
♿ Varsayılan Olarak Erişilebilir
Yerleşik tam ARIA desteği; araç çubuğu yer işareti, etiketli önizleme bölgesi, ekran okuyucu dostu düğmeler, önizleme geçiş düğmesinde aria-basıldı, etkin olmayan araçlarda disabled ve aria-disabled ve modeller kapatıldığında doğru odak restorasyonu.
🛡️ Sıfır CSS Çatışması
Düzenleyici stilleri tamamen .markdown-editor-wrapper kapsamına alınmıştır. Tailwind'in genel ön kontrolü hariç tutulur, böylece editör Bootstrap, Tailwind veya diğer çerçevelerin stillerini bozmadan güvenli bir şekilde birlikte yaşar.
⌨️ Klavye Kısayolları
Ctrl+B, Ctrl+I, Ctrl+K, Ctrl+`, Ctrl+Shift+S — fareye dokunmadan yaygın biçimlendirme eylemleri. Her kısayol, araç çubuğu düğmesinin araç ipucunda gösterilir.
🔍 Bul ve bul Yer değiştirmek
Bulmak için Ctrl+F tuşlarına veya bul ve bul'u açmak için Ctrl+H tuşlarına basın. yer değiştirmek. Düzenleyiciden ayrılmadan canlı maç sayacı, sonraki/önceki gezinme, tek değiştirme ve tümünü değiştirme ile büyük/küçük harfe duyarlı olmayan arama.
Tam Yapılandırma Örneği
MarkdownEditor'ü özel araç çubuğu sıralaması ve gelişmiş resim yükleme işlemleri de dahil olmak üzere tüm temel özelliklerle başlatmak için bu kapsamlı örneği kullanın.
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(); |