forked from olcxjas-softworks/LarpixClient
192 lines
No EOL
5.2 KiB
JavaScript
192 lines
No EOL
5.2 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.generateStrings = exports.parseStrings = void 0;
|
|
function parseStrings(contents) {
|
|
return parse(contents);
|
|
}
|
|
exports.parseStrings = parseStrings;
|
|
var State;
|
|
(function (State) {
|
|
State["None"] = "none";
|
|
State["Comment"] = "comment";
|
|
State["Key"] = "key";
|
|
State["AfterKey"] = "afterkey";
|
|
State["Value"] = "value";
|
|
State["AfterValue"] = "aftervalue";
|
|
})(State || (State = {}));
|
|
function parse(contents) {
|
|
let state = State.None;
|
|
let comment = "";
|
|
let whitespace = "";
|
|
let key = "";
|
|
let value = "";
|
|
let entries = [];
|
|
let line = 1;
|
|
let col = 1;
|
|
let startLine = 0;
|
|
let endLine = 0;
|
|
let startCol = 0;
|
|
let endCol = 0;
|
|
function setState(s) {
|
|
state = s;
|
|
}
|
|
for (let i = 0; i < contents.length; i++) {
|
|
const c = contents[i];
|
|
if (isNewLine(c)) {
|
|
// Keep track of lines
|
|
whitespace += c;
|
|
++line;
|
|
col = 0;
|
|
}
|
|
else if (isStartComment(c, contents[i + 1])) {
|
|
// Comment start, step forward one character
|
|
++i;
|
|
// Commit any whitespace up to this point
|
|
commitEntry(entries, {
|
|
content: whitespace,
|
|
startLine, startCol, endLine, endCol
|
|
});
|
|
// Mark starting source location
|
|
startCol = col;
|
|
startLine = line;
|
|
// Clear state
|
|
comment = "";
|
|
whitespace = "";
|
|
setState(State.Comment);
|
|
}
|
|
else if (isEndComment(c, contents[i + 1])) {
|
|
// Comment end, step forward one character
|
|
++i;
|
|
// Commit the comment
|
|
endLine = line;
|
|
endCol = col;
|
|
commitEntry(entries, {
|
|
comment, startLine, startCol, endLine, endCol
|
|
});
|
|
comment = "";
|
|
whitespace = "";
|
|
setState(State.None);
|
|
}
|
|
else if (state === State.Comment) {
|
|
// Build the comment
|
|
comment += c;
|
|
}
|
|
else if (isEquals(c) && (state === State.AfterKey || state === State.AfterValue)) {
|
|
// Valid state, do nothing
|
|
}
|
|
else if (isQuote(c)) {
|
|
// Quote encountered, check state
|
|
if (state === State.None) {
|
|
endLine = line;
|
|
endCol = col;
|
|
commitEntry(entries, {
|
|
content: whitespace,
|
|
startLine, startCol, endLine, endCol
|
|
});
|
|
startLine = line;
|
|
startCol = col;
|
|
setState(State.Key);
|
|
key = "";
|
|
whitespace = "";
|
|
}
|
|
else if (state === State.Key) {
|
|
// Key ends
|
|
setState(State.AfterKey);
|
|
}
|
|
else if (state === State.AfterKey) {
|
|
// Start of value
|
|
setState(State.Value);
|
|
value = "";
|
|
}
|
|
else if (state === State.Value) {
|
|
// End of value, commit it
|
|
setState(State.AfterValue);
|
|
}
|
|
}
|
|
else if (isSemi(c) && (state === State.AfterValue)) {
|
|
endLine = line;
|
|
endCol = col;
|
|
commitEntry(entries, {
|
|
key, value, startLine, startCol, endLine, endCol
|
|
});
|
|
// Clear state
|
|
comment = "";
|
|
whitespace = "";
|
|
key = "";
|
|
value = "";
|
|
setState(State.None);
|
|
}
|
|
else if (state === State.Key) {
|
|
// Build the key
|
|
key += c;
|
|
}
|
|
else if (state === State.Value) {
|
|
// Build the value
|
|
value += c;
|
|
}
|
|
else if (isWhitespace(c)) {
|
|
// Valid to have whitespace before/after lines
|
|
whitespace += c;
|
|
}
|
|
else if (isSemi(c)) {
|
|
// Valid state?
|
|
}
|
|
else {
|
|
throw new Error(`Error parsing .strings file: unknown character at ${line}:${col}`);
|
|
}
|
|
++col;
|
|
}
|
|
return entries;
|
|
}
|
|
function commitEntry(entries, entry) {
|
|
entries.push(entry);
|
|
}
|
|
function isNewLine(c) {
|
|
return c === '\n';
|
|
}
|
|
function isStartComment(c, c2) {
|
|
return c === '/' && c2 === '*';
|
|
}
|
|
function isEndComment(c, c2) {
|
|
return c === '*' && c2 === '/';
|
|
}
|
|
function isQuote(c) {
|
|
return c === '"';
|
|
}
|
|
function isEquals(c) {
|
|
return c === '=';
|
|
}
|
|
function isWhitespace(c) {
|
|
return isSpace(c) || isTab(c);
|
|
}
|
|
function isSpace(c) {
|
|
return c === ' ';
|
|
}
|
|
function isTab(c) {
|
|
return c === '\t';
|
|
}
|
|
function isSemi(c) {
|
|
return c === ';';
|
|
}
|
|
function generateStrings(entries) {
|
|
const lines = [];
|
|
for (const entry of entries) {
|
|
lines.push(...generateLines(entry));
|
|
}
|
|
return lines.join('');
|
|
}
|
|
exports.generateStrings = generateStrings;
|
|
function generateLines(entry) {
|
|
const lines = [];
|
|
if (entry.comment) {
|
|
lines.push(`/*${entry.comment}*/`);
|
|
}
|
|
else if (entry.key) {
|
|
lines.push(`"${entry.key}" = "${entry.value}";`);
|
|
}
|
|
else if (entry.content) {
|
|
lines.push(entry.content);
|
|
}
|
|
return lines;
|
|
}
|
|
//# sourceMappingURL=strings.js.map
|