Dashboard sipadu mbip
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

BlockValue.js 7.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = exports.Chomp = void 0;
  7. var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
  8. var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
  9. var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
  10. var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
  11. var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
  12. var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
  13. var _constants = require("../constants");
  14. var _Node2 = _interopRequireDefault(require("./Node"));
  15. var _Range = _interopRequireDefault(require("./Range"));
  16. var Chomp = {
  17. CLIP: 'CLIP',
  18. KEEP: 'KEEP',
  19. STRIP: 'STRIP'
  20. };
  21. exports.Chomp = Chomp;
  22. var BlockValue =
  23. /*#__PURE__*/
  24. function (_Node) {
  25. (0, _inherits2.default)(BlockValue, _Node);
  26. function BlockValue(type, props) {
  27. var _this;
  28. (0, _classCallCheck2.default)(this, BlockValue);
  29. _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(BlockValue).call(this, type, props));
  30. _this.blockIndent = null;
  31. _this.chomping = Chomp.CLIP;
  32. _this.header = null;
  33. return _this;
  34. }
  35. (0, _createClass2.default)(BlockValue, [{
  36. key: "parseBlockHeader",
  37. value: function parseBlockHeader(start) {
  38. var src = this.context.src;
  39. var offset = start + 1;
  40. var bi = '';
  41. while (true) {
  42. var ch = src[offset];
  43. switch (ch) {
  44. case '-':
  45. this.chomping = Chomp.STRIP;
  46. break;
  47. case '+':
  48. this.chomping = Chomp.KEEP;
  49. break;
  50. case '0':
  51. case '1':
  52. case '2':
  53. case '3':
  54. case '4':
  55. case '5':
  56. case '6':
  57. case '7':
  58. case '8':
  59. case '9':
  60. bi += ch;
  61. break;
  62. default:
  63. this.blockIndent = Number(bi) || null;
  64. this.header = new _Range.default(start, offset);
  65. return offset;
  66. }
  67. offset += 1;
  68. }
  69. }
  70. }, {
  71. key: "parseBlockValue",
  72. value: function parseBlockValue(start) {
  73. var _this$context = this.context,
  74. indent = _this$context.indent,
  75. src = _this$context.src;
  76. var offset = start;
  77. var valueEnd = start;
  78. var bi = this.blockIndent ? indent + this.blockIndent - 1 : indent;
  79. var minBlockIndent = 1;
  80. for (var ch = src[offset]; ch === '\n'; ch = src[offset]) {
  81. offset += 1;
  82. if (_Node2.default.atDocumentBoundary(src, offset)) break;
  83. var end = _Node2.default.endOfBlockIndent(src, bi, offset); // should not include tab?
  84. if (end === null) break;
  85. if (!this.blockIndent) {
  86. // no explicit block indent, none yet detected
  87. var lineIndent = end - (offset + indent);
  88. if (src[end] !== '\n') {
  89. // first line with non-whitespace content
  90. if (lineIndent < minBlockIndent) {
  91. offset -= 1;
  92. break;
  93. }
  94. this.blockIndent = lineIndent;
  95. bi = indent + this.blockIndent - 1;
  96. } else if (lineIndent > minBlockIndent) {
  97. // empty line with more whitespace
  98. minBlockIndent = lineIndent;
  99. }
  100. }
  101. if (src[end] === '\n') {
  102. offset = end;
  103. } else {
  104. offset = valueEnd = _Node2.default.endOfLine(src, end);
  105. }
  106. }
  107. if (this.chomping !== Chomp.KEEP) {
  108. offset = src[valueEnd] ? valueEnd + 1 : valueEnd;
  109. }
  110. this.valueRange = new _Range.default(start + 1, offset);
  111. return offset;
  112. }
  113. /**
  114. * Parses a block value from the source
  115. *
  116. * Accepted forms are:
  117. * ```
  118. * BS
  119. * block
  120. * lines
  121. *
  122. * BS #comment
  123. * block
  124. * lines
  125. * ```
  126. * where the block style BS matches the regexp `[|>][-+1-9]*` and block lines
  127. * are empty or have an indent level greater than `indent`.
  128. *
  129. * @param {ParseContext} context
  130. * @param {number} start - Index of first character
  131. * @returns {number} - Index of the character after this block
  132. */
  133. }, {
  134. key: "parse",
  135. value: function parse(context, start) {
  136. this.context = context;
  137. var src = context.src;
  138. var offset = this.parseBlockHeader(start);
  139. offset = _Node2.default.endOfWhiteSpace(src, offset);
  140. offset = this.parseComment(offset);
  141. offset = this.parseBlockValue(offset);
  142. return offset;
  143. }
  144. }, {
  145. key: "setOrigRanges",
  146. value: function setOrigRanges(cr, offset) {
  147. offset = (0, _get2.default)((0, _getPrototypeOf2.default)(BlockValue.prototype), "setOrigRanges", this).call(this, cr, offset);
  148. return this.header ? this.header.setOrigRange(cr, offset) : offset;
  149. }
  150. }, {
  151. key: "includesTrailingLines",
  152. get: function get() {
  153. return this.chomping === Chomp.KEEP;
  154. }
  155. }, {
  156. key: "strValue",
  157. get: function get() {
  158. if (!this.valueRange || !this.context) return null;
  159. var _this$valueRange = this.valueRange,
  160. start = _this$valueRange.start,
  161. end = _this$valueRange.end;
  162. var _this$context2 = this.context,
  163. indent = _this$context2.indent,
  164. src = _this$context2.src;
  165. if (this.valueRange.isEmpty()) return '';
  166. var lastNewLine = null;
  167. var ch = src[end - 1];
  168. while (ch === '\n' || ch === '\t' || ch === ' ') {
  169. end -= 1;
  170. if (end <= start) {
  171. if (this.chomping === Chomp.KEEP) break;else return '';
  172. }
  173. if (ch === '\n') lastNewLine = end;
  174. ch = src[end - 1];
  175. }
  176. var keepStart = end + 1;
  177. if (lastNewLine) {
  178. if (this.chomping === Chomp.KEEP) {
  179. keepStart = lastNewLine;
  180. end = this.valueRange.end;
  181. } else {
  182. end = lastNewLine;
  183. }
  184. }
  185. var bi = indent + this.blockIndent;
  186. var folded = this.type === _constants.Type.BLOCK_FOLDED;
  187. var atStart = true;
  188. var str = '';
  189. var sep = '';
  190. var prevMoreIndented = false;
  191. for (var i = start; i < end; ++i) {
  192. for (var j = 0; j < bi; ++j) {
  193. if (src[i] !== ' ') break;
  194. i += 1;
  195. }
  196. var _ch = src[i];
  197. if (_ch === '\n') {
  198. if (sep === '\n') str += '\n';else sep = '\n';
  199. } else {
  200. var lineEnd = _Node2.default.endOfLine(src, i);
  201. var line = src.slice(i, lineEnd);
  202. i = lineEnd;
  203. if (folded && (_ch === ' ' || _ch === '\t') && i < keepStart) {
  204. if (sep === ' ') sep = '\n';else if (!prevMoreIndented && !atStart && sep === '\n') sep = '\n\n';
  205. str += sep + line; //+ ((lineEnd < end && src[lineEnd]) || '')
  206. sep = lineEnd < end && src[lineEnd] || '';
  207. prevMoreIndented = true;
  208. } else {
  209. str += sep + line;
  210. sep = folded && i < keepStart ? ' ' : '\n';
  211. prevMoreIndented = false;
  212. }
  213. if (atStart && line !== '') atStart = false;
  214. }
  215. }
  216. return this.chomping === Chomp.STRIP ? str : str + '\n';
  217. }
  218. }]);
  219. return BlockValue;
  220. }(_Node2.default);
  221. exports.default = BlockValue;