+1
-1
lib/utils.ts
+1
-1
lib/utils.ts
+189
tests/parse-blocks.test.ts
+189
tests/parse-blocks.test.ts
···
1
+
import { expect, test } from "vitest";
2
+
import { parseBlocks } from "../lib/utils";
3
+
4
+
test("should correctly parse an h1 block to an h2 tag", () => {
5
+
const html = parseBlocks({
6
+
block: {
7
+
$type: "pub.leaflet.pages.linearDocument#block",
8
+
block: {
9
+
$type: "pub.leaflet.blocks.header",
10
+
level: 1,
11
+
facets: [],
12
+
plaintext: "heading 1",
13
+
},
14
+
},
15
+
did: "did:plc:qttsv4e7pu2jl3ilanfgc3zn",
16
+
});
17
+
18
+
expect(html).toMatchInlineSnapshot(`"<h2>heading 1</h2>"`);
19
+
});
20
+
21
+
test("should correctly parse an h2 block to an h3 tag", () => {
22
+
const html = parseBlocks({
23
+
block: {
24
+
$type: "pub.leaflet.pages.linearDocument#block",
25
+
block: {
26
+
$type: "pub.leaflet.blocks.header",
27
+
level: 2,
28
+
facets: [],
29
+
plaintext: "heading 2",
30
+
},
31
+
},
32
+
did: "did:plc:qttsv4e7pu2jl3ilanfgc3zn",
33
+
});
34
+
35
+
expect(html).toMatchInlineSnapshot(`"<h3>heading 2</h3>"`);
36
+
});
37
+
38
+
test("should correctly parse an h3 block to an h4 tag", () => {
39
+
const html = parseBlocks({
40
+
block: {
41
+
$type: "pub.leaflet.pages.linearDocument#block",
42
+
block: {
43
+
$type: "pub.leaflet.blocks.header",
44
+
level: 3,
45
+
facets: [],
46
+
plaintext: "heading 3",
47
+
},
48
+
},
49
+
did: "did:plc:qttsv4e7pu2jl3ilanfgc3zn",
50
+
});
51
+
52
+
expect(html).toMatchInlineSnapshot(`"<h4>heading 3</h4>"`);
53
+
});
54
+
55
+
test("should correctly parse a block with no level to an h6 tag", () => {
56
+
const html = parseBlocks({
57
+
block: {
58
+
$type: "pub.leaflet.pages.linearDocument#block",
59
+
block: {
60
+
$type: "pub.leaflet.blocks.header",
61
+
facets: [],
62
+
plaintext: "heading 6",
63
+
},
64
+
},
65
+
did: "did:plc:qttsv4e7pu2jl3ilanfgc3zn",
66
+
});
67
+
68
+
expect(html).toMatchInlineSnapshot(`"<h6>heading 6</h6>"`);
69
+
});
70
+
71
+
test("should correctly parse an unordered list block", () => {
72
+
const html = parseBlocks({
73
+
block: {
74
+
$type: "pub.leaflet.pages.linearDocument#block",
75
+
block: {
76
+
$type: "pub.leaflet.blocks.unorderedList",
77
+
children: [
78
+
{
79
+
$type: "pub.leaflet.blocks.unorderedList#listItem",
80
+
content: {
81
+
$type: "pub.leaflet.blocks.text",
82
+
facets: [
83
+
{
84
+
index: {
85
+
byteEnd: 18,
86
+
byteStart: 0,
87
+
},
88
+
features: [
89
+
{
90
+
uri: "https://pdsls.dev/",
91
+
$type: "pub.leaflet.richtext.facet#link",
92
+
},
93
+
],
94
+
},
95
+
{
96
+
index: {
97
+
byteEnd: 28,
98
+
byteStart: 22,
99
+
},
100
+
features: [
101
+
{
102
+
uri: "https://bsky.app/profile/juli.ee",
103
+
$type: "pub.leaflet.richtext.facet#link",
104
+
},
105
+
],
106
+
},
107
+
],
108
+
plaintext: "https://pdsls.dev/ by Juliet",
109
+
},
110
+
children: [],
111
+
},
112
+
{
113
+
$type: "pub.leaflet.blocks.unorderedList#listItem",
114
+
content: {
115
+
$type: "pub.leaflet.blocks.text",
116
+
facets: [
117
+
{
118
+
index: {
119
+
byteEnd: 34,
120
+
byteStart: 0,
121
+
},
122
+
features: [
123
+
{
124
+
uri: "https://github.com/mary-ext/atcute",
125
+
$type: "pub.leaflet.richtext.facet#link",
126
+
},
127
+
],
128
+
},
129
+
{
130
+
index: {
131
+
byteEnd: 42,
132
+
byteStart: 38,
133
+
},
134
+
features: [
135
+
{
136
+
uri: "https://bsky.app/profile/mary.my.id",
137
+
$type: "pub.leaflet.richtext.facet#link",
138
+
},
139
+
],
140
+
},
141
+
],
142
+
plaintext: "https://github.com/mary-ext/atcute by mary",
143
+
},
144
+
children: [],
145
+
},
146
+
{
147
+
$type: "pub.leaflet.blocks.unorderedList#listItem",
148
+
content: {
149
+
$type: "pub.leaflet.blocks.text",
150
+
facets: [
151
+
{
152
+
index: {
153
+
byteEnd: 27,
154
+
byteStart: 0,
155
+
},
156
+
features: [
157
+
{
158
+
uri: "https://www.microcosm.blue/",
159
+
$type: "pub.leaflet.richtext.facet#link",
160
+
},
161
+
],
162
+
},
163
+
{
164
+
index: {
165
+
byteEnd: 35,
166
+
byteStart: 31,
167
+
},
168
+
features: [
169
+
{
170
+
uri: "https://bsky.app/profile/bad-example.com",
171
+
$type: "pub.leaflet.richtext.facet#link",
172
+
},
173
+
],
174
+
},
175
+
],
176
+
plaintext: "https://www.microcosm.blue/ by phil",
177
+
},
178
+
children: [],
179
+
},
180
+
],
181
+
},
182
+
},
183
+
did: "did:plc:qttsv4e7pu2jl3ilanfgc3zn",
184
+
});
185
+
186
+
expect(html).toMatchInlineSnapshot(
187
+
`"<ul><li><p><a href="https://pdsls.dev/" target="_blank" rel="noopener noreferrer">https://pdsls.dev/</a> by <a href="https://bsky.app/profile/juli.ee" target="_blank" rel="noopener noreferrer">Juliet</a></p></li><li><p><a href="https://github.com/mary-ext/atcute" target="_blank" rel="noopener noreferrer">https://github.com/mary-ext/atcute</a> by <a href="https://bsky.app/profile/mary.my.id" target="_blank" rel="noopener noreferrer">mary</a></p></li><li><p><a href="https://www.microcosm.blue/" target="_blank" rel="noopener noreferrer">https://www.microcosm.blue/</a> by <a href="https://bsky.app/profile/bad-example.com" target="_blank" rel="noopener noreferrer">phil</a></p></li></ul>"`,
188
+
);
189
+
});
+114
-114
tests/parse-text-blocks.test.ts
+114
-114
tests/parse-text-blocks.test.ts
···
1
-
import { describe, expect, test } from "vitest";
1
+
import { expect, test } from "vitest";
2
2
import { parseTextBlock } from "../lib/utils";
3
3
4
-
describe("text block parsing", () => {
5
-
test("should correctly parse a text block without facets", () => {
6
-
const html = parseTextBlock({
7
-
$type: "pub.leaflet.blocks.text",
8
-
facets: [],
9
-
plaintext: "just plaintext no facets",
10
-
});
4
+
test("should correctly parse a text block without facets", () => {
5
+
const html = parseTextBlock({
6
+
$type: "pub.leaflet.blocks.text",
7
+
facets: [],
8
+
plaintext: "just plaintext no facets",
9
+
});
11
10
12
-
expect(html).toMatchInlineSnapshot(`"<p>just plaintext no facets</p>"`);
13
-
});
11
+
expect(html).toMatchInlineSnapshot(`"<p>just plaintext no facets</p>"`);
12
+
});
14
13
15
-
test("should correctly parse a text block with bolded text", () => {
16
-
const html = parseTextBlock({
17
-
$type: "pub.leaflet.blocks.text",
18
-
facets: [
19
-
{
20
-
index: {
21
-
byteEnd: 11,
22
-
byteStart: 0,
14
+
test("should correctly parse a text block with bolded text", () => {
15
+
const html = parseTextBlock({
16
+
$type: "pub.leaflet.blocks.text",
17
+
facets: [
18
+
{
19
+
index: {
20
+
byteEnd: 11,
21
+
byteStart: 0,
22
+
},
23
+
features: [
24
+
{
25
+
$type: "pub.leaflet.richtext.facet#bold",
23
26
},
24
-
features: [
25
-
{
26
-
$type: "pub.leaflet.richtext.facet#bold",
27
-
},
28
-
],
29
-
},
30
-
],
31
-
plaintext: "bolded text with some plaintext",
32
-
});
33
-
34
-
expect(html).toMatchInlineSnapshot(
35
-
`"<p><b>bolded text</b> with some plaintext</p>"`,
36
-
);
27
+
],
28
+
},
29
+
],
30
+
plaintext: "bolded text with some plaintext",
37
31
});
38
32
39
-
test("should correctly parse a text block with an inline link", () => {
40
-
const html = parseTextBlock({
41
-
$type: "pub.leaflet.blocks.text",
42
-
facets: [
43
-
{
44
-
index: {
45
-
byteEnd: 27,
46
-
byteStart: 0,
33
+
expect(html).toMatchInlineSnapshot(
34
+
`"<p><b>bolded text</b> with some plaintext</p>"`,
35
+
);
36
+
});
37
+
38
+
test("should correctly parse a text block with an inline link", () => {
39
+
const html = parseTextBlock({
40
+
$type: "pub.leaflet.blocks.text",
41
+
facets: [
42
+
{
43
+
index: {
44
+
byteEnd: 27,
45
+
byteStart: 0,
46
+
},
47
+
features: [
48
+
{
49
+
uri: "https://blacksky.community/",
50
+
$type: "pub.leaflet.richtext.facet#link",
47
51
},
48
-
features: [
49
-
{
50
-
uri: "https://blacksky.community/",
51
-
$type: "pub.leaflet.richtext.facet#link",
52
-
},
53
-
],
54
-
},
55
-
],
56
-
plaintext: "https://blacksky.community/",
57
-
});
58
-
59
-
expect(html).toMatchInlineSnapshot(
60
-
`"<p><a href="https://blacksky.community/" target="_blank" rel="noopener noreferrer">https://blacksky.community/</a></p>"`,
61
-
);
52
+
],
53
+
},
54
+
],
55
+
plaintext: "https://blacksky.community/",
62
56
});
63
57
64
-
test("should correctly parse a text block with strikethrough text", () => {
65
-
const html = parseTextBlock({
66
-
$type: "pub.leaflet.blocks.text",
67
-
facets: [
68
-
{
69
-
index: {
70
-
byteEnd: 13,
71
-
byteStart: 0,
72
-
},
73
-
features: [
74
-
{
75
-
$type: "pub.leaflet.richtext.facet#strikethrough",
76
-
},
77
-
],
58
+
expect(html).toMatchInlineSnapshot(
59
+
`"<p><a href="https://blacksky.community/" target="_blank" rel="noopener noreferrer">https://blacksky.community/</a></p>"`,
60
+
);
61
+
});
62
+
63
+
test("should correctly parse a text block with strikethrough text", () => {
64
+
const html = parseTextBlock({
65
+
$type: "pub.leaflet.blocks.text",
66
+
facets: [
67
+
{
68
+
index: {
69
+
byteEnd: 13,
70
+
byteStart: 0,
78
71
},
79
-
],
80
-
plaintext: "strikethrough text with some plaintext",
81
-
});
82
-
83
-
expect(html).toMatchInlineSnapshot(
84
-
`"<p><s>strikethrough</s> text with some plaintext</p>"`,
85
-
);
72
+
features: [
73
+
{
74
+
$type: "pub.leaflet.richtext.facet#strikethrough",
75
+
},
76
+
],
77
+
},
78
+
],
79
+
plaintext: "strikethrough text with some plaintext",
86
80
});
87
81
88
-
test("should correctly parse a text block with underlined text", () => {
89
-
const html = parseTextBlock({
90
-
$type: "pub.leaflet.blocks.text",
91
-
facets: [
92
-
{
93
-
index: {
94
-
byteEnd: 10,
95
-
byteStart: 0,
96
-
},
97
-
features: [
98
-
{
99
-
$type: "pub.leaflet.richtext.facet#underline",
100
-
},
101
-
],
102
-
},
103
-
],
104
-
plaintext: "underlined text with some plaintext",
105
-
});
82
+
expect(html).toMatchInlineSnapshot(
83
+
`"<p><s>strikethrough</s> text with some plaintext</p>"`,
84
+
);
85
+
});
106
86
107
-
expect(html).toMatchInlineSnapshot(
108
-
`"<p><span style="text-decoration:underline;">underlined</span> text with some plaintext</p>"`,
109
-
);
87
+
test("should correctly parse a text block with underlined text", () => {
88
+
const html = parseTextBlock({
89
+
$type: "pub.leaflet.blocks.text",
90
+
facets: [
91
+
{
92
+
index: {
93
+
byteEnd: 10,
94
+
byteStart: 0,
95
+
},
96
+
features: [
97
+
{
98
+
$type: "pub.leaflet.richtext.facet#underline",
99
+
},
100
+
],
101
+
},
102
+
],
103
+
plaintext: "underlined text with some plaintext",
110
104
});
111
105
112
-
test("should correctly parse a text block with italicized text", () => {
113
-
const html = parseTextBlock({
114
-
$type: "pub.leaflet.blocks.text",
115
-
facets: [
116
-
{
117
-
index: {
118
-
byteEnd: 10,
119
-
byteStart: 0,
106
+
expect(html).toMatchInlineSnapshot(
107
+
`"<p><span style="text-decoration:underline;">underlined</span> text with some plaintext</p>"`,
108
+
);
109
+
});
110
+
111
+
test("should correctly parse a text block with italicized text", () => {
112
+
const html = parseTextBlock({
113
+
$type: "pub.leaflet.blocks.text",
114
+
facets: [
115
+
{
116
+
index: {
117
+
byteEnd: 10,
118
+
byteStart: 0,
119
+
},
120
+
features: [
121
+
{
122
+
$type: "pub.leaflet.richtext.facet#italic",
120
123
},
121
-
features: [
122
-
{
123
-
$type: "pub.leaflet.richtext.facet#italic",
124
-
},
125
-
],
126
-
},
127
-
],
128
-
plaintext: "italicized text with some plaintext",
129
-
});
130
-
131
-
expect(html).toMatchInlineSnapshot(`"<p><i>italicized</i> text with some plaintext</p>"`);
124
+
],
125
+
},
126
+
],
127
+
plaintext: "italicized text with some plaintext",
132
128
});
129
+
130
+
expect(html).toMatchInlineSnapshot(
131
+
`"<p><i>italicized</i> text with some plaintext</p>"`,
132
+
);
133
133
});