969412beff878379816eedd514f9b5f32b86724630458a5491f93212af3bbbbab7de1944ddeceb292b05d502274e2d7c61a2a769b98b4f6bfb3e86dd89e91f 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /*---------------------------------------------------------------------------------------------
  2. * Copyright (c) Microsoft Corporation. All rights reserved.
  3. * Licensed under the MIT License. See License.txt in the project root for license information.
  4. *--------------------------------------------------------------------------------------------*/
  5. var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
  6. function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
  7. return new (P || (P = Promise))(function (resolve, reject) {
  8. function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
  9. function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
  10. function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
  11. step((generator = generator.apply(thisArg, _arguments || [])).next());
  12. });
  13. };
  14. import * as strings from '../../../base/common/strings.js';
  15. import { LineTokens } from '../tokens/lineTokens.js';
  16. import { TokenizationRegistry } from '../languages.js';
  17. import { NullState, nullTokenizeEncoded } from './nullTokenize.js';
  18. const fallback = {
  19. getInitialState: () => NullState,
  20. tokenizeEncoded: (buffer, hasEOL, state) => nullTokenizeEncoded(0 /* LanguageId.Null */, state)
  21. };
  22. export function tokenizeToString(languageService, text, languageId) {
  23. return __awaiter(this, void 0, void 0, function* () {
  24. if (!languageId) {
  25. return _tokenizeToString(text, languageService.languageIdCodec, fallback);
  26. }
  27. const tokenizationSupport = yield TokenizationRegistry.getOrCreate(languageId);
  28. return _tokenizeToString(text, languageService.languageIdCodec, tokenizationSupport || fallback);
  29. });
  30. }
  31. export function tokenizeLineToHTML(text, viewLineTokens, colorMap, startOffset, endOffset, tabSize, useNbsp) {
  32. let result = `<div>`;
  33. let charIndex = startOffset;
  34. let tabsCharDelta = 0;
  35. let prevIsSpace = true;
  36. for (let tokenIndex = 0, tokenCount = viewLineTokens.getCount(); tokenIndex < tokenCount; tokenIndex++) {
  37. const tokenEndIndex = viewLineTokens.getEndOffset(tokenIndex);
  38. if (tokenEndIndex <= startOffset) {
  39. continue;
  40. }
  41. let partContent = '';
  42. for (; charIndex < tokenEndIndex && charIndex < endOffset; charIndex++) {
  43. const charCode = text.charCodeAt(charIndex);
  44. switch (charCode) {
  45. case 9 /* CharCode.Tab */: {
  46. let insertSpacesCount = tabSize - (charIndex + tabsCharDelta) % tabSize;
  47. tabsCharDelta += insertSpacesCount - 1;
  48. while (insertSpacesCount > 0) {
  49. if (useNbsp && prevIsSpace) {
  50. partContent += '&#160;';
  51. prevIsSpace = false;
  52. }
  53. else {
  54. partContent += ' ';
  55. prevIsSpace = true;
  56. }
  57. insertSpacesCount--;
  58. }
  59. break;
  60. }
  61. case 60 /* CharCode.LessThan */:
  62. partContent += '&lt;';
  63. prevIsSpace = false;
  64. break;
  65. case 62 /* CharCode.GreaterThan */:
  66. partContent += '&gt;';
  67. prevIsSpace = false;
  68. break;
  69. case 38 /* CharCode.Ampersand */:
  70. partContent += '&amp;';
  71. prevIsSpace = false;
  72. break;
  73. case 0 /* CharCode.Null */:
  74. partContent += '&#00;';
  75. prevIsSpace = false;
  76. break;
  77. case 65279 /* CharCode.UTF8_BOM */:
  78. case 8232 /* CharCode.LINE_SEPARATOR */:
  79. case 8233 /* CharCode.PARAGRAPH_SEPARATOR */:
  80. case 133 /* CharCode.NEXT_LINE */:
  81. partContent += '\ufffd';
  82. prevIsSpace = false;
  83. break;
  84. case 13 /* CharCode.CarriageReturn */:
  85. // zero width space, because carriage return would introduce a line break
  86. partContent += '&#8203';
  87. prevIsSpace = false;
  88. break;
  89. case 32 /* CharCode.Space */:
  90. if (useNbsp && prevIsSpace) {
  91. partContent += '&#160;';
  92. prevIsSpace = false;
  93. }
  94. else {
  95. partContent += ' ';
  96. prevIsSpace = true;
  97. }
  98. break;
  99. default:
  100. partContent += String.fromCharCode(charCode);
  101. prevIsSpace = false;
  102. }
  103. }
  104. result += `<span style="${viewLineTokens.getInlineStyle(tokenIndex, colorMap)}">${partContent}</span>`;
  105. if (tokenEndIndex > endOffset || charIndex >= endOffset) {
  106. break;
  107. }
  108. }
  109. result += `</div>`;
  110. return result;
  111. }
  112. export function _tokenizeToString(text, languageIdCodec, tokenizationSupport) {
  113. let result = `<div class="monaco-tokenized-source">`;
  114. const lines = strings.splitLines(text);
  115. let currentState = tokenizationSupport.getInitialState();
  116. for (let i = 0, len = lines.length; i < len; i++) {
  117. const line = lines[i];
  118. if (i > 0) {
  119. result += `<br/>`;
  120. }
  121. const tokenizationResult = tokenizationSupport.tokenizeEncoded(line, true, currentState);
  122. LineTokens.convertToEndOffset(tokenizationResult.tokens, line.length);
  123. const lineTokens = new LineTokens(tokenizationResult.tokens, line, languageIdCodec);
  124. const viewLineTokens = lineTokens.inflate();
  125. let startOffset = 0;
  126. for (let j = 0, lenJ = viewLineTokens.getCount(); j < lenJ; j++) {
  127. const type = viewLineTokens.getClassName(j);
  128. const endIndex = viewLineTokens.getEndOffset(j);
  129. result += `<span class="${type}">${strings.escape(line.substring(startOffset, endIndex))}</span>`;
  130. startOffset = endIndex;
  131. }
  132. currentState = tokenizationResult.endState;
  133. }
  134. result += `</div>`;
  135. return result;
  136. }