react-native-enriched-html 1.1.0 → 1.1.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/README.md +18 -354
- package/android/src/main/java/com/swmansion/enriched/common/parser/EnrichedParser.java +10 -2
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedInlineCodeSpan.kt +10 -3
- package/android/src/main/java/com/swmansion/enriched/textinput/styles/InlineStyles.kt +1 -1
- package/cpp/parser/GumboNormalizer.c +6 -1
- package/cpp/tests/GumboParserTest.cpp +5 -0
- package/ios/htmlParser/HtmlParser.mm +18 -3
- package/lib/module/web/EnrichedText.css +3 -1
- package/lib/module/web/normalization/htmlNormalizer.js +1 -1
- package/lib/module/web/normalization/htmlNormalizer.js.map +1 -1
- package/lib/module/web/sanitization/htmlSanitizer.js +6 -1
- package/lib/module/web/sanitization/htmlSanitizer.js.map +1 -1
- package/lib/typescript/src/web/sanitization/htmlSanitizer.d.ts.map +1 -1
- package/package.json +4 -1
- package/src/web/EnrichedText.css +3 -1
- package/src/web/normalization/htmlNormalizer.ts +1 -1
- package/src/web/sanitization/htmlSanitizer.ts +6 -1
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
- ⚡ Fully native input and display components (Supports New Architecture only)
|
|
12
12
|
- 💻 HTML-based parsing with live, synchronous text styling
|
|
13
13
|
- 🎨 Fully customizable styles for seamless UI integration
|
|
14
|
-
- 🌐 Solid mobile and
|
|
14
|
+
- 🌐 Solid mobile and Web support
|
|
15
15
|
|
|
16
16
|
`EnrichedTextInput`, the rich text input component is an uncontrolled input. This means that it doesn't use any state or props to store its value, but instead directly interacts with the underlying platform-specific components. Thanks to this, the component is really performant and simple to use while offering complex and advanced features no other solution has.
|
|
17
17
|
|
|
@@ -19,372 +19,38 @@
|
|
|
19
19
|
|
|
20
20
|

|
|
21
21
|
|
|
22
|
-
Since 2012 [Software Mansion](https://swmansion.com) is a software agency with experience in building web and mobile apps. We are Core React Native Contributors and experts in dealing with all kinds of React Native issues.
|
|
23
|
-
We can help you build your next dream product –
|
|
24
|
-
[Hire us](https://swmansion.com/contact/projects?utm_source=react-native-enriched-html&utm_medium=readme).
|
|
25
|
-
|
|
26
|
-
## Table of Contents
|
|
27
|
-
|
|
28
|
-
- [Prerequisites](#prerequisites)
|
|
29
|
-
- [Installation](#installation)
|
|
30
|
-
- [Usage](#usage)
|
|
31
|
-
- [Supported Tags](#supported-tags)
|
|
32
|
-
- [Non Parametrized Styles](#non-parametrized-styles)
|
|
33
|
-
- [Links](#links)
|
|
34
|
-
- [Mentions](#mentions)
|
|
35
|
-
- [Inline Images](#inline-images)
|
|
36
|
-
- [Style Detection](#style-detection)
|
|
37
|
-
- [Other Events](#other-events)
|
|
38
|
-
- [Context Menu Items](#context-menu-items)
|
|
39
|
-
- [Customizing \<EnrichedTextInput /> styles](#customizing-enrichedtextinput--styles)
|
|
40
|
-
- [EnrichedText component](#enrichedtext-component)
|
|
41
|
-
- [API Reference](#api-reference)
|
|
42
|
-
- [Known limitations](#known-limitations)
|
|
43
|
-
- [Contributing](#contributing)
|
|
44
|
-
- [License](#license)
|
|
45
|
-
|
|
46
|
-
## Prerequisites
|
|
47
|
-
|
|
48
|
-
- `react-native-enriched-html` currently supports Android, iOS and Web.
|
|
49
|
-
- It works only with [the React Native New Architecture (Fabric)](https://reactnative.dev/architecture/landing-page) and supports following React Native releases: `0.81`, `0.82`, `0.83`, `0.84`, `0.85` and `0.86`.
|
|
50
|
-
|
|
51
22
|
## Installation
|
|
52
23
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
#### 1. Install the library
|
|
56
|
-
|
|
57
|
-
```sh
|
|
58
|
-
yarn add react-native-enriched-html
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
> [!TIP]
|
|
62
|
-
> To try the latest features before they land in a stable release, install the nightly build:
|
|
63
|
-
>
|
|
64
|
-
> ```sh
|
|
65
|
-
> yarn add react-native-enriched-html@nightly
|
|
66
|
-
> ```
|
|
67
|
-
>
|
|
68
|
-
> Nightly versions are published to npm automatically and may contain breaking changes.
|
|
69
|
-
|
|
70
|
-
#### 2. Install iOS dependencies
|
|
71
|
-
|
|
72
|
-
The library includes native code so you will need to re-build the native app to use it.
|
|
73
|
-
|
|
74
|
-
```sh
|
|
75
|
-
cd ios && bundler install && bundler exec pod install
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
### Expo app
|
|
79
|
-
|
|
80
|
-
#### 1. Install the library
|
|
81
|
-
|
|
82
|
-
```sh
|
|
83
|
-
npx expo install react-native-enriched-html
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
#### 2. Run prebuild
|
|
87
|
-
|
|
88
|
-
The library includes native code so you will need to re-build the native app to use it.
|
|
89
|
-
|
|
90
|
-
```sh
|
|
91
|
-
npx expo prebuild
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
> [!NOTE]
|
|
95
|
-
> The library won't work in Expo Go as it needs native changes.
|
|
96
|
-
|
|
97
|
-
## Usage
|
|
98
|
-
|
|
99
|
-
Here's a simple example of an input that lets you toggle bold on its text and shows whether bold is currently active via the button color.
|
|
100
|
-
|
|
101
|
-
```tsx
|
|
102
|
-
import { EnrichedTextInput } from 'react-native-enriched-html';
|
|
103
|
-
import type {
|
|
104
|
-
EnrichedTextInputInstance,
|
|
105
|
-
OnChangeStateEvent,
|
|
106
|
-
} from 'react-native-enriched-html';
|
|
107
|
-
import { useState, useRef } from 'react';
|
|
108
|
-
import { View, Button, StyleSheet } from 'react-native';
|
|
109
|
-
|
|
110
|
-
export default function App() {
|
|
111
|
-
const ref = useRef<EnrichedTextInputInstance>(null);
|
|
112
|
-
|
|
113
|
-
const [stylesState, setStylesState] = useState<OnChangeStateEvent | null>();
|
|
114
|
-
|
|
115
|
-
return (
|
|
116
|
-
<View style={styles.container}>
|
|
117
|
-
<EnrichedTextInput
|
|
118
|
-
ref={ref}
|
|
119
|
-
onChangeState={(e) => setStylesState(e.nativeEvent)}
|
|
120
|
-
style={styles.input}
|
|
121
|
-
/>
|
|
122
|
-
<Button
|
|
123
|
-
title={stylesState?.bold.isActive ? 'Unbold' : 'Bold'}
|
|
124
|
-
color={stylesState?.bold.isActive ? 'green' : 'gray'}
|
|
125
|
-
onPress={() => ref.current?.toggleBold()}
|
|
126
|
-
/>
|
|
127
|
-
</View>
|
|
128
|
-
);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
const styles = StyleSheet.create({
|
|
132
|
-
container: {
|
|
133
|
-
flex: 1,
|
|
134
|
-
justifyContent: 'center',
|
|
135
|
-
alignItems: 'center',
|
|
136
|
-
},
|
|
137
|
-
input: {
|
|
138
|
-
width: '100%',
|
|
139
|
-
fontSize: 20,
|
|
140
|
-
padding: 10,
|
|
141
|
-
maxHeight: 200,
|
|
142
|
-
backgroundColor: 'lightgray',
|
|
143
|
-
},
|
|
144
|
-
});
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
Summary of what happens here:
|
|
148
|
-
|
|
149
|
-
1. Any methods imperatively called on the input to e.g. toggle some style must be used through a `ref` of `EnrichedTextInputInstance` type. Here, `toggleBold` method that is called on the button press calls `ref.current?.toggleBold()`, which toggles the bold styling within the current selection.
|
|
150
|
-
2. All style state information is emitted by the `onChangeState` event. Set up a proper callback that accepts a `NativeSyntheticEvent<OnChangeStateEvent>` argument. The event payload provides a nested object for each style (e.g., `bold`, `italic`), containing three properties to guide your UI logic:
|
|
151
|
-
|
|
152
|
-
- `isActive`: Indicates if the style is currently applied (highlight the button).
|
|
153
|
-
- `isBlocking`: Indicates if the style is blocked by another active style (disable the button).
|
|
154
|
-
- `isConflicting`: Indicates if the style is in conflict with another active style.
|
|
155
|
-
|
|
156
|
-
## Supported Tags
|
|
157
|
-
|
|
158
|
-
`react-native-enriched-html` uses both standard and custom HTML tags in its output and accepts them as input.
|
|
159
|
-
|
|
160
|
-
Not all styles can be combined freely. There are two kinds of restrictions:
|
|
161
|
-
|
|
162
|
-
- **Conflicting** - toggling a style that conflicts with an already active style will automatically remove the active one. For example: toggling `<h2>` on a `<blockquote>` paragraph will remove the blockquote and apply the heading.
|
|
163
|
-
- **Blocking** - a style that is blocked cannot be toggled at all while the blocking style is active. For example: `<b>` is blocked inside `<codeblock>`, so the bold cannot be applied where codeblock is active.
|
|
164
|
-
|
|
165
|
-
These states are reported via the [onChangeState](docs/INPUT_API_REFERENCE.md#onchangestate) event (`isConflicting` and `isBlocking` properties).
|
|
166
|
-
|
|
167
|
-
### Inline tags
|
|
168
|
-
|
|
169
|
-
| Style | HTML tag | Conflicts with | Blocked by |
|
|
170
|
-
| ------------- | ----------- | ---------------------------- | ---------------------- |
|
|
171
|
-
| Bold | `<b>` | -- | `<codeblock>` |
|
|
172
|
-
| Italic | `<i>` | -- | `<codeblock>` |
|
|
173
|
-
| Underline | `<u>` | -- | `<codeblock>` |
|
|
174
|
-
| Strikethrough | `<s>` | -- | `<codeblock>` |
|
|
175
|
-
| Inline code | `<code>` | `<a>`, `<mention>` | `<codeblock>`, `<img>` |
|
|
176
|
-
| Link | `<a>` | `<code>`, `<a>`, `<mention>` | `<codeblock>`, `<img>` |
|
|
177
|
-
| Mention | `<mention>` | `<code>`, `<a>` | `<codeblock>`, `<img>` |
|
|
178
|
-
| Image | `<img>` | `<a>`, `<mention>` | `<code>` |
|
|
179
|
-
|
|
180
|
-
> [!NOTE]
|
|
181
|
-
> Headings also block bold when `bold: true` is set on the heading style in the [htmlStyle](docs/INPUT_API_REFERENCE.md#htmlstyle) prop. In that case, the heading itself renders as bold, so toggling bold on top of it is redundant and therefore blocked.
|
|
182
|
-
|
|
183
|
-
### Paragraph tags
|
|
184
|
-
|
|
185
|
-
Some paragraph styles are container elements that wrap each line of text inside them with an **inner content tag**. For example: each line inside `<ul>` is wrapped in `<li>` and each line inside `<codeblock>` is wrapped in `<p>`.
|
|
186
|
-
|
|
187
|
-
Only one paragraph-level style can be active per paragraph - all paragraph styles conflict with each other.
|
|
188
|
-
|
|
189
|
-
| Style | HTML tag | Inner content tag | Conflicts with | Blocked by |
|
|
190
|
-
| -------------- | --------------------------- | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
191
|
-
| Heading 1 | `<h1>` | -- | `<h2>`, `<h3>`, `<h4>`, `<h5>`, `<h6>`, `<ul>`, `<ol>`, `<ul data-type="checkbox">`, `<blockquote>`, `<codeblock>` | -- |
|
|
192
|
-
| Heading 2 | `<h2>` | -- | `<h1>`, `<h3>`, `<h4>`, `<h5>`, `<h6>`, `<ul>`, `<ol>`, `<ul data-type="checkbox">`, `<blockquote>`, `<codeblock>` | -- |
|
|
193
|
-
| Heading 3 | `<h3>` | -- | `<h1>`, `<h2>`, `<h4>`, `<h5>`, `<h6>`, `<ul>`, `<ol>`, `<ul data-type="checkbox">`, `<blockquote>`, `<codeblock>` | -- |
|
|
194
|
-
| Heading 4 | `<h4>` | -- | `<h1>`, `<h2>`, `<h3>`, `<h5>`, `<h6>`, `<ul>`, `<ol>`, `<ul data-type="checkbox">`, `<blockquote>`, `<codeblock>` | -- |
|
|
195
|
-
| Heading 5 | `<h5>` | -- | `<h1>`, `<h2>`, `<h3>`, `<h4>`, `<h6>`, `<ul>`, `<ol>`, `<ul data-type="checkbox">`, `<blockquote>`, `<codeblock>` | -- |
|
|
196
|
-
| Heading 6 | `<h6>` | -- | `<h1>`, `<h2>`, `<h3>`, `<h4>`, `<h5>`, `<ul>`, `<ol>`, `<ul data-type="checkbox">`, `<blockquote>`, `<codeblock>` | -- |
|
|
197
|
-
| Unordered list | `<ul>` | `<li>` | `<h1>`, `<h2>`, `<h3>`, `<h4>`, `<h5>`, `<h6>`, `<ol>`, `<ul data-type="checkbox">`, `<blockquote>`, `<codeblock>` | -- |
|
|
198
|
-
| Ordered list | `<ol>` | `<li>` | `<h1>`, `<h2>`, `<h3>`, `<h4>`, `<h5>`, `<h6>`, `<ul>`, `<ul data-type="checkbox">`, `<blockquote>`, `<codeblock>` | -- |
|
|
199
|
-
| Checkbox list | `<ul data-type="checkbox">` | `<li>` / `<li checked>` | `<h1>`, `<h2>`, `<h3>`, `<h4>`, `<h5>`, `<h6>`, `<ul>`, `<ol>`, `<blockquote>`, `<codeblock>` | -- |
|
|
200
|
-
| Blockquote | `<blockquote>` | `<p>` | `<h1>`, `<h2>`, `<h3>`, `<h4>`, `<h5>`, `<h6>`, `<ul>`, `<ol>`, `<ul data-type="checkbox">`, `<codeblock>` | -- |
|
|
201
|
-
| Codeblock | `<codeblock>` | `<p>` | `<h1>`, `<h2>`, `<h3>`, `<h4>`, `<h5>`, `<h6>`, `<b>`, `<u>`, `<i>`, `<s>`, `<ul>`, `<ol>`, `<ul data-type="checkbox">`, `<blockquote>`, `<code>`, `<mention>`, `<a>` | -- |
|
|
202
|
-
|
|
203
|
-
Plain text paragraphs are wrapped in `<p>` tags. Empty paragraphs are represented as `<br>`.
|
|
204
|
-
|
|
205
|
-
## Non Parametrized Styles
|
|
206
|
-
|
|
207
|
-
Supported styles:
|
|
208
|
-
|
|
209
|
-
- bold
|
|
210
|
-
- italic
|
|
211
|
-
- underline
|
|
212
|
-
- strikethrough
|
|
213
|
-
- inline code
|
|
214
|
-
- H1, H2, H3, H4, H5 and H6 headings
|
|
215
|
-
- codeblock
|
|
216
|
-
- blockquote
|
|
217
|
-
- ordered list
|
|
218
|
-
- unordered list
|
|
219
|
-
- checkbox list
|
|
220
|
-
|
|
221
|
-
Each of the styles can be toggled the same way as in the example from [usage section](#usage); call a proper `toggle` function on the component ref.
|
|
222
|
-
|
|
223
|
-
Each call toggles the style within the current text selection. We can still divide styles into two categories based on how they treat the selection:
|
|
24
|
+
Check out the detailed [installation instructions](https://docs.swmansion.com/react-native-enriched-html/#installation).
|
|
224
25
|
|
|
225
|
-
|
|
26
|
+
## Compatibility
|
|
226
27
|
|
|
227
|
-
|
|
228
|
-
If the selection spans more than one paragraph, logically more of them will be affected by the toggle. Toggling these styles with the cursor in place (no selection) makes changes to the very paragraph the cursor is in.
|
|
28
|
+
At the moment, the library offers stable support for iOS, Android and Web.
|
|
229
29
|
|
|
230
|
-
|
|
30
|
+
The full list of compatible React Native versions is available [here](https://docs.swmansion.com/react-native-enriched-html/misc/compatibility/#supported-react-native-versions).
|
|
231
31
|
|
|
232
|
-
|
|
32
|
+
## Documentation
|
|
233
33
|
|
|
234
|
-
|
|
34
|
+
To find more about `react-native-enriched-html` including usage guides, API references, known limitations or our contributing guide, visit the official [documentation](https://docs.swmansion.com/react-native-enriched-html/).
|
|
235
35
|
|
|
236
|
-
|
|
237
|
-
You can customize this behavior by providing your own regular expression via [linkRegex](docs/INPUT_API_REFERENCE.md#linkregex) prop.
|
|
36
|
+
## Examples
|
|
238
37
|
|
|
239
|
-
|
|
38
|
+
The source code for the example mobile and web apps is under the [`apps`](https://github.com/software-mansion/react-native-enriched-html/tree/main/apps) directory.
|
|
39
|
+
You can also see the live preview of the library's capabilities by visiting the [official documentation](https://docs.swmansion.com/react-native-enriched-html/) filled with interactive examples.
|
|
240
40
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
The `start`, `end` and `text` arguments for the method can be easily taken from [onChangeSelection](docs/INPUT_API_REFERENCE.md#onchangeselection) event payload as it returns exact `start` and `end` of the selection and the `text` it spans. This way, you just set the underlying URL to whatever is selected in there.
|
|
244
|
-
|
|
245
|
-
Passing a different `text` than the one in the selection will properly replace it before applying the link.
|
|
246
|
-
|
|
247
|
-
A complete example of a setup that supports both setting links on the selected text, as well as putting them in the place of cursor and editing existing links can be found in the example app code.
|
|
248
|
-
|
|
249
|
-
## Mentions
|
|
250
|
-
|
|
251
|
-
Mentions are meant to be a customisable style that lets you put mentioning phrases in the input, e.g. `@someone` or `#some_channel` or `[any_character_you_like]something`.
|
|
252
|
-
|
|
253
|
-
### Mention Indicators
|
|
254
|
-
|
|
255
|
-
There is a [mentionIndicators](docs/INPUT_API_REFERENCE.md#mentionindicators) prop that lets you define what characters can start a mention. By default, it is set to `[ @ ]`, meaning that typing a `@` character in the input will start the creation of a mention.
|
|
256
|
-
|
|
257
|
-
### Starting a mention
|
|
258
|
-
|
|
259
|
-
There are two ways in which a mention can be started; either by typing one of the `mentionIndicators` set or by calling a [startMention](docs/INPUT_API_REFERENCE.md#startmention) method on the input ref.
|
|
260
|
-
|
|
261
|
-
### Mention related events
|
|
262
|
-
|
|
263
|
-
`react-native-enriched-html` emits 3 different events that help handling mentions' editing:
|
|
264
|
-
|
|
265
|
-
- [onStartMention](docs/INPUT_API_REFERENCE.md#onstartmention) is emitted whenever mention is started in one of the ways from the [previous section](#starting-a-mention) or the user has come back (moved selection) to some unfinished mention they have started. It can be used for opening proper tools you use in the app to edit a mention (e.g. a list for choosing from users or channels that the mention will affect).
|
|
266
|
-
- [onChangeMention](docs/INPUT_API_REFERENCE.md#onchangemention) is emitted whenever user put or removed some characters after a mention indicator. This way you can react to active mention editing by, for example, filtering users in your displayed list based on the typed text.
|
|
267
|
-
- [onEndMention](docs/INPUT_API_REFERENCE.md#onendmention) is emitted whenever user is no longer editing a mention: they might have put a space or changed the cursor position to be no longer near the indicator. You can use it to hide appropriate tools that were used for mention editing.
|
|
268
|
-
|
|
269
|
-
### Setting a mention
|
|
270
|
-
|
|
271
|
-
Whenever you feel ready with the currently edited mention (so most likely user chooses something from your additional mention editor), you can complete it by calling [setMention](docs/INPUT_API_REFERENCE.md#setmention) ref method.
|
|
272
|
-
|
|
273
|
-
## Inline images
|
|
274
|
-
|
|
275
|
-
You can insert an image into the input using [setImage](docs/INPUT_API_REFERENCE.md#setimage) ref method.
|
|
276
|
-
|
|
277
|
-
The image will be put into a single line in the input and will affect the line's height as well as input's height. Keep in mind, that image will replace currently selected text or insert into the cursor position if there is no text selection.
|
|
278
|
-
|
|
279
|
-
## Style Detection
|
|
280
|
-
|
|
281
|
-
All of the above styles can be detected with the use of [onChangeState](docs/INPUT_API_REFERENCE.md#onchangestate) event payload.
|
|
282
|
-
|
|
283
|
-
You can find some examples in the [usage section](#usage) or in the example app.
|
|
284
|
-
|
|
285
|
-
## Other Events
|
|
286
|
-
|
|
287
|
-
`react-native-enriched-html` emits a few more events that may be of use:
|
|
288
|
-
|
|
289
|
-
- [onFocus](docs/INPUT_API_REFERENCE.md#onfocus) - emits whenever input focuses.
|
|
290
|
-
- [onBlur](docs/INPUT_API_REFERENCE.md) - emits whenever input blurs.
|
|
291
|
-
- [onChangeText](docs/INPUT_API_REFERENCE.md#onchangetext) - returns the input's text anytime it changes.
|
|
292
|
-
- [onChangeHtml](docs/INPUT_API_REFERENCE.md#onchangehtml) - returns HTML string parsed from current input text and styles anytime it would change. As parsing the HTML on each input change is a pretty expensive operation, not assigning the event's callback will speed up iOS input a bit.
|
|
293
|
-
- [onChangeSelection](docs/INPUT_API_REFERENCE.md#onchangeselection) - returns all the data needed for working with selections (as of now it's mainly useful for [links](#links)).
|
|
294
|
-
- [onLinkDetected](docs/INPUT_API_REFERENCE.md#onlinkdetected) - returns link's detailed info whenever user selection is near one.
|
|
295
|
-
- [onMentionDetected](docs/INPUT_API_REFERENCE.md#onmentiondetected) - returns mention's detailed info whenever user selection is near one.
|
|
296
|
-
- [onKeyPress](docs/INPUT_API_REFERENCE.md#onkeypress) - emits whenever a key is pressed. Follows react-native TextInput's onKeyPress event [spec](https://reactnative.dev/docs/textinput#onkeypress).
|
|
297
|
-
- [onPasteImages](docs/INPUT_API_REFERENCE.md#onpasteimages) - returns an array of images details whenever an image/GIF is pasted into the input.
|
|
298
|
-
|
|
299
|
-
## Context Menu Items
|
|
300
|
-
|
|
301
|
-
> **Note:** This feature is currently supported on Android and iOS 16+.
|
|
302
|
-
|
|
303
|
-
You can extend the native text editing menu with custom items using the [contextMenuItems](docs/INPUT_API_REFERENCE.md#contextmenuitems) prop. Each item has a `text` (title), `visible` flag and an `onPress` callback. Items appear in the specified order, before the system actions.
|
|
304
|
-
|
|
305
|
-
```tsx
|
|
306
|
-
<EnrichedTextInput
|
|
307
|
-
ref={ref}
|
|
308
|
-
contextMenuItems={[
|
|
309
|
-
{
|
|
310
|
-
text: 'Paste Link',
|
|
311
|
-
onPress: ({ text, selection, styleState }) => {
|
|
312
|
-
if (!styleState.link.isBlocking) {
|
|
313
|
-
ref.current?.setLink(selection.start, selection.end, text, url);
|
|
314
|
-
}
|
|
315
|
-
},
|
|
316
|
-
visible: true,
|
|
317
|
-
},
|
|
318
|
-
]}
|
|
319
|
-
/>
|
|
320
|
-
```
|
|
321
|
-
|
|
322
|
-
## Customizing \<EnrichedTextInput /> styles
|
|
323
|
-
|
|
324
|
-
`react-native-enriched-html` allows customizing styles of the `<EnrichedTextInput />` component. See [htmlStyle](docs/INPUT_API_REFERENCE.md#htmlstyle) prop.
|
|
325
|
-
|
|
326
|
-
## EnrichedText component
|
|
327
|
-
|
|
328
|
-
`react-native-enriched-html` provides an `EnrichedText` component that renders the HTML output of `EnrichedTextInput` with all supported styles, interactive links, and mentions.
|
|
329
|
-
|
|
330
|
-
```tsx
|
|
331
|
-
import { EnrichedText } from 'react-native-enriched-html';
|
|
332
|
-
import type {
|
|
333
|
-
OnLinkPressEvent,
|
|
334
|
-
OnMentionPressEvent,
|
|
335
|
-
} from 'react-native-enriched-html';
|
|
336
|
-
import { StyleSheet } from 'react-native';
|
|
337
|
-
|
|
338
|
-
export default function App() {
|
|
339
|
-
const html =
|
|
340
|
-
'<html><p>Hello, <b>world</b>! Visit <a href="https://swmansion.com">Software Mansion</a>.</p></html>';
|
|
341
|
-
|
|
342
|
-
const handleLinkPress = (e: OnLinkPressEvent) => {
|
|
343
|
-
console.log('Link pressed:', e.url);
|
|
344
|
-
};
|
|
345
|
-
|
|
346
|
-
const handleMentionPress = (e: OnMentionPressEvent) => {
|
|
347
|
-
console.log('Mention pressed:', e.text, e.indicator, e.attributes);
|
|
348
|
-
};
|
|
349
|
-
|
|
350
|
-
return (
|
|
351
|
-
<EnrichedText
|
|
352
|
-
style={styles.text}
|
|
353
|
-
numberOfLines={3}
|
|
354
|
-
ellipsizeMode="tail"
|
|
355
|
-
onLinkPress={handleLinkPress}
|
|
356
|
-
onMentionPress={handleMentionPress}
|
|
357
|
-
>
|
|
358
|
-
{html}
|
|
359
|
-
</EnrichedText>
|
|
360
|
-
);
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
const styles = StyleSheet.create({
|
|
364
|
-
text: {
|
|
365
|
-
fontSize: 16,
|
|
366
|
-
color: 'black',
|
|
367
|
-
},
|
|
368
|
-
});
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
## API Reference
|
|
372
|
-
|
|
373
|
-
See the [EnrichedTextInput API Reference](docs/INPUT_API_REFERENCE.md) for a detailed overview of all the props, methods, and events available for `EnrichedTextInput`.
|
|
374
|
-
|
|
375
|
-
See the [EnrichedText API Reference](docs/TEXT_API_REFERENCE.md) for the `EnrichedText` component.
|
|
376
|
-
|
|
377
|
-
## Known limitations
|
|
41
|
+
## License
|
|
378
42
|
|
|
379
|
-
-
|
|
43
|
+
`react-native-enriched-html` library is licensed under [The MIT License](./LICENSE).
|
|
380
44
|
|
|
381
|
-
##
|
|
45
|
+
## Community Discord
|
|
382
46
|
|
|
383
|
-
|
|
47
|
+
[Join the Software Mansion Community Discord](https://discord.swmansion.com) to chat about `react-native-enriched-html` or other Software Mansion libraries.
|
|
384
48
|
|
|
385
|
-
##
|
|
49
|
+
## Created by Software Mansion
|
|
386
50
|
|
|
387
|
-
|
|
51
|
+
Since 2012 [Software Mansion](https://swmansion.com) is a software agency with experience in building web and mobile apps. We are Core React Native Contributors and experts in dealing with all kinds of React Native issues.
|
|
52
|
+
We can help you build your next dream product –
|
|
53
|
+
[Hire us](https://swmansion.com/contact/projects?utm_source=react-native-enriched-html&utm_medium=readme).
|
|
388
54
|
|
|
389
55
|
---
|
|
390
56
|
|
|
@@ -392,6 +58,4 @@ Built by [Software Mansion](https://swmansion.com/) and sponsored by [Filament](
|
|
|
392
58
|
|
|
393
59
|
[<img width="128" height="69" alt="Software Mansion Logo" src="https://github.com/user-attachments/assets/f0e18471-a7aa-4e80-86ac-87686a86fe56" />](https://swmansion.com/)
|
|
394
60
|
|
|
395
|
-
<img width="48" height="48" alt="" src="https://github.com/user-attachments/assets/46c6bf1f-2685-497e-b699-d5a94b2582a3" />
|
|
396
|
-
|
|
397
61
|
[<img width="80" height="80" alt="Filament Logo" src="https://github.com/user-attachments/assets/4103ab79-da34-4164-aa5f-dcf08815bf65" />](https://filament.dm/)
|
|
@@ -94,8 +94,9 @@ public class EnrichedParser {
|
|
|
94
94
|
String normalizedBlockQuote =
|
|
95
95
|
normalizedCodeBlock.replaceAll("</blockquote>\\n<br>", "</blockquote>");
|
|
96
96
|
|
|
97
|
-
// Replace empty <p> tags
|
|
98
|
-
String normalizedHtml =
|
|
97
|
+
// Replace empty <p> tags with <br>, except when they carry text-align
|
|
98
|
+
String normalizedHtml =
|
|
99
|
+
normalizedBlockQuote.replaceAll("<p(?![^>]*text-align\\s*:)[^>]*></p>", "<br>");
|
|
99
100
|
|
|
100
101
|
return "<html>\n" + normalizedHtml + "</html>";
|
|
101
102
|
}
|
|
@@ -593,7 +594,14 @@ class HtmlToSpannedConverter<T> implements ContentHandler {
|
|
|
593
594
|
if (tag.equalsIgnoreCase("br")) {
|
|
594
595
|
handleBr(mSpannableStringBuilder);
|
|
595
596
|
} else if (tag.equalsIgnoreCase("p")) {
|
|
597
|
+
boolean empty = isEmptyTag;
|
|
598
|
+
Alignment pendingAlignment = empty ? getLast(mSpannableStringBuilder, Alignment.class) : null;
|
|
596
599
|
endBlockElement(mSpannableStringBuilder, mSpanFactory);
|
|
600
|
+
// Plain empty paragraphs never reach setParagraphSpanFromMark (no ZWS).
|
|
601
|
+
// Represent them as a blank line so they round-trip as <br>.
|
|
602
|
+
if (empty && pendingAlignment == null) {
|
|
603
|
+
handleBr(mSpannableStringBuilder);
|
|
604
|
+
}
|
|
597
605
|
} else if (tag.equalsIgnoreCase("ul")) {
|
|
598
606
|
currentListAlignmentCssValue = null;
|
|
599
607
|
endBlockElement(mSpannableStringBuilder, mSpanFactory);
|
|
@@ -11,14 +11,21 @@ open class EnrichedInlineCodeSpan(
|
|
|
11
11
|
) : MetricAffectingSpan(),
|
|
12
12
|
EnrichedInlineSpan {
|
|
13
13
|
override fun updateDrawState(textPaint: TextPaint) {
|
|
14
|
-
|
|
15
|
-
textPaint.typeface = typeface
|
|
14
|
+
applyMonospace(textPaint)
|
|
16
15
|
textPaint.color = enrichedStyle.inlineCodeColor
|
|
17
16
|
textPaint.bgColor = enrichedStyle.inlineCodeBackgroundColor
|
|
18
17
|
}
|
|
19
18
|
|
|
20
19
|
override fun updateMeasureState(textPaint: TextPaint) {
|
|
21
|
-
|
|
20
|
+
applyMonospace(textPaint)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// When switching to a monospace font, we need to remember
|
|
24
|
+
// and apply other current styles, such as bold or italic.
|
|
25
|
+
private fun applyMonospace(textPaint: TextPaint) {
|
|
26
|
+
val currentStyle = textPaint.typeface?.style ?: Typeface.NORMAL
|
|
27
|
+
val typeface = Typeface.create(Typeface.MONOSPACE, currentStyle)
|
|
28
|
+
|
|
22
29
|
textPaint.typeface = typeface
|
|
23
30
|
}
|
|
24
31
|
}
|
|
@@ -18,7 +18,7 @@ class InlineStyles(
|
|
|
18
18
|
) {
|
|
19
19
|
val previousSpanStart = (start - 1).coerceAtLeast(0)
|
|
20
20
|
val previousSpanEnd = previousSpanStart + 1
|
|
21
|
-
val nextSpanStart =
|
|
21
|
+
val nextSpanStart = end.coerceAtMost(spannable.length)
|
|
22
22
|
val nextSpanEnd = (nextSpanStart + 1).coerceAtMost(spannable.length)
|
|
23
23
|
val previousSpans = spannable.getSpans(previousSpanStart, previousSpanEnd, type)
|
|
24
24
|
val nextSpans = spannable.getSpans(nextSpanStart, nextSpanEnd, type)
|
|
@@ -491,7 +491,12 @@ static void emit_attributes(GumboElement *el, const char *tag_name,
|
|
|
491
491
|
if (strcmp(tag_name, "a") == 0) {
|
|
492
492
|
emit_one_attr(out, el, "href");
|
|
493
493
|
} else if (strcmp(tag_name, "img") == 0) {
|
|
494
|
-
|
|
494
|
+
const char *src_val = get_attr(el, "src");
|
|
495
|
+
if (src_val && src_val[0]) {
|
|
496
|
+
emit_one_attr(out, el, "src");
|
|
497
|
+
} else {
|
|
498
|
+
buffer_append_str(out, " src=\"\"");
|
|
499
|
+
}
|
|
495
500
|
emit_one_attr(out, el, "alt");
|
|
496
501
|
emit_one_attr(out, el, "width");
|
|
497
502
|
emit_one_attr(out, el, "height");
|
|
@@ -282,6 +282,11 @@ TEST(GumboParserTest, EnrichedTagRemappings) {
|
|
|
282
282
|
EXPECT_EQ(
|
|
283
283
|
GumboParser::normalizeHtml("<img src='x' width='100' height='100' />"),
|
|
284
284
|
"<img src=\"x\" width=\"100\" height=\"100\" />");
|
|
285
|
+
EXPECT_EQ(GumboParser::normalizeHtml("<img width=\"100\" height=\"100\" />"),
|
|
286
|
+
"<img src=\"\" width=\"100\" height=\"100\" />");
|
|
287
|
+
EXPECT_EQ(GumboParser::normalizeHtml(
|
|
288
|
+
"<img src=\"\" width=\"100\" height=\"100\" />"),
|
|
289
|
+
"<img src=\"\" width=\"100\" height=\"100\" />");
|
|
285
290
|
|
|
286
291
|
// Lists
|
|
287
292
|
EXPECT_EQ(GumboParser::normalizeHtml("<ul><li>x</li></ul>"),
|
|
@@ -670,7 +670,7 @@
|
|
|
670
670
|
[styleArr addObject:@([ItalicStyle getType])];
|
|
671
671
|
} else if ([tagName isEqualToString:@"img"]) {
|
|
672
672
|
NSRegularExpression *srcRegex =
|
|
673
|
-
[NSRegularExpression regularExpressionWithPattern:@"src=\"([^\"]
|
|
673
|
+
[NSRegularExpression regularExpressionWithPattern:@"src=\"([^\"]*)\""
|
|
674
674
|
options:0
|
|
675
675
|
error:nullptr];
|
|
676
676
|
NSTextCheckingResult *match =
|
|
@@ -957,7 +957,16 @@
|
|
|
957
957
|
inCheckboxList = NO;
|
|
958
958
|
}
|
|
959
959
|
} else {
|
|
960
|
-
|
|
960
|
+
NSString *cssStyleString =
|
|
961
|
+
[self prepareCssStyleString:currentRange.location
|
|
962
|
+
isOpeningTag:YES
|
|
963
|
+
host:host];
|
|
964
|
+
if (cssStyleString.length > 0) {
|
|
965
|
+
[result appendString:[NSString stringWithFormat:@"\n<p%@></p>",
|
|
966
|
+
cssStyleString]];
|
|
967
|
+
} else {
|
|
968
|
+
[result appendString:@"\n<br>"];
|
|
969
|
+
}
|
|
961
970
|
}
|
|
962
971
|
} else {
|
|
963
972
|
// newline finishes a paragraph and all style tags need to be closed
|
|
@@ -1456,7 +1465,7 @@
|
|
|
1456
1465
|
}
|
|
1457
1466
|
|
|
1458
1467
|
+ (void)checkForAlignments:(NSArray *)tagData
|
|
1459
|
-
plainText:(
|
|
1468
|
+
plainText:(NSMutableString *)plainText
|
|
1460
1469
|
foundAlignments:(NSMutableArray<AlignmentEntry *> *)foundAlignments
|
|
1461
1470
|
precedingImageCount:(NSInteger)precedingImageCount {
|
|
1462
1471
|
if (tagData == nil) {
|
|
@@ -1474,6 +1483,12 @@
|
|
|
1474
1483
|
NSInteger actualStart = startLoc + precedingImageCount;
|
|
1475
1484
|
NSInteger length = plainText.length - startLoc;
|
|
1476
1485
|
|
|
1486
|
+
// Empty aligned paragraphs have no characters to attach alignment to.
|
|
1487
|
+
if (length == 0) {
|
|
1488
|
+
[plainText appendString:@"\u200B"];
|
|
1489
|
+
length = 1;
|
|
1490
|
+
}
|
|
1491
|
+
|
|
1477
1492
|
if (length > 0) {
|
|
1478
1493
|
AlignmentEntry *entry = [[AlignmentEntry alloc] init];
|
|
1479
1494
|
entry.alignment = align;
|
|
@@ -366,7 +366,9 @@
|
|
|
366
366
|
vertical-align: text-bottom;
|
|
367
367
|
}
|
|
368
368
|
|
|
369
|
-
.et-view img.error
|
|
369
|
+
.et-view img.error,
|
|
370
|
+
.et-view img:not([src]),
|
|
371
|
+
.et-view img[src=""] {
|
|
370
372
|
content: linear-gradient(transparent, transparent);
|
|
371
373
|
background-color: currentColor;
|
|
372
374
|
-webkit-mask: var(--et-broken-image-glyph) no-repeat center / contain;
|
|
@@ -172,7 +172,7 @@ function emitAttributes(el, name) {
|
|
|
172
172
|
case 'a':
|
|
173
173
|
return emitOneAttr(el, 'href');
|
|
174
174
|
case 'img':
|
|
175
|
-
return emitOneAttr(el, 'src') + emitOneAttr(el, 'alt') + emitOneAttr(el, 'width') + emitOneAttr(el, 'height');
|
|
175
|
+
return (el.getAttribute('src') ? emitOneAttr(el, 'src') : ' src=""') + emitOneAttr(el, 'alt') + emitOneAttr(el, 'width') + emitOneAttr(el, 'height');
|
|
176
176
|
case 'ul':
|
|
177
177
|
return (isCheckboxList(el) ? ' data-type="checkbox"' : '') + emitAlignment(el, name);
|
|
178
178
|
case 'li':
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["INLINE_TAGS","Set","BLOCK_TAGS","SELF_CLOSING_TAGS","PASS_TAGS","STRIPPED_TAGS","TABLE_TAGS","canonicalName","name","classifyTag","has","isElement","node","nodeType","Node","ELEMENT_NODE","isText","TEXT_NODE","tagName","toLowerCase","isListNode","n","isBlockquoteNode","isBrNode","isBlockProducing","isPurelyInline","child","Array","from","childNodes","hasBlockOrBqChild","findCssValue","style","prop","re","RegExp","replace","m","exec","trim","findAllCssValues","out","push","parseCssStyle","result","bold","italic","underline","strikethrough","fw","lower","includes","num","parseInt","Number","isNaN","fs","decorations","v","extraStyles","s","tag","emitStylesOpen","emitStylesClose","ALIGN_TAGS","ALIGN_VALUES","emitAlignment","el","align","getAttribute","emitOneAttr","attr","val","escaped","escapeText","emitAttributes","isCheckboxList","isChecked","hasAttribute","attributes","firstLi","children","find","c","role","className","isGoogleDocsWrapper","id","startsWith","length","match","isWhitespaceOnly","value","i","charCodeAt","flushInlineP","ib","attrs","emitted","buf","flattenBqChildren","flattenBqNode","t","textContent","walkNode","flushLiBuffer","ctx","styles","hasEmitted","flattenLiChildren","flattenLiNode","nestedLists","walkChildren","parentIsList","hasBlock","bqIb","cur","outName","cls","pb","dc","sib","nextSibling","row","es","liIb","nl","wrap","normalizeHtml","html","parser","DOMParser","doc","parseFromString","body"],"sourceRoot":"../../../../src","sources":["web/normalization/htmlNormalizer.ts"],"mappings":";;AAAA;AACA;AACA;AACA;;AASA,MAAMA,WAAW,GAAG,IAAIC,GAAG,CAAC,CAC1B,GAAG,EACH,GAAG,EACH,GAAG,EACH,GAAG,EACH,MAAM,EACN,GAAG,EACH,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,KAAK,EACL,SAAS,CACV,CAAC;AAEF,MAAMC,UAAU,GAAG,IAAID,GAAG,CAAC,CACzB,GAAG,EACH,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,YAAY,EACZ,WAAW,EACX,KAAK,CACN,CAAC;AAEF,MAAME,iBAAiB,GAAG,IAAIF,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAEhD,MAAMG,SAAS,GAAG,IAAIH,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEnD,MAAMI,aAAa,GAAG,IAAIJ,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAE3E,MAAMK,UAAU,GAAG,IAAIL,GAAG,CAAC,CACzB,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,UAAU,EACV,KAAK,CACN,CAAC;AAEF,SAASM,aAAaA,CAACC,IAAY,EAAU;EAC3C,QAAQA,IAAI;IACV,KAAK,QAAQ;MACX,OAAO,GAAG;IACZ,KAAK,IAAI;MACP,OAAO,GAAG;IACZ,KAAK,KAAK;IACV,KAAK,QAAQ;MACX,OAAO,GAAG;IACZ,KAAK,KAAK;MACR,OAAO,GAAG;IACZ,KAAK,KAAK;MACR,OAAO,WAAW;IACpB;MACE,OAAOA,IAAI;EACf;AACF;AAIA,SAASC,WAAWA,CAACD,IAAY,EAAY;EAC3C,IAAIR,WAAW,CAACU,GAAG,CAACF,IAAI,CAAC,EAAE,OAAO,QAAQ;EAC1C,IAAIN,UAAU,CAACQ,GAAG,CAACF,IAAI,CAAC,EAAE,OAAO,OAAO;EACxC,IAAIL,iBAAiB,CAACO,GAAG,CAACF,IAAI,CAAC,EAAE,OAAO,cAAc;EACtD,IAAIJ,SAAS,CAACM,GAAG,CAACF,IAAI,CAAC,EAAE,OAAO,MAAM;EACtC,OAAO,MAAM;AACf;AAEA,SAASG,SAASA,CAACC,IAAiB,EAAmB;EACrD,OAAO,CAAC,CAACA,IAAI,IAAIA,IAAI,CAACC,QAAQ,KAAKC,IAAI,CAACC,YAAY;AACtD;AAEA,SAASC,MAAMA,CAACJ,IAAiB,EAAW;EAC1C,OAAO,CAAC,CAACA,IAAI,IAAIA,IAAI,CAACC,QAAQ,KAAKC,IAAI,CAACG,SAAS;AACnD;AAEA,SAASC,OAAOA,CAACN,IAAiB,EAAiB;EACjD,IAAI,CAACD,SAAS,CAACC,IAAI,CAAC,EAAE,OAAO,IAAI;EACjC,OAAOA,IAAI,CAACM,OAAO,CAACC,WAAW,CAAC,CAAC;AACnC;AAEA,SAASC,UAAUA,CAACR,IAAiB,EAAW;EAC9C,MAAMS,CAAC,GAAGH,OAAO,CAACN,IAAI,CAAC;EACvB,OAAOS,CAAC,KAAK,IAAI,IAAIA,CAAC,KAAK,IAAI;AACjC;AAEA,SAASC,gBAAgBA,CAACV,IAAiB,EAAW;EACpD,OAAOM,OAAO,CAACN,IAAI,CAAC,KAAK,YAAY;AACvC;AAEA,SAASW,QAAQA,CAACX,IAAiB,EAAW;EAC5C,OAAOM,OAAO,CAACN,IAAI,CAAC,KAAK,IAAI;AAC/B;AAEA,SAASY,gBAAgBA,CAACZ,IAAiB,EAAW;EACpD,MAAMS,CAAC,GAAGH,OAAO,CAACN,IAAI,CAAC;EACvB,IAAI,CAACS,CAAC,EAAE,OAAO,KAAK;EACpB,IAAIZ,WAAW,CAACY,CAAC,CAAC,KAAK,OAAO,EAAE,OAAO,IAAI;EAC3C,OAAOA,CAAC,KAAK,KAAK,IAAIA,CAAC,KAAK,OAAO,IAAIA,CAAC,KAAK,IAAI;AACnD;AAEA,SAASI,cAAcA,CAACb,IAAa,EAAW;EAC9C,KAAK,MAAMc,KAAK,IAAIC,KAAK,CAACC,IAAI,CAAChB,IAAI,CAACiB,UAAU,CAAC,EAAE;IAC/C,IAAIL,gBAAgB,CAACE,KAAK,CAAC,EAAE,OAAO,KAAK;EAC3C;EACA,OAAO,IAAI;AACb;AAEA,SAASI,iBAAiBA,CAAClB,IAAa,EAAW;EACjD,KAAK,MAAMc,KAAK,IAAIC,KAAK,CAACC,IAAI,CAAChB,IAAI,CAACiB,UAAU,CAAC,EAAE;IAC/C,IAAIL,gBAAgB,CAACE,KAAK,CAAC,IAAIJ,gBAAgB,CAACI,KAAK,CAAC,EAAE,OAAO,IAAI;EACrE;EACA,OAAO,KAAK;AACd;AAEA,SAASK,YAAYA,CAACC,KAAa,EAAEC,IAAY,EAAiB;EAChE;EACA;EACA,MAAMC,EAAE,GAAG,IAAIC,MAAM,CACnB,cAAcF,IAAI,CAACG,OAAO,CAAC,wBAAwB,EAAE,MAAM,CAAC,kBAAkB,EAC9E,GACF,CAAC;EAED,MAAMC,CAAC,GAAGH,EAAE,CAACI,IAAI,CAACN,KAAK,CAAC;EACxB,IAAIK,CAAC,KAAK,IAAI,EAAE;IACd,OAAO,CAACA,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAEE,IAAI,CAAC,CAAC;EAC5B;EACA,OAAO,IAAI;AACb;AAEA,SAASC,gBAAgBA,CAACR,KAAa,EAAEC,IAAY,EAAY;EAC/D,MAAMC,EAAE,GAAG,IAAIC,MAAM,CACnB,cAAcF,IAAI,CAACG,OAAO,CAAC,wBAAwB,EAAE,MAAM,CAAC,kBAAkB,EAC9E,IACF,CAAC;EACD,MAAMK,GAAa,GAAG,EAAE;EACxB,IAAIJ,CAAyB;EAC7B,OAAO,CAACA,CAAC,GAAGH,EAAE,CAACI,IAAI,CAACN,KAAK,CAAC,MAAM,IAAI,EAAE;IACpCS,GAAG,CAACC,IAAI,CAAC,CAACL,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAEE,IAAI,CAAC,CAAC,CAAC;EAC/B;EACA,OAAOE,GAAG;AACZ;AAEA,SAASE,aAAaA,CAACX,KAAoB,EAAa;EACtD,MAAMY,MAAiB,GAAG;IACxBC,IAAI,EAAE,KAAK;IACXC,MAAM,EAAE,KAAK;IACbC,SAAS,EAAE,KAAK;IAChBC,aAAa,EAAE;EACjB,CAAC;EACD,IAAI,CAAChB,KAAK,EAAE,OAAOY,MAAM;EAEzB,MAAMK,EAAE,GAAGlB,YAAY,CAACC,KAAK,EAAE,aAAa,CAAC;EAC7C,IAAIiB,EAAE,EAAE;IACN,MAAMC,KAAK,GAAGD,EAAE,CAAC9B,WAAW,CAAC,CAAC;IAC9B,IAAI+B,KAAK,CAACC,QAAQ,CAAC,MAAM,CAAC,IAAID,KAAK,CAACC,QAAQ,CAAC,QAAQ,CAAC,EAAE;MACtDP,MAAM,CAACC,IAAI,GAAG,IAAI;IACpB,CAAC,MAAM;MACL,MAAMO,GAAG,GAAGC,QAAQ,CAACJ,EAAE,EAAE,EAAE,CAAC;MAC5B,IAAI,CAACK,MAAM,CAACC,KAAK,CAACH,GAAG,CAAC,IAAIA,GAAG,IAAI,GAAG,EAAER,MAAM,CAACC,IAAI,GAAG,IAAI;IAC1D;EACF;EAEA,MAAMW,EAAE,GAAGzB,YAAY,CAACC,KAAK,EAAE,YAAY,CAAC;EAC5C,IAAIwB,EAAE,EAAE;IACN,MAAMN,KAAK,GAAGM,EAAE,CAACrC,WAAW,CAAC,CAAC;IAC9B,IAAI+B,KAAK,CAACC,QAAQ,CAAC,QAAQ,CAAC,IAAID,KAAK,CAACC,QAAQ,CAAC,SAAS,CAAC,EACvDP,MAAM,CAACE,MAAM,GAAG,IAAI;EACxB;;EAEA;EACA,MAAMW,WAAW,GAAG,CAClB,GAAGjB,gBAAgB,CAACR,KAAK,EAAE,sBAAsB,CAAC,EAClD,GAAGQ,gBAAgB,CAACR,KAAK,EAAE,iBAAiB,CAAC,CAC9C;EACD,KAAK,MAAM0B,CAAC,IAAID,WAAW,EAAE;IAC3B,MAAMP,KAAK,GAAGQ,CAAC,CAACvC,WAAW,CAAC,CAAC;IAC7B,IAAI+B,KAAK,CAACC,QAAQ,CAAC,WAAW,CAAC,EAAEP,MAAM,CAACG,SAAS,GAAG,IAAI;IACxD,IAAIG,KAAK,CAACC,QAAQ,CAAC,cAAc,CAAC,EAAEP,MAAM,CAACI,aAAa,GAAG,IAAI;EACjE;EAEA,OAAOJ,MAAM;AACf;AAEA,SAASe,WAAWA,CAACC,CAAY,EAAEC,GAAW,EAAa;EACzD,OAAO;IACLhB,IAAI,EAAEe,CAAC,CAACf,IAAI,IAAIgB,GAAG,KAAK,GAAG;IAC3Bf,MAAM,EAAEc,CAAC,CAACd,MAAM,IAAIe,GAAG,KAAK,GAAG;IAC/Bd,SAAS,EAAEa,CAAC,CAACb,SAAS,IAAIc,GAAG,KAAK,GAAG;IACrCb,aAAa,EAAEY,CAAC,CAACZ,aAAa,IAAIa,GAAG,KAAK;EAC5C,CAAC;AACH;AAEA,SAASC,cAAcA,CAACF,CAAY,EAAU;EAC5C,IAAInB,GAAG,GAAG,EAAE;EACZ,IAAImB,CAAC,CAACf,IAAI,EAAEJ,GAAG,IAAI,KAAK;EACxB,IAAImB,CAAC,CAACd,MAAM,EAAEL,GAAG,IAAI,KAAK;EAC1B,IAAImB,CAAC,CAACb,SAAS,EAAEN,GAAG,IAAI,KAAK;EAC7B,IAAImB,CAAC,CAACZ,aAAa,EAAEP,GAAG,IAAI,KAAK;EACjC,OAAOA,GAAG;AACZ;AAEA,SAASsB,eAAeA,CAACH,CAAY,EAAU;EAC7C,IAAInB,GAAG,GAAG,EAAE;EACZ,IAAImB,CAAC,CAACZ,aAAa,EAAEP,GAAG,IAAI,MAAM;EAClC,IAAImB,CAAC,CAACb,SAAS,EAAEN,GAAG,IAAI,MAAM;EAC9B,IAAImB,CAAC,CAACd,MAAM,EAAEL,GAAG,IAAI,MAAM;EAC3B,IAAImB,CAAC,CAACf,IAAI,EAAEJ,GAAG,IAAI,MAAM;EACzB,OAAOA,GAAG;AACZ;;AAEA;AACA,MAAMuB,UAAU,GAAG,IAAI/D,GAAG,CAAC,CACzB,GAAG,EACH,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,CACL,CAAC;AACF,MAAMgE,YAAY,GAAG,IAAIhE,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AAEpE,SAASiE,aAAaA,CAACC,EAAW,EAAE3D,IAAY,EAAU;EACxD,IAAI,CAACwD,UAAU,CAACtD,GAAG,CAACF,IAAI,CAAC,EAAE,OAAO,EAAE;EACpC,MAAM4D,KAAK,GAAGrC,YAAY,CAACoC,EAAE,CAACE,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,YAAY,CAAC;EACxE,IAAI,CAACD,KAAK,EAAE,OAAO,EAAE;EACrB,MAAMlB,KAAK,GAAGkB,KAAK,CAACjD,WAAW,CAAC,CAAC;EACjC,IAAI,CAAC8C,YAAY,CAACvD,GAAG,CAACwC,KAAK,CAAC,EAAE,OAAO,EAAE;EACvC,OAAO,uBAAuBA,KAAK,GAAG;AACxC;AAEA,SAASoB,WAAWA,CAACH,EAAW,EAAEI,IAAY,EAAU;EACtD,MAAMC,GAAG,GAAGL,EAAE,CAACE,YAAY,CAACE,IAAI,CAAC;EACjC,IAAIC,GAAG,IAAI,IAAI,IAAIA,GAAG,KAAK,EAAE,EAAE,OAAO,EAAE;EACxC,MAAMC,OAAO,GAAGC,UAAU,CAACF,GAAG,CAAC;EAC/B,OAAO,IAAID,IAAI,KAAKE,OAAO,GAAG;AAChC;AAEA,SAASE,cAAcA,CAACR,EAAW,EAAE3D,IAAY,EAAU;EACzD,QAAQA,IAAI;IACV,KAAK,GAAG;MACN,OAAO8D,WAAW,CAACH,EAAE,EAAE,MAAM,CAAC;IAChC,KAAK,KAAK;MACR,OACEG,WAAW,CAACH,EAAE,EAAE,KAAK,CAAC,GACtBG,WAAW,CAACH,EAAE,EAAE,KAAK,CAAC,GACtBG,WAAW,CAACH,EAAE,EAAE,OAAO,CAAC,GACxBG,WAAW,CAACH,EAAE,EAAE,QAAQ,CAAC;IAE7B,KAAK,IAAI;MACP,OACE,CAACS,cAAc,CAACT,EAAE,CAAC,GAAG,uBAAuB,GAAG,EAAE,IAClDD,aAAa,CAACC,EAAE,EAAE3D,IAAI,CAAC;IAE3B,KAAK,IAAI;MACP;MACA,MAAMqE,SAAS,GACbV,EAAE,CAACW,YAAY,CAAC,SAAS,CAAC,IAC1BX,EAAE,CAACE,YAAY,CAAC,cAAc,CAAC,KAAK,MAAM,IAC1CF,EAAE,CAACE,YAAY,CAAC,cAAc,CAAC,KAAK,MAAM,IAC1CF,EAAE,CAACE,YAAY,CAAC,gBAAgB,CAAC,KAAK,GAAG,CAAC,CAAC;MAC7C,OAAOQ,SAAS,GAAG,UAAU,GAAG,EAAE;IACpC,KAAK,SAAS;MACZ,IAAIpC,GAAG,GAAG,EAAE;MACZ,KAAK,MAAM8B,IAAI,IAAI5C,KAAK,CAACC,IAAI,CAACuC,EAAE,CAACY,UAAU,CAAC,EAAE;QAC5CtC,GAAG,IAAI6B,WAAW,CAACH,EAAE,EAAEI,IAAI,CAAC/D,IAAI,CAAC;MACnC;MACA,OAAOiC,GAAG;IACZ;MACE;MACA,OAAOyB,aAAa,CAACC,EAAE,EAAE3D,IAAI,CAAC;EAClC;AACF;AAEA,SAASoE,cAAcA,CAACT,EAAW,EAAW;EAC5C,IACEA,EAAE,CAACE,YAAY,CAAC,WAAW,CAAC,KAAK,UAAU,IAC3CF,EAAE,CAACE,YAAY,CAAC,WAAW,CAAC,KAAK,cAAc,EAC/C;IACA,OAAO,IAAI;EACb;;EAEA;EACA;EACA,MAAMW,OAAO,GAAGrD,KAAK,CAACC,IAAI,CAACuC,EAAE,CAACc,QAAQ,CAAC,CAACC,IAAI,CACzCC,CAAC,IAAKA,CAAC,CAACjE,OAAO,CAACC,WAAW,CAAC,CAAC,KAAK,IACrC,CAAC;EACD,IAAI6D,OAAO,EAAE;IACX,MAAMI,IAAI,GAAGJ,OAAO,CAACX,YAAY,CAAC,MAAM,CAAC;IACzC,MAAMgB,SAAS,GAAGL,OAAO,CAACX,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE;;IAErD;IACA,IAAIe,IAAI,KAAK,UAAU,IAAIC,SAAS,CAAClC,QAAQ,CAAC,WAAW,CAAC,EAAE;MAC1D,OAAO,IAAI;IACb;EACF;EAEA,OAAO,KAAK;AACd;AAEA,SAASmC,mBAAmBA,CAACnB,EAAW,EAAEN,GAAW,EAAW;EAC9D,IAAIA,GAAG,KAAK,GAAG,EAAE,OAAO,KAAK;EAC7B,MAAM0B,EAAE,GAAGpB,EAAE,CAACE,YAAY,CAAC,IAAI,CAAC;EAChC,OAAO,CAAC,CAACkB,EAAE,IAAIA,EAAE,CAACC,UAAU,CAAC,qBAAqB,CAAC,IAAID,EAAE,CAACE,MAAM,GAAG,EAAE;AACvE;AAEA,SAASf,UAAUA,CAACd,CAAS,EAAU;EACrC,OAAOA,CAAC,CAACxB,OAAO,CAAC,UAAU,EAAGsD,KAAK,IAAK;IACtC,QAAQA,KAAK;MACX,KAAK,GAAG;QACN,OAAO,OAAO;MAChB,KAAK,GAAG;QACN,OAAO,MAAM;MACf,KAAK,GAAG;QACN,OAAO,MAAM;MACf,KAAK,GAAG;QACN,OAAO,QAAQ;MACjB,KAAK,GAAG;QACN,OAAO,OAAO;MAChB;QACE,OAAOA,KAAK;IAChB;EACF,CAAC,CAAC;AACJ;;AAEA;;AAEA,SAASC,gBAAgBA,CAACC,KAAa,EAAW;EAChD,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGD,KAAK,CAACH,MAAM,EAAEI,CAAC,EAAE,EAAE;IACrC,MAAMV,CAAC,GAAGS,KAAK,CAACE,UAAU,CAACD,CAAC,CAAC;IAC7B;IACA,IAAIV,CAAC,KAAK,IAAI,IAAIA,CAAC,KAAK,IAAI,IAAIA,CAAC,KAAK,IAAI,IAAIA,CAAC,KAAK,IAAI,IAAIA,CAAC,KAAK,IAAI,EAAE;MACtE,OAAO,KAAK;IACd;EACF;EACA,OAAO,IAAI;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA,SAASY,YAAYA,CACnBC,EAAmB,EACnBvD,GAAoB,EACpBwD,KAAK,GAAG,EAAE,EACD;EACT,MAAMC,OAAO,GAAGF,EAAE,CAACG,GAAG,CAACV,MAAM,GAAG,CAAC,IAAI,CAACE,gBAAgB,CAACK,EAAE,CAACG,GAAG,CAAC;EAC9D,IAAID,OAAO,EAAE;IACXzD,GAAG,CAAC0D,GAAG,IAAI,KAAKF,KAAK,IAAID,EAAE,CAACG,GAAG,MAAM;EACvC;EACAH,EAAE,CAACG,GAAG,GAAG,EAAE;EACX,OAAOD,OAAO;AAChB;AAEA,SAASE,iBAAiBA,CACxBxF,IAAa,EACboF,EAAmB,EACnBvD,GAAoB,EACd;EACN,KAAK,MAAMf,KAAK,IAAIC,KAAK,CAACC,IAAI,CAAChB,IAAI,CAACiB,UAAU,CAAC,EAAE;IAC/CwE,aAAa,CAAC3E,KAAK,EAAEsE,EAAE,EAAEvD,GAAG,CAAC;EAC/B;AACF;AAEA,SAAS4D,aAAaA,CACpBzF,IAAU,EACVoF,EAAmB,EACnBvD,GAAoB,EACd;EACN,IAAIzB,MAAM,CAACJ,IAAI,CAAC,EAAE;IAChB,MAAM0F,CAAC,GAAG1F,IAAI,CAAC2F,WAAW,IAAI,EAAE;IAChCP,EAAE,CAACG,GAAG,IAAIzB,UAAU,CAAC4B,CAAC,CAAC;IACvB;EACF;EACA,IAAI,CAAC3F,SAAS,CAACC,IAAI,CAAC,EAAE;EACtB,IAAIW,QAAQ,CAACX,IAAI,CAAC,EAAE;IAClB;IACA;IACA,IAAI,CAACmF,YAAY,CAACC,EAAE,EAAEvD,GAAG,CAAC,EAAE;MAC1BA,GAAG,CAAC0D,GAAG,IAAI,MAAM;IACnB;IACA;EACF;EACA,IAAI3E,gBAAgB,CAACZ,IAAI,CAAC,IAAIU,gBAAgB,CAACV,IAAI,CAAC,EAAE;IACpDmF,YAAY,CAACC,EAAE,EAAEvD,GAAG,CAAC;IACrB2D,iBAAiB,CAACxF,IAAI,EAAEoF,EAAE,EAAEvD,GAAG,CAAC;IAChC;IACAsD,YAAY,CAACC,EAAE,EAAEvD,GAAG,EAAEyB,aAAa,CAACtD,IAAI,EAAE,GAAG,CAAC,CAAC;IAC/C;EACF;EACA4F,QAAQ,CAAC5F,IAAI,EAAEoF,EAAE,CAAC;AACpB;;AAEA;;AASA,SAASS,aAAaA,CACpBT,EAAmB,EACnBvD,GAAoB,EACpBiE,GAAU,EACJ;EACN,IAAIV,EAAE,CAACG,GAAG,CAACV,MAAM,KAAK,CAAC,EAAE;EACzBhD,GAAG,CAAC0D,GAAG,IAAI,MAAMxB,cAAc,CAAC+B,GAAG,CAACvC,EAAE,EAAE,IAAI,CAAC,GAAG;EAChD1B,GAAG,CAAC0D,GAAG,IAAIrC,cAAc,CAAC4C,GAAG,CAACC,MAAM,CAAC;EACrClE,GAAG,CAAC0D,GAAG,IAAIH,EAAE,CAACG,GAAG;EACjB1D,GAAG,CAAC0D,GAAG,IAAIpC,eAAe,CAAC2C,GAAG,CAACC,MAAM,CAAC;EACtClE,GAAG,CAAC0D,GAAG,IAAI,OAAO;EAClBH,EAAE,CAACG,GAAG,GAAG,EAAE;EACXO,GAAG,CAACE,UAAU,GAAG,IAAI;AACvB;AAEA,SAASC,iBAAiBA,CACxBjG,IAAa,EACboF,EAAmB,EACnBvD,GAAoB,EACpBiE,GAAU,EACJ;EACN,KAAK,MAAMhF,KAAK,IAAIC,KAAK,CAACC,IAAI,CAAChB,IAAI,CAACiB,UAAU,CAAC,EAAE;IAC/CiF,aAAa,CAACpF,KAAK,EAAEsE,EAAE,EAAEvD,GAAG,EAAEiE,GAAG,CAAC;EACpC;AACF;AAEA,SAASI,aAAaA,CACpBlG,IAAU,EACVoF,EAAmB,EACnBvD,GAAoB,EACpBiE,GAAU,EACJ;EACN,IAAI1F,MAAM,CAACJ,IAAI,CAAC,EAAE;IAChBoF,EAAE,CAACG,GAAG,IAAIzB,UAAU,CAAC9D,IAAI,CAAC2F,WAAW,IAAI,EAAE,CAAC;IAC5C;EACF;EACA,IAAI,CAAC5F,SAAS,CAACC,IAAI,CAAC,EAAE;EAEtB,IAAIM,OAAO,CAACN,IAAI,CAAC,KAAK,KAAK,EAAE;IAC3B,MAAMwE,IAAI,GAAGsB,GAAG,CAACvC,EAAE,CAACE,YAAY,CAAC,MAAM,CAAC;IACxC;IACA,IAAIe,IAAI,KAAK,UAAU,EAAE;MACvB;IACF;EACF;EAEA,IAAIhE,UAAU,CAACR,IAAI,CAAC,EAAE;IACpB8F,GAAG,CAACK,WAAW,CAACrE,IAAI,CAAC9B,IAAI,CAAC;IAC1B;EACF;EACA,IAAIW,QAAQ,CAACX,IAAI,CAAC,EAAE;IAClB6F,aAAa,CAACT,EAAE,EAAEvD,GAAG,EAAEiE,GAAG,CAAC;IAC3B;EACF;EACA,IAAIlF,gBAAgB,CAACZ,IAAI,CAAC,IAAIU,gBAAgB,CAACV,IAAI,CAAC,EAAE;IACpD6F,aAAa,CAACT,EAAE,EAAEvD,GAAG,EAAEiE,GAAG,CAAC;IAC3BG,iBAAiB,CAACjG,IAAI,EAAEoF,EAAE,EAAEvD,GAAG,EAAEiE,GAAG,CAAC;IACrCD,aAAa,CAACT,EAAE,EAAEvD,GAAG,EAAEiE,GAAG,CAAC;IAC3B;EACF;EACAF,QAAQ,CAAC5F,IAAI,EAAEoF,EAAE,CAAC;AACpB;;AAEA;;AAEA,SAASgB,YAAYA,CAACpG,IAAa,EAAE6B,GAAoB,EAAQ;EAC/D,MAAMwC,QAAQ,GAAGtD,KAAK,CAACC,IAAI,CAAChB,IAAI,CAACiB,UAAU,CAAC;EAC5C,MAAMoF,YAAY,GAAG7F,UAAU,CAACR,IAAI,CAAC;EAErC,IAAIsG,QAAQ,GAAG,KAAK;EACpB,KAAK,MAAM/B,CAAC,IAAIF,QAAQ,EAAE;IACxB,IAAIzD,gBAAgB,CAAC2D,CAAC,CAAC,EAAE;MACvB+B,QAAQ,GAAG,IAAI;MACf;IACF;EACF;EAEA,IAAIrB,CAAC,GAAG,CAAC;EACT,OAAOA,CAAC,GAAGZ,QAAQ,CAACQ,MAAM,EAAE;IAC1B,MAAM/D,KAAK,GAAGuD,QAAQ,CAACY,CAAC,CAAE;;IAE1B;IACA,IAAIoB,YAAY,IAAItG,SAAS,CAACe,KAAK,CAAC,IAAIN,UAAU,CAACM,KAAK,CAAC,EAAE;MACzDsF,YAAY,CAACtF,KAAK,EAAEe,GAAG,CAAC;MACxBoD,CAAC,EAAE;MACH;IACF;;IAEA;IACA,IAAIlF,SAAS,CAACe,KAAK,CAAC,IAAIJ,gBAAgB,CAACI,KAAK,CAAC,EAAE;MAC/Ce,GAAG,CAAC0D,GAAG,IAAI,cAAc;MACzB,MAAMgB,IAAI,GAAG;QAAEhB,GAAG,EAAE;MAAG,CAAC;MACxB,OAAON,CAAC,GAAGZ,QAAQ,CAACQ,MAAM,EAAE;QAC1B,MAAM2B,GAAG,GAAGnC,QAAQ,CAACY,CAAC,CAAC;QACvB,IAAI,CAACuB,GAAG,IAAI,CAACzG,SAAS,CAACyG,GAAG,CAAC,IAAI,CAAC9F,gBAAgB,CAAC8F,GAAG,CAAC,EAAE;QACvDhB,iBAAiB,CAACgB,GAAG,EAAED,IAAI,EAAE1E,GAAG,CAAC;QACjCoD,CAAC,EAAE;MACL;MACAE,YAAY,CAACoB,IAAI,EAAE1E,GAAG,CAAC;MACvBA,GAAG,CAAC0D,GAAG,IAAI,eAAe;MAC1B;IACF;;IAEA;IACA,IACEe,QAAQ,IACR,CAACD,YAAY,IACb,CAACzF,gBAAgB,CAACE,KAAK,CAAC,IACxB,EAAEf,SAAS,CAACe,KAAK,CAAC,IAAIJ,gBAAgB,CAACI,KAAK,CAAC,CAAC,EAC9C;MACA,MAAMsE,EAAE,GAAG;QAAEG,GAAG,EAAE;MAAG,CAAC;MACtB,OAAON,CAAC,GAAGZ,QAAQ,CAACQ,MAAM,EAAE;QAC1B,MAAM2B,GAAG,GAAGnC,QAAQ,CAACY,CAAC,CAAE;QACxB,IACErE,gBAAgB,CAAC4F,GAAG,CAAC,IACpBzG,SAAS,CAACyG,GAAG,CAAC,IAAI9F,gBAAgB,CAAC8F,GAAG,CAAE,EACzC;UACA;QACF;QACA,IAAIzG,SAAS,CAACyG,GAAG,CAAC,IAAI7F,QAAQ,CAAC6F,GAAG,CAAC,EAAE;UACnC;UACA,IAAI,CAACrB,YAAY,CAACC,EAAE,EAAEvD,GAAG,CAAC,EAAE;YAC1BA,GAAG,CAAC0D,GAAG,IAAI,MAAM;UACnB;UACAN,CAAC,EAAE;UACH;QACF;QACA;QACA,IAAIlF,SAAS,CAACyG,GAAG,CAAC,IAAItF,iBAAiB,CAACsF,GAAG,CAAC,EAAE;UAC5CrB,YAAY,CAACC,EAAE,EAAEvD,GAAG,CAAC;UACrBuE,YAAY,CAACI,GAAG,EAAE3E,GAAG,CAAC;UACtBoD,CAAC,EAAE;UACH;QACF;QACAW,QAAQ,CAACY,GAAG,EAAEpB,EAAE,CAAC;QACjBH,CAAC,EAAE;MACL;MACAE,YAAY,CAACC,EAAE,EAAEvD,GAAG,CAAC;MACrB;IACF;IAEA+D,QAAQ,CAAC9E,KAAK,EAAEe,GAAG,CAAC;IACpBoD,CAAC,EAAE;EACL;AACF;AAEA,SAASW,QAAQA,CAAC5F,IAAU,EAAE6B,GAAoB,EAAQ;EACxD,IAAIzB,MAAM,CAACJ,IAAI,CAAC,EAAE;IAChB6B,GAAG,CAAC0D,GAAG,IAAIzB,UAAU,CAAC9D,IAAI,CAAC2F,WAAW,IAAI,EAAE,CAAC;IAC7C;EACF;EACA,IAAI,CAAC5F,SAAS,CAACC,IAAI,CAAC,EAAE;EAEtB,MAAMJ,IAAI,GAAGI,IAAI,CAACM,OAAO,CAACC,WAAW,CAAC,CAAC;EAEvC,IAAId,aAAa,CAACK,GAAG,CAACF,IAAI,CAAC,EAAE;EAE7B,IAAI8E,mBAAmB,CAAC1E,IAAI,EAAEJ,IAAI,CAAC,EAAE;IACnCwG,YAAY,CAACpG,IAAI,EAAE6B,GAAG,CAAC;IACvB;EACF;EAEA,MAAM4E,OAAO,GAAG9G,aAAa,CAACC,IAAI,CAAC;EACnC,MAAM8G,GAAG,GAAG7G,WAAW,CAACD,IAAI,CAAC;;EAE7B;EACA,IAAIA,IAAI,KAAK,MAAM,EAAE;IACnB,MAAMoD,CAAC,GAAGjB,aAAa,CAAC/B,IAAI,CAACyD,YAAY,CAAC,OAAO,CAAC,CAAC;IACnD5B,GAAG,CAAC0D,GAAG,IAAIrC,cAAc,CAACF,CAAC,CAAC;IAC5BoD,YAAY,CAACpG,IAAI,EAAE6B,GAAG,CAAC;IACvBA,GAAG,CAAC0D,GAAG,IAAIpC,eAAe,CAACH,CAAC,CAAC;IAC7B;EACF;;EAEA;EACA,IAAIpD,IAAI,KAAK,KAAK,EAAE;IAClB,MAAMoD,CAAC,GAAGjB,aAAa,CAAC/B,IAAI,CAACyD,YAAY,CAAC,OAAO,CAAC,CAAC;IACnD,IAAI5C,cAAc,CAACb,IAAI,CAAC,EAAE;MACxB,MAAM2G,EAAE,GAAG;QAAEpB,GAAG,EAAE;MAAG,CAAC;MACtB,KAAK,MAAMqB,EAAE,IAAI7F,KAAK,CAACC,IAAI,CAAChB,IAAI,CAACiB,UAAU,CAAC,EAAE;QAC5C,IAAIlB,SAAS,CAAC6G,EAAE,CAAC,IAAIjG,QAAQ,CAACiG,EAAE,CAAC,EAAE;UACjC,IAAID,EAAE,CAACpB,GAAG,CAACV,MAAM,GAAG,CAAC,EAAE;YACrBhD,GAAG,CAAC0D,GAAG,IAAI,MAAMrC,cAAc,CAACF,CAAC,CAAC,GAAG2D,EAAE,CAACpB,GAAG,GAAGpC,eAAe,CAACH,CAAC,CAAC,MAAM;UACxE,CAAC,MAAM;YACLnB,GAAG,CAAC0D,GAAG,IAAI,MAAM;UACnB;UACAoB,EAAE,CAACpB,GAAG,GAAG,EAAE;UACX;QACF;QACAK,QAAQ,CAACgB,EAAE,EAAED,EAAE,CAAC;MAClB;MACA,IAAIA,EAAE,CAACpB,GAAG,CAACV,MAAM,GAAG,CAAC,EAAE;QACrBhD,GAAG,CAAC0D,GAAG,IAAI,MAAMrC,cAAc,CAACF,CAAC,CAAC,GAAG2D,EAAE,CAACpB,GAAG,GAAGpC,eAAe,CAACH,CAAC,CAAC,MAAM;MACxE;IACF,CAAC,MAAM;MACLnB,GAAG,CAAC0D,GAAG,IAAIrC,cAAc,CAACF,CAAC,CAAC;MAC5BoD,YAAY,CAACpG,IAAI,EAAE6B,GAAG,CAAC;MACvBA,GAAG,CAAC0D,GAAG,IAAIpC,eAAe,CAACH,CAAC,CAAC;IAC/B;IACA;EACF;;EAEA;EACA,IAAItD,UAAU,CAACI,GAAG,CAACF,IAAI,CAAC,EAAE;IACxB,IAAIA,IAAI,KAAK,IAAI,IAAIA,IAAI,KAAK,IAAI,EAAE;MAClCwG,YAAY,CAACpG,IAAI,EAAE6B,GAAG,CAAC;MACvB;MACA,IAAIgF,GAAgB,GAAG7G,IAAI,CAAC8G,WAAW;MACvC,OAAOD,GAAG,IAAI,CAAC9G,SAAS,CAAC8G,GAAG,CAAC,EAAEA,GAAG,GAAGA,GAAG,CAACC,WAAW;MACpD,IAAID,GAAG,EAAEhF,GAAG,CAAC0D,GAAG,IAAI,GAAG;IACzB,CAAC,MAAM,IAAI3F,IAAI,KAAK,IAAI,EAAE;MACxB,MAAMmH,GAAG,GAAG;QAAExB,GAAG,EAAE;MAAG,CAAC;MACvBa,YAAY,CAACpG,IAAI,EAAE+G,GAAG,CAAC;MACvB,IAAIA,GAAG,CAACxB,GAAG,CAACV,MAAM,GAAG,CAAC,EAAE;QACtBhD,GAAG,CAAC0D,GAAG,IAAI,MAAMwB,GAAG,CAACxB,GAAG,MAAM;MAChC;IACF,CAAC,MAAM;MACLa,YAAY,CAACpG,IAAI,EAAE6B,GAAG,CAAC;IACzB;IACA;EACF;EAEA,IAAI6E,GAAG,KAAK,MAAM,IAAIA,GAAG,KAAK,MAAM,EAAE;IACpCN,YAAY,CAACpG,IAAI,EAAE6B,GAAG,CAAC;IACvB;EACF;EAEA,IAAI6E,GAAG,KAAK,cAAc,EAAE;IAC1B7E,GAAG,CAAC0D,GAAG,IAAI,IAAIkB,OAAO,GAAG1C,cAAc,CAAC/D,IAAI,EAAEyG,OAAO,CAAC,EAAE;IACxD5E,GAAG,CAAC0D,GAAG,IAAIkB,OAAO,KAAK,KAAK,GAAG,KAAK,GAAG,GAAG;IAC1C;EACF;;EAEA;EACA,MAAMO,EAAE,GAAGjE,WAAW,CAAChB,aAAa,CAAC/B,IAAI,CAACyD,YAAY,CAAC,OAAO,CAAC,CAAC,EAAEgD,OAAO,CAAC;;EAE1E;EACA,IAAIA,OAAO,KAAK,IAAI,EAAE;IACpB,MAAMN,WAAsB,GAAG,EAAE;IACjC,MAAMc,IAAI,GAAG;MAAE1B,GAAG,EAAE;IAAG,CAAC;IACxB,MAAMO,GAAU,GAAG;MAAEvC,EAAE,EAAEvD,IAAI;MAAE+F,MAAM,EAAEiB,EAAE;MAAEb,WAAW;MAAEH,UAAU,EAAE;IAAM,CAAC;IAC3EC,iBAAiB,CAACjG,IAAI,EAAEiH,IAAI,EAAEpF,GAAG,EAAEiE,GAAG,CAAC;IACvCD,aAAa,CAACoB,IAAI,EAAEpF,GAAG,EAAEiE,GAAG,CAAC;;IAE7B;IACA,IAAI,CAACA,GAAG,CAACE,UAAU,EAAE;MACnBnE,GAAG,CAAC0D,GAAG,IAAI,MAAMxB,cAAc,CAAC+B,GAAG,CAACvC,EAAE,EAAE,IAAI,CAAC,QAAQ;IACvD;IAEA,KAAK,MAAM2D,EAAE,IAAIf,WAAW,EAAEC,YAAY,CAACc,EAAE,EAAErF,GAAG,CAAC;IACnD;EACF;;EAEA;EACA,IAAI4E,OAAO,KAAK,WAAW,EAAE;IAC3B,MAAMU,IAAI,GAAGtG,cAAc,CAACb,IAAI,CAAC;IACjC6B,GAAG,CAAC0D,GAAG,IAAI,aAAa;IACxB,IAAI4B,IAAI,EAAEtF,GAAG,CAAC0D,GAAG,IAAI,KAAK;IAC1Ba,YAAY,CAACpG,IAAI,EAAE6B,GAAG,CAAC;IACvB,IAAIsF,IAAI,EAAEtF,GAAG,CAAC0D,GAAG,IAAI,MAAM;IAC3B1D,GAAG,CAAC0D,GAAG,IAAI,cAAc;IACzB;EACF;;EAEA;EACA1D,GAAG,CAAC0D,GAAG,IAAI,IAAIkB,OAAO,GAAG1C,cAAc,CAAC/D,IAAI,EAAEyG,OAAO,CAAC,GAAG;EACzD5E,GAAG,CAAC0D,GAAG,IAAIrC,cAAc,CAAC8D,EAAE,CAAC;EAC7BZ,YAAY,CAACpG,IAAI,EAAE6B,GAAG,CAAC;EACvBA,GAAG,CAAC0D,GAAG,IAAIpC,eAAe,CAAC6D,EAAE,CAAC;EAC9BnF,GAAG,CAAC0D,GAAG,IAAI,KAAKkB,OAAO,GAAG;AAC5B;AAEA,OAAO,SAASW,aAAaA,CAACC,IAAY,EAAU;EAClD,MAAMC,MAAM,GAAG,IAAIC,SAAS,CAAC,CAAC;EAC9B,MAAMC,GAAG,GAAGF,MAAM,CAACG,eAAe,CAAC,SAASJ,IAAI,SAAS,EAAE,WAAW,CAAC;EACvE,MAAMK,IAAI,GAAGF,GAAG,CAACE,IAAI;EACrB,MAAM7F,GAAG,GAAG;IAAE0D,GAAG,EAAE;EAAG,CAAC;EACvBa,YAAY,CAACsB,IAAI,EAAE7F,GAAG,CAAC;EACvB,OAAOA,GAAG,CAAC0D,GAAG;AAChB","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["INLINE_TAGS","Set","BLOCK_TAGS","SELF_CLOSING_TAGS","PASS_TAGS","STRIPPED_TAGS","TABLE_TAGS","canonicalName","name","classifyTag","has","isElement","node","nodeType","Node","ELEMENT_NODE","isText","TEXT_NODE","tagName","toLowerCase","isListNode","n","isBlockquoteNode","isBrNode","isBlockProducing","isPurelyInline","child","Array","from","childNodes","hasBlockOrBqChild","findCssValue","style","prop","re","RegExp","replace","m","exec","trim","findAllCssValues","out","push","parseCssStyle","result","bold","italic","underline","strikethrough","fw","lower","includes","num","parseInt","Number","isNaN","fs","decorations","v","extraStyles","s","tag","emitStylesOpen","emitStylesClose","ALIGN_TAGS","ALIGN_VALUES","emitAlignment","el","align","getAttribute","emitOneAttr","attr","val","escaped","escapeText","emitAttributes","isCheckboxList","isChecked","hasAttribute","attributes","firstLi","children","find","c","role","className","isGoogleDocsWrapper","id","startsWith","length","match","isWhitespaceOnly","value","i","charCodeAt","flushInlineP","ib","attrs","emitted","buf","flattenBqChildren","flattenBqNode","t","textContent","walkNode","flushLiBuffer","ctx","styles","hasEmitted","flattenLiChildren","flattenLiNode","nestedLists","walkChildren","parentIsList","hasBlock","bqIb","cur","outName","cls","pb","dc","sib","nextSibling","row","es","liIb","nl","wrap","normalizeHtml","html","parser","DOMParser","doc","parseFromString","body"],"sourceRoot":"../../../../src","sources":["web/normalization/htmlNormalizer.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,13 +3,18 @@
|
|
|
3
3
|
import DOMPurify from 'dompurify';
|
|
4
4
|
const MENTION_ATTRS = ['text', 'indicator'];
|
|
5
5
|
|
|
6
|
+
// Non-URL <img> attributes we emit. They must be listed as "URI safe" because
|
|
7
|
+
// DOMPurify validates every attribute value that isn't in its built-in
|
|
8
|
+
// URI_SAFE_ATTRIBUTES set against ALLOWED_URI_REGEXP.
|
|
9
|
+
const IMG_DIMENSION_ATTRS = ['width', 'height'];
|
|
10
|
+
|
|
6
11
|
// Attributes DOMPurify keeps by default and are commonly used, so we don't emit an unnecessary warning
|
|
7
12
|
const COMMONLY_ALLOWED_ATTRS = ['id', 'class', 'style'];
|
|
8
13
|
export function sanitizeHtml(html, config) {
|
|
9
14
|
return DOMPurify.sanitize(html, {
|
|
10
15
|
ADD_TAGS: ['mention', 'codeblock'],
|
|
11
16
|
ADD_ATTR: MENTION_ATTRS,
|
|
12
|
-
ADD_URI_SAFE_ATTR: MENTION_ATTRS,
|
|
17
|
+
ADD_URI_SAFE_ATTR: [...MENTION_ATTRS, ...IMG_DIMENSION_ATTRS],
|
|
13
18
|
// if not supplied, fall back to DOMPurify's built-in default.
|
|
14
19
|
...(config?.linkRegex ? {
|
|
15
20
|
ALLOWED_URI_REGEXP: config.linkRegex
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["DOMPurify","MENTION_ATTRS","COMMONLY_ALLOWED_ATTRS","sanitizeHtml","html","config","sanitize","ADD_TAGS","ADD_ATTR","ADD_URI_SAFE_ATTR","linkRegex","ALLOWED_URI_REGEXP","sanitizeMentionAttributes","attributes","el","document","createElement","name","value","Object","entries","setAttribute","cleaned","DOMParser","parseFromString","outerHTML","querySelector","out","attr","Array","from","includes","toLowerCase","checkMentionAttributes","keys","forEach","attrName","lower","startsWith","console","warn"],"sourceRoot":"../../../../src","sources":["web/sanitization/htmlSanitizer.ts"],"mappings":";;AAAA,OAAOA,SAAS,MAAM,WAAW;AAGjC,MAAMC,aAAa,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC;;AAE3C;AACA,MAAMC,sBAAsB,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC;AAEvD,OAAO,SAASC,YAAYA,CAACC,IAAY,EAAEC,MAA2B,EAAE;EACtE,
|
|
1
|
+
{"version":3,"names":["DOMPurify","MENTION_ATTRS","IMG_DIMENSION_ATTRS","COMMONLY_ALLOWED_ATTRS","sanitizeHtml","html","config","sanitize","ADD_TAGS","ADD_ATTR","ADD_URI_SAFE_ATTR","linkRegex","ALLOWED_URI_REGEXP","sanitizeMentionAttributes","attributes","el","document","createElement","name","value","Object","entries","setAttribute","cleaned","DOMParser","parseFromString","outerHTML","querySelector","out","attr","Array","from","includes","toLowerCase","checkMentionAttributes","keys","forEach","attrName","lower","startsWith","console","warn"],"sourceRoot":"../../../../src","sources":["web/sanitization/htmlSanitizer.ts"],"mappings":";;AAAA,OAAOA,SAAS,MAAM,WAAW;AAGjC,MAAMC,aAAa,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC;;AAE3C;AACA;AACA;AACA,MAAMC,mBAAmB,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC;;AAE/C;AACA,MAAMC,sBAAsB,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC;AAEvD,OAAO,SAASC,YAAYA,CAACC,IAAY,EAAEC,MAA2B,EAAE;EACtE,OAAON,SAAS,CAACO,QAAQ,CAACF,IAAI,EAAE;IAC9BG,QAAQ,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC;IAClCC,QAAQ,EAAER,aAAa;IACvBS,iBAAiB,EAAE,CAAC,GAAGT,aAAa,EAAE,GAAGC,mBAAmB,CAAC;IAC7D;IACA,IAAII,MAAM,EAAEK,SAAS,GAAG;MAAEC,kBAAkB,EAAEN,MAAM,CAACK;IAAU,CAAC,GAAG,CAAC,CAAC;EACvE,CAAC,CAAC;AACJ;AAEA,OAAO,SAASE,yBAAyBA,CACvCC,UAAmC,EACX;EACxB,IAAI,CAACA,UAAU,EAAE,OAAO,CAAC,CAAC;EAE1B,MAAMC,EAAE,GAAGC,QAAQ,CAACC,aAAa,CAAC,SAAS,CAAC;EAC5C,KAAK,MAAM,CAACC,IAAI,EAAEC,KAAK,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACP,UAAU,CAAC,EAAE;IACtD,IAAI;MACFC,EAAE,CAACO,YAAY,CAACJ,IAAI,EAAEC,KAAK,CAAC;IAC9B,CAAC,CAAC,MAAM;MACN;IAAA;EAEJ;EAEA,MAAMI,OAAO,GAAG,IAAIC,SAAS,CAAC,CAAC,CAC5BC,eAAe,CAACrB,YAAY,CAACW,EAAE,CAACW,SAAS,CAAC,EAAE,WAAW,CAAC,CACxDC,aAAa,CAAC,SAAS,CAAC;EAE3B,MAAMC,GAA2B,GAAG,CAAC,CAAC;EACtC,IAAI,CAACL,OAAO,EAAE,OAAOK,GAAG;EAExB,KAAK,MAAMC,IAAI,IAAIC,KAAK,CAACC,IAAI,CAACR,OAAO,CAACT,UAAU,CAAC,EAAE;IACjD,IAAIb,aAAa,CAAC+B,QAAQ,CAACH,IAAI,CAACX,IAAI,CAACe,WAAW,CAAC,CAAC,CAAC,EAAE;IACrDL,GAAG,CAACC,IAAI,CAACX,IAAI,CAAC,GAAGW,IAAI,CAACV,KAAK;EAC7B;EACA,OAAOS,GAAG;AACZ;;AAEA;AACA;AACA,OAAO,SAASM,sBAAsBA,CAACpB,UAAmC,EAAE;EAC1E,IAAI,CAACA,UAAU,EAAE;EAEjBM,MAAM,CAACe,IAAI,CAACrB,UAAU,CAAC,CAACsB,OAAO,CAAEC,QAAQ,IAAK;IAC5C,MAAMC,KAAK,GAAGD,QAAQ,CAACJ,WAAW,CAAC,CAAC;IACpC,IACEK,KAAK,CAACC,UAAU,CAAC,OAAO,CAAC,IACzBtC,aAAa,CAAC+B,QAAQ,CAACM,KAAK,CAAC,IAC7BnC,sBAAsB,CAAC6B,QAAQ,CAACM,KAAK,CAAC,EACtC;MACA;IACF;IACAE,OAAO,CAACC,IAAI,CACV,gCAAgCJ,QAAQ,6DAA6D,GACnG,+DACJ,CAAC;EACH,CAAC,CAAC;AACJ","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"htmlSanitizer.d.ts","sourceRoot":"","sources":["../../../../../src/web/sanitization/htmlSanitizer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"htmlSanitizer.d.ts","sourceRoot":"","sources":["../../../../../src/web/sanitization/htmlSanitizer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAa,CAAC;AAYtD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,UAQrE;AAED,wBAAgB,yBAAyB,CACvC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAwBxB;AAID,wBAAgB,sBAAsB,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAiBzE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-enriched-html",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "HTML-based Rich Text solution for React Native",
|
|
5
5
|
"source": "./src/index.tsx",
|
|
6
6
|
"main": "./lib/module/index.js",
|
|
@@ -44,11 +44,14 @@
|
|
|
44
44
|
"scripts": {
|
|
45
45
|
"example": "yarn workspace react-native-enriched-example",
|
|
46
46
|
"example-web": "yarn workspace react-native-enriched-web-example",
|
|
47
|
+
"docs-install": "cd docs && yarn install",
|
|
48
|
+
"docs-start": "cd docs && yarn start",
|
|
47
49
|
"test": "jest --passWithNoTests",
|
|
48
50
|
"typecheck": "yarn typecheck:lib && yarn typecheck:example && yarn typecheck:example-web",
|
|
49
51
|
"typecheck:lib": "tsc -p tsconfig.build.json",
|
|
50
52
|
"typecheck:example": "tsc -p apps/example/tsconfig.json",
|
|
51
53
|
"typecheck:example-web": "tsc -p apps/example-web/tsconfig.app.json",
|
|
54
|
+
"typecheck:docs": "tsc -p docs/tsconfig.json",
|
|
52
55
|
"lint": "eslint \"**/*.{js,ts,tsx}\"",
|
|
53
56
|
"lint:android": "cd apps/example/android && ./gradlew lintVerify",
|
|
54
57
|
"lint:android:fix": "cd apps/example/android && ./gradlew lintFormat",
|
package/src/web/EnrichedText.css
CHANGED
|
@@ -366,7 +366,9 @@
|
|
|
366
366
|
vertical-align: text-bottom;
|
|
367
367
|
}
|
|
368
368
|
|
|
369
|
-
.et-view img.error
|
|
369
|
+
.et-view img.error,
|
|
370
|
+
.et-view img:not([src]),
|
|
371
|
+
.et-view img[src=""] {
|
|
370
372
|
content: linear-gradient(transparent, transparent);
|
|
371
373
|
background-color: currentColor;
|
|
372
374
|
-webkit-mask: var(--et-broken-image-glyph) no-repeat center / contain;
|
|
@@ -267,7 +267,7 @@ function emitAttributes(el: Element, name: string): string {
|
|
|
267
267
|
return emitOneAttr(el, 'href');
|
|
268
268
|
case 'img':
|
|
269
269
|
return (
|
|
270
|
-
emitOneAttr(el, 'src') +
|
|
270
|
+
(el.getAttribute('src') ? emitOneAttr(el, 'src') : ' src=""') +
|
|
271
271
|
emitOneAttr(el, 'alt') +
|
|
272
272
|
emitOneAttr(el, 'width') +
|
|
273
273
|
emitOneAttr(el, 'height')
|
|
@@ -3,6 +3,11 @@ import type { SanitizationConfig } from '../../types';
|
|
|
3
3
|
|
|
4
4
|
const MENTION_ATTRS = ['text', 'indicator'];
|
|
5
5
|
|
|
6
|
+
// Non-URL <img> attributes we emit. They must be listed as "URI safe" because
|
|
7
|
+
// DOMPurify validates every attribute value that isn't in its built-in
|
|
8
|
+
// URI_SAFE_ATTRIBUTES set against ALLOWED_URI_REGEXP.
|
|
9
|
+
const IMG_DIMENSION_ATTRS = ['width', 'height'];
|
|
10
|
+
|
|
6
11
|
// Attributes DOMPurify keeps by default and are commonly used, so we don't emit an unnecessary warning
|
|
7
12
|
const COMMONLY_ALLOWED_ATTRS = ['id', 'class', 'style'];
|
|
8
13
|
|
|
@@ -10,7 +15,7 @@ export function sanitizeHtml(html: string, config?: SanitizationConfig) {
|
|
|
10
15
|
return DOMPurify.sanitize(html, {
|
|
11
16
|
ADD_TAGS: ['mention', 'codeblock'],
|
|
12
17
|
ADD_ATTR: MENTION_ATTRS,
|
|
13
|
-
ADD_URI_SAFE_ATTR: MENTION_ATTRS,
|
|
18
|
+
ADD_URI_SAFE_ATTR: [...MENTION_ATTRS, ...IMG_DIMENSION_ATTRS],
|
|
14
19
|
// if not supplied, fall back to DOMPurify's built-in default.
|
|
15
20
|
...(config?.linkRegex ? { ALLOWED_URI_REGEXP: config.linkRegex } : {}),
|
|
16
21
|
});
|