- Wordgard เป็นไลบรารี JavaScript โอเพนซอร์สสำหรับสร้างโปรแกรมแก้ไข rich text บนเบราว์เซอร์ โดยเป็นฐาน editor ใหม่ที่สร้างโดยผู้พัฒนา ProseMirror
- มุ่งเน้นที่ การควบคุมโครงสร้างเอกสาร มากกว่าเครื่องมือแก้ไข HTML แบบอิสระ ทำให้นักพัฒนาสามารถกำหนดชนิดของเนื้อหาที่อนุญาตและโครงสร้างเชิงความหมายได้อย่างละเอียด
- มุ่งเป้าไปที่ editor แบบปรับแต่งเฉพาะที่ซับซ้อน โดยมี โมเดลแบบ schema-based และโครงสร้างที่เน้นการขยายความสามารถ ทำให้สามารถเปลี่ยนหรือแก้ไขฟีเจอร์ให้ตรงตามความต้องการได้
- จัดการข้อกำหนดต่าง ๆ ในฐาน editor เช่น accessibility, internationalization, เอกสาร RTL/สองทิศทาง, เนื้อหาแบบมีโครงสร้าง, สไตล์เชิงฟังก์ชัน และ การแก้ไขร่วมกัน
- เป็นโอเพนซอร์สแบบ permissive ภายใต้ไลเซนส์ MIT แต่มีแนวทางการดำเนินโครงการที่ยินดีรับรายงานบั๊กและ ไม่รับ Pull request
ฐาน editor ที่ควบคุมโครงสร้างเอกสาร
- Wordgard เป็นไลบรารี JavaScript โอเพนซอร์สสำหรับพัฒนาโปรแกรมแก้ไข rich text ภายในเบราว์เซอร์
- ไม่ใช่ editor HTML แบบอิสระ แต่เป็น ระบบแก้ไข rich text เชิง semantic ที่ให้นักพัฒนาควบคุมชนิดของเนื้อหาที่จะรองรับและโครงสร้างเอกสารได้อย่างแม่นยำ
- ใช้แนวทาง schema-based เพื่อให้กำหนดโครงสร้างเอกสารได้ละเอียดและสร้างองค์ประกอบเอกสารแบบกำหนดเองได้
- อินเทอร์เฟซการเขียนโปรแกรมถูกออกแบบโดยมีเป้าหมายด้านความเป็นสากลและความยืดหยุ่น เพื่อใช้เป็นฐานสำหรับ editor แบบปรับแต่งเฉพาะที่มีข้อกำหนดสูง
ความสามารถในการขยาย, accessibility และฟีเจอร์การทำงานร่วมกัน
- ฟีเจอร์ส่วนใหญ่ของ editor ถูกพัฒนาเป็น extension จึงสามารถเปลี่ยนหรือแก้ไขได้หากไม่ตรงกับความต้องการ
- ฟีเจอร์ด้าน accessibility คำนึงถึงผู้ใช้ screen reader, ผู้ใช้ที่ใช้เฉพาะคีย์บอร์ด และสภาพแวดล้อมบนอุปกรณ์มือถือ พร้อมรองรับการ internationalization ของ UI
- สำหรับสภาพแวดล้อมการเขียนจากขวาไปซ้าย รองรับ การรับรู้ทิศทาง ทั้งในเนื้อหาและอินเทอร์เฟซ และสามารถจัดการเนื้อหาแบบสองทิศทางและเอกสาร RTL ได้
- ต้นไม้เอกสารสามารถรวม เนื้อหาแบบมีโครงสร้าง เช่น ตาราง, รายการซ้อน, figure ที่มีคำบรรยาย และโครงสร้างแบบกำหนดเอง
- ส่วนใหญ่ของระบบเขียนในสไตล์เชิงฟังก์ชันเพื่อความชัดเจนและความสามารถในการทดสอบ
- รองรับ การแก้ไขร่วมกัน ที่ให้ผู้ใช้หลายคนแก้ไขเอกสารเดียวกันพร้อมกันและรวมการแก้ไขที่เกิดขึ้นพร้อมกันได้
ไลเซนส์และการดำเนินโครงการ
- ไลเซนส์คือ MIT และพัฒนาบน code.haverbeke.berlin
- ยินดีรับรายงานบั๊ก แต่ ไม่รับ Pull request
- แนะนำให้ใช้ forum สำหรับการพูดคุยและคำถามเกี่ยวกับโครงการ และควรรายงานบั๊กใน issue tracker
1 ความคิดเห็น
ความเห็นจาก Hacker News
คิดว่าคนส่วนใหญ่น่าจะอยากรู้ว่า “ทำไม?” เอกสารนี้พูดถึงความแตกต่างจาก ProseMirror เลยถือว่าเป็นคำตอบที่ใกล้เคียงที่สุดสำหรับคำถามนั้น: https://wordgard.net/docs/prosemirror/
จุดที่น่าสังเกตอย่างหนึ่งคือไม่มี เส้นทางการอัปเกรด ถึงจะมีแนวคิดหลายอย่างร่วมกับ ProseMirror แต่ถ้าจะย้ายก็น่าจะต้องลงแรงพอสมควร Obsidian คงไม่เปลี่ยนเพราะอิงกับ CodeMirror แต่ที่อย่าง tiptap.dev อาจได้รับผลกระทบ
@merijn อยากรู้ว่าช่วยอธิบายได้ไหมว่าอะไรทำให้ Wordgard คุ้มค่าพอจะรับต้นทุนการย้าย
แก้ไข: เห็นว่ามีประเด็นหลายอย่างถูกพูดถึงไว้ในบล็อกส่วนตัวของ Marijn แล้ว เลยส่ง https://marijnhaverbeke.nl/blog/wordgard-0.1.html ไปที่ HN เพื่อให้มีบริบทที่ดีกว่า
แต่ตามที่อธิบายในโพสต์บล็อก ผมสะสม ข้อค้นพบด้านการออกแบบใหม่ มาไม่น้อย ซึ่งช่วยหลีกเลี่ยงปัญหาบางอย่างที่เจอใน ProseMirror ได้ เลยอยากทำรอบใหม่ขึ้นมา
ผมจะเพิ่มลิงก์ไปยังโพสต์บล็อกในส่วนเอกสารของเว็บไซต์
แล้วก็ชื่อไม่ใช่ merijn แต่เป็น marijn
หน้าแลนดิ้งเพจน่าจะต้องมีข้อมูลเรื่อง “ทำไม” มากกว่า “คืออะไร”
นอกเหนือจากตัวเอดิเตอร์แล้ว ศิลปินที่รับผิดชอบงานดีไซน์นี่น่าประทับใจมาก ดูเนี้ยบมากและสะดุดตาสุด ๆ: https://kamilastankiewicz.com/
ราว 25 ปีก่อน จำได้ว่าการทำให้ WYSIWYG editor ใช้งานได้บนไซต์ PHP-Nuke ของหนังสือพิมพ์โรงเรียนเป็นอุปสรรคใหญ่ และสุดท้ายก็ผ่านมันมาได้
มันเหลือเชื่อมากที่จนถึงตอนนี้ยังไม่มีการทำตามมาตรฐานเว็บสำหรับฟีเจอร์แบบนี้ที่ผ่านมาราว 15 ปีแล้ว
contenteditableอยู่แล้ว และของอย่าง Wordgard หรือ ProseMirror ก็ถูกสร้างอยู่บนสิ่งนั้นในระดับพื้นฐาน ส่วนที่เหลือก็ใกล้เคียงกับเรื่อง ส่วนติดต่อผู้ใช้ และการทำงานร่วมกับระบบที่ไม่ต้องการรับ HTML ตามอำเภอใจอันนี้ดูยอดเยี่ยมแบบน่าประหลาดใจ
ช่วงหลังผมหาอะไรคล้าย ๆ กันอยู่ สุดท้ายก็ลงมือทำเอง โดยใช้ operational transform (OT) แบบบล็อกเป็นฐานเพื่อซิงก์กับเซิร์ฟเวอร์โลคัล และใช้การซิงก์แบบอิง diff กับเซิร์ฟเวอร์ระยะไกล
อ่าน system guide ไปก็พยักหน้าตามไปเรื่อย ๆ เห็นทั้งส่วนที่คล้ายและส่วนที่ต่าง เลยรู้สึกเหมือนได้รับการยืนยันพอสมควร
มีพื้นที่พื้นฐานมากอย่างหนึ่งที่เอดิเตอร์ทั้งหมดล้มเหลวมาโดยตลอด คือใช้ iPhone พิมพ์ ประโยคเต็ม ๆ ภายในเอดิเตอร์ได้หรือไม่
Wordgard ยังไม่ผ่านการทดสอบนี้ อินพุตที่มาจากการแก้ไขอัตโนมัติหรือคำแนะนำจากคีย์บอร์ดถูกกลืนหายไป และคำที่พิมพ์ไปบางส่วนหรือสะกดผิดก็ถูกลบ
Safari บนมือถือกับ Chrome บน Android มีพฤติกรรมประหลาดเยอะมากเมื่อเทียบกับเบราว์เซอร์พี่น้องบนเดสก์ท็อป และก็จัดการมาตรฐานแบบค่อนข้างหลวม ๆ ด้วย ดังนั้นถ้าจะให้ทำงานได้จริงมักต้องมี โค้ด workaround ยาวเป็นหางว่าว
Wordgard ก็น่าจะไปถึงจุดนั้นในที่สุด แต่ก่อนปล่อยเวอร์ชันแรก จุดโฟกัสคือสถาปัตยกรรม
เลือกข้อความไม่ได้, autocorrect พัง, แตะข้อความแล้วเคอร์เซอร์ไม่ย้าย, อินพุตค้าง, แล้วคีย์บอร์ดก็ไม่ยอมหายแม้องค์ประกอบจะเสียโฟกัสไปแล้ว
ตลอดหลายสิบปีที่ผ่านมา มีความพยายามหลายครั้งในการเพิ่ม องค์ประกอบ rich text ที่ใช้งานได้จริงให้เว็บ แต่ก็ไม่รู้ว่าทำไมถึงล้มเหลวหมด น่าจะเพราะงานใหญ่ ซับซ้อน และไม่ค่อยให้ผลตอบแทน
การรองรับ rich text แบบเนทีฟที่ดีจริง ๆ เป็นหนึ่งในจุดบอดใหญ่ของเว็บ ขณะที่แพลตฟอร์มเนทีฟแก้ปัญหานี้กันไปตั้งนานแล้ว
ราว 6 ปีก่อน ผมลำบากมากกับการสำรวจและทำฟีเจอร์ autocomplete ของทรัพยากรระยะไกลแบบสไตล์ @ คือการอ้างถึงผู้ใช้คนอื่นหรือเอกสารอื่น วิธีขยายความสามารถของเอดิเตอร์ตัวนี้ดูเหมือนวิวัฒนาการของ ProseMirror
คงดีมากถ้าสิ่งนี้เป็น ฟีเจอร์ในตัวพื้นฐาน แทนที่จะต้องมานั่งสร้างเองจากตัวอย่างไดโนเสาร์ ทุกครั้งที่ใช้ไลบรารี text editor แบบนี้ use case อันดับหนึ่งของผมคือสิ่งนี้ แล้วค่อยเป็น WYSIWYG
การรองรับมือถือแบบจริงจัง ก็จำเป็นเหมือนกัน
สิ่งที่ทำให้การใช้ ProseMirror ผ่าน TipTap ลำบากคือ บ่อยมากที่ต้องจัดการ JSON representation ของเอกสารแบบเป็นโปรแกรมเพื่อดึงข้อมูลออกมา ซึ่งพอทำแบบนั้นแล้วก็จำเป็นหรืออย่างน้อยก็อยากได้ representation ที่มี static type กำกับ
ProseMirror ไม่มีอะไรช่วยเรื่องนี้โดยตรง สุดท้ายเลยต้องเลือกทำอย่างใดอย่างหนึ่ง
ผมยังไม่ได้ลอง Wordgard เลยไม่รู้ว่าจัดการปัญหานี้หรือเปล่า แต่เป็นจุดเจ็บปวดที่อยากเห็นถูกแก้ เลยอยากชี้ไว้
งานอาร์ต บนเว็บไซต์สวยมาก รู้สึกเหมือนแนวทางดึงความสนใจแบบนี้ถูกลืมกันไปแล้ว
ผมไม่ชอบ WYSIWYG บนเว็บเลย เขียนโพสต์ในฟอรัมยาว ๆ จัดฟอร์แมตเสียสวย แล้วเผลอปิดแท็บ ทุกอย่างหายหมด
ผมชอบใช้ text editor ในเครื่องแล้วค่อย Ctrl+V ไปวางในฟอร์มเว็บมากกว่า ถ้าเป็น Markdown ก็ทำแบบนั้นได้
ตอนที่เจอแบบนี้ครั้งแรกหลังปิดแท็บพลาด มันเป็นความประหลาดใจที่ดีมากจริง ๆ
ประเด็นคือ นี่ไม่ใช่ปัญหาทางเทคนิค แต่เป็น ปัญหาด้านผลิตภัณฑ์
แต่กับแอปโน้ต ผมเลือกใช้ WYSIWYG เพราะไม่มีที่พอสำหรับมุมมองแบบแบ่งหน้าจอ และก็ไม่ได้อยากดูต้นฉบับ Markdown อย่างเดียว
ข้อร้องเรียนใหญ่สุดของผมต่อ WYSIWYG คือมันอาจรบกวนได้ เช่นสร้างบล็อก verbatim แล้วดันออกจากบล็อกนั้นไม่ได้ กำลังพูดถึง Teams นี่แหละ เลยอาจเป็นเหตุผลว่าทำไมผมถึงชอบ LaTeX มาก
ดีใจมากที่ได้เห็น ศิลปะ จริง ๆ อีกครั้งในรอบนาน ดูดีมาก