rapier-markdown-kit 1.1.0
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/LICENSE +40 -0
- package/README.md +102 -0
- package/dist/agent/vendor/pretext/LICENSE +21 -0
- package/dist/agent/vendor/pretext/NOTICE +15 -0
- package/dist/agent/vendor/pretext/SOURCE.json +85 -0
- package/dist/agent/vendor/pretext/analysis.js +1234 -0
- package/dist/agent/vendor/pretext/bidi.js +151 -0
- package/dist/agent/vendor/pretext/generated/bidi-data.js +3831 -0
- package/dist/agent/vendor/pretext/layout.js +308 -0
- package/dist/agent/vendor/pretext/line-break.js +636 -0
- package/dist/agent/vendor/pretext/line-text.js +44 -0
- package/dist/agent/vendor/pretext/measurement.js +189 -0
- package/dist/agent/vendor/pretext/package.json +3 -0
- package/dist/agent/vendor/pretext/rich-inline.js +291 -0
- package/dist/agent/will.mjs +167 -0
- package/dist/kit/assets.mjs +3 -0
- package/dist/kit/conformance/01-inline.expected.json +82 -0
- package/dist/kit/conformance/01-inline.md +10 -0
- package/dist/kit/conformance/02-width-x-align.expected.json +83 -0
- package/dist/kit/conformance/02-width-x-align.md +12 -0
- package/dist/kit/conformance/03-wrap-around-silhouette.expected.json +177 -0
- package/dist/kit/conformance/03-wrap-around-silhouette.md +12 -0
- package/dist/kit/conformance/04-wrap-box.expected.json +173 -0
- package/dist/kit/conformance/04-wrap-box.md +12 -0
- package/dist/kit/conformance/05-behind.expected.json +122 -0
- package/dist/kit/conformance/05-behind.md +12 -0
- package/dist/kit/conformance/06-front.expected.json +122 -0
- package/dist/kit/conformance/06-front.md +12 -0
- package/dist/kit/conformance/07-rotate-raster.expected.json +179 -0
- package/dist/kit/conformance/07-rotate-raster.md +12 -0
- package/dist/kit/conformance/08-drawing-rotation.expected.json +188 -0
- package/dist/kit/conformance/08-drawing-rotation.md +12 -0
- package/dist/kit/conformance/09-drawing-ring-interior.expected.json +229 -0
- package/dist/kit/conformance/09-drawing-ring-interior.md +12 -0
- package/dist/kit/conformance/10-both-sides.expected.json +221 -0
- package/dist/kit/conformance/10-both-sides.md +10 -0
- package/dist/kit/conformance/11-neighbour-skips-image.expected.json +160 -0
- package/dist/kit/conformance/11-neighbour-skips-image.md +13 -0
- package/dist/kit/conformance/12-heading-barrier.expected.json +164 -0
- package/dist/kit/conformance/12-heading-barrier.md +12 -0
- package/dist/kit/conformance/13-rtl-text.expected.json +179 -0
- package/dist/kit/conformance/13-rtl-text.md +8 -0
- package/dist/kit/conformance/README.md +99 -0
- package/dist/kit/conformance/measurer.mjs +0 -0
- package/dist/kit/conformance/run.mjs +123 -0
- package/dist/kit/index.mjs +6 -0
- package/dist/kit/layout.mjs +2 -0
- package/dist/kit/marks.mjs +2 -0
- package/dist/kit/model.mjs +3 -0
- package/dist/kit/will.mjs +2 -0
- package/dist/layout/model.mjs +364 -0
- package/dist/spec/md-assets.mjs +323 -0
- package/dist/spec/md-layout.mjs +117 -0
- package/dist/spec/md-marks.mjs +78 -0
- package/package.json +33 -0
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/*! Pretext 0.0.9 | MIT | Copyright (c) 2026 Pretext contributors */
|
|
2
|
+
import { computeSegmentLevels } from './bidi.js';
|
|
3
|
+
import { analyzeText, clearAnalysisCaches, getBreakablePreferredBreaks, getCjkTextUnits, getSharedGraphemeSegmenter, isCJK, isNumericRunSegment, isIndependentSymbolRun, setAnalysisLocale } from './analysis.js';
|
|
4
|
+
import { clearMeasurementCaches, getCorrectedSegmentWidth, getSegmentBreakableFitAdvances, getEngineProfile, getFontMeasurementState, getSegmentMetrics, textMayContainEmoji } from './measurement.js';
|
|
5
|
+
import { countPreparedLines, measurePreparedLineGeometry, normalizePreparedLineStart, stepPreparedLineGeometryFromChunk, walkPreparedLinesRaw } from './line-break.js';
|
|
6
|
+
import { buildLineTextFromRange, clearLineTextCaches, getLineTextCache } from './line-text.js';
|
|
7
|
+
function createEmptyPrepared(includeSegments) {
|
|
8
|
+
if (includeSegments) {
|
|
9
|
+
return {
|
|
10
|
+
widths: [],
|
|
11
|
+
lineEndFitAdvances: [],
|
|
12
|
+
lineEndPaintAdvances: [],
|
|
13
|
+
kinds: [],
|
|
14
|
+
simpleLineWalkFastPath: true,
|
|
15
|
+
segLevels: null,
|
|
16
|
+
breakableFitAdvances: [],
|
|
17
|
+
breakablePreferredBreaks: [],
|
|
18
|
+
letterSpacing: 0,
|
|
19
|
+
spacingGraphemeCounts: [],
|
|
20
|
+
discretionaryHyphenWidth: 0,
|
|
21
|
+
tabStopAdvance: 0,
|
|
22
|
+
chunks: [],
|
|
23
|
+
segments: []
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
widths: [],
|
|
28
|
+
lineEndFitAdvances: [],
|
|
29
|
+
lineEndPaintAdvances: [],
|
|
30
|
+
kinds: [],
|
|
31
|
+
simpleLineWalkFastPath: true,
|
|
32
|
+
segLevels: null,
|
|
33
|
+
breakableFitAdvances: [],
|
|
34
|
+
breakablePreferredBreaks: [],
|
|
35
|
+
letterSpacing: 0,
|
|
36
|
+
spacingGraphemeCounts: [],
|
|
37
|
+
discretionaryHyphenWidth: 0,
|
|
38
|
+
tabStopAdvance: 0,
|
|
39
|
+
chunks: []
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function countRenderedSpacingGraphemes(text, kind) {
|
|
43
|
+
if (kind === 'zero-width-break' || kind === 'soft-hyphen' || kind === 'hard-break') {
|
|
44
|
+
return 0;
|
|
45
|
+
}
|
|
46
|
+
if (kind === 'tab') return 1;
|
|
47
|
+
let count = 0;
|
|
48
|
+
const graphemeSegmenter = getSharedGraphemeSegmenter();
|
|
49
|
+
for (const _ of graphemeSegmenter.segment(text))count++;
|
|
50
|
+
return count;
|
|
51
|
+
}
|
|
52
|
+
function addInternalLetterSpacing(width, graphemeCount, letterSpacing) {
|
|
53
|
+
return graphemeCount > 1 ? width + (graphemeCount - 1) * letterSpacing : width;
|
|
54
|
+
}
|
|
55
|
+
function measureAnalysis(analysis, font, includeSegments, wordBreak, letterSpacing) {
|
|
56
|
+
const engineProfile = getEngineProfile();
|
|
57
|
+
const { cache, emojiCorrection } = getFontMeasurementState(font, textMayContainEmoji(analysis.normalized));
|
|
58
|
+
const discretionaryHyphenWidth = getCorrectedSegmentWidth('-', getSegmentMetrics('-', cache), emojiCorrection) + (letterSpacing === 0 ? 0 : letterSpacing * 2);
|
|
59
|
+
const spaceWidth = getCorrectedSegmentWidth(' ', getSegmentMetrics(' ', cache), emojiCorrection);
|
|
60
|
+
const tabStopAdvance = spaceWidth * 8;
|
|
61
|
+
const hasLetterSpacing = letterSpacing !== 0;
|
|
62
|
+
if (analysis.len === 0) return createEmptyPrepared(includeSegments);
|
|
63
|
+
const widths = [];
|
|
64
|
+
const lineEndFitAdvances = [];
|
|
65
|
+
const lineEndPaintAdvances = [];
|
|
66
|
+
const kinds = [];
|
|
67
|
+
let simpleLineWalkFastPath = !hasLetterSpacing;
|
|
68
|
+
const segStarts = includeSegments ? [] : null;
|
|
69
|
+
const breakableFitAdvances = [];
|
|
70
|
+
const breakablePreferredBreaks = [];
|
|
71
|
+
const spacingGraphemeCounts = [];
|
|
72
|
+
const segments = includeSegments ? [] : null;
|
|
73
|
+
const chunks = [];
|
|
74
|
+
let chunkStartSegmentIndex = 0;
|
|
75
|
+
function pushMeasuredSegment(text, width, lineEndFitAdvance, lineEndPaintAdvance, kind, start, breakableFitAdvance, breakablePreferredBreak, spacingGraphemeCount) {
|
|
76
|
+
if (kind !== 'text' && kind !== 'space' && kind !== 'zero-width-break') {
|
|
77
|
+
simpleLineWalkFastPath = false;
|
|
78
|
+
}
|
|
79
|
+
widths.push(width);
|
|
80
|
+
lineEndFitAdvances.push(lineEndFitAdvance);
|
|
81
|
+
lineEndPaintAdvances.push(lineEndPaintAdvance);
|
|
82
|
+
kinds.push(kind);
|
|
83
|
+
segStarts?.push(start);
|
|
84
|
+
breakableFitAdvances.push(breakableFitAdvance);
|
|
85
|
+
breakablePreferredBreaks.push(breakablePreferredBreak);
|
|
86
|
+
if (hasLetterSpacing) spacingGraphemeCounts.push(spacingGraphemeCount);
|
|
87
|
+
if (segments !== null) segments.push(text);
|
|
88
|
+
}
|
|
89
|
+
function pushMeasuredTextSegment(text, textMetrics, kind, start, allowOverflowBreaks) {
|
|
90
|
+
const spacingGraphemeCount = hasLetterSpacing ? countRenderedSpacingGraphemes(text, kind) : 0;
|
|
91
|
+
const width = addInternalLetterSpacing(getCorrectedSegmentWidth(text, textMetrics, emojiCorrection), spacingGraphemeCount, letterSpacing);
|
|
92
|
+
const baseLineEndFitAdvance = kind === 'space' || kind === 'preserved-space' || kind === 'zero-width-break' ? 0 : width;
|
|
93
|
+
const lineEndFitAdvance = baseLineEndFitAdvance === 0 ? 0 : baseLineEndFitAdvance + (spacingGraphemeCount > 0 ? letterSpacing : 0);
|
|
94
|
+
const lineEndPaintAdvance = kind === 'space' || kind === 'zero-width-break' ? 0 : width;
|
|
95
|
+
if (allowOverflowBreaks && text.length > 1) {
|
|
96
|
+
let fitMode = 'sum-graphemes';
|
|
97
|
+
if (letterSpacing !== 0) {
|
|
98
|
+
fitMode = 'segment-prefixes';
|
|
99
|
+
} else if (isNumericRunSegment(text)) {
|
|
100
|
+
fitMode = 'pair-context';
|
|
101
|
+
} else if (engineProfile.preferPrefixWidthsForBreakableRuns) {
|
|
102
|
+
fitMode = 'segment-prefixes';
|
|
103
|
+
}
|
|
104
|
+
const fitAdvances = getSegmentBreakableFitAdvances(text, textMetrics, cache, emojiCorrection, fitMode);
|
|
105
|
+
const preferredBreaks = fitAdvances === null || wordBreak === 'keep-all' ? null : getBreakablePreferredBreaks(text);
|
|
106
|
+
pushMeasuredSegment(text, width, lineEndFitAdvance, lineEndPaintAdvance, kind, start, fitAdvances, preferredBreaks, spacingGraphemeCount);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
pushMeasuredSegment(text, width, lineEndFitAdvance, lineEndPaintAdvance, kind, start, null, null, spacingGraphemeCount);
|
|
110
|
+
}
|
|
111
|
+
for(let mi = 0; mi < analysis.len; mi++){
|
|
112
|
+
const segText = analysis.texts[mi];
|
|
113
|
+
const segKind = analysis.kinds[mi];
|
|
114
|
+
const segStart = analysis.starts[mi];
|
|
115
|
+
if (segKind === 'soft-hyphen') {
|
|
116
|
+
pushMeasuredSegment(segText, 0, discretionaryHyphenWidth, discretionaryHyphenWidth, segKind, segStart, null, null, 0);
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if (segKind === 'hard-break') {
|
|
120
|
+
const endSegmentIndex = widths.length;
|
|
121
|
+
pushMeasuredSegment(segText, 0, 0, 0, segKind, segStart, null, null, 0);
|
|
122
|
+
chunks.push({
|
|
123
|
+
startSegmentIndex: chunkStartSegmentIndex,
|
|
124
|
+
endSegmentIndex,
|
|
125
|
+
consumedEndSegmentIndex: widths.length
|
|
126
|
+
});
|
|
127
|
+
chunkStartSegmentIndex = widths.length;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (segKind === 'tab') {
|
|
131
|
+
pushMeasuredSegment(segText, 0, 0, 0, segKind, segStart, null, null, hasLetterSpacing ? countRenderedSpacingGraphemes(segText, segKind) : 0);
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (segKind === 'text' && isCJK(segText)) {
|
|
135
|
+
const measuredUnits = getCjkTextUnits(segText, engineProfile, wordBreak);
|
|
136
|
+
for(let i = 0; i < measuredUnits.length; i++){
|
|
137
|
+
const unit = measuredUnits[i];
|
|
138
|
+
const unitMetrics = getSegmentMetrics(unit.text, cache);
|
|
139
|
+
pushMeasuredTextSegment(unit.text, unitMetrics, 'text', segStart + unit.start, unit.overflow === 'grapheme' || analysis.isWordLike[mi] && (wordBreak === 'keep-all' || unit.overflow === 'word-like'));
|
|
140
|
+
}
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
pushMeasuredTextSegment(segText, getSegmentMetrics(segText, cache), segKind, segStart, segKind === 'text' && (analysis.isWordLike[mi] || isIndependentSymbolRun(segText)));
|
|
144
|
+
}
|
|
145
|
+
if (chunkStartSegmentIndex < widths.length) {
|
|
146
|
+
chunks.push({
|
|
147
|
+
startSegmentIndex: chunkStartSegmentIndex,
|
|
148
|
+
endSegmentIndex: widths.length,
|
|
149
|
+
consumedEndSegmentIndex: widths.length
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
const segLevels = segStarts === null ? null : computeSegmentLevels(analysis.normalized, segStarts);
|
|
153
|
+
if (segments !== null) {
|
|
154
|
+
return {
|
|
155
|
+
widths,
|
|
156
|
+
lineEndFitAdvances,
|
|
157
|
+
lineEndPaintAdvances,
|
|
158
|
+
kinds,
|
|
159
|
+
simpleLineWalkFastPath,
|
|
160
|
+
segLevels,
|
|
161
|
+
breakableFitAdvances,
|
|
162
|
+
breakablePreferredBreaks,
|
|
163
|
+
letterSpacing,
|
|
164
|
+
spacingGraphemeCounts,
|
|
165
|
+
discretionaryHyphenWidth,
|
|
166
|
+
tabStopAdvance,
|
|
167
|
+
chunks,
|
|
168
|
+
segments
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
widths,
|
|
173
|
+
lineEndFitAdvances,
|
|
174
|
+
lineEndPaintAdvances,
|
|
175
|
+
kinds,
|
|
176
|
+
simpleLineWalkFastPath,
|
|
177
|
+
segLevels,
|
|
178
|
+
breakableFitAdvances,
|
|
179
|
+
breakablePreferredBreaks,
|
|
180
|
+
letterSpacing,
|
|
181
|
+
spacingGraphemeCounts,
|
|
182
|
+
discretionaryHyphenWidth,
|
|
183
|
+
tabStopAdvance,
|
|
184
|
+
chunks
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
function prepareInternal(text, font, includeSegments, options) {
|
|
188
|
+
const wordBreak = options?.wordBreak ?? 'normal';
|
|
189
|
+
const letterSpacing = options?.letterSpacing ?? 0;
|
|
190
|
+
const analysis = analyzeText(text, getEngineProfile(), options?.whiteSpace, wordBreak);
|
|
191
|
+
return measureAnalysis(analysis, font, includeSegments, wordBreak, letterSpacing);
|
|
192
|
+
}
|
|
193
|
+
export function prepare(text, font, options) {
|
|
194
|
+
return prepareInternal(text, font, false, options);
|
|
195
|
+
}
|
|
196
|
+
export function prepareWithSegments(text, font, options) {
|
|
197
|
+
return prepareInternal(text, font, true, options);
|
|
198
|
+
}
|
|
199
|
+
function getInternalPrepared(prepared) {
|
|
200
|
+
return prepared;
|
|
201
|
+
}
|
|
202
|
+
export function layout(prepared, maxWidth, lineHeight) {
|
|
203
|
+
const lineCount = countPreparedLines(getInternalPrepared(prepared), maxWidth);
|
|
204
|
+
return {
|
|
205
|
+
lineCount,
|
|
206
|
+
height: lineCount * lineHeight
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
function createLayoutLine(prepared, cache, width, startSegmentIndex, startGraphemeIndex, endSegmentIndex, endGraphemeIndex) {
|
|
210
|
+
return {
|
|
211
|
+
text: buildLineTextFromRange(prepared, cache, startSegmentIndex, startGraphemeIndex, endSegmentIndex, endGraphemeIndex),
|
|
212
|
+
width,
|
|
213
|
+
start: {
|
|
214
|
+
segmentIndex: startSegmentIndex,
|
|
215
|
+
graphemeIndex: startGraphemeIndex
|
|
216
|
+
},
|
|
217
|
+
end: {
|
|
218
|
+
segmentIndex: endSegmentIndex,
|
|
219
|
+
graphemeIndex: endGraphemeIndex
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
function createLayoutLineRange(width, startSegmentIndex, startGraphemeIndex, endSegmentIndex, endGraphemeIndex) {
|
|
224
|
+
return {
|
|
225
|
+
width,
|
|
226
|
+
start: {
|
|
227
|
+
segmentIndex: startSegmentIndex,
|
|
228
|
+
graphemeIndex: startGraphemeIndex
|
|
229
|
+
},
|
|
230
|
+
end: {
|
|
231
|
+
segmentIndex: endSegmentIndex,
|
|
232
|
+
graphemeIndex: endGraphemeIndex
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
export function materializeLineRange(prepared, line) {
|
|
237
|
+
return createLayoutLine(prepared, getLineTextCache(prepared), line.width, line.start.segmentIndex, line.start.graphemeIndex, line.end.segmentIndex, line.end.graphemeIndex);
|
|
238
|
+
}
|
|
239
|
+
export function walkLineRanges(prepared, maxWidth, onLine) {
|
|
240
|
+
if (prepared.widths.length === 0) return 0;
|
|
241
|
+
return walkPreparedLinesRaw(getInternalPrepared(prepared), maxWidth, (width, startSegmentIndex, startGraphemeIndex, endSegmentIndex, endGraphemeIndex)=>{
|
|
242
|
+
onLine(createLayoutLineRange(width, startSegmentIndex, startGraphemeIndex, endSegmentIndex, endGraphemeIndex));
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
export function measureLineStats(prepared, maxWidth) {
|
|
246
|
+
return measurePreparedLineGeometry(getInternalPrepared(prepared), maxWidth);
|
|
247
|
+
}
|
|
248
|
+
export function measureNaturalWidth(prepared) {
|
|
249
|
+
let maxWidth = 0;
|
|
250
|
+
walkPreparedLinesRaw(getInternalPrepared(prepared), Number.POSITIVE_INFINITY, (width)=>{
|
|
251
|
+
if (width > maxWidth) maxWidth = width;
|
|
252
|
+
});
|
|
253
|
+
return maxWidth;
|
|
254
|
+
}
|
|
255
|
+
export function layoutNextLine(prepared, start, maxWidth) {
|
|
256
|
+
const internal = getInternalPrepared(prepared);
|
|
257
|
+
const end = {
|
|
258
|
+
segmentIndex: start.segmentIndex,
|
|
259
|
+
graphemeIndex: start.graphemeIndex
|
|
260
|
+
};
|
|
261
|
+
const chunkIndex = normalizePreparedLineStart(internal, end);
|
|
262
|
+
if (chunkIndex < 0) return null;
|
|
263
|
+
const lineStartSegmentIndex = end.segmentIndex;
|
|
264
|
+
const lineStartGraphemeIndex = end.graphemeIndex;
|
|
265
|
+
const width = stepPreparedLineGeometryFromChunk(internal, end, chunkIndex, maxWidth);
|
|
266
|
+
if (width === null) return null;
|
|
267
|
+
return createLayoutLine(prepared, getLineTextCache(prepared), width, lineStartSegmentIndex, lineStartGraphemeIndex, end.segmentIndex, end.graphemeIndex);
|
|
268
|
+
}
|
|
269
|
+
export function layoutNextLineRange(prepared, start, maxWidth) {
|
|
270
|
+
const internal = getInternalPrepared(prepared);
|
|
271
|
+
const end = {
|
|
272
|
+
segmentIndex: start.segmentIndex,
|
|
273
|
+
graphemeIndex: start.graphemeIndex
|
|
274
|
+
};
|
|
275
|
+
const chunkIndex = normalizePreparedLineStart(internal, end);
|
|
276
|
+
if (chunkIndex < 0) return null;
|
|
277
|
+
const lineStartSegmentIndex = end.segmentIndex;
|
|
278
|
+
const lineStartGraphemeIndex = end.graphemeIndex;
|
|
279
|
+
const width = stepPreparedLineGeometryFromChunk(internal, end, chunkIndex, maxWidth);
|
|
280
|
+
if (width === null) return null;
|
|
281
|
+
return createLayoutLineRange(width, lineStartSegmentIndex, lineStartGraphemeIndex, end.segmentIndex, end.graphemeIndex);
|
|
282
|
+
}
|
|
283
|
+
export function layoutWithLines(prepared, maxWidth, lineHeight) {
|
|
284
|
+
const lines = [];
|
|
285
|
+
if (prepared.widths.length === 0) return {
|
|
286
|
+
lineCount: 0,
|
|
287
|
+
height: 0,
|
|
288
|
+
lines
|
|
289
|
+
};
|
|
290
|
+
const graphemeCache = getLineTextCache(prepared);
|
|
291
|
+
const lineCount = walkPreparedLinesRaw(getInternalPrepared(prepared), maxWidth, (width, startSegmentIndex, startGraphemeIndex, endSegmentIndex, endGraphemeIndex)=>{
|
|
292
|
+
lines.push(createLayoutLine(prepared, graphemeCache, width, startSegmentIndex, startGraphemeIndex, endSegmentIndex, endGraphemeIndex));
|
|
293
|
+
});
|
|
294
|
+
return {
|
|
295
|
+
lineCount,
|
|
296
|
+
height: lineCount * lineHeight,
|
|
297
|
+
lines
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
export function clearCache() {
|
|
301
|
+
clearAnalysisCaches();
|
|
302
|
+
clearLineTextCaches();
|
|
303
|
+
clearMeasurementCaches();
|
|
304
|
+
}
|
|
305
|
+
export function setLocale(locale) {
|
|
306
|
+
setAnalysisLocale(locale);
|
|
307
|
+
clearCache();
|
|
308
|
+
}
|