@expensify/react-native-live-markdown 0.1.335 → 0.1.337

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
@@ -20,7 +20,7 @@ npm install @expensify/react-native-live-markdown react-native-worklets expensif
20
20
  npx expo install @expensify/react-native-live-markdown react-native-worklets expensify-common html-entities@2.5.3
21
21
  ```
22
22
 
23
- React Native Live Markdown requires [react-native-worklets](https://github.com/software-mansion/react-native-reanimated/tree/main/packages/react-native-worklets) 0.7.0 or newer as well as [expensify-common](https://github.com/Expensify/expensify-common) 2.0.115 and [html-entities](https://github.com/mdevils/html-entities) 2.5.3 exactly if using the default built-in ExpensiMark parser.
23
+ React Native Live Markdown requires [react-native-worklets](https://github.com/software-mansion/react-native-reanimated/tree/main/packages/react-native-worklets) 0.7.0 or newer as well as [expensify-common](https://github.com/Expensify/expensify-common) 2.0.201 or newer and [html-entities](https://github.com/mdevils/html-entities) 2.5.3 exactly if using the default built-in ExpensiMark parser.
24
24
 
25
25
  > [!IMPORTANT]
26
26
  > Please follow the `react-native-worklets` [Getting Started](https://docs.swmansion.com/react-native-worklets/docs/fundamentals/getting-started/#react-native-community-cli) guide to avoid issues.
@@ -55,6 +55,16 @@ export default function App() {
55
55
  }
56
56
  ```
57
57
 
58
+ The built-in `parseExpensiMark` parser accepts an optional maximum input length. It defaults to 4,000 characters and returns no formatting ranges when the input is longer than the configured limit. To use a different limit, wrap the parser in a worklet function:
59
+
60
+ ```ts
61
+ function parser(input: string) {
62
+ 'worklet';
63
+
64
+ return parseExpensiMark(input, 5000);
65
+ }
66
+ ```
67
+
58
68
  ## Styling
59
69
 
60
70
  `MarkdownTextInput` can be styled using `style` prop just like regular `TextInput` component.
@@ -8,6 +8,26 @@ NS_ASSUME_NONNULL_BEGIN
8
8
  - (NSArray<MarkdownRange *> *)parse:(nonnull NSString *)text
9
9
  withParserId:(nonnull NSNumber *)parserId;
10
10
 
11
- NS_ASSUME_NONNULL_END
11
+ // Returns the ranges for (text, parserId) if they are already in the cache, or
12
+ // nil if they aren't. This never runs the parser, so it is safe to call from
13
+ // the main thread while Yoga is measuring.
14
+ - (nullable NSArray<MarkdownRange *> *)cachedRangesForText:(nonnull NSString *)text
15
+ withParserId:(nonnull NSNumber *)parserId;
16
+
17
+ // Parses in the background and puts the result in the cache, so the caller
18
+ // doesn't have to wait for the parser. Used by the main thread, which must
19
+ // never wait for it (see Sentry APP-EF1).
20
+ //
21
+ // Only the newest request matters: a new call replaces one that is still
22
+ // waiting. A parse that already started can't be stopped, but the newest text
23
+ // is parsed as soon as it finishes.
24
+ //
25
+ // `completion` runs on the background queue once the text is cached. It is
26
+ // skipped if a newer call replaced this one, since that call reports instead.
27
+ - (void)warmCacheAsyncForText:(nonnull NSString *)text
28
+ withParserId:(nonnull NSNumber *)parserId
29
+ completion:(nullable void (^)(void))completion;
12
30
 
13
31
  @end
32
+
33
+ NS_ASSUME_NONNULL_END
@@ -2,77 +2,257 @@
2
2
  #import <RNLiveMarkdown/MarkdownGlobal.h>
3
3
  #import <React/RCTLog.h>
4
4
 
5
+ // The main thread can only use ranges that are already cached (see
6
+ // RCTMarkdownUtils), and one entry was not enough: two texts taking turns kept
7
+ // overwriting each other, so the main thread never found what it needed. A few
8
+ // entries cover that case (typing then undoing, or an input echoing back older
9
+ // text), and the list is still small enough to scan one by one.
10
+ static const NSUInteger kMarkdownParserCacheCapacity = 4;
11
+
12
+ @interface MarkdownParserCacheEntry : NSObject
13
+
14
+ @property (nonatomic, readonly, nonnull) NSString *text;
15
+ @property (nonatomic, readonly, nonnull) NSNumber *parserId;
16
+ @property (nonatomic, readonly, nonnull) NSArray<MarkdownRange *> *markdownRanges;
17
+
18
+ - (instancetype)initWithText:(nonnull NSString *)text
19
+ parserId:(nonnull NSNumber *)parserId
20
+ markdownRanges:(nonnull NSArray<MarkdownRange *> *)markdownRanges;
21
+
22
+ - (BOOL)matchesText:(nonnull NSString *)text parserId:(nonnull NSNumber *)parserId;
23
+
24
+ @end
25
+
26
+ @implementation MarkdownParserCacheEntry
27
+
28
+ - (instancetype)initWithText:(nonnull NSString *)text
29
+ parserId:(nonnull NSNumber *)parserId
30
+ markdownRanges:(nonnull NSArray<MarkdownRange *> *)markdownRanges
31
+ {
32
+ if (self = [super init]) {
33
+ _text = [text copy];
34
+ _parserId = parserId;
35
+ _markdownRanges = markdownRanges;
36
+ }
37
+
38
+ return self;
39
+ }
40
+
41
+ - (BOOL)matchesText:(nonnull NSString *)text parserId:(nonnull NSNumber *)parserId
42
+ {
43
+ // Check the parser id first - comparing numbers is cheaper than strings.
44
+ return [_parserId isEqualToNumber:parserId] && [_text isEqualToString:text];
45
+ }
46
+
47
+ @end
48
+
49
+ // Everything below is only read and written inside `@synchronized (self)`.
5
50
  @implementation MarkdownParser {
6
- NSString *_prevText;
7
- NSNumber *_prevParserId;
8
- NSArray<MarkdownRange *> *_prevMarkdownRanges;
51
+ // Newest entry first, at index 0.
52
+ NSMutableArray<MarkdownParserCacheEntry *> *_cache;
53
+
54
+ // The next text to parse in the background, if there is one.
55
+ NSString *_pendingText;
56
+ NSNumber *_pendingParserId;
57
+ void (^_pendingCompletion)(void);
58
+ BOOL _warmupScheduled;
9
59
  }
10
60
 
11
- - (NSArray<MarkdownRange *> *)parse:(nonnull NSString *)text
12
- withParserId:(nonnull NSNumber *)parserId
61
+ - (instancetype)init
62
+ {
63
+ if (self = [super init]) {
64
+ _cache = [[NSMutableArray alloc] initWithCapacity:kMarkdownParserCacheCapacity];
65
+ }
66
+
67
+ return self;
68
+ }
69
+
70
+ // One background queue for parsing off the main thread. A serial queue is
71
+ // enough: the worklet runtime only runs one parse at a time anyway, and this
72
+ // keeps us from doing the same work twice.
73
+ + (dispatch_queue_t)cacheWarmupQueue
74
+ {
75
+ static dispatch_queue_t queue;
76
+ static dispatch_once_t onceToken;
77
+ dispatch_once(&onceToken, ^{
78
+ dispatch_queue_attr_t attr = dispatch_queue_attr_make_with_qos_class(
79
+ DISPATCH_QUEUE_SERIAL, QOS_CLASS_USER_INITIATED, 0);
80
+ queue = dispatch_queue_create("com.expensify.livemarkdown.parser-cache-warmup", attr);
81
+ });
82
+ return queue;
83
+ }
84
+
85
+ - (nullable NSArray<MarkdownRange *> *)cachedRangesForText:(nonnull NSString *)text
86
+ withParserId:(nonnull NSNumber *)parserId
13
87
  {
14
88
  @synchronized (self) {
15
- if ([text isEqualToString:_prevText] && [parserId isEqualToNumber:_prevParserId]) {
16
- return _prevMarkdownRanges;
89
+ for (NSUInteger i = 0, n = _cache.count; i < n; i++) {
90
+ MarkdownParserCacheEntry *entry = _cache[i];
91
+ if (![entry matchesText:text parserId:parserId]) {
92
+ continue;
93
+ }
94
+ if (i != 0) {
95
+ // Move it to the front, so the text we keep asking for is not the one
96
+ // we throw away next.
97
+ [_cache removeObjectAtIndex:i];
98
+ [_cache insertObject:entry atIndex:0];
99
+ }
100
+ return entry.markdownRanges;
17
101
  }
102
+ }
103
+
104
+ return nil;
105
+ }
18
106
 
19
- const auto &markdownRuntime = expensify::livemarkdown::getMarkdownRuntime();
20
- jsi::Runtime &rt = markdownRuntime->getJSIRuntime();
21
-
22
- std::shared_ptr<SerializableWorklet> markdownWorklet;
23
- try {
24
- markdownWorklet = expensify::livemarkdown::getMarkdownWorklet([parserId intValue]);
25
- } catch (const std::out_of_range &error) {
26
- _prevText = [NSString stringWithString:text];
27
- _prevParserId = parserId;
28
- _prevMarkdownRanges = @[];
29
- return _prevMarkdownRanges;
107
+ - (void)cacheMarkdownRanges:(nonnull NSArray<MarkdownRange *> *)markdownRanges
108
+ forText:(nonnull NSString *)text
109
+ withParserId:(nonnull NSNumber *)parserId
110
+ {
111
+ MarkdownParserCacheEntry *entry = [[MarkdownParserCacheEntry alloc] initWithText:text
112
+ parserId:parserId
113
+ markdownRanges:markdownRanges];
114
+
115
+ @synchronized (self) {
116
+ for (NSUInteger i = 0, n = _cache.count; i < n; i++) {
117
+ if ([_cache[i] matchesText:text parserId:parserId]) {
118
+ [_cache removeObjectAtIndex:i];
119
+ break;
120
+ }
30
121
  }
122
+ [_cache insertObject:entry atIndex:0];
123
+ while (_cache.count > kMarkdownParserCacheCapacity) {
124
+ [_cache removeLastObject];
125
+ }
126
+ }
127
+ }
128
+
129
+ - (void)warmCacheAsyncForText:(nonnull NSString *)text
130
+ withParserId:(nonnull NSNumber *)parserId
131
+ completion:(nullable void (^)(void))completion
132
+ {
133
+ @synchronized (self) {
134
+ // Keep only the newest request: replace anything that is waiting but
135
+ // hasn't started, so old text can never win over newer text. The replaced
136
+ // completion goes with it, since the new request will report instead.
137
+ _pendingText = [text copy];
138
+ _pendingParserId = parserId;
139
+ _pendingCompletion = completion;
31
140
 
32
- const auto &input = jsi::String::createFromUtf8(rt, [text UTF8String]);
33
-
34
- jsi::Value output;
35
- try {
36
- output = markdownRuntime->runGuarded(markdownWorklet, input);
37
- } catch (const jsi::JSError &error) {
38
- // Skip formatting, runGuarded will show the error in LogBox
39
- _prevText = [NSString stringWithString:text];
40
- _prevParserId = parserId;
41
- _prevMarkdownRanges = @[];
42
- return _prevMarkdownRanges;
141
+ if (_warmupScheduled) {
142
+ // A background loop is already running and will pick this up.
143
+ return;
43
144
  }
145
+ _warmupScheduled = YES;
146
+ }
44
147
 
45
- NSMutableArray<MarkdownRange *> *markdownRanges = [[NSMutableArray alloc] init];
46
- try {
47
- const auto &ranges = output.asObject(rt).asArray(rt);
48
- for (size_t i = 0, n = ranges.size(rt); i < n; ++i) {
49
- const auto &item = ranges.getValueAtIndex(rt, i).asObject(rt);
50
- const auto &type = item.getProperty(rt, "type").asString(rt).utf8(rt);
51
- const auto &start = static_cast<int>(item.getProperty(rt, "start").asNumber());
52
- const auto &length = static_cast<int>(item.getProperty(rt, "length").asNumber());
53
- const auto &depth = item.hasProperty(rt, "depth") ? static_cast<int>(item.getProperty(rt, "depth").asNumber()) : 1;
54
-
55
- if (length == 0 || start + length > text.length) {
56
- continue;
57
- }
58
-
59
- NSRange range = NSMakeRange(start, length);
60
- MarkdownRange *markdownRange = [[MarkdownRange alloc] initWithType:@(type.c_str()) range:range depth:depth];
61
- [markdownRanges addObject:markdownRange];
148
+ __weak MarkdownParser *weakSelf = self;
149
+ dispatch_async([MarkdownParser cacheWarmupQueue], ^{
150
+ [weakSelf drainPendingWarmups];
151
+ });
152
+ }
153
+
154
+ - (void)drainPendingWarmups
155
+ {
156
+ while (true) {
157
+ NSString *text;
158
+ NSNumber *parserId;
159
+ void (^completion)(void);
160
+
161
+ @synchronized (self) {
162
+ if (_pendingText == nil) {
163
+ _warmupScheduled = NO;
164
+ return;
62
165
  }
63
- } catch (const jsi::JSError &error) {
64
- RCTLogWarn(@"[react-native-live-markdown] Incorrect schema of worklet parser output: %s", error.getMessage().c_str());
65
- _prevText = [NSString stringWithString:text];
66
- _prevParserId = parserId;
67
- _prevMarkdownRanges = @[];
68
- return _prevMarkdownRanges;
166
+ text = _pendingText;
167
+ parserId = _pendingParserId;
168
+ completion = _pendingCompletion;
169
+ _pendingText = nil;
170
+ _pendingParserId = nil;
171
+ _pendingCompletion = nil;
172
+ }
173
+
174
+ [self parse:text withParserId:parserId];
175
+
176
+ BOOL superseded;
177
+ @synchronized (self) {
178
+ superseded = _pendingText != nil;
179
+ }
180
+ if (completion != nil && !superseded) {
181
+ completion();
69
182
  }
183
+ }
184
+ }
185
+
186
+ - (NSArray<MarkdownRange *> *)parse:(nonnull NSString *)text
187
+ withParserId:(nonnull NSNumber *)parserId
188
+ {
189
+ NSArray<MarkdownRange *> *cached = [self cachedRangesForText:text withParserId:parserId];
190
+ if (cached != nil) {
191
+ return cached;
192
+ }
193
+
194
+ // Parse WITHOUT holding an Objective-C lock. Running the parser waits for the
195
+ // worklet runtime, and holding a lock while waiting is what froze the app
196
+ // (Sentry APP-EF1): a background thread held this lock and waited on the
197
+ // runtime, so the main thread was stuck waiting for the lock while measuring,
198
+ // until iOS killed the app.
199
+ //
200
+ // Two threads may end up parsing the same text at the same time. That is
201
+ // fine: they run one after the other and produce the same result.
202
+ NSArray<MarkdownRange *> *markdownRanges = [self parseUncached:text withParserId:parserId];
203
+
204
+ [self cacheMarkdownRanges:markdownRanges forText:text withParserId:parserId];
70
205
 
71
- _prevText = [NSString stringWithString:text];
72
- _prevParserId = parserId;
73
- _prevMarkdownRanges = markdownRanges;
74
- return _prevMarkdownRanges;
206
+ return markdownRanges;
207
+ }
208
+
209
+ - (NSArray<MarkdownRange *> *)parseUncached:(nonnull NSString *)text
210
+ withParserId:(nonnull NSNumber *)parserId
211
+ {
212
+ const auto &markdownRuntime = expensify::livemarkdown::getMarkdownRuntime();
213
+ jsi::Runtime &rt = markdownRuntime->getJSIRuntime();
214
+
215
+ std::shared_ptr<SerializableWorklet> markdownWorklet;
216
+ try {
217
+ markdownWorklet = expensify::livemarkdown::getMarkdownWorklet([parserId intValue]);
218
+ } catch (const std::out_of_range &error) {
219
+ return @[];
75
220
  }
221
+
222
+ const auto &input = jsi::String::createFromUtf8(rt, [text UTF8String]);
223
+
224
+ jsi::Value output;
225
+ try {
226
+ output = markdownRuntime->runGuarded(markdownWorklet, input);
227
+ } catch (const jsi::JSError &error) {
228
+ // Skip formatting, runGuarded will show the error in LogBox
229
+ return @[];
230
+ }
231
+
232
+ NSMutableArray<MarkdownRange *> *markdownRanges = [[NSMutableArray alloc] init];
233
+ try {
234
+ const auto &ranges = output.asObject(rt).asArray(rt);
235
+ for (size_t i = 0, n = ranges.size(rt); i < n; ++i) {
236
+ const auto &item = ranges.getValueAtIndex(rt, i).asObject(rt);
237
+ const auto &type = item.getProperty(rt, "type").asString(rt).utf8(rt);
238
+ const auto &start = static_cast<int>(item.getProperty(rt, "start").asNumber());
239
+ const auto &length = static_cast<int>(item.getProperty(rt, "length").asNumber());
240
+ const auto &depth = item.hasProperty(rt, "depth") ? static_cast<int>(item.getProperty(rt, "depth").asNumber()) : 1;
241
+
242
+ if (length == 0 || start + length > text.length) {
243
+ continue;
244
+ }
245
+
246
+ NSRange range = NSMakeRange(start, length);
247
+ MarkdownRange *markdownRange = [[MarkdownRange alloc] initWithType:@(type.c_str()) range:range depth:depth];
248
+ [markdownRanges addObject:markdownRange];
249
+ }
250
+ } catch (const jsi::JSError &error) {
251
+ RCTLogWarn(@"[react-native-live-markdown] Incorrect schema of worklet parser output: %s", error.getMessage().c_str());
252
+ return @[];
253
+ }
254
+
255
+ return markdownRanges;
76
256
  }
77
257
 
78
258
  @end
@@ -8,6 +8,9 @@
8
8
  #include <react/renderer/components/view/ConcreteViewShadowNode.h>
9
9
  #include <react/renderer/core/LayoutContext.h>
10
10
 
11
+ #include <atomic>
12
+ #include <memory>
13
+
11
14
  namespace facebook {
12
15
  namespace react {
13
16
 
@@ -49,11 +52,15 @@ private:
49
52
  static YogaLayoutableShadowNode &
50
53
  shadowNodeFromContext(YGNodeConstRef yogaNode);
51
54
 
52
- // Persisted RCTMarkdownUtils instance shared across shadow node clones so
53
- // that MarkdownParser's one-entry memo cache (keyed on text + parserId)
54
- // survives repeated Yoga measure callbacks instead of being discarded on
55
- // every call to applyMarkdownFormattingToTextInputState.
55
+ // Shared between shadow node clones, so the parser cache survives all the
56
+ // cloning that happens during layout instead of being thrown away on every
57
+ // call to applyMarkdownFormattingToTextInputState.
56
58
  mutable std::shared_ptr<void> markdownUtils_;
59
+
60
+ // Set from any thread when a background parse finishes.
61
+ // overwriteMeasureCallbackConnector then marks the child's Yoga node dirty so
62
+ // it gets measured again with markdown. Passed along with markdownUtils_.
63
+ mutable std::shared_ptr<std::atomic_bool> needsRemeasure_;
57
64
  };
58
65
 
59
66
  } // namespace react
@@ -3,9 +3,13 @@
3
3
  #include <React/RCTUtils.h>
4
4
  #include <react/renderer/components/view/conversions.h>
5
5
  #include <react/renderer/core/ComponentDescriptor.h>
6
+ #include <react/renderer/core/ConcreteState.h>
6
7
  #include <react/renderer/textlayoutmanager/RCTAttributedTextUtils.h>
7
8
  #include <yoga/Yoga.h>
8
9
 
10
+ #include <atomic>
11
+ #include <memory>
12
+
9
13
  #include "RCTMarkdownStyle.h"
10
14
  #include "RCTMarkdownUtils.h"
11
15
 
@@ -32,12 +36,13 @@ MarkdownTextInputDecoratorShadowNode::MarkdownTextInputDecoratorShadowNode(
32
36
  ShadowNode const &sourceShadowNode,
33
37
  ShadowNodeFragment const &fragment)
34
38
  : ConcreteViewShadowNode(sourceShadowNode, fragment) {
35
- // Carry the persisted RCTMarkdownUtils over from the source node so the
36
- // MarkdownParser memo cache survives the frequent cloning that happens
37
- // during layout and re-render cycles.
39
+ // Copy the utils (and its parser cache) and the re-measure flag from the node
40
+ // we are cloning. Both have to be set before makeChildNodeMutable() below,
41
+ // which is what reads the flag.
38
42
  const auto &source =
39
43
  static_cast<const MarkdownTextInputDecoratorShadowNode &>(sourceShadowNode);
40
44
  markdownUtils_ = source.markdownUtils_;
45
+ needsRemeasure_ = source.needsRemeasure_;
41
46
 
42
47
  initialize();
43
48
  makeChildNodeMutable();
@@ -97,6 +102,20 @@ void MarkdownTextInputDecoratorShadowNode::overwriteMeasureCallbackConnector() {
97
102
  // on the decorator
98
103
  const auto &yogaNode = &nodeWithAccessibleYogaNode->yogaNode_;
99
104
  YGNodeSetMeasureFunc(yogaNode, yogaNodeMeasureCallbackConnector);
105
+
106
+ // If a background parse finished since the last layout, the size Yoga saved
107
+ // for the child was measured from plain text, and nothing marks this part of
108
+ // the tree dirty on its own (Yoga does not measure the decorator), so the
109
+ // wrong height would stay until something else changed the layout.
110
+ //
111
+ // Mark both nodes dirty by hand instead of using YGNodeMarkDirty(): the child
112
+ // is usually dirty already from completeClone(), which stops the flag from
113
+ // travelling up and would leave the decorator clean. Parents pick it up on
114
+ // their own when updateYogaChildren() runs.
115
+ if (needsRemeasure_ != nullptr && needsRemeasure_->exchange(false)) {
116
+ yogaNode->setDirty(true);
117
+ yogaNode_.setDirty(true);
118
+ }
100
119
  }
101
120
 
102
121
  void MarkdownTextInputDecoratorShadowNode::appendChild(
@@ -189,14 +208,35 @@ void MarkdownTextInputDecoratorShadowNode::applyMarkdownFormattingToTextInputSta
189
208
  const auto defaultNSTextAttributes =
190
209
  RCTNSTextAttributesFromTextAttributes(defaultTextAttributes);
191
210
 
192
- // Lazily create and persist the RCTMarkdownUtils instance so the MarkdownParser
193
- // one-entry memo cache (keyed on text + parserId) survives repeated Yoga measure
194
- // callbacks. Previously a fresh utils/parser was allocated on every call,
195
- // discarding the cache and forcing a full JSI re-parse each time.
211
+ // Create the utils once and keep it, so the parser cache survives repeated
212
+ // measure calls. It used to be created fresh every time, which threw the
213
+ // cache away and forced a full re-parse.
196
214
  if (!markdownUtils_) {
197
215
  RCTMarkdownUtils *freshUtils = [[RCTMarkdownUtils alloc] init];
198
216
  markdownUtils_ = std::shared_ptr<void>(
199
217
  (__bridge_retained void *)freshUtils, [](void *p) { CFRelease(p); });
218
+ needsRemeasure_ = std::make_shared<std::atomic_bool>(false);
219
+
220
+ // When the main thread does not find the ranges in the cache, it measures
221
+ // plain text and parses in the background instead (see RCTMarkdownUtils).
222
+ // That size is wrong for any style that changes how big the text is, so
223
+ // once the ranges arrive we force another measure rather than hope
224
+ // something else does. Both steps are needed: the state update schedules a
225
+ // new commit, and the flag makes Yoga measure again instead of reusing the
226
+ // old size. updateState() can be called from any thread - it only queues
227
+ // work on the family.
228
+ const auto state =
229
+ std::static_pointer_cast<const ::facebook::react::ConcreteState<
230
+ MarkdownTextInputDecoratorState>>(getState());
231
+ if (state != nullptr) {
232
+ const auto needsRemeasure = needsRemeasure_;
233
+ freshUtils.onAsyncFormattingReady = ^{
234
+ needsRemeasure->store(true);
235
+ // This update changes nothing; it is here only to schedule a new
236
+ // commit. If the family is already gone, updateState() handles that.
237
+ state->updateState(MarkdownTextInputDecoratorState{});
238
+ };
239
+ }
200
240
  }
201
241
  RCTMarkdownUtils *utils = (__bridge RCTMarkdownUtils *)markdownUtils_.get();
202
242
 
@@ -8,13 +8,23 @@ NS_ASSUME_NONNULL_BEGIN
8
8
  @property (nonatomic) RCTMarkdownStyle *markdownStyle;
9
9
  @property (nonatomic) NSNumber *parserId;
10
10
 
11
+ // Called on a background queue once a background parse has finished and the
12
+ // ranges are cached. The owner should mark the layout as out of date so the
13
+ // text is measured again, this time with markdown. Otherwise the size measured
14
+ // from plain text stays until something else triggers a new layout.
15
+ @property (atomic, copy, nullable) void (^onAsyncFormattingReady)(void);
16
+
11
17
  - (void)applyMarkdownFormatting:(nonnull NSMutableAttributedString *)attributedString
12
18
  withDefaultTextAttributes:(nonnull NSDictionary<NSAttributedStringKey, id> *)defaultTextAttributes;
13
19
 
14
- // Atomically sets the style/parser and applies formatting under a single lock.
15
- // Use this from the shadow node measure path, where one RCTMarkdownUtils
16
- // instance is shared across shadow node clones and may be accessed from
17
- // concurrent Fabric commits/layout passes.
20
+ // Sets the style/parser and formats using the values passed in. Use this from
21
+ // the shadow node measure path, where one instance is shared between clones and
22
+ // several Fabric threads can call it at the same time.
23
+ //
24
+ // On the main thread this only uses ranges that are already cached and never
25
+ // runs the parser. If they are not there, the text is left unformatted for this
26
+ // pass and parsed in the background, then `onAsyncFormattingReady` is called so
27
+ // the node can be measured again (see Sentry APP-EF1).
18
28
  - (void)applyMarkdownFormatting:(nonnull NSMutableAttributedString *)attributedString
19
29
  withDefaultTextAttributes:(nonnull NSDictionary<NSAttributedStringKey, id> *)defaultTextAttributes
20
30
  markdownStyle:(nonnull RCTMarkdownStyle *)markdownStyle
@@ -39,17 +39,54 @@
39
39
  markdownStyle:(nonnull RCTMarkdownStyle *)markdownStyle
40
40
  parserId:(nonnull NSNumber *)parserId
41
41
  {
42
- // Keep the style/parserId assignment and the parse+format together under a
43
- // single lock. The shadow node shares one instance across clones, and Fabric
44
- // runs commits/layout optimistically on multiple threads, so without this the
45
- // setters could interleave with another thread's parse/format and apply the
46
- // wrong parserId/style for a frame. `@synchronized` is recursive, so nesting
47
- // with `MarkdownParser`'s own `@synchronized(self)` in `parse:` is safe.
42
+ // The lock only covers the two shared fields. Holding it while parsing and
43
+ // formatting froze the app (Sentry APP-EF1): parsing waits for the worklet
44
+ // runtime, so a background thread could hold this lock while waiting, leaving
45
+ // the main thread stuck on the lock while measuring. The formatting below
46
+ // uses the arguments instead of the fields, so every call still gets a
47
+ // matching style and parserId.
48
48
  @synchronized (self) {
49
49
  _markdownStyle = markdownStyle;
50
50
  _parserId = parserId;
51
- [self applyMarkdownFormatting:attributedString withDefaultTextAttributes:defaultTextAttributes];
52
51
  }
52
+
53
+ NSString *text = attributedString.string;
54
+ NSArray<MarkdownRange *> *markdownRanges = [_markdownParser cachedRangesForText:text withParserId:parserId];
55
+
56
+ if (markdownRanges == nil) {
57
+ if ([NSThread isMainThread]) {
58
+ // Never run the parser from the main thread while measuring. If the
59
+ // worklet runtime is busy, the wait can pass the ~2s limit and iOS kills
60
+ // the app (Sentry APP-EF1). Parse in the background instead and measure
61
+ // plain text for now; `onAsyncFormattingReady` asks for a new measure
62
+ // once the ranges are ready, so the wrong sizes (h1 font, code font,
63
+ // blockquote indent, emoji) do not stay. This rarely happens - text
64
+ // changes are usually parsed on a background thread first, so the main
65
+ // thread finds the ranges in the cache.
66
+ __weak RCTMarkdownUtils *weakSelf = self;
67
+ [_markdownParser warmCacheAsyncForText:text
68
+ withParserId:parserId
69
+ completion:^{
70
+ // This only runs for the newest text, so it can't loop forever: the new
71
+ // measure finds the ranges in the cache (or the text changed again, and
72
+ // then a new measure was needed anyway).
73
+ void (^handler)(void) = weakSelf.onAsyncFormattingReady;
74
+ if (handler != nil) {
75
+ handler();
76
+ }
77
+ }];
78
+ return;
79
+ }
80
+ // Background threads can parse right here: the ~2s limit only applies to
81
+ // the main thread, and parsing no longer holds a lock the main thread
82
+ // waits on.
83
+ markdownRanges = [_markdownParser parse:text withParserId:parserId];
84
+ }
85
+
86
+ [_markdownFormatter formatAttributedString:attributedString
87
+ withDefaultTextAttributes:defaultTextAttributes
88
+ withMarkdownRanges:markdownRanges
89
+ withMarkdownStyle:markdownStyle];
53
90
  }
54
91
 
55
92
  @end
@@ -233,8 +233,16 @@ function parseTreeToTextAndRanges(tree) {
233
233
  dfs(tree);
234
234
  return [text, ranges];
235
235
  }
236
- function parseExpensiMark(markdown) {
237
- if (markdown.length > MAX_PARSABLE_LENGTH) {
236
+
237
+ /**
238
+ * Parses Markdown text into formatting ranges using ExpensiMark.
239
+ *
240
+ * @param markdown - The raw Markdown string to parse.
241
+ * @param maxLength - Maximum input length to parse; longer input returns `[]` without parsing. Defaults to 4000.
242
+ * @returns The list of formatting ranges, or `[]` if input exceeds `maxLength` or fails to parse.
243
+ */
244
+ function parseExpensiMark(markdown, maxLength = MAX_PARSABLE_LENGTH) {
245
+ if (markdown.length > maxLength) {
238
246
  return [];
239
247
  }
240
248
  const html = parseMarkdownToHTML(markdown);
@@ -1 +1 @@
1
- {"version":3,"names":["Object","defineProperty","exports","value","default","_reactNative","require","_expensifyCommon","_utils","_htmlEntities","_rangeUtils","isWeb","Platform","OS","isJest","global","process","env","JEST_WORKER_ID","__DEV__","decode","__workletHash","undefined","Error","MAX_PARSABLE_LENGTH","parseMarkdownToHTML","markdown","parser","ExpensiMark","html","replace","shouldKeepRawInput","parseHTMLToTokens","tokens","left","open","indexOf","length","push","substring","close","parseTokensToTree","stack","tag","children","forEach","type","payload","text","unescapeText","top","startsWith","child","pop","endsWith","unclosedTags","slice","map","item","join","parseTreeToTextAndRanges","tree","processChildren","node","dfs","appendSyntax","syntax","addChildrenWithStyle","start","end","ranges","curr","_","lb","content","match","rawHref","href","isLabeledLink","dataRawHref","matchString","src","alt","hasAlt","rawLink","linkString","parseExpensiMark","console","error","JSON","stringify","markdownRanges","sortRanges","rangesToExclude","getRangesToExcludeFormatting","excludeRangeTypesFromFormatting","groupedRanges","groupRanges","_default"],"sourceRoot":"../../src","sources":["parseExpensiMark.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Object","defineProperty","exports","value","default","_reactNative","require","_expensifyCommon","_utils","_htmlEntities","_rangeUtils","isWeb","Platform","OS","isJest","global","process","env","JEST_WORKER_ID","__DEV__","decode","__workletHash","undefined","Error","MAX_PARSABLE_LENGTH","parseMarkdownToHTML","markdown","parser","ExpensiMark","html","replace","shouldKeepRawInput","parseHTMLToTokens","tokens","left","open","indexOf","length","push","substring","close","parseTokensToTree","stack","tag","children","forEach","type","payload","text","unescapeText","top","startsWith","child","pop","endsWith","unclosedTags","slice","map","item","join","parseTreeToTextAndRanges","tree","processChildren","node","dfs","appendSyntax","syntax","addChildrenWithStyle","start","end","ranges","curr","_","lb","content","match","rawHref","href","isLabeledLink","dataRawHref","matchString","src","alt","hasAlt","rawLink","linkString","parseExpensiMark","maxLength","console","error","JSON","stringify","markdownRanges","sortRanges","rangesToExclude","getRangesToExcludeFormatting","excludeRangeTypesFromFormatting","groupedRanges","groupRanges","_default"],"sourceRoot":"../../src","sources":["parseExpensiMark.ts"],"mappings":"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","ignoreList":[]}
@@ -229,8 +229,16 @@ function parseTreeToTextAndRanges(tree) {
229
229
  dfs(tree);
230
230
  return [text, ranges];
231
231
  }
232
- function parseExpensiMark(markdown) {
233
- if (markdown.length > MAX_PARSABLE_LENGTH) {
232
+
233
+ /**
234
+ * Parses Markdown text into formatting ranges using ExpensiMark.
235
+ *
236
+ * @param markdown - The raw Markdown string to parse.
237
+ * @param maxLength - Maximum input length to parse; longer input returns `[]` without parsing. Defaults to 4000.
238
+ * @returns The list of formatting ranges, or `[]` if input exceeds `maxLength` or fails to parse.
239
+ */
240
+ function parseExpensiMark(markdown, maxLength = MAX_PARSABLE_LENGTH) {
241
+ if (markdown.length > maxLength) {
234
242
  return [];
235
243
  }
236
244
  const html = parseMarkdownToHTML(markdown);
@@ -1 +1 @@
1
- {"version":3,"names":["Platform","ExpensiMark","unescapeText","decode","groupRanges","sortRanges","excludeRangeTypesFromFormatting","getRangesToExcludeFormatting","isWeb","OS","isJest","global","process","env","JEST_WORKER_ID","__DEV__","__workletHash","undefined","Error","MAX_PARSABLE_LENGTH","parseMarkdownToHTML","markdown","parser","html","replace","shouldKeepRawInput","parseHTMLToTokens","tokens","left","open","indexOf","length","push","substring","close","parseTokensToTree","stack","tag","children","forEach","type","payload","text","top","startsWith","child","pop","endsWith","unclosedTags","slice","map","item","join","parseTreeToTextAndRanges","tree","processChildren","node","dfs","appendSyntax","syntax","addChildrenWithStyle","start","end","ranges","curr","_","lb","content","match","rawHref","href","isLabeledLink","dataRawHref","matchString","src","alt","hasAlt","rawLink","linkString","parseExpensiMark","console","error","JSON","stringify","markdownRanges","rangesToExclude","groupedRanges"],"sourceRoot":"../../src","sources":["parseExpensiMark.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Platform","ExpensiMark","unescapeText","decode","groupRanges","sortRanges","excludeRangeTypesFromFormatting","getRangesToExcludeFormatting","isWeb","OS","isJest","global","process","env","JEST_WORKER_ID","__DEV__","__workletHash","undefined","Error","MAX_PARSABLE_LENGTH","parseMarkdownToHTML","markdown","parser","html","replace","shouldKeepRawInput","parseHTMLToTokens","tokens","left","open","indexOf","length","push","substring","close","parseTokensToTree","stack","tag","children","forEach","type","payload","text","top","startsWith","child","pop","endsWith","unclosedTags","slice","map","item","join","parseTreeToTextAndRanges","tree","processChildren","node","dfs","appendSyntax","syntax","addChildrenWithStyle","start","end","ranges","curr","_","lb","content","match","rawHref","href","isLabeledLink","dataRawHref","matchString","src","alt","hasAlt","rawLink","linkString","parseExpensiMark","maxLength","console","error","JSON","stringify","markdownRanges","rangesToExclude","groupedRanges"],"sourceRoot":"../../src","sources":["parseExpensiMark.ts"],"mappings":";AAAA,SAAS;;AAET,SAAQA,QAAQ,QAAO,cAAc;AACrC,SAAQC,WAAW,QAAO,kBAAkB;AAC5C,SAAQC,YAAY,QAAO,wBAAwB;AACnD,SAAQC,MAAM,QAAO,eAAe;AAEpC,SAAQC,WAAW,EAAEC,UAAU,EAAEC,+BAA+B,EAAEC,4BAA4B,QAAO,iBAAc;AAGnH,SAASC,KAAKA,CAAA,EAAG;EACf,OAAOR,QAAQ,CAACS,EAAE,KAAK,KAAK;AAC9B;AAEA,SAASC,MAAMA,CAAA,EAAG;EAChB,OAAO,CAAC,CAACC,MAAM,CAACC,OAAO,CAACC,GAAG,CAACC,cAAc;AAC5C;;AAEA;AACA,IAAIC,OAAO,IAAI,CAACP,KAAK,CAAC,CAAC,IAAI,CAACE,MAAM,CAAC,CAAC,IAAKP,MAAM,CAAyCa,aAAa,KAAKC,SAAS,EAAE;EACnH,MAAM,IAAIC,KAAK,CACb,gUACF,CAAC;AACH;AAEA,MAAMC,mBAAmB,GAAG,IAAI;AAKhC,SAASC,mBAAmBA,CAACC,QAAgB,EAAU;EACrD,MAAMC,MAAM,GAAG,IAAIrB,WAAW,CAAC,CAAC;EAChC,MAAMsB,IAAI,GAAGD,MAAM,CAACE,OAAO,CAACH,QAAQ,EAAE;IACpCI,kBAAkB,EAAE;EACtB,CAAC,CAAC;EACF,OAAOF,IAAI;AACb;AAEA,SAASG,iBAAiBA,CAACH,IAAY,EAAW;EAChD,MAAMI,MAAe,GAAG,EAAE;EAC1B,IAAIC,IAAI,GAAG,CAAC;EACZ;EACA,OAAO,IAAI,EAAE;IACX,MAAMC,IAAI,GAAGN,IAAI,CAACO,OAAO,CAAC,GAAG,EAAEF,IAAI,CAAC;IACpC,IAAIC,IAAI,KAAK,CAAC,CAAC,EAAE;MACf,IAAID,IAAI,GAAGL,IAAI,CAACQ,MAAM,EAAE;QACtBJ,MAAM,CAACK,IAAI,CAAC,CAAC,MAAM,EAAET,IAAI,CAACU,SAAS,CAACL,IAAI,CAAC,CAAC,CAAC;MAC7C;MACA;IACF;IACA,IAAIC,IAAI,KAAKD,IAAI,EAAE;MACjBD,MAAM,CAACK,IAAI,CAAC,CAAC,MAAM,EAAET,IAAI,CAACU,SAAS,CAACL,IAAI,EAAEC,IAAI,CAAC,CAAC,CAAC;IACnD;IACA,MAAMK,KAAK,GAAGX,IAAI,CAACO,OAAO,CAAC,GAAG,EAAED,IAAI,CAAC;IACrC,IAAIK,KAAK,KAAK,CAAC,CAAC,EAAE;MAChB,MAAM,IAAIhB,KAAK,CAAC,iGAAiG,CAAC;IACpH;IACAS,MAAM,CAACK,IAAI,CAAC,CAAC,MAAM,EAAET,IAAI,CAACU,SAAS,CAACJ,IAAI,EAAEK,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IACtDN,IAAI,GAAGM,KAAK,GAAG,CAAC;EAClB;EACA,OAAOP,MAAM;AACf;AAEA,SAASQ,iBAAiBA,CAACR,MAAe,EAAa;EACrD,MAAMS,KAAkB,GAAG,CAAC;IAACC,GAAG,EAAE,IAAI;IAAEC,QAAQ,EAAE;EAAE,CAAC,CAAC;EACtDX,MAAM,CAACY,OAAO,CAAC,CAAC,CAACC,IAAI,EAAEC,OAAO,CAAC,KAAK;IAClC,IAAID,IAAI,KAAK,MAAM,EAAE;MACnB,MAAME,IAAI,GAAGxC,YAAY,CAACuC,OAAO,CAAC;MAClC,MAAME,GAAG,GAAGP,KAAK,CAACA,KAAK,CAACL,MAAM,GAAG,CAAC,CAAC;MACnCY,GAAG,CAAEL,QAAQ,CAACN,IAAI,CAACU,IAAI,CAAC;IAC1B,CAAC,MAAM,IAAIF,IAAI,KAAK,MAAM,EAAE;MAC1B,IAAIC,OAAO,CAACG,UAAU,CAAC,IAAI,CAAC,EAAE;QAC5B;QACA,MAAMC,KAAK,GAAGT,KAAK,CAACU,GAAG,CAAC,CAAC;QACzB,MAAMH,GAAG,GAAGP,KAAK,CAACA,KAAK,CAACL,MAAM,GAAG,CAAC,CAAC;QACnCY,GAAG,CAAEL,QAAQ,CAACN,IAAI,CAACa,KAAM,CAAC;MAC5B,CAAC,MAAM,IAAIJ,OAAO,CAACM,QAAQ,CAAC,IAAI,CAAC,EAAE;QACjC;QACA,MAAMJ,GAAG,GAAGP,KAAK,CAACA,KAAK,CAACL,MAAM,GAAG,CAAC,CAAC;QACnCY,GAAG,CAAEL,QAAQ,CAACN,IAAI,CAAC;UAACK,GAAG,EAAEI,OAAO;UAAEH,QAAQ,EAAE;QAAE,CAAC,CAAC;MAClD,CAAC,MAAM;QACL;QACAF,KAAK,CAACJ,IAAI,CAAC;UAACK,GAAG,EAAEI,OAAO;UAAEH,QAAQ,EAAE;QAAE,CAAC,CAAC;MAC1C;IACF,CAAC,MAAM;MACL,MAAM,IAAIpB,KAAK,CACb,yFAAyFsB,IAAI,6EAC/F,CAAC;IACH;EACF,CAAC,CAAC;EACF,IAAIJ,KAAK,CAACL,MAAM,KAAK,CAAC,EAAE;IACtB,MAAMiB,YAAY,GAChBZ,KAAK,CAACL,MAAM,GAAG,CAAC,GACZK,KAAK,CACFa,KAAK,CAAC,CAAC,CAAC,CACRC,GAAG,CAAEC,IAAI,IAAKA,IAAI,CAACd,GAAG,CAAC,CACvBe,IAAI,CAAC,IAAI,CAAC,GACb,EAAE;IACR,MAAM,IAAIlC,KAAK,CACb,oGAAoG8B,YAAY,4DAClH,CAAC;EACH;EACA,OAAOZ,KAAK,CAAC,CAAC,CAAC;AACjB;AAEA,SAASiB,wBAAwBA,CAACC,IAAe,EAA6B;EAC5E,IAAIZ,IAAI,GAAG,EAAE;EAEb,SAASa,eAAeA,CAACC,IAAwB,EAAE;IACjD,IAAI,OAAOA,IAAI,KAAK,QAAQ,EAAE;MAC5Bd,IAAI,IAAIc,IAAI;IACd,CAAC,MAAM;MACLA,IAAI,CAAClB,QAAQ,CAACC,OAAO,CAACkB,GAAG,CAAC;IAC5B;EACF;EAEA,SAASC,YAAYA,CAACC,MAAc,EAAE;IACpCC,oBAAoB,CAACD,MAAM,EAAE,QAAQ,CAAC;EACxC;EAEA,SAASC,oBAAoBA,CAACJ,IAAwB,EAAEhB,IAAkB,EAAE;IAC1E,MAAMqB,KAAK,GAAGnB,IAAI,CAACX,MAAM;IACzBwB,eAAe,CAACC,IAAI,CAAC;IACrB,MAAMM,GAAG,GAAGpB,IAAI,CAACX,MAAM;IACvBgC,MAAM,CAAC/B,IAAI,CAAC;MAACQ,IAAI;MAAEqB,KAAK;MAAE9B,MAAM,EAAE+B,GAAG,GAAGD;IAAK,CAAC,CAAC;EACjD;EAEA,MAAME,MAAuB,GAAG,EAAE;EAClC,SAASN,GAAGA,CAACD,IAAwB,EAAE;IACrC,IAAI,OAAOA,IAAI,KAAK,QAAQ,EAAE;MAC5Bd,IAAI,IAAIc,IAAI;IACd,CAAC,MAAM;MACL;MACA,IAAIA,IAAI,CAACnB,GAAG,KAAK,IAAI,EAAE;QACrBkB,eAAe,CAACC,IAAI,CAAC;MACvB,CAAC,MAAM,IAAIA,IAAI,CAACnB,GAAG,KAAK,UAAU,EAAE;QAClCqB,YAAY,CAAC,GAAG,CAAC;QACjBE,oBAAoB,CAACJ,IAAI,EAAE,MAAM,CAAC;QAClCE,YAAY,CAAC,GAAG,CAAC;MACnB,CAAC,MAAM,IAAIF,IAAI,CAACnB,GAAG,KAAK,MAAM,EAAE;QAC9BqB,YAAY,CAAC,GAAG,CAAC;QACjBE,oBAAoB,CAACJ,IAAI,EAAE,QAAQ,CAAC;QACpCE,YAAY,CAAC,GAAG,CAAC;MACnB,CAAC,MAAM,IAAIF,IAAI,CAACnB,GAAG,KAAK,OAAO,EAAE;QAC/BqB,YAAY,CAAC,GAAG,CAAC;QACjBE,oBAAoB,CAACJ,IAAI,EAAE,eAAe,CAAC;QAC3CE,YAAY,CAAC,GAAG,CAAC;MACnB,CAAC,MAAM,IAAIF,IAAI,CAACnB,GAAG,KAAK,SAAS,EAAE;QACjCuB,oBAAoB,CAACJ,IAAI,EAAE,OAAO,CAAC;MACrC,CAAC,MAAM,IAAIA,IAAI,CAACnB,GAAG,KAAK,QAAQ,EAAE;QAChCqB,YAAY,CAAC,GAAG,CAAC;QACjBE,oBAAoB,CAACJ,IAAI,EAAE,MAAM,CAAC;QAClCE,YAAY,CAAC,GAAG,CAAC;MACnB,CAAC,MAAM,IAAIF,IAAI,CAACnB,GAAG,KAAK,gBAAgB,EAAE;QACxCuB,oBAAoB,CAACJ,IAAI,EAAE,cAAc,CAAC;MAC5C,CAAC,MAAM,IAAIA,IAAI,CAACnB,GAAG,KAAK,gBAAgB,EAAE;QACxCuB,oBAAoB,CAACJ,IAAI,EAAE,cAAc,CAAC;MAC5C,CAAC,MAAM,IAAIA,IAAI,CAACnB,GAAG,KAAK,iBAAiB,EAAE;QACzCuB,oBAAoB,CAACJ,IAAI,EAAE,eAAe,CAAC;MAC7C,CAAC,MAAM,IAAIA,IAAI,CAACnB,GAAG,KAAK,kBAAkB,EAAE;QAC1CuB,oBAAoB,CAACJ,IAAI,EAAE,gBAAgB,CAAC;MAC9C,CAAC,MAAM,IAAIA,IAAI,CAACnB,GAAG,KAAK,cAAc,EAAE;QACtCqB,YAAY,CAAC,GAAG,CAAC;QACjBE,oBAAoB,CAACJ,IAAI,EAAE,YAAY,CAAC;QACxC;QACA,IAAIO,MAAM,CAAChC,MAAM,GAAG,CAAC,EAAE;UACrB,MAAMiC,IAAI,GAAGD,MAAM,CAACA,MAAM,CAAChC,MAAM,GAAG,CAAC,CAAC;UACtCiC,IAAI,CAAEH,KAAK,IAAI,CAAC;UAChBG,IAAI,CAAEjC,MAAM,IAAI,CAAC;QACnB;MACF,CAAC,MAAM,IAAIyB,IAAI,CAACnB,GAAG,KAAK,MAAM,EAAE;QAC9BqB,YAAY,CAAC,IAAI,CAAC;QAClBE,oBAAoB,CAACJ,IAAI,EAAE,IAAI,CAAC;MAClC,CAAC,MAAM,IAAIA,IAAI,CAACnB,GAAG,KAAK,QAAQ,EAAE;QAChCK,IAAI,IAAI,IAAI;MACd,CAAC,MAAM,IAAIc,IAAI,CAACnB,GAAG,CAACO,UAAU,CAAC,MAAM,CAAC,EAAE;QACtC,MAAM,CAACqB,CAAC,EAAEC,EAAE,EAAEC,OAAO,CAAC,GAAGX,IAAI,CAAClB,QAAQ,CAACc,IAAI,CAAC,EAAE,CAAC,CAACgB,KAAK,CAAC,oBAAoB,CAAC,IAAI,EAAE;QACjF;QACAL,MAAM,CAAC/B,IAAI,CAAC;UAACQ,IAAI,EAAE,WAAW;UAAEqB,KAAK,EAAEnB,IAAI,CAACX,MAAM;UAAEA,MAAM,EAAE,CAACoC,OAAO,EAAEpC,MAAM,IAAI,CAAC,IAAI;QAAC,CAAC,CAAC;QACxF2B,YAAY,CAAC,SAASQ,EAAE,EAAE,CAAC;QAC3BN,oBAAoB,CAAC,GAAGO,OAAO,EAAE,EAAE,KAAK,CAAC;QACzCT,YAAY,CAAC,KAAK,CAAC;MACrB,CAAC,MAAM,IAAIF,IAAI,CAACnB,GAAG,CAACO,UAAU,CAAC,WAAW,CAAC,EAAE;QAC3C,MAAMyB,OAAO,GAAGb,IAAI,CAACnB,GAAG,CAAC+B,KAAK,CAAC,gBAAgB,CAAC,CAAE,CAAC,CAAE,CAAC,CAAC;QACvD,MAAME,IAAI,GAAGpE,YAAY,CAACmE,OAAO,CAAC;QAClC,MAAME,aAAa,GAAGf,IAAI,CAACnB,GAAG,CAAC+B,KAAK,CAAC,6BAA6B,CAAC,CAAE,CAAC,CAAC,KAAK,SAAS;QACrF,MAAMI,WAAW,GAAGhB,IAAI,CAACnB,GAAG,CAAC+B,KAAK,CAAC,yBAAyB,CAAC;QAC7D,MAAMK,WAAW,GAAGD,WAAW,GAAGtE,YAAY,CAACsE,WAAW,CAAC,CAAC,CAAE,CAAC,GAAGF,IAAI;QACtE,IAAI,CAACC,aAAa,IAAIf,IAAI,CAAClB,QAAQ,CAACP,MAAM,KAAK,CAAC,IAAI,OAAOyB,IAAI,CAAClB,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,KAAKkB,IAAI,CAAClB,QAAQ,CAAC,CAAC,CAAC,KAAKmC,WAAW,IAAI,UAAUjB,IAAI,CAAClB,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAKgC,IAAI,CAAC,EAAE;UACvKV,oBAAoB,CAACJ,IAAI,CAAClB,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QAChD,CAAC,MAAM;UACLoB,YAAY,CAAC,GAAG,CAAC;UACjBH,eAAe,CAACC,IAAI,CAAC;UACrBE,YAAY,CAAC,IAAI,CAAC;UAClBE,oBAAoB,CAACa,WAAW,EAAE,MAAM,CAAC;UACzCf,YAAY,CAAC,GAAG,CAAC;QACnB;MACF,CAAC,MAAM,IAAIF,IAAI,CAACnB,GAAG,CAACO,UAAU,CAAC,YAAY,CAAC,EAAE;QAC5C,MAAM8B,GAAG,GAAGlB,IAAI,CAACnB,GAAG,CAAC+B,KAAK,CAAC,eAAe,CAAC,CAAE,CAAC,CAAE,CAAC,CAAC;QAClD,MAAMO,GAAG,GAAGnB,IAAI,CAACnB,GAAG,CAAC+B,KAAK,CAAC,eAAe,CAAC;QAC3C,MAAMQ,MAAM,GAAGpB,IAAI,CAACnB,GAAG,CAAC+B,KAAK,CAAC,6BAA6B,CAAC,CAAE,CAAC,CAAC,KAAK,SAAS;QAC9E,MAAMS,OAAO,GAAGrB,IAAI,CAACnB,GAAG,CAAC+B,KAAK,CAAC,yBAAyB,CAAC;QACzD,MAAMU,UAAU,GAAGD,OAAO,GAAG3E,YAAY,CAAC2E,OAAO,CAAC,CAAC,CAAE,CAAC,GAAGH,GAAG;QAE5D,MAAMb,KAAK,GAAGnB,IAAI,CAACX,MAAM;QACzB,MAAMA,MAAM,GAAG,CAAC,IAAI6C,MAAM,GAAG,CAAC,GAAG1E,YAAY,CAACyE,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC5C,MAAM,GAAG,CAAC,CAAC,GAAG+C,UAAU,CAAC/C,MAAM;QAC7FgC,MAAM,CAAC/B,IAAI,CAAC;UAACQ,IAAI,EAAE,cAAc;UAAEqB,KAAK;UAAE9B;QAAM,CAAC,CAAC;QAElD2B,YAAY,CAAC,GAAG,CAAC;QACjB,IAAIkB,MAAM,EAAE;UACVlB,YAAY,CAAC,GAAG,CAAC;UACjBH,eAAe,CAACrD,YAAY,CAACyE,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;UAC7CjB,YAAY,CAAC,GAAG,CAAC;QACnB;QACAA,YAAY,CAAC,GAAG,CAAC;QACjBE,oBAAoB,CAACkB,UAAU,EAAE,MAAM,CAAC;QACxCpB,YAAY,CAAC,GAAG,CAAC;MACnB,CAAC,MAAM,IAAIF,IAAI,CAACnB,GAAG,CAACO,UAAU,CAAC,gCAAgC,CAAC,EAAE;QAChE,MAAM8B,GAAG,GAAGlB,IAAI,CAACnB,GAAG,CAAC+B,KAAK,CAAC,iCAAiC,CAAC,CAAE,CAAC,CAAE,CAAC,CAAC;QACpE,MAAMS,OAAO,GAAGrB,IAAI,CAACnB,GAAG,CAAC+B,KAAK,CAAC,yBAAyB,CAAC;QACzD,MAAMQ,MAAM,GAAGpB,IAAI,CAACnB,GAAG,CAAC+B,KAAK,CAAC,6BAA6B,CAAC,CAAE,CAAC,CAAC,KAAK,SAAS;QAC9E,MAAMU,UAAU,GAAGD,OAAO,GAAG3E,YAAY,CAAC2E,OAAO,CAAC,CAAC,CAAE,CAAC,GAAGH,GAAG;QAC5DhB,YAAY,CAAC,GAAG,CAAC;QACjB,IAAIkB,MAAM,EAAE;UACVlB,YAAY,CAAC,GAAG,CAAC;UACjBF,IAAI,CAAClB,QAAQ,CAACC,OAAO,CAAEM,KAAK,IAAKU,eAAe,CAACV,KAAK,CAAC,CAAC;UACxDa,YAAY,CAAC,GAAG,CAAC;QACnB;QACAA,YAAY,CAAC,GAAG,CAAC;QACjBE,oBAAoB,CAACkB,UAAU,EAAE,MAAM,CAAC;QACxCpB,YAAY,CAAC,GAAG,CAAC;MACnB,CAAC,MAAM;QACL,MAAM,IAAIxC,KAAK,CAAC,yFAAyFsC,IAAI,CAACnB,GAAG,wDAAwD,CAAC;MAC5K;IACF;EACF;EACAoB,GAAG,CAACH,IAAI,CAAC;EACT,OAAO,CAACZ,IAAI,EAAEqB,MAAM,CAAC;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASgB,gBAAgBA,CAAC1D,QAAgB,EAAE2D,SAAS,GAAG7D,mBAAmB,EAAmB;EAC5F,IAAIE,QAAQ,CAACU,MAAM,GAAGiD,SAAS,EAAE;IAC/B,OAAO,EAAE;EACX;EACA,MAAMzD,IAAI,GAAGH,mBAAmB,CAACC,QAAQ,CAAC;EAC1C,MAAMM,MAAM,GAAGD,iBAAiB,CAACH,IAAI,CAAC;EACtC,MAAM+B,IAAI,GAAGnB,iBAAiB,CAACR,MAAM,CAAC;EACtC,MAAM,CAACe,IAAI,EAAEqB,MAAM,CAAC,GAAGV,wBAAwB,CAACC,IAAI,CAAC;EACrD,IAAIZ,IAAI,KAAKrB,QAAQ,EAAE;IACrB4D,OAAO,CAACC,KAAK,CACX,8MAA8MC,IAAI,CAACC,SAAS,CAC1N1C,IACF,CAAC,uBAAuByC,IAAI,CAACC,SAAS,CAAC/D,QAAQ,CAAC,GAClD,CAAC;IACD,OAAO,EAAE;EACX;EACA,IAAIgE,cAAc,GAAGhF,UAAU,CAAC0D,MAAM,CAAC;;EAEvC;EACA,MAAMuB,eAAe,GAAG/E,4BAA4B,CAAC8E,cAAc,CAAC;EACpEA,cAAc,GAAG/E,+BAA+B,CAAC+E,cAAc,EAAE,QAAQ,EAAEC,eAAe,CAAC;EAC3FD,cAAc,GAAG/E,+BAA+B,CAAC+E,cAAc,EAAE,MAAM,EAAEC,eAAe,CAAC;EACzFD,cAAc,GAAG/E,+BAA+B,CAAC+E,cAAc,EAAE,eAAe,EAAEC,eAAe,CAAC;EAElG,MAAMC,aAAa,GAAGnF,WAAW,CAACiF,cAAc,CAAC;EACjD,OAAOE,aAAa;AACtB;AAEA,eAAeR,gBAAgB","ignoreList":[]}
@@ -1,4 +1,11 @@
1
1
  import type { MarkdownRange } from './commonTypes';
2
- declare function parseExpensiMark(markdown: string): MarkdownRange[];
2
+ /**
3
+ * Parses Markdown text into formatting ranges using ExpensiMark.
4
+ *
5
+ * @param markdown - The raw Markdown string to parse.
6
+ * @param maxLength - Maximum input length to parse; longer input returns `[]` without parsing. Defaults to 4000.
7
+ * @returns The list of formatting ranges, or `[]` if input exceeds `maxLength` or fails to parse.
8
+ */
9
+ declare function parseExpensiMark(markdown: string, maxLength?: number): MarkdownRange[];
3
10
  export default parseExpensiMark;
4
11
  //# sourceMappingURL=parseExpensiMark.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseExpensiMark.d.ts","sourceRoot":"","sources":["../../../src/parseExpensiMark.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAC,aAAa,EAAe,MAAM,eAAe,CAAC;AAwO/D,iBAAS,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CA0B3D;AAED,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"parseExpensiMark.d.ts","sourceRoot":"","sources":["../../../src/parseExpensiMark.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAC,aAAa,EAAe,MAAM,eAAe,CAAC;AAwO/D;;;;;;GAMG;AACH,iBAAS,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,SAAsB,GAAG,aAAa,EAAE,CA0B5F;AAED,eAAe,gBAAgB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expensify/react-native-live-markdown",
3
- "version": "0.1.335",
3
+ "version": "0.1.337",
4
4
  "description": "Drop-in replacement for React Native's TextInput component with Markdown formatting.",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
@@ -92,7 +92,7 @@
92
92
  "eslint-plugin-promise": "^6.1.1",
93
93
  "eslint-plugin-react-native": "^5.0.0",
94
94
  "eslint-plugin-tsdoc": "^0.2.17",
95
- "expensify-common": "2.0.189",
95
+ "expensify-common": "2.0.201",
96
96
  "jest": "^29.6.3",
97
97
  "jest-environment-jsdom": "^29.7.0",
98
98
  "nodemon": "^3.1.3",
@@ -109,7 +109,7 @@
109
109
  "typescript": "^5.8.3"
110
110
  },
111
111
  "peerDependencies": {
112
- "expensify-common": ">=2.0.189",
112
+ "expensify-common": ">=2.0.201",
113
113
  "react": "*",
114
114
  "react-native": "*",
115
115
  "react-native-worklets": ">=0.7.0"
@@ -238,8 +238,15 @@ function parseTreeToTextAndRanges(tree: StackItem): [string, MarkdownRange[]] {
238
238
  return [text, ranges];
239
239
  }
240
240
 
241
- function parseExpensiMark(markdown: string): MarkdownRange[] {
242
- if (markdown.length > MAX_PARSABLE_LENGTH) {
241
+ /**
242
+ * Parses Markdown text into formatting ranges using ExpensiMark.
243
+ *
244
+ * @param markdown - The raw Markdown string to parse.
245
+ * @param maxLength - Maximum input length to parse; longer input returns `[]` without parsing. Defaults to 4000.
246
+ * @returns The list of formatting ranges, or `[]` if input exceeds `maxLength` or fails to parse.
247
+ */
248
+ function parseExpensiMark(markdown: string, maxLength = MAX_PARSABLE_LENGTH): MarkdownRange[] {
249
+ if (markdown.length > maxLength) {
243
250
  return [];
244
251
  }
245
252
  const html = parseMarkdownToHTML(markdown);