Vì sao tôi thích rST hơn Markdown
(buttondown.email)- reStructured Text (rST) của Sphinx khó học hơn Markdown, nhưng dễ kiểm soát chi tiết cấu trúc và định dạng đầu ra hơn trong các tài liệu quy mô lớn như sách
- Markdown gần với một kiểu ký pháp HTML gọn nhẹ, còn rST xoay quanh cây tài liệu trừu tượng, nơi có thể kết hợp directive, node và renderer để thêm các đối tượng tài liệu mới
- Sphinx biến đổi doctree trước khi render, nên có thể xử lý tham chiếu chéo, xử lý theo từng định dạng đầu ra, hoặc các phép biến đổi ở những giai đoạn build cụ thể ngay trong hệ thống tài liệu
- Trong Logic for Programmers, tác giả viết bài tập và lời giải gần nhau trong bản gốc, rồi dùng phần mở rộng tùy biến để thay đổi vị trí và cách hiển thị trong đầu ra EPUB và LaTeX
- Markdown đơn giản thiếu cú pháp mở rộng thống nhất và hỗ trợ biến đổi trước khi render, nên càng phải lách qua tiền xử lý riêng trong trình tạo tài liệu thì càng yếu về hỗ trợ công cụ và khả năng mở rộng
Vì sao chọn rST
- Phiên bản mới của Logic for Programmers là cuốn sách thứ hai được viết bằng Sphinx, và dự án trước đó là Learn TLA+ mới cũng dùng Sphinx
- Sphinx sử dụng reStructured Text, và rST có đường cong học tập dốc hơn Markdown
- Sau khi viết nhiều cuốn sách bằng Markdown, tác giả chuyển sang rST vì cần công cụ tốt hơn
- Bản thân rST là độc lập với Sphinx, nhưng trên thực tế nhiều người dùng rST là vì Sphinx, nên bài viết xem xét cả hai cùng nhau
Khác biệt về cấu trúc giữa Markdown và rST
- Khác biệt lớn nhất là Markdown gần với ký pháp HTML rút gọn, còn rST là một kiểu ký pháp tầm trung để tạo ra cây tài liệu trừu tượng
- Cú pháp ảnh trong Markdown có thể được chuyển khá đơn giản thành HTML như
<img alt="alttext" src="example.jpg"/>- Các engine Markdown hiện đại cũng thường parse sang biểu diễn trung gian, nhưng bản chất cơ bản của nó vẫn gần với ký pháp HTML nhẹ
- Ảnh trong rST được biểu diễn bằng directive
.. image::- Sphinx tìm handler của directive đã đăng ký rồi chạy
ImageDirective.run - Kết quả thực thi là một đối tượng node như
image_nodecó trườngalt - Khi toàn bộ doctree đã được xử lý xong, HTML Writer sẽ tìm hàm render cho
image_nodevà xuất ra thẻ HTML
- Sphinx tìm handler của directive đã đăng ký rồi chạy
- Cách làm của rST phức tạp hơn về cả triển khai lẫn cú pháp và có nhiều boilerplate hơn Markdown, nhưng ảnh cũng được xử lý bằng cùng cơ chế mở rộng như các directive khác
Cách thêm đối tượng tài liệu mới
- Trong rST/Sphinx, có thể thêm các đối tượng văn bản mới bằng extension
- Ví dụ, nếu muốn tạo
<figure>và<figcaption>thay vì<image>, thì trong Markdown cơ bản bạn phải chèn HTML trực tiếp - Trong Sphinx, việc này được xử lý bằng cách đăng ký một directive
figuremớiFigureDirectivethậm chí có thể kế thừaImageDirectiveđể tái sử dụng phần lớn logic xử lý ảnh
- Mẫu đăng ký directive, tạo node và đăng ký renderer theo từng builder được áp dụng nhất quán cho mọi extension
Biến đổi doctree trước khi render
- Sphinx có thể thực hiện biến đổi doctree trước khi render
- Tham chiếu chéo giữa các tài liệu cũng được xử lý bằng tính năng này
- Nếu một tài liệu có neo
foovà tài liệu khác có:ref:\image <foo>``, Sphinx sẽ chèn đúng URL ở giai đoạn hậu xử lý
- Nếu một tài liệu có neo
- Mã biến đổi được coi như tính năng hạng nhất trong quy trình build
- Có thể chỉ áp dụng một biến đổi nhất định khi xuất HTML
- Có thể chạy biến đổi ở một giai đoạn build cụ thể
- Cũng có thể gỡ bỏ các biến đổi tích hợp sẵn mà bạn không muốn chạy
- Không phải tài liệu nào cũng cần mức mạnh mẽ như vậy, và Markdown vẫn được dùng rộng rãi vì nhẹ và dễ di chuyển
Ví dụ extension cho bài tập và lời giải
- Logic for Programmers là một cuốn sách gần với toán học nên cần có bài tập cho người đọc
- Khi viết, để bài tập và lời giải gần nhau trong tài liệu sẽ thuận tiện hơn, nhưng với người đọc thì lời giải nên xuất hiện ở phần cuối sách
- Yêu cầu còn khác nhau tùy theo định dạng đầu ra
- Bài tập và lời giải phải liên kết qua lại với nhau
- Để có thể in ấn, bản PDF còn cần tham chiếu số trang
- Cách render trong đầu ra LaTeX/PDF và EPUB phải khác nhau
- Để làm việc đó, tác giả viết một extension Sphinx tùy biến xử lý
exercise,solution, vàsolutionlist - Trong đầu ra HTML dùng để debug, bài tập và lời giải được render inline
- Khi tạo EPUB và LaTeX, tác giả chạy biến đổi sau khi tạo xong toàn bộ doctree
- Tất cả
solution_nodeở vị trí gốc sẽ được chuyển xuống dướisolutionlist - Mỗi bài tập sẽ được gắn một node tham chiếu đến vị trí mới của lời giải
- Mỗi lời giải sẽ được gắn một node tham chiếu quay lại bài tập gốc
- Tất cả
- LaTeX builder bọc bài tập và lời giải bằng answers environment
- EPUB builder render lời giải thành popup footnote
- Cấu trúc này cũng hữu ích khi tạo bản mẫu miễn phí của sách
- Phần cuối bản mẫu miễn phí chỉ chứa lời giải cho phần có trong mẫu, chứ không phải toàn bộ lời giải của cả cuốn sách
Sở thích cú pháp và các lựa chọn thay thế
- Phản đối phổ biến nhất với rST là cú pháp của nó xấu
- Việc không muốn dùng một công cụ chỉ vì thấy nó khó nhìn cũng là lựa chọn hoàn toàn hợp lý, và lý do nhiều người khó chấp nhận Lisp cũng có thể xem là cùng một vấn đề về gu
- Các lựa chọn thay thế gồm có asciidoc, MyST, Typst, Pollen, pandoc-extended markdown
- Điểm chính không phải là Sphinx/rST đặc biệt tốt cho tài liệu quy mô lớn, mà là Markdown đơn giản đặc biệt không phù hợp cho tài liệu quy mô lớn
Giới hạn của các trình tạo tài liệu dựa trên Markdown
- Markdown đơn giản không có cú pháp mở rộng thống nhất hay hỗ trợ gốc cho biến đổi trước khi render
- Nhiều trình tạo tài liệu dựa trên Markdown bổ sung thêm bước tiền xử lý riêng để hỗ trợ các trường hợp sử dụng mới
- Cách này nhìn chung vẫn hoạt động, nhưng đó là xử lý vòng ngoài của Markdown chứ không phải xử lý bên trong chính Markdown
- Kết quả là sức mạnh tính năng bị giới hạn, và các công cụ dành cho lập trình viên cũng khó hiểu được những biến thể đó
- Có LSP và treesitter cho Markdown và rST, nhưng khó có thể kỳ vọng mức hỗ trợ tương tự cho gitbook-markdown, md-markdown, hay leanpub-markdown
- Cú pháp xấu của rST đôi khi lại là một lợi thế vì cây cú pháp của nó phong phú hơn
- Có thể viết truy vấn treesitter chỉ để thay phần thân của một directive
todocụ thể - Điều này khả thi vì cây cú pháp của rST phong phú hơn cây cú pháp của Markdown
- Có thể viết truy vấn treesitter chỉ để thay phần thân của một directive
Cập nhật về Logic for Programmers
- Logic for Programmers là cuốn sách nói về cách logic hình thức có thể hữu ích cho kỹ thuật phần mềm hằng ngày
- Sách bắt đầu bằng phần tổng quan về toán học cơ bản, rồi đi tiếp qua 8 ứng dụng như property testing, ràng buộc cơ sở dữ liệu, bảng quyết định, v.v.
- Hiện vẫn ở giai đoạn alpha, dài khoảng 20.000 từ và đang nhận phản hồi từ độc giả
1 bình luận
Ý kiến trên Hacker News
Nếu hỏi “chỉ vì nhìn vào là muốn nôn mà anh sẽ không dùng một công cụ tốt sao”, thì tôi sẽ trả lời là đúng vậy. Ưu điểm lớn nhất của Markdown là dễ đọc, và ưu điểm lớn thứ hai là dễ viết
Việc nó dễ phân tích cú pháp đến mức nào hay dễ mở rộng đến đâu gần như không quan trọng. Bỏ qua chuyện Markdown có phải lựa chọn tốt nhất để viết sách hay không, thì với mục đích nhanh chóng viết văn bản có định dạng theo cách mà ngay cả người không rành cú pháp cũng dễ đọc, Markdown là số một. Tôi đâu cần viết sách, tôi chỉ cần ghi chú, tài liệu nhanh, và viết bình luận; còn nếu viết sách thì tôi sẽ dùng LaTeX trước cả RST
Nhưng sau khi dùng trong ứng dụng thực tế, tôi nhận ra cốt lõi của Markdown không nằm ở đó. Mục tiêu của nó là chỉ cung cấp định dạng tối thiểu, để ngay cả ở trạng thái văn bản thuần nó cũng đọc tự nhiên gần như khi đã được render thành HTML. Các kiểu định dạng được hỗ trợ cố ý giữ ít để có thể nhớ trong đầu và dùng mà không cần thanh công cụ. Nó phù hợp với ô nhập bình luận, chat, commit message, có lẽ cả bài blog, nhưng không phù hợp để viết tài liệu sản phẩm cấp doanh nghiệp. Dạo này người ta còn dùng Markdown ở cả những nơi không được render ra HTML, vì bản thân nó đã dễ đọc rồi, và tôi cũng mong HN hỗ trợ điều đó
Tôi cũng đã làm khá nhiều tài liệu kỹ thuật bằng Markdown, và nếu dùng phần mở rộng của Pandochttps://pandoc.org/MANUAL.html thì có thể thêm gần như mọi kiểu định dạng cần thiết, gồm cả công thức phức tạp và code block có tô sáng cú pháp. Markdown đó có thể được chuyển đổi sang HTML, tài liệu Word, ePub, PDF, v.v. Muốn lấy thứ gì khác ngoài Markdown ra dùng thì phải có một lý do thật sự thuyết phục
Vấn đề lớn nhất tôi thấy ở TeX không phải là ngôn ngữ mà là con người. Mọi người rất hay viết TeX kiểu spaghetti với style tệ hại. Nhưng nếu viết với tư duy “tài liệu là code” thì có thể cho ra kết quả khá gọn gàng. Vấn đề lớn thứ hai là không có trình biên dịch TeX → HTML nào thật sự tốt
Tôi không thành thạo LaTeX, nhưng lần tôi thử học nó có cảm giác như đang học ngôn ngữ của một nền văn minh ngoài hành tinh dạng côn trùng. Nó hoàn toàn không trực quan, và nếu không theo kiểu sao chép thứ người khác đã làm sẵn rồi nhét nội dung của mình vào thì gần như không thể tự làm cái gì mới. Nếu tôi nhớ không nhầm thì nó cũng không có hỗ trợ Unicode hạng nhất
Ngay cả việc dùng dấu sao hoặc dấu gạch dưới cho chữ nghiêng cũng đòi hỏi phải làm quen, trong khi có những cách trực quan hơn nhiều như
/italic slashes/. Còn khi vượt ra ngoài phần cơ bản, bảng biểu, metadata, hay tag sẽ che mất nội dung văn bản, khiến việc viết và đọc không hề dễ nếu không có công cụ phù hợp. Nếu dễ mở rộng thì cũng có thể sửa những vấn đề cơ bản này, nên tính mở rộng cũng có liên quanTôi đã làm người viết tài liệu kỹ thuật khoảng 12 năm, và vào đầu sự nghiệp đã chuyển tài liệu của một startup từ Word sang Sphinx. Sau đó tôi làm với CMS/phần mềm nền tảng tài liệu dành cho lập trình viên độc quyền của Google, các trang dựa trên Eleventy, và 2 năm gần đây lại làm với pigweed.dev, một trang dựa trên Sphinx. Tôi cũng từng làm ở một startup dùng readme.com và có đụng qua Docusaurus, Astro, Hugo một chút
Chỉ riêng reStructuredText có thể hơi thô, nhưng reST kết hợp với Sphinx thì rất tuyệt. Điểm mạnh của Sphinx vượt xa điểm yếu của reST. Nếu là một trang tài liệu chuyên môn lớn, hơn 100 trang, hơn 10 người đóng góp, thì về dài hạn tôi khá tin rằng Sphinx là lựa chọn có trách nhiệm nhất. Ví dụ ở Pigweed, chỉ cần viết
:bug:\59385981`` là nó sẽ tự biến thành liên kết https://pwbug.dev/59385981, và nếu sau này cần di chuyển hàng loạt các liên kết bug thì cũng rất dễ. Các liên kết nội bộ cũng luôn được đảm bảo là có thể phân giải, và nếu liên kết tới chỗ không tồn tại thì sẽ có cảnh báo hoặc lỗi. Trước đây tôi đã viết ở https://technicalwriting.dev/src/link-text-automation.html rằng thật kỳ lạ khi đây không phải là tiêu chuẩn của các trang tài liệu. Sphinx cũng có API mở rộng và giao diện được định nghĩa tốt, hệ sinh thái trên PyPI cũng khá lớn. Dạo này tôi gọi Sphinx là gã khổng lồ đang ngủ của các hệ thống tài liệu, và chỉ cần thêm một chút nỗ lực tập thể thì nó có thể trở nên còn ấn tượng hơn nhiềuNếu slug thay đổi hoặc cấu trúc trang được tổ chức lại thì phải tìm và thay trên toàn bộ site. Trình tạo trang tĩnh hoàn toàn có thể cho phép liên kết kiểu
[Hello](../hello.md)rồi phân giải khi build, nhưng nhiều công cụ tôi từng dùng hoặc từng xem qua lại bắt nhập trực tiếp kiểu[Hello](/why/hello/). Có vẻ tính năng này khá gây chia rẽ. Kể cả khi nói với thành viên các nhóm làm trình tạo trang tĩnh, tôi cũng chỉ nhận được câu trả lời kiểu “tại sao lại cần cái đó”, và dù có giải thích thì cũng không thuyết phục được. Không biết là phải từng gặp vấn đề này mới hiểu giá trị của giải pháp, hay vì họ quen với việc dùng một lần rồi không phải bảo trì hơn 10 năm, nhưng tôi mong nó được hỗ trợ rộng rãi hơnHệ sinh thái plugin rất tuyệt, tạo ra đòn bẩy cực lớn để cải thiện tài liệu của nhóm và dự án. Bản thân reStructuredText thì tôi không thích lắm, nhưng giờ nhờ MyST-Parser mà phần lớn những gì trước đây Sphinx bị gắn chặt với RST nay cũng có thể làm bằng Markdown: https://github.com/executablebooks/MyST-Parser
Tôi vừa chuyển một cuốn sách hơn 200 trang giải thích ngôn ngữ/VM/lớp trừu tượng hóa nội bộ sang Sphinx, và đây thật sự là một hệ thống thay đổi cuộc đời. Tôi ước gì tài liệu của chính Sphinx dễ tiếp cận hơn hoặc có nhiều ví dụ hơn, nhưng hiện tại tôi đang ở đúng kiểu cảm giác trăng mật rất mãnh liệt. Mối quan tâm chính của tôi là cách tạo ra sách PDF đẹp mắt, và một hệ thống có thể cắt cuốn sách thành các trang man tương thích POSIX theo từng chương và mục
Khi chọn trình tạo site, tính thẩm mỹ là một yếu tố khá quan trọng. Hugo và Gatsby có theme mặc định rất tốt, và thực tế tôi từng chọn chúng cho dự án chỉ vì lý do đó. Bộ sưu tập theme của Sphinx https://sphinx-themes.org/ và https://sphinxthemes.com/#featured-themes nhìn chung khá nhạt nhẽo. Theme RTD chuẩn của Sphinx https://sphinx-rtd-theme.readthedocs.io/en/stable/ nếu so với tài liệu của Apple https://developer.apple.com/documentation/swift/array hay Fluent UI https://react.fluentui.dev/?path=/docs/concepts-developer-positioning-components--default thì trông đã lỗi thời
Tôi cho rằng câu “Markdown là một biểu diễn gọn nhẹ của HTML” là vấn đề lớn nhất trong bài này. Điều đó chắc chắn không chính xác.
Markdown được thiết kế như một công cụ để chuyển đổi các quy ước định dạng văn bản từng được dùng gần như như chuẩn thực tế trong email và bài viết Usenet đầu thập niên 1990. Do ràng buộc 7-bit ASCII, các định dạng như nhấn mạnh hay tiêu đề được biểu thị bằng ký hiệu đặc biệt, và HTML cũng có nhiều điểm giống với quy ước vô danh đó. Vì vậy John Gruber đã viết một script cơ bản vào năm 2004 để chuyển nó sang HTML https://daringfireball.net/projects/markdown/, nhưng có lẽ ông không ngờ nó sẽ trở thành một chuẩn thực tế phổ biến đến vậy
Gruber không chỉ lấy chuẩn thực tế của Usenet rồi đơn giản làm ra một bộ chuyển đổi HTML, mà đã vay mượn từ Usenet và các quy ước khác để thiết kế markup của riêng mình. Phần “Acknowledgements” ở cuối trang liên kết cũng cho thấy điều đó. Markdown ngay từ đầu đã được định hướng là một cú pháp markup cho web CMS, và nói nó là một biểu diễn gọn nhẹ của HTML là đúng. Trọng tâm là khiến mọi phần của cú pháp tạo ra HTML tương ứng trực tiếp
Việc nó lấy cảm hứng từ quy ước email không làm cho câu “Markdown là một biểu diễn gọn nhẹ của HTML” kém đúng hơn
Có quy tắc là hãy trả lời theo cách diễn giải hợp lý và mạnh nhất về điều đối phương nói, thay vì bám vào cách hiểu yếu hơn chỉ vì dễ công kích. Cũng có quy tắc là đừng chỉ chọn câu khiêu khích nhất trong bài để phàn nàn, mà hãy phản hồi phần thú vị: https://news.ycombinator.com/newsguidelines.html
Nếu không đồng ý với luận điểm chính của bài, cứ nói rằng bạn thích Markdown hơn rST và giải thích vì sao. Cãi nhau chỉ vì đúng một câu về việc Markdown chính xác là gì thì thật ngớ ngẩn
Nó đúng là lấy cảm hứng từ các quy ước như email hay Usenet, và một số trong đó còn có trước cả máy tính. Ví dụ, tôi nghĩ mình từng thấy tài liệu đánh máy cũ dùng dấu sao như chữ nghiêng. Nhưng Markdown gắn rất chặt với HTML, cú pháp của nó cũng bị ràng buộc mạnh bởi HTML, và những nỗ lực tách nó khỏi HTML phần lớn khó tránh khỏi thất bại
Tôi cho rằng điểm cốt lõi của Markdown là làm những việc đơn giản nhanh hơn so với HTML thô, nhưng vẫn cho phép trộn HTML thô vào khi cần
Trong các dự án mà tôi cần sức mạnh của RST hơn Markdown, tôi lại thấy viết HTML trực tiếp còn tiện hơn
Khi xây dựng một hệ thống tài liệu có độ phức tạp tương tự, tôi đã xem xét RST vì rất cần một loại markup có ngữ nghĩa rõ ràng, kiểu như lưu cấu trúc của file RST trong cơ sở dữ liệu rồi trộn kết quả từ cơ sở dữ liệu vào nội dung
Tôi gặp hai vấn đề. Thứ nhất, công cụ RST không có unparser để xuất lại RST. Tôi muốn tự động tạo file RST bằng cách hợp nhất nhiều file RST và các nguồn khác, rồi thao tác chúng như một API tài liệu, nhưng nó không hỗ trợ. Thứ hai, công cụ RST kỳ vọng một tập hợp block được định nghĩa cho từng tài liệu cụ thể. Nếu block được biểu diễn theo cách tổng quát, lẽ ra có thể có công cụ chuyển đổi tài liệu ngay cả khi không biết định nghĩa block nội bộ, nhưng thực tế không phải vậy. Đây là vấn đề của công cụ hơn là của chính RST, nhưng mỗi lần phải đào code xuống tận đáy thì tôi lại nghĩ đến các hệ thống markup khác như loại dựa trên HTML
Ưu điểm của cách này là có thể kiểm soát hoàn toàn schema đầu vào và đầu ra, còn nhược điểm là cú pháp ồn ào hơn Markdown hay RST rất nhiều, đồng thời cần script để parse và chuyển đổi sang định dạng đầu ra mong muốn
Toàn bộ mục đích của docutils là parse định dạng và chuyển nó thành API: https://www.docutils.org/docs/index.html#api-reference-material-for-client-developers
Vài năm trước tôi từng tổng hợp một tập con của reStructuredText đủ đáng để ghi nhớ: https://simonwillison.net/2018/Aug/25/restructuredtext/
Trong các dự án gần đây, tôi đã bắt đầu dùng MyST; nó cung cấp các tính năng tham chiếu và mục lục mà tôi coi trọng ở reStructuredText, đồng thời cho phép dùng cú pháp Markdown dễ viết hơn đối với người đóng góp
Thứ thực sự thay đổi cuộc chơi là rST+Sphinx với các chỉ thị
:ref:,:doc:cho liên kết nội bộ. Khi tham chiếu anchor hoặc liên kết tài liệu trong cùng nội dung, bạn không cần tự gõ tiêu đề, và có thể tránh việc các tiêu đề gõ tay đó dần trở nên lỗi thời: https://www.sphinx-doc.org/en/master/usage/referencing.html#ref-roleĐây là một trong những tính năng tôi nhớ nhất khi không viết bằng rST
Không phải để chen ngang cuộc thảo luận về ReStructuredText, nhưng nếu đang tìm một ngôn ngữ đánh dấu cho nhiều thứ hơn Markdown, tôi muốn khuyên nên xem AsciiDoc thay vì ReStructuredText. Tôi đã viết tài liệu kỹ thuật nhiều năm bằng cả ba loại, và thấy AsciiDoc tốt hơn ReStructuredText lẫn Markdown
Ví dụ, hỗ trợ bảng của Markdown và ReStructuredText đều rất phiền toái. Định dạng bảng của AsciiDoc dễ đọc, dễ viết và dễ bảo trì; còn mạnh hơn nhờ hỗ trợ header, caption, kích thước tùy chỉnh cho bảng và hàng, cũng như định dạng phức tạp bên trong bảng. Nó có một chuẩn duy nhất, không có nhiều phương ngữ như Markdown; cú pháp ngắn gọn, dễ đọc và đường cong học tập nhẹ hơn ReStructuredText. Các lựa chọn để tạo kiểu đầu ra cũng tốt hơn, chuỗi công cụ vượt trội hơn, và các tính năng tài liệu tích hợp rất phong phú nên ít phải phụ thuộc vào plugin bên thứ ba. AsciiDoc được thiết kế cho tài liệu kỹ thuật ngay từ đầu, còn hai loại kia giống như được uốn cho hợp với vai trò đó hơn
Khi trình bày đẹp một tài liệu Markdown cỡ 5~10 trang, rồi để chính nó được render bên trong các template Jinja năng động hơn, thì khởi đầu khá ổn. Cũng có quy trình build cho tài liệu tự động, và quy mô đã lớn hơn một README GitHub đơn lẻ. Nhưng từ đó trở đi là bắt đầu đau đầu
Tài liệu trên trang dự án GitHub thì không thật sự khớp, không rõ có cần file
.nojekylhay không,gh-pagesbranch còn cần nữa không, cũng chẳng biết là cấu hình kho chứa sai hay thay đổi chưa được phản ánh. Thử GitHub Actions một hồi vài tiếng là thấy vô lý. Xem lại Read the Docs thì có vẻ nó muốn Sphinx, thế là ghép Markdown với Sphinx; build thì được nhưng sau khi triển khai độ rộng trang lại hỏng, trong khi local không tái hiện được nên có vẻ là do quảng cáo chèn vào ở gói cộng đồng. Rất nhiều dự án chạy tốt với nó và bản thân tôi cũng từng làm được, nhưng cho đến khi nó thực sự chạy thì có quá nhiều chi tiết nhỏ nhặt đến mức khó tin. Cuối cùng, vấn đề không phải Markdown đối đầu RST, mà là tìm ra tổ hợp phù hợp cho dự án tài liệu quy mô vừa và hosting tĩnhHướng dẫn triển khai tự động cũng được viết đầy đủ: https://github.com/rust-lang/mdBook
Có vẻ mọi người đang bỏ qua việc tác giả đang nói trong bối cảnh tự dàn trang sách của chính mình. Đây không phải là lập luận rằng nhìn chung rST tốt hơn Markdown
Trong trường hợp phổ biến, sự đơn giản của Markdown là lý do nó được dùng rộng rãi, nhưng đối tượng mà tác giả đang nói đến không phải như vậy
Thật thú vị khi người ta phản ứng như thể reST được tạo ra để cạnh tranh với Markdown. Thực ra gần như ngược lại. reST là phiên bản phát triển của StructuredText từ năm 2002, còn Markdown được công bố lần đầu vào năm 2004
Mục tiêu của hai bên rất giống nhau, và với những văn bản cơ bản nhất thì cả hai đều có thể được đọc và viết như văn bản thuần. Khi ấy ai cũng muốn có thứ như vậy nên mới xuất hiện nhiều định dạng. Tôi không nghĩ Markdown thắng là vì nó “đơn giản hơn” hay “dễ đọc hơn”. Với những nội dung có thể biểu đạt dễ dàng bằng ASCII thuần và khoảng trắng, nhìn chung hai bên có thể thay thế cho nhau. Có ai sẽ nói tài liệu reST trong ví dụ là một đoạn khó hiểu đến mức không thể đọc nếu không có parser không? Tôi cũng không rõ một biến thể Markdown nào đó tốt hơn ở điểm nào; có lẽ chỉ là sự ngẫu nhiên của lịch sử khiến một bên chiếm ưu thế, còn cả hai đều đủ tốt cho mục tiêu cốt lõi
reST cung cấp nhiều tính năng định dạng bổ sung hữu ích khi cần, nhưng nếu không cần thì chúng lại là phần thừa. Tôi bắt đầu dùng GitHub-flavored Markdown khoảng năm 2010 khi đăng ký GitHub, và cũng đã vài lần dùng reStructuredText vì tài liệu Python. Loại sau có đường cong học tập cao hơn nhiều, và từ đó đến giờ tôi không có lý do gì để dùng lại
Dấu backtick kép cũng là một cú pháp gây khó chịu quá mức so với lượng thời gian thực sự phải bỏ ra