mirror of
https://github.com/AndorsTrailRelease/andors-trail.git
synced 2026-01-06 11:34:57 +01:00
206 lines
5.6 KiB
JavaScript
206 lines
5.6 KiB
JavaScript
|
|
var ATEditor = (function(ATEditor) {
|
|
var FieldList_Header_fieldName = '[^\\[\\]\\|]*';
|
|
var FieldList_Header_arrayField = FieldList_Header_fieldName + '\\[(' + FieldList_Header_fieldName + '\\|)*\\]';
|
|
var FieldList_Header_arrayFieldName = new RegExp(FieldList_Header_fieldName);
|
|
var FieldList_Header_field = '(' + FieldList_Header_fieldName + '|' + FieldList_Header_arrayField + ')\\|';
|
|
var FieldList_Header_pattern = new RegExp(FieldList_Header_field, 'g');
|
|
var FieldList_Header_line = "^(\\[(" + FieldList_Header_field + ")*\\];)$";
|
|
var FieldList_Header_linePattern = new RegExp(FieldList_Header_line, 'm');
|
|
|
|
function FieldList(header, name) {
|
|
this._name = name ? name : "";
|
|
this._fields = [];
|
|
|
|
var match = header.match(FieldList_Header_pattern);
|
|
if (!match) return;
|
|
|
|
for (var i = 0; i < match.length; ++i) {
|
|
var s = match[i].match(FieldList_Header_field)[1]; // Strip trailing pipe
|
|
|
|
var f = s;
|
|
if (s.match(FieldList_Header_arrayField)) {
|
|
var name = s.match(FieldList_Header_arrayFieldName)[0];
|
|
f = new FieldList(s, name);
|
|
}
|
|
this._fields[i] = f;
|
|
}
|
|
|
|
this.getFieldName = function(i) {
|
|
var f = this._fields[i];
|
|
if (f instanceof FieldList) {
|
|
return f._name;
|
|
} else {
|
|
return f;
|
|
}
|
|
}
|
|
|
|
this.getHeader = function() {
|
|
var result = this._name + "[";
|
|
for(var i = 0; i < this._fields.length; ++i) {
|
|
var f = this._fields[i];
|
|
if (f instanceof FieldList) {
|
|
result += f.getHeader();
|
|
} else {
|
|
result += f;
|
|
}
|
|
result += "|";
|
|
}
|
|
result += "]";
|
|
return result;
|
|
}
|
|
|
|
this.getHeaderLine = function() {
|
|
return this.getHeader() + ";";
|
|
}
|
|
};
|
|
|
|
function findHeader(str) {
|
|
var match = str.match(FieldList_Header_linePattern);
|
|
if (!match) return;
|
|
return new FieldList(match[0]);
|
|
}
|
|
|
|
|
|
|
|
var DataStore_Data_fieldValue = '[^\\{\\}\\|]*';
|
|
var DataStore_Data_arrayObject = '\\{(' + DataStore_Data_fieldValue + '\\|)*\\}\\s*';
|
|
var DataStore_Data_arrayObjectPattern = new RegExp(DataStore_Data_arrayObject, 'g');
|
|
var DataStore_Data_arrayField = '\\{\\s*(' + DataStore_Data_arrayObject + ')*\\s*\\}';
|
|
var DataStore_Data_field = '(' + DataStore_Data_fieldValue + '|' + DataStore_Data_arrayField + ')\\|';
|
|
var DataStore_Data_pattern = new RegExp(DataStore_Data_field, 'gm');
|
|
var DataStore_Data_line = "^(\\{(" + DataStore_Data_field + ")*\\};)$";
|
|
var DataStore_Data_linePattern = new RegExp(DataStore_Data_line, 'gm');
|
|
|
|
var showErrorMessages = true;
|
|
|
|
var specialEncodings = [
|
|
{
|
|
decoded: "'", decoded_Regex: /'/gm,
|
|
encoded: "\\'", encoded_Regex: /\\'/gm
|
|
},
|
|
{
|
|
decoded: "\n", decoded_Regex: /\n/gm,
|
|
encoded: "\\n", encoded_Regex: /\\n/gm
|
|
}
|
|
];
|
|
|
|
var deserialize = function(str) {
|
|
var header = findHeader(str);
|
|
if (!header) {
|
|
return;
|
|
}
|
|
return {
|
|
header: header
|
|
,items: deserializeObjectList(header, str)
|
|
};
|
|
}
|
|
var serialize = function(dataStore) {
|
|
return serializeObjectList(dataStore.fieldList, dataStore.items);
|
|
}
|
|
|
|
|
|
function deserializeObject(fieldList, data) {
|
|
var match = data.match(DataStore_Data_pattern);
|
|
if (!match) return;
|
|
|
|
if (match.length != fieldList._fields.length) {
|
|
if (showErrorMessages) {
|
|
alert("Error parsing data object. Expected " + fieldList._fields.length + " fields, but found " + match.length + " fields.\ndata = \"" + data + "\"");
|
|
showErrorMessages = false;
|
|
}
|
|
return;
|
|
}
|
|
|
|
var obj = {};
|
|
for (var i = 0; i < fieldList._fields.length; ++i) {
|
|
var s = match[i].match(DataStore_Data_field)[1]; // Strip trailing pipe
|
|
|
|
var f = fieldList._fields[i];
|
|
var v = s;
|
|
var fieldName = fieldList.getFieldName(i);
|
|
if (f instanceof FieldList) {
|
|
fieldName = f._name;
|
|
v = [];
|
|
var objects = s.match(DataStore_Data_arrayObjectPattern);
|
|
if (objects) {
|
|
for (var j = 0; j < objects.length; ++j) {
|
|
v[j] = deserializeObject(f, objects[j]);
|
|
}
|
|
}
|
|
} else {
|
|
for(var j = 0; j < specialEncodings.length; ++j) {
|
|
var e = specialEncodings[j];
|
|
v = v.replace(e.encoded_Regex, e.decoded);
|
|
}
|
|
}
|
|
obj[fieldName] = v;
|
|
}
|
|
return obj;
|
|
}
|
|
|
|
function deserializeObjectList(fieldList, data) {
|
|
var result = [];
|
|
if(!data) return result;
|
|
var match = data.match(DataStore_Data_linePattern);
|
|
if(!match) return result;
|
|
for(var i = 0; i < match.length; ++i) {
|
|
result[i] = deserializeObject(fieldList, match[i]);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
function serializeObject(fieldList, obj) {
|
|
if (!obj) return "";
|
|
var result = "{";
|
|
|
|
for(var i = 0; i < fieldList._fields.length; ++i) {
|
|
var fieldName = fieldList.getFieldName(i);
|
|
var f = fieldList._fields[i];
|
|
var v = obj[fieldName];
|
|
if (f instanceof FieldList) {
|
|
if (v && v.length > 0) {
|
|
result += "{";
|
|
if (v.length > 1) { result += "\n"; }
|
|
for(var j = 0; j < v.length; ++j) {
|
|
if (v.length > 1) { result += "\t"; }
|
|
result += serializeObject(f, v[j]);
|
|
if (v.length > 1) { result += "\n"; }
|
|
}
|
|
if (v.length > 1) { result += "\t"; }
|
|
result += "}";
|
|
}
|
|
} else if (v != undefined) {
|
|
v = "" + v;
|
|
for(var j = 0; j < specialEncodings.length; ++j) {
|
|
var e = specialEncodings[j];
|
|
v = v.replace(e.decoded_Regex, e.encoded);
|
|
}
|
|
result += v;
|
|
}
|
|
result += "|";
|
|
}
|
|
result += "}";
|
|
return result;
|
|
}
|
|
|
|
function serializeObjectList(fieldList, obj) {
|
|
var result = fieldList.getHeader() + ";\n";
|
|
if(!obj) return result;
|
|
|
|
for(var i = 0; i < obj.length; ++i) {
|
|
result += serializeObject(fieldList, obj[i]) + ";\n";
|
|
}
|
|
return result;
|
|
}
|
|
|
|
ATEditor.FieldList = FieldList;
|
|
|
|
ATEditor.legacy = ATEditor.legacy || {};
|
|
ATEditor.legacy.deserialize = deserialize;
|
|
ATEditor.legacy.serialize = serialize;
|
|
ATEditor.legacy.findHeader = findHeader;
|
|
|
|
return ATEditor;
|
|
})(ATEditor || {});
|