monaco-editor-core
Version:
A browser based code editor
50 lines • 1.97 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { safeIntl } from '../../../base/common/date.js';
export function createContentSegmenter(lineData, options) {
if (lineData.isBasicASCII && options.useMonospaceOptimizations) {
return new AsciiContentSegmenter(lineData);
}
return new GraphemeContentSegmenter(lineData);
}
class AsciiContentSegmenter {
constructor(lineData) {
this._content = lineData.content;
}
getSegmentAtIndex(index) {
return this._content[index];
}
}
/**
* This is a more modern version of {@link GraphemeIterator}, relying on browser APIs instead of a
* manual table approach.
*/
class GraphemeContentSegmenter {
constructor(lineData) {
this._segments = [];
const content = lineData.content;
const segmenter = safeIntl.Segmenter(undefined, { granularity: 'grapheme' }).value;
const segmentedContent = Array.from(segmenter.segment(content));
let segmenterIndex = 0;
for (let x = 0; x < content.length; x++) {
const segment = segmentedContent[segmenterIndex];
// No more segments in the string (eg. an emoji is the last segment)
if (!segment) {
break;
}
// The segment isn't renderable (eg. the tail end of an emoji)
if (segment.index !== x) {
this._segments.push(undefined);
continue;
}
segmenterIndex++;
this._segments.push(segment);
}
}
getSegmentAtIndex(index) {
return this._segments[index]?.segment;
}
}
//# sourceMappingURL=contentSegmenter.js.map