Wordgard 0.1 रिलीज़
(marijnhaverbeke.nl)- Wordgard 0.1 ProseMirror के स्थिर होने के बाद 9 साल के अनुभव और CodeMirror 6 के डिज़ाइन को प्रतिबिंबित करते हुए बनाई गई एक नई JavaScript rich text editor लाइब्रेरी है
- मौजूदा ProseMirror को 2.0 में बदलने या 1.x पर जोड़ने के बजाय, इसे compatibility के बोझ के बिना नई API और अलग नाम के साथ फिर से डिज़ाइन किया गया है
- इसका मुख्य डिज़ाइन steps की जगह change section आधारित मॉडल का उपयोग करता है, और स्वतंत्र node·mark types को CodeMirror-शैली के facet extension system के साथ जोड़ता है
- browser selection behavior पर निर्भरता कम करने के लिए pointer·keyboard selection को सीधे हैंडल किया जाता है, लेकिन touch selection native context menu समस्या के कारण browser implementation पर ही छोड़ा गया है
- इसे npm पर
wordgardसे install किया जा सकता है और docs व reference manual भी सार्वजनिक हैं, लेकिन feedback और bug fixes के दौरान यह कुछ समय तक 0.x version में रहने वाला है
Wordgard की प्रकृति और रिलीज़ स्थिति
- Wordgard ProseMirror-शैली के rich text editor system का नया पुनरावृत्त रूप है
- ProseMirror के स्थिर होने के बाद पिछले 9 सालों में सीखी गई बातों और CodeMirror version 6 के redesign से इस पर गहरा प्रभाव पड़ा है
- यह browser DOM के माध्यम से editor interface दिखाने वाली JavaScript लाइब्रेरी है, और इसका license MIT है
- इसका code Forgejo server पर सार्वजनिक है
- इसे npm registry से
wordgardके रूप में install किया जा सकता है, और उपयोग का तरीका वेबसाइट पर उपलब्ध है
ProseMirror को बदले बिना नया system बनाने की वजह
- ProseMirror का maintenance जारी है, लेकिन उसके कुछ डिज़ाइन ऐसे हैं जिन्हें आज के नज़रिए से अलग तरह से बनाया जाना चाहिए था
- अगर incompatible interface वाला ProseMirror 2.0 जारी किया जाता, तो लोग “ProseMirror” कहकर किस चीज़ का मतलब ले रहे हैं, यह अस्पष्ट हो सकता था
- अगर ProseMirror 1.x पर backward compatibility बनाए रखते हुए नए ideas जोड़े जाते, तो उसकी संरचना समझौता-प्रधान हो सकती थी
- Wordgard, ProseMirror के कई ideas लेता है, लेकिन programming interface को compatibility की चिंता के बिना शुरू से फिर डिज़ाइन करता है
बदलाव की अभिव्यक्ति: steps की जगह section आधारित मॉडल
- ProseMirror के steps बदलाव को कई atomic operations में बाँटते हैं, और हर step उससे पहले वाले step द्वारा बने document पर लागू होता है
- यह तरीका काम करता है, लेकिन कई steps में position adjustment और change range tracking जटिल हो जाती है, इसलिए इसे संभालना असुविधाजनक हो सकता है
- Wordgard, CodeMirror की change representation और ShareJS के “delta” format से आए तरीके के आधार पर एक सरल मॉडल का उपयोग करता है
- जब document की लंबाई 10 हो और position 4 पर
Lडाला जाए, तो इसे[keep 4] [replace 0 with "L"] [keep 6]के रूप में व्यक्त किया जाता है - अगर पहले दो अक्षर हटाए जाएँ, तो इसे
[replace 2 with ""] [keep 8]के रूप में व्यक्त किया जाता है
- जब document की लंबाई 10 हो और position 4 पर
- rich text processing के लिए change sections जोड़े गए हैं, ताकि structure बनाए रखते हुए emphasis·link style·image alt text जैसे marks जोड़े या हटाए जा सकें
- अगर 3 से 6 तक के शब्दों को bold करना हो, तो इसे
[keep 3] [update 3 +bold] [keep 4]के रूप में लिखा जाता है
- अगर 3 से 6 तक के शब्दों को bold करना हो, तो इसे
- Wordgard, ProseMirror की तरह token-counting index का उपयोग करता है, जिससे document positions को node open·close tokens और leaf tokens की सपाट sequence के रूप में संभाला जाता है
- एक single transaction में हमेशा एक ही change होता है, इसलिए changes को compose करना और उनकी जाँच·reasoning आसान हो जाती है
- यह सीमित operational transform को support करता है, जिससे एक ही शुरुआती document के आधार पर व्यक्त कई changes को merge किया जा सकता है
- इससे कई changes वाले transactions को अधिक सुविधाजनक रूप में व्यक्त किया जा सकता है
- collaborative editing और कुछ बदलावों को ही वापस लेने वाली undo history के implementation में इसका उपयोग हो सकता है
वैध document structure बनाए रखने का तरीका
- Wordgard document सिर्फ साधारण token sequence नहीं, बल्कि balanced tree structure होना चाहिए
- उदाहरण के लिए, अगर node closing token हटा दिया जाए, तो token balance टूट सकता है और ऐसा change बन सकता है जिसे लागू नहीं किया जा सके
- change set बनाने वाला code, result को valid document structure बनाए रखने के लिए changes की जाँच और correction करता है
- operational transform में भी transformed change document को invalid नहीं बनाना चाहिए
- Wordgard का change model transform के दौरान संयुक्त result को सुधारने वाला fix-up change निकालता है
- A-over-B और B-over-A, दोनों के लिए वही correction बने, इसके लिए input को सावधानी से उपयोग किया जाता है
- correction न हो तो दोनों क्रम एक जैसा, लेकिन संभवतः invalid document बना सकते हैं
- वही correction compose करने पर दोनों क्रम एक ही valid document पर converge करते हैं
- ज़्यादातर changes में correction की ज़रूरत नहीं होती, लेकिन जहाँ होती है वहाँ भी convergence बनाए रखने के लिए यह डिज़ाइन किया गया है
schema composition और mark generalization
- ProseMirror में document schema nodes के बीच संबंध सीधे निर्दिष्ट करता है, इसलिए उसे अक्सर हाथ से configure करना पड़ता है
- ProseMirror के node और mark types केवल किसी खास schema के भीतर ही मौजूद होते हैं, इसलिए schemas के बीच shared node identity नहीं होती
- Wordgard में node·mark types स्वतंत्र objects हैं, जिन्हें कई document schemas में शामिल किया जा सकता है
- ये objects type information और autocomplete को support करने वाले handles की तरह काम करते हैं, जिससे ज़रूरी elements को जोड़कर schema बनाना आसान हो जाता है
- schema, मौजूदा elements के संबंधों को override कर सकता है
- node या mark definitions default content या target types निर्दिष्ट करते हैं
- अगर वही element अलग तरीके से इस्तेमाल करना हो, तो schema उस संबंध को बदल सकता है
- इससे default built-in nodes को अधिक समृद्ध रूप में दिया जा सकता है, और editing support extensions या menu buttons जैसे system integrations को सीधे उन nodes से जोड़ना आसान हो जाता है
- text alignment या alt text जैसे वे features, जो पहले किसी खास node attribute से बँधे थे, mark generalization के ज़रिए अधिक modular तरीके से जोड़े जा सकते हैं
- node type को खुद यह जानने की ज़रूरत नहीं होती कि कौन-से marks उस पर लागू हो सकते हैं
content constraints को हल्का करने की वजह
- ProseMirror की प्रमुख feature, regex-आधारित allowed content specification, Wordgard में support नहीं की जाती
- Wordgard में node content description केवल यह सीमित करती है कि कौन-से child types समर्थित हैं, लेकिन उनके order को सीमित नहीं करती
- regex-आधारित constraints, सामान्य document manipulation code लिखना कठिन बना देती हैं
- जो code किसी खास schema के लिए नहीं लिखा गया, वह लगभग यह मानकर नहीं चल सकता कि कौन-सा transform valid होगा
- हर operation को content constraints के साथ मिलाकर देखना पड़ता है, और यह प्रक्रिया सूक्ष्म व बोझिल हो सकती है
- document shape को बहुत कड़ाई से lock करने वाले constraints, user द्वारा इच्छित final shape तक पहुँचने के बीच के editing steps को रोक सकते हैं, जिससे user experience खराब हो सकता है
- Wordgard, document shape के लिए अधिक ढीले दृष्टिकोण को प्रोत्साहित करता है
- जब schema rules से आगे बढ़कर invariant conditions चाहिए हों, तब यह correction abstraction देता है
- program के माध्यम से उन document shapes को सुधारा जाता है जिन्हें अनुमति नहीं देनी है
- यह content expression enforcement की तुलना में अधिक बुद्धिमान और context-aware correction दे सकता है
- इसका उपयोग उन शर्तों में भी हो सकता है जिन्हें ProseMirror constraints से व्यक्त नहीं किया जा सकता था, जैसे rectangular tables की गारंटी
extension system: CodeMirror 6-शैली के facet
- ProseMirror का extension system ऐसा है जहाँ plugins कई तरह के काम करते हैं, और array order priority को प्रभावित करता है
- ऐसी स्थिति आ सकती है जहाँ किसी एक plugin को एक hook में low priority और दूसरे hook में high priority चाहिए
- CodeMirror का facets आधारित system extensions को अधिक बारीक बनाता है, और हर extension value को अपनी priority category सेट करने देता है
- Facet एक typed extension point है, जिसे सिर्फ लाइब्रेरी ही नहीं बल्कि कोई भी code define कर सकता है
- Wordgard इस हिस्से में CodeMirror के system को लगभग ज्यों का त्यों लाता है, और state update व reconfiguration mechanism भी शामिल करता है
- configuration plugin array नहीं, बल्कि extension tree है
- event handler definitions
- editor properties configuration
- नया editor state जोड़ना
- features का implementation आमतौर पर साथ काम करने वाले extension bundles के रूप में बना होता है
- extension bundles को इस तरह डिज़ाइन किया गया है कि वे अधिकांश configurations में बस जोड़ देने से सही तरह compose हो जाएँ
browser निर्भरता कम करना और selection handling
- ProseMirror की कई समस्याएँ browser के native selection behavior पर निर्भर रहने से जुड़ी रही हैं
- पुराने approach में browser को bidirectional text या असामान्य styling वाले content में cursor movement संभालने दिया जाता था, और उसके result को अपने selection model में प्रतिबिंबित किया जाता था
- व्यवहार में browser कुछ content के पार cursor नहीं ले जाते, cursor को draw नहीं करते, गलत जगह draw करते हैं, या mouse selection drag में अजीब व्यवहार दिखाते हैं
- Wordgard pointer और keyboard आधारित selection को लगभग पूरी तरह खुद संभालता है
- bidirectional text handling लागू करता है
- content layout model बनाता है
- cursor को खुद draw करता है
- touch selection इसमें अपवाद है और native implementation का उपयोग करती है
- इसे फिर से लागू करने पर native context menu टूटता हुआ लगता है
- फोन और टैबलेट पर context menu का विकल्प देना मुश्किल है
- touch selection, keyboard selection की तुलना में कम अजीब व्यवहार दिखाती है
input events handling और DOM change monitoring हटाना
- पिछले 9 वर्षों में browser का editing events support, खासकर
beforeinputsupport, अधिक consistent हुआ है - वास्तविक usage environment में परीक्षण की ज़रूरत है, लेकिन Wordgard ऐसा लगता है कि वह ProseMirror पर निर्भर DOM change monitoring और changed content parsing tricks के बिना काम कर सकता है
- Wordgard, composition text input को छोड़कर लगभग हर चीज़ के लिए
beforeinputevent को हैंडल करता है - यह तरीका उन कई गंदे workarounds की ज़रूरत वाले समस्या-समूहों से बचाता है
स्थिरता, version योजना, license
- Wordgard, पिछले projects की release के समय वाली स्थिति की तुलना में थोड़ा अधिक आगे बढ़ा हुआ है
- core interfaces लगभग उन सभी features को support करते हैं जो अपेक्षित थे, और डिज़ाइन की व्यावहारिकता जाँचने के लिए कई extensions भी लिखे गए हैं
- documentation अभी कुछ हद तक खुरदरी है, लेकिन reference manual पूरा है और इस्तेमाल किया जा सकता है
- जब तक लोग इसे वास्तविक काम में उपयोग नहीं करेंगे, तब तक कई समस्याएँ सामने न आएँ, ऐसा हो सकता है
- आगे और भी features जोड़ने की इच्छा है, और release के बाद उम्मीद है कि दूसरे लोग भी इसे देखें
- public interface के कुछ हिस्सों पर आगे की समझ के आधार पर फिर से विचार करना पड़ सकता है
- पहला version 0.1 है, और feedback इकट्ठा करने, bugs ठीक करने और खुरदरे हिस्सों को साफ़ करने के लिए यह कुछ समय तक 0.x version में रहेगा
- अनुमान है कि यह अवधि कम से कम 1 साल की होगी
- license, पिछले projects की तरह, MIT है
- अधिक restrictive license पर भी विचार किया गया था, लेकिन व्यापक उपयोग में अधिक रुचि होने के कारण permissive license चुना गया
AI model, code generation, और pull request policy
- इस software को बनाने में language models का उपयोग नहीं किया गया
- चूँकि JavaScript code वेब पर है और documentation सार्वजनिक होनी चाहिए, इसलिए यह रोकने का कोई भरोसेमंद तरीका नहीं माना गया कि सार्वजनिक code और ideas बड़े language models में न चले जाएँ
- Wordgard में standard open source practice से अलग, pull request स्वीकार न करने का एक प्रयोग किया जा रहा है
- बड़े changes की review और उन्हें अपेक्षाओं के अनुसार ढालने की प्रक्रिया, कई बार उन्हें सीधे implement करने से अधिक काम बन जाती है
- code generation की लागत बहुत कम हो जाने से, ऐसा ढाँचा जिसमें दूसरे लोग code फेंक दें और maintainer को review·maintenance करना पड़े या अस्वीकार करने का कारण समझाना पड़े, अब कम आकर्षक लगता है
1 टिप्पणियां
Lobste.rs की राय
लेखक के तौर पर, अगर सवाल या feedback हों तो मैं इस thread को कभी-कभी देखता रहूँगा
Markdown renderer से HTML बनाकर Wordgard में edit कराया जा सकता होगा, लेकिन बाद में editor content से Markdown कैसे निकाला जा सकेगा?
क्या वे आखिरकार Wordgard पर चले जाएँगे? अगर कोई नए project में ProseMirror इस्तेमाल करने की सोच रहा हो, तो उसे Wordgard कब चुनना चाहिए?
और इसमें real, human artist द्वारा बनाया गया शानदार art भी है
अच्छा है
Marijn के project और announcement के लिए बहुत-बहुत बधाई। यह शानदार लग रहा है, और Kamila Stankiewicz का art भी पसंद आया
project का main homepage है https://wordgard.net/
यह हिस्सा, खासकर पूरा आख़िरी paragraph, वाकई दिलचस्प है
सोच रहा हूँ कि AI code generation के साथ बेहतर रिश्ता बनने तक, या शायद बिल्कुल रिश्ता न रखने की दिशा में जाने तक, क्या ऐसे तरीके कुछ समय के लिए और आम हो सकते हैं
संदर्भ के लिए, code MIT license के तहत है