@cucumber/gherkin
Version:
Gherkin parser
85 lines • 9.55 kB
JavaScript
import countSymbols from './countSymbols.js';
export default class GherkinLine {
lineText;
lineNumber;
trimmedLineText;
isEmpty;
indent;
column;
text;
constructor(lineText, lineNumber) {
this.lineText = lineText;
this.lineNumber = lineNumber;
this.trimmedLineText = lineText.replace(/^\s+/g, ''); // ltrim
this.isEmpty = this.trimmedLineText.length === 0;
this.indent = countSymbols(lineText) - countSymbols(this.trimmedLineText);
}
startsWith(prefix) {
return this.trimmedLineText.indexOf(prefix) === 0;
}
startsWithTitleKeyword(keyword) {
return this.startsWith(`${keyword}:`); // The C# impl is more complicated. Find out why.
}
match(regexp) {
return this.trimmedLineText.match(regexp);
}
getLineText(indentToRemove) {
if (indentToRemove < 0 || indentToRemove > this.indent) {
return this.trimmedLineText;
}
else {
return this.lineText.substring(indentToRemove);
}
}
getRestTrimmed(length) {
return this.trimmedLineText.substring(length).trim();
}
getTableCells() {
const cells = [];
let col = 0;
let startCol = col + 1;
let cell = '';
let firstCell = true;
while (col < this.trimmedLineText.length) {
let chr = this.trimmedLineText[col];
col++;
if (chr === '|') {
if (firstCell) {
// First cell (content before the first |) is skipped
firstCell = false;
}
else {
// Keeps newlines
const trimmedLeft = cell.replace(/^[ \t\v\f\r\u0085\u00A0]*/g, '');
const trimmed = trimmedLeft.replace(/[ \t\v\f\r\u0085\u00A0]*$/g, '');
const cellIndent = cell.length - trimmedLeft.length;
const span = {
column: this.indent + startCol + cellIndent,
text: trimmed,
};
cells.push(span);
}
cell = '';
startCol = col + 1;
}
else if (chr === '\\') {
chr = this.trimmedLineText[col];
col += 1;
if (chr === 'n') {
cell += '\n';
}
else {
if (chr !== '|' && chr !== '\\') {
cell += '\\';
}
cell += chr;
}
}
else {
cell += chr;
}
}
return cells;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2hlcmtpbkxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvR2hlcmtpbkxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxZQUFZLE1BQU0sbUJBQW1CLENBQUE7QUFHNUMsTUFBTSxDQUFDLE9BQU8sT0FBTyxXQUFXO0lBUVosUUFBUTtJQUNSLFVBQVU7SUFSckIsZUFBZSxDQUFRO0lBQ3ZCLE9BQU8sQ0FBUztJQUNQLE1BQU0sQ0FBUTtJQUN2QixNQUFNLENBQVE7SUFDZCxJQUFJLENBQVE7SUFFbkIsWUFDa0IsUUFBZ0IsRUFDaEIsVUFBa0I7d0JBRGxCLFFBQVE7MEJBQ1IsVUFBVTtRQUUxQixJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFBLENBQUMsUUFBUTtRQUM3RCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQTtRQUNoRCxJQUFJLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQzNFLENBQUM7SUFFTSxVQUFVLENBQUMsTUFBYztRQUM5QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNuRCxDQUFDO0lBRU0sc0JBQXNCLENBQUMsT0FBZTtRQUMzQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFBLENBQUMsaURBQWlEO0lBQ3pGLENBQUM7SUFFTSxLQUFLLENBQUMsTUFBYztRQUN6QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzNDLENBQUM7SUFFTSxXQUFXLENBQUMsY0FBc0I7UUFDdkMsSUFBSSxjQUFjLEdBQUcsQ0FBQyxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdkQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFBO1FBQzdCLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUNoRCxDQUFDO0lBQ0gsQ0FBQztJQUVNLGNBQWMsQ0FBQyxNQUFjO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDdEQsQ0FBQztJQUVNLGFBQWE7UUFDbEIsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFBO1FBQ2hCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQTtRQUNYLElBQUksUUFBUSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUE7UUFDdEIsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBQ2IsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFBO1FBQ3BCLE9BQU8sR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDekMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNuQyxHQUFHLEVBQUUsQ0FBQTtZQUVMLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNoQixJQUFJLFNBQVMsRUFBRSxDQUFDO29CQUNkLHFEQUFxRDtvQkFDckQsU0FBUyxHQUFHLEtBQUssQ0FBQTtnQkFDbkIsQ0FBQztxQkFBTSxDQUFDO29CQUNOLGlCQUFpQjtvQkFDakIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsRUFBRSxFQUFFLENBQUMsQ0FBQTtvQkFDbEUsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsRUFBRSxFQUFFLENBQUMsQ0FBQTtvQkFDckUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFBO29CQUNuRCxNQUFNLElBQUksR0FBRzt3QkFDWCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLEdBQUcsVUFBVTt3QkFDM0MsSUFBSSxFQUFFLE9BQU87cUJBQ2QsQ0FBQTtvQkFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUNsQixDQUFDO2dCQUNELElBQUksR0FBRyxFQUFFLENBQUE7Z0JBQ1QsUUFBUSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUE7WUFDcEIsQ0FBQztpQkFBTSxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDeEIsR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQy9CLEdBQUcsSUFBSSxDQUFDLENBQUE7Z0JBQ1IsSUFBSSxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7b0JBQ2hCLElBQUksSUFBSSxJQUFJLENBQUE7Z0JBQ2QsQ0FBQztxQkFBTSxDQUFDO29CQUNOLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7d0JBQ2hDLElBQUksSUFBSSxJQUFJLENBQUE7b0JBQ2QsQ0FBQztvQkFDRCxJQUFJLElBQUksR0FBRyxDQUFBO2dCQUNiLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxJQUFJLEdBQUcsQ0FBQTtZQUNiLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY291bnRTeW1ib2xzIGZyb20gJy4vY291bnRTeW1ib2xzLmpzJ1xuaW1wb3J0IHR5cGUgeyBJR2hlcmtpbkxpbmUsIEl0ZW0gfSBmcm9tICcuL0lUb2tlbi5qcydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2hlcmtpbkxpbmUgaW1wbGVtZW50cyBJR2hlcmtpbkxpbmUge1xuICBwdWJsaWMgdHJpbW1lZExpbmVUZXh0OiBzdHJpbmdcbiAgcHVibGljIGlzRW1wdHk6IGJvb2xlYW5cbiAgcHVibGljIHJlYWRvbmx5IGluZGVudDogbnVtYmVyXG4gIHB1YmxpYyBjb2x1bW46IG51bWJlclxuICBwdWJsaWMgdGV4dDogc3RyaW5nXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGxpbmVUZXh0OiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGxpbmVOdW1iZXI6IG51bWJlclxuICApIHtcbiAgICB0aGlzLnRyaW1tZWRMaW5lVGV4dCA9IGxpbmVUZXh0LnJlcGxhY2UoL15cXHMrL2csICcnKSAvLyBsdHJpbVxuICAgIHRoaXMuaXNFbXB0eSA9IHRoaXMudHJpbW1lZExpbmVUZXh0Lmxlbmd0aCA9PT0gMFxuICAgIHRoaXMuaW5kZW50ID0gY291bnRTeW1ib2xzKGxpbmVUZXh0KSAtIGNvdW50U3ltYm9scyh0aGlzLnRyaW1tZWRMaW5lVGV4dClcbiAgfVxuXG4gIHB1YmxpYyBzdGFydHNXaXRoKHByZWZpeDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMudHJpbW1lZExpbmVUZXh0LmluZGV4T2YocHJlZml4KSA9PT0gMFxuICB9XG5cbiAgcHVibGljIHN0YXJ0c1dpdGhUaXRsZUtleXdvcmQoa2V5d29yZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRzV2l0aChgJHtrZXl3b3JkfTpgKSAvLyBUaGUgQyMgaW1wbCBpcyBtb3JlIGNvbXBsaWNhdGVkLiBGaW5kIG91dCB3aHkuXG4gIH1cblxuICBwdWJsaWMgbWF0Y2gocmVnZXhwOiBSZWdFeHApIHtcbiAgICByZXR1cm4gdGhpcy50cmltbWVkTGluZVRleHQubWF0Y2gocmVnZXhwKVxuICB9XG5cbiAgcHVibGljIGdldExpbmVUZXh0KGluZGVudFRvUmVtb3ZlOiBudW1iZXIpIHtcbiAgICBpZiAoaW5kZW50VG9SZW1vdmUgPCAwIHx8IGluZGVudFRvUmVtb3ZlID4gdGhpcy5pbmRlbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyaW1tZWRMaW5lVGV4dFxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5saW5lVGV4dC5zdWJzdHJpbmcoaW5kZW50VG9SZW1vdmUpXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFJlc3RUcmltbWVkKGxlbmd0aDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMudHJpbW1lZExpbmVUZXh0LnN1YnN0cmluZyhsZW5ndGgpLnRyaW0oKVxuICB9XG5cbiAgcHVibGljIGdldFRhYmxlQ2VsbHMoKTogcmVhZG9ubHkgSXRlbVtdIHtcbiAgICBjb25zdCBjZWxscyA9IFtdXG4gICAgbGV0IGNvbCA9IDBcbiAgICBsZXQgc3RhcnRDb2wgPSBjb2wgKyAxXG4gICAgbGV0IGNlbGwgPSAnJ1xuICAgIGxldCBmaXJzdENlbGwgPSB0cnVlXG4gICAgd2hpbGUgKGNvbCA8IHRoaXMudHJpbW1lZExpbmVUZXh0Lmxlbmd0aCkge1xuICAgICAgbGV0IGNociA9IHRoaXMudHJpbW1lZExpbmVUZXh0W2NvbF1cbiAgICAgIGNvbCsrXG5cbiAgICAgIGlmIChjaHIgPT09ICd8Jykge1xuICAgICAgICBpZiAoZmlyc3RDZWxsKSB7XG4gICAgICAgICAgLy8gRmlyc3QgY2VsbCAoY29udGVudCBiZWZvcmUgdGhlIGZpcnN0IHwpIGlzIHNraXBwZWRcbiAgICAgICAgICBmaXJzdENlbGwgPSBmYWxzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEtlZXBzIG5ld2xpbmVzXG4gICAgICAgICAgY29uc3QgdHJpbW1lZExlZnQgPSBjZWxsLnJlcGxhY2UoL15bIFxcdFxcdlxcZlxcclxcdTAwODVcXHUwMEEwXSovZywgJycpXG4gICAgICAgICAgY29uc3QgdHJpbW1lZCA9IHRyaW1tZWRMZWZ0LnJlcGxhY2UoL1sgXFx0XFx2XFxmXFxyXFx1MDA4NVxcdTAwQTBdKiQvZywgJycpXG4gICAgICAgICAgY29uc3QgY2VsbEluZGVudCA9IGNlbGwubGVuZ3RoIC0gdHJpbW1lZExlZnQubGVuZ3RoXG4gICAgICAgICAgY29uc3Qgc3BhbiA9IHtcbiAgICAgICAgICAgIGNvbHVtbjogdGhpcy5pbmRlbnQgKyBzdGFydENvbCArIGNlbGxJbmRlbnQsXG4gICAgICAgICAgICB0ZXh0OiB0cmltbWVkLFxuICAgICAgICAgIH1cbiAgICAgICAgICBjZWxscy5wdXNoKHNwYW4pXG4gICAgICAgIH1cbiAgICAgICAgY2VsbCA9ICcnXG4gICAgICAgIHN0YXJ0Q29sID0gY29sICsgMVxuICAgICAgfSBlbHNlIGlmIChjaHIgPT09ICdcXFxcJykge1xuICAgICAgICBjaHIgPSB0aGlzLnRyaW1tZWRMaW5lVGV4dFtjb2xdXG4gICAgICAgIGNvbCArPSAxXG4gICAgICAgIGlmIChjaHIgPT09ICduJykge1xuICAgICAgICAgIGNlbGwgKz0gJ1xcbidcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoY2hyICE9PSAnfCcgJiYgY2hyICE9PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIGNlbGwgKz0gJ1xcXFwnXG4gICAgICAgICAgfVxuICAgICAgICAgIGNlbGwgKz0gY2hyXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNlbGwgKz0gY2hyXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNlbGxzXG4gIH1cbn1cbiJdfQ==