docbook 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +5 -0
  3. data/CLAUDE.md +19 -0
  4. data/CODE_OF_CONDUCT.md +10 -0
  5. data/README.adoc +335 -0
  6. data/Rakefile +12 -0
  7. data/docs/.lycheeignore +33 -0
  8. data/docs/Gemfile +10 -0
  9. data/docs/INDEX.adoc +67 -0
  10. data/docs/_config.yml +186 -0
  11. data/docs/advanced/element-classes.adoc +185 -0
  12. data/docs/advanced/frontend-customization.adoc +193 -0
  13. data/docs/advanced/index.adoc +14 -0
  14. data/docs/advanced/templates.adoc +123 -0
  15. data/docs/features/element-coverage.adoc +373 -0
  16. data/docs/features/html-output/data-model.adoc +285 -0
  17. data/docs/features/html-output/directory-mode.adoc +180 -0
  18. data/docs/features/html-output/index.adoc +90 -0
  19. data/docs/features/html-output/single-file-mode.adoc +125 -0
  20. data/docs/features/index-generation.adoc +197 -0
  21. data/docs/features/index.adoc +63 -0
  22. data/docs/features/numbering.adoc +183 -0
  23. data/docs/features/toc-generation.adoc +150 -0
  24. data/docs/features/xinclude/fragid-schemes.adoc +287 -0
  25. data/docs/features/xinclude/index.adoc +119 -0
  26. data/docs/features/xinclude/text-includes.adoc +123 -0
  27. data/docs/features/xinclude/xml-includes.adoc +167 -0
  28. data/docs/getting-started/index.adoc +50 -0
  29. data/docs/getting-started/installation.adoc +113 -0
  30. data/docs/getting-started/quick-start.adoc +161 -0
  31. data/docs/guides/converting-article.adoc +188 -0
  32. data/docs/guides/converting-book.adoc +192 -0
  33. data/docs/guides/index.adoc +12 -0
  34. data/docs/guides/roundtrip-testing.adoc +129 -0
  35. data/docs/interfaces/cli/format-command.adoc +109 -0
  36. data/docs/interfaces/cli/index.adoc +73 -0
  37. data/docs/interfaces/cli/roundtrip-command.adoc +125 -0
  38. data/docs/interfaces/cli/to-html-command.adoc +178 -0
  39. data/docs/interfaces/cli/validate-command.adoc +104 -0
  40. data/docs/interfaces/index.adoc +101 -0
  41. data/docs/interfaces/ruby-api/html-output.adoc +186 -0
  42. data/docs/interfaces/ruby-api/index.adoc +111 -0
  43. data/docs/interfaces/ruby-api/parsing.adoc +202 -0
  44. data/docs/interfaces/ruby-api/xinclude.adoc +162 -0
  45. data/docs/interfaces/ruby-api/xref-resolution.adoc +156 -0
  46. data/docs/lychee.toml +42 -0
  47. data/docs/reference/cli-options.adoc +155 -0
  48. data/docs/reference/content-block-types.adoc +243 -0
  49. data/docs/reference/glossary.adoc +119 -0
  50. data/docs/reference/index.adoc +12 -0
  51. data/docs/reference/supported-elements.adoc +749 -0
  52. data/docs/understanding/architecture.adoc +145 -0
  53. data/docs/understanding/content-pipeline.adoc +102 -0
  54. data/docs/understanding/data-models.adoc +156 -0
  55. data/docs/understanding/index.adoc +34 -0
  56. data/exe/docbook +7 -0
  57. data/frontend/dist/app.css +1 -0
  58. data/frontend/dist/app.iife.js +24 -0
  59. data/frontend/package-lock.json +1445 -0
  60. data/frontend/package.json +22 -0
  61. data/frontend/src/App.vue +230 -0
  62. data/frontend/src/app.ts +8 -0
  63. data/frontend/src/components/AppSidebar.vue +116 -0
  64. data/frontend/src/components/AppendixSection.vue +39 -0
  65. data/frontend/src/components/BlockRenderer.vue +358 -0
  66. data/frontend/src/components/ChapterSection.vue +32 -0
  67. data/frontend/src/components/ContentRenderer.vue +13 -0
  68. data/frontend/src/components/EbookContainer.vue +147 -0
  69. data/frontend/src/components/EbookTopBar.vue +116 -0
  70. data/frontend/src/components/PartSection.vue +44 -0
  71. data/frontend/src/components/ReferenceEntry.vue +80 -0
  72. data/frontend/src/components/SearchModal.vue +286 -0
  73. data/frontend/src/components/SectionContent.vue +31 -0
  74. data/frontend/src/components/SettingsPanel.vue +236 -0
  75. data/frontend/src/components/TocTreeItem.vue +135 -0
  76. data/frontend/src/composables/useEbookStore.ts +191 -0
  77. data/frontend/src/composables/useSearch.ts +249 -0
  78. data/frontend/src/env.d.ts +7 -0
  79. data/frontend/src/stores/documentStore.ts +221 -0
  80. data/frontend/src/stores/uiStore.ts +98 -0
  81. data/frontend/src/styles.css +253 -0
  82. data/frontend/tsconfig.json +24 -0
  83. data/frontend/tsconfig.node.json +11 -0
  84. data/frontend/vite.config.ts +30 -0
  85. data/lib/docbook/cli.rb +123 -0
  86. data/lib/docbook/document.rb +67 -0
  87. data/lib/docbook/elements/abbrev.rb +16 -0
  88. data/lib/docbook/elements/acknowledgements.rb +22 -0
  89. data/lib/docbook/elements/address.rb +18 -0
  90. data/lib/docbook/elements/alt.rb +16 -0
  91. data/lib/docbook/elements/annotation.rb +18 -0
  92. data/lib/docbook/elements/appendix.rb +34 -0
  93. data/lib/docbook/elements/article.rb +31 -0
  94. data/lib/docbook/elements/att.rb +15 -0
  95. data/lib/docbook/elements/attribution.rb +20 -0
  96. data/lib/docbook/elements/audioobject.rb +18 -0
  97. data/lib/docbook/elements/author.rb +18 -0
  98. data/lib/docbook/elements/bibliography.rb +24 -0
  99. data/lib/docbook/elements/bibliomixed.rb +40 -0
  100. data/lib/docbook/elements/biblioref.rb +20 -0
  101. data/lib/docbook/elements/blockquote.rb +26 -0
  102. data/lib/docbook/elements/book.rb +36 -0
  103. data/lib/docbook/elements/buildtarget.rb +16 -0
  104. data/lib/docbook/elements/callout.rb +22 -0
  105. data/lib/docbook/elements/calloutlist.rb +22 -0
  106. data/lib/docbook/elements/caution.rb +30 -0
  107. data/lib/docbook/elements/chapter.rb +62 -0
  108. data/lib/docbook/elements/citation.rb +16 -0
  109. data/lib/docbook/elements/citerefentry.rb +26 -0
  110. data/lib/docbook/elements/citetitle.rb +20 -0
  111. data/lib/docbook/elements/classname.rb +16 -0
  112. data/lib/docbook/elements/code.rb +16 -0
  113. data/lib/docbook/elements/colophon.rb +22 -0
  114. data/lib/docbook/elements/computeroutput.rb +18 -0
  115. data/lib/docbook/elements/copyright.rb +17 -0
  116. data/lib/docbook/elements/danger.rb +28 -0
  117. data/lib/docbook/elements/date.rb +16 -0
  118. data/lib/docbook/elements/dedication.rb +22 -0
  119. data/lib/docbook/elements/dir.rb +16 -0
  120. data/lib/docbook/elements/emphasis.rb +18 -0
  121. data/lib/docbook/elements/entry.rb +30 -0
  122. data/lib/docbook/elements/entrytbl.rb +22 -0
  123. data/lib/docbook/elements/equation.rb +26 -0
  124. data/lib/docbook/elements/example.rb +30 -0
  125. data/lib/docbook/elements/fieldsynopsis.rb +21 -0
  126. data/lib/docbook/elements/figure.rb +28 -0
  127. data/lib/docbook/elements/filename.rb +16 -0
  128. data/lib/docbook/elements/firstname.rb +16 -0
  129. data/lib/docbook/elements/firstterm.rb +18 -0
  130. data/lib/docbook/elements/footnote.rb +22 -0
  131. data/lib/docbook/elements/footnoteref.rb +21 -0
  132. data/lib/docbook/elements/foreignphrase.rb +18 -0
  133. data/lib/docbook/elements/formalpara.rb +20 -0
  134. data/lib/docbook/elements/function.rb +16 -0
  135. data/lib/docbook/elements/glossary.rb +24 -0
  136. data/lib/docbook/elements/glossdef.rb +18 -0
  137. data/lib/docbook/elements/glossentry.rb +26 -0
  138. data/lib/docbook/elements/glosssee.rb +18 -0
  139. data/lib/docbook/elements/glossseealso.rb +18 -0
  140. data/lib/docbook/elements/glossterm.rb +18 -0
  141. data/lib/docbook/elements/holder.rb +16 -0
  142. data/lib/docbook/elements/honorific.rb +16 -0
  143. data/lib/docbook/elements/imagedata.rb +29 -0
  144. data/lib/docbook/elements/imageobject.rb +22 -0
  145. data/lib/docbook/elements/important.rb +30 -0
  146. data/lib/docbook/elements/index.rb +26 -0
  147. data/lib/docbook/elements/indexdiv.rb +22 -0
  148. data/lib/docbook/elements/indexentry.rb +22 -0
  149. data/lib/docbook/elements/indexterm.rb +34 -0
  150. data/lib/docbook/elements/info.rb +25 -0
  151. data/lib/docbook/elements/informalexample.rb +24 -0
  152. data/lib/docbook/elements/informalfigure.rb +20 -0
  153. data/lib/docbook/elements/inlinemediaobject.rb +22 -0
  154. data/lib/docbook/elements/itemizedlist.rb +21 -0
  155. data/lib/docbook/elements/legalnotice.rb +22 -0
  156. data/lib/docbook/elements/link.rb +26 -0
  157. data/lib/docbook/elements/listitem.rb +32 -0
  158. data/lib/docbook/elements/literal.rb +16 -0
  159. data/lib/docbook/elements/literallayout.rb +22 -0
  160. data/lib/docbook/elements/mediaobject.rb +26 -0
  161. data/lib/docbook/elements/msg.rb +20 -0
  162. data/lib/docbook/elements/msgexplan.rb +22 -0
  163. data/lib/docbook/elements/msgset.rb +22 -0
  164. data/lib/docbook/elements/note.rb +30 -0
  165. data/lib/docbook/elements/orderedlist.rb +23 -0
  166. data/lib/docbook/elements/orgname.rb +16 -0
  167. data/lib/docbook/elements/para.rb +61 -0
  168. data/lib/docbook/elements/paragraph_like.rb +18 -0
  169. data/lib/docbook/elements/parameter.rb +16 -0
  170. data/lib/docbook/elements/part.rb +38 -0
  171. data/lib/docbook/elements/personname.rb +22 -0
  172. data/lib/docbook/elements/phrase.rb +20 -0
  173. data/lib/docbook/elements/preface.rb +58 -0
  174. data/lib/docbook/elements/primary.rb +16 -0
  175. data/lib/docbook/elements/procedure.rb +24 -0
  176. data/lib/docbook/elements/productname.rb +18 -0
  177. data/lib/docbook/elements/productnumber.rb +16 -0
  178. data/lib/docbook/elements/programlisting.rb +28 -0
  179. data/lib/docbook/elements/property.rb +16 -0
  180. data/lib/docbook/elements/pubdate.rb +16 -0
  181. data/lib/docbook/elements/publishername.rb +16 -0
  182. data/lib/docbook/elements/quotation.rb +24 -0
  183. data/lib/docbook/elements/quote.rb +18 -0
  184. data/lib/docbook/elements/refentry.rb +32 -0
  185. data/lib/docbook/elements/refentrytitle.rb +16 -0
  186. data/lib/docbook/elements/reference.rb +26 -0
  187. data/lib/docbook/elements/refmeta.rb +29 -0
  188. data/lib/docbook/elements/refmiscinfo.rb +16 -0
  189. data/lib/docbook/elements/refname.rb +16 -0
  190. data/lib/docbook/elements/refnamediv.rb +22 -0
  191. data/lib/docbook/elements/refpurpose.rb +16 -0
  192. data/lib/docbook/elements/refsect1.rb +22 -0
  193. data/lib/docbook/elements/refsect2.rb +22 -0
  194. data/lib/docbook/elements/refsect3.rb +22 -0
  195. data/lib/docbook/elements/refsection.rb +32 -0
  196. data/lib/docbook/elements/releaseinfo.rb +16 -0
  197. data/lib/docbook/elements/remark.rb +20 -0
  198. data/lib/docbook/elements/replaceable.rb +16 -0
  199. data/lib/docbook/elements/row.rb +15 -0
  200. data/lib/docbook/elements/screen.rb +28 -0
  201. data/lib/docbook/elements/secondary.rb +16 -0
  202. data/lib/docbook/elements/sect1.rb +26 -0
  203. data/lib/docbook/elements/sect2.rb +24 -0
  204. data/lib/docbook/elements/sect3.rb +24 -0
  205. data/lib/docbook/elements/sect4.rb +24 -0
  206. data/lib/docbook/elements/sect5.rb +22 -0
  207. data/lib/docbook/elements/section.rb +66 -0
  208. data/lib/docbook/elements/see.rb +16 -0
  209. data/lib/docbook/elements/seealso.rb +18 -0
  210. data/lib/docbook/elements/set.rb +26 -0
  211. data/lib/docbook/elements/setindex.rb +24 -0
  212. data/lib/docbook/elements/sidebar.rb +22 -0
  213. data/lib/docbook/elements/simplesect.rb +32 -0
  214. data/lib/docbook/elements/step.rb +26 -0
  215. data/lib/docbook/elements/substeps.rb +18 -0
  216. data/lib/docbook/elements/subtitle.rb +16 -0
  217. data/lib/docbook/elements/surname.rb +16 -0
  218. data/lib/docbook/elements/table.rb +24 -0
  219. data/lib/docbook/elements/tag.rb +20 -0
  220. data/lib/docbook/elements/tbody.rb +15 -0
  221. data/lib/docbook/elements/term.rb +37 -0
  222. data/lib/docbook/elements/tertiary.rb +16 -0
  223. data/lib/docbook/elements/textobject.rb +18 -0
  224. data/lib/docbook/elements/tfoot.rb +15 -0
  225. data/lib/docbook/elements/tgroup.rb +21 -0
  226. data/lib/docbook/elements/thead.rb +15 -0
  227. data/lib/docbook/elements/tip.rb +30 -0
  228. data/lib/docbook/elements/title.rb +16 -0
  229. data/lib/docbook/elements/toc.rb +24 -0
  230. data/lib/docbook/elements/tocdiv.rb +22 -0
  231. data/lib/docbook/elements/tocentry.rb +20 -0
  232. data/lib/docbook/elements/topic.rb +26 -0
  233. data/lib/docbook/elements/type.rb +16 -0
  234. data/lib/docbook/elements/uri.rb +16 -0
  235. data/lib/docbook/elements/userinput.rb +18 -0
  236. data/lib/docbook/elements/variable.rb +16 -0
  237. data/lib/docbook/elements/variablelist.rb +19 -0
  238. data/lib/docbook/elements/varlistentry.rb +17 -0
  239. data/lib/docbook/elements/version.rb +16 -0
  240. data/lib/docbook/elements/videoobject.rb +18 -0
  241. data/lib/docbook/elements/warning.rb +30 -0
  242. data/lib/docbook/elements/xref.rb +18 -0
  243. data/lib/docbook/elements/year.rb +16 -0
  244. data/lib/docbook/elements.rb +204 -0
  245. data/lib/docbook/models/document_metadata.rb +30 -0
  246. data/lib/docbook/models/document_root.rb +33 -0
  247. data/lib/docbook/models/index_entry.rb +28 -0
  248. data/lib/docbook/models/reading_position.rb +22 -0
  249. data/lib/docbook/models/section_number.rb +18 -0
  250. data/lib/docbook/models/section_root.rb +29 -0
  251. data/lib/docbook/models/toc_node.rb +24 -0
  252. data/lib/docbook/models.rb +16 -0
  253. data/lib/docbook/output/data.rb +196 -0
  254. data/lib/docbook/output/html.rb +1450 -0
  255. data/lib/docbook/output/index_generator.rb +281 -0
  256. data/lib/docbook/output.rb +8 -0
  257. data/lib/docbook/services/document_builder.rb +258 -0
  258. data/lib/docbook/services/element_to_hash.rb +287 -0
  259. data/lib/docbook/services/index_generator.rb +134 -0
  260. data/lib/docbook/services/numbering_service.rb +186 -0
  261. data/lib/docbook/services/toc_generator.rb +138 -0
  262. data/lib/docbook/services.rb +14 -0
  263. data/lib/docbook/templates/document.html.liquid +20 -0
  264. data/lib/docbook/templates/partials/_head.liquid +39 -0
  265. data/lib/docbook/templates/partials/_scripts.liquid +10 -0
  266. data/lib/docbook/version.rb +5 -0
  267. data/lib/docbook/xinclude_resolver.rb +217 -0
  268. data/lib/docbook/xref_resolver.rb +78 -0
  269. data/lib/docbook.rb +17 -0
  270. data/sig/docbook.rbs +4 -0
  271. metadata +385 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a64ef89c39e9981b971c18bca30eda85a2ab034f3c5a176d32ae55fc6c311c09
4
+ data.tar.gz: '0931c9d12ced953ea69c9538af2a9c3f320d2ee9135c3d9247b4a0b1bca1786f'
5
+ SHA512:
6
+ metadata.gz: 04e31fbc21354f7aa37acc67c08d3d6c107916ea255bc90c015d8316624a3c2eb65ca2f64aba6cf12ab78a1dc85ea5ddad0394b42339458cc7939b912ae9fc09
7
+ data.tar.gz: f0524cb42079fa8909d25a75358658a6e1528a280f95ec426617b9da9441c959976ca776fc267ff86aa66aaa309c2c27db77874acef39b3c2eb4455a0139c9b2
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ ## [Unreleased]
2
+
3
+ ## [0.1.0] - 2026-04-05
4
+
5
+ - Initial release
data/CLAUDE.md ADDED
@@ -0,0 +1,19 @@
1
+ # CLAUDE.md
2
+
3
+ ## Critical Rules
4
+
5
+ ### NEVER HANDLE RAW XML ELEMENTS
6
+ You MUST NOT handle raw XML elements (such as those from Nokogiri) in HTML processing code. Any violation will be considered a serious error.
7
+
8
+ **Rule:** All HTML generation must go through the Docbook model classes only. If the Docbook models are insufficient, they MUST be improved to support the required functionality.
9
+
10
+ **Why:** Handling raw XML bypasses the abstraction layer and creates brittle, non-portable code that doesn't work with the established model infrastructure.
11
+
12
+ **How to apply:** When processing XML content for HTML output, always use the Lutaml::Model-based Docbook element classes (in `lib/docbook/elements/`). If an element type is not supported in the models, add it to the appropriate element class rather than processing raw XML nodes.
13
+
14
+ ### Examples
15
+ - **WRONG:** `node.xpath('...')` or `Nokogiri::XML::Node` manipulation in HTML generation
16
+ - **RIGHT:** Use element classes like `Docbook::Elements::InformalFigure`, `Docbook::Elements::MediaObject`, etc.
17
+
18
+ ### Image Path Resolution
19
+ Image paths should be resolved using the Docbook element's xml:base when available, per the Docbook spec. The `process_image` method in Html class handles this by searching parent paths as a fallback when xml:base is not preserved by the parser.
@@ -0,0 +1,10 @@
1
+ # Code of Conduct
2
+
3
+ "docbook" follows [The Ruby Community Conduct Guideline](https://www.ruby-lang.org/en/conduct) in all "collaborative space", which is defined as community communications channels (such as mailing lists, submitted patches, commit comments, etc.):
4
+
5
+ * Participants will be tolerant of opposing views.
6
+ * Participants must ensure that their language and actions are free of personal attacks and disparaging personal remarks.
7
+ * When interpreting the words and actions of others, participants should always assume good intentions.
8
+ * Behaviour which can be reasonably considered harassment will not be tolerated.
9
+
10
+ If you have any concerns about behaviour within this project, please contact us at ["ronald.tse@ribose.com"](mailto:"ronald.tse@ribose.com").
data/README.adoc ADDED
@@ -0,0 +1,335 @@
1
+ = DocBook
2
+ :toc:
3
+ :toclevels: 2
4
+
5
+ == Purpose
6
+
7
+ DocBook is a Ruby gem for parsing, transforming, and generating HTML from
8
+ DocBook 5 XML documents. It provides a complete toolkit for working with
9
+ DocBook documents including XInclude resolution, validation, formatting, and
10
+ high-quality HTML output.
11
+
12
+ Key features:
13
+
14
+ * **DocBook XML Parsing**: Full support for DocBook 5 elements via lutaml-model
15
+ * **XInclude Resolution**: Resolve XInclude references in DocBook documents
16
+ * **HTML Output**: Generate professional HTML documentation with Vue 3 SPA
17
+ * **CLI Tools**: Format, validate, and convert DocBook documents
18
+
19
+ == Installation
20
+
21
+ Add to your application Gemfile:
22
+
23
+ [source,ruby]
24
+ ----
25
+ gem 'docbook'
26
+ ----
27
+
28
+ Then execute:
29
+
30
+ [source,bash]
31
+ ----
32
+ $ bundle install
33
+ ----
34
+
35
+ Or install directly:
36
+
37
+ [source,bash]
38
+ ----
39
+ $ gem install docbook
40
+ ----
41
+
42
+ == Quick start
43
+
44
+ === Convert DocBook XML to HTML
45
+
46
+ [source,bash]
47
+ ----
48
+ $ docbook to-html input.xml -o output.html
49
+ ----
50
+
51
+ === With XInclude resolution
52
+
53
+ [source,bash]
54
+ ----
55
+ $ docbook to-html --xinclude input.xml -o output.html
56
+ ----
57
+
58
+ === Format DocBook XML
59
+
60
+ [source,bash]
61
+ ----
62
+ $ docbook format input.xml -o output.xml
63
+ ----
64
+
65
+ === Validate DocBook XML
66
+
67
+ [source,bash]
68
+ ----
69
+ $ docbook validate input.xml
70
+ input.xml: valid
71
+ ----
72
+
73
+ === Ruby API
74
+
75
+ [source,ruby]
76
+ ----
77
+ require 'docbook'
78
+
79
+ # Parse a DocBook document
80
+ article = Docbook::Elements::Article.from_xml(File.read('input.xml'))
81
+
82
+ # Convert to HTML
83
+ html_output = Docbook::Output::Html.new(article).to_html
84
+
85
+ # Write to file
86
+ File.write('output.html', html_output)
87
+ ----
88
+
89
+ == CLI Commands
90
+
91
+ === to-html
92
+
93
+ Convert DocBook XML to HTML with Vue 3 SPA output.
94
+
95
+ [source,bash]
96
+ ----
97
+ # Basic usage
98
+ $ docbook to-html INPUT -o OUTPUT
99
+
100
+ # With XInclude resolution
101
+ $ docbook to-html --xinclude INPUT -o OUTPUT
102
+
103
+ # Output to stdout
104
+ $ docbook to-html INPUT
105
+ ----
106
+
107
+ Options:
108
+
109
+ * `-o, --output FILE`: Output file (default: stdout)
110
+ * `--xinclude`: Resolve XIncludes before processing
111
+
112
+ === format
113
+
114
+ Format/prettify DocBook XML documents.
115
+
116
+ [source,bash]
117
+ ----
118
+ # Basic usage
119
+ $ docbook format INPUT -o OUTPUT
120
+
121
+ # With XInclude resolution
122
+ $ docbook format --xinclude INPUT -o OUTPUT
123
+ ----
124
+
125
+ Options:
126
+
127
+ * `-o, --output FILE`: Output file (default: stdout)
128
+ * `--xinclude`: Resolve XIncludes before processing
129
+
130
+ === validate
131
+
132
+ Validate DocBook XML for well-formedness.
133
+
134
+ [source,bash]
135
+ ----
136
+ $ docbook validate input.xml
137
+ input.xml: valid
138
+ ----
139
+
140
+ Returns exit code 0 if valid, exit code 1 with error messages if invalid.
141
+
142
+ === roundtrip
143
+
144
+ Round-trip test DocBook XML files (parse and re-serialize).
145
+
146
+ [source,bash]
147
+ ----
148
+ $ docbook roundtrip input1.xml input2.xml
149
+ input1.xml: OK
150
+ input2.xml: OK
151
+ 2 files, 0 failures
152
+ ----
153
+
154
+ == HTML Output Features
155
+
156
+ The HTML output is a self-contained Vue 3 SPA that works with `file://` protocol
157
+ (no server required).
158
+
159
+ === Vue 3 SPA
160
+
161
+ * **Pre-compiled Vue 3**: No build step required at runtime
162
+ * **FlexSearch**: Full-text search across all headings
163
+ * **Collapsible TOC**: Hierarchical table of contents with expand/collapse
164
+ * **Keyboard navigation**: Press `/` to search, `Esc` to close
165
+
166
+ === Theme Support
167
+
168
+ * **Dark mode**: Toggle between light, dark, and system preference
169
+ * **Font selection**: Sans-serif (Inter) and serif (Merriweather) options
170
+ * **Persistent settings**: Theme and font preferences saved to localStorage
171
+
172
+ === Document Structure
173
+
174
+ * **Chapter numbering**: Roman numerals for chapters (I, II, III...)
175
+ * **Appendix numbering**: "Appendix A", "Appendix B", etc.
176
+ * **Section numbering**: Dot notation (1.1, 1.2, 2.1...)
177
+ * **Part organization**: Parts contain chapters, appendices, and references
178
+
179
+ === Content Types
180
+
181
+ The HTML output supports rendering of:
182
+
183
+ * Paragraphs and formal paragraphs
184
+ * Ordered and unordered lists
185
+ * Variable lists
186
+ * Figures and media objects
187
+ * Tables with headers and footers
188
+ * Code blocks with syntax highlighting
189
+ * Block quotations
190
+ * Admonitions (note, warning, caution, important, tip, danger)
191
+ * Bibliography and glossary
192
+ * Procedure steps
193
+ * Sidebars
194
+
195
+ == Ruby API
196
+
197
+ === Parsing DocBook Documents
198
+
199
+ [source,ruby]
200
+ ----
201
+ require 'docbook'
202
+
203
+ # Parse from file
204
+ article = Docbook::Elements::Article.from_xml(File.read('article.xml'))
205
+
206
+ # Parse book with parts
207
+ book = Docbook::Elements::Book.from_xml(File.read('book.xml'))
208
+
209
+ # Parse with XInclude resolution
210
+ xml_string = File.read('main.xml')
211
+ resolved = Docbook::XIncludeResolver.resolve_string(xml_string, base_path: 'main.xml')
212
+ docbook_doc = Docbook::Document.from_xml(resolved.to_xml)
213
+ ----
214
+
215
+ === Document Types
216
+
217
+ The gem automatically detects and parses:
218
+
219
+ * `article` - Article documents
220
+ * `book` - Book documents with parts, chapters, appendices
221
+ * `chapter` - Chapter documents
222
+ * `section` - Section documents
223
+ * `refentry` - Reference manual pages
224
+
225
+ === HTML Output
226
+
227
+ [source,ruby]
228
+ ----
229
+ require 'docbook'
230
+
231
+ # Create HTML output
232
+ article = Docbook::Elements::Article.from_xml(File.read('input.xml'))
233
+ html_output = Docbook::Output::Html.new(article).to_html
234
+
235
+ # Write to file
236
+ File.write('output.html', html_output)
237
+ ----
238
+
239
+ === Document Model
240
+
241
+ Access document structure through the element model:
242
+
243
+ [source,ruby]
244
+ ----
245
+ book = Docbook::Elements::Book.from_xml(File.read('book.xml'))
246
+
247
+ # Access book elements
248
+ book.info.title.content # Book title
249
+ book.part # Array of parts
250
+ book.chapter # Array of top-level chapters
251
+ book.appendix # Array of appendices
252
+ book.glossary # Array of glossaries
253
+ book.bibliography # Array of bibliographies
254
+
255
+ # Access part contents
256
+ book.part.each do |part|
257
+ puts part.title.content
258
+ part.chapter.each do |chapter|
259
+ puts " #{chapter.title.content}"
260
+ end
261
+ end
262
+ ----
263
+
264
+ == Building the Vue Frontend
265
+
266
+ The HTML output uses a pre-compiled Vue 3 frontend. To rebuild after
267
+ frontend changes:
268
+
269
+ [source,bash]
270
+ ----
271
+ cd frontend
272
+ npm install
273
+ npm run build
274
+ ----
275
+
276
+ This generates the Vue bundle in `lib/docbook/frontend/dist/`.
277
+
278
+ The bundle is automatically included when generating HTML output through the Ruby API.
279
+
280
+ == Development
281
+
282
+ After checking out the repo, run `bin/setup` to install dependencies:
283
+
284
+ [source,bash]
285
+ ----
286
+ bin/setup
287
+ ----
288
+
289
+ Run the test suite:
290
+
291
+ [source,bash]
292
+ ----
293
+ bundle exec rake spec
294
+ ----
295
+
296
+ Run specific test files:
297
+
298
+ [source,bash]
299
+ ----
300
+ bundle exec rspec spec/output/html_spec.rb
301
+ bundle exec rspec spec/cli_spec.rb
302
+ ----
303
+
304
+ == Architecture
305
+
306
+ The gem follows a modular architecture:
307
+
308
+ * **Parser**: Uses lutaml-model for DocBook element mapping
309
+ * **XInclude Resolver**: Nokogiri-based XInclude processing
310
+ * **HTML Generator**: Ruby-based HTML transformation with Vue 3 SPA
311
+ * **CLI**: Thor-based command-line interface
312
+
313
+ === Element Classes
314
+
315
+ The gem defines element classes for all major DocBook 5 elements:
316
+
317
+ * **Structural**: article, book, chapter, part, section, appendix, preface
318
+ * **Block**: para, formalpara, blockquote, literallayout
319
+ * **Lists**: orderedlist, itemizedlist, variablelist
320
+ * **Links**: link, xref, uri
321
+ * **Inline**: emphasis, code, literal, filename, classname, function
322
+ * **Media**: mediaobject, figure, table
323
+ * **Admonitions**: note, warning, caution, important, tip, danger
324
+ * **Bibliography**: bibliography, bibliomixed
325
+ * **Glossary**: glossary, glossentry
326
+ * **Metadata**: info, title, author, copyright
327
+
328
+ == Contributing
329
+
330
+ Bug reports and pull requests are welcome on GitHub at
331
+ https://github.com/metanorma/metanorma-docbook.
332
+
333
+ == License
334
+
335
+ Copyright Ribose. https://opensource.org/licenses/MIT[MIT License].
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ require "rubocop/rake_task"
9
+
10
+ RuboCop::RakeTask.new
11
+
12
+ task default: %i[spec rubocop]
@@ -0,0 +1,33 @@
1
+ # Lychee ignore patterns
2
+ # These link types are valid but lychee can't verify them
3
+
4
+ # Ignore .adoc source files
5
+ \.adoc$
6
+
7
+ # Ignore .html files with inconsistent paths
8
+ \.html$
9
+
10
+ # Ignore file:// URLs
11
+ file://
12
+
13
+ # Ignore directory links
14
+ file://.*/docbook/$
15
+ file://.*/docbook/.*/$
16
+ file://.*/docs/$
17
+ file://.*/docs/.*/$
18
+
19
+ # Ignore example domain links
20
+ http://example\.com/.*
21
+ http://a\.com/.*
22
+ http://b\.com/.*
23
+
24
+ # Ignore GitHub-specific links
25
+ https://github\.com/[^/]+/[^/]+/edit/.*
26
+ https://github\.com/[^/]+/[^/]+/blob/.*
27
+
28
+ # Ignore mailto links
29
+ mailto:.*
30
+
31
+ # Ignore localhost
32
+ http://localhost:.*
33
+ http://127\.0\.0\.1:.*
data/docs/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "jekyll", "~> 4.3"
4
+ gem "jekyll-asciidoc"
5
+ gem "just-the-docs"
6
+
7
+ group :jekyll_plugins do
8
+ gem "jekyll-seo-tag"
9
+ gem "jekyll-sitemap"
10
+ end
data/docs/INDEX.adoc ADDED
@@ -0,0 +1,67 @@
1
+ ---
2
+ layout: default
3
+ title: Home
4
+ nav_order: 1
5
+ description: "Metanorma DocBook: Parse, transform, and generate HTML from DocBook 5 XML"
6
+ permalink: /
7
+ ---
8
+ = Metanorma DocBook Documentation
9
+ :toc: macro
10
+ :toclevels: 2
11
+
12
+ [.lead]
13
+ Metanorma DocBook is a Ruby gem for parsing, accessing, and converting DocBook 5 XML documents to interactive HTML.
14
+
15
+ toc::[]
16
+
17
+ == Welcome
18
+
19
+ Metanorma DocBook helps you:
20
+
21
+ * **Parse** DocBook 5 XML into Ruby object models using 149 element classes
22
+ * **Convert** DocBook to self-contained HTML with a Vue 3 interactive reader
23
+ * **Resolve** XIncludes with text fragid extensions (`search=`, `line=`, `char=`)
24
+ * **Validate** and **format** DocBook XML from the command line
25
+
26
+ == Quick Navigation
27
+
28
+ === By Your Role
29
+
30
+ **Developer**::
31
+ Start with link:getting-started/ruby-api/[Ruby API] to integrate DocBook parsing into your applications.
32
+
33
+ **Technical Writer**::
34
+ Start with link:guides/converting-book/[Converting a Book] to convert DocBook documents to HTML.
35
+
36
+ **DevOps**::
37
+ Start with link:interfaces/cli/[CLI Reference] for command-line usage in pipelines.
38
+
39
+ === By Task
40
+
41
+ **Convert DocBook to HTML**::
42
+ link:getting-started/quick-start/#to-html[Quick Start: to-html] | link:interfaces/cli/to-html-command[CLI: to-html] | link:interfaces/ruby-api/html-output[Ruby API: HTML Output]
43
+
44
+ **Resolve XIncludes**::
45
+ link:features/xinclude/text-includes[Text Includes] | link:features/xinclude/fragid-schemes[fragid Schemes] | link:interfaces/ruby-api/xinclude[Ruby API]
46
+
47
+ **Format and validate XML**::
48
+ link:interfaces/cli/format-command[format] | link:interfaces/cli/validate-command[validate]
49
+
50
+ === By Document Type
51
+
52
+ link:guides/converting-book[**Book**]:: Multi-part books with chapters, appendices, glossary, and index
53
+ link:guides/converting-article[**Article**]:: Standalone articles with sections
54
+ link:reference/supported-elements[**Reference pages**]:: RefEntry manual pages
55
+
56
+ == Learning Path
57
+
58
+ . *Get Started (5 minutes)* -- link:getting-started/installation[Install] and link:getting-started/quick-start[try basic commands]
59
+ . *Learn Interfaces (15 minutes)* -- link:interfaces/cli/[CLI] or link:interfaces/ruby-api/[Ruby API]
60
+ . *Explore Features (30 minutes)* -- link:features/html-output/[HTML output], link:features/xinclude/[XInclude], link:features/numbering[Numbering]
61
+ . *Understand Internals (as needed)* -- link:understanding/architecture[Architecture], link:understanding/data-models[Data Models]
62
+
63
+ == Getting Help
64
+
65
+ **Found a bug?**:: link:https://github.com/metanorma/docbook/issues[Report an issue on GitHub]
66
+
67
+ **Have a question?**:: Check link:reference/glossary[Glossary] or search this documentation
data/docs/_config.yml ADDED
@@ -0,0 +1,186 @@
1
+ # Jekyll configuration for Metanorma DocBook documentation
2
+ # Uses Just the Docs theme - https://just-the-docs.com/
3
+
4
+ # Site settings
5
+ title: Metanorma DocBook Documentation
6
+ description: Parse, transform, and generate HTML from DocBook 5 XML documents
7
+ url: https://www.metanorma.org
8
+ baseurl: /docbook
9
+
10
+ # Repository
11
+ repository: metanorma/docbook
12
+
13
+ # Theme
14
+ theme: just-the-docs
15
+ remote_theme: just-the-docs/just-the-docs@v0.7.0
16
+ color_scheme: light
17
+
18
+ # AsciiDoc support
19
+ asciidoc: {}
20
+ asciidoctor:
21
+ attributes:
22
+ idprefix: ''
23
+ idseparator: '-'
24
+ source-highlighter: rouge
25
+ icons: font
26
+ experimental: true
27
+ sectanchors: true
28
+ linkattrs: true
29
+ sectnums: true
30
+ toc: left
31
+ toclevels: 3
32
+
33
+ # Search configuration
34
+ search_enabled: true
35
+ search:
36
+ heading_level: 3
37
+ previews: 3
38
+ preview_words_before: 5
39
+ preview_words_after: 10
40
+ tokenizer_separator: /[\s/]+/
41
+ rel_url: true
42
+ button: true
43
+
44
+ # Navigation
45
+ nav_sort: case_insensitive
46
+ nav_fold: true
47
+
48
+ # External links
49
+ aux_links:
50
+ "Source":
51
+ - "https://github.com/metanorma/docbook"
52
+ "Report Issues":
53
+ - "https://github.com/metanorma/docbook/issues"
54
+
55
+ aux_links_new_tab: true
56
+
57
+ # Back to top
58
+ back_to_top: true
59
+ back_to_top_text: "Back to top"
60
+
61
+ # Heading anchors
62
+ heading_anchors: true
63
+
64
+ # Footer
65
+ footer_content: 'Copyright &copy; 2025 Ribose. Distributed under the <a href="https://github.com/metanorma/docbook/blob/main/LICENSE.txt">BSD 2-Clause License</a>.'
66
+
67
+ # Footer last edit timestamp
68
+ last_edit_timestamp: true
69
+ last_edit_time_format: "%b %e %Y at %I:%M %p"
70
+
71
+ # Enable code copy button
72
+ enable_copy_code_button: true
73
+
74
+ # Callouts
75
+ callouts_level: quiet
76
+ callouts:
77
+ highlight:
78
+ color: yellow
79
+ important:
80
+ title: Important
81
+ color: blue
82
+ new:
83
+ title: New
84
+ color: green
85
+ note:
86
+ title: Note
87
+ color: purple
88
+ warning:
89
+ title: Warning
90
+ color: red
91
+
92
+ # Plugins
93
+ plugins:
94
+ - jekyll-asciidoc
95
+ - jekyll-seo-tag
96
+ - jekyll-sitemap
97
+
98
+ # Markdown settings (for any markdown files)
99
+ markdown: kramdown
100
+ kramdown:
101
+ input: GFM
102
+ hard_wrap: false
103
+ syntax_highlighter: rouge
104
+
105
+ # Collections for organizing content
106
+ collections:
107
+ getting-started:
108
+ permalink: "/:path/"
109
+ output: true
110
+
111
+ interfaces:
112
+ permalink: "/:collection/:path/"
113
+ output: true
114
+
115
+ features:
116
+ permalink: "/:collection/:path/"
117
+ output: true
118
+
119
+ understanding:
120
+ permalink: "/:collection/:path/"
121
+ output: true
122
+
123
+ advanced:
124
+ permalink: "/:collection/:path/"
125
+ output: true
126
+
127
+ guides:
128
+ permalink: "/:collection/:path/"
129
+ output: true
130
+
131
+ reference:
132
+ permalink: "/:collection/:path/"
133
+ output: true
134
+
135
+ # Just the Docs collection configuration
136
+ just_the_docs:
137
+ collections:
138
+ getting-started:
139
+ name: Getting Started
140
+ nav_fold: false
141
+ interfaces:
142
+ name: Interfaces
143
+ nav_fold: true
144
+ features:
145
+ name: Features
146
+ nav_fold: true
147
+ understanding:
148
+ name: Understanding
149
+ nav_fold: true
150
+ advanced:
151
+ name: Advanced
152
+ nav_fold: true
153
+ guides:
154
+ name: Guides
155
+ nav_fold: true
156
+ reference:
157
+ name: Reference
158
+ nav_fold: true
159
+
160
+ # Defaults
161
+ defaults:
162
+ - scope:
163
+ path: ""
164
+ type: getting-started
165
+ values:
166
+ layout: default
167
+
168
+ # Include additional files
169
+ include:
170
+ - "*.adoc"
171
+
172
+ # Exclude from processing
173
+ exclude:
174
+ - Gemfile
175
+ - Gemfile.lock
176
+ - node_modules
177
+ - vendor
178
+ - .sass-cache
179
+ - .jekyll-cache
180
+ - .bundle
181
+ - README.md
182
+ - LICENSE
183
+ - .git
184
+ - .gitignore
185
+
186
+ permalink: pretty