| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- /*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
- import * as dom from '../../dom.js';
- import { renderLabelWithIcons } from '../iconLabel/iconLabels.js';
- import * as objects from '../../../common/objects.js';
- /**
- * A widget which can render a label with substring highlights, often
- * originating from a filter function like the fuzzy matcher.
- */
- export class HighlightedLabel {
- /**
- * Create a new {@link HighlightedLabel}.
- *
- * @param container The parent container to append to.
- */
- constructor(container, options) {
- var _a;
- this.text = '';
- this.title = '';
- this.highlights = [];
- this.didEverRender = false;
- this.supportIcons = (_a = options === null || options === void 0 ? void 0 : options.supportIcons) !== null && _a !== void 0 ? _a : false;
- this.domNode = dom.append(container, dom.$('span.monaco-highlighted-label'));
- }
- /**
- * The label's DOM node.
- */
- get element() {
- return this.domNode;
- }
- /**
- * Set the label and highlights.
- *
- * @param text The label to display.
- * @param highlights The ranges to highlight.
- * @param title An optional title for the hover tooltip.
- * @param escapeNewLines Whether to escape new lines.
- * @returns
- */
- set(text, highlights = [], title = '', escapeNewLines) {
- if (!text) {
- text = '';
- }
- if (escapeNewLines) {
- // adjusts highlights inplace
- text = HighlightedLabel.escapeNewLines(text, highlights);
- }
- if (this.didEverRender && this.text === text && this.title === title && objects.equals(this.highlights, highlights)) {
- return;
- }
- this.text = text;
- this.title = title;
- this.highlights = highlights;
- this.render();
- }
- render() {
- const children = [];
- let pos = 0;
- for (const highlight of this.highlights) {
- if (highlight.end === highlight.start) {
- continue;
- }
- if (pos < highlight.start) {
- const substring = this.text.substring(pos, highlight.start);
- children.push(dom.$('span', undefined, ...this.supportIcons ? renderLabelWithIcons(substring) : [substring]));
- pos = highlight.end;
- }
- const substring = this.text.substring(highlight.start, highlight.end);
- const element = dom.$('span.highlight', undefined, ...this.supportIcons ? renderLabelWithIcons(substring) : [substring]);
- if (highlight.extraClasses) {
- element.classList.add(...highlight.extraClasses);
- }
- children.push(element);
- pos = highlight.end;
- }
- if (pos < this.text.length) {
- const substring = this.text.substring(pos);
- children.push(dom.$('span', undefined, ...this.supportIcons ? renderLabelWithIcons(substring) : [substring]));
- }
- dom.reset(this.domNode, ...children);
- if (this.title) {
- this.domNode.title = this.title;
- }
- else {
- this.domNode.removeAttribute('title');
- }
- this.didEverRender = true;
- }
- static escapeNewLines(text, highlights) {
- let total = 0;
- let extra = 0;
- return text.replace(/\r\n|\r|\n/g, (match, offset) => {
- extra = match === '\r\n' ? -1 : 0;
- offset += total;
- for (const highlight of highlights) {
- if (highlight.end <= offset) {
- continue;
- }
- if (highlight.start >= offset) {
- highlight.start += extra;
- }
- if (highlight.end >= offset) {
- highlight.end += extra;
- }
- }
- total += extra;
- return '\u23CE';
- });
- }
- }
|