fume-fhir-converter
Version:
FHIR-Utilized Mapping Engine - Community
91 lines (83 loc) • 2.81 kB
text/typescript
/**
* © Copyright Outburn Ltd. 2022-2024 All Rights Reserved
* Project name: FUME-COMMUNITY
*/
import thrower from '../thrower';
const isUrlPart = (charIndex: number, expr: string): boolean => {
// the minimum index for a url's // part is after the 'http(s):' part
// so undex lower than 7 means it's a comment and not a url
if (charIndex < 7) return false;
const prevSevenChars: string = expr.substring(charIndex - 7, charIndex);
const prevSixChars: string = prevSevenChars.substring(1);
if (
['https:', '[https:'].includes(prevSevenChars.trimStart()) || ['http:', '[http:'].includes(prevSixChars.trimStart())
) {
return true;
} else {
return false;
}
};
export const removeComments = (expr: string): string => {
const exprLen: number = expr.length;
if (exprLen === 0) return expr;
let accExpr: string = '';
let currentChar: string = '';
let nextChar: string = '';
let prevChar: string = '';
let prevPrevChar: string = '';
let openedQuote: string = '';
let openedComment: string = '';
for (let i = 0; i < exprLen; i++) {
currentChar = expr.charAt(i);
nextChar = i < (exprLen - 1) ? expr.charAt(i + 1) : '';
prevChar = i > 0 ? expr.charAt(i - 1) : '';
prevPrevChar = i > 1 ? expr.charAt(i - 2) : '';
if (openedComment !== '') {
// inside a comment
const twoChars: string = prevChar + currentChar;
if (openedComment === '//' && (currentChar === '\r' || currentChar === '\n')) {
// this is the end of the // comment
openedComment = '';
accExpr += '\n';
} else {
if (openedComment === '/*') {
if (twoChars === '*/' && prevPrevChar !== '/') {
// this is the end of the /* comment
openedComment = '';
} else {
if (i === exprLen - 1) {
// end of expression
const msg: string = 'Comment has no closing tag';
thrower.throwParseError(msg);
}
}
}
};
continue;
};
// not inside a comment
if ((currentChar === '"' || currentChar === '\'') && prevChar !== '\\') {
// quote sign, unescaped
if (openedQuote === '') {
// it's an opening quote
openedQuote = currentChar;
} else {
// it's a closing quote
if (openedQuote === currentChar) {
openedQuote = '';
}
}
} else {
// not a quote sign
const twoChars: string = currentChar + nextChar;
const notUrl: boolean = !isUrlPart(i, expr);
if (openedQuote === '' && (twoChars === '/*' || (twoChars === '//' && notUrl))) {
// opening comment, not inside quotes
openedComment = twoChars;
continue;
}
}
accExpr += currentChar;
};
return accExpr;
};