| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- /*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
- };
- var _a;
- import * as strings from '../../../base/common/strings.js';
- import { LineTokens } from '../../common/tokens/lineTokens.js';
- import { TokenizationRegistry } from '../../common/languages.js';
- import { RenderLineInput, renderViewLine2 as renderViewLine } from '../../common/viewLayout/viewLineRenderer.js';
- import { ViewLineRenderingData } from '../../common/viewModel.js';
- import { MonarchTokenizer } from '../common/monarch/monarchLexer.js';
- const ttPolicy = (_a = window.trustedTypes) === null || _a === void 0 ? void 0 : _a.createPolicy('standaloneColorizer', { createHTML: value => value });
- export class Colorizer {
- static colorizeElement(themeService, languageService, domNode, options) {
- options = options || {};
- const theme = options.theme || 'vs';
- const mimeType = options.mimeType || domNode.getAttribute('lang') || domNode.getAttribute('data-lang');
- if (!mimeType) {
- console.error('Mode not detected');
- return Promise.resolve();
- }
- const languageId = languageService.getLanguageIdByMimeType(mimeType) || mimeType;
- themeService.setTheme(theme);
- const text = domNode.firstChild ? domNode.firstChild.nodeValue : '';
- domNode.className += ' ' + theme;
- const render = (str) => {
- var _a;
- const trustedhtml = (_a = ttPolicy === null || ttPolicy === void 0 ? void 0 : ttPolicy.createHTML(str)) !== null && _a !== void 0 ? _a : str;
- domNode.innerHTML = trustedhtml;
- };
- return this.colorize(languageService, text || '', languageId, options).then(render, (err) => console.error(err));
- }
- static colorize(languageService, text, languageId, options) {
- return __awaiter(this, void 0, void 0, function* () {
- const languageIdCodec = languageService.languageIdCodec;
- let tabSize = 4;
- if (options && typeof options.tabSize === 'number') {
- tabSize = options.tabSize;
- }
- if (strings.startsWithUTF8BOM(text)) {
- text = text.substr(1);
- }
- const lines = strings.splitLines(text);
- if (!languageService.isRegisteredLanguageId(languageId)) {
- return _fakeColorize(lines, tabSize, languageIdCodec);
- }
- const tokenizationSupport = yield TokenizationRegistry.getOrCreate(languageId);
- if (tokenizationSupport) {
- return _colorize(lines, tabSize, tokenizationSupport, languageIdCodec);
- }
- return _fakeColorize(lines, tabSize, languageIdCodec);
- });
- }
- static colorizeLine(line, mightContainNonBasicASCII, mightContainRTL, tokens, tabSize = 4) {
- const isBasicASCII = ViewLineRenderingData.isBasicASCII(line, mightContainNonBasicASCII);
- const containsRTL = ViewLineRenderingData.containsRTL(line, isBasicASCII, mightContainRTL);
- const renderResult = renderViewLine(new RenderLineInput(false, true, line, false, isBasicASCII, containsRTL, 0, tokens, [], tabSize, 0, 0, 0, 0, -1, 'none', false, false, null));
- return renderResult.html;
- }
- static colorizeModelLine(model, lineNumber, tabSize = 4) {
- const content = model.getLineContent(lineNumber);
- model.tokenization.forceTokenization(lineNumber);
- const tokens = model.tokenization.getLineTokens(lineNumber);
- const inflatedTokens = tokens.inflate();
- return this.colorizeLine(content, model.mightContainNonBasicASCII(), model.mightContainRTL(), inflatedTokens, tabSize);
- }
- }
- function _colorize(lines, tabSize, tokenizationSupport, languageIdCodec) {
- return new Promise((c, e) => {
- const execute = () => {
- const result = _actualColorize(lines, tabSize, tokenizationSupport, languageIdCodec);
- if (tokenizationSupport instanceof MonarchTokenizer) {
- const status = tokenizationSupport.getLoadStatus();
- if (status.loaded === false) {
- status.promise.then(execute, e);
- return;
- }
- }
- c(result);
- };
- execute();
- });
- }
- function _fakeColorize(lines, tabSize, languageIdCodec) {
- let html = [];
- const defaultMetadata = ((0 /* FontStyle.None */ << 11 /* MetadataConsts.FONT_STYLE_OFFSET */)
- | (1 /* ColorId.DefaultForeground */ << 15 /* MetadataConsts.FOREGROUND_OFFSET */)
- | (2 /* ColorId.DefaultBackground */ << 24 /* MetadataConsts.BACKGROUND_OFFSET */)) >>> 0;
- const tokens = new Uint32Array(2);
- tokens[0] = 0;
- tokens[1] = defaultMetadata;
- for (let i = 0, length = lines.length; i < length; i++) {
- const line = lines[i];
- tokens[0] = line.length;
- const lineTokens = new LineTokens(tokens, line, languageIdCodec);
- const isBasicASCII = ViewLineRenderingData.isBasicASCII(line, /* check for basic ASCII */ true);
- const containsRTL = ViewLineRenderingData.containsRTL(line, isBasicASCII, /* check for RTL */ true);
- const renderResult = renderViewLine(new RenderLineInput(false, true, line, false, isBasicASCII, containsRTL, 0, lineTokens, [], tabSize, 0, 0, 0, 0, -1, 'none', false, false, null));
- html = html.concat(renderResult.html);
- html.push('<br/>');
- }
- return html.join('');
- }
- function _actualColorize(lines, tabSize, tokenizationSupport, languageIdCodec) {
- let html = [];
- let state = tokenizationSupport.getInitialState();
- for (let i = 0, length = lines.length; i < length; i++) {
- const line = lines[i];
- const tokenizeResult = tokenizationSupport.tokenizeEncoded(line, true, state);
- LineTokens.convertToEndOffset(tokenizeResult.tokens, line.length);
- const lineTokens = new LineTokens(tokenizeResult.tokens, line, languageIdCodec);
- const isBasicASCII = ViewLineRenderingData.isBasicASCII(line, /* check for basic ASCII */ true);
- const containsRTL = ViewLineRenderingData.containsRTL(line, isBasicASCII, /* check for RTL */ true);
- const renderResult = renderViewLine(new RenderLineInput(false, true, line, false, isBasicASCII, containsRTL, 0, lineTokens.inflate(), [], tabSize, 0, 0, 0, 0, -1, 'none', false, false, null));
- html = html.concat(renderResult.html);
- html.push('<br/>');
- state = tokenizeResult.endState;
- }
- return html.join('');
- }
|