123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- import inspect from '../jsutils/inspect';
- import { Source } from '../language/source';
- import { TokenKind } from '../language/tokenKind';
- import { createLexer, isPunctuatorToken } from '../language/lexer';
- import {
- dedentBlockStringValue,
- getBlockStringIndentation,
- } from '../language/blockString';
- export function stripIgnoredCharacters(source: string | Source): string {
- const sourceObj = typeof source === 'string' ? new Source(source) : source;
- if (!(sourceObj instanceof Source)) {
- throw new TypeError(
- `Must provide string or Source. Received: ${inspect(sourceObj)}`,
- );
- }
- const body = sourceObj.body;
- const lexer = createLexer(sourceObj);
- let strippedBody = '';
- let wasLastAddedTokenNonPunctuator = false;
- while (lexer.advance().kind !== TokenKind.EOF) {
- const currentToken = lexer.token;
- const tokenKind = currentToken.kind;
-
- const isNonPunctuator = !isPunctuatorToken(currentToken);
- if (wasLastAddedTokenNonPunctuator) {
- if (isNonPunctuator || currentToken.kind === TokenKind.SPREAD) {
- strippedBody += ' ';
- }
- }
- const tokenBody = body.slice(currentToken.start, currentToken.end);
- if (tokenKind === TokenKind.BLOCK_STRING) {
- strippedBody += dedentBlockString(tokenBody);
- } else {
- strippedBody += tokenBody;
- }
- wasLastAddedTokenNonPunctuator = isNonPunctuator;
- }
- return strippedBody;
- }
- function dedentBlockString(blockStr) {
-
- const rawStr = blockStr.slice(3, -3);
- let body = dedentBlockStringValue(rawStr);
- const lines = body.split(/\r\n|[\n\r]/g);
- if (getBlockStringIndentation(lines) > 0) {
- body = '\n' + body;
- }
- const lastChar = body[body.length - 1];
- const hasTrailingQuote = lastChar === '"' && body.slice(-4) !== '\\"""';
- if (hasTrailingQuote || lastChar === '\\') {
- body += '\n';
- }
- return '"""' + body + '"""';
- }
|