My dotfiles
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

208 lines
8.8 KiB

  1. (function (factory) {
  2. if (typeof module === "object" && typeof module.exports === "object") {
  3. var v = factory(require, exports);
  4. if (v !== undefined) module.exports = v;
  5. }
  6. else if (typeof define === "function" && define.amd) {
  7. define(["require", "exports", "./main"], factory);
  8. }
  9. })(function (require, exports) {
  10. /*---------------------------------------------------------------------------------------------
  11. * Copyright (c) Microsoft Corporation. All rights reserved.
  12. * Licensed under the MIT License. See License.txt in the project root for license information.
  13. *--------------------------------------------------------------------------------------------*/
  14. 'use strict';
  15. Object.defineProperty(exports, "__esModule", { value: true });
  16. var Json = require("./main");
  17. function format(documentText, range, options) {
  18. var initialIndentLevel;
  19. var formatText;
  20. var formatTextStart;
  21. var rangeStart;
  22. var rangeEnd;
  23. if (range) {
  24. rangeStart = range.offset;
  25. rangeEnd = rangeStart + range.length;
  26. formatTextStart = rangeStart;
  27. while (formatTextStart > 0 && !isEOL(documentText, formatTextStart - 1)) {
  28. formatTextStart--;
  29. }
  30. var endOffset = rangeEnd;
  31. while (endOffset < documentText.length && !isEOL(documentText, endOffset)) {
  32. endOffset++;
  33. }
  34. formatText = documentText.substring(formatTextStart, endOffset);
  35. initialIndentLevel = computeIndentLevel(formatText, 0, options);
  36. }
  37. else {
  38. formatText = documentText;
  39. initialIndentLevel = 0;
  40. formatTextStart = 0;
  41. rangeStart = 0;
  42. rangeEnd = documentText.length;
  43. }
  44. var eol = getEOL(options, documentText);
  45. var lineBreak = false;
  46. var indentLevel = 0;
  47. var indentValue;
  48. if (options.insertSpaces) {
  49. indentValue = repeat(' ', options.tabSize || 4);
  50. }
  51. else {
  52. indentValue = '\t';
  53. }
  54. var scanner = Json.createScanner(formatText, false);
  55. var hasError = false;
  56. function newLineAndIndent() {
  57. return eol + repeat(indentValue, initialIndentLevel + indentLevel);
  58. }
  59. function scanNext() {
  60. var token = scanner.scan();
  61. lineBreak = false;
  62. while (token === Json.SyntaxKind.Trivia || token === Json.SyntaxKind.LineBreakTrivia) {
  63. lineBreak = lineBreak || (token === Json.SyntaxKind.LineBreakTrivia);
  64. token = scanner.scan();
  65. }
  66. hasError = token === Json.SyntaxKind.Unknown || scanner.getTokenError() !== Json.ScanError.None;
  67. return token;
  68. }
  69. var editOperations = [];
  70. function addEdit(text, startOffset, endOffset) {
  71. if (!hasError && startOffset < rangeEnd && endOffset > rangeStart && documentText.substring(startOffset, endOffset) !== text) {
  72. editOperations.push({ offset: startOffset, length: endOffset - startOffset, content: text });
  73. }
  74. }
  75. var firstToken = scanNext();
  76. if (firstToken !== Json.SyntaxKind.EOF) {
  77. var firstTokenStart = scanner.getTokenOffset() + formatTextStart;
  78. var initialIndent = repeat(indentValue, initialIndentLevel);
  79. addEdit(initialIndent, formatTextStart, firstTokenStart);
  80. }
  81. while (firstToken !== Json.SyntaxKind.EOF) {
  82. var firstTokenEnd = scanner.getTokenOffset() + scanner.getTokenLength() + formatTextStart;
  83. var secondToken = scanNext();
  84. var replaceContent = '';
  85. while (!lineBreak && (secondToken === Json.SyntaxKind.LineCommentTrivia || secondToken === Json.SyntaxKind.BlockCommentTrivia)) {
  86. // comments on the same line: keep them on the same line, but ignore them otherwise
  87. var commentTokenStart = scanner.getTokenOffset() + formatTextStart;
  88. addEdit(' ', firstTokenEnd, commentTokenStart);
  89. firstTokenEnd = scanner.getTokenOffset() + scanner.getTokenLength() + formatTextStart;
  90. replaceContent = secondToken === Json.SyntaxKind.LineCommentTrivia ? newLineAndIndent() : '';
  91. secondToken = scanNext();
  92. }
  93. if (secondToken === Json.SyntaxKind.CloseBraceToken) {
  94. if (firstToken !== Json.SyntaxKind.OpenBraceToken) {
  95. indentLevel--;
  96. replaceContent = newLineAndIndent();
  97. }
  98. }
  99. else if (secondToken === Json.SyntaxKind.CloseBracketToken) {
  100. if (firstToken !== Json.SyntaxKind.OpenBracketToken) {
  101. indentLevel--;
  102. replaceContent = newLineAndIndent();
  103. }
  104. }
  105. else {
  106. switch (firstToken) {
  107. case Json.SyntaxKind.OpenBracketToken:
  108. case Json.SyntaxKind.OpenBraceToken:
  109. indentLevel++;
  110. replaceContent = newLineAndIndent();
  111. break;
  112. case Json.SyntaxKind.CommaToken:
  113. case Json.SyntaxKind.LineCommentTrivia:
  114. replaceContent = newLineAndIndent();
  115. break;
  116. case Json.SyntaxKind.BlockCommentTrivia:
  117. if (lineBreak) {
  118. replaceContent = newLineAndIndent();
  119. }
  120. else {
  121. // symbol following comment on the same line: keep on same line, separate with ' '
  122. replaceContent = ' ';
  123. }
  124. break;
  125. case Json.SyntaxKind.ColonToken:
  126. replaceContent = ' ';
  127. break;
  128. case Json.SyntaxKind.StringLiteral:
  129. if (secondToken === Json.SyntaxKind.ColonToken) {
  130. replaceContent = '';
  131. break;
  132. }
  133. // fall through
  134. case Json.SyntaxKind.NullKeyword:
  135. case Json.SyntaxKind.TrueKeyword:
  136. case Json.SyntaxKind.FalseKeyword:
  137. case Json.SyntaxKind.NumericLiteral:
  138. case Json.SyntaxKind.CloseBraceToken:
  139. case Json.SyntaxKind.CloseBracketToken:
  140. if (secondToken === Json.SyntaxKind.LineCommentTrivia || secondToken === Json.SyntaxKind.BlockCommentTrivia) {
  141. replaceContent = ' ';
  142. }
  143. else if (secondToken !== Json.SyntaxKind.CommaToken && secondToken !== Json.SyntaxKind.EOF) {
  144. hasError = true;
  145. }
  146. break;
  147. case Json.SyntaxKind.Unknown:
  148. hasError = true;
  149. break;
  150. }
  151. if (lineBreak && (secondToken === Json.SyntaxKind.LineCommentTrivia || secondToken === Json.SyntaxKind.BlockCommentTrivia)) {
  152. replaceContent = newLineAndIndent();
  153. }
  154. }
  155. var secondTokenStart = scanner.getTokenOffset() + formatTextStart;
  156. addEdit(replaceContent, firstTokenEnd, secondTokenStart);
  157. firstToken = secondToken;
  158. }
  159. return editOperations;
  160. }
  161. exports.format = format;
  162. function repeat(s, count) {
  163. var result = '';
  164. for (var i = 0; i < count; i++) {
  165. result += s;
  166. }
  167. return result;
  168. }
  169. function computeIndentLevel(content, offset, options) {
  170. var i = 0;
  171. var nChars = 0;
  172. var tabSize = options.tabSize || 4;
  173. while (i < content.length) {
  174. var ch = content.charAt(i);
  175. if (ch === ' ') {
  176. nChars++;
  177. }
  178. else if (ch === '\t') {
  179. nChars += tabSize;
  180. }
  181. else {
  182. break;
  183. }
  184. i++;
  185. }
  186. return Math.floor(nChars / tabSize);
  187. }
  188. function getEOL(options, text) {
  189. for (var i = 0; i < text.length; i++) {
  190. var ch = text.charAt(i);
  191. if (ch === '\r') {
  192. if (i + 1 < text.length && text.charAt(i + 1) === '\n') {
  193. return '\r\n';
  194. }
  195. return '\r';
  196. }
  197. else if (ch === '\n') {
  198. return '\n';
  199. }
  200. }
  201. return (options && options.eol) || '\n';
  202. }
  203. function isEOL(text, offset) {
  204. return '\r\n'.indexOf(text.charAt(offset)) !== -1;
  205. }
  206. exports.isEOL = isEOL;
  207. });
  208. //# sourceMappingURL=format.js.map