441 lines
14 KiB
JavaScript
441 lines
14 KiB
JavaScript
import { storeData, clearData, retrieveData } from "./storage.js";
|
|
|
|
function parseFormOnSubmit(returnJSON = false, parseOnly = false) {
|
|
//event.preventDefault;
|
|
|
|
let dataArray = [];
|
|
|
|
if (parseOnly) {
|
|
let lT = activeState.loadedTemplate;
|
|
dataArray = retrieveData("userInputForce", lT);
|
|
if (dataArray != "") {
|
|
try {
|
|
dataArray = JSON.parse(dataArray);
|
|
} catch (e) {
|
|
return "";
|
|
}
|
|
}
|
|
if (dataArray == null) {
|
|
let wrapper = document.createElement("div");
|
|
wrapper.innerHTML = mainFormPlaceholder();
|
|
let div = wrapper.firstChild;
|
|
return div;
|
|
}
|
|
|
|
if (dataArray.length <= 0) {
|
|
let wrapper = document.createElement("div");
|
|
wrapper.innerHTML = mainFormPlaceholder();
|
|
let div = wrapper.firstChild;
|
|
return div;
|
|
}
|
|
|
|
} else {
|
|
let x = document.getElementById("mainFormObj");
|
|
|
|
if (x != null) {
|
|
for (let i = 0; i < x.length; i++) {
|
|
dataArray.push({
|
|
value: x.elements[i].value,
|
|
name: x.elements[i].name,
|
|
});
|
|
}
|
|
}
|
|
|
|
//set filename to active state according to userFileName field from loadTemplate
|
|
let userFileNameField = document.getElementById("userFileName");
|
|
let userFileName = userFileNameField.value;
|
|
let userFileNamePH = userFileNameField.getAttribute("placeholder");
|
|
if (userFileName.length != 0) {
|
|
activeState.fileName = userFileName;
|
|
} else if (userFileNamePH != null) {
|
|
activeState.fileName = userFileNamePH;
|
|
}
|
|
}
|
|
|
|
|
|
//get original objects from sessionstorage gen from loadTemplate
|
|
let objects = JSON.parse(window.sessionStorage.getItem("templateObjects"));
|
|
|
|
//get the complete unparsed template string from sessionstorage from loadTemplate
|
|
let fullString = window.sessionStorage.getItem("fullString");
|
|
|
|
//define output buffer
|
|
let b = "";
|
|
|
|
if (objects == null) {
|
|
return;
|
|
}
|
|
|
|
|
|
//iterate through templateObjects and look for according formdata
|
|
for (let obj of objects) {
|
|
//compaire each obj with elements from mainFormObj
|
|
for (let data of dataArray) {
|
|
|
|
//convert conList Master name to default name as set flag for appending connected list fields cl-name
|
|
let conListFlag = false;
|
|
//if obj is the connected list main selector
|
|
if (data.name.split("-")[0] == "clM") {
|
|
//if connected list main matches current object
|
|
if (data.name.substring(4) === obj.word.replace(/ /g, "_") ) {
|
|
//set flag for next iteration of loop
|
|
conListFlag = true;
|
|
data.name = data.name.substring(4);
|
|
|
|
//selection is not added to buffer
|
|
if (data.value == "!none") {
|
|
obj.result = "";
|
|
continue;
|
|
}
|
|
if (data.value == "!selected") {
|
|
data.value = obj[0];
|
|
obj.result = "";
|
|
}
|
|
}
|
|
}
|
|
|
|
//if field matches current object
|
|
if (obj.word.replace(/ /g, "_") === data.name) {
|
|
let value = parseDataForResult(obj, data.value);
|
|
obj.result = value;
|
|
|
|
}
|
|
|
|
//handle conlist elements for parsing each element
|
|
if (conListFlag && obj.type == "conList") {
|
|
let value = parseConListForResult(obj, data, dataArray);
|
|
obj.result = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
//console.log(this, dataArray);
|
|
|
|
b = fullString.substring(0, objects[0].spos);
|
|
for (let i = 0; i < objects.length; i++) {
|
|
let j = i + 1;
|
|
if (objects[j] === undefined) {
|
|
b +=
|
|
objects[i].result +
|
|
fullString.substring(objects[i].epos, fullString.length);
|
|
} else {
|
|
b +=
|
|
objects[i].result +
|
|
fullString.substring(objects[i].epos, objects[j].spos);
|
|
}
|
|
}
|
|
|
|
let bHtml = b.replace(/(?:\r\n|\r|\n)/g, "<br>");
|
|
bHtml = bHtml.replace(/!l /g, " • ");
|
|
bHtml = bHtml.replace(/!ls /g, " ○ ");
|
|
bHtml = bHtml.replace(/ /g, " ");
|
|
|
|
bHtml =
|
|
"<div style='font-family: Arial, Helvetica, sans-serif;'>" +
|
|
bHtml +
|
|
"</div>";
|
|
|
|
let div = document.createElement("div");
|
|
div.classList.add("w3-code", "notranslate", "w3-border-white");
|
|
div.id = "fileDisplay";
|
|
div.innerHTML = bHtml;
|
|
|
|
if (parseOnly) {
|
|
return div;
|
|
}
|
|
|
|
let p = document.createElement("p");
|
|
p.innerHTML = "Copied to Clipboard:";
|
|
document.getElementById("output").innerHTML = "";
|
|
document.getElementById("output").appendChild(p);
|
|
document.getElementById("output").appendChild(div);
|
|
|
|
storeData("userInput", JSON.stringify(dataArray));
|
|
clearData("userInput");
|
|
|
|
if (returnJSON) {
|
|
return dataArray;
|
|
} else {
|
|
copyToClipBoard(bHtml);
|
|
}
|
|
}
|
|
|
|
function parseDataForResult(obj, value) {
|
|
//handle placeholders like title, link, italic
|
|
if (obj.hasOwnProperty("placeholder") && value !== "") {
|
|
//console.log(obj.placeholder);
|
|
//check for markups
|
|
if (activeState.markups.includes(obj.placeholder)) {
|
|
value = parseMarkupmarkups(value, obj.placeholder);
|
|
} else {
|
|
value = obj.placeholder + "\n" + value;
|
|
}
|
|
}
|
|
|
|
//Plugin TextBlock Insertion according to file _textblocks.txt
|
|
value = parseTextBlocks(value);
|
|
|
|
|
|
//handle placeholders like !l or !n and set it to final interpreted string for object
|
|
value = parseTextMarkups(value);
|
|
|
|
//parse global linebreak after marked text was already fixed
|
|
value = parseGlobalLineBreak(value);
|
|
|
|
return value;
|
|
}
|
|
|
|
function parseConListForResult(obj, data, dataArray) {
|
|
//check for button if only one item exists and search conlist item
|
|
if (obj.listCount == 0) {
|
|
for (let d of dataArray) {
|
|
if (d.name.split(":!")[1] !== undefined) d.placeholder = "!"+d.name.split(":!")[1];
|
|
d.name = d.name.split(":!")[0];
|
|
if ("cl-"+obj[0].replace(/ /g, "_") == d.name && d.value != "") {
|
|
//console.log(d, obj[0], data);
|
|
if (data.value.replace(/ /g, "_") == d.name.substring(3)) {
|
|
if (d.hasOwnProperty("placeholder")) d.value = d.placeholder + "\n" + d.value;
|
|
let value = parseDataForResult(obj, d.value);
|
|
return obj.result + "\n" + value;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
//loop through dataArray and look for coresponding conlist items
|
|
for (let i = 0; i <= obj.listCount; i++) {
|
|
for (let d of dataArray) {
|
|
if (d.name.split(":!")[1] !== undefined) d.placeholder = "!"+d.name.split(":!")[1];
|
|
d.name = d.name.split(":!")[0];
|
|
if ("cl-"+obj[i].replace(/ /g, "_") == d.name && d.value != "") {
|
|
if (data.value.replace(/ /g, "_") == d.name.substring(3)) {
|
|
if (d.hasOwnProperty("placeholder")) d.value = d.placeholder + "\n" + d.value;
|
|
let value = parseDataForResult(obj, d.value);
|
|
return obj.result + "\n" + value;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
export function parseTextMarkups(data) {
|
|
let dataArray = data.split("\n");
|
|
let listFlag = false;
|
|
let listSubFlag = false;
|
|
let boldFlag = false;
|
|
let listNumberFlag = false;
|
|
let listNumberFlagNum = 1;
|
|
for (let i = 0; i < dataArray.length; i++) {
|
|
if (dataArray[i] == "") continue;
|
|
switch (dataArray[i]) {
|
|
case "!l":
|
|
listFlag = true;
|
|
dataArray.splice(i, 1);
|
|
i = i - 1;
|
|
break;
|
|
case "!ls":
|
|
listSubFlag = true;
|
|
dataArray.splice(i, 1);
|
|
i = i - 1;
|
|
break;
|
|
case "!n":
|
|
listNumberFlag = true;
|
|
dataArray.splice(i, 1);
|
|
i = i - 1;
|
|
break;
|
|
case "!b":
|
|
boldFlag = true;
|
|
dataArray.splice(i, 1);
|
|
i = i - 1;
|
|
break;
|
|
case "!e":
|
|
listFlag = false;
|
|
listNumberFlag = false;
|
|
dataArray.splice(i, 1);
|
|
i = i - 1;
|
|
break;
|
|
case "!es":
|
|
listSubFlag = false;
|
|
dataArray.splice(i, 1);
|
|
i = i - 1;
|
|
break;
|
|
default:
|
|
|
|
if (boldFlag) {
|
|
dataArray[i] = "<b>" + dataArray[i] + "</b>";
|
|
boldFlag = false;
|
|
continue;
|
|
}
|
|
|
|
//check if list indicator has been set and adjust userInput accordingly
|
|
let listIndicator = "";
|
|
|
|
if (listNumberFlag) {
|
|
listIndicator = " " + listNumberFlagNum + ". ";
|
|
listNumberFlagNum++;
|
|
}
|
|
|
|
if (listSubFlag && listIndicator == "") listIndicator = " ○ ";
|
|
|
|
if (listFlag && listIndicator == "") listIndicator = " • ";
|
|
|
|
//handle global linebreak and fit according to indicator according to list indicator
|
|
|
|
if (listIndicator != "") dataArray[i] = parseLineBreak(listIndicator + dataArray[i], listIndicator.length);
|
|
|
|
}
|
|
}
|
|
return dataArray.join("\n");
|
|
}
|
|
|
|
function parseMarkupmarkups(value, markup) {
|
|
switch (markup) {
|
|
case "title":
|
|
return "<b>" + value + "</b>";
|
|
break;
|
|
case "italic":
|
|
return "<i>" + value + "</i>";
|
|
break;
|
|
}
|
|
}
|
|
|
|
function parseTextBlocks(data) {
|
|
let textBlocks = loadTextBlocks();
|
|
let textBlockIds = Object.keys(textBlocks);
|
|
for (let i = 0; i < textBlockIds.length; i++) {
|
|
let id = textBlockIds[i];
|
|
if (data.indexOf("!" + id) !== -1) {
|
|
//console.log("found: "+id);
|
|
let sPos = data.indexOf("!" + id);
|
|
let ePos = sPos + id.length + 1;
|
|
data =
|
|
data.substring(0, sPos) +
|
|
textBlocks[id] +
|
|
data.substring(ePos, data.length);
|
|
}
|
|
}
|
|
return data;
|
|
}
|
|
|
|
function parseGlobalLineBreak(data) {
|
|
//parse each line of input with parseLineBreak return condensed string with newlines
|
|
let parsedData = '';
|
|
for (let line of data.split('\n')) {
|
|
let parsedLine = parseLineBreak(line, 0, activeState.lineBreak);
|
|
if (parsedData != '') {
|
|
parsedData = parsedData + '\n' + parsedLine;
|
|
} else {
|
|
parsedData = parsedLine;
|
|
}
|
|
}
|
|
return parsedData
|
|
}
|
|
|
|
function parseLineBreak(line, intendation = 0, lineBreak = activeState.lineBreak - 5) {
|
|
//add 5 chars buffer to fix list intendation issue
|
|
//each input field gets parsed line by line twice once for list inputs and a second time for each input
|
|
let lines;
|
|
|
|
if (line.length > lineBreak) {
|
|
//create linebreak in between second to last word
|
|
let correctedLineBreak;
|
|
let newLineStart;
|
|
let cLBt = lineBreak-(intendation*2)
|
|
//find last space before linebreak
|
|
correctedLineBreak = line.substring(0, cLBt).lastIndexOf(" ");
|
|
//and fix the next lines start
|
|
newLineStart = correctedLineBreak+1;
|
|
//add to parsed output
|
|
lines = line.substring(0, correctedLineBreak);
|
|
//delete first parsed output from inputstring
|
|
line = line.substring(newLineStart);
|
|
|
|
let intendationSpaces = '';
|
|
//check if an intendation is given if so convert it to correct spaces
|
|
if (intendation != 0) intendationSpaces = ' '.repeat(intendation+1);
|
|
|
|
//start loop to parse rest of the string
|
|
while(line.length > lineBreak) {
|
|
let cLBt = lineBreak-(intendation*2)
|
|
correctedLineBreak = line.substring(0, cLBt).lastIndexOf(" ");
|
|
newLineStart = correctedLineBreak+1;
|
|
//add to output with intendation if given
|
|
lines += "\n" + intendationSpaces + line.substring(0, correctedLineBreak);
|
|
//delete from input
|
|
line = line.substring(newLineStart);
|
|
}
|
|
//process rest of the string with correct intendation
|
|
lines += "\n" + intendationSpaces + line;
|
|
} else {
|
|
//if string is within lineBreak just forward input to output
|
|
lines = line;
|
|
}
|
|
return lines;
|
|
}
|
|
|
|
|
|
function loadTextBlocks() {
|
|
let textBlocks = document.getElementById("textBlocks").innerText;
|
|
let textBlocksObject = {};
|
|
if (textBlocks.indexOf("\r\n") !== -1) {
|
|
var wordArrayByLine = textBlocks.split("\r\n");
|
|
} else {
|
|
var wordArrayByLine = textBlocks.split("\n");
|
|
}
|
|
|
|
for (let i = 0; i < wordArrayByLine.length; i++) {
|
|
let textBlockId = wordArrayByLine[i].split(":")[0];
|
|
let textBlockText = wordArrayByLine[i].substring(
|
|
textBlockId.length + 2,
|
|
wordArrayByLine[i].length
|
|
);
|
|
if (textBlockId.length < 1) {
|
|
continue;
|
|
}
|
|
textBlocksObject[textBlockId.replace(/\s/g, "")] = textBlockText;
|
|
}
|
|
return textBlocksObject;
|
|
}
|
|
|
|
function copyToClipBoard(html) {
|
|
// Create an iframe (isolated container) for the HTML
|
|
var container = document.createElement("div");
|
|
container.innerHTML = html;
|
|
|
|
// Hide element
|
|
container.style.position = "fixed";
|
|
container.style.pointerEvents = "none";
|
|
container.style.opacity = 0;
|
|
|
|
// Detect all style sheets of the page
|
|
var activeSheets = Array.prototype.slice
|
|
.call(document.styleSheets)
|
|
.filter(function (sheet) {
|
|
return !sheet.disabled;
|
|
});
|
|
|
|
// Mount the iframe to the DOM to make `contentWindow` available
|
|
document.body.appendChild(container);
|
|
|
|
// Copy to clipboard
|
|
window.getSelection().removeAllRanges();
|
|
|
|
var range = document.createRange();
|
|
range.selectNode(container);
|
|
window.getSelection().addRange(range);
|
|
|
|
document.execCommand("copy");
|
|
for (var i = 0; i < activeSheets.length; i++) activeSheets[i].disabled = true;
|
|
document.execCommand("copy");
|
|
for (var i = 0; i < activeSheets.length; i++)
|
|
activeSheets[i].disabled = false;
|
|
|
|
// Remove the iframe
|
|
document.body.removeChild(container);
|
|
}
|
|
|
|
function mainFormPlaceholder() {
|
|
return "<div class='w3-row-padding w3-padding-24 w3-container w3-flat-clouds'><div class='w3-code notranslate w3-border-white' style='font-family: Arial, Helvetica, sans-serif;'><p>Select a file</p><br><br><br><br><br><br><br><br><br><br><br></div></div>";
|
|
}
|
|
|
|
export default parseFormOnSubmit; |