mdBook - เครื่องมือบรรทัดคำสั่งสำหรับสร้างหนังสือด้วย Markdown
(rust-lang.github.io)- เมื่อต้องเผยแพร่เอกสารและบทเรียนในรูปแบบหนังสือ mdBook 0.5.3 มอบทั้งการเขียนบนพื้นฐาน Markdown และผลลัพธ์ที่นำทางได้
- ด้วย ไวยากรณ์ Markdown ที่เบาและการค้นหาแบบรวม ผู้เขียนจึงโฟกัสกับเนื้อหาได้มากกว่ารูปแบบ
- บล็อกโค้ดที่มี การไฮไลต์ไวยากรณ์ และไฟล์ธีม ช่วยปรับความอ่านง่ายและรูปแบบผลลัพธ์ที่จำเป็นสำหรับเอกสารทางเทคนิคได้
- preprocessor และ backend มอบจุดขยายสำหรับไวยากรณ์แบบกำหนดเอง การแก้ไขเนื้อหา และการเรนเดอร์เป็นหลายรูปแบบผลลัพธ์
- เนื่องจากเป็นเครื่องมือที่ใช้ในโปรเจกต์ Rust และหนังสือ The Rust Programming Language จึงเชื่อมโยงกับระบบนิเวศเอกสารของ Rust อย่างมาก
ฟีเจอร์พื้นฐานที่จำเป็นสำหรับการสร้างหนังสือ Markdown
- mdBook เป็นเครื่องมือบรรทัดคำสั่งสำหรับสร้างหนังสือด้วย Markdown
- เหมาะสำหรับการสร้างเนื้อหาที่เรียบร้อยและนำทางง่าย เช่น เอกสารผลิตภัณฑ์ เอกสาร API บทเรียน และสื่อการสอน
- มีฟีเจอร์ที่ช่วยทั้งประสบการณ์การเขียนและการอ่าน
- โฟกัสกับการเขียนเนื้อหาได้ด้วยไวยากรณ์ Markdown ที่เบา
- รองรับ การค้นหา แบบรวมภายในหนังสือ
- ใช้ การไฮไลต์ไวยากรณ์ แบบสีในบล็อกโค้ดหลายภาษา
- ปรับแต่งรูปแบบผลลัพธ์ได้ด้วยไฟล์ ธีม
การขยายความสามารถและการเชื่อมโยงกับระบบนิเวศ Rust
- preprocessor สามารถรับหน้าที่ขยายไวยากรณ์แบบกำหนดเองและแก้ไขเนื้อหาได้
- สามารถเรนเดอร์เป็นหลายรูปแบบผลลัพธ์ผ่าน backend
- mdBook เขียนด้วย Rust เพื่อความเร็ว ความปลอดภัย และความเรียบง่าย
- รองรับการทดสอบอัตโนมัติสำหรับ ตัวอย่างโค้ด Rust
กรณีใช้งานจริงและวิธีมีส่วนร่วม
- เอกสารของ mdBook เองเป็นตัวอย่างของผลลัพธ์ที่สร้างด้วย mdBook
- โปรเจกต์ภาษาโปรแกรม Rust ใช้ mdBook และหนังสือ The Rust Programming Language ก็เป็นหนึ่งในกรณีใช้งาน
- mdBook เป็นโปรเจกต์ โอเพนซอร์สฟรี
- สามารถดูซอร์สโค้ดได้ที่ GitHub
- สามารถส่ง issue และคำขอฟีเจอร์ได้ที่ GitHub issue tracker
- หากต้องการมีส่วนร่วม สามารถอ่านคู่มือ CONTRIBUTING และเปิด pull request ได้
- ซอร์สและเอกสารของ mdBook เผยแพร่ภายใต้ Mozilla Public License v2.0
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
จำได้ว่าแพลตฟอร์มนี้ใช้ ไลบรารีที่โฮสต์บน CDN โดยไม่ได้ bundle หรือ vendor ไลบรารีไว้ด้วย ดังนั้นผู้ใช้จึงเสี่ยงไม่เพียงแค่ปัญหา CDN ล่ม แต่ยังรวมถึงข้อมูลที่เซิร์ฟเวอร์นั้นเก็บรวบรวมด้วย
ที่น่าเสียดายยิ่งกว่าคือวิธีที่ฝั่งฟรอนต์เอนด์ใช้ Highlight.js และ MathJax นั้นสิ้นเปลืองมาก เพราะไคลเอนต์ทุกตัวต้อง parse และ render syntax กับ LaTeX เอง และต้องทำงานซ้ำเดิมทุกครั้งที่มีการเข้าชมเพื่อให้ได้ผลลัพธ์เดียวกัน การทำ syntax highlighting สามารถจัดการได้ตั้งแต่ขั้นตอน build และแทบไม่มีเหตุผลเลยที่ต้องใช้ JavaScript
น่าจะเลือกแบบนั้นเพราะการรองรับ MathJax เป็นตัวเลือกเสริม: https://rust-lang.github.io/mdBook/format/mathjax.html
แต่ก็ยังเข้าใจได้ยากว่าทำไมถึงไม่วางไฟล์ MathJax ทั้งชุดไว้ข้าง HTML ที่สร้างขึ้นมา โดยเฉพาะเมื่อมีความเป็นไปได้สูงว่าไฟล์ JS ของ MathJax จะไปดึงไฟล์เพิ่มเติมจาก CDN อีกที
เครื่องมือทำเอกสาร·เว็บไซต์แบบสแตติกที่ถูกพูดถึงในเธรดนี้มีประมาณ Jekyll, Hugo Book, MdBook, MkDocs, MkDocs Material, GitBook, Antora, Docusaurus, Nextra, Astro, Starlight, Clowncar, Keenwrite, Quarto, Honkit, JupyterBook
Jekyll, Hugo Book, MdBook, MkDocs, MkDocs Material, GitBook, Antora, Docusaurus, Nextra, Astro, Starlight, Clowncar, Keenwrite, Quarto, Honkit, JupyterBook
มันเป็นพอร์ตของ mdBook ไปยัง Nim แต่ยังขยายความสามารถให้สร้าง คอนเทนต์แบบ interactive โดยใช้ JavaScript backend ของ Nim ด้วย แม้จะยังไม่เคยใช้เองจริง ๆ แต่ก็ชอบแนวคิดที่สามารถสร้างองค์ประกอบ interactive ไว้รวมกันในที่เดียวเมื่อจำเป็น: https://pietroppeter.github.io/nimib/interactivity.html
เคยใช้ MdBook, Jekyll และ MkDocs มาแล้ว โดย MdBook ดูลื่นไหลดีสำหรับโปรเจ็กต์พื้นฐาน แต่รู้สึกว่ามินิมอลเกินไป พอไปดูซอร์สของเว็บที่ทำด้วย MdBook แล้วชอบ ก็พบว่าบางกรณีมีการขยายความสามารถด้วยโค้ด Rust แบบคัสตอม
ถ้าจะให้แนะนำ MkDocs เป็นตัวเลือกพื้นฐานที่ยืดหยุ่นได้อย่างสมเหตุสมผล, Jekyll เหมาะเมื่ออยากได้ความยืดหยุ่นมากขึ้น เช่น สำหรับหน้า landing page หรือบล็อก, ส่วน Antora เหมาะเมื่ออยากสร้างเว็บเอกสารที่ดีที่สุดโดยรวบรวมเอกสารหลายโปรเจ็กต์และหลายเวอร์ชันเข้าด้วยกัน และยอมลงแรงมากหน่อย AsciiDoc ก็มีฟีเจอร์ที่เป็นประโยชน์ต่อการเขียนเอกสารอยู่มาก
Hugo ดูยืดหยุ่นคล้าย Jekyll แต่ต้องใช้ความพยายามมากกว่าจะปรับให้ได้อย่างที่ต้องการ และแต่ละธีมก็ดูจะแตกต่างกันมากเกินไปในแง่วิธีการทำงาน พอธีมที่ใช้อยู่ไม่มีฟีเจอร์ที่ต้องการ ก็พยายามจะเปลี่ยนธีมแต่ย้ายไม่ง่าย สุดท้ายเลยยอมแพ้ MdBook ดูค่อนข้างแอ็กทีฟ เลยคิดว่าสุดท้ายน่าจะตามทัน
เคยเลื่อนการใช้มันมานานเพราะไม่อยากใช้เครื่องมือสาย JavaScript แต่พอได้ลองแล้วก็เริ่มต้นง่าย เร็วมาก เว็บไซต์ค่าเริ่มต้นก็สวย และคัสตอมก็ง่าย รองรับ MDX ได้ยอดเยี่ยมด้วย
กำลังลองใช้ BookStack อยู่ด้วย ซึ่งใกล้เคียงกับวิกิมากกว่า แต่เหมาะกับคนที่ไม่ค่อยถนัดเทคโนโลยี โดยปกติแล้วโปรเจ็กต์ MkDocs มักแก้ไขใน VSCode และเก็บไว้ในรีโพ Git แต่ BookStack เป็นเว็บทั้งหมด
เมื่อก่อนเคยใช้ GitBook สร้าง til.secretGeek.net แต่พอนานไปมันก็ช้าลงเรื่อย ๆ จน build เว็บไซต์ใช้เวลา 45 นาที และฟีเจอร์ที่เคยใช้ก็ถูกยกเลิกหรือย้ายไปเป็น “premium” สุดท้ายก็เหมือนเริ่มเข้าสู่ภาวะ enshittification
ถ้ากำลังใช้เครื่องมือฟรีที่ดูดีเกินจริงอยู่ แค่รอสักไม่กี่ปีก็มีโอกาสสูงที่มันจะพังลง สุดท้ายเลยทำ static site generator แบบมินิมอลเองด้วย .NET ให้กลับมา build เสร็จได้ภายในไม่กี่วินาที ไม่ได้ถึงขั้นเอาไปโปรโมตให้คนอื่นใช้ เพราะถ้ามันดังขึ้นมา ตัวเองก็คงทำมันพังแบบเดียวกันในที่สุด
https://www.collinsdictionary.com/jp/dictionary/english/spru...
เคยใช้ mdBook ในหลายโปรเจ็กต์ แต่ช่วงนี้รู้สึกว่า material for mkdocs ใช้งานสบายกว่าเพราะมีฟีเจอร์ที่มีมาให้เยอะกว่ามาก
ตัวอย่างเช่นชอบสารบัญของหน้าที่อยู่ด้านขวา ซึ่งเป็นฟีเจอร์ที่ mdBook ขาดไปอย่างเห็นได้ชัด ใน mdBook วิธีมาตรฐานดูเหมือนจะเป็นการจัด SUMMARY ให้ละเอียดมาก และแยกเนื้อหาที่เดิมอยู่หน้าเดียวได้ออกเป็นหลายไฟล์
ไม่กี่วันก่อนเพิ่งเริ่มใช้ mdBook เพื่อทำเอกสารให้โปรเจ็กต์เล็ก ๆ และมันเป็น ตัวสร้างหน้าเว็บแบบสแตติกขนาดเล็ก ที่ตรงกับสิ่งที่ต้องการพอดี
เคยใช้ HUGO เหมือนกัน แต่เทียบกับ mdBook แล้วดูใหญ่และเทอะทะเกินไป ตอนนี้แก้ไขเอกสารด้วย Obsidian/VIM แล้ว push ไปที่ Gitea จากนั้นเอกสารสาธารณะก็ถูกสร้างเสร็จภายในไม่ถึง 1 นาที
ด้วย shortcode ที่เหมาะสม สามารถใส่เลขลำดับอัตโนมัติให้รูปภาพ สมการ ฯลฯ ได้ เลยสงสัยว่าใน mdBook ก็ทำเลขอัตโนมัติได้หรือไม่ นอกจากนี้ยังมีสารบัญด้านขวา มีแท็ก และมีฟังก์ชันแบ่งหน้าเป็นคอลัมน์ รวมถึงรองรับ KaTeX ได้ดี mdBook ดูเหมือนจะใช้ MathJax และการ deploy ก็ง่าย แค่ push หรือ rsync ก็พอ
ไม่นานมานี้เริ่มค่อย ๆ ย้ายคอนเทนต์ไปใช้ .mdx แทน .md และลองดูไปด้วย รู้สึกว่าใหม่สดทีเดียว จุดที่ลำบากที่สุดของ Markdown มาโดยตลอดคือแต่ละ dialect มีข้อจำกัดไม่เหมือนกัน และวิธีขยายข้อจำกัดเหล่านั้นก็แตกต่างกันไปหมด
โดยรวมพอใจกับ GitBook Markdown dialect มาตรฐานสัก 80~90% มาก แต่บางครั้งก็ต้องการตารางที่ซับซ้อนกว่าเดิม, code block ที่เน้นแค่ไม่กี่บรรทัดพร้อมคง syntax highlighting ไว้, interactive slider, เครื่องคิดเลขที่ฝังอยู่ในเอกสาร, หรือกราฟ/แผนภูมิบางแบบ ไม่แน่ใจว่า MDX จะทำงานอย่างไรในทีมใหญ่ แต่สำหรับงานส่วนตัวมันดูเป็นการปรับปรุงที่ชัดเจน
ถ้ากำจัดพวก dialect แล้วมีแนวทางสากลแบบเดียวได้ก็คงดี แต่ในเอกสารเขียนว่า “MDX ไม่ได้ผูกติดกับ React และยังใช้กับ Preact, Vue, Emotion, Theme UI ฯลฯ ได้ รวมถึงรองรับทั้ง classic/automatic JSX runtime” แถมยังมี implementation สำหรับ Svelte [1] อยู่แล้ว เลยไม่แน่ใจว่านี่จะไม่ใช่กล่องแพนดอร่าที่สร้าง dialect ซึ่งผูกกับเฟรมเวิร์กฝั่งฟรอนต์เอนด์เพิ่มขึ้นอีกหรือเปล่า ภายใน .mdx เองก็อาจแตกแขนงกัน และอาจไม่เข้ากันกับ .md ด้วย
[0] https://mdxjs.com/docs/what-is-mdx/
[1] https://mdsvex.com/docs
มีธีมให้ใช้เหมือนกัน แต่ถ้าเป็นนักพัฒนาเว็บสมัยใหม่ก็น่าจะทำเองได้ค่อนข้างง่าย
ผมสร้างเครื่องมือฟรี โอเพนซอร์ส ข้ามแพลตฟอร์มชื่อ KeenWrite สำหรับทำหนังสือจาก Markdown: https://github.com/DaveJarvis/keenwrite
KeenWrite เรียกใช้ ConTeXt เพื่อจัดพิมพ์เอกสาร และในโหมดพรีวิวใช้ KeenType fork สำหรับจัดพิมพ์สมการ สามารถสร้าง PDF จากบรรทัดคำสั่งได้ ตอนนี้หนังสือที่กำลังเขียนอยู่มีการอ้างอิงตัวแปรหลายตัวที่นิยามไว้ในไฟล์ภายนอกจากภายในเนื้อหา ส่งคุณสมบัติ PDF ผ่าน metadata และสามารถ build เฉพาะบางบทได้ด้วยอาร์กิวเมนต์ chapters ส่วนไดเรกทอรี theme จะเก็บคำสั่งจัดพิมพ์ เช่น สี ฟอนต์ เลย์เอาต์ เชิงอรรถ เป็นต้น
ตัวอย่างผลลัพธ์: https://github.com/DaveJarvis/keenwrite-themes/tree/main/exa...
สงสัยว่าทำไม Markdown หรือฟอร์แมตคล้าย ๆ กันถึงไม่กลายเป็นรูปแบบพื้นฐานสำหรับหนังสือ เอกสาร หรือแทบทุกงานเขียน เมื่อหลายปีก่อนพอย้ายมาใช้ Typora แล้วก็แทบไม่ต้องใช้ Word/Writer กับงานเขียนของตัวเองอีก ใช้แค่ตอนเปิดเอกสารที่คนอื่นส่งมาเท่านั้น
แม้แต่ 90% ของหนังสือที่ผมอ่านก็ดูเหมือนไม่มีเหตุผลชัดเจนว่าทำไมจะไม่อยู่ในรูปแบบ Markdown เข้าใจนะว่าถ้าจะพิมพ์หนังสือกระดาษให้สวยก็ต้องมีการจัดพิมพ์ แต่ข้อความส่วนใหญ่ที่อ่านบนคอมพิวเตอร์หรือสมาร์ตโฟน หรือพิมพ์ออกจาก MS/LibreOffice ตรง ๆ ยังไงก็ไม่ได้มีการจัดพิมพ์แบบนั้นอย่างเหมาะสมอยู่แล้ว
มีทางเลือกที่ดีกว่าอย่าง AsciiDoc แต่ก็เน้นงานเอกสารเฉพาะทาง และไม่มีแรงส่งใกล้เคียงกับ Markdown เมื่อคิดว่า Markdown เป็นฟอร์แมตที่ออกมาค่อนข้างทีหลัง คำถามที่เหมาะกว่าน่าจะเป็นว่าทำไมหนังสือต้องเป็น Markdown ข้อดีใหญ่สุดของ Markdown เมื่อเทียบกับฟอร์แมตแบบไบนารีหรือ XML คือมันยังอ่านได้พอสมควรในรูปแบบข้อความล้วน แต่สำหรับสำนักพิมพ์และผู้อ่านส่วนใหญ่ เรื่องนี้ไม่ได้สำคัญขนาดนั้น
นี่ก็เป็นกับดักแบบคลาสสิกของวิศวกรที่คิดว่า “ฉันทำได้ดีกว่านี้” ดังนั้นไม่ควรตั้งสมมติฐานแบบนั้นโดยไม่ศึกษาก่อน การจัดพิมพ์เป็นศาสตร์ที่เก่ากว่าเครื่องมือที่คุยกันอยู่ที่นี่มาก และไม่ควรทิ้งองค์ความรู้กับเทคนิคที่มีคุณค่าซึ่งสั่งสมมานาน เพียงเพราะ Markdown ใช้ได้เกือบพอสำหรับงานบางประเภท
mdBook ใช้งานง่าย และผมชอบมากโดยเฉพาะตรงที่ผู้ใช้ เลือกธีมได้ ส่วนใหญ่ผมใช้กับเวอร์ชันออนไลน์ของอีบุ๊ก [0] และชุดแหล่งข้อมูลที่คัดสรรไว้ [1][2]
[0] https://github.com/learnbyexample/scripting_course#ebooks
[1] https://learnbyexample.github.io/py_resources/
[2] https://learnbyexample.github.io/curated_resources/