lyGen/input.js
2026-02-06 20:23:32 -03:00

322 lines
No EOL
9.2 KiB
JavaScript

const expButton = document.getElementById("export");
class Variation {
constructor(name, text, color, textColor) {
this.name = name;
this.text = text;
this.color = color;
this.textColor = textColor;
}
split() {
return this.text.split(/\r?\n/);
}
}
let variations = [];
let userText = [];
let name = "new project";
const box = document.getElementById("inputBox");
const project = document.getElementById("project");
const newProject = document.getElementById("new");
const cpResult = document.getElementById("copy");
project.addEventListener('click', () => {
const result = prompt("Type the new name.", name);
if (result) {
name = result;
reload();
}
})
cpResult.addEventListener('click', async () => {
const text = userText.join("\n");
await navigator.clipboard.writeText(text);
alert(text);
})
const newVname = document.querySelector("#newVname");
const newVtext = document.querySelector("#newVtext");
const newVcolor = document.querySelector("#newVcolor");
const newVtcolor = document.querySelector("#newVtcolor");
const newVadd = document.querySelector("#newVadd");
const variationsList = document.querySelector("#variations");
newVadd.addEventListener('click', e => {
if (newVname.value && newVtext.value && newVcolor.value && newVtcolor.value) {
variations.push(new Variation(newVname.value, newVtext.value, newVcolor.value, newVtcolor.value));
reload();
} else {
alert("Fill all fields.")
}
})
expButton.addEventListener('click', () => {
const save = {
name: name,
vars: variations,
usrInput: userText
}
const json = JSON.stringify(save);
const blob = new Blob([json], {type: 'application/json'});
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = `lyGEN-${name}.json`;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
})
const blankline = document.createElement("p");
blankline.textContent = "Blank line";
blankline.className = "stringParagraph blankline";
function closeAllPopups() {
const popups = document.querySelectorAll("aside");
popups.forEach(popup => {
popup.classList.add("closed");
});
}
function togglePopup(tag) {
const doc = document.querySelector(tag);
if (doc.classList.contains('closed')) {
closeAllPopups()
}
doc.classList.toggle("closed");
}
function reload() {
listVariations();
showVariations();
autosave();
project.textContent = name;
}
function populatePreview() {
const doc = document.querySelector("#previewTextBox");
doc.innerHTML = "";
userText.forEach(line => {
e = document.createElement('p');
e.textContent = line;
e.id = "previewText";
doc.appendChild(e);
});
}
newProject.addEventListener('click', () => {
if(confirm("The current project will be deleted, continue?")) {
variations = [];
name = "new project";
userText = [];
reload();
}
})
function createFileInput() {
const input = document.createElement('input');
input.type = 'file';
input.accept = '.json,application/json';
input.style.display = 'none';
input.addEventListener('change', handleFileUpload);
document.body.appendChild(input);
input.click();
input.addEventListener('blur', () => {
document.body.removeChild(input);
});
}
const importButton = document.getElementById('import');
importButton.addEventListener('click', createFileInput);
function autosave() {
console.log("Autosaving...");
const save = {
name: name,
vars: variations,
usrInput: userText
}
const json = JSON.stringify(save);
localStorage.setItem("autosave", json);
}
function loadAutoSave() {
const saveData = localStorage.getItem("autosave");
if (saveData) {
try {
const save = JSON.parse(saveData);
variations = save.vars.map(v =>
new Variation(v.name, v.text, v.color, v.textColor)
);
name = save.name || "new project";
userText = save.usrInput || [];
reload();
} catch (error) {
console.error("Error loading autosave:", error);
localStorage.removeItem("autosave");
}
}
}
function handleFileUpload(event) {
const file = event.target.files[0];
if (file) {
if (file.type !== 'application/json' && !file.name.endsWith('.json')) {
alert('Please select a JSON file');
return;
}
const reader = new FileReader();
reader.onload = function(e) {
try {
const saveData = JSON.parse(e.target.result);
if (!saveData.vars || !Array.isArray(saveData.vars)) {
throw new Error('Invalid file structure');
}
variations = saveData.vars.map(v =>
new Variation(
v.name || 'Unnamed Variation',
v.text || '',
v.color || '#FFFFFF',
v.textColor || '#000000'
)
);
name = saveData.name || "new project";
userText = saveData.usrInput || [];
reload();
alert('File successfully loaded');
} catch (error) {
console.error("Error parsing file:", error);
alert('Invalid file format. Please select a valid LyGEN project file.');
}
};
reader.onerror = function() {
alert('Error reading file');
};
reader.readAsText(file);
}
}
function listVariations() {
variationsList.innerHTML = "";
variations.forEach(variation => {
const div = document.createElement("div");
div.style.color = variation.textColor;
div.style.backgroundColor = variation.color;
div.className = "variation";
const pName = document.createElement("p");
pName.textContent = variation.name;
pName.className = "variationName";
const copy = document.createElement("p");
copy.textContent = "cp";
copy.className = "variationCopy";
const remove = document.createElement("p");
remove.textContent = "d";
remove.className = "variationDelete";
const up = document.createElement("p");
up.textContent = "↑";
up.className = "variationUp";
div.appendChild(pName);
div.appendChild(copy);
div.appendChild(remove);
div.appendChild(up);
variationsList.appendChild(div);
remove.addEventListener('click', () => {
variations = variations.filter(v => v !== variation);
reload();
})
copy.addEventListener('click', async () => {
await navigator.clipboard.writeText(variation.text);
alert(variation.text);
})
function moveItem(array, index, shift) {
if (index > 0) {
const item = array.splice(index, 1)[0];
array.splice(index + shift, 0, item);
}
return array;
}
up.addEventListener('click', () => {
variations = moveItem(variations, variations.indexOf(variation), -1);
reload();
})
});
}
function showVariations() {
box.innerHTML = '';
const maxLenght = Math.max(...variations.map(variation => variation.split().length));
for (let i = 0; i < maxLenght; i++) {
const pContainer = document.createElement("div");
pContainer.className = `paragraphContainer paragraphContainer${i}`;
var styleElem = document.head.appendChild(document.createElement("style"));
styleElem.innerHTML = `.paragraphContainer${i}:before {content: "${i + 1}";}`;
variations.forEach(variation => {
if (variation.split()[i]) {
const p = document.createElement("p");
p.className = `string-${variation.name}-paragraph stringParagraph`;
p.textContent = variation.split()[i];
p.style.backgroundColor = variation.color;
p.style.color = variation.textColor;
pContainer.appendChild(p);
} else {
pContainer.appendChild(blankline);
}
});
const ibox = document.createElement("input");
ibox.type = "text";
ibox.className = `ibox ibox${i}`
ibox.value = userText[i] ?? "";
ibox.dataset.lineNumber = i;
ibox.placeholder = "...";
ibox.addEventListener('change', () => {
userText[ibox.dataset.lineNumber] = ibox.value;
autosave();
});
ibox.addEventListener('change', () => {
populatePreview();
});
pContainer.appendChild(ibox);
box.appendChild(pContainer);
}
}
loadAutoSave();
populatePreview();
reload();