UNPKG

monaco-editor-core

Version:
50 lines 1.97 kB
/*--------------------------------------------------------------------------------------------- * 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