123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 |
- "use strict";
-
- var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
-
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.stringifyNumber = stringifyNumber;
- exports.stringifyString = stringifyString;
-
- var _addComment = require("./addComment");
-
- var _constants = require("./constants");
-
- var _foldFlowLines = _interopRequireWildcard(require("./foldFlowLines"));
-
- var _options = require("./tags/options");
-
- function stringifyNumber(_ref) {
- var format = _ref.format,
- minFractionDigits = _ref.minFractionDigits,
- tag = _ref.tag,
- value = _ref.value;
- if (!isFinite(value)) return isNaN(value) ? '.nan' : value < 0 ? '-.inf' : '.inf';
- var n = JSON.stringify(value);
-
- if (!format && minFractionDigits && (!tag || tag === 'tag:yaml.org,2002:float') && /^\d/.test(n)) {
- var i = n.indexOf('.');
-
- if (i < 0) {
- i = n.length;
- n += '.';
- }
-
- var d = minFractionDigits - (n.length - i - 1);
-
- while (d-- > 0) {
- n += '0';
- }
- }
-
- return n;
- }
-
- function lineLengthOverLimit(str, limit) {
- var strLen = str.length;
- if (strLen <= limit) return false;
-
- for (var i = 0, start = 0; i < strLen; ++i) {
- if (str[i] === '\n') {
- if (i - start > limit) return true;
- start = i + 1;
- if (strLen - start <= limit) return false;
- }
- }
-
- return true;
- }
-
- function doubleQuotedString(value, _ref2) {
- var implicitKey = _ref2.implicitKey,
- indent = _ref2.indent;
- var _strOptions$doubleQuo = _options.strOptions.doubleQuoted,
- jsonEncoding = _strOptions$doubleQuo.jsonEncoding,
- minMultiLineLength = _strOptions$doubleQuo.minMultiLineLength;
- var json = JSON.stringify(value);
- if (jsonEncoding) return json;
- var str = '';
- var start = 0;
-
- for (var i = 0, ch = json[i]; ch; ch = json[++i]) {
- if (ch === ' ' && json[i + 1] === '\\' && json[i + 2] === 'n') {
- // space before newline needs to be escaped to not be folded
- str += json.slice(start, i) + '\\ ';
- i += 1;
- start = i;
- ch = '\\';
- }
-
- if (ch === '\\') switch (json[i + 1]) {
- case 'u':
- {
- str += json.slice(start, i);
- var code = json.substr(i + 2, 4);
-
- switch (code) {
- case '0000':
- str += '\\0';
- break;
-
- case '0007':
- str += '\\a';
- break;
-
- case '000b':
- str += '\\v';
- break;
-
- case '001b':
- str += '\\e';
- break;
-
- case '0085':
- str += '\\N';
- break;
-
- case '00a0':
- str += '\\_';
- break;
-
- case '2028':
- str += '\\L';
- break;
-
- case '2029':
- str += '\\P';
- break;
-
- default:
- if (code.substr(0, 2) === '00') str += '\\x' + code.substr(2);else str += json.substr(i, 6);
- }
-
- i += 5;
- start = i + 1;
- }
- break;
-
- case 'n':
- if (implicitKey || json[i + 2] === '"' || json.length < minMultiLineLength) {
- i += 1;
- } else {
- // folding will eat first newline
- str += json.slice(start, i) + '\n\n';
-
- while (json[i + 2] === '\\' && json[i + 3] === 'n' && json[i + 4] !== '"') {
- str += '\n';
- i += 2;
- }
-
- str += indent; // space after newline needs to be escaped to not be folded
-
- if (json[i + 2] === ' ') str += '\\';
- i += 1;
- start = i + 1;
- }
-
- break;
-
- default:
- i += 1;
- }
- }
-
- str = start ? str + json.slice(start) : json;
- return implicitKey ? str : (0, _foldFlowLines.default)(str, indent, _foldFlowLines.FOLD_QUOTED, _options.strOptions.fold);
- }
-
- function singleQuotedString(value, ctx) {
- var indent = ctx.indent,
- implicitKey = ctx.implicitKey;
-
- if (implicitKey) {
- if (/\n/.test(value)) return doubleQuotedString(value, ctx);
- } else {
- // single quoted string can't have leading or trailing whitespace around newline
- if (/[ \t]\n|\n[ \t]/.test(value)) return doubleQuotedString(value, ctx);
- }
-
- var res = "'" + value.replace(/'/g, "''").replace(/\n+/g, "$&\n".concat(indent)) + "'";
- return implicitKey ? res : (0, _foldFlowLines.default)(res, indent, _foldFlowLines.FOLD_FLOW, _options.strOptions.fold);
- }
-
- function blockString(_ref3, ctx, onComment, onChompKeep) {
- var comment = _ref3.comment,
- type = _ref3.type,
- value = _ref3.value;
-
- // 1. Block can't end in whitespace unless the last line is non-empty.
- // 2. Strings consisting of only whitespace are best rendered explicitly.
- if (/\n[\t ]+$/.test(value) || /^\s*$/.test(value)) {
- return doubleQuotedString(value, ctx);
- }
-
- var indent = ctx.indent || (ctx.forceBlockIndent ? ' ' : '');
- var indentSize = indent ? '2' : '1'; // root is at -1
-
- var literal = type === _constants.Type.BLOCK_FOLDED ? false : type === _constants.Type.BLOCK_LITERAL ? true : !lineLengthOverLimit(value, _options.strOptions.fold.lineWidth - indent.length);
- var header = literal ? '|' : '>';
- if (!value) return header + '\n';
- var wsStart = '';
- var wsEnd = '';
- value = value.replace(/[\n\t ]*$/, function (ws) {
- var n = ws.indexOf('\n');
-
- if (n === -1) {
- header += '-'; // strip
- } else if (value === ws || n !== ws.length - 1) {
- header += '+'; // keep
-
- if (onChompKeep) onChompKeep();
- }
-
- wsEnd = ws.replace(/\n$/, '');
- return '';
- }).replace(/^[\n ]*/, function (ws) {
- if (ws.indexOf(' ') !== -1) header += indentSize;
- var m = ws.match(/ +$/);
-
- if (m) {
- wsStart = ws.slice(0, -m[0].length);
- return m[0];
- } else {
- wsStart = ws;
- return '';
- }
- });
- if (wsEnd) wsEnd = wsEnd.replace(/\n+(?!\n|$)/g, "$&".concat(indent));
- if (wsStart) wsStart = wsStart.replace(/\n+/g, "$&".concat(indent));
-
- if (comment) {
- header += ' #' + comment.replace(/ ?[\r\n]+/g, ' ');
- if (onComment) onComment();
- }
-
- if (!value) return "".concat(header).concat(indentSize, "\n").concat(indent).concat(wsEnd);
-
- if (literal) {
- value = value.replace(/\n+/g, "$&".concat(indent));
- return "".concat(header, "\n").concat(indent).concat(wsStart).concat(value).concat(wsEnd);
- }
-
- value = value.replace(/\n+/g, '\n$&').replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g, '$1$2') // more-indented lines aren't folded
- // ^ ind.line ^ empty ^ capture next empty lines only at end of indent
- .replace(/\n+/g, "$&".concat(indent));
- var body = (0, _foldFlowLines.default)("".concat(wsStart).concat(value).concat(wsEnd), indent, _foldFlowLines.FOLD_BLOCK, _options.strOptions.fold);
- return "".concat(header, "\n").concat(indent).concat(body);
- }
-
- function plainString(item, ctx, onComment, onChompKeep) {
- var comment = item.comment,
- type = item.type,
- value = item.value;
- var actualString = ctx.actualString,
- implicitKey = ctx.implicitKey,
- indent = ctx.indent,
- inFlow = ctx.inFlow,
- tags = ctx.tags;
-
- if (implicitKey && /[\n[\]{},]/.test(value) || inFlow && /[[\]{},]/.test(value)) {
- return doubleQuotedString(value, ctx);
- }
-
- if (!value || /^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(value)) {
- // not allowed:
- // - empty string, '-' or '?'
- // - start with an indicator character (except [?:-]) or /[?-] /
- // - '\n ', ': ' or ' \n' anywhere
- // - '#' not preceded by a non-space char
- // - end with ' ' or ':'
- return implicitKey || inFlow || value.indexOf('\n') === -1 ? value.indexOf('"') !== -1 && value.indexOf("'") === -1 ? singleQuotedString(value, ctx) : doubleQuotedString(value, ctx) : blockString(item, ctx, onComment, onChompKeep);
- }
-
- if (!implicitKey && !inFlow && type !== _constants.Type.PLAIN && value.indexOf('\n') !== -1) {
- // Where allowed & type not set explicitly, prefer block style for multiline strings
- return blockString(item, ctx, onComment, onChompKeep);
- }
-
- var str = value.replace(/\n+/g, "$&\n".concat(indent)); // Verify that output will be parsed as a string, as e.g. plain numbers and
- // booleans get parsed with those types in v1.2 (e.g. '42', 'true' & '0.9e-3'),
- // and others in v1.1.
-
- if (actualString && typeof tags.resolveScalar(str).value !== 'string') {
- return doubleQuotedString(value, ctx);
- }
-
- var body = implicitKey ? str : (0, _foldFlowLines.default)(str, indent, _foldFlowLines.FOLD_FLOW, _options.strOptions.fold);
-
- if (comment && !inFlow && (body.indexOf('\n') !== -1 || comment.indexOf('\n') !== -1)) {
- if (onComment) onComment();
- return (0, _addComment.addCommentBefore)(body, indent, comment);
- }
-
- return body;
- }
-
- function stringifyString(item, ctx, onComment, onChompKeep) {
- var defaultType = _options.strOptions.defaultType;
- var implicitKey = ctx.implicitKey,
- inFlow = ctx.inFlow;
- var _item = item,
- type = _item.type,
- value = _item.value;
-
- if (typeof value !== 'string') {
- value = String(value);
- item = Object.assign({}, item, {
- value: value
- });
- }
-
- var _stringify = function _stringify(_type) {
- switch (_type) {
- case _constants.Type.BLOCK_FOLDED:
- case _constants.Type.BLOCK_LITERAL:
- return blockString(item, ctx, onComment, onChompKeep);
-
- case _constants.Type.QUOTE_DOUBLE:
- return doubleQuotedString(value, ctx);
-
- case _constants.Type.QUOTE_SINGLE:
- return singleQuotedString(value, ctx);
-
- case _constants.Type.PLAIN:
- return plainString(item, ctx, onComment, onChompKeep);
-
- default:
- return null;
- }
- };
-
- if (type !== _constants.Type.QUOTE_DOUBLE && /[\x00-\x08\x0b-\x1f\x7f-\x9f]/.test(value)) {
- // force double quotes on control characters
- type = _constants.Type.QUOTE_DOUBLE;
- } else if ((implicitKey || inFlow) && (type === _constants.Type.BLOCK_FOLDED || type === _constants.Type.BLOCK_LITERAL)) {
- // should not happen; blocks are not valid inside flow containers
- type = _constants.Type.QUOTE_DOUBLE;
- }
-
- var res = _stringify(type);
-
- if (res === null) {
- res = _stringify(defaultType);
- if (res === null) throw new Error("Unsupported default string type ".concat(defaultType));
- }
-
- return res;
- }
|