2 puan yazan GN⁺ 4 시간 전 | 1 yorum | WhatsApp'ta paylaş
  • Wordgard 0.1, ProseMirror’ın istikrara kavuşmasından sonraki 9 yıllık deneyimi ve CodeMirror 6’nın tasarımını yansıtarak yeni oluşturulmuş bir JavaScript zengin metin düzenleyici kütüphanesidir
  • Mevcut ProseMirror’ı 2.0’a dönüştürmek ya da 1.x üzerine ek yapmak yerine, uyumluluk yükü olmayan yeni bir API ve ayrı bir adla yeniden tasarlandı
  • Temel tasarım, step’ler yerine değişiklik bölümü tabanlı model kullanır ve bağımsız düğüm·işaret türlerini CodeMirror tarzı facet genişletme sistemiyle birleştirir
  • Tarayıcı seçim davranışına bağımlılığı azaltmak için işaretçi·klavye seçimlerini doğrudan işler, ancak dokunmatik seçim yerel bağlam menüsü sorunu nedeniyle tarayıcı uygulamasını korur
  • npm’de wordgard olarak kurulabilir ve belgelerle referans kılavuzu da yayımlandı, ancak geri bildirim ve hata düzeltmeleri sürecinde bir süre daha 0.x sürümünde kalması planlanıyor

Wordgard’ın niteliği ve yayımlanma durumu

  • Wordgard, ProseMirror tarzı zengin metin düzenleyici sistemini baştan yeniden ele alan bir projedir
  • ProseMirror’ın istikrara kavuşmasından sonraki 9 yılda öğrenilenlerden ve CodeMirror sürüm 6’nın yeniden tasarımından güçlü biçimde etkilenmiştir
  • Tarayıcı DOM’u üzerinden düzenleyici arayüzünü gösteren bir JavaScript kütüphanesidir ve lisansı MIT’tir
  • Kodlar Forgejo sunucusunda açıktır
  • npm kayıt defterinden wordgard adıyla kurulabilir ve kullanım şekli web sitesinde görülebilir

ProseMirror’ı değiştirmek yerine neden yeni bir sistem kuruldu

  • ProseMirror bakım almaya devam ediyor, ancak bazı tasarım kararları bugünün ölçütlerine göre farklı yapılmalıydı
  • Uyumsuz bir ProseMirror 2.0 yayımlanırsa, insanların “ProseMirror” derken neyi kastettiği belirsizleşebilir
  • ProseMirror 1.x’e geriye dönük uyumlulukla yeni fikirler eklemek, yapının uzlaşmacı ve tavizli hâle gelmesine yol açabilir
  • Wordgard, ProseMirror’ın birçok fikrini alırken programlama arayüzünü uyumluluk gözetmeden sıfırdan yeniden tasarlar

Değişiklik ifadesi: step’ler yerine bölüm tabanlı model

  • ProseMirror’daki step’ler, değişiklikleri birden fazla atomik işleme böler ve her step bir önceki step’in oluşturduğu belgeye uygulanır
  • Bu yaklaşım çalışsa da, birden fazla step’in konum düzeltmesi ve değişiklik aralığı takibi karmaşıklaştığı için kullanımı hantaldır
  • Wordgard, CodeMirror’ın değişiklik gösterimi ile ShareJS’in “delta” biçiminden gelen yaklaşımı temel alarak daha basit bir model kullanır
    • Belge uzunluğu 10 iken 4. konuma L eklendiğinde bu durum [keep 4] [replace 0 with "L"] [keep 6] olarak ifade edilir
    • İlk iki karakter silinirse [replace 2 with ""] [keep 8] olarak ifade edilir
  • Zengin metin işleme için değişiklik bölümleri eklenir; böylece yapı korunurken vurgu, bağlantı stili, görsel alternatif metni gibi işaretler eklenip çıkarılabilir
    • 3 ile 6 arasındaki sözcük kalın yapılırsa [keep 3] [update 3 +bold] [keep 4] olarak ifade edilir
  • Wordgard, ProseMirror ile aynı token sayımlı indekslemeyi kullanarak belge konumlarını düğüm açma·kapama token’ları ve yaprak token’lardan oluşan düz bir dizide ele alır
  • Tek bir transaction her zaman tek bir değişiklik içerdiği için, değişiklik bileşimi ile denetim·çıkarım daha kolay olur
  • Sınırlı operational transform desteğiyle aynı başlangıç belgesini temel alan birden fazla değişiklik birleştirilebilir
    • Birden fazla değişiklik içeren transaction’ları daha rahat ifade etmeyi sağlar
    • İşbirlikli düzenleme ve yalnızca bazı değişiklikleri geri alan undo history uygulamalarında kullanılabilir

Geçerli belge yapısını koruma yöntemi

  • Wordgard belgeleri yalnızca basit bir token dizisi değil, dengeli bir ağaç yapısı olmak zorundadır
  • Örneğin bir düğüm kapatma token’ının silinmesi, token dengesini bozarak uygulanamaz bir değişiklik oluşturabilir
  • Değişiklik kümesi üreten kod, sonucun geçerli bir belge yapısı olmasını sağlamak için değişiklikleri denetlemeli ve düzeltmelidir
  • Operational transform sırasında da dönüştürülen değişiklikler belgeyi geçersiz kılmamalıdır
  • Wordgard’ın değişiklik modeli, dönüşüm sırasında birleşik sonucu düzelten bir fix-up change türetir
    • A-over-B ve B-over-A için aynı düzeltmenin üretilmesi amacıyla girdiler dikkatle kullanılır
    • Düzeltme olmazsa iki sıra aynı, fakat geçersiz olabilecek belgeyi üretebilir
    • Aynı düzeltme bileştirildiğinde her iki sıra da aynı geçerli belgeye yakınsar
  • Çoğu değişiklikte düzeltme gerekmez, ancak gerektiğinde de yakınsamayı koruyacak şekilde tasarlanmıştır

Şema bileşimi ve işaretlerin genelleştirilmesi

  • ProseMirror’ın belge şeması, düğümler arasındaki ilişkileri doğrudan tanımladığı için genellikle elle yapılandırılmalıdır
  • ProseMirror’daki düğüm ve işaret türleri yalnızca belirli bir şema içinde var olur; şemalar arasında paylaşılabilecek bir düğüm kimliği yoktur
  • Wordgard’da düğüm·işaret türleri bağımsız nesnelerdir ve birden fazla belge şemasına dahil edilebilir
  • Bu nesneler tür denetimi ve otomatik tamamlama sağlayan handle’lar gibi çalışır; böylece gereken öğeleri birleştirerek şema kurmak kolaylaşır
  • Şemalar mevcut öğeler arasındaki ilişkileri override edebilir
    • Düğüm ya da işaret tanımı varsayılan içerik veya hedef türleri belirtir
    • Aynı öğeyi farklı kullanmak istendiğinde şema bu ilişkiyi değiştirebilir
  • Daha zengin yerleşik düğümler sunulabildiği için, düzenleme desteği uzantıları veya menü düğmeleri gibi sistem entegrasyonlarını ilgili düğüme doğrudan bağlamak kolaylaşır
  • Metin hizalama ya da alternatif metin gibi, eskiden belirli düğüm özelliklerine bağlı olan işlevler işaret genelleştirmesi ile daha modüler şekilde eklenebilir
  • Düğüm türünün kendisi, hangi işaretlerin kendisini hedeflediğini bilmek zorunda değildir

İçerik kısıtlarının gevşetilme nedeni

  • ProseMirror’ın öne çıkan özelliklerinden biri olan düzenli ifade tabanlı izinli içerik tanımı Wordgard’da desteklenmez
  • Wordgard’ın düğüm içerik açıklaması yalnızca hangi alt türlerin desteklendiğini sınırlar; bunların sırasını sınırlamaz
  • Düzenli ifade tabanlı kısıtlar, genel amaçlı belge işleme kodu yazmayı zorlaştırır
    • Belirli bir şemaya göre yazılmamış kod, hangi dönüşümlerin geçerli olacağı konusunda neredeyse hiçbir varsayım yapamaz
    • Her işlem içerik kısıtlarıyla karşılaştırılmalıdır ve bu süreç ince ayar gerektiren, yorucu bir iştir
  • Belge biçimini fazla sert biçimde kilitleyen kısıtlar, kullanıcının hedeflediği biçime giderken geçmesi gereken ara düzenleme adımlarını engelleyerek deneyimi bozabilir
  • Wordgard, daha gevşek bir belge biçimi yaklaşımını teşvik eder
  • Şema kurallarının ötesinde değişmez koşullar gerektiğinde correction soyutlamasını sunar
    • İstenmeyen belge biçimlerini programatik olarak düzeltir
    • İçerik ifadelerini zorlamaktan daha akıllı ve bağlama duyarlı düzeltmeler yapılabilir
    • ProseMirror kısıtlarıyla da ifade edilemeyen dikdörtgen tablo garantisi gibi koşullarda kullanılabilir

Genişletme sistemi: CodeMirror 6 tarzı facet

  • ProseMirror’ın genişletme sisteminde eklentiler birden fazla işi üstlenir ve dizideki sıraları önceliği etkiler
  • Aynı eklentinin bazı hook’larda düşük, bazı hook’larda yüksek öncelik gerektirdiği durumlar ortaya çıkabilir
  • CodeMirror’ın facets tabanlı sistemi, genişletmeleri daha ayrıntılı hâle getirir ve her genişletme değerinin kendi öncelik kategorisini belirlemesine izin verir
  • Facet, türlendirilmiş bir genişletme noktasıdır; yalnızca kütüphanenin kendisi değil, herhangi bir kod tarafından da tanımlanabilir
  • Wordgard bu bölümde CodeMirror’ın sistemini neredeyse aynen alır; buna durum güncellemesi ve yeniden yapılandırma mekanizmaları da dahildir
  • Yapılandırma, eklenti dizisi değil uzantı ağacıdır
    • Olay işleyicileri tanımlama
    • Düzenleyici özellikleri ayarlama
    • Yeni düzenleyici durumu ekleme
  • İşlevsellik genellikle birlikte çalışan uzantı paketleri olarak uygulanır
  • Uzantı paketleri, çoğu durumda sadece yapılandırmaya eklenerek iyi birleşsin diye tasarlanmış ilkel öğelere dayanır

Tarayıcı bağımlılığını azaltma ve seçim işleme

  • ProseMirror’daki birçok sorun, tarayıcının yerel seçim davranışına bağımlı çalışma biçimiyle ilgilidir
  • Eski yaklaşım, çift yönlü metin veya alışılmadık stillere sahip içerikte imleç hareketini tarayıcıya bırakıp sonucu kendi seçim modeline yansıtıyordu
  • Gerçekte tarayıcılar bazı içeriklerin üzerinden imleci taşıyamayabilir, imleci çizmeyebilir, yanlış yerde çizebilir ya da fareyle seçim sürüklemede tuhaf davranabilir
  • Wordgard, işaretçi ve klavye tabanlı seçimlerin neredeyse tamamını kendisi işler
    • Çift yönlü metin işlemesini uygular
    • İçerik yerleşim modeli oluşturur
    • İmleci kendisi çizer
  • Dokunmatik seçim ise istisna olarak yerel uygulamayı kullanır
    • Yeniden uygulandığında yerel bağlam menüsünün bozulduğu görülüyor
    • Telefon ve tabletlerde bağlam menüsünü değiştirmek zordur
    • Dokunmatik seçim, klavye seçimine göre daha az sorunlu olma eğilimindedir

Girdi olaylarını işleme ve DOM değişiklik izlemeyi kaldırma

  • Son 9 yılda tarayıcıların düzenleme olay desteği, özellikle beforeinput desteği daha tutarlı hâle geldi
  • Gerçek kullanım ortamlarında test edilmesi gerekse de, Wordgard’ın ProseMirror’ın dayandığı DOM değişiklik izleme ve değişen içeriği yeniden ayrıştırma hileleri olmadan çalışabileceği görülüyor
  • Wordgard, birleşik metin girişi dışında her şey için beforeinput olayını işler
  • Bu yaklaşım, çok sayıda kirli geçici çözüm gerektiren sorun sınıflarından kaçınır

Kararlılık, sürüm planı ve lisans

  • Wordgard, önceki projelerin duyurulduğu andaki durumundan biraz daha ileride bir aşamadadır
  • Temel arayüzler istenen işlevlerin neredeyse tamamını destekler ve tasarımın pratik olup olmadığını doğrulamak için çeşitli uzantılar da yazılmıştır
  • Belgeler hâlâ biraz pürüzlü olsa da referans kılavuzu tamamlanmış ve kullanılabilir durumdadır
  • İnsanlar bunu gerçek işlerde kullanmaya başlayana kadar birçok sorun görünmeyebilir
  • İleride eklenmek istenen özellikler vardır ve yayımlandıktan sonra başkalarının da incelemesi beklenmektedir
  • Genel arayüzün bazı bölümleri, daha fazla içgörüyle yeniden düşünülmek zorunda kalabilir
  • İlk sürüm 0.1’dir; geri bildirim toplama, hata düzeltme ve pürüzleri giderme amacıyla bir süre daha 0.x sürümünde kalınacaktır
    • Bunun en az 1 yıl sürmesi bekleniyor
  • Lisans, önceki projelerde olduğu gibi MIT’tir
  • Daha kısıtlayıcı lisanslar da değerlendirilmiş olsa da, yaygın kullanım daha çok önemsendiği için izin verici lisans seçilmiştir

Yapay zeka modelleri, kod üretimi ve pull request politikası

  • Bu yazılım oluşturulurken dil modelleri kullanılmadı
  • JavaScript kodunun web’de bulunması ve belgelerin açık olması gerektiğinden, yayımlanmış kod ve fikirlerin büyük dil modellerine girmesini engellemenin güvenilir bir yolu olmadığı düşünülüyor
  • Wordgard’da standart açık kaynak uygulamalarının aksine pull request kabul etmeme yönünde bir deney yapılıyor
  • Büyük değişiklikleri incelemek ve beklentilere uyacak hâle getirmek, çoğu zaman bunları doğrudan uygulamaktan daha fazla iş gerektiriyor
  • Kod üretim maliyeti ciddi biçimde düştükçe, başkalarının kod gönderdiği ve bakımcının bunu inceleyip sürdürmesi ya da neden reddettiğini açıklaması gereken yapı daha az cazip hâle geliyor

1 yorum

 
GN⁺ 4 시간 전
Lobste.rs yorumları
  • Yazarı olarak, soru ya da geri bildirim olursa bu başlığı ara sıra kontrol edeceğim

    • Oldukça etkileyici görünüyor. FAQ’da göremedim; Markdown düzenleme için nasıl kullanılabileceğini ya da yapılandırılabileceğini merak ediyorum
      Bir Markdown renderer’ıyla HTML üretip Wordgard’da düzenletmek mümkün olabilir; ama sonrasında düzenleyici içeriğinden Markdown nasıl çıkarılabilir?
    • ProseMirror kullananların nasıl bir geçiş yolu izleyeceğini merak ediyorum
      Sonunda Wordgard’a mı taşınacaklar? Yeni bir projede ProseMirror kullanmayı düşünen biri varsa, ne zaman Wordgard’ı seçmeli?
  • Contains 0% AI

    Not having PRs is an effective way to nip the problem of people submitting LLM-generated slop code in the bud.

    Ayrıca gerçek, insan bir sanatçı tarafından yapılmış harika çizimler de var
    Güzel

  • Marijn’in projesi ve duyurusu için büyük tebrikler. Harika görünüyor; Kamila Stankiewicz’in çizimlerini de beğendim

  • Projenin ana web sitesi: https://wordgard.net/

  • As a deviation from standard open-source practice, I'm doing an experiment where I don't take pull requests for Wordgard.

    Bu kısım, özellikle de son paragrafın tamamı gerçekten ilginç
    Yapay zeka ile kod üretimiyle daha iyi bir ilişki kurana kadar, hatta belki hiç ilişki kurmamaya doğru gidene kadar, bu yaklaşımın bir süre daha yaygınlaşıp yaygınlaşmayacağını merak ediyorum
    Bu arada kod MIT lisanslı