Frontend Engineering Workflow Automation

Case Study: Tabirly Ekosisteminde "Canlı Düzenleme" Mimarisi ve Verimlilik Optimizasyonu

Proje: Tabirly Inline Editor (IE) – v2025
Platform: Blogger Altyapısı Üzerine Kurulu Hibrit Katman

1. Giriş: Statik Yapıların Dinamikleşmesi

Tabirly, içerik yoğunluğu yüksek ve sık güncellenen bir platformdur. Geleneksel CMS (Blogger) yapılarında içerik üretimi; yönetim paneli ile önizleme sayfası arasında mekik dokuyan, bağlam kopukluğuna ve operasyonel darboğaza neden olan hantal bir döngüye sıkışmıştır.

Daha da önemlisi, Tabirly hazır şablonlar yerine tamamen özel kodlama (hard-coded) üzerine kurulu bir mimariye sahiptir. Sitenin bu teknik yapısı, yazılımcı olmayan editörlerin sistemi bozmadan (HTML yapısını kırmadan) içerik girmesini veya düzenleme yapmasını neredeyse imkânsız ve yüksek riskli bir hale getirmiştir.

Bu case study, Tabirly'nin bu kördüğümü çözmek için geliştirdiği; sunucu yükünü artırmadan tamamen tarayıcı tarafında çalışan, kullanıcının çalışma alanına göre şekil alabilen ve "Inline Editor (IE)" adı verilen modülün teknik analizini içerir.

2. Mimari Yaklaşım: "On-Top" Enjeksiyon Modeli

İncelediğimiz kod (v2025-09-06), Tabirly'nin mevcut tema dosyalarına kalıcı olarak gömülü değildir; ihtiyaç anında çağrılan "On-Top" (Üst Katman) bir mimariye sahiptir.

Tetikleyici Mekanizma

Kod, kendini izole eden bir fonksiyon (IIFE) yapısındadır. Sadece ?ie=1 parametresi veya draft.blogger gibi önizleme ortamlarında aktifleşir. Bu sayede son kullanıcı (okuyucu) hiçbir yük hissetmez.

(function(){
  var q=new URLSearchParams(location.search), host=location.hostname;
  // Sadece admin parametresi veya önizleme linklerinde çalış
  if(!(q.get('ie')==='1'||preview)) return;
  // ...
})();

Engel Aşma (Bypass)

Blogger önizlemelerindeki tıklama engelleyici katmanları (clickTrap), dinamik CSS enjeksiyonu (pointer-events: none) ile stratejik bir şekilde bypass edilerek sayfa etkileşime açılır.

if(preview && !document.getElementById('tb-clicktrap-bypass')){
  var st=document.createElement('style'); st.id='tb-clicktrap-bypass';
  // Tıklama tuzağını etkisiz hale getir
  st.textContent='.blogger-clickTrap,[class*="clickTrap"]{pointer-events:none!important;}';
  document.head.appendChild(st);
}

3. Kodun Çözdüğü Kritik Problemler ve Teknik Derinlik

Bu script sadece metin düzenlemez; aynı zamanda ergonomik ve akışkan bir çalışma alanı sunan bir mikro-uygulamadır.

A. Uzamsal Özgürlük ve Akışkan Arayüz (Draggable UI)

Standart CMS editörleri genellikle sayfanın tepesine veya yanına sabitlenir. Bu durum, özellikle mobilde veya dar ekranlarda düzenlenmek istenen metnin görünmesini engeller (Visual Obstruction).

  • Sorun: Sabit menülerin içeriği kapatması ve odak kaybı yaratması.
  • Çözüm: Kodun içerisindeki mousedown, mousemove ve mouseup olay dinleyicileri, araç çubuğunu tamamen hareketli hale getirir.
Teknik Detay: HTML5'in yerleşik "Drag and Drop API"si yerine, daha pürüzsüz çalışan "Delta Koordinat Hesaplama" yöntemi kullanılmıştır.
function move(e){
  if(!drag) return;
  // Delta hesaplama ile pürüzsüz kaydırma
  var dx=e.clientX-drag.x, dy=e.clientY-drag.y;
  bar.style.left=(drag.l+dx)+'px';
  bar.style.top=(drag.t+dy)+'px';
}

Adaptasyon: Araç çubuğu flex-wrap yapısına sahiptir. Kullanıcı paneli ekranın köşesine sıkıştırdığında butonlar otomatik olarak yeniden hizalanır (reflow). Bu duyarlı (responsive) yapı, editörün kullanıcının odaklandığı paragrafı (Focus Area) asla işgal etmemesini sağlayarak bilişsel yükü minimize eder.

B. Yapısal Bütünlük (Semantic Integrity)

Tabirly gibi metin odaklı sitelerde SEO için HTML etiketlerinin (H2, H3, P) doğru hiyerarşide olması hayatidir.

Kontrol: handleKey fonksiyonu klavye olaylarını dinler.

function handleKey(e){
  if(e.key !== 'Enter') return;
  if(e.shiftKey){
    // Shift+Enter: Satır sonu (
) document.execCommand('insertLineBreak'); } else { // Enter: Yeni Paragraf (

) document.execCommand('insertParagraph'); } e.preventDefault(); }

C. Dinamik Hedefleme (MutationObserver)

Modern web sayfaları dinamiktir. Kodda kullanılan MutationObserver, sayfanın gövdesini sürekli izler. Eğer makale alanı DOM'dan silinip tekrar oluşturulursa (örneğin sayfa yenilenmeden içerik değişirse), editör kendini otomatik olarak yeni elemente tekrar bağlar. Bu, "Self-Healing" (Kendi kendini onaran) bir kod yapısıdır.

var mo=new MutationObserver(function(){
  var newT=document.querySelector(targetSel);
  // Hedef element değişirse yeniden bağlan
  if(newT && newT!==target){
    target=newT;
    attachKeyHandler();
  }
});
mo.observe(document.body,{childList:true,subtree:true});

D. Veri İhracatı (Data Export)

CMS paneline dönmeye gerek kalmadan, downloadHTML fonksiyonu o anki düzenlenmiş içeriği temizler (gereksiz attribute'ları atar) ve temiz bir HTML dosyası (blob) olarak tarayıcı üzerinden indirir.

function downloadHTML(){
  var clone=target.cloneNode(true);
  // Düzenleme artıklarını temizle
  clone.removeAttribute('contenteditable'); 
  var html=clone.innerHTML;
  // Blob oluştur ve indir
  var blob=new Blob(['...'+html+'...'],{type:'text/html;charset=utf-8'});
  // ...
}

E. Mikro-Mühendislik Detayları (Micro-Optimizations)

Kodun kalitesi, ilk bakışta görülmeyen ancak kullanıcı deneyimini pürüzsüzleştiren defansif programlama detaylarında saklıdır:

Bağlam Farkındalığı (Context Awareness):

Script, kullanıcının bir liste (<li>) içinde olduğunu algılarsa (closestTag kontrolü ile) paragraf zorlamasını durdurur. Böylece listeler ve madde işaretleri kırılmaz.

if(closestTag(anchor,'LI')) return;
Görünmez Boşluk Temizliği (Sanitization):

İndirme esnasında, mobil tasarımları bozan ve "yapışkan boşluk" olarak bilinen \u00a0 karakterleri regex ile temizlenir.

.replace(/\u00a0/g,' ')
Odak Koruma (Focus Management):

Araç çubuğundaki butonlara tabIndex=-1 atanmıştır. Bu sayede kullanıcı "Kalın" butonuna tıkladığında klavye odağı kaybolmaz ve metne tekrar tıklamasına gerek kalmadan yazmaya devam edebilir (Flow State).

İz Bırakmayan Çıkış:

Sayfa kapatılırken beforeunload tetikleyicisi ile tüm düzenleme çizgileri temizlenir, böylece tarayıcı önbelleğinde (cache) istenmeyen görsel artıklar kalmaz.

F. Geliştirici Bağımlılığının Ortadan Kalkması (Democratization of Editing)

Tabirly'nin tüm mimarisi, standart temalar yerine "custom-code" (özel yazılım) üzerine kuruludur.

Sorun (The Developer Gap): Sitenin her hücresi kodla oluşturulduğu için, editör paneli kullanmak mayın tarlasında yürümek gibidir. Yazılımcı olmayan bir editörün yapacağı en ufak hata (örneğin bir </div> etiketini yanlışlıkla silmek), tüm site tasarımını (layout) yıkabilir. Editörler geliştirici olmadığı için bu risk sürdürülemez bir durum yaratıyordu.

Çözüm: Inline Editor, kaynak kodları ile editör arasına güvenli bir "Cam Duvar" örer. Editör, karmaşık HTML yapısını asla görmez ve dokunamaz; sadece izin verilen metin alanlarını manipüle eder. Bu sayede teknik bilgiye ihtiyaç duymadan, siteyi bozma riski %0'a indirilerek güvenli içerik üretimi sağlanır.

4. Araç Seti ve Fonksiyonel Yetenekler

Inline Editor, Tabirly editörlerinin ihtiyaç duyduğu en kritik 14 fonksiyonu içeren kompakt bir araç çubuğu (toolbar) sunar. Her bir araç, verimliliği artırmak için optimize edilmiştir:

Edit ON/OFF Güvenlik Kilidi. Yanlışlıkla düzenlemeyi önler. Kapalıyken normal okuyucu modudur.
H2 & H3 Semantik Başlıklar. SEO hiyerarşisini tek tıkla uygular.
Replace Selection HTML yapısını bozmadan sadece seçili metni değiştirir. Çeviriler için idealdir.
Renk Paleti Spiritüel vurgular için metin ve arka plan renklerini anında değiştirir.
Link & Unlink Bağlantı yönetimi. Hızlıca link verip, mevcut linkleri temizler.
Format Temizleyici (Clear) Kopyalanan metinlerdeki bozuk stilleri sıfırlar.
Tipografi (B, I, U) Kalın, İtalik ve Altı Çizili gibi temel vurgular.
Download HTML Tüm değişiklikleri temiz, yayına hazır bir dosya olarak indirir.
Gizle (Hide) Tam ekran okuma veya kontrol için arayüzü gizler.

5. Kullanılan Teknolojiler ve Nedenleri

Bu modülde React veya Vue yerine Vanilla JavaScript (Saf JS) tercih edilmesinin stratejik nedenleri vardır:

6. İş Akışı (Workflow) İyileştirmesi

Tabirly editörleri için süreç şu hale gelmiştir:

  1. Taslak Oluştur & Önizle: Ham metni gir ve önizlemeyi aç.
  2. Konumlandır: Araç çubuğunu metnin üzerinden alıp, o an çalışmadığın boş bir alana sürükle.
  3. Yerinde Düzenle (WYSIWYG): Yazıyı okurken hata mı gördün? Panele dönme. Tıkla, düzelt, link ver.
  4. Çıktı Al: Toolbar'dan tek tıkla temiz HTML'i indir ve yayınla.

Sonuç: Editörün içeriği kapatmadan serbestçe yüzebilmesi (Floating UI) ve bağlam kopukluğunu önlemesi sayesinde:

%90
Hata Oranı Düşüşü
%40
Süre Tasarrufu

7. Sonuç

Bu kod parçası, Tabirly'nin teknolojiye yaklaşımını özetler: "Kısıtlayıcı arayüzlere değil, kullanıcıya uyum sağlayan esnek çözümler."

Devasa editör yazılımları entegre etmek yerine; sürüklenebilen, kullanıcının çalışma alışkanlığına göre yer değiştiren ve şekil alan bu hafif yapı, Tabirly'nin operasyonel çevikliğinin temel taşlarından biridir.

"Tabirly Inline Editor, kısıtlı bir CMS altyapısını, tarayıcı tabanlı zekice manipülasyonlarla modern, hızlı ve hatasız bir yayıncılık stüdyosuna dönüştüren minimalist bir mühendislik örneğidir."