UNPKG

xcparse

Version:

pbxproj parser

131 lines 5.57 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MultipleLineComment = exports.Comment = exports.WhiteSpace = exports.StringLiteral = exports.QuotedString = exports.DataLiteral = exports.Colon = exports.Separator = exports.Terminator = exports.ArrayEnd = exports.ArrayStart = exports.ObjectEnd = exports.ObjectStart = void 0; const chevrotain_1 = require("./chevrotain"); const unicode_1 = require("../unicode"); exports.ObjectStart = (0, chevrotain_1.createToken)({ name: "OpenBracket", pattern: /{/ }); exports.ObjectEnd = (0, chevrotain_1.createToken)({ name: "CloseBracket", pattern: /}/ }); exports.ArrayStart = (0, chevrotain_1.createToken)({ name: "ArrayStart", pattern: /\(/ }); exports.ArrayEnd = (0, chevrotain_1.createToken)({ name: "ArrayEnd", pattern: /\)/ }); exports.Terminator = (0, chevrotain_1.createToken)({ name: "Terminator", pattern: /;/ }); exports.Separator = (0, chevrotain_1.createToken)({ name: "Separator", pattern: /,/ }); exports.Colon = (0, chevrotain_1.createToken)({ name: "Colon", pattern: /=/ }); function matchQuotedString(text, startOffset) { let quote = text.charAt(startOffset); if (quote !== `'` && quote !== `"`) { return null; } const reg = new RegExp(`${quote}(?:[^\\\\${quote}]|\\\\(?:[bfnrtv${quote}\\\\/]|u[0-9a-fA-F]{4}))*${quote}`, "y"); // using 'y' sticky flag (Note it is not supported on IE11...) // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/sticky reg.lastIndex = startOffset; // Note that just because we are using a custom token pattern // Does not mean we cannot implement it using JavaScript Regular Expressions... const execResult = reg.exec(text); if (execResult !== null) { const fullMatch = execResult[0]; // compute the payload // const matchWithOutQuotes = fullMatch.substring(1, fullMatch.length - 1); // const matchWithOutQuotes = JSON.stringify( // fullMatch.substring(1, fullMatch.length - 1) // ); const matchWithOutQuotes = (0, unicode_1.stripQuotes)(fullMatch.substring(1, fullMatch.length - 1)); // attach the payload // @ts-expect-error execResult.payload = matchWithOutQuotes; } return execResult; } const dataLiteralPattern = /<[0-9a-fA-F\s]+>/y; function matchData(text, startOffset) { if (text.charAt(startOffset) !== `<`) { return null; } // using 'y' sticky flag (Note it is not supported on IE11...) // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/sticky dataLiteralPattern.lastIndex = startOffset; // Note that just because we are using a custom token pattern // Does not mean we cannot implement it using JavaScript Regular Expressions... const execResult = dataLiteralPattern.exec(text); if (execResult !== null) { const fullMatch = execResult[0]; // compute the payload const matchWithOutQuotes = fullMatch .substring(1, fullMatch.length - 2) .trim(); // attach the payload // @ts-expect-error execResult.payload = Buffer.from(matchWithOutQuotes); // TODO: validate buffer (even number) } return execResult; } exports.DataLiteral = (0, chevrotain_1.createToken)({ name: "DataLiteral", pattern: { exec: matchData }, line_breaks: false, start_chars_hint: [`<`], }); exports.QuotedString = (0, chevrotain_1.createToken)({ name: "QuotedString", pattern: { exec: matchQuotedString }, line_breaks: false, // Optional property that will enable optimizations in the lexer // See: https://chevrotain.io/documentation/10_1_2/interfaces/itokenconfig.html#start_chars_hint start_chars_hint: [`"`, `'`], }); exports.StringLiteral = (0, chevrotain_1.createToken)({ name: "StringLiteral", pattern: /[\w_$/:.-]+/, line_breaks: false, }); exports.WhiteSpace = (0, chevrotain_1.createToken)({ name: "WhiteSpace", pattern: /[ \t\n\r]+/u, // pattern: /[ \t\n\r\x0A\x0D\u{2028}\u{2029}\x09\x0B\x0C\x20]+/u, group: chevrotain_1.Lexer.SKIPPED, }); const AbsComment = (0, chevrotain_1.createToken)({ name: "AbsComment", pattern: chevrotain_1.Lexer.NA }); exports.Comment = (0, chevrotain_1.createToken)({ name: "Comment", pattern: /\/\/.*/, categories: AbsComment, group: chevrotain_1.Lexer.SKIPPED, }); exports.MultipleLineComment = (0, chevrotain_1.createToken)({ name: "MultipleLineComment", pattern: /\/\*[^*]*\*+([^/*][^*]*\*+)*\//, categories: AbsComment, // note that comments could span multiple lines. // forgetting to enable this flag will cause inaccuracies in the lexer location tracking. line_breaks: true, group: chevrotain_1.Lexer.SKIPPED, }); // Labels only affect error messages and Diagrams. exports.ObjectStart.LABEL = "'{'"; exports.ObjectEnd.LABEL = "'}'"; exports.ArrayStart.LABEL = "'('"; exports.ArrayEnd.LABEL = "')'"; exports.Terminator.LABEL = "';'"; exports.Colon.LABEL = "'='"; exports.Separator.LABEL = "','"; exports.default = [ // the order is important !!!! exports.WhiteSpace, // Comments exports.Comment, exports.MultipleLineComment, // etc.. exports.ObjectStart, exports.ObjectEnd, exports.ArrayStart, exports.ArrayEnd, exports.Terminator, exports.Separator, exports.Colon, // Data Types exports.DataLiteral, exports.QuotedString, exports.StringLiteral, ]; //# sourceMappingURL=identifiers.js.map