| "use strict"; |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.dedentBlockStringValue = dedentBlockStringValue; |
| exports.getBlockStringIndentation = getBlockStringIndentation; |
| exports.printBlockString = printBlockString; |
| |
| /** |
| * Produces the value of a block string from its parsed raw value, similar to |
| * CoffeeScript's block string, Python's docstring trim or Ruby's strip_heredoc. |
| * |
| * This implements the GraphQL spec's BlockStringValue() static algorithm. |
| * |
| * @internal |
| */ |
| function dedentBlockStringValue(rawString) { |
| // Expand a block string's raw value into independent lines. |
| var lines = rawString.split(/\r\n|[\n\r]/g); // Remove common indentation from all lines but first. |
| |
| var commonIndent = getBlockStringIndentation(lines); |
| |
| if (commonIndent !== 0) { |
| for (var i = 1; i < lines.length; i++) { |
| lines[i] = lines[i].slice(commonIndent); |
| } |
| } // Remove leading and trailing blank lines. |
| |
| |
| while (lines.length > 0 && isBlank(lines[0])) { |
| lines.shift(); |
| } |
| |
| while (lines.length > 0 && isBlank(lines[lines.length - 1])) { |
| lines.pop(); |
| } // Return a string of the lines joined with U+000A. |
| |
| |
| return lines.join('\n'); |
| } |
| /** |
| * @internal |
| */ |
| |
| |
| function getBlockStringIndentation(lines) { |
| var commonIndent = null; |
| |
| for (var i = 1; i < lines.length; i++) { |
| var line = lines[i]; |
| var indent = leadingWhitespace(line); |
| |
| if (indent === line.length) { |
| continue; // skip empty lines |
| } |
| |
| if (commonIndent === null || indent < commonIndent) { |
| commonIndent = indent; |
| |
| if (commonIndent === 0) { |
| break; |
| } |
| } |
| } |
| |
| return commonIndent === null ? 0 : commonIndent; |
| } |
| |
| function leadingWhitespace(str) { |
| var i = 0; |
| |
| while (i < str.length && (str[i] === ' ' || str[i] === '\t')) { |
| i++; |
| } |
| |
| return i; |
| } |
| |
| function isBlank(str) { |
| return leadingWhitespace(str) === str.length; |
| } |
| /** |
| * Print a block string in the indented block form by adding a leading and |
| * trailing blank line. However, if a block string starts with whitespace and is |
| * a single-line, adding a leading blank line would strip that whitespace. |
| * |
| * @internal |
| */ |
| |
| |
| function printBlockString(value) { |
| var indentation = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; |
| var preferMultipleLines = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; |
| var isSingleLine = value.indexOf('\n') === -1; |
| var hasLeadingSpace = value[0] === ' ' || value[0] === '\t'; |
| var hasTrailingQuote = value[value.length - 1] === '"'; |
| var printAsMultipleLines = !isSingleLine || hasTrailingQuote || preferMultipleLines; |
| var result = ''; // Format a multi-line block quote to account for leading space. |
| |
| if (printAsMultipleLines && !(isSingleLine && hasLeadingSpace)) { |
| result += '\n' + indentation; |
| } |
| |
| result += indentation ? value.replace(/\n/g, '\n' + indentation) : value; |
| |
| if (printAsMultipleLines) { |
| result += '\n'; |
| } |
| |
| return '"""' + result.replace(/"""/g, '\\"""') + '"""'; |
| } |