@humanspeak/svelte-markdown 0.5.5 → 0.6.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 (200) hide show
  1. package/dist/Parser.svelte +29 -9
  2. package/dist/Parser.svelte.d.ts +1 -0
  3. package/dist/SvelteMarkdown.svelte +10 -3
  4. package/dist/SvelteMarkdown.svelte.d.ts +8 -5
  5. package/dist/renderers/Blockquote.svelte.d.ts +5 -3
  6. package/dist/renderers/Br.svelte.d.ts +5 -3
  7. package/dist/renderers/Code.svelte.d.ts +4 -2
  8. package/dist/renderers/Codespan.svelte.d.ts +4 -2
  9. package/dist/renderers/Del.svelte.d.ts +5 -3
  10. package/dist/renderers/Em.svelte.d.ts +5 -3
  11. package/dist/renderers/Heading.svelte.d.ts +6 -4
  12. package/dist/renderers/Image.svelte.d.ts +4 -2
  13. package/dist/renderers/Link.svelte.d.ts +5 -3
  14. package/dist/renderers/List.svelte.d.ts +5 -3
  15. package/dist/renderers/ListItem.svelte.d.ts +5 -3
  16. package/dist/renderers/Paragraph.svelte.d.ts +5 -3
  17. package/dist/renderers/Strong.svelte.d.ts +5 -3
  18. package/dist/renderers/Table.svelte.d.ts +5 -3
  19. package/dist/renderers/TableBody.svelte.d.ts +5 -3
  20. package/dist/renderers/TableCell.svelte.d.ts +6 -4
  21. package/dist/renderers/TableHead.svelte.d.ts +5 -3
  22. package/dist/renderers/TableRow.svelte.d.ts +5 -3
  23. package/dist/renderers/Text.svelte.d.ts +5 -3
  24. package/dist/renderers/html/A.svelte +12 -0
  25. package/dist/renderers/html/A.svelte.d.ts +7 -0
  26. package/dist/renderers/html/Abbr.svelte +12 -0
  27. package/dist/renderers/html/Abbr.svelte.d.ts +7 -0
  28. package/dist/renderers/html/Address.svelte +12 -0
  29. package/dist/renderers/html/Address.svelte.d.ts +7 -0
  30. package/dist/renderers/html/Article.svelte +12 -0
  31. package/dist/renderers/html/Article.svelte.d.ts +7 -0
  32. package/dist/renderers/html/Aside.svelte +12 -0
  33. package/dist/renderers/html/Aside.svelte.d.ts +7 -0
  34. package/dist/renderers/html/Audio.svelte +12 -0
  35. package/dist/renderers/html/Audio.svelte.d.ts +7 -0
  36. package/dist/renderers/html/B.svelte +12 -0
  37. package/dist/renderers/html/B.svelte.d.ts +7 -0
  38. package/dist/renderers/html/Bdi.svelte +12 -0
  39. package/dist/renderers/html/Bdi.svelte.d.ts +7 -0
  40. package/dist/renderers/html/Bdo.svelte +12 -0
  41. package/dist/renderers/html/Bdo.svelte.d.ts +7 -0
  42. package/dist/renderers/html/Blockquote.svelte +12 -0
  43. package/dist/renderers/html/Blockquote.svelte.d.ts +7 -0
  44. package/dist/renderers/html/Button.svelte +12 -0
  45. package/dist/renderers/html/Button.svelte.d.ts +7 -0
  46. package/dist/renderers/html/Canvas.svelte +12 -0
  47. package/dist/renderers/html/Canvas.svelte.d.ts +7 -0
  48. package/dist/renderers/html/Cite.svelte +12 -0
  49. package/dist/renderers/html/Cite.svelte.d.ts +7 -0
  50. package/dist/renderers/html/Code.svelte +12 -0
  51. package/dist/renderers/html/Code.svelte.d.ts +7 -0
  52. package/dist/renderers/html/Datalist.svelte +12 -0
  53. package/dist/renderers/html/Datalist.svelte.d.ts +7 -0
  54. package/dist/renderers/html/Dd.svelte +12 -0
  55. package/dist/renderers/html/Dd.svelte.d.ts +7 -0
  56. package/dist/renderers/html/Del.svelte +12 -0
  57. package/dist/renderers/html/Del.svelte.d.ts +7 -0
  58. package/dist/renderers/html/Details.svelte +12 -0
  59. package/dist/renderers/html/Details.svelte.d.ts +7 -0
  60. package/dist/renderers/html/Dfn.svelte +12 -0
  61. package/dist/renderers/html/Dfn.svelte.d.ts +7 -0
  62. package/dist/renderers/html/Dialog.svelte +12 -0
  63. package/dist/renderers/html/Dialog.svelte.d.ts +7 -0
  64. package/dist/renderers/html/Div.svelte +12 -0
  65. package/dist/renderers/html/Div.svelte.d.ts +7 -0
  66. package/dist/renderers/html/Dl.svelte +12 -0
  67. package/dist/renderers/html/Dl.svelte.d.ts +7 -0
  68. package/dist/renderers/html/Dt.svelte +12 -0
  69. package/dist/renderers/html/Dt.svelte.d.ts +7 -0
  70. package/dist/renderers/html/Em.svelte +12 -0
  71. package/dist/renderers/html/Em.svelte.d.ts +7 -0
  72. package/dist/renderers/html/Embed.svelte +9 -0
  73. package/dist/renderers/html/Embed.svelte.d.ts +5 -0
  74. package/dist/renderers/html/Fieldset.svelte +12 -0
  75. package/dist/renderers/html/Fieldset.svelte.d.ts +7 -0
  76. package/dist/renderers/html/Footer.svelte +12 -0
  77. package/dist/renderers/html/Footer.svelte.d.ts +7 -0
  78. package/dist/renderers/html/Form.svelte +12 -0
  79. package/dist/renderers/html/Form.svelte.d.ts +7 -0
  80. package/dist/renderers/html/H1.svelte +12 -0
  81. package/dist/renderers/html/H1.svelte.d.ts +7 -0
  82. package/dist/renderers/html/H2.svelte +12 -0
  83. package/dist/renderers/html/H2.svelte.d.ts +7 -0
  84. package/dist/renderers/html/H3.svelte +12 -0
  85. package/dist/renderers/html/H3.svelte.d.ts +7 -0
  86. package/dist/renderers/html/H4.svelte +12 -0
  87. package/dist/renderers/html/H4.svelte.d.ts +7 -0
  88. package/dist/renderers/html/H5.svelte +12 -0
  89. package/dist/renderers/html/H5.svelte.d.ts +7 -0
  90. package/dist/renderers/html/H6.svelte +12 -0
  91. package/dist/renderers/html/H6.svelte.d.ts +7 -0
  92. package/dist/renderers/html/Header.svelte +12 -0
  93. package/dist/renderers/html/Header.svelte.d.ts +7 -0
  94. package/dist/renderers/html/Hgroup.svelte +12 -0
  95. package/dist/renderers/html/Hgroup.svelte.d.ts +7 -0
  96. package/dist/renderers/html/Hr.svelte +11 -0
  97. package/dist/renderers/html/Hr.svelte.d.ts +5 -0
  98. package/dist/renderers/html/I.svelte +12 -0
  99. package/dist/renderers/html/I.svelte.d.ts +7 -0
  100. package/dist/renderers/html/Iframe.svelte +12 -0
  101. package/dist/renderers/html/Iframe.svelte.d.ts +7 -0
  102. package/dist/renderers/html/Img.svelte +11 -0
  103. package/dist/renderers/html/Img.svelte.d.ts +5 -0
  104. package/dist/renderers/html/Input.svelte +9 -0
  105. package/dist/renderers/html/Input.svelte.d.ts +5 -0
  106. package/dist/renderers/html/Kbd.svelte +12 -0
  107. package/dist/renderers/html/Kbd.svelte.d.ts +7 -0
  108. package/dist/renderers/html/Label.svelte +12 -0
  109. package/dist/renderers/html/Label.svelte.d.ts +7 -0
  110. package/dist/renderers/html/Legend.svelte +12 -0
  111. package/dist/renderers/html/Legend.svelte.d.ts +7 -0
  112. package/dist/renderers/html/Li.svelte +12 -0
  113. package/dist/renderers/html/Li.svelte.d.ts +7 -0
  114. package/dist/renderers/html/Main.svelte +12 -0
  115. package/dist/renderers/html/Main.svelte.d.ts +7 -0
  116. package/dist/renderers/html/Mark.svelte +12 -0
  117. package/dist/renderers/html/Mark.svelte.d.ts +7 -0
  118. package/dist/renderers/html/Menu.svelte +12 -0
  119. package/dist/renderers/html/Menu.svelte.d.ts +7 -0
  120. package/dist/renderers/html/Meter.svelte +12 -0
  121. package/dist/renderers/html/Meter.svelte.d.ts +7 -0
  122. package/dist/renderers/html/Nav.svelte +12 -0
  123. package/dist/renderers/html/Nav.svelte.d.ts +7 -0
  124. package/dist/renderers/html/Object.svelte +12 -0
  125. package/dist/renderers/html/Object.svelte.d.ts +7 -0
  126. package/dist/renderers/html/Ol.svelte +12 -0
  127. package/dist/renderers/html/Ol.svelte.d.ts +7 -0
  128. package/dist/renderers/html/Optgroup.svelte +12 -0
  129. package/dist/renderers/html/Optgroup.svelte.d.ts +7 -0
  130. package/dist/renderers/html/Option.svelte +12 -0
  131. package/dist/renderers/html/Option.svelte.d.ts +7 -0
  132. package/dist/renderers/html/Output.svelte +12 -0
  133. package/dist/renderers/html/Output.svelte.d.ts +7 -0
  134. package/dist/renderers/html/P.svelte +12 -0
  135. package/dist/renderers/html/P.svelte.d.ts +7 -0
  136. package/dist/renderers/html/Param.svelte +9 -0
  137. package/dist/renderers/html/Param.svelte.d.ts +5 -0
  138. package/dist/renderers/html/Picture.svelte +12 -0
  139. package/dist/renderers/html/Picture.svelte.d.ts +7 -0
  140. package/dist/renderers/html/Pre.svelte +12 -0
  141. package/dist/renderers/html/Pre.svelte.d.ts +7 -0
  142. package/dist/renderers/html/Progress.svelte +12 -0
  143. package/dist/renderers/html/Progress.svelte.d.ts +7 -0
  144. package/dist/renderers/html/S.svelte +12 -0
  145. package/dist/renderers/html/S.svelte.d.ts +7 -0
  146. package/dist/renderers/html/Samp.svelte +12 -0
  147. package/dist/renderers/html/Samp.svelte.d.ts +7 -0
  148. package/dist/renderers/html/Section.svelte +12 -0
  149. package/dist/renderers/html/Section.svelte.d.ts +7 -0
  150. package/dist/renderers/html/Select.svelte +12 -0
  151. package/dist/renderers/html/Select.svelte.d.ts +7 -0
  152. package/dist/renderers/html/Small.svelte +12 -0
  153. package/dist/renderers/html/Small.svelte.d.ts +7 -0
  154. package/dist/renderers/html/Source.svelte +9 -0
  155. package/dist/renderers/html/Source.svelte.d.ts +5 -0
  156. package/dist/renderers/html/Span.svelte +12 -0
  157. package/dist/renderers/html/Span.svelte.d.ts +7 -0
  158. package/dist/renderers/html/Strong.svelte +12 -0
  159. package/dist/renderers/html/Strong.svelte.d.ts +7 -0
  160. package/dist/renderers/html/Sub.svelte +12 -0
  161. package/dist/renderers/html/Sub.svelte.d.ts +7 -0
  162. package/dist/renderers/html/Summary.svelte +12 -0
  163. package/dist/renderers/html/Summary.svelte.d.ts +7 -0
  164. package/dist/renderers/html/Sup.svelte +12 -0
  165. package/dist/renderers/html/Sup.svelte.d.ts +7 -0
  166. package/dist/renderers/html/Table.svelte +12 -0
  167. package/dist/renderers/html/Table.svelte.d.ts +7 -0
  168. package/dist/renderers/html/Tbody.svelte +12 -0
  169. package/dist/renderers/html/Tbody.svelte.d.ts +7 -0
  170. package/dist/renderers/html/Td.svelte +12 -0
  171. package/dist/renderers/html/Td.svelte.d.ts +7 -0
  172. package/dist/renderers/html/Textarea.svelte +11 -0
  173. package/dist/renderers/html/Textarea.svelte.d.ts +5 -0
  174. package/dist/renderers/html/Tfoot.svelte +12 -0
  175. package/dist/renderers/html/Tfoot.svelte.d.ts +7 -0
  176. package/dist/renderers/html/Th.svelte +12 -0
  177. package/dist/renderers/html/Th.svelte.d.ts +7 -0
  178. package/dist/renderers/html/Thead.svelte +12 -0
  179. package/dist/renderers/html/Thead.svelte.d.ts +7 -0
  180. package/dist/renderers/html/Tr.svelte +12 -0
  181. package/dist/renderers/html/Tr.svelte.d.ts +7 -0
  182. package/dist/renderers/html/Track.svelte +9 -0
  183. package/dist/renderers/html/Track.svelte.d.ts +5 -0
  184. package/dist/renderers/html/U.svelte +12 -0
  185. package/dist/renderers/html/U.svelte.d.ts +7 -0
  186. package/dist/renderers/html/Ul.svelte +12 -0
  187. package/dist/renderers/html/Ul.svelte.d.ts +7 -0
  188. package/dist/renderers/html/Var.svelte +12 -0
  189. package/dist/renderers/html/Var.svelte.d.ts +7 -0
  190. package/dist/renderers/html/index.d.ts +6 -0
  191. package/dist/renderers/html/index.js +169 -0
  192. package/dist/renderers/index.d.ts +1 -1
  193. package/dist/renderers/index.js +1 -1
  194. package/dist/utils/markdown-parser.d.ts +5 -2
  195. package/dist/utils/markdown-parser.js +1 -0
  196. package/dist/utils/token-cleanup.d.ts +2 -2
  197. package/dist/utils/token-cleanup.js +120 -29
  198. package/package.json +18 -17
  199. package/dist/renderers/Html.svelte +0 -9
  200. package/dist/renderers/Html.svelte.d.ts +0 -4
@@ -1,45 +1,136 @@
1
+ import { Parser } from 'htmlparser2';
1
2
  // Cache the regex pattern
2
- const HTML_TAG_PATTERN = /<\/?([a-zA-Z][a-zA-Z0-9]*).*?>/;
3
+ const HTML_TAG_PATTERN = /<\/?([a-zA-Z][a-zA-Z0-9-]{0,})(?:\s+[^>]*)?>/;
4
+ const htmlTagRegex = new RegExp(HTML_TAG_PATTERN);
3
5
  export const isHtmlOpenTag = (raw) => {
6
+ // Use test() first as it's faster than match()
7
+ if (!htmlTagRegex.test(raw))
8
+ return null;
4
9
  const match = raw.match(HTML_TAG_PATTERN);
5
10
  if (!match)
6
11
  return null;
7
12
  return { tag: match[1], isOpening: !raw.startsWith('</') };
8
13
  };
14
+ function extractAttributes(raw) {
15
+ const attributes = {};
16
+ const attributeRegex = /(\w+)=["']([^"']*?)["']/g;
17
+ let match;
18
+ while ((match = attributeRegex.exec(raw)) !== null) {
19
+ const [, key, value] = match;
20
+ attributes[key] = value.trim();
21
+ }
22
+ return attributes;
23
+ }
24
+ function parseHtmlBlock(html) {
25
+ const tokens = [];
26
+ let currentText = '';
27
+ const parser = new Parser({
28
+ onopentag(name, attributes) {
29
+ if (currentText.trim()) {
30
+ tokens.push({
31
+ type: 'text',
32
+ raw: currentText,
33
+ text: currentText
34
+ });
35
+ currentText = '';
36
+ }
37
+ tokens.push({
38
+ type: 'html',
39
+ raw: `<${name}${Object.entries(attributes)
40
+ .map(([key, value]) => ` ${key}="${value}"`)
41
+ .join('')}>`,
42
+ tag: name,
43
+ attributes
44
+ });
45
+ },
46
+ ontext(text) {
47
+ currentText += text;
48
+ },
49
+ onclosetag(name) {
50
+ if (currentText.trim()) {
51
+ tokens.push({
52
+ type: 'text',
53
+ raw: currentText,
54
+ text: currentText
55
+ });
56
+ currentText = '';
57
+ }
58
+ tokens.push({
59
+ type: 'html',
60
+ raw: `</${name}>`,
61
+ tag: name
62
+ });
63
+ }
64
+ });
65
+ parser.write(html);
66
+ parser.end();
67
+ return tokens;
68
+ }
69
+ function containsMultipleTags(html) {
70
+ // Count the number of opening tags (excluding self-closing)
71
+ const openingTags = html.match(/<[a-zA-Z][^>]*>/g) || [];
72
+ const closingTags = html.match(/<\/[a-zA-Z][^>]*>/g) || [];
73
+ return openingTags.length > 1 || closingTags.length > 1;
74
+ }
9
75
  export const shrinkHtmlTokens = (tokens) => {
10
76
  const result = [];
11
- const len = tokens.length;
12
- for (let i = 0; i < len; i++) {
13
- const currentToken = tokens[i];
14
- // Handle nested tokens first
15
- if ('tokens' in currentToken && currentToken.tokens) {
16
- currentToken.tokens = shrinkHtmlTokens(currentToken.tokens);
17
- result.push(currentToken);
18
- continue;
77
+ for (const token of tokens) {
78
+ if (token.type === 'html' && containsMultipleTags(token.raw)) {
79
+ // Parse HTML with multiple tags into separate tokens
80
+ result.push(...parseHtmlBlock(token.raw));
81
+ }
82
+ else {
83
+ result.push(token);
19
84
  }
20
- // Check for HTML pattern
21
- if (currentToken.type === 'html' && i + 2 < len) {
22
- const openTag = isHtmlOpenTag(currentToken.raw);
23
- if (openTag?.isOpening) {
24
- const contentToken = tokens[i + 1];
25
- const closingToken = tokens[i + 2];
26
- const closeTag = isHtmlOpenTag(closingToken.raw);
27
- if (contentToken.type === 'text' &&
28
- closeTag &&
29
- !closeTag.isOpening &&
30
- openTag.tag === closeTag.tag) {
31
- result.push({
32
- type: 'html',
33
- raw: currentToken.raw + contentToken.raw + closingToken.raw,
34
- text: currentToken.raw + contentToken.raw + closingToken.raw,
35
- tag: openTag.tag
36
- });
37
- i += 2;
85
+ }
86
+ // Then process the tokens as before
87
+ return processHtmlTokens(result);
88
+ };
89
+ // Rename the existing shrinkHtmlTokens logic to processHtmlTokens
90
+ function processHtmlTokens(tokens) {
91
+ const result = [];
92
+ const stack = [];
93
+ for (let i = 0; i < tokens.length; i++) {
94
+ const token = tokens[i];
95
+ // Recursively process any nested tokens first
96
+ if ('tokens' in token && Array.isArray(token.tokens)) {
97
+ token.tokens = processHtmlTokens(token.tokens);
98
+ }
99
+ if (token.type === 'html') {
100
+ const tagInfo = isHtmlOpenTag(token.raw);
101
+ if (!tagInfo) {
102
+ result.push(token);
103
+ continue;
104
+ }
105
+ if (tagInfo.isOpening) {
106
+ stack.push({ tag: tagInfo.tag, startIndex: result.length });
107
+ result.push(token);
108
+ }
109
+ else {
110
+ const lastOpening = stack.pop();
111
+ if (!lastOpening || lastOpening.tag !== tagInfo.tag) {
112
+ result.push(token);
38
113
  continue;
39
114
  }
115
+ const startIndex = lastOpening.startIndex;
116
+ const innerTokens = result.splice(startIndex + 1, result.length - startIndex - 1);
117
+ const openingToken = result.pop();
118
+ const attributes = extractAttributes(openingToken.raw);
119
+ result.push({
120
+ type: 'html',
121
+ raw: openingToken.raw,
122
+ tag: tagInfo.tag,
123
+ tokens: processHtmlTokens(innerTokens),
124
+ attributes
125
+ });
40
126
  }
41
127
  }
42
- result.push(currentToken);
128
+ else {
129
+ result.push(token);
130
+ }
131
+ }
132
+ if (stack.length > 0) {
133
+ return tokens;
43
134
  }
44
135
  return result;
45
- };
136
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@humanspeak/svelte-markdown",
3
3
  "description": "A markdown renderer for Svelte",
4
- "version": "0.5.5",
4
+ "version": "0.6.1",
5
5
  "scripts": {
6
6
  "dev": "vite dev",
7
7
  "build": "vite build && npm run package",
@@ -53,41 +53,42 @@
53
53
  },
54
54
  "dependencies": {
55
55
  "github-slugger": "^2.0.0",
56
- "marked": "^14.1.3"
56
+ "htmlparser2": "^9.1.0",
57
+ "marked": "^15.0.0"
57
58
  },
58
59
  "devDependencies": {
59
- "@eslint/eslintrc": "^3.1.0",
60
- "@eslint/js": "^9.14.0",
60
+ "@eslint/eslintrc": "^3.2.0",
61
+ "@eslint/js": "^9.15.0",
61
62
  "@sveltejs/adapter-auto": "^3.3.1",
62
- "@sveltejs/kit": "^2.7.4",
63
+ "@sveltejs/kit": "^2.8.1",
63
64
  "@sveltejs/package": "^2.3.7",
64
- "@sveltejs/vite-plugin-svelte": "^4.0.0",
65
+ "@sveltejs/vite-plugin-svelte": "^4.0.1",
65
66
  "@testing-library/jest-dom": "^6.6.3",
66
67
  "@testing-library/svelte": "^5.2.4",
67
68
  "@testing-library/user-event": "^14.5.2",
68
- "@types/node": "^22.8.7",
69
- "@typescript-eslint/eslint-plugin": "^8.13.0",
70
- "@typescript-eslint/parser": "^8.13.0",
71
- "@vitest/coverage-v8": "^2.1.4",
72
- "eslint": "^9.14.0",
69
+ "@types/node": "^22.9.0",
70
+ "@typescript-eslint/eslint-plugin": "^8.14.0",
71
+ "@typescript-eslint/parser": "^8.14.0",
72
+ "@vitest/coverage-v8": "^2.1.5",
73
+ "eslint": "^9.15.0",
73
74
  "eslint-config-prettier": "^9.1.0",
74
75
  "eslint-plugin-svelte": "^2.46.0",
75
76
  "globals": "^15.12.0",
76
77
  "jsdom": "^25.0.1",
77
78
  "prettier": "^3.3.3",
78
79
  "prettier-plugin-organize-imports": "^4.1.0",
79
- "prettier-plugin-svelte": "^3.2.7",
80
+ "prettier-plugin-svelte": "^3.2.8",
80
81
  "prettier-plugin-tailwindcss": "^0.6.8",
81
82
  "publint": "^0.2.12",
82
- "svelte": "^5.1.9",
83
- "svelte-check": "^4.0.5",
83
+ "svelte": "^5.2.2",
84
+ "svelte-check": "^4.0.9",
84
85
  "typescript": "^5.6.3",
85
- "vite": "^5.4.10",
86
- "vitest": "^2.1.4"
86
+ "vite": "^5.4.11",
87
+ "vitest": "^2.1.5"
87
88
  },
88
89
  "overrides": {
89
90
  "@sveltejs/kit": {
90
91
  "cookie": "^0.7.0"
91
92
  }
92
93
  }
93
- }
94
+ }
@@ -1,9 +0,0 @@
1
- <script lang="ts">
2
- interface Props {
3
- text: string
4
- }
5
-
6
- const { text }: Props = $props()
7
- </script>
8
-
9
- {@html text}
@@ -1,4 +0,0 @@
1
- declare const Html: import("svelte").Component<{
2
- text: string;
3
- }, {}, "">;
4
- export default Html;