Skip to content

Commit b607685

Browse files
authoredOct 30, 2024··
fix(helpers): add missing dir attribute for right-to-left languages (#357)
Co-authored-by: lihbr <lihbr@users.noreply.github.com>
1 parent 9b0c72b commit b607685

9 files changed

+115
-20
lines changed
 

‎src/lib/serializerHelpers.ts

+5
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ type Attributes = Record<string, string | boolean | null | undefined>
1515
const formatAttributes = (node: RTAnyNode, attributes: Attributes): string => {
1616
const _attributes = { ...attributes }
1717

18+
// Respect `ltr` and `rtl` direction
19+
if ("direction" in node && node.direction === "rtl") {
20+
_attributes.dir = node.direction
21+
}
22+
1823
// Add label to attributes
1924
if ("data" in node && "label" in node.data && node.data.label) {
2025
_attributes.class = _attributes.class

‎test/__fixtures__/arRichText.json

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
[
2+
{
3+
"type": "paragraph",
4+
"text": " المعروف منذ زمن طويل أن المحتوى القابل للقراءة لصفحة ما سيشتت انتباه القارئ عند النظر إلى شكلها الخارجي. والهدف من ",
5+
"spans": [
6+
{
7+
"start": 4,
8+
"end": 13,
9+
"type": "strong"
10+
},
11+
{
12+
"start": 8,
13+
"end": 11,
14+
"type": "em"
15+
},
16+
{
17+
"start": 19,
18+
"end": 23,
19+
"type": "label",
20+
"data": {
21+
"label": "label_1"
22+
}
23+
}
24+
],
25+
"direction": "rtl"
26+
},
27+
{
28+
"type": "o-list-item",
29+
"text": "طبيعي إلى حد ما للأحرف، على",
30+
"spans": [],
31+
"direction": "rtl"
32+
},
33+
{
34+
"type": "o-list-item",
35+
"text": "ر المكتبي ومحرري صفحات الوي",
36+
"spans": [],
37+
"direction": "rtl"
38+
},
39+
{
40+
"type": "o-list-item",
41+
"text": "حث عن نص لوريم إيبسوم إلى",
42+
"spans": [],
43+
"direction": "rtl"
44+
},
45+
{
46+
"type": "paragraph",
47+
"text": "إيبسوم إلى اكتشاف العديد من المواقع الإلكترونية التي لا تزال في مهدها. تطورت إصدارات مختلفة على مر السنين، أحيانًا عن طريق الصدفة، وأحيانًا عن عمد (إدخال الفكاهة وما شابه ذلك).",
48+
"spans": [
49+
{
50+
"start": 30,
51+
"end": 41,
52+
"type": "hyperlink",
53+
"data": {
54+
"id": "YCiUyRUAACQAxfZK",
55+
"type": "kitchen_sink",
56+
"tags": [],
57+
"slug": "home",
58+
"lang": "en-us",
59+
"uid": "home",
60+
"link_type": "Document",
61+
"isBroken": false
62+
}
63+
}
64+
],
65+
"direction": "rtl"
66+
}
67+
]

‎test/__fixtures__/richText.ts

-9
This file was deleted.

‎test/__snapshots__/helpers-asHTML.test.ts.snap

+6-4
Large diffs are not rendered by default.

‎test/__testutils__/createRichTextFixtures.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import arRichTextJSON from "../__fixtures__/arRichText.json"
12
import cnRichTextJSON from "../__fixtures__/cnRichText.json"
23
import emojiRichTextJSON from "../__fixtures__/emojiRichText.json"
34
import enRichTextJSON from "../__fixtures__/enRichText.json"
@@ -12,11 +13,12 @@ const deepCloneJSON = <T>(json: T): T => {
1213
}
1314

1415
export const createRichTextFixtures = (): Record<
15-
"en" | "cn" | "ko" | "emoji" | "overlapped" | "xss",
16+
"en" | "ar" | "cn" | "ko" | "emoji" | "overlapped" | "xss",
1617
RichTextField
1718
> => {
1819
return {
1920
en: deepCloneJSON(enRichTextJSON) as RichTextField,
21+
ar: deepCloneJSON(arRichTextJSON) as RichTextField,
2022
cn: deepCloneJSON(cnRichTextJSON) as RichTextField,
2123
ko: deepCloneJSON(koRichTextJSON) as RichTextField,
2224
emoji: deepCloneJSON(emojiRichTextJSON) as RichTextField,

‎test/helpers-asHTML.test.ts

+6
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,12 @@ it("includes target attribute on links with a target value", () => {
138138
)
139139
})
140140

141+
it("includes `dir` attribute on right-to-left languages", () => {
142+
const richTextFixtures = createRichTextFixtures()
143+
144+
expect(asHTML(richTextFixtures.ar, { linkResolver })).toMatchSnapshot()
145+
})
146+
141147
it("returns null for nullish inputs", () => {
142148
expect(asHTML(null)).toBeNull()
143149
expect(asHTML(undefined)).toBeNull()

‎test/helpers-asText.test.ts

+10-6
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import { expect, it } from "vitest"
22

3-
import { richTextFixture } from "./__fixtures__/richText"
3+
import { createRichTextFixtures } from "./__testutils__/createRichTextFixtures"
44

55
import { asText } from "../src"
66
import { asText as richTextAsText } from "../src/richtext"
77

88
it("is an alias for @prismicio/client/richtext's `asText` function for non-nullish inputs", () => {
9-
expect(asText(richTextFixture.en)).toBe(richTextAsText(richTextFixture.en))
9+
const richTextFixtures = createRichTextFixtures()
10+
11+
expect(asText(richTextFixtures.en)).toBe(richTextAsText(richTextFixtures.en))
1012
})
1113

1214
it("returns null for nullish inputs", () => {
@@ -15,12 +17,14 @@ it("returns null for nullish inputs", () => {
1517
})
1618

1719
it("supports separator configuration", () => {
18-
expect(asText(richTextFixture.en, { separator: "__separator__" })).toBe(
19-
richTextAsText(richTextFixture.en, "__separator__"),
20+
const richTextFixtures = createRichTextFixtures()
21+
22+
expect(asText(richTextFixtures.en, { separator: "__separator__" })).toBe(
23+
richTextAsText(richTextFixtures.en, "__separator__"),
2024
)
2125

2226
// TODO: Remove when we remove support for deprecated tuple-style configuration.
23-
expect(asText(richTextFixture.en, "__separator__")).toBe(
24-
richTextAsText(richTextFixture.en, "__separator__"),
27+
expect(asText(richTextFixtures.en, "__separator__")).toBe(
28+
richTextAsText(richTextFixtures.en, "__separator__"),
2529
)
2630
})

‎test/richtext/__snapshots__/serialize.test.ts.snap

+16
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,21 @@
11
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
22

3+
exports[`handles Arabic characters correctly 1`] = `
4+
[
5+
"<p> الم<strong>عروف<em> من</em>ذ </strong>زمن طو<span class="label_1">يل أ</span>ن المحتوى القابل للقراءة لصفحة ما سيشتت انتباه القارئ عند النظر إلى شكلها الخارجي. والهدف من </p>",
6+
"<ol><li>طبيعي إلى حد ما للأحرف، على</li><li>ر المكتبي ومحرري صفحات الوي</li><li>حث عن نص لوريم إيبسوم إلى</li></ol>",
7+
"<p>إيبسوم إلى اكتشاف العديد من ال<a href="linkResolver(YCiUyRUAACQAxfZK)">مواقع الإلك</a>ترونية التي لا تزال في مهدها. تطورت إصدارات مختلفة على مر السنين، أحيانًا عن طريق الصدفة، وأحيانًا عن عمد (إدخال الفكاهة وما شابه ذلك).</p>",
8+
]
9+
`;
10+
11+
exports[`handles Arabic characters correctly 2`] = `
12+
[
13+
"<p> الم<strong>عروف<em> من</em>ذ </strong>زمن طو<span class="label_1">يل أ</span>ن المحتوى القابل للقراءة لصفحة ما سيشتت انتباه القارئ عند النظر إلى شكلها الخارجي. والهدف من </p>",
14+
"<ol><li>طبيعي إلى حد ما للأحرف، على</li><li>ر المكتبي ومحرري صفحات الوي</li><li>حث عن نص لوريم إيبسوم إلى</li></ol>",
15+
"<p>إيبسوم إلى اكتشاف العديد من ال<a href="linkResolver(YCiUyRUAACQAxfZK)">مواقع الإلك</a>ترونية التي لا تزال في مهدها. تطورت إصدارات مختلفة على مر السنين، أحيانًا عن طريق الصدفة، وأحيانًا عن عمد (إدخال الفكاهة وما شابه ذلك).</p>",
16+
]
17+
`;
18+
319
exports[`handles Chinese characters correctly 1`] = `
420
[
521
"<p>得辞<strong>象今歓<em>予板</em>聞所詐上</strong>修戸間。比保広社配術工務庫載水設応氷諸書評</p>",

‎test/richtext/serialize.test.ts

+2
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ it(
3131
serializeMacro("en"),
3232
)
3333

34+
it("handles Arabic characters correctly", serializeMacro("ar"))
35+
3436
it("handles Chinese characters correctly", serializeMacro("cn"))
3537

3638
it("handles Korean characters correctly", serializeMacro("ko"))

0 commit comments

Comments
 (0)
Please sign in to comment.