@humanspeak/svelte-markdown 0.6.0 → 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.
- package/dist/SvelteMarkdown.svelte +1 -1
- package/dist/SvelteMarkdown.svelte.d.ts +6 -4
- package/dist/renderers/Blockquote.svelte.d.ts +4 -3
- package/dist/renderers/Br.svelte.d.ts +4 -3
- package/dist/renderers/Code.svelte.d.ts +3 -2
- package/dist/renderers/Codespan.svelte.d.ts +3 -2
- package/dist/renderers/Del.svelte.d.ts +4 -3
- package/dist/renderers/Em.svelte.d.ts +4 -3
- package/dist/renderers/Heading.svelte.d.ts +5 -4
- package/dist/renderers/Image.svelte.d.ts +3 -2
- package/dist/renderers/Link.svelte.d.ts +4 -3
- package/dist/renderers/List.svelte.d.ts +4 -3
- package/dist/renderers/ListItem.svelte.d.ts +4 -3
- package/dist/renderers/Paragraph.svelte.d.ts +4 -3
- package/dist/renderers/Strong.svelte.d.ts +4 -3
- package/dist/renderers/Table.svelte.d.ts +4 -3
- package/dist/renderers/TableBody.svelte.d.ts +4 -3
- package/dist/renderers/TableCell.svelte.d.ts +5 -4
- package/dist/renderers/TableHead.svelte.d.ts +4 -3
- package/dist/renderers/TableRow.svelte.d.ts +4 -3
- package/dist/renderers/Text.svelte.d.ts +4 -3
- package/dist/renderers/html/index.js +110 -2
- package/dist/utils/token-cleanup.d.ts +2 -2
- package/dist/utils/token-cleanup.js +115 -51
- package/package.json +11 -10
- package/dist/renderers/html/Video.svelte +0 -12
- package/dist/renderers/html/Video.svelte.d.ts +0 -7
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
declare const SvelteMarkdown: import("svelte").Component<{
|
|
1
|
+
type Props = {
|
|
3
2
|
source: Token[] | string;
|
|
4
3
|
renderers?: Renderers;
|
|
5
4
|
options?: SvelteMarkdownOptions;
|
|
6
5
|
isInline?: boolean;
|
|
7
6
|
parsed?: (tokens: Token[] | TokensList) => void;
|
|
8
|
-
}
|
|
7
|
+
};
|
|
8
|
+
type $$ComponentProps = Props & {
|
|
9
9
|
[key: string]: unknown;
|
|
10
|
-
}
|
|
10
|
+
};
|
|
11
|
+
import { type Token, type TokensList, type SvelteMarkdownOptions, type Renderers } from './utils/markdown-parser.js';
|
|
12
|
+
declare const SvelteMarkdown: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
11
13
|
type SvelteMarkdown = ReturnType<typeof SvelteMarkdown>;
|
|
12
14
|
export default SvelteMarkdown;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
declare const Blockquote: import("svelte").Component<{
|
|
1
|
+
type Props = {
|
|
3
2
|
children?: Snippet;
|
|
4
|
-
}
|
|
3
|
+
};
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
declare const Blockquote: import("svelte").Component<Props, {}, "">;
|
|
5
6
|
type Blockquote = ReturnType<typeof Blockquote>;
|
|
6
7
|
export default Blockquote;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
declare const Br: import("svelte").Component<{
|
|
1
|
+
type Props = {
|
|
3
2
|
children?: Snippet;
|
|
4
|
-
}
|
|
3
|
+
};
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
declare const Br: import("svelte").Component<Props, {}, "">;
|
|
5
6
|
type Br = ReturnType<typeof Br>;
|
|
6
7
|
export default Br;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
declare const Del: import("svelte").Component<{
|
|
1
|
+
type Props = {
|
|
3
2
|
children?: Snippet;
|
|
4
|
-
}
|
|
3
|
+
};
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
declare const Del: import("svelte").Component<Props, {}, "">;
|
|
5
6
|
type Del = ReturnType<typeof Del>;
|
|
6
7
|
export default Del;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
declare const Em: import("svelte").Component<{
|
|
1
|
+
type Props = {
|
|
3
2
|
children?: Snippet;
|
|
4
|
-
}
|
|
3
|
+
};
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
declare const Em: import("svelte").Component<Props, {}, "">;
|
|
5
6
|
type Em = ReturnType<typeof Em>;
|
|
6
7
|
export default Em;
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
import type { SvelteMarkdownOptions } from '../utils/markdown-parser.js';
|
|
3
|
-
declare const Heading: import("svelte").Component<{
|
|
1
|
+
type Props = {
|
|
4
2
|
depth: number;
|
|
5
3
|
raw: string;
|
|
6
4
|
text: string;
|
|
7
5
|
options: SvelteMarkdownOptions;
|
|
8
6
|
slug: (val: string) => string;
|
|
9
7
|
children?: Snippet;
|
|
10
|
-
}
|
|
8
|
+
};
|
|
9
|
+
import type { Snippet } from 'svelte';
|
|
10
|
+
import type { SvelteMarkdownOptions } from '../utils/markdown-parser.js';
|
|
11
|
+
declare const Heading: import("svelte").Component<Props, {}, "">;
|
|
11
12
|
type Heading = ReturnType<typeof Heading>;
|
|
12
13
|
export default Heading;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
type Props = {
|
|
2
2
|
href?: string;
|
|
3
3
|
title?: string;
|
|
4
4
|
text?: string;
|
|
5
|
-
}
|
|
5
|
+
};
|
|
6
|
+
declare const Image: import("svelte").Component<Props, {}, "">;
|
|
6
7
|
type Image = ReturnType<typeof Image>;
|
|
7
8
|
export default Image;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
declare const Link: import("svelte").Component<{
|
|
1
|
+
type Props = {
|
|
3
2
|
href?: string;
|
|
4
3
|
title?: string;
|
|
5
4
|
children?: Snippet;
|
|
6
|
-
}
|
|
5
|
+
};
|
|
6
|
+
import type { Snippet } from 'svelte';
|
|
7
|
+
declare const Link: import("svelte").Component<Props, {}, "">;
|
|
7
8
|
type Link = ReturnType<typeof Link>;
|
|
8
9
|
export default Link;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
declare const List: import("svelte").Component<{
|
|
1
|
+
type Props = {
|
|
3
2
|
ordered?: boolean;
|
|
4
3
|
start?: number;
|
|
5
4
|
children?: Snippet;
|
|
6
|
-
}
|
|
5
|
+
};
|
|
6
|
+
import type { Snippet } from 'svelte';
|
|
7
|
+
declare const List: import("svelte").Component<Props, {}, "">;
|
|
7
8
|
type List = ReturnType<typeof List>;
|
|
8
9
|
export default List;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
declare const ListItem: import("svelte").Component<{
|
|
1
|
+
type Props = {
|
|
3
2
|
children?: Snippet;
|
|
4
|
-
}
|
|
3
|
+
};
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
declare const ListItem: import("svelte").Component<Props, {}, "">;
|
|
5
6
|
type ListItem = ReturnType<typeof ListItem>;
|
|
6
7
|
export default ListItem;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
declare const Paragraph: import("svelte").Component<{
|
|
1
|
+
type Props = {
|
|
3
2
|
children?: Snippet;
|
|
4
|
-
}
|
|
3
|
+
};
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
declare const Paragraph: import("svelte").Component<Props, {}, "">;
|
|
5
6
|
type Paragraph = ReturnType<typeof Paragraph>;
|
|
6
7
|
export default Paragraph;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
declare const Strong: import("svelte").Component<{
|
|
1
|
+
type Props = {
|
|
3
2
|
children?: Snippet;
|
|
4
|
-
}
|
|
3
|
+
};
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
declare const Strong: import("svelte").Component<Props, {}, "">;
|
|
5
6
|
type Strong = ReturnType<typeof Strong>;
|
|
6
7
|
export default Strong;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
declare const Table: import("svelte").Component<{
|
|
1
|
+
type Props = {
|
|
3
2
|
children?: Snippet;
|
|
4
|
-
}
|
|
3
|
+
};
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
declare const Table: import("svelte").Component<Props, {}, "">;
|
|
5
6
|
type Table = ReturnType<typeof Table>;
|
|
6
7
|
export default Table;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
declare const TableBody: import("svelte").Component<{
|
|
1
|
+
type Props = {
|
|
3
2
|
children?: Snippet;
|
|
4
|
-
}
|
|
3
|
+
};
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
declare const TableBody: import("svelte").Component<Props, {}, "">;
|
|
5
6
|
type TableBody = ReturnType<typeof TableBody>;
|
|
6
7
|
export default TableBody;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
declare const TableCell: import("svelte").Component<{
|
|
1
|
+
type Props = {
|
|
3
2
|
header: boolean;
|
|
4
|
-
align:
|
|
3
|
+
align: 'left' | 'center' | 'right' | 'justify' | 'char' | null | undefined;
|
|
5
4
|
children?: Snippet;
|
|
6
|
-
}
|
|
5
|
+
};
|
|
6
|
+
import type { Snippet } from 'svelte';
|
|
7
|
+
declare const TableCell: import("svelte").Component<Props, {}, "">;
|
|
7
8
|
type TableCell = ReturnType<typeof TableCell>;
|
|
8
9
|
export default TableCell;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
declare const TableHead: import("svelte").Component<{
|
|
1
|
+
type Props = {
|
|
3
2
|
children?: Snippet;
|
|
4
|
-
}
|
|
3
|
+
};
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
declare const TableHead: import("svelte").Component<Props, {}, "">;
|
|
5
6
|
type TableHead = ReturnType<typeof TableHead>;
|
|
6
7
|
export default TableHead;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
declare const TableRow: import("svelte").Component<{
|
|
1
|
+
type Props = {
|
|
3
2
|
children?: Snippet;
|
|
4
|
-
}
|
|
3
|
+
};
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
declare const TableRow: import("svelte").Component<Props, {}, "">;
|
|
5
6
|
type TableRow = ReturnType<typeof TableRow>;
|
|
6
7
|
export default TableRow;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
declare const Text: import("svelte").Component<{
|
|
1
|
+
type Props = {
|
|
3
2
|
children?: Snippet;
|
|
4
|
-
}
|
|
3
|
+
};
|
|
4
|
+
import { type Snippet } from 'svelte';
|
|
5
|
+
declare const Text: import("svelte").Component<Props, {}, "">;
|
|
5
6
|
type Text = ReturnType<typeof Text>;
|
|
6
7
|
export default Text;
|
|
@@ -1,61 +1,169 @@
|
|
|
1
1
|
import A from './A.svelte';
|
|
2
|
+
import Abbr from './Abbr.svelte';
|
|
3
|
+
import Address from './Address.svelte';
|
|
4
|
+
import Article from './Article.svelte';
|
|
5
|
+
import Aside from './Aside.svelte';
|
|
6
|
+
import Audio from './Audio.svelte';
|
|
7
|
+
import B from './B.svelte';
|
|
8
|
+
import Bdi from './Bdi.svelte';
|
|
9
|
+
import Bdo from './Bdo.svelte';
|
|
2
10
|
import Blockquote from './Blockquote.svelte';
|
|
11
|
+
import Button from './Button.svelte';
|
|
12
|
+
import Canvas from './Canvas.svelte';
|
|
13
|
+
import Cite from './Cite.svelte';
|
|
3
14
|
import Code from './Code.svelte';
|
|
15
|
+
import Datalist from './Datalist.svelte';
|
|
16
|
+
import Dd from './Dd.svelte';
|
|
4
17
|
import Del from './Del.svelte';
|
|
18
|
+
import Details from './Details.svelte';
|
|
19
|
+
import Dfn from './Dfn.svelte';
|
|
20
|
+
import Dialog from './Dialog.svelte';
|
|
21
|
+
import Div from './Div.svelte';
|
|
22
|
+
import Dl from './Dl.svelte';
|
|
23
|
+
import Dt from './Dt.svelte';
|
|
5
24
|
import Em from './Em.svelte';
|
|
25
|
+
import Embed from './Embed.svelte';
|
|
26
|
+
import Fieldset from './Fieldset.svelte';
|
|
27
|
+
import Footer from './Footer.svelte';
|
|
28
|
+
import Form from './Form.svelte';
|
|
6
29
|
import H1 from './H1.svelte';
|
|
7
30
|
import H2 from './H2.svelte';
|
|
8
31
|
import H3 from './H3.svelte';
|
|
9
32
|
import H4 from './H4.svelte';
|
|
10
33
|
import H5 from './H5.svelte';
|
|
11
34
|
import H6 from './H6.svelte';
|
|
35
|
+
import Header from './Header.svelte';
|
|
36
|
+
import Hgroup from './Hgroup.svelte';
|
|
12
37
|
import Hr from './Hr.svelte';
|
|
13
38
|
import I from './I.svelte';
|
|
39
|
+
import Iframe from './Iframe.svelte';
|
|
14
40
|
import Img from './Img.svelte';
|
|
41
|
+
import Input from './Input.svelte';
|
|
42
|
+
import Kbd from './Kbd.svelte';
|
|
43
|
+
import Label from './Label.svelte';
|
|
44
|
+
import Legend from './Legend.svelte';
|
|
15
45
|
import Li from './Li.svelte';
|
|
46
|
+
import Main from './Main.svelte';
|
|
47
|
+
import Mark from './Mark.svelte';
|
|
48
|
+
import Menu from './Menu.svelte';
|
|
49
|
+
import Meter from './Meter.svelte';
|
|
50
|
+
import Nav from './Nav.svelte';
|
|
51
|
+
import Object from './Object.svelte';
|
|
16
52
|
import Ol from './Ol.svelte';
|
|
53
|
+
import Optgroup from './Optgroup.svelte';
|
|
54
|
+
import Option from './Option.svelte';
|
|
55
|
+
import Output from './Output.svelte';
|
|
17
56
|
import P from './P.svelte';
|
|
57
|
+
import Param from './Param.svelte';
|
|
58
|
+
import Picture from './Picture.svelte';
|
|
18
59
|
import Pre from './Pre.svelte';
|
|
60
|
+
import Progress from './Progress.svelte';
|
|
61
|
+
import S from './S.svelte';
|
|
62
|
+
import Samp from './Samp.svelte';
|
|
63
|
+
import Section from './Section.svelte';
|
|
64
|
+
import Select from './Select.svelte';
|
|
65
|
+
import Small from './Small.svelte';
|
|
66
|
+
import Source from './Source.svelte';
|
|
67
|
+
import Span from './Span.svelte';
|
|
19
68
|
import Strong from './Strong.svelte';
|
|
20
69
|
import Sub from './Sub.svelte';
|
|
70
|
+
import Summary from './Summary.svelte';
|
|
21
71
|
import Sup from './Sup.svelte';
|
|
22
72
|
import Table from './Table.svelte';
|
|
23
73
|
import Tbody from './Tbody.svelte';
|
|
24
74
|
import Td from './Td.svelte';
|
|
75
|
+
import Textarea from './Textarea.svelte';
|
|
25
76
|
import Tfoot from './Tfoot.svelte';
|
|
26
77
|
import Th from './Th.svelte';
|
|
27
78
|
import Thead from './Thead.svelte';
|
|
28
79
|
import Tr from './Tr.svelte';
|
|
80
|
+
import Track from './Track.svelte';
|
|
81
|
+
import U from './U.svelte';
|
|
29
82
|
import Ul from './Ul.svelte';
|
|
83
|
+
import Var from './Var.svelte';
|
|
30
84
|
export const Html = {
|
|
31
85
|
a: A,
|
|
86
|
+
abbr: Abbr,
|
|
87
|
+
address: Address,
|
|
88
|
+
article: Article,
|
|
89
|
+
aside: Aside,
|
|
90
|
+
audio: Audio,
|
|
91
|
+
b: B,
|
|
92
|
+
bdi: Bdi,
|
|
93
|
+
bdo: Bdo,
|
|
32
94
|
blockquote: Blockquote,
|
|
95
|
+
button: Button,
|
|
96
|
+
canvas: Canvas,
|
|
97
|
+
cite: Cite,
|
|
33
98
|
code: Code,
|
|
99
|
+
datalist: Datalist,
|
|
100
|
+
dd: Dd,
|
|
34
101
|
del: Del,
|
|
102
|
+
details: Details,
|
|
103
|
+
dfn: Dfn,
|
|
104
|
+
dialog: Dialog,
|
|
105
|
+
div: Div,
|
|
106
|
+
dl: Dl,
|
|
107
|
+
dt: Dt,
|
|
35
108
|
em: Em,
|
|
109
|
+
embed: Embed,
|
|
110
|
+
fieldset: Fieldset,
|
|
111
|
+
footer: Footer,
|
|
112
|
+
form: Form,
|
|
36
113
|
h1: H1,
|
|
37
114
|
h2: H2,
|
|
38
115
|
h3: H3,
|
|
39
116
|
h4: H4,
|
|
40
117
|
h5: H5,
|
|
41
118
|
h6: H6,
|
|
119
|
+
header: Header,
|
|
120
|
+
hgroup: Hgroup,
|
|
42
121
|
hr: Hr,
|
|
43
122
|
i: I,
|
|
123
|
+
iframe: Iframe,
|
|
44
124
|
img: Img,
|
|
125
|
+
input: Input,
|
|
126
|
+
kbd: Kbd,
|
|
127
|
+
label: Label,
|
|
128
|
+
legend: Legend,
|
|
45
129
|
li: Li,
|
|
130
|
+
main: Main,
|
|
131
|
+
mark: Mark,
|
|
132
|
+
menu: Menu,
|
|
133
|
+
meter: Meter,
|
|
134
|
+
nav: Nav,
|
|
135
|
+
object: Object,
|
|
46
136
|
ol: Ol,
|
|
137
|
+
optgroup: Optgroup,
|
|
138
|
+
option: Option,
|
|
139
|
+
output: Output,
|
|
47
140
|
p: P,
|
|
141
|
+
param: Param,
|
|
142
|
+
picture: Picture,
|
|
48
143
|
pre: Pre,
|
|
144
|
+
progress: Progress,
|
|
145
|
+
s: S,
|
|
146
|
+
samp: Samp,
|
|
147
|
+
section: Section,
|
|
148
|
+
select: Select,
|
|
149
|
+
small: Small,
|
|
150
|
+
source: Source,
|
|
151
|
+
span: Span,
|
|
49
152
|
strong: Strong,
|
|
50
153
|
sub: Sub,
|
|
154
|
+
summary: Summary,
|
|
51
155
|
sup: Sup,
|
|
52
156
|
table: Table,
|
|
53
157
|
tbody: Tbody,
|
|
54
158
|
td: Td,
|
|
159
|
+
textarea: Textarea,
|
|
160
|
+
tfoot: Tfoot,
|
|
55
161
|
th: Th,
|
|
56
162
|
thead: Thead,
|
|
57
163
|
tr: Tr,
|
|
58
|
-
|
|
59
|
-
|
|
164
|
+
track: Track,
|
|
165
|
+
u: U,
|
|
166
|
+
ul: Ul,
|
|
167
|
+
var: Var
|
|
60
168
|
};
|
|
61
169
|
export default Html;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { Token
|
|
1
|
+
import type { Token } from 'marked';
|
|
2
2
|
export declare const isHtmlOpenTag: (raw: string) => {
|
|
3
3
|
tag: string;
|
|
4
4
|
isOpening: boolean;
|
|
5
5
|
} | null;
|
|
6
|
-
export declare const shrinkHtmlTokens: (tokens: Token[]
|
|
6
|
+
export declare const shrinkHtmlTokens: (tokens: Token[]) => Token[];
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Parser } from 'htmlparser2';
|
|
1
2
|
// Cache the regex pattern
|
|
2
3
|
const HTML_TAG_PATTERN = /<\/?([a-zA-Z][a-zA-Z0-9-]{0,})(?:\s+[^>]*)?>/;
|
|
3
4
|
const htmlTagRegex = new RegExp(HTML_TAG_PATTERN);
|
|
@@ -10,63 +11,126 @@ export const isHtmlOpenTag = (raw) => {
|
|
|
10
11
|
return null;
|
|
11
12
|
return { tag: match[1], isOpening: !raw.startsWith('</') };
|
|
12
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
|
+
}
|
|
13
75
|
export const shrinkHtmlTokens = (tokens) => {
|
|
14
76
|
const result = [];
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
if ('tokens' in currentToken && currentToken.tokens) {
|
|
20
|
-
currentToken.tokens = shrinkHtmlTokens(currentToken.tokens);
|
|
21
|
-
result.push(currentToken);
|
|
22
|
-
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));
|
|
23
81
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
attributes: Object.fromEntries((currentToken.raw.match(/\s+([^>]*)/)?.[1] || '')
|
|
56
|
-
.split(/\s+/)
|
|
57
|
-
.filter(Boolean)
|
|
58
|
-
.map((attr) => {
|
|
59
|
-
const [key, value] = attr.split('=');
|
|
60
|
-
return [key, value ? value.replace(/['"]/g, '') : true];
|
|
61
|
-
}))
|
|
62
|
-
});
|
|
63
|
-
// Skip ahead past the closing tag
|
|
64
|
-
i = closingIndex;
|
|
82
|
+
else {
|
|
83
|
+
result.push(token);
|
|
84
|
+
}
|
|
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);
|
|
65
113
|
continue;
|
|
66
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
|
+
});
|
|
67
126
|
}
|
|
68
127
|
}
|
|
69
|
-
|
|
128
|
+
else {
|
|
129
|
+
result.push(token);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (stack.length > 0) {
|
|
133
|
+
return tokens;
|
|
70
134
|
}
|
|
71
135
|
return result;
|
|
72
|
-
}
|
|
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.6.
|
|
4
|
+
"version": "0.6.1",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"dev": "vite dev",
|
|
7
7
|
"build": "vite build && npm run package",
|
|
@@ -53,23 +53,24 @@
|
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
55
|
"github-slugger": "^2.0.0",
|
|
56
|
+
"htmlparser2": "^9.1.0",
|
|
56
57
|
"marked": "^15.0.0"
|
|
57
58
|
},
|
|
58
59
|
"devDependencies": {
|
|
59
|
-
"@eslint/eslintrc": "^3.
|
|
60
|
-
"@eslint/js": "^9.
|
|
60
|
+
"@eslint/eslintrc": "^3.2.0",
|
|
61
|
+
"@eslint/js": "^9.15.0",
|
|
61
62
|
"@sveltejs/adapter-auto": "^3.3.1",
|
|
62
|
-
"@sveltejs/kit": "^2.8.
|
|
63
|
+
"@sveltejs/kit": "^2.8.1",
|
|
63
64
|
"@sveltejs/package": "^2.3.7",
|
|
64
|
-
"@sveltejs/vite-plugin-svelte": "^4.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
69
|
"@types/node": "^22.9.0",
|
|
69
70
|
"@typescript-eslint/eslint-plugin": "^8.14.0",
|
|
70
71
|
"@typescript-eslint/parser": "^8.14.0",
|
|
71
|
-
"@vitest/coverage-v8": "^2.1.
|
|
72
|
-
"eslint": "^9.
|
|
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",
|
|
@@ -79,11 +80,11 @@
|
|
|
79
80
|
"prettier-plugin-svelte": "^3.2.8",
|
|
80
81
|
"prettier-plugin-tailwindcss": "^0.6.8",
|
|
81
82
|
"publint": "^0.2.12",
|
|
82
|
-
"svelte": "^5.
|
|
83
|
-
"svelte-check": "^4.0.
|
|
83
|
+
"svelte": "^5.2.2",
|
|
84
|
+
"svelte-check": "^4.0.9",
|
|
84
85
|
"typescript": "^5.6.3",
|
|
85
86
|
"vite": "^5.4.11",
|
|
86
|
-
"vitest": "^2.1.
|
|
87
|
+
"vitest": "^2.1.5"
|
|
87
88
|
},
|
|
88
89
|
"overrides": {
|
|
89
90
|
"@sveltejs/kit": {
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import type { Snippet } from 'svelte'
|
|
3
|
-
|
|
4
|
-
interface Props {
|
|
5
|
-
children?: Snippet
|
|
6
|
-
attributes?: Record<string, any>
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
const { children, attributes }: Props = $props()
|
|
10
|
-
</script>
|
|
11
|
-
|
|
12
|
-
<video {...attributes}>{@render children?.()}</video>
|