389 lines
13 KiB
JavaScript
389 lines
13 KiB
JavaScript
function parseInput(wordArray, objects, i) {
|
|
let word = wordArray[i];
|
|
|
|
if (word.substring(0, 1) == "%") {
|
|
//check if regular use of % in text 20% an ignoreCase
|
|
if (word.substring(0, 2) !== "% ") {
|
|
//found simple input %word / excluding %m:
|
|
if (word.substring(2, 3) !== ":") {
|
|
//init Word Object
|
|
var wordObj = {};
|
|
|
|
|
|
let w = word.substring(1);
|
|
|
|
//bugfix if the title of an input has no space in it ex: %test=l:first word;l:second word;%1
|
|
let oneWordFlag = false;
|
|
if (word.substring(0, 1) == "%" && word.indexOf('=') != -1) {
|
|
oneWordFlag = true;
|
|
}
|
|
|
|
//for loop to escape spaces in simple input
|
|
for (let j = i+1; j < wordArray.length; j++) {
|
|
//if title has no space then go back one word to include "=" ex:
|
|
if (oneWordFlag) {
|
|
j = i;
|
|
oneWordFlag = false;
|
|
} else {
|
|
w = w + " " + wordArray[j];
|
|
}
|
|
//invoke look for gender specific template
|
|
i = findGenderSpecificInput(wordArray, wordObj, j);
|
|
//invoke look for list template
|
|
i = findListInput(wordArray, wordObj, j);
|
|
//invoke connected fields
|
|
i = findConnectedListInput(wordArray, wordObj, j);
|
|
//find end of template string and format it for future handling¨
|
|
if (w.indexOf("%") !== -1) {
|
|
//found % sign
|
|
if (w.indexOf("%") !== w.length - 1) {
|
|
//% is not last char of string
|
|
word = "%" + w;
|
|
} else {
|
|
//% is last
|
|
//no prio has been set
|
|
word = w.slice(0, -1);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (word.indexOf("\n") !== -1) {
|
|
if (word.substring(word.indexOf("\n"), 2).indexOf("%") !== -1) {
|
|
//alert("attention newlineChar in: "+ word.substring(word.indexOf("\n"),2));
|
|
}
|
|
}
|
|
//parse priority
|
|
if (word.substring(1).indexOf("%") === -1) {
|
|
//object if no prio was set
|
|
wordObj.word = word;
|
|
wordObj.arrayPos = objects.length;
|
|
wordObj.prio = 0;
|
|
} else {
|
|
//handle edgecase if punctuation mark is directly after prio
|
|
let postMarker = word.substring(1).indexOf("%") + 2;
|
|
let postMarkerEnd = word.length;
|
|
let isPriority = true;
|
|
let i = 0;
|
|
//console.log(word + " * " + word.substring(postMarkerEnd-2, postMarkerEnd) + " - " + postMarker + ":" + postMarkerEnd + " - " + word.length);
|
|
while (
|
|
!isCharNumber(word.substring(postMarkerEnd - 1, postMarkerEnd))
|
|
) {
|
|
postMarkerEnd = postMarkerEnd - 1;
|
|
//if no priority has been set; set flag
|
|
//console.log(word.substring(postMarkerEnd-1, postMarkerEnd));
|
|
|
|
if (postMarkerEnd < 1) {
|
|
isPriority = false;
|
|
break;
|
|
}
|
|
|
|
i++;
|
|
}
|
|
|
|
if (isPriority) {
|
|
//console.log(word + " prio: "+isPriority);
|
|
//object if prio has been defined
|
|
wordObj.word = word.substring(1, postMarker - 1);
|
|
wordObj.arrayPos = objects.length;
|
|
wordObj.prio = parseInt(
|
|
word.substring(postMarker, postMarkerEnd),
|
|
10
|
|
);
|
|
if (isNaN(wordObj.prio)) {
|
|
alert(
|
|
"error in template: %" +
|
|
wordObj.word +
|
|
"% there must always a space after the priority number"
|
|
);
|
|
wordObj.prio = 0;
|
|
}
|
|
} else {
|
|
//object if no prio has been defined
|
|
wordObj.word = word.substring(1, postMarker - 1);
|
|
wordObj.arrayPos = objects.length;
|
|
wordObj.prio = 0;
|
|
}
|
|
}
|
|
//check if genderSpecific or list has been found and if so reformat word
|
|
//console.log(wordObj);
|
|
switch (wordObj.type) {
|
|
case "genderSpecific":
|
|
if (word.substring(0, 1) === "%") {
|
|
wordObj.word = word.split("=")[0].substring(1);
|
|
} else {
|
|
wordObj.word = word.split("=")[0];
|
|
}
|
|
break;
|
|
case "list":
|
|
if (word.substring(0, 1) === "%") {
|
|
wordObj.word = word.split("=")[0].substring(1);
|
|
} else {
|
|
wordObj.word = word.split("=")[0];
|
|
}
|
|
break;
|
|
case "conList":
|
|
if (word.substring(0, 1) === "%") {
|
|
wordObj.word = word.split("=")[0].substring(1);
|
|
} else {
|
|
wordObj.word = word.split("=")[0];
|
|
}
|
|
//check if format has been given or markup
|
|
for (let i = 0; i <= wordObj.listCount; i++) {
|
|
let params = wordObj[i].split(":");
|
|
if (params[1] !== undefined) {
|
|
wordObj[i] = params[0];
|
|
wordObj["clType-"+wordObj[i]] = (params[2] !== undefined) ? params[1]+":"+params[2]: params[1];
|
|
} else {
|
|
wordObj["clType-"+wordObj[i]] = "cl-simpleInput";
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
wordObj.type = "simpleInput";
|
|
//check if customTemplate was used set type and format word
|
|
if (word.indexOf("=") !== -1) {
|
|
parseCustomTemplates(wordObj);
|
|
}
|
|
break;
|
|
}
|
|
|
|
objects.push(wordObj);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function findGenderSpecificInput(wordArray, wordObj, i) {
|
|
let word = wordArray[i];
|
|
if (word.indexOf("=m:") !== -1) {
|
|
wordObj.type = "genderSpecific";
|
|
let mw = word.substring(word.indexOf("=m:") + 3);
|
|
for (let j = i + 1; j < wordArray.length; j++) {
|
|
mw = mw + " " + wordArray[j];
|
|
i = j;
|
|
if (mw.indexOf(";") !== -1) {
|
|
wordObj.m = mw.slice(0, mw.indexOf(";"));
|
|
//adding length word + 3 = m: ;
|
|
i = parseGenderTemplate(wordArray, wordObj, i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (word.indexOf("=w:") !== -1) {
|
|
let ww = word.substring(word.indexOf("=w:") + 3);
|
|
for (let j = i + 1; j < wordArray.length; j++) {
|
|
ww = ww + " " + wordArray[j];
|
|
i = j;
|
|
if (ww.indexOf(";") !== -1) {
|
|
wordObj.w = ww.slice(0, ww.indexOf(";"));
|
|
i = parseGenderTemplate(wordArray, wordObj, i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (word.indexOf("=d:") !== -1) {
|
|
let dw = word.substring(word.indexOf("=d:") + 3);
|
|
for (let j = i + 1; j < wordArray.length; j++) {
|
|
dw = dw + " " + wordArray[j];
|
|
i = j;
|
|
if (dw.indexOf(";") !== -1) {
|
|
wordObj.d = dw.slice(0, dw.indexOf(";"));
|
|
i = parseGenderTemplate(wordArray, wordObj, i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return i;
|
|
}
|
|
|
|
function parseGenderTemplate(wordArray, wordObj, i) {
|
|
let word = wordArray[i];
|
|
if (word.indexOf(";m:") !== -1) {
|
|
let mw = word.substring(word.indexOf(";m:") + 3);
|
|
for (let j = i + 1; j < wordArray.length; j++) {
|
|
mw = mw + " " + wordArray[j];
|
|
i = j;
|
|
if (mw.indexOf(";") !== -1) {
|
|
wordObj.m = mw.slice(0, mw.indexOf(";"));
|
|
i = parseGenderTemplate(wordArray, wordObj, i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (word.indexOf(";w:") !== -1) {
|
|
let ww = word.substring(word.indexOf(";w:") + 3);
|
|
for (let j = i + 1; j < wordArray.length; j++) {
|
|
ww = ww + " " + wordArray[j];
|
|
i = j;
|
|
if (ww.indexOf(";") !== -1) {
|
|
wordObj.w = ww.slice(0, ww.indexOf(";"));
|
|
i = parseGenderTemplate(wordArray, wordObj, i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (word.indexOf(";d:") !== -1) {
|
|
let dw = word.substring(word.indexOf(";d:") + 3);
|
|
for (let j = i + 1; j < wordArray.length; j++) {
|
|
dw = dw + " " + wordArray[j];
|
|
i = j;
|
|
if (dw.indexOf(";") !== -1) {
|
|
wordObj.d = dw.slice(0, dw.indexOf(";"));
|
|
i = parseGenderTemplate(wordArray, wordObj, i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return i;
|
|
}
|
|
|
|
function findListInput(wordArray, wordObj, i) {
|
|
let word = wordArray[i];
|
|
if (word.indexOf("=l:") !== -1) {
|
|
wordObj.type = "list";
|
|
wordObj.listCount = 0;
|
|
let lw = word.substring(word.indexOf("=l:") + 3);
|
|
//escape if there is no space in listitem
|
|
if (lw.indexOf(";") !== -1) {
|
|
wordObj[wordObj.listCount] = lw.slice(0, lw.indexOf(";"));
|
|
//adding length word + 3 = m: ;
|
|
i = parseListTemplate(wordArray, wordObj, i);
|
|
return i;
|
|
}
|
|
for (let j = i + 1; j < wordArray.length; j++) {
|
|
lw = lw + " " + wordArray[j];
|
|
i = j;
|
|
if (lw.indexOf(";") !== -1) {
|
|
wordObj[wordObj.listCount] = lw.slice(0, lw.indexOf(";"));
|
|
//adding length word + 3 = m: ;
|
|
i = parseListTemplate(wordArray, wordObj, i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return i;
|
|
}
|
|
|
|
function parseListTemplate(wordArray, wordObj, i) {
|
|
let word = wordArray[i];
|
|
if (word.indexOf(";l:") !== -1) {
|
|
let lw = word.substring(word.indexOf(";l:") + 3);
|
|
//escape if there is no space in listitem
|
|
if (lw.indexOf(";") !== -1) {
|
|
wordObj.listCount++;
|
|
wordObj[wordObj.listCount] = lw.slice(0, lw.indexOf(";"));
|
|
//shorten wordArray and hand it to parseListTemplate: firstItem;l:secondItem;l: to ;l:secondItem;l:third Item
|
|
wordArray[i] = wordArray[i]
|
|
.substring(1)
|
|
.substring(wordArray[i].indexOf(";") + 1);
|
|
//advance wordArray i if third Item has a space in it and no ; is found to avoid endless loop
|
|
if (wordArray[i].substring(1).indexOf(";") === -1) {
|
|
i++;
|
|
}
|
|
//console.log(wordArray[i].substring(1));
|
|
i = parseListTemplate(wordArray, wordObj, i);
|
|
return i;
|
|
}
|
|
for (let j = i + 1; j < wordArray.length; j++) {
|
|
lw = lw + " " + wordArray[j];
|
|
i = j;
|
|
if (lw.indexOf(";") !== -1) {
|
|
wordObj.listCount++;
|
|
wordObj[wordObj.listCount] = lw.slice(0, lw.indexOf(";"));
|
|
i = parseListTemplate(wordArray, wordObj, i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return i;
|
|
}
|
|
|
|
function findConnectedListInput(wordArray, wordObj, i) {
|
|
let word = wordArray[i];
|
|
if (word.indexOf("=h:") !== -1) {
|
|
wordObj.type = "conList";
|
|
wordObj.listCount = 0;
|
|
let lw = word.substring(word.indexOf("=h:") + 3);
|
|
//escape if there is no space in listitem
|
|
if (lw.indexOf(";") !== -1) {
|
|
wordObj[wordObj.listCount] = lw.slice(0, lw.indexOf(";"));
|
|
//adding length word + 3 = m: ;
|
|
i = parseConnectedListTemplate(wordArray, wordObj, i);
|
|
return i;
|
|
}
|
|
for (let j = i + 1; j < wordArray.length; j++) {
|
|
lw = lw + " " + wordArray[j];
|
|
i = j;
|
|
if (lw.indexOf(";") !== -1) {
|
|
wordObj[wordObj.listCount] = lw.slice(0, lw.indexOf(";"));
|
|
//adding length word + 3 = m: ;
|
|
i = parseConnectedListTemplate(wordArray, wordObj, i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return i;
|
|
}
|
|
|
|
|
|
function parseConnectedListTemplate(wordArray, wordObj, i) {
|
|
let word = wordArray[i];
|
|
if (word.indexOf(";h:") !== -1) {
|
|
let lw = word.substring(word.indexOf(";h:") + 3);
|
|
//escape if there is no space in listitem
|
|
if (lw.indexOf(";") !== -1) {
|
|
wordObj.listCount++;
|
|
wordObj[wordObj.listCount] = lw.slice(0, lw.indexOf(";"));
|
|
//shorten wordArray and hand it to parseListTemplate: firstItem;l:secondItem;l: to ;l:secondItem;l:third Item
|
|
wordArray[i] = wordArray[i]
|
|
.substring(1)
|
|
.substring(wordArray[i].indexOf(";") + 1);
|
|
//advance wordArray i if third Item has a space in it and no ; is found to avoid endless loop
|
|
if (wordArray[i].substring(1).indexOf(";") === -1) {
|
|
i++;
|
|
}
|
|
//console.log(wordArray[i].substring(1));
|
|
i = parseConnectedListTemplate(wordArray, wordObj, i);
|
|
return i;
|
|
}
|
|
for (let j = i + 1; j < wordArray.length; j++) {
|
|
lw = lw + " " + wordArray[j];
|
|
i = j;
|
|
if (lw.indexOf(";") !== -1) {
|
|
wordObj.listCount++;
|
|
wordObj[wordObj.listCount] = lw.slice(0, lw.indexOf(";"));
|
|
i = parseConnectedListTemplate(wordArray, wordObj, i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return i;
|
|
}
|
|
|
|
function parseCustomTemplates(wordObj) {
|
|
let word = wordObj.word;
|
|
for (let i = 0; i < activeState.templateFieldTypes.length; i++) {
|
|
if (word.indexOf("=" + activeState.templateFieldTypes[i]) !== -1) {
|
|
wordObj.word = word.split("=")[0];
|
|
wordObj.type = word.split("=")[1];
|
|
|
|
if (wordObj.type.indexOf(":") !== -1) {
|
|
let ltPlaceholder = wordObj.type.split(":")[1];
|
|
if (ltPlaceholder !== "undefined") {
|
|
wordObj.placeholder = ltPlaceholder;
|
|
//wordObj.type = wordObj.type.split(":")[0]; - dont do this
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function isCharNumber(c) {
|
|
return c >= "0" && c <= "9";
|
|
}
|
|
|
|
export default parseInput;
|