Skip to content

Commit 579fee5

Browse files
committed
feat: update transformers (#1095)
1 parent 76775c5 commit 579fee5

File tree

7 files changed

+631
-35
lines changed

7 files changed

+631
-35
lines changed

README-ru.md

+2
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ const post = {
145145

146146
Список других доступных утилит можно найти в [этом разделе](https://github.com/gravity-ui/page-constructor/tree/main/src/text-transform).
147147

148+
Подробная инструкция по подготовке данных, использованию кастомных трансформеров находится в [дополнительном разделе документации](./docs/data-preparation.md).
149+
148150
### Пользователькие блоки
149151

150152
Конструктор страниц поддерживает возможность работы с блоками, определенными пользователем в его приложении. Блоки представляют собой обычные React-компоненты.

README.md

+4
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,10 @@ const post = {
146146

147147
You can find more utilities in this [section](https://github.com/gravity-ui/page-constructor/tree/main/src/text-transform)
148148

149+
### Detailed Documentation on Server Utilities and Transformers
150+
151+
For a comprehensive guide on using server utilities, including detailed explanations and advanced use cases, visit the [additional chapter on server utils usage](./docs/data-preparation.md).
152+
149153
### Custom blocks
150154

151155
The page constructor lets you use blocks that are user-defined in their app. Blocks are regular React components.

docs/data-preparation-ru.md

+257
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,257 @@
1+
# Подготовка данных
2+
3+
Документацию по серверным утилитам для преобразования контента, включая конвертацию Yandex Flavored Markdown (YFM) в HTML и обработку текста. Основные возможности:
4+
5+
- **`fullTransform`**: Преобразует контент в формате YFM в HTML с настраиваемыми параметрами.
6+
- **Утилиты**: `typografToText`, `typografToHTML` и `yfmTransformer` для обработки текста в пользовательских компонентах.
7+
- **`createItemsParser`**: Утилита для преобразования определённых полей в блоках, поддерживающая вложенные поля и массивы.
8+
9+
### Серверные утилиты
10+
11+
Пакет включает набор серверных утилит для преобразования контента.
12+
13+
```ts
14+
const {fullTransform} = require('@gravity-ui/page-constructor/server');
15+
16+
const {html} = fullTransform(content, {
17+
lang,
18+
extractTitle: true,
19+
allowHTML: true,
20+
path: __dirname,
21+
plugins,
22+
});
23+
```
24+
25+
Для преобразования Yandex Flavored Markdown в HTML используется пакет `diplodoc/transfrom`, который входит в peer-зависимости.
26+
27+
Эти утилиты можно также использовать в кастомных компонентах или других частях проекта.
28+
29+
```ts
30+
const {
31+
typografToText,
32+
typografToHTML,
33+
yfmTransformer,
34+
} = require('@gravity-ui/page-constructor/server');
35+
36+
const post = {
37+
title: typografToText(title, lang),
38+
content: typografToHTML(content, lang),
39+
description: yfmTransformer(lang, description, {plugins}),
40+
};
41+
```
42+
43+
Список других доступных утилит можно найти в [этом разделе](https://github.com/gravity-ui/page-constructor/tree/main/src/text-transform).
44+
45+
## Документация к `createItemsParser`
46+
47+
Метод `createItemsParser` — это утилита, для создания парсеров блоков. Он помогает с преобразованием определённых полей с использованием трансформера. Метод имеет опции, позволяющие указать, какие поля нужно преобразовать и как обрабатывать вложенные поля.
48+
49+
### Сигнатура метода
50+
51+
```typescript
52+
export const createItemsParser = (fields: string[]) => (transformer: Transformer, items: Item[]) => Item[];
53+
```
54+
55+
### Параметры
56+
57+
- **fields**: Массив строк, указывающих поля для преобразования. Эти поля могут быть вложенными, используя точечную нотацию (например, `'nested.field'`).
58+
- **transformer**: Функция, которая принимает строку и возвращает преобразованную строку. Эта функция будет применена к указанным полям.
59+
- **items**: Массив элементов для парсинга и преобразования. Каждый элемент может быть строкой или сложным объектом.
60+
61+
### Возвращаемое значение
62+
63+
- Возвращает массив элементов с преобразованными указанными полями с помощью функции `transformer`.
64+
65+
## Примеры использования
66+
67+
### Пример 1: Базовое использование
68+
69+
В этом примере преобразуются поля `text` и `additionalInfo` каждого элемента в массиве `items` с использованием `yfmTransformer`.
70+
71+
```typescript
72+
const config = {
73+
fields: ['items'],
74+
transformer: yfmTransformer,
75+
parser: createItemsParser(['text', 'additionalInfo']),
76+
};
77+
```
78+
79+
**Input:**
80+
81+
```json
82+
[
83+
{"text": "Hello, world!", "additionalInfo": "This is a test."},
84+
{"text": "Another item", "additionalInfo": "More info here."}
85+
]
86+
```
87+
88+
**Output:**
89+
90+
```json
91+
[
92+
{"text": "Transformed: Hello, world!", "additionalInfo": "Transformed: This is a test."},
93+
{"text": "Transformed: Another item", "additionalInfo": "Transformed: More info here."}
94+
]
95+
```
96+
97+
### Пример 2: Вложенные поля
98+
99+
В этом примере преобразуется вложенное поле `list.text` внутри каждого элемента.
100+
101+
```typescript
102+
const config = {
103+
fields: ['items'],
104+
transformer: yfmTransformer,
105+
parser: createItemsParser(['list.text']),
106+
renderInline: true,
107+
};
108+
```
109+
110+
**Input:**
111+
112+
```json
113+
[{"list": {"text": "Вложенный текст 1"}}, {"list": {"text": "Вложенный текст 2"}}]
114+
```
115+
116+
**Output:**
117+
118+
```json
119+
[
120+
{"list": {"text": "Transformed: Вложенный текст 1"}},
121+
{"list": {"text": "Transformed: Вложенный текст 2"}}
122+
]
123+
```
124+
125+
### Пример 3: Смешанные типы данных
126+
127+
В этом примере массив `items` содержит как строки, так и сложные объекты. Метод `createItemsParser` корректно обрабатывает оба типа данных.
128+
129+
```typescript
130+
const config = {
131+
fields: ['items'],
132+
transformer: yfmTransformer,
133+
parser: createItemsParser(['text', 'list.text']),
134+
};
135+
```
136+
137+
**Input:**
138+
139+
```json
140+
["Простая строка", {"text": "Текст объекта", "list": {"text": "Вложенный текст"}}]
141+
```
142+
143+
**Output:**
144+
145+
```json
146+
[
147+
"Transformed: Простая строка",
148+
{"text": "Transformed: Текст объекта", "list": {"text": "Transformed: Вложенный текст"}}
149+
]
150+
```
151+
152+
## Примечания
153+
154+
- Если поле не найдено в элементе, оно будет пропущено.
155+
- Если указано вложенное поле, но родительский объект не является объектом или не является массивом, преобразование для этого поля будет пропущено.
156+
- Метод не изменяет исходные элементы, а возвращает новый массив с преобразованными данными.
157+
158+
### Обработка вложенных массивов
159+
160+
Если вложенное поле является массивом, метод `createItemsParser` будет итерировать по каждому элементу массива и применять трансформер к указанному полю. Это особенно полезно при работе с массивами объектов, содержащими поля, которые требуют преобразования.
161+
162+
### Пример 4: Вложенное поле как массив
163+
164+
В этом примере преобразуется поле `text` внутри каждого объекта в массиве `list`, который является вложенным полем элементов `items`.
165+
166+
```typescript
167+
const config = {
168+
fields: ['items'],
169+
transformer: yfmTransformer,
170+
parser: createItemsParser(['list.text']),
171+
};
172+
```
173+
174+
**Input:**
175+
176+
```json
177+
[
178+
{
179+
"list": [{"text": "Вложенный текст 1"}, {"text": "Вложенный текст 2"}]
180+
},
181+
{
182+
"list": [{"text": "Вложенный текст 3"}, {"text": "Вложенный текст 4"}]
183+
}
184+
]
185+
```
186+
187+
**Output:**
188+
189+
```json
190+
[
191+
{
192+
"list": [{"text": "Transformed: Вложенный текст 1"}, {"text": "Transformed: Вложенный текст 2"}]
193+
},
194+
{
195+
"list": [{"text": "Transformed: Вложенный текст 3"}, {"text": "Transformed: Вложенный текст 4"}]
196+
}
197+
]
198+
```
199+
200+
## Полный пример со всеми случаями
201+
202+
Вот комплексный пример, включающий все возможные случаи: обычные поля, вложенные объекты и вложенные массивы.
203+
204+
```typescript
205+
const config = {
206+
fields: ['items'],
207+
transformer: yfmTransformer,
208+
parser: createItemsParser(['text', 'list.text', 'details.info']),
209+
};
210+
211+
const transformedItems = config.parser(config.transformer, items);
212+
```
213+
214+
**Input:**
215+
216+
```json
217+
[
218+
{
219+
"text": "Обычный текст",
220+
"list": [{"text": "Вложенный текст 1"}, {"text": "Вложенный текст 2"}],
221+
"details": {
222+
"info": "Вложенная информация"
223+
}
224+
},
225+
{
226+
"text": "Другой обычный текст",
227+
"list": {"text": "Вложенный текст 3"},
228+
"details": {
229+
"info": "Другая вложенная информация"
230+
}
231+
}
232+
]
233+
```
234+
235+
**Output:**
236+
237+
```json
238+
[
239+
{
240+
"text": "Transformed: Обычный текст",
241+
"list": [
242+
{"text": "Transformed: Вложенный текст 1"},
243+
{"text": "Transformed: Вложенный текст 2"}
244+
],
245+
"details": {
246+
"info": "Transformed: Вложенная информация"
247+
}
248+
},
249+
{
250+
"text": "Transformed: Другой обычный текст",
251+
"list": {"text": "Transformed: Вложенный текст 3"},
252+
"details": {
253+
"info": "Transformed: Другая вложенная информация"
254+
}
255+
}
256+
]
257+
```

0 commit comments

Comments
 (0)