diff options
author | Minteck <contact@minteck.org> | 2022-06-04 08:51:01 +0200 |
---|---|---|
committer | Minteck <contact@minteck.org> | 2022-06-04 08:51:01 +0200 |
commit | 383285ecd5292bf9a825e05904955b937de84cc9 (patch) | |
tree | 0a53b6f02c1604b078044567c03dc1b6c944c8c2 /node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js | |
download | equestriadb-383285ecd5292bf9a825e05904955b937de84cc9.tar.gz equestriadb-383285ecd5292bf9a825e05904955b937de84cc9.tar.bz2 equestriadb-383285ecd5292bf9a825e05904955b937de84cc9.zip |
Initial commit
Diffstat (limited to 'node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js')
-rw-r--r-- | node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js b/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js new file mode 100644 index 0000000..b0558d7 --- /dev/null +++ b/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js @@ -0,0 +1,224 @@ +import { Scalar } from '../nodes/Scalar.js'; +import { resolveEnd } from './resolve-end.js'; + +function resolveFlowScalar(scalar, strict, onError) { + const { offset, type, source, end } = scalar; + let _type; + let value; + const _onError = (rel, code, msg) => onError(offset + rel, code, msg); + switch (type) { + case 'scalar': + _type = Scalar.PLAIN; + value = plainValue(source, _onError); + break; + case 'single-quoted-scalar': + _type = Scalar.QUOTE_SINGLE; + value = singleQuotedValue(source, _onError); + break; + case 'double-quoted-scalar': + _type = Scalar.QUOTE_DOUBLE; + value = doubleQuotedValue(source, _onError); + break; + /* istanbul ignore next should not happen */ + default: + onError(scalar, 'UNEXPECTED_TOKEN', `Expected a flow scalar value, but found: ${type}`); + return { + value: '', + type: null, + comment: '', + range: [offset, offset + source.length, offset + source.length] + }; + } + const valueEnd = offset + source.length; + const re = resolveEnd(end, valueEnd, strict, onError); + return { + value, + type: _type, + comment: re.comment, + range: [offset, valueEnd, re.offset] + }; +} +function plainValue(source, onError) { + let badChar = ''; + switch (source[0]) { + /* istanbul ignore next should not happen */ + case '\t': + badChar = 'a tab character'; + break; + case ',': + badChar = 'flow indicator character ,'; + break; + case '%': + badChar = 'directive indicator character %'; + break; + case '|': + case '>': { + badChar = `block scalar indicator ${source[0]}`; + break; + } + case '@': + case '`': { + badChar = `reserved character ${source[0]}`; + break; + } + } + if (badChar) + onError(0, 'BAD_SCALAR_START', `Plain value cannot start with ${badChar}`); + return foldLines(source); +} +function singleQuotedValue(source, onError) { + if (source[source.length - 1] !== "'" || source.length === 1) + onError(source.length, 'MISSING_CHAR', "Missing closing 'quote"); + return foldLines(source.slice(1, -1)).replace(/''/g, "'"); +} +function foldLines(source) { + var _a; + /** + * The negative lookbehind here and in the `re` RegExp is to + * prevent causing a polynomial search time in certain cases. + * + * The try-catch is for Safari, which doesn't support this yet: + * https://caniuse.com/js-regexp-lookbehind + */ + let first, line; + try { + first = new RegExp('(.*?)(?<![ \t])[ \t]*\r?\n', 'sy'); + line = new RegExp('[ \t]*(.*?)(?:(?<![ \t])[ \t]*)?\r?\n', 'sy'); + } + catch (_) { + first = /(.*?)[ \t]*\r?\n/sy; + line = /[ \t]*(.*?)[ \t]*\r?\n/sy; + } + let match = first.exec(source); + if (!match) + return source; + let res = match[1]; + let sep = ' '; + let pos = first.lastIndex; + line.lastIndex = pos; + while ((match = line.exec(source))) { + if (match[1] === '') { + if (sep === '\n') + res += sep; + else + sep = '\n'; + } + else { + res += sep + match[1]; + sep = ' '; + } + pos = line.lastIndex; + } + const last = /[ \t]*(.*)/sy; + last.lastIndex = pos; + match = last.exec(source); + return res + sep + ((_a = match === null || match === void 0 ? void 0 : match[1]) !== null && _a !== void 0 ? _a : ''); +} +function doubleQuotedValue(source, onError) { + let res = ''; + for (let i = 1; i < source.length - 1; ++i) { + const ch = source[i]; + if (ch === '\r' && source[i + 1] === '\n') + continue; + if (ch === '\n') { + const { fold, offset } = foldNewline(source, i); + res += fold; + i = offset; + } + else if (ch === '\\') { + let next = source[++i]; + const cc = escapeCodes[next]; + if (cc) + res += cc; + else if (next === '\n') { + // skip escaped newlines, but still trim the following line + next = source[i + 1]; + while (next === ' ' || next === '\t') + next = source[++i + 1]; + } + else if (next === '\r' && source[i + 1] === '\n') { + // skip escaped CRLF newlines, but still trim the following line + next = source[++i + 1]; + while (next === ' ' || next === '\t') + next = source[++i + 1]; + } + else if (next === 'x' || next === 'u' || next === 'U') { + const length = { x: 2, u: 4, U: 8 }[next]; + res += parseCharCode(source, i + 1, length, onError); + i += length; + } + else { + const raw = source.substr(i - 1, 2); + onError(i - 1, 'BAD_DQ_ESCAPE', `Invalid escape sequence ${raw}`); + res += raw; + } + } + else if (ch === ' ' || ch === '\t') { + // trim trailing whitespace + const wsStart = i; + let next = source[i + 1]; + while (next === ' ' || next === '\t') + next = source[++i + 1]; + if (next !== '\n' && !(next === '\r' && source[i + 2] === '\n')) + res += i > wsStart ? source.slice(wsStart, i + 1) : ch; + } + else { + res += ch; + } + } + if (source[source.length - 1] !== '"' || source.length === 1) + onError(source.length, 'MISSING_CHAR', 'Missing closing "quote'); + return res; +} +/** + * Fold a single newline into a space, multiple newlines to N - 1 newlines. + * Presumes `source[offset] === '\n'` + */ +function foldNewline(source, offset) { + let fold = ''; + let ch = source[offset + 1]; + while (ch === ' ' || ch === '\t' || ch === '\n' || ch === '\r') { + if (ch === '\r' && source[offset + 2] !== '\n') + break; + if (ch === '\n') + fold += '\n'; + offset += 1; + ch = source[offset + 1]; + } + if (!fold) + fold = ' '; + return { fold, offset }; +} +const escapeCodes = { + '0': '\0', + a: '\x07', + b: '\b', + e: '\x1b', + f: '\f', + n: '\n', + r: '\r', + t: '\t', + v: '\v', + N: '\u0085', + _: '\u00a0', + L: '\u2028', + P: '\u2029', + ' ': ' ', + '"': '"', + '/': '/', + '\\': '\\', + '\t': '\t' +}; +function parseCharCode(source, offset, length, onError) { + const cc = source.substr(offset, length); + const ok = cc.length === length && /^[0-9a-fA-F]+$/.test(cc); + const code = ok ? parseInt(cc, 16) : NaN; + if (isNaN(code)) { + const raw = source.substr(offset - 2, length + 2); + onError(offset - 2, 'BAD_DQ_ESCAPE', `Invalid escape sequence ${raw}`); + return raw; + } + return String.fromCodePoint(code); +} + +export { resolveFlowScalar }; |