mordoc 0.1.1

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 (243) hide show
  1. package/README.md +240 -0
  2. package/bin/cli.js +81 -0
  3. package/dist/build/Builder.d.ts +91 -0
  4. package/dist/build/Builder.d.ts.map +1 -0
  5. package/dist/build/Builder.js +391 -0
  6. package/dist/build/Builder.js.map +1 -0
  7. package/dist/build/ClientBundler.d.ts +36 -0
  8. package/dist/build/ClientBundler.d.ts.map +1 -0
  9. package/dist/build/ClientBundler.js +132 -0
  10. package/dist/build/ClientBundler.js.map +1 -0
  11. package/dist/build/HtmlGenerator.d.ts +46 -0
  12. package/dist/build/HtmlGenerator.d.ts.map +1 -0
  13. package/dist/build/HtmlGenerator.js +200 -0
  14. package/dist/build/HtmlGenerator.js.map +1 -0
  15. package/dist/build/SearchIndexer.d.ts +31 -0
  16. package/dist/build/SearchIndexer.d.ts.map +1 -0
  17. package/dist/build/SearchIndexer.js +116 -0
  18. package/dist/build/SearchIndexer.js.map +1 -0
  19. package/dist/cli/build.d.ts +20 -0
  20. package/dist/cli/build.d.ts.map +1 -0
  21. package/dist/cli/build.js +111 -0
  22. package/dist/cli/build.js.map +1 -0
  23. package/dist/cli/create-app.d.ts +14 -0
  24. package/dist/cli/create-app.d.ts.map +1 -0
  25. package/dist/cli/create-app.js +216 -0
  26. package/dist/cli/create-app.js.map +1 -0
  27. package/dist/cli/dev.d.ts +20 -0
  28. package/dist/cli/dev.d.ts.map +1 -0
  29. package/dist/cli/dev.js +169 -0
  30. package/dist/cli/dev.js.map +1 -0
  31. package/dist/client/App.d.ts +17 -0
  32. package/dist/client/App.d.ts.map +1 -0
  33. package/dist/client/App.js +94 -0
  34. package/dist/client/App.js.map +1 -0
  35. package/dist/client/contexts/ConfigContext.d.ts +22 -0
  36. package/dist/client/contexts/ConfigContext.d.ts.map +1 -0
  37. package/dist/client/contexts/ConfigContext.js +27 -0
  38. package/dist/client/contexts/ConfigContext.js.map +1 -0
  39. package/dist/client/contexts/ContentContext.d.ts +31 -0
  40. package/dist/client/contexts/ContentContext.d.ts.map +1 -0
  41. package/dist/client/contexts/ContentContext.js +46 -0
  42. package/dist/client/contexts/ContentContext.js.map +1 -0
  43. package/dist/client/contexts/SearchContext.d.ts +38 -0
  44. package/dist/client/contexts/SearchContext.d.ts.map +1 -0
  45. package/dist/client/contexts/SearchContext.js +207 -0
  46. package/dist/client/contexts/SearchContext.js.map +1 -0
  47. package/dist/client/contexts/ThemeContext.d.ts +23 -0
  48. package/dist/client/contexts/ThemeContext.d.ts.map +1 -0
  49. package/dist/client/contexts/ThemeContext.js +62 -0
  50. package/dist/client/contexts/ThemeContext.js.map +1 -0
  51. package/dist/client/hooks/useContent.d.ts +12 -0
  52. package/dist/client/hooks/useContent.d.ts.map +1 -0
  53. package/dist/client/hooks/useContent.js +74 -0
  54. package/dist/client/hooks/useContent.js.map +1 -0
  55. package/dist/client/hooks/useNavigation.d.ts +15 -0
  56. package/dist/client/hooks/useNavigation.d.ts.map +1 -0
  57. package/dist/client/hooks/useNavigation.js +101 -0
  58. package/dist/client/hooks/useNavigation.js.map +1 -0
  59. package/dist/client/hooks/useSearch.d.ts +22 -0
  60. package/dist/client/hooks/useSearch.d.ts.map +1 -0
  61. package/dist/client/hooks/useSearch.js +64 -0
  62. package/dist/client/hooks/useSearch.js.map +1 -0
  63. package/dist/client/main.d.ts +5 -0
  64. package/dist/client/main.d.ts.map +1 -0
  65. package/dist/client/main.js +66 -0
  66. package/dist/client/main.js.map +1 -0
  67. package/dist/components/Callout.d.ts +9 -0
  68. package/dist/components/Callout.d.ts.map +1 -0
  69. package/dist/components/Callout.js +24 -0
  70. package/dist/components/Callout.js.map +1 -0
  71. package/dist/components/Card.d.ts +10 -0
  72. package/dist/components/Card.d.ts.map +1 -0
  73. package/dist/components/Card.js +15 -0
  74. package/dist/components/Card.js.map +1 -0
  75. package/dist/components/CardGrid.d.ts +8 -0
  76. package/dist/components/CardGrid.d.ts.map +1 -0
  77. package/dist/components/CardGrid.js +9 -0
  78. package/dist/components/CardGrid.js.map +1 -0
  79. package/dist/components/CodeBlock.d.ts +24 -0
  80. package/dist/components/CodeBlock.d.ts.map +1 -0
  81. package/dist/components/CodeBlock.js +76 -0
  82. package/dist/components/CodeBlock.js.map +1 -0
  83. package/dist/components/ContentPage.d.ts +9 -0
  84. package/dist/components/ContentPage.d.ts.map +1 -0
  85. package/dist/components/ContentPage.js +36 -0
  86. package/dist/components/ContentPage.js.map +1 -0
  87. package/dist/components/Header.d.ts +14 -0
  88. package/dist/components/Header.d.ts.map +1 -0
  89. package/dist/components/Header.js +30 -0
  90. package/dist/components/Header.js.map +1 -0
  91. package/dist/components/Heading.d.ts +16 -0
  92. package/dist/components/Heading.d.ts.map +1 -0
  93. package/dist/components/Heading.js +31 -0
  94. package/dist/components/Heading.js.map +1 -0
  95. package/dist/components/Image.d.ts +8 -0
  96. package/dist/components/Image.d.ts.map +1 -0
  97. package/dist/components/Image.js +24 -0
  98. package/dist/components/Image.js.map +1 -0
  99. package/dist/components/Layout.d.ts +14 -0
  100. package/dist/components/Layout.d.ts.map +1 -0
  101. package/dist/components/Layout.js +32 -0
  102. package/dist/components/Layout.js.map +1 -0
  103. package/dist/components/MarkdocRenderer.d.ts +15 -0
  104. package/dist/components/MarkdocRenderer.d.ts.map +1 -0
  105. package/dist/components/MarkdocRenderer.js +73 -0
  106. package/dist/components/MarkdocRenderer.js.map +1 -0
  107. package/dist/components/MobileMenu.d.ts +14 -0
  108. package/dist/components/MobileMenu.d.ts.map +1 -0
  109. package/dist/components/MobileMenu.js +45 -0
  110. package/dist/components/MobileMenu.js.map +1 -0
  111. package/dist/components/PageNavigation.d.ts +9 -0
  112. package/dist/components/PageNavigation.d.ts.map +1 -0
  113. package/dist/components/PageNavigation.js +23 -0
  114. package/dist/components/PageNavigation.js.map +1 -0
  115. package/dist/components/SearchModal.d.ts +9 -0
  116. package/dist/components/SearchModal.d.ts.map +1 -0
  117. package/dist/components/SearchModal.js +74 -0
  118. package/dist/components/SearchModal.js.map +1 -0
  119. package/dist/components/SideNav.d.ts +9 -0
  120. package/dist/components/SideNav.d.ts.map +1 -0
  121. package/dist/components/SideNav.js +66 -0
  122. package/dist/components/SideNav.js.map +1 -0
  123. package/dist/components/TableOfContents.d.ts +10 -0
  124. package/dist/components/TableOfContents.d.ts.map +1 -0
  125. package/dist/components/TableOfContents.js +151 -0
  126. package/dist/components/TableOfContents.js.map +1 -0
  127. package/dist/config/ConfigLoader.d.ts +50 -0
  128. package/dist/config/ConfigLoader.d.ts.map +1 -0
  129. package/dist/config/ConfigLoader.js +214 -0
  130. package/dist/config/ConfigLoader.js.map +1 -0
  131. package/dist/config/StyleCompiler.d.ts +17 -0
  132. package/dist/config/StyleCompiler.d.ts.map +1 -0
  133. package/dist/config/StyleCompiler.js +116 -0
  134. package/dist/config/StyleCompiler.js.map +1 -0
  135. package/dist/config/ThemeGenerator.d.ts +14 -0
  136. package/dist/config/ThemeGenerator.d.ts.map +1 -0
  137. package/dist/config/ThemeGenerator.js +129 -0
  138. package/dist/config/ThemeGenerator.js.map +1 -0
  139. package/dist/content/ContentLoader.d.ts +70 -0
  140. package/dist/content/ContentLoader.d.ts.map +1 -0
  141. package/dist/content/ContentLoader.js +146 -0
  142. package/dist/content/ContentLoader.js.map +1 -0
  143. package/dist/content/ContentProcessor.d.ts +84 -0
  144. package/dist/content/ContentProcessor.d.ts.map +1 -0
  145. package/dist/content/ContentProcessor.js +380 -0
  146. package/dist/content/ContentProcessor.js.map +1 -0
  147. package/dist/content/RouteManager.d.ts +69 -0
  148. package/dist/content/RouteManager.d.ts.map +1 -0
  149. package/dist/content/RouteManager.js +143 -0
  150. package/dist/content/RouteManager.js.map +1 -0
  151. package/dist/styles/components/callout.d.ts +11 -0
  152. package/dist/styles/components/callout.d.ts.map +1 -0
  153. package/dist/styles/components/callout.js +83 -0
  154. package/dist/styles/components/callout.js.map +1 -0
  155. package/dist/styles/components/card.d.ts +11 -0
  156. package/dist/styles/components/card.d.ts.map +1 -0
  157. package/dist/styles/components/card.js +179 -0
  158. package/dist/styles/components/card.js.map +1 -0
  159. package/dist/styles/components/codeblock.d.ts +11 -0
  160. package/dist/styles/components/codeblock.d.ts.map +1 -0
  161. package/dist/styles/components/codeblock.js +249 -0
  162. package/dist/styles/components/codeblock.js.map +1 -0
  163. package/dist/styles/components/content.d.ts +11 -0
  164. package/dist/styles/components/content.d.ts.map +1 -0
  165. package/dist/styles/components/content.js +198 -0
  166. package/dist/styles/components/content.js.map +1 -0
  167. package/dist/styles/components/fonts.d.ts +11 -0
  168. package/dist/styles/components/fonts.d.ts.map +1 -0
  169. package/dist/styles/components/fonts.js +34 -0
  170. package/dist/styles/components/fonts.js.map +1 -0
  171. package/dist/styles/components/header.d.ts +11 -0
  172. package/dist/styles/components/header.d.ts.map +1 -0
  173. package/dist/styles/components/header.js +293 -0
  174. package/dist/styles/components/header.js.map +1 -0
  175. package/dist/styles/components/heading.d.ts +11 -0
  176. package/dist/styles/components/heading.d.ts.map +1 -0
  177. package/dist/styles/components/heading.js +115 -0
  178. package/dist/styles/components/heading.js.map +1 -0
  179. package/dist/styles/components/layout.d.ts +11 -0
  180. package/dist/styles/components/layout.d.ts.map +1 -0
  181. package/dist/styles/components/layout.js +79 -0
  182. package/dist/styles/components/layout.js.map +1 -0
  183. package/dist/styles/components/mobilemenu.d.ts +11 -0
  184. package/dist/styles/components/mobilemenu.d.ts.map +1 -0
  185. package/dist/styles/components/mobilemenu.js +112 -0
  186. package/dist/styles/components/mobilemenu.js.map +1 -0
  187. package/dist/styles/components/reset.d.ts +11 -0
  188. package/dist/styles/components/reset.d.ts.map +1 -0
  189. package/dist/styles/components/reset.js +131 -0
  190. package/dist/styles/components/reset.js.map +1 -0
  191. package/dist/styles/components/searchmodal.d.ts +11 -0
  192. package/dist/styles/components/searchmodal.d.ts.map +1 -0
  193. package/dist/styles/components/searchmodal.js +333 -0
  194. package/dist/styles/components/searchmodal.js.map +1 -0
  195. package/dist/styles/components/sidenav.d.ts +11 -0
  196. package/dist/styles/components/sidenav.d.ts.map +1 -0
  197. package/dist/styles/components/sidenav.js +209 -0
  198. package/dist/styles/components/sidenav.js.map +1 -0
  199. package/dist/styles/components/toc.d.ts +11 -0
  200. package/dist/styles/components/toc.d.ts.map +1 -0
  201. package/dist/styles/components/toc.js +112 -0
  202. package/dist/styles/components/toc.js.map +1 -0
  203. package/dist/styles/components/typography.d.ts +11 -0
  204. package/dist/styles/components/typography.d.ts.map +1 -0
  205. package/dist/styles/components/typography.js +247 -0
  206. package/dist/styles/components/typography.js.map +1 -0
  207. package/dist/styles/components/utility.d.ts +11 -0
  208. package/dist/styles/components/utility.d.ts.map +1 -0
  209. package/dist/styles/components/utility.js +231 -0
  210. package/dist/styles/components/utility.js.map +1 -0
  211. package/dist/styles/types.d.ts +79 -0
  212. package/dist/styles/types.d.ts.map +1 -0
  213. package/dist/styles/types.js +7 -0
  214. package/dist/styles/types.js.map +1 -0
  215. package/dist/styles/utils.d.ts +21 -0
  216. package/dist/styles/utils.d.ts.map +1 -0
  217. package/dist/styles/utils.js +50 -0
  218. package/dist/styles/utils.js.map +1 -0
  219. package/dist/styles/variables/main.d.ts +15 -0
  220. package/dist/styles/variables/main.d.ts.map +1 -0
  221. package/dist/styles/variables/main.js +116 -0
  222. package/dist/styles/variables/main.js.map +1 -0
  223. package/dist/types/config.d.ts +43 -0
  224. package/dist/types/config.d.ts.map +1 -0
  225. package/dist/types/config.js +7 -0
  226. package/dist/types/config.js.map +1 -0
  227. package/dist/types/content.d.ts +46 -0
  228. package/dist/types/content.d.ts.map +1 -0
  229. package/dist/types/content.js +7 -0
  230. package/dist/types/content.js.map +1 -0
  231. package/dist/types/navigation.d.ts +45 -0
  232. package/dist/types/navigation.d.ts.map +1 -0
  233. package/dist/types/navigation.js +7 -0
  234. package/dist/types/navigation.js.map +1 -0
  235. package/dist/utils/language-utils.d.ts +41 -0
  236. package/dist/utils/language-utils.d.ts.map +1 -0
  237. package/dist/utils/language-utils.js +79 -0
  238. package/dist/utils/language-utils.js.map +1 -0
  239. package/dist/utils/slugify.d.ts +20 -0
  240. package/dist/utils/slugify.d.ts.map +1 -0
  241. package/dist/utils/slugify.js +44 -0
  242. package/dist/utils/slugify.js.map +1 -0
  243. package/package.json +58 -0
@@ -0,0 +1,380 @@
1
+ "use strict";
2
+ /**
3
+ * ContentProcessor - Processes raw markdown content with Markdoc
4
+ * Extracts frontmatter, generates TOC, calculates reading time
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.ContentProcessor = void 0;
11
+ const markdoc_1 = __importDefault(require("@markdoc/markdoc"));
12
+ class ContentProcessor {
13
+ constructor(averageReadingSpeed = 200) {
14
+ this.averageReadingSpeed = averageReadingSpeed;
15
+ }
16
+ /**
17
+ * Process a raw content file into structured content
18
+ * @param rawFile - Raw content file from ContentLoader
19
+ * @returns Processed content with metadata and renderable
20
+ */
21
+ process(rawFile) {
22
+ // Parse markdown with Markdoc
23
+ const ast = markdoc_1.default.parse(rawFile.content);
24
+ // Extract frontmatter from AST
25
+ const frontmatter = this.extractFrontmatter(ast);
26
+ // Validate frontmatter has required fields
27
+ this.validateFrontmatter(frontmatter, rawFile.filePath);
28
+ // Generate table of contents from headings
29
+ const toc = this.generateTableOfContents(ast);
30
+ // Calculate word count and reading time
31
+ const wordCount = this.calculateWordCount(ast);
32
+ const readingTime = this.calculateReadingTime(wordCount);
33
+ // Transform AST to renderable tree
34
+ const renderable = markdoc_1.default.transform(ast, {
35
+ nodes: {
36
+ heading: {
37
+ render: 'Heading',
38
+ attributes: {
39
+ level: { type: Number, required: true },
40
+ id: { type: String },
41
+ },
42
+ },
43
+ fence: {
44
+ render: 'CodeBlock',
45
+ attributes: {
46
+ language: { type: String },
47
+ content: { type: String },
48
+ },
49
+ },
50
+ image: {
51
+ render: 'Image',
52
+ attributes: {
53
+ src: { type: String, required: true },
54
+ alt: { type: String },
55
+ title: { type: String },
56
+ },
57
+ },
58
+ },
59
+ tags: {
60
+ card: {
61
+ render: 'Card',
62
+ attributes: {
63
+ title: { type: String, required: true },
64
+ href: { type: String },
65
+ icon: { type: String },
66
+ },
67
+ },
68
+ cardGrid: {
69
+ render: 'CardGrid',
70
+ attributes: {
71
+ cols: { type: Number, default: 2 },
72
+ },
73
+ },
74
+ callout: {
75
+ render: 'Callout',
76
+ attributes: {
77
+ type: { type: String, required: true, matches: ['note', 'warning', 'danger'] },
78
+ title: { type: String },
79
+ },
80
+ },
81
+ },
82
+ });
83
+ // Add heading anchors to renderable for table of contents
84
+ this.addHeadingAnchors(renderable);
85
+ // Build metadata
86
+ const metadata = {
87
+ slug: rawFile.route.slug,
88
+ filePath: rawFile.filePath,
89
+ language: rawFile.route.language,
90
+ path: rawFile.route.path,
91
+ dirPath: rawFile.route.dirPath,
92
+ frontmatter,
93
+ toc,
94
+ wordCount,
95
+ readingTime,
96
+ };
97
+ return {
98
+ metadata,
99
+ renderable: renderable,
100
+ rawContent: rawFile.content,
101
+ };
102
+ }
103
+ /**
104
+ * Process multiple raw files
105
+ * @param rawFiles - Array of raw content files
106
+ * @returns Array of processed content
107
+ */
108
+ processAll(rawFiles) {
109
+ return rawFiles.map((file) => {
110
+ try {
111
+ return this.process(file);
112
+ }
113
+ catch (error) {
114
+ throw new Error(`Failed to process ${file.filePath}: ${error.message}`);
115
+ }
116
+ });
117
+ }
118
+ /**
119
+ * Extract frontmatter from Markdoc AST
120
+ */
121
+ extractFrontmatter(ast) {
122
+ // Markdoc stores frontmatter in ast.attributes
123
+ const attributes = ast.attributes || {};
124
+ let parsedFrontmatter = {};
125
+ // Check if frontmatter is a string
126
+ if (typeof attributes.frontmatter === 'string') {
127
+ // Split by newlines and parse each line
128
+ const lines = attributes.frontmatter.split('\n');
129
+ for (const line of lines) {
130
+ // Find the first colon which separates key and value
131
+ const colonIndex = line.indexOf(':');
132
+ if (colonIndex > 0) {
133
+ const key = line.substring(0, colonIndex).trim();
134
+ const value = line.substring(colonIndex + 1).trim();
135
+ parsedFrontmatter[key] = value;
136
+ }
137
+ }
138
+ }
139
+ else {
140
+ // Use attributes directly if frontmatter is not a string
141
+ parsedFrontmatter = attributes;
142
+ }
143
+ // Build frontmatter object with required title field
144
+ const frontmatter = {
145
+ title: parsedFrontmatter.title || '',
146
+ description: parsedFrontmatter.description,
147
+ order: parsedFrontmatter.order !== undefined ? Number(parsedFrontmatter.order) : undefined,
148
+ draft: parsedFrontmatter.draft === true || parsedFrontmatter.draft === 'true',
149
+ tags: Array.isArray(parsedFrontmatter.tags) ? parsedFrontmatter.tags : undefined,
150
+ date: parsedFrontmatter.date,
151
+ author: parsedFrontmatter.author,
152
+ sidenavRef: parsedFrontmatter.sidenavRef,
153
+ };
154
+ // Add any custom frontmatter fields
155
+ for (const [key, value] of Object.entries(parsedFrontmatter)) {
156
+ if (!(key in frontmatter)) {
157
+ frontmatter[key] = value;
158
+ }
159
+ }
160
+ return frontmatter;
161
+ }
162
+ /**
163
+ * Generate a readable title from filename
164
+ * @param filePath - File path (e.g., "en/getting-started.md")
165
+ * @returns Human-readable title
166
+ */
167
+ generateTitleFromFilename(filePath) {
168
+ // Extract filename without extension
169
+ const parts = filePath.split('/');
170
+ const filename = parts[parts.length - 1].replace(/\.(md|mdx)$/, '');
171
+ // Handle index files
172
+ if (filename === 'index') {
173
+ // Use parent directory name if available
174
+ if (parts.length > 2) {
175
+ return this.humanizeSlug(parts[parts.length - 2]);
176
+ }
177
+ return 'Home';
178
+ }
179
+ // Convert filename to title (e.g., "getting-started" -> "Getting Started")
180
+ return this.humanizeSlug(filename);
181
+ }
182
+ /**
183
+ * Convert a slug to human-readable title
184
+ * @param slug - Slugified string
185
+ * @returns Human-readable string
186
+ */
187
+ humanizeSlug(slug) {
188
+ return slug
189
+ .split(/[-_]/)
190
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
191
+ .join(' ');
192
+ }
193
+ /**
194
+ * Validate frontmatter required fields
195
+ */
196
+ validateFrontmatter(frontmatter, filePath) {
197
+ if (!frontmatter.title || frontmatter.title.trim() === '') {
198
+ throw new Error(`Missing required frontmatter 'title' in ${filePath}. All content files must include a title in frontmatter.`);
199
+ }
200
+ }
201
+ /**
202
+ * Generate table of contents from headings in the AST
203
+ */
204
+ generateTableOfContents(ast) {
205
+ const headings = [];
206
+ // Walk the AST to find all heading nodes
207
+ this.walkAST(ast, (node) => {
208
+ if (node.type === 'heading') {
209
+ const level = node.attributes?.level || 1;
210
+ const text = this.extractTextFromNode(node);
211
+ const id = this.generateHeadingId(text);
212
+ headings.push({
213
+ id,
214
+ text,
215
+ level,
216
+ });
217
+ }
218
+ });
219
+ // Build hierarchical structure
220
+ return this.buildTocHierarchy(headings);
221
+ }
222
+ /**
223
+ * Build hierarchical TOC structure from flat list of headings
224
+ */
225
+ buildTocHierarchy(headings) {
226
+ const toc = [];
227
+ const stack = [];
228
+ for (const heading of headings) {
229
+ // Remove entries from stack that are same level or deeper
230
+ while (stack.length > 0 && stack[stack.length - 1].level >= heading.level) {
231
+ stack.pop();
232
+ }
233
+ if (stack.length === 0) {
234
+ // Top-level heading
235
+ toc.push(heading);
236
+ }
237
+ else {
238
+ // Nested heading
239
+ const parent = stack[stack.length - 1];
240
+ if (!parent.children) {
241
+ parent.children = [];
242
+ }
243
+ parent.children.push(heading);
244
+ }
245
+ stack.push(heading);
246
+ }
247
+ return toc;
248
+ }
249
+ /**
250
+ * Walk the AST and call visitor function for each node
251
+ */
252
+ walkAST(node, visitor) {
253
+ visitor(node);
254
+ if (node.children && Array.isArray(node.children)) {
255
+ for (const child of node.children) {
256
+ this.walkAST(child, visitor);
257
+ }
258
+ }
259
+ }
260
+ /**
261
+ * Extract text content from a node
262
+ */
263
+ extractTextFromNode(node) {
264
+ if (typeof node === 'string') {
265
+ return node;
266
+ }
267
+ if (node.type === 'text') {
268
+ return node.attributes?.content || '';
269
+ }
270
+ if (node.children && Array.isArray(node.children)) {
271
+ return node.children.map((child) => this.extractTextFromNode(child)).join('');
272
+ }
273
+ return '';
274
+ }
275
+ /**
276
+ * Generate a URL-friendly ID from heading text
277
+ */
278
+ generateHeadingId(text) {
279
+ return text
280
+ .toLowerCase()
281
+ .trim()
282
+ .replace(/[^\w\s-]/g, '')
283
+ .replace(/\s+/g, '-')
284
+ .replace(/-+/g, '-');
285
+ }
286
+ /**
287
+ * Calculate word count from AST
288
+ */
289
+ calculateWordCount(ast) {
290
+ let wordCount = 0;
291
+ this.walkAST(ast, (node) => {
292
+ if (node.type === 'text') {
293
+ const content = node.attributes?.content;
294
+ // Only count if content is actually a string
295
+ // Markdoc variables and other objects should be skipped
296
+ if (typeof content === 'string') {
297
+ const words = content.split(/\s+/).filter((word) => word.length > 0);
298
+ wordCount += words.length;
299
+ }
300
+ }
301
+ });
302
+ return wordCount;
303
+ }
304
+ /**
305
+ * Calculate estimated reading time in minutes
306
+ */
307
+ calculateReadingTime(wordCount) {
308
+ return Math.ceil(wordCount / this.averageReadingSpeed);
309
+ }
310
+ /**
311
+ * Ensure every heading tag in the renderable tree has a stable id
312
+ */
313
+ addHeadingAnchors(node) {
314
+ if (!node || typeof node !== 'object') {
315
+ return;
316
+ }
317
+ if (node instanceof markdoc_1.default.Tag) {
318
+ if (node.name === 'Heading') {
319
+ const text = this.extractTextFromRenderable(node.children);
320
+ const id = this.generateHeadingId(text);
321
+ node.attributes = {
322
+ ...(node.attributes ?? {}),
323
+ id,
324
+ };
325
+ }
326
+ if (Array.isArray(node.children)) {
327
+ node.children.forEach((child) => this.addHeadingAnchors(child));
328
+ }
329
+ return;
330
+ }
331
+ if (Array.isArray(node)) {
332
+ node.forEach((child) => this.addHeadingAnchors(child));
333
+ }
334
+ }
335
+ /**
336
+ * Extract plain text from the renderable Markdoc tree
337
+ */
338
+ extractTextFromRenderable(node) {
339
+ if (!node)
340
+ return '';
341
+ if (typeof node === 'string') {
342
+ return node;
343
+ }
344
+ if (Array.isArray(node)) {
345
+ return node.map((child) => this.extractTextFromRenderable(child)).join('');
346
+ }
347
+ if (node instanceof markdoc_1.default.Tag) {
348
+ return this.extractTextFromRenderable(node.children);
349
+ }
350
+ if (typeof node === 'object' && node.attributes?.content) {
351
+ return String(node.attributes.content);
352
+ }
353
+ return '';
354
+ }
355
+ /**
356
+ * Get content metadata without processing full content (lightweight)
357
+ * Useful for generating content index
358
+ */
359
+ getMetadataOnly(rawFile) {
360
+ const ast = markdoc_1.default.parse(rawFile.content);
361
+ const frontmatter = this.extractFrontmatter(ast);
362
+ this.validateFrontmatter(frontmatter, rawFile.filePath);
363
+ const toc = this.generateTableOfContents(ast);
364
+ const wordCount = this.calculateWordCount(ast);
365
+ const readingTime = this.calculateReadingTime(wordCount);
366
+ return {
367
+ slug: rawFile.route.slug,
368
+ filePath: rawFile.filePath,
369
+ language: rawFile.route.language,
370
+ path: rawFile.route.path,
371
+ dirPath: rawFile.route.dirPath,
372
+ frontmatter,
373
+ toc,
374
+ wordCount,
375
+ readingTime,
376
+ };
377
+ }
378
+ }
379
+ exports.ContentProcessor = ContentProcessor;
380
+ //# sourceMappingURL=ContentProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContentProcessor.js","sourceRoot":"","sources":["../../src/content/ContentProcessor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * RouteManager - Manages URL routing and path construction
3
+ * Handles language prefixing and route generation for content files
4
+ */
5
+ import { Route, RouteMap } from '../types/navigation';
6
+ export declare class RouteManager {
7
+ private defaultLanguage;
8
+ private availableLanguages;
9
+ constructor(defaultLanguage?: string, availableLanguages?: string[]);
10
+ /**
11
+ * Create a route object from a content file path
12
+ * @param filePath - Relative path from content/ directory (e.g., "en/getting-started.md")
13
+ * @returns Route object with path, slug, language, and file locations
14
+ */
15
+ createRoute(filePath: string): Route;
16
+ /**
17
+ * Create a route map from an array of file paths
18
+ * @param filePaths - Array of relative file paths from content/ directory
19
+ * @returns RouteMap with URL paths as keys
20
+ */
21
+ createRouteMap(filePaths: string[]): RouteMap;
22
+ /**
23
+ * Get HTML file path in dist/
24
+ * @param slug - Content slug
25
+ * @param language - Language code
26
+ * @returns Path to HTML file relative to dist/
27
+ */
28
+ private getHtmlPath;
29
+ /**
30
+ * Extract language from a URL path
31
+ * @param urlPath - URL path (e.g., "/es/getting-started")
32
+ * @returns Language code or default language
33
+ */
34
+ getLanguageFromPath(urlPath: string): string;
35
+ /**
36
+ * Get slug from a URL path (without language prefix)
37
+ * @param urlPath - URL path (e.g., "/es/getting-started" or "/getting-started")
38
+ * @returns Slug
39
+ */
40
+ getSlugFromPath(urlPath: string): string;
41
+ /**
42
+ * Build URL path from slug and language
43
+ * @param slug - Content slug
44
+ * @param language - Language code
45
+ * @returns URL path
46
+ */
47
+ buildPath(slug: string, language: string): string;
48
+ /**
49
+ * Check if a language is the default language
50
+ * @param language - Language code
51
+ * @returns True if default language
52
+ */
53
+ isDefaultLanguage(language: string): boolean;
54
+ /**
55
+ * Get all routes grouped by language
56
+ * @param routeMap - Route map
57
+ * @returns Map of language code to array of routes
58
+ */
59
+ groupRoutesByLanguage(routeMap: RouteMap): Map<string, Route[]>;
60
+ /**
61
+ * Find route by slug and language
62
+ * @param routeMap - Route map
63
+ * @param slug - Content slug
64
+ * @param language - Language code
65
+ * @returns Route or undefined
66
+ */
67
+ findRoute(routeMap: RouteMap, slug: string, language: string): Route | undefined;
68
+ }
69
+ //# sourceMappingURL=RouteManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteManager.d.ts","sourceRoot":"","sources":["../../src/content/RouteManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAStD,qBAAa,YAAY;IACvB,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,kBAAkB,CAAW;gBAEzB,eAAe,GAAE,MAAa,EAAE,kBAAkB,GAAE,MAAM,EAAW;IAKjF;;;;OAIG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK;IA4BpC;;;;OAIG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,QAAQ;IAW7C;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAcnB;;;;OAIG;IACH,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAU5C;;;;OAIG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAYxC;;;;;OAKG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAIjD;;;;OAIG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI5C;;;;OAIG;IACH,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;IAY/D;;;;;;OAMG;IACH,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;CAIjF"}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ /**
3
+ * RouteManager - Manages URL routing and path construction
4
+ * Handles language prefixing and route generation for content files
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.RouteManager = void 0;
11
+ const path_1 = __importDefault(require("path"));
12
+ const language_utils_1 = require("../utils/language-utils");
13
+ const slugify_1 = require("../utils/slugify");
14
+ class RouteManager {
15
+ constructor(defaultLanguage = 'en', availableLanguages = ['en']) {
16
+ this.defaultLanguage = defaultLanguage;
17
+ this.availableLanguages = availableLanguages;
18
+ }
19
+ /**
20
+ * Create a route object from a content file path
21
+ * @param filePath - Relative path from content/ directory (e.g., "en/getting-started.md")
22
+ * @returns Route object with path, slug, language, and file locations
23
+ */
24
+ createRoute(filePath) {
25
+ // Extract language from path
26
+ const language = (0, language_utils_1.extractLanguageFromPath)(filePath) || this.defaultLanguage;
27
+ // Get relative path without language prefix
28
+ const relativePath = (0, language_utils_1.removeLanguagePrefix)(filePath);
29
+ // Generate slug from file path
30
+ const slug = (0, slugify_1.filePathToSlug)(relativePath);
31
+ // Get directory path (excluding language prefix and filename)
32
+ const dirPath = path_1.default.dirname(relativePath) === '.' ? '' : path_1.default.dirname(relativePath);
33
+ // Build URL path with language prefix and directory structure
34
+ const urlPath = (0, language_utils_1.buildPathWithLanguage)(dirPath ? `${dirPath}/${slug}` : slug, language, this.defaultLanguage);
35
+ return {
36
+ path: urlPath,
37
+ slug,
38
+ dirPath,
39
+ language,
40
+ };
41
+ }
42
+ /**
43
+ * Create a route map from an array of file paths
44
+ * @param filePaths - Array of relative file paths from content/ directory
45
+ * @returns RouteMap with URL paths as keys
46
+ */
47
+ createRouteMap(filePaths) {
48
+ const routeMap = new Map();
49
+ for (const filePath of filePaths) {
50
+ const route = this.createRoute(filePath);
51
+ routeMap.set(route.path, route);
52
+ }
53
+ return routeMap;
54
+ }
55
+ /**
56
+ * Get HTML file path in dist/
57
+ * @param slug - Content slug
58
+ * @param language - Language code
59
+ * @returns Path to HTML file relative to dist/
60
+ */
61
+ getHtmlPath(slug, language) {
62
+ // For default language: slug/index.html or index.html (for home)
63
+ // For other languages: lang/slug/index.html or lang/index.html (for home)
64
+ if (language === this.defaultLanguage) {
65
+ return slug === 'index'
66
+ ? 'index.html'
67
+ : `${slug}/index.html`;
68
+ }
69
+ return slug === 'index'
70
+ ? `${language}/index.html`
71
+ : `${language}/${slug}/index.html`;
72
+ }
73
+ /**
74
+ * Extract language from a URL path
75
+ * @param urlPath - URL path (e.g., "/es/getting-started")
76
+ * @returns Language code or default language
77
+ */
78
+ getLanguageFromPath(urlPath) {
79
+ const parts = urlPath.split('/').filter(Boolean);
80
+ if (parts.length > 0 && this.availableLanguages.includes(parts[0])) {
81
+ return parts[0];
82
+ }
83
+ return this.defaultLanguage;
84
+ }
85
+ /**
86
+ * Get slug from a URL path (without language prefix)
87
+ * @param urlPath - URL path (e.g., "/es/getting-started" or "/getting-started")
88
+ * @returns Slug
89
+ */
90
+ getSlugFromPath(urlPath) {
91
+ const parts = urlPath.split('/').filter(Boolean);
92
+ // Remove language prefix if present
93
+ if (parts.length > 0 && this.availableLanguages.includes(parts[0])) {
94
+ parts.shift();
95
+ }
96
+ // Join remaining parts (for nested paths)
97
+ return parts.join('/') || 'index';
98
+ }
99
+ /**
100
+ * Build URL path from slug and language
101
+ * @param slug - Content slug
102
+ * @param language - Language code
103
+ * @returns URL path
104
+ */
105
+ buildPath(slug, language) {
106
+ return (0, language_utils_1.buildPathWithLanguage)(slug, language, this.defaultLanguage);
107
+ }
108
+ /**
109
+ * Check if a language is the default language
110
+ * @param language - Language code
111
+ * @returns True if default language
112
+ */
113
+ isDefaultLanguage(language) {
114
+ return language === this.defaultLanguage;
115
+ }
116
+ /**
117
+ * Get all routes grouped by language
118
+ * @param routeMap - Route map
119
+ * @returns Map of language code to array of routes
120
+ */
121
+ groupRoutesByLanguage(routeMap) {
122
+ const grouped = new Map();
123
+ for (const route of routeMap.values()) {
124
+ const existing = grouped.get(route.language) || [];
125
+ existing.push(route);
126
+ grouped.set(route.language, existing);
127
+ }
128
+ return grouped;
129
+ }
130
+ /**
131
+ * Find route by slug and language
132
+ * @param routeMap - Route map
133
+ * @param slug - Content slug
134
+ * @param language - Language code
135
+ * @returns Route or undefined
136
+ */
137
+ findRoute(routeMap, slug, language) {
138
+ const path = this.buildPath(slug, language);
139
+ return routeMap.get(path);
140
+ }
141
+ }
142
+ exports.RouteManager = RouteManager;
143
+ //# sourceMappingURL=RouteManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteManager.js","sourceRoot":"","sources":["../../src/content/RouteManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Callout component styles
3
+ * Note, warning, and danger callout boxes
4
+ */
5
+ import { GlobalVariables } from '../types';
6
+ export declare class CalloutStyleGenerator {
7
+ private globalVars;
8
+ constructor(globalVars: GlobalVariables);
9
+ generate(): string;
10
+ }
11
+ //# sourceMappingURL=callout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callout.d.ts","sourceRoot":"","sources":["../../../src/styles/components/callout.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C,qBAAa,qBAAqB;IACpB,OAAO,CAAC,UAAU;gBAAV,UAAU,EAAE,eAAe;IAE/C,QAAQ,IAAI,MAAM;CAoEnB"}