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 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 web support
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
  ![react-native-enriched-html-demo](https://github.com/user-attachments/assets/a2c968c0-9b85-492f-ac71-af64ef231fbf)
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
- ### Bare react native app
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
- - Inline styles (bold, italic, underline, strikethrough, inline code). They are being toggled on exactly the character range that is currently selected. When toggling the style with just the cursor in place (no selection), the style is ready to be used and will be applied to the next characters that the user inputs.
26
+ ## Compatibility
226
27
 
227
- - Paragraph styles (headings, codeblock, blockquote, lists). They are being toggled on the entire paragraph that the selection is in. By paragraph, we mean a part of the text between two newlines (enters) or the text's beginning/ending.
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
- ## Links
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
- The links are here, just like in any other editor, a piece of text with a URL attributed to it. They can be added in two ways: automatically or manually.
32
+ ## Documentation
233
33
 
234
- ### Automatic links detection
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
- `react-native-enriched-html` automatically detects words that appear to be some URLs and makes them links.
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
- ### Applying links manually
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
- Links can also be added by calling [`setLink`](docs/INPUT_API_REFERENCE.md#setlink) method on the input ref:
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
- - Only one level of lists is supported. We currently do not support nested lists.
43
+ `react-native-enriched-html` library is licensed under [The MIT License](./LICENSE).
380
44
 
381
- ## Contributing
45
+ ## Community Discord
382
46
 
383
- See the [contributing guide](CONTRIBUTING.md) to learn how to contribute to the repository and the development workflow.
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
- ## License
49
+ ## Created by Software Mansion
386
50
 
387
- `react-native-enriched-html` library is licensed under [The MIT License](./LICENSE).
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
  &nbsp;&nbsp;&nbsp;
395
- <img width="48" height="48" alt="" src="https://github.com/user-attachments/assets/46c6bf1f-2685-497e-b699-d5a94b2582a3" />
396
- &nbsp;&nbsp;&nbsp;
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 (with or without style attributes) with <br>
98
- String normalizedHtml = normalizedBlockQuote.replaceAll("<p[^>]*></p>", "<br>");
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
- val typeface = Typeface.create(Typeface.MONOSPACE, Typeface.NORMAL)
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
- val typeface = Typeface.create(Typeface.MONOSPACE, Typeface.NORMAL)
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 = (end + 1).coerceAtMost(spannable.length)
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
- emit_one_attr(out, el, "src");
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
- [result appendString:@"\n<br>"];
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:(NSString *)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":"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","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,OAAOL,SAAS,CAACM,QAAQ,CAACF,IAAI,EAAE;IAC9BG,QAAQ,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC;IAClCC,QAAQ,EAAEP,aAAa;IACvBQ,iBAAiB,EAAER,aAAa;IAChC;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,IAAIZ,aAAa,CAAC8B,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,IACzBrC,aAAa,CAAC8B,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
+ {"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;AAOtD,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"}
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.0",
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",
@@ -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
  });