@intlayer/docs 8.10.0-canary.0 → 8.10.0-canary.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/docs/ar/dictionary/markdown.md +402 -82
- package/docs/de/dictionary/markdown.md +269 -98
- package/docs/en/dictionary/markdown.md +221 -25
- package/docs/en-GB/dictionary/markdown.md +351 -67
- package/docs/es/dictionary/markdown.md +286 -115
- package/docs/fr/dictionary/markdown.md +292 -121
- package/docs/hi/dictionary/markdown.md +366 -81
- package/docs/id/dictionary/markdown.md +368 -83
- package/docs/it/dictionary/markdown.md +288 -122
- package/docs/ko/dictionary/markdown.md +297 -126
- package/docs/pl/dictionary/markdown.md +276 -106
- package/docs/pt/dictionary/markdown.md +276 -106
- package/docs/ru/dictionary/markdown.md +70 -505
- package/docs/tr/dictionary/markdown.md +291 -122
- package/docs/uk/dictionary/markdown.md +377 -92
- package/docs/vi/dictionary/markdown.md +377 -92
- package/docs/zh/dictionary/markdown.md +284 -117
- package/package.json +7 -7
- package/docs/ja/dictionary/markdown.md +0 -666
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
createdAt: 2025-02-07
|
|
3
3
|
updatedAt: 2026-05-19
|
|
4
4
|
title: Markdown
|
|
5
|
-
description: Tìm hiểu cách khai báo và sử dụng nội dung Markdown
|
|
5
|
+
description: Tìm hiểu cách khai báo và sử dụng nội dung Markdown trong trang web đa ngôn ngữ của bạn với Intlayer. Làm theo các bước trong tài liệu trực tuyến này để tích hợp Markdown một cách liền mạch vào dự án của bạn.
|
|
6
6
|
keywords:
|
|
7
7
|
- Markdown
|
|
8
8
|
- Quốc tế hóa
|
|
@@ -22,38 +22,38 @@ history:
|
|
|
22
22
|
changes: "Thêm hỗ trợ cho các tệp `.content.md`"
|
|
23
23
|
- version: 8.5.0
|
|
24
24
|
date: 2026-03-24
|
|
25
|
-
changes: "
|
|
25
|
+
changes: "Thêm đối tượng plugin `intlayerMarkdown`; sử dụng `app.use(intlayerMarkdown)` thay vì `app.use(installIntlayerMarkdown)`"
|
|
26
26
|
- version: 8.5.0
|
|
27
27
|
date: 2026-03-24
|
|
28
|
-
changes: "
|
|
28
|
+
changes: "Di chuyển import từ `{{framework}}-intlayer` sang `{{framework}}-intlayer/markdown`"
|
|
29
29
|
- version: 8.0.0
|
|
30
30
|
date: 2026-01-22
|
|
31
|
-
changes: "Thêm MarkdownRenderer / useMarkdownRenderer /
|
|
31
|
+
changes: "Thêm tiện ích MarkdownRenderer / useMarkdownRenderer / renderMarkdown và tùy chọn forceInline"
|
|
32
32
|
- version: 8.0.0
|
|
33
33
|
date: 2026-01-18
|
|
34
|
-
changes: "
|
|
34
|
+
changes: "Trang trí tự động nội dung markdown, hỗ trợ MDX và SSR"
|
|
35
35
|
- version: 5.5.10
|
|
36
36
|
date: 2025-06-29
|
|
37
37
|
changes: "Khởi tạo lịch sử"
|
|
38
38
|
---
|
|
39
39
|
|
|
40
|
-
# Markdown / Nội dung
|
|
40
|
+
# Markdown / Nội dung Rich Text
|
|
41
41
|
|
|
42
|
-
Intlayer hỗ trợ nội dung
|
|
42
|
+
Intlayer hỗ trợ nội dung rich text được định nghĩa bằng cú pháp Markdown. Điều này cho phép bạn dễ dàng viết và duy trì nội dung được định dạng phong phú như blog, bài viết, và hơn thế nữa.
|
|
43
43
|
|
|
44
|
-
## Khai báo
|
|
44
|
+
## Khai báo Nội dung Markdown
|
|
45
45
|
|
|
46
|
-
Bạn có thể khai báo nội dung Markdown bằng hàm `md` hoặc đơn giản là một chuỗi (nếu nó chứa cú pháp Markdown).
|
|
46
|
+
Bạn có thể khai báo nội dung Markdown bằng cách sử dụng hàm `md` hoặc đơn giản là một chuỗi (nếu nó chứa cú pháp Markdown).
|
|
47
47
|
|
|
48
48
|
<Tabs>
|
|
49
49
|
<Tab label=".content.md" value=".content.md">
|
|
50
|
-
|
|
50
|
+
Bắt đầu từ phiên bản `8.10.0`, bạn có thể khai báo nội dung Markdown trực tiếp trong các tệp `.content.md`. Intlayer sẽ tự động phát hiện và phân tích nội dung Markdown.
|
|
51
51
|
|
|
52
|
-
```md fileName="markdown-file.
|
|
52
|
+
```md fileName="markdown-file.en.content.md"
|
|
53
53
|
---
|
|
54
54
|
key: my-markdown-content
|
|
55
55
|
description: Nội dung của tôi
|
|
56
|
-
locale:
|
|
56
|
+
locale: en
|
|
57
57
|
---
|
|
58
58
|
|
|
59
59
|
# Nội dung của tôi
|
|
@@ -61,7 +61,7 @@ Bạn có thể khai báo nội dung Markdown bằng hàm `md` hoặc đơn gi
|
|
|
61
61
|
Dưới đây là một ví dụ về nội dung markdown
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
-
Trường
|
|
64
|
+
Trường front-matter `locale` là trường xác định ngôn ngữ của nội dung. Nó là tùy chọn. Nếu không được cung cấp, Intlayer sẽ sử dụng ngôn ngữ mặc định, ngôn ngữ này cũng được sử dụng làm ngôn ngữ dự phòng nếu không có bản dịch cho một ngôn ngữ cụ thể.
|
|
65
65
|
|
|
66
66
|
Ví dụ về cấu trúc tệp:
|
|
67
67
|
|
|
@@ -75,11 +75,11 @@ Bạn có thể khai báo nội dung Markdown bằng hàm `md` hoặc đơn gi
|
|
|
75
75
|
└── markdown-file.es.content.md
|
|
76
76
|
```
|
|
77
77
|
|
|
78
|
-
Bạn có thể thêm vào front-matter bất kỳ thuộc tính nào được định nghĩa trong [Định nghĩa
|
|
78
|
+
Bạn có thể thêm vào front-matter bất kỳ thuộc tính nào được định nghĩa trong [Định nghĩa Từ điển](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/dictionary/content_file.md)
|
|
79
79
|
|
|
80
80
|
</Tab>
|
|
81
|
-
<Tab label="
|
|
82
|
-
Sử dụng hàm `md` để khai báo rõ ràng nội dung Markdown. Điều này hữu ích nếu bạn muốn đảm bảo một chuỗi được
|
|
81
|
+
<Tab label="Bao bọc Thủ công" value="manual-wrapping">
|
|
82
|
+
Sử dụng hàm `md` để khai báo rõ ràng nội dung Markdown. Điều này rất hữu ích nếu bạn muốn đảm bảo một chuỗi được xử lý như Markdown ngay cả khi nó không chứa cú pháp rõ ràng.
|
|
83
83
|
|
|
84
84
|
```typescript fileName="markdownDictionary.content.ts"
|
|
85
85
|
import { md, type Dictionary } from "intlayer";
|
|
@@ -87,7 +87,7 @@ Bạn có thể khai báo nội dung Markdown bằng hàm `md` hoặc đơn gi
|
|
|
87
87
|
const markdownDictionary = {
|
|
88
88
|
key: "app",
|
|
89
89
|
content: {
|
|
90
|
-
myMarkdownContent: md("##
|
|
90
|
+
myMarkdownContent: md("## Tiêu đề của tôi \n\nLorem Ipsum"),
|
|
91
91
|
},
|
|
92
92
|
} satisfies Dictionary;
|
|
93
93
|
|
|
@@ -95,22 +95,23 @@ Bạn có thể khai báo nội dung Markdown bằng hàm `md` hoặc đơn gi
|
|
|
95
95
|
```
|
|
96
96
|
|
|
97
97
|
</Tab>
|
|
98
|
-
<Tab label="Phát hiện
|
|
99
|
-
Nếu chuỗi chứa các
|
|
98
|
+
<Tab label="Phát hiện Tự động" value="automatic-detection">
|
|
99
|
+
Nếu chuỗi chứa các chỉ báo Markdown phổ biến (như tiêu đề, danh sách, liên kết, v.v.), Intlayer sẽ tự động chuyển đổi nó.
|
|
100
100
|
|
|
101
101
|
```typescript fileName="markdownDictionary.content.ts"
|
|
102
102
|
export default {
|
|
103
103
|
key: "app",
|
|
104
|
-
contentAutoTransformation: true, // Bật
|
|
104
|
+
contentAutoTransformation: true, // Bật phát hiện tự động nội dung Markdown - Có thể được đặt toàn cục trong intlayer.config.ts
|
|
105
105
|
content: {
|
|
106
|
-
myMarkdownContent: "##
|
|
106
|
+
myMarkdownContent: "## Tiêu đề của tôi \n\nLorem Ipsum",
|
|
107
107
|
},
|
|
108
108
|
};
|
|
109
109
|
```
|
|
110
110
|
|
|
111
111
|
</Tab>
|
|
112
|
-
|
|
113
|
-
|
|
112
|
+
|
|
113
|
+
<Tab label="Tệp Bên ngoài" value="external-files">
|
|
114
|
+
Nhập trực tiếp các tệp `.md` bằng cách sử dụng hàm `file`.
|
|
114
115
|
|
|
115
116
|
```typescript fileName="markdownDictionary.content.ts"
|
|
116
117
|
import { md, file, t } from "intlayer";
|
|
@@ -120,7 +121,7 @@ Bạn có thể khai báo nội dung Markdown bằng hàm `md` hoặc đơn gi
|
|
|
120
121
|
content: {
|
|
121
122
|
content: t({
|
|
122
123
|
en: md(file("./myMarkdown.en.md")),
|
|
123
|
-
|
|
124
|
+
vi: md(file("./myMarkdown.vi.md")),
|
|
124
125
|
}),
|
|
125
126
|
},
|
|
126
127
|
};
|
|
@@ -133,36 +134,72 @@ Bạn có thể khai báo nội dung Markdown bằng hàm `md` hoặc đơn gi
|
|
|
133
134
|
|
|
134
135
|
## Render Markdown
|
|
135
136
|
|
|
136
|
-
|
|
137
|
+
Intlayer cung cấp hai cách độc lập để render Markdown:
|
|
138
|
+
|
|
139
|
+
1. **Thông qua `useIntlayer`**
|
|
140
|
+
— Intlayer tự động chuyển đổi node `md` thành đầu ra nguyên bản của framework (JSX, VNode, chuỗi HTML).
|
|
141
|
+
- Frontmatter được phân tích cú pháp và hiển thị dưới dạng `.metadata`. Bạn có thể ghi đè quá trình render ở hai cấp độ — toàn cục với `MarkdownProvider` (hoặc tương đương trong framework) và cục bộ trên mỗi node bằng `.use()`. Cả hai đều có thể được kết hợp; `.use()` được ưu tiên hơn `MarkdownProvider`, và `MarkdownProvider` được ưu tiên hơn mặc định.
|
|
137
142
|
|
|
138
|
-
|
|
143
|
+
2. **Các tiện ích hỗ trợ** — `<MarkdownRenderer />`, `useMarkdownRenderer()`, và `renderMarkdown()` là các công cụ độc lập chấp nhận **chỉ các chuỗi Markdown thô**. Chúng độc lập với `useIntlayer` và không hoạt động với các node được trang trí mà nó trả về.
|
|
139
144
|
|
|
140
|
-
|
|
145
|
+
Render Markdown hỗ trợ **MDX** — sử dụng bất kỳ component JSX/framework nào bằng tên trực tiếp bên trong Markdown của bạn.
|
|
146
|
+
|
|
147
|
+
### 1. Render Tự động (thông qua `useIntlayer`)
|
|
141
148
|
|
|
142
149
|
<Tabs group="framework">
|
|
143
150
|
<Tab label="React / Next.js" value="react">
|
|
144
|
-
Các node Markdown có thể được
|
|
151
|
+
Các node Markdown có thể được render trực tiếp dưới dạng JSX.
|
|
145
152
|
|
|
146
153
|
```tsx fileName="App.tsx"
|
|
147
154
|
import { useIntlayer } from "react-intlayer";
|
|
155
|
+
import { MarkdownProvider } from "react-intlayer/markdown";
|
|
148
156
|
|
|
149
157
|
const AppContent = () => {
|
|
150
158
|
const { myMarkdownContent } = useIntlayer("app");
|
|
159
|
+
|
|
151
160
|
return <div>{myMarkdownContent}</div>;
|
|
152
161
|
};
|
|
162
|
+
|
|
163
|
+
const App = () => (
|
|
164
|
+
<MarkdownProvider
|
|
165
|
+
components={{
|
|
166
|
+
h1: ({ children }) => <h1 style={{ color: "red" }}>{children}</h1>,
|
|
167
|
+
MyButton: (props) => <button {...props} />, // Component MDX
|
|
168
|
+
}}
|
|
169
|
+
>
|
|
170
|
+
<AppContent />
|
|
171
|
+
</MarkdownProvider>
|
|
172
|
+
);
|
|
153
173
|
```
|
|
154
174
|
|
|
155
|
-
|
|
175
|
+
> Nếu không có `MarkdownProvider`, Intlayer sẽ render markdown bằng cách sử dụng trình phân tích cú pháp Markdown sang JSX mặc định.
|
|
176
|
+
|
|
177
|
+
Bạn cũng có thể cung cấp các ghi đè cục bộ cho các node cụ thể bằng phương thức `.use()`:
|
|
156
178
|
|
|
157
179
|
```tsx
|
|
158
180
|
{myMarkdownContent.use({
|
|
159
|
-
h1: ({ children }) => <h1
|
|
181
|
+
h1: ({ children }) => <h1 style={{ color: "red" }}>{children}</h1>,
|
|
160
182
|
})}
|
|
161
183
|
```
|
|
162
184
|
|
|
185
|
+
Bạn có thể lấy Markdown dưới dạng chuỗi:
|
|
186
|
+
|
|
187
|
+
```tsx
|
|
188
|
+
{myMarkdownContent.value}
|
|
189
|
+
{String(myMarkdownContent)}
|
|
190
|
+
{myMarkdownContent.toString()}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Và bạn có thể truy cập siêu dữ liệu markdown của mình như sau:
|
|
194
|
+
|
|
195
|
+
```tsx
|
|
196
|
+
{myMarkdownContent.metadata}
|
|
197
|
+
{myMarkdownContent.metadata.title}
|
|
198
|
+
```
|
|
199
|
+
|
|
163
200
|
</Tab>
|
|
164
201
|
<Tab label="Vue" value="vue">
|
|
165
|
-
Trong Vue, nội dung Markdown có thể được render bằng
|
|
202
|
+
Trong Vue, nội dung Markdown có thể được render bằng thẻ `component` tích hợp sẵn hoặc trực tiếp như một node.
|
|
166
203
|
|
|
167
204
|
```vue fileName="App.vue"
|
|
168
205
|
<script setup>
|
|
@@ -175,17 +212,83 @@ Khi bạn truy cập nội dung qua `useIntlayer`, các node Markdown đã sẵn
|
|
|
175
212
|
</template>
|
|
176
213
|
```
|
|
177
214
|
|
|
215
|
+
Cấu hình toàn cục thông qua plugin `intlayerMarkdown` (hỗ trợ các component tùy chỉnh MDX):
|
|
216
|
+
|
|
217
|
+
```ts fileName="main.ts"
|
|
218
|
+
import { intlayerMarkdown } from "vue-intlayer/markdown";
|
|
219
|
+
|
|
220
|
+
app.use(intlayerMarkdown, {
|
|
221
|
+
components: {
|
|
222
|
+
h1: (props) => h('h1', { style: { color: 'green' } }, props.children),
|
|
223
|
+
MyButton: (props) => h('button', props), // Component MDX
|
|
224
|
+
},
|
|
225
|
+
});
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
> Nếu plugin `intlayerMarkdown` không được cài đặt, Intlayer sẽ render bằng trình biên dịch mặc định.
|
|
229
|
+
|
|
230
|
+
Bạn cũng có thể cung cấp các ghi đè cục bộ cho các node cụ thể bằng phương thức `.use()`:
|
|
231
|
+
|
|
232
|
+
```vue
|
|
233
|
+
<component :is="myMarkdownContent.use({
|
|
234
|
+
h1: (props) => h('h1', { style: { color: 'red' } }, props.children),
|
|
235
|
+
})" />
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Bạn có thể lấy Markdown dưới dạng chuỗi:
|
|
239
|
+
|
|
240
|
+
```vue
|
|
241
|
+
{{ myMarkdownContent.value }}
|
|
242
|
+
{{ String(myMarkdownContent) }}
|
|
243
|
+
{{ myMarkdownContent.toString() }}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
Và bạn có thể truy cập siêu dữ liệu markdown của mình như sau:
|
|
247
|
+
|
|
248
|
+
```vue
|
|
249
|
+
<component :is="myMarkdownContent.metadata" />
|
|
250
|
+
<component :is="myMarkdownContent.metadata.title" />
|
|
251
|
+
```
|
|
252
|
+
|
|
178
253
|
</Tab>
|
|
179
254
|
<Tab label="Svelte" value="svelte">
|
|
180
|
-
Svelte render Markdown
|
|
255
|
+
Svelte render Markdown thành một chuỗi HTML theo mặc định. Sử dụng `{@html}` để render nó.
|
|
181
256
|
|
|
182
|
-
```svelte
|
|
257
|
+
```svelte fileName="App.svelte"
|
|
183
258
|
<script lang="ts">
|
|
184
259
|
import { useIntlayer } from "svelte-intlayer";
|
|
260
|
+
import { MarkdownProvider } from "svelte-intlayer/markdown";
|
|
261
|
+
import MyHeading from "./MyHeading.svelte";
|
|
262
|
+
|
|
185
263
|
const content = useIntlayer("app");
|
|
186
264
|
</script>
|
|
187
265
|
|
|
188
|
-
{
|
|
266
|
+
<MarkdownProvider components={{ h1: MyHeading }}>
|
|
267
|
+
{@html $content.myMarkdownContent}
|
|
268
|
+
</MarkdownProvider>
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
> Nếu không có `MarkdownProvider`, Intlayer sẽ render markdown bằng trình biên dịch mặc định.
|
|
272
|
+
|
|
273
|
+
Bạn cũng có thể cung cấp các ghi đè cục bộ cho các node cụ thể bằng phương thức `.use()`:
|
|
274
|
+
|
|
275
|
+
```svelte
|
|
276
|
+
{@html $content.myMarkdownContent.use({ ... })}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
Bạn có thể lấy Markdown dưới dạng chuỗi:
|
|
280
|
+
|
|
281
|
+
```svelte
|
|
282
|
+
{$content.myMarkdownContent.value}
|
|
283
|
+
{String($content.myMarkdownContent)}
|
|
284
|
+
{$content.myMarkdownContent.toString()}
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
Và bạn có thể truy cập siêu dữ liệu markdown của mình như sau:
|
|
288
|
+
|
|
289
|
+
```svelte
|
|
290
|
+
{$content.myMarkdownContent.metadata}
|
|
291
|
+
{$content.myMarkdownContent.metadata.title}
|
|
189
292
|
```
|
|
190
293
|
|
|
191
294
|
</Tab>
|
|
@@ -194,11 +297,48 @@ Khi bạn truy cập nội dung qua `useIntlayer`, các node Markdown đã sẵn
|
|
|
194
297
|
|
|
195
298
|
```tsx fileName="App.tsx"
|
|
196
299
|
import { useIntlayer } from "preact-intlayer";
|
|
300
|
+
import { MarkdownProvider } from "preact-intlayer/markdown";
|
|
197
301
|
|
|
198
302
|
const AppContent = () => {
|
|
199
303
|
const { myMarkdownContent } = useIntlayer("app");
|
|
200
304
|
return <div>{myMarkdownContent}</div>;
|
|
201
305
|
};
|
|
306
|
+
|
|
307
|
+
const App = () => (
|
|
308
|
+
<MarkdownProvider
|
|
309
|
+
components={{
|
|
310
|
+
h1: ({ children }) => <h1 style={{ color: "red" }}>{children}</h1>,
|
|
311
|
+
MyButton: (props) => <button {...props} />, // Component MDX
|
|
312
|
+
}}
|
|
313
|
+
>
|
|
314
|
+
<AppContent />
|
|
315
|
+
</MarkdownProvider>
|
|
316
|
+
);
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
> Nếu không có `MarkdownProvider`, Intlayer sẽ render markdown bằng trình phân tích cú pháp Markdown sang JSX mặc định.
|
|
320
|
+
|
|
321
|
+
Bạn cũng có thể cung cấp các ghi đè cục bộ cho các node cụ thể bằng phương thức `.use()`:
|
|
322
|
+
|
|
323
|
+
```tsx
|
|
324
|
+
{myMarkdownContent.use({
|
|
325
|
+
h1: ({ children }) => <h1 style={{ color: "red" }}>{children}</h1>,
|
|
326
|
+
})}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
Bạn có thể lấy Markdown dưới dạng chuỗi:
|
|
330
|
+
|
|
331
|
+
```tsx
|
|
332
|
+
{myMarkdownContent.value}
|
|
333
|
+
{String(myMarkdownContent)}
|
|
334
|
+
{myMarkdownContent.toString()}
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
Và bạn có thể truy cập siêu dữ liệu markdown của mình như sau:
|
|
338
|
+
|
|
339
|
+
```tsx
|
|
340
|
+
{myMarkdownContent.metadata}
|
|
341
|
+
{myMarkdownContent.metadata.title}
|
|
202
342
|
```
|
|
203
343
|
|
|
204
344
|
</Tab>
|
|
@@ -207,16 +347,53 @@ Khi bạn truy cập nội dung qua `useIntlayer`, các node Markdown đã sẵn
|
|
|
207
347
|
|
|
208
348
|
```tsx fileName="App.tsx"
|
|
209
349
|
import { useIntlayer } from "solid-intlayer";
|
|
350
|
+
import { MarkdownProvider } from "solid-intlayer/markdown";
|
|
210
351
|
|
|
211
352
|
const AppContent = () => {
|
|
212
353
|
const { myMarkdownContent } = useIntlayer("app");
|
|
213
354
|
return <div>{myMarkdownContent}</div>;
|
|
214
355
|
};
|
|
356
|
+
|
|
357
|
+
const App = () => (
|
|
358
|
+
<MarkdownProvider
|
|
359
|
+
components={{
|
|
360
|
+
h1: (props) => <h1 style={{ color: "red" }}>{props.children}</h1>,
|
|
361
|
+
MyButton: (props) => <button {...props} />, // Component MDX
|
|
362
|
+
}}
|
|
363
|
+
>
|
|
364
|
+
<AppContent />
|
|
365
|
+
</MarkdownProvider>
|
|
366
|
+
);
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
> Nếu không có `MarkdownProvider`, Intlayer sẽ render markdown bằng trình phân tích cú pháp Markdown sang JSX mặc định.
|
|
370
|
+
|
|
371
|
+
Bạn cũng có thể cung cấp các ghi đè cục bộ cho các node cụ thể bằng phương thức `.use()`:
|
|
372
|
+
|
|
373
|
+
```tsx
|
|
374
|
+
{myMarkdownContent.use({
|
|
375
|
+
h1: (props) => <h1 style={{ color: "red" }}>{props.children}</h1>,
|
|
376
|
+
})}
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
Bạn có thể lấy Markdown dưới dạng chuỗi:
|
|
380
|
+
|
|
381
|
+
```tsx
|
|
382
|
+
{myMarkdownContent.value}
|
|
383
|
+
{String(myMarkdownContent)}
|
|
384
|
+
{myMarkdownContent.toString()}
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
Và bạn có thể truy cập siêu dữ liệu markdown của mình như sau:
|
|
388
|
+
|
|
389
|
+
```tsx
|
|
390
|
+
{myMarkdownContent.metadata}
|
|
391
|
+
{myMarkdownContent.metadata.title}
|
|
215
392
|
```
|
|
216
393
|
|
|
217
394
|
</Tab>
|
|
218
395
|
<Tab label="Angular" value="angular">
|
|
219
|
-
Angular sử dụng chỉ thị `[innerHTML]` để
|
|
396
|
+
Angular sử dụng chỉ thị `[innerHTML]` để render nội dung Markdown.
|
|
220
397
|
|
|
221
398
|
```typescript fileName="app.component.ts"
|
|
222
399
|
import { Component } from "@angular/core";
|
|
@@ -231,7 +408,9 @@ Khi bạn truy cập nội dung qua `useIntlayer`, các node Markdown đã sẵn
|
|
|
231
408
|
}
|
|
232
409
|
```
|
|
233
410
|
|
|
234
|
-
|
|
411
|
+
> Nếu provider IntlayerMarkdown không được cấu hình, Intlayer sẽ render bằng trình biên dịch mặc định.
|
|
412
|
+
|
|
413
|
+
Bạn cũng có thể cung cấp các ghi đè cục bộ cho các node cụ thể bằng phương thức `.use()`:
|
|
235
414
|
|
|
236
415
|
```typescript
|
|
237
416
|
content().myMarkdownContent.use({
|
|
@@ -239,31 +418,46 @@ Khi bạn truy cập nội dung qua `useIntlayer`, các node Markdown đã sẵn
|
|
|
239
418
|
})
|
|
240
419
|
```
|
|
241
420
|
|
|
421
|
+
Bạn có thể lấy Markdown dưới dạng chuỗi:
|
|
422
|
+
|
|
423
|
+
```typescript
|
|
424
|
+
content().myMarkdownContent.value
|
|
425
|
+
String(content().myMarkdownContent)
|
|
426
|
+
content().myMarkdownContent.toString()
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
Và bạn có thể truy cập siêu dữ liệu markdown của mình như sau:
|
|
430
|
+
|
|
431
|
+
```typescript
|
|
432
|
+
content().myMarkdownContent.metadata
|
|
433
|
+
content().myMarkdownContent.metadata.title
|
|
434
|
+
```
|
|
435
|
+
|
|
242
436
|
</Tab>
|
|
243
437
|
</Tabs>
|
|
244
438
|
|
|
245
|
-
### 2.
|
|
439
|
+
### 2. Các tiện ích hỗ trợ (Chỉ Chuỗi Markdown)
|
|
246
440
|
|
|
247
|
-
|
|
441
|
+
Các tiện ích này **chỉ render các chuỗi Markdown thô** và độc lập với `useIntlayer`. Hãy sử dụng chúng khi bạn cần render Markdown từ các nguồn khác ngoài từ điển của bạn.
|
|
248
442
|
|
|
249
443
|
<Tabs group="framework">
|
|
250
444
|
<Tab label="React / Next.js" value="react">
|
|
251
445
|
|
|
252
|
-
####
|
|
446
|
+
#### Component `<MarkdownRenderer />`
|
|
253
447
|
|
|
254
|
-
|
|
448
|
+
Render một chuỗi Markdown với các tùy chọn cụ thể.
|
|
255
449
|
|
|
256
450
|
```tsx
|
|
257
451
|
import { MarkdownRenderer } from "react-intlayer/markdown";
|
|
258
452
|
|
|
259
453
|
<MarkdownRenderer forceBlock={true} tagfilter={true}>
|
|
260
|
-
{"#
|
|
454
|
+
{"# Tiêu đề của tôi"}
|
|
261
455
|
</MarkdownRenderer>
|
|
262
456
|
```
|
|
263
457
|
|
|
264
458
|
#### Hook `useMarkdownRenderer()`
|
|
265
459
|
|
|
266
|
-
|
|
460
|
+
Nhận một hàm render đã được cấu hình trước.
|
|
267
461
|
|
|
268
462
|
```tsx
|
|
269
463
|
import { useMarkdownRenderer } from "react-intlayer/markdown";
|
|
@@ -273,7 +467,7 @@ Nếu bạn cần render chuỗi Markdown thô hoặc muốn kiểm soát nhiề
|
|
|
273
467
|
components: { h1: (props) => <h1 {...props} className="custom" /> }
|
|
274
468
|
});
|
|
275
469
|
|
|
276
|
-
return renderMarkdown("#
|
|
470
|
+
return renderMarkdown("# Tiêu đề của tôi");
|
|
277
471
|
```
|
|
278
472
|
|
|
279
473
|
#### Tiện ích `renderMarkdown()`
|
|
@@ -282,13 +476,13 @@ Nếu bạn cần render chuỗi Markdown thô hoặc muốn kiểm soát nhiề
|
|
|
282
476
|
```tsx
|
|
283
477
|
import { renderMarkdown } from "react-intlayer/markdown";
|
|
284
478
|
|
|
285
|
-
const jsx = renderMarkdown("#
|
|
479
|
+
const jsx = renderMarkdown("# Tiêu đề của tôi", { forceBlock: true });
|
|
286
480
|
```
|
|
287
481
|
|
|
288
482
|
</Tab>
|
|
289
483
|
<Tab label="Vue" value="vue">
|
|
290
484
|
|
|
291
|
-
####
|
|
485
|
+
#### Component `<MarkdownRenderer />`
|
|
292
486
|
|
|
293
487
|
```vue
|
|
294
488
|
<script setup>
|
|
@@ -296,21 +490,21 @@ Nếu bạn cần render chuỗi Markdown thô hoặc muốn kiểm soát nhiề
|
|
|
296
490
|
</script>
|
|
297
491
|
|
|
298
492
|
<template>
|
|
299
|
-
<MarkdownRenderer :forceBlock="true" content="#
|
|
493
|
+
<MarkdownRenderer :forceBlock="true" content="# Tiêu đề của tôi" />
|
|
300
494
|
</template>
|
|
301
495
|
```
|
|
302
496
|
|
|
303
497
|
</Tab>
|
|
304
498
|
<Tab label="Svelte" value="svelte">
|
|
305
499
|
|
|
306
|
-
####
|
|
500
|
+
#### Component `<MarkdownRenderer />`
|
|
307
501
|
|
|
308
502
|
```svelte
|
|
309
503
|
<script lang="ts">
|
|
310
504
|
import { MarkdownRenderer } from "svelte-intlayer/markdown";
|
|
311
505
|
</script>
|
|
312
506
|
|
|
313
|
-
<MarkdownRenderer forceBlock={true} value="#
|
|
507
|
+
<MarkdownRenderer forceBlock={true} value="# Tiêu đề của tôi" />
|
|
314
508
|
```
|
|
315
509
|
|
|
316
510
|
#### Hook `useMarkdownRenderer()`
|
|
@@ -321,7 +515,7 @@ Nếu bạn cần render chuỗi Markdown thô hoặc muốn kiểm soát nhiề
|
|
|
321
515
|
const render = useMarkdownRenderer();
|
|
322
516
|
</script>
|
|
323
517
|
|
|
324
|
-
{@html render("#
|
|
518
|
+
{@html render("# Tiêu đề của tôi")}
|
|
325
519
|
```
|
|
326
520
|
|
|
327
521
|
#### Tiện ích `renderMarkdown()`
|
|
@@ -331,18 +525,18 @@ Nếu bạn cần render chuỗi Markdown thô hoặc muốn kiểm soát nhiề
|
|
|
331
525
|
import { renderMarkdown } from "svelte-intlayer/markdown";
|
|
332
526
|
</script>
|
|
333
527
|
|
|
334
|
-
{@html renderMarkdown("#
|
|
528
|
+
{@html renderMarkdown("# Tiêu đề của tôi")}
|
|
335
529
|
```
|
|
336
530
|
|
|
337
531
|
</Tab>
|
|
338
532
|
<Tab label="Preact" value="preact">
|
|
339
|
-
####
|
|
533
|
+
#### Component `<MarkdownRenderer />`
|
|
340
534
|
|
|
341
535
|
```tsx
|
|
342
536
|
import { MarkdownRenderer } from "preact-intlayer/markdown";
|
|
343
537
|
|
|
344
538
|
<MarkdownRenderer forceBlock={true}>
|
|
345
|
-
{"#
|
|
539
|
+
{"# Tiêu đề của tôi"}
|
|
346
540
|
</MarkdownRenderer>
|
|
347
541
|
```
|
|
348
542
|
|
|
@@ -353,7 +547,7 @@ Nếu bạn cần render chuỗi Markdown thô hoặc muốn kiểm soát nhiề
|
|
|
353
547
|
|
|
354
548
|
const render = useMarkdownRenderer();
|
|
355
549
|
|
|
356
|
-
return <div>{render("#
|
|
550
|
+
return <div>{render("# Tiêu đề của tôi")}</div>;
|
|
357
551
|
```
|
|
358
552
|
|
|
359
553
|
#### Tiện ích `renderMarkdown()`
|
|
@@ -361,18 +555,18 @@ Nếu bạn cần render chuỗi Markdown thô hoặc muốn kiểm soát nhiề
|
|
|
361
555
|
```tsx
|
|
362
556
|
import { renderMarkdown } from "preact-intlayer/markdown";
|
|
363
557
|
|
|
364
|
-
return <div>{renderMarkdown("#
|
|
558
|
+
return <div>{renderMarkdown("# Tiêu đề của tôi")}</div>;
|
|
365
559
|
```
|
|
366
560
|
|
|
367
561
|
</Tab>
|
|
368
562
|
<Tab label="Solid" value="solid">
|
|
369
|
-
####
|
|
563
|
+
#### Component `<MarkdownRenderer />`
|
|
370
564
|
|
|
371
565
|
```tsx
|
|
372
566
|
import { MarkdownRenderer } from "solid-intlayer/markdown";
|
|
373
567
|
|
|
374
568
|
<MarkdownRenderer forceBlock={true}>
|
|
375
|
-
{"#
|
|
569
|
+
{"# Tiêu đề của tôi"}
|
|
376
570
|
</MarkdownRenderer>
|
|
377
571
|
```
|
|
378
572
|
|
|
@@ -383,7 +577,7 @@ Nếu bạn cần render chuỗi Markdown thô hoặc muốn kiểm soát nhiề
|
|
|
383
577
|
|
|
384
578
|
const render = useMarkdownRenderer();
|
|
385
579
|
|
|
386
|
-
return <div>{render("#
|
|
580
|
+
return <div>{render("# Tiêu đề của tôi")}</div>;
|
|
387
581
|
```
|
|
388
582
|
|
|
389
583
|
#### Tiện ích `renderMarkdown()`
|
|
@@ -391,16 +585,16 @@ Nếu bạn cần render chuỗi Markdown thô hoặc muốn kiểm soát nhiề
|
|
|
391
585
|
```tsx
|
|
392
586
|
import { renderMarkdown } from "solid-intlayer/markdown";
|
|
393
587
|
|
|
394
|
-
return <div>{renderMarkdown("#
|
|
588
|
+
return <div>{renderMarkdown("# Tiêu đề của tôi")}</div>;
|
|
395
589
|
```
|
|
396
590
|
|
|
397
591
|
</Tab>
|
|
398
592
|
<Tab label="Angular" value="angular">
|
|
399
|
-
####
|
|
400
|
-
Render một chuỗi Markdown
|
|
593
|
+
#### Service `IntlayerMarkdownService`
|
|
594
|
+
Render một chuỗi Markdown sử dụng service.
|
|
401
595
|
|
|
402
596
|
```typescript
|
|
403
|
-
import { IntlayerMarkdownService } from "angular-intlayer";
|
|
597
|
+
import { IntlayerMarkdownService } from "angular-intlayer/markdown";
|
|
404
598
|
|
|
405
599
|
export class MyComponent {
|
|
406
600
|
constructor(private markdownService: IntlayerMarkdownService) {}
|
|
@@ -416,9 +610,9 @@ Nếu bạn cần render chuỗi Markdown thô hoặc muốn kiểm soát nhiề
|
|
|
416
610
|
|
|
417
611
|
---
|
|
418
612
|
|
|
419
|
-
## Cấu hình
|
|
613
|
+
## Cấu hình Toàn cục với `MarkdownProvider`
|
|
420
614
|
|
|
421
|
-
|
|
615
|
+
`MarkdownProvider` (hoặc tương đương trong framework) cấu hình pipeline render Markdown cho toàn bộ ứng dụng của bạn. Điều này áp dụng cho cả render `useIntlayer` tự động và các tiện ích hỗ trợ. Các tùy chọn được đặt ở đây là mặc định — `.use()` sẽ ghi đè chúng ở cấp độ node.
|
|
422
616
|
|
|
423
617
|
<Tabs group="framework">
|
|
424
618
|
<Tab label="React / Next.js" value="react">
|
|
@@ -429,8 +623,28 @@ Bạn có thể cấu hình cách render Markdown ở mức toàn cục cho toà
|
|
|
429
623
|
export const AppProvider = ({ children }) => (
|
|
430
624
|
<MarkdownProvider
|
|
431
625
|
components={{
|
|
432
|
-
h1: (
|
|
433
|
-
a: ({ href,
|
|
626
|
+
h1: (props) => <h1 style={{color: 'green'}} {...props} />,
|
|
627
|
+
a: ({ href, ...props }) => <a style={{color: 'red'}} {...props} />,
|
|
628
|
+
MyCustomJSXComponent: (props) => <span style={{color: 'red'}} {...props} />,
|
|
629
|
+
}}
|
|
630
|
+
>
|
|
631
|
+
{children}
|
|
632
|
+
</MarkdownProvider>
|
|
633
|
+
);
|
|
634
|
+
```
|
|
635
|
+
|
|
636
|
+
> Hỗ trợ MDX — bất kỳ tên component nào được sử dụng bên trong Markdown của bạn (ví dụ: `<MyCustomJSXComponent />`) đều được phân giải dựa trên bản đồ `components`.
|
|
637
|
+
|
|
638
|
+
Bạn cũng có thể sử dụng trình render markdown của riêng mình:
|
|
639
|
+
|
|
640
|
+
```tsx fileName="AppProvider.tsx"
|
|
641
|
+
import { MarkdownProvider } from "react-intlayer/markdown";
|
|
642
|
+
|
|
643
|
+
export const AppProvider = ({ children }) => (
|
|
644
|
+
<MarkdownProvider
|
|
645
|
+
renderMarkdown={async (md) => {
|
|
646
|
+
const { renderMarkdown } = await import('react-intlayer/markdown');
|
|
647
|
+
return renderMarkdown(md);
|
|
434
648
|
}}
|
|
435
649
|
>
|
|
436
650
|
{children}
|
|
@@ -438,6 +652,8 @@ Bạn có thể cấu hình cách render Markdown ở mức toàn cục cho toà
|
|
|
438
652
|
);
|
|
439
653
|
```
|
|
440
654
|
|
|
655
|
+
> Việc nhập trình render Markdown của bạn một cách động là một cách tuyệt vời để giảm dung lượng bundle của ứng dụng.
|
|
656
|
+
|
|
441
657
|
</Tab>
|
|
442
658
|
<Tab label="Vue" value="vue">
|
|
443
659
|
|
|
@@ -463,6 +679,29 @@ Bạn có thể cấu hình cách render Markdown ở mức toàn cục cho toà
|
|
|
463
679
|
app.mount("#app");
|
|
464
680
|
```
|
|
465
681
|
|
|
682
|
+
Bạn cũng có thể sử dụng trình render markdown của riêng mình:
|
|
683
|
+
|
|
684
|
+
```typescript fileName="main.ts"
|
|
685
|
+
import { createApp } from "vue";
|
|
686
|
+
import { intlayer } from "vue-intlayer";
|
|
687
|
+
import { intlayerMarkdown } from "vue-intlayer/markdown";
|
|
688
|
+
import App from "./App.vue";
|
|
689
|
+
|
|
690
|
+
const app = createApp(App);
|
|
691
|
+
|
|
692
|
+
app.use(intlayer);
|
|
693
|
+
app.use(intlayerMarkdown, {
|
|
694
|
+
renderMarkdown: async (md) => {
|
|
695
|
+
const { renderMarkdown } = await import('vue-intlayer/markdown');
|
|
696
|
+
return renderMarkdown(md);
|
|
697
|
+
},
|
|
698
|
+
});
|
|
699
|
+
|
|
700
|
+
app.mount("#app");
|
|
701
|
+
```
|
|
702
|
+
|
|
703
|
+
> Việc nhập trình render Markdown của bạn một cách động là một cách tuyệt vời để giảm dung lượng bundle của ứng dụng.
|
|
704
|
+
|
|
466
705
|
</Tab>
|
|
467
706
|
<Tab label="Svelte" value="svelte">
|
|
468
707
|
|
|
@@ -481,6 +720,25 @@ Bạn có thể cấu hình cách render Markdown ở mức toàn cục cho toà
|
|
|
481
720
|
</MarkdownProvider>
|
|
482
721
|
```
|
|
483
722
|
|
|
723
|
+
Bạn cũng có thể sử dụng trình render markdown của riêng mình:
|
|
724
|
+
|
|
725
|
+
```svelte fileName="App.svelte"
|
|
726
|
+
<script lang="ts">
|
|
727
|
+
import { MarkdownProvider } from "svelte-intlayer/markdown";
|
|
728
|
+
</script>
|
|
729
|
+
|
|
730
|
+
<MarkdownProvider
|
|
731
|
+
renderMarkdown={async (md) => {
|
|
732
|
+
const { renderMarkdown } = await import('svelte-intlayer/markdown');
|
|
733
|
+
return renderMarkdown(md);
|
|
734
|
+
}}
|
|
735
|
+
>
|
|
736
|
+
<slot />
|
|
737
|
+
</MarkdownProvider>
|
|
738
|
+
```
|
|
739
|
+
|
|
740
|
+
> Việc nhập trình render Markdown của bạn một cách động là một cách tuyệt vời để giảm dung lượng bundle của ứng dụng.
|
|
741
|
+
|
|
484
742
|
</Tab>
|
|
485
743
|
<Tab label="Preact" value="preact">
|
|
486
744
|
|
|
@@ -498,6 +756,25 @@ Bạn có thể cấu hình cách render Markdown ở mức toàn cục cho toà
|
|
|
498
756
|
);
|
|
499
757
|
```
|
|
500
758
|
|
|
759
|
+
Bạn cũng có thể sử dụng trình render markdown của riêng mình:
|
|
760
|
+
|
|
761
|
+
```tsx fileName="AppProvider.tsx"
|
|
762
|
+
import { MarkdownProvider } from "preact-intlayer/markdown";
|
|
763
|
+
|
|
764
|
+
export const AppProvider = ({ children }) => (
|
|
765
|
+
<MarkdownProvider
|
|
766
|
+
renderMarkdown={async (md) => {
|
|
767
|
+
const { renderMarkdown } = await import('preact-intlayer/markdown');
|
|
768
|
+
return renderMarkdown(md);
|
|
769
|
+
}}
|
|
770
|
+
>
|
|
771
|
+
{children}
|
|
772
|
+
</MarkdownProvider>
|
|
773
|
+
);
|
|
774
|
+
```
|
|
775
|
+
|
|
776
|
+
> Việc nhập trình render Markdown của bạn một cách động là một cách tuyệt vời để giảm dung lượng bundle của ứng dụng.
|
|
777
|
+
|
|
501
778
|
</Tab>
|
|
502
779
|
<Tab label="Solid" value="solid">
|
|
503
780
|
|
|
@@ -515,38 +792,46 @@ Bạn có thể cấu hình cách render Markdown ở mức toàn cục cho toà
|
|
|
515
792
|
);
|
|
516
793
|
```
|
|
517
794
|
|
|
518
|
-
|
|
519
|
-
<Tab label="Angular" value="angular">
|
|
795
|
+
Bạn cũng có thể sử dụng trình render markdown của riêng mình:
|
|
520
796
|
|
|
521
|
-
```
|
|
522
|
-
import {
|
|
797
|
+
```tsx fileName="AppProvider.tsx"
|
|
798
|
+
import { MarkdownProvider } from "solid-intlayer/markdown";
|
|
523
799
|
|
|
524
|
-
export const
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
800
|
+
export const AppProvider = (props) => (
|
|
801
|
+
<MarkdownProvider
|
|
802
|
+
renderMarkdown={async (md) => {
|
|
803
|
+
const { renderMarkdown } = await import('solid-intlayer/markdown');
|
|
804
|
+
return renderMarkdown(md);
|
|
805
|
+
}}
|
|
806
|
+
>
|
|
807
|
+
{props.children}
|
|
808
|
+
</MarkdownProvider>
|
|
809
|
+
);
|
|
533
810
|
```
|
|
534
811
|
|
|
535
|
-
|
|
536
|
-
</Tabs>
|
|
812
|
+
> Việc nhập trình render Markdown của bạn một cách động là một cách tuyệt vời để giảm dung lượng bundle của ứng dụng.
|
|
537
813
|
|
|
538
|
-
|
|
814
|
+
</Tab>
|
|
815
|
+
<Tab label="Angular" value="angular">
|
|
539
816
|
|
|
540
|
-
|
|
817
|
+
```typescript fileName="app.module.ts"
|
|
818
|
+
import { NgModule } from '@angular/core';
|
|
819
|
+
import { IntlayerMarkdownModule } from 'angular-intlayer/markdown';
|
|
820
|
+
|
|
821
|
+
@NgModule({
|
|
822
|
+
imports: [
|
|
823
|
+
IntlayerMarkdownModule.forRoot({
|
|
824
|
+
renderMarkdown: async (md) => {
|
|
825
|
+
const { renderMarkdown } = await import('angular-intlayer/markdown');
|
|
826
|
+
return renderMarkdown(md);
|
|
827
|
+
}
|
|
828
|
+
})
|
|
829
|
+
]
|
|
830
|
+
})
|
|
831
|
+
export class AppModule {}
|
|
832
|
+
```
|
|
541
833
|
|
|
542
|
-
|
|
834
|
+
> Việc nhập trình render Markdown của bạn một cách động là một cách tuyệt vời để giảm dung lượng bundle của ứng dụng.
|
|
543
835
|
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
| `forceBlock` | `boolean` | `false` | Buộc đầu ra được bao bọc trong một phần tử cấp khối (ví dụ: `<div>`). |
|
|
547
|
-
| `forceInline` | `boolean` | `false` | Buộc đầu ra được bao bọc trong một phần tử nội dòng (ví dụ: `<span>`). |
|
|
548
|
-
| `tagfilter` | `boolean` | `true` | Bật Bộ lọc thẻ GitHub để cải thiện bảo mật bằng cách loại bỏ các thẻ HTML nguy hiểm. |
|
|
549
|
-
| `preserveFrontmatter` | `boolean` | `false` | Nếu `true`, frontmatter ở đầu chuỗi Markdown sẽ không bị loại bỏ. |
|
|
550
|
-
| `components` | `Overrides` | `{}` | Một bản đồ các thẻ HTML tới các component tùy chỉnh (ví dụ: `{ h1: MyHeading }`). |
|
|
551
|
-
| `wrapper` | `Component` | `null` | Một component tùy chỉnh để bao bọc Markdown đã render. |
|
|
552
|
-
| `renderMarkdown` | `Function` | `null` | Một hàm render tùy chỉnh để thay thế hoàn toàn bộ biên dịch Markdown mặc định. |
|
|
836
|
+
</Tab>
|
|
837
|
+
</Tabs>
|