Skip to content

Commit c0cb91b

Browse files
authored
Merge pull request #1 from spacefall/async
Conversione ad async
2 parents ff11221 + fd457d0 commit c0cb91b

File tree

6 files changed

+220
-198
lines changed

6 files changed

+220
-198
lines changed

index.html

+9-5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
<meta charset="UTF-8">
55
<title>iwb2svg</title>
66
<script src="svg.js"></script>
7+
<script src="utils.js"></script>
8+
<script src="iwb.js"></script>
9+
<script src="typeHandle.js"></script>
10+
<meta name="viewport" content="width=device-width, initial-scale=1" />
711
<link rel="stylesheet" type="text/css" href="styles.css" />
812
</head>
913
<body>
@@ -23,22 +27,22 @@
2327
<i>(Passare il mouse sopra le tick per ulteriori informazioni)</i>
2428
<label>
2529
Penna più precisa (beta, lento)
26-
<input id="precisioneChk" type="checkbox" onclick="refreshPagina()" title="Quando si scrive in modalità stilografica, il tratto cambia spessore; questa impostazione segue lo stesso cambiamento di spessore.&#10;*L'implementazione corrente non funziona correttamente con le linee trasparenti ed è lenta: in media è il doppio più lenta di quella normale e in alcune pagine anche 5 volte più lenta.*&#10;Se disattivata il tratto seguirà uno spessore costante.">
30+
<input id="precisioneChk" type="checkbox" onclick="rigeneraPagine()" title="Quando si scrive in modalità stilografica, il tratto cambia spessore; questa impostazione segue lo stesso cambiamento di spessore.&#10;*L'implementazione corrente non funziona correttamente con le linee trasparenti ed è lenta: in media è il doppio più lenta di quella normale e in alcune pagine anche 5 volte più lenta.*&#10;Se disattivata il tratto seguirà uno spessore costante.">
2731
</label>
2832
<label>
2933
Abilita tratti disegnati a mano
30-
<input id="touchChk" type="checkbox" onclick="refreshPagina()" checked="checked" title="Questa opzione abilita/disabilita i tratti disegnati senza la penna.">
34+
<input id="touchChk" type="checkbox" onclick="rigeneraPagine()" checked="checked" title="Questa opzione abilita/disabilita i tratti disegnati senza la penna.">
3135
</label>
3236
<label>
3337
Abilita tratti disegnati a penna
34-
<input id="pennaChk" type="checkbox" onclick="refreshPagina()" checked="checked" title="Questa opzione abilita/disabilita i tratti disegnati con la penna.">
38+
<input id="pennaChk" type="checkbox" onclick="rigeneraPagine()" checked="checked" title="Questa opzione abilita/disabilita i tratti disegnati con la penna.">
3539
</label>
3640
<label>
3741
Abilita tratti cancellati
38-
<input id="cancellatiChk" type="checkbox" onclick="refreshPagina()" title="Questa opzione ripristina i tratti cancellati.">
42+
<input id="cancellatiChk" type="checkbox" onclick="rigeneraPagine()" title="Questa opzione ripristina i tratti cancellati.">
3943
</label>
4044
</div>
41-
<svg id="preview"></svg>
45+
<!--<svg id="preview"></svg>-->
4246
<script src="main.js"></script>
4347
</body>
4448
</html>

iwb.js

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// esegue la conversione da iwb (in formato lista) a svg
2+
async function parseIWBList(lines, deleted, penIn, touchIn, precision, padding) {
3+
let svgObj = SVG();
4+
let promises = lines.slice(1).map(line => parseIWB_gTag(line, svgObj, deleted, penIn, touchIn, precision));
5+
6+
const pTagJson = JSON.parse(lines[0].substring(lines[0].indexOf("{")));
7+
svgObj.css("background-color", intToHexColor(pTagJson.bg.bc));
8+
let results = await Promise.allSettled(promises);
9+
10+
results.forEach((r) => {
11+
if (r.status === "rejected") {
12+
console.error("Errore nella conversione: " + r.reason);
13+
}
14+
});
15+
16+
let box = svgObj.bbox();
17+
svgObj.viewbox([box.x - (padding / 2), box.y - (padding / 2), box.width + padding, box.height + padding]);
18+
return svgObj;
19+
//return [svgObj, intToHexColor(pTagJson.bg.bc)];
20+
}
21+
22+
// esegue il parse di un tag "g"
23+
async function parseIWB_gTag(tag, svgElem, deleted, penIn, touchIn, precision) {
24+
const jsonData = JSON.parse(tag.substring(tag.indexOf("{")));
25+
const strokeObj = {color: intToHexColor(jsonData.props.color), width: jsonData.ps};
26+
if (!deleted && !jsonData.delete) return;
27+
let svgObj;
28+
29+
if (jsonData.type === 1) {
30+
if ((touchIn && jsonData.pt === 1) || (penIn && jsonData.pt === 2)) {
31+
svgObj = writingHandler(jsonData, strokeObj, svgElem, precision);
32+
} else return;
33+
} else if (typeHandlers[jsonData.type]) {
34+
svgObj = typeHandlers[jsonData.type](jsonData, strokeObj, svgElem);
35+
svgObj.stroke(strokeObj);
36+
} else {
37+
console.log("Incontrato un tag 'g' sconosciuto di tipo " + jsonData.type + ":\n" + jsonData);
38+
return;
39+
}
40+
41+
//svgObj.stroke(strokeObj);
42+
("fill" in jsonData) && jsonData.props.fill ? svgObj.fill(strokeObj.color) : svgObj.fill("none");
43+
44+
if ("transform" in jsonData) {
45+
let t = jsonData.transform;
46+
svgObj.transform({a: t[0], b: t[1], c: t[2], d: t[3], e: t[4], f: t[5]});
47+
}
48+
}
49+
50+
// semplifica un iwb rimuovendo le cose (ritenute) inutili e dividendo le pagine in liste al posto di essere limitate da tag
51+
function iwbToList(iwb) {
52+
let pages = [];
53+
iwb.split("\n").forEach(line => {
54+
if (line.startsWith("p{")) {
55+
pages.push([line]);
56+
} else if (line.startsWith("g:")) {
57+
pages[pages.length - 1].push(line);
58+
} else if (!["a:", "pm", "am", ""].includes(line.substring(0, 2))) {
59+
console.log("Rimuovendo attributo sconosciuto: ", line);
60+
}
61+
});
62+
return pages;
63+
}
64+
65+
// praticamente un wrapper di parseIWB che fa il parse di tutte le pagine in modo asincrono
66+
async function batch_parseIWBList(pages, deleted, penIn, touchIn, precision, padding) {
67+
const promises = pages.map(page => parseIWBList(page, deleted, penIn, touchIn, precision, padding));
68+
const results = await Promise.allSettled(promises);
69+
return results.map(r => r.value);
70+
}

main.js

+38-190
Original file line numberDiff line numberDiff line change
@@ -1,218 +1,66 @@
1-
const svg = SVG("#preview")
1+
let previewSvg = SVG();// = SVG("#preview", true)
22
const iwbFile = document.getElementById('iwb-loader');
33
const svgPadding = 250;
4+
5+
// gestione pagine
46
let currPage = 0;
57
let pageList = [];
8+
let svgList = [];
69

10+
// checkbox
711
const touchChk = document.getElementById("touchChk");
812
const pennaChk = document.getElementById("pennaChk");
913
const precisioneChk = document.getElementById("precisioneChk");
1014
const cancellatiChk = document.getElementById("cancellatiChk");
1115

12-
// Trasforma la lista di punti in stringhe per uso con polyline, saltando i cambiamenti di spessore per velocità
13-
function pointsConvQuick(points) {
14-
let pointStr = points.map(ptArray => ptArray.slice(0, 2).join(",")).join(' ');
15-
return [[1, pointStr]];
16-
}
17-
18-
// Trasforma la lista di punti in stringhe per uso con polyline, separando anche i punti per spessore
19-
// in modo da avere una conversione più precisa
20-
function pointsConvPrecision(points) {
21-
const ptList = [];
22-
let thList = [1, ""];
23-
let lastPoint = "";
24-
points.forEach((ptArray) => {
25-
let thickness = parseFloat(ptArray[2]);
26-
let curPt = ptArray.slice(0, 2).join(",");
27-
if (thList[0] === thickness) {
28-
thList[1] += " " + curPt;
29-
} else {
30-
ptList.push(thList);
31-
thList = [thickness, lastPoint + curPt];
32-
}
33-
lastPoint = curPt + " ";
34-
})
35-
ptList.push(thList);
36-
return ptList;
37-
}
38-
39-
// Questa funzione converte l'int del colore in hex, inoltre siccome la lavagna salva il colore in ARGB, lo converte in RGBA
40-
function signedInt2Hex(n) {
41-
let hexNum = (n >>> 0).toString(16);
42-
return "#" + hexNum.substring(2) + hexNum.substring(0, 2);
43-
}
44-
45-
// cancella i tag non riconosciuti (che al momento sono inutili) per velocizzare la conversione e divide tutto in pagine
46-
function parseInput(iwb) {
47-
let pages = [];
48-
let lines = iwb.split("\n");
49-
lines.forEach(curLine => {
50-
switch (curLine.substring(0, 2)) {
51-
case "p{":
52-
pages.push([]);
53-
pages[pages.length - 1].push(curLine);
54-
break;
55-
56-
case "g:":
57-
pages[pages.length - 1].push(curLine);
58-
break;
59-
60-
case "a:":
61-
case "pm":
62-
case "am":
63-
case "":
64-
break;
65-
66-
default:
67-
console.log("Rimuovendo attributo sconosciuto: ", curLine);
68-
break;
69-
}
70-
})
71-
return pages;
72-
}
73-
74-
function parseIWB(lines, deleted = false, input_penna = true, input_dita = true) {
75-
console.time("parsing");
76-
//console.log(lines)
77-
for (let i = 0; i < lines.length; i++) {
78-
let lineJson = lines[i].substring(lines[i].indexOf("{"));
79-
let jsonData = JSON.parse(lineJson);
80-
let skipTransform = false;
81-
let err = false;
82-
83-
switch (lines[i].charAt(0)) {
84-
case "g":
85-
let obj;
86-
let strokeObj = {color: signedInt2Hex(jsonData.props.color), width: jsonData.ps};
87-
88-
if (!deleted && !jsonData.delete) continue;
89-
switch (jsonData.type) {
90-
case 1: // scrittura
91-
strokeObj.linecap = "round";
92-
strokeObj.linejoin = "round";
93-
if (precisioneChk.checked) {
94-
const pointList = pointsConvPrecision(jsonData.points);
95-
skipTransform = true;
96-
pointList.map((pt) => {
97-
if ((input_dita && jsonData.pt === 1) || (input_penna && jsonData.pt === 2)) {
98-
const strokeUpd = {...strokeObj};
99-
strokeUpd.width = strokeUpd.width * pt[0];
100-
101-
obj = svg.polyline(pt[1]).fill("none").stroke(strokeUpd);
102-
if ("transform" in jsonData) {
103-
let t = jsonData.transform;
104-
obj.transform({a: t[0], b: t[1], c: t[2], d: t[3], e: t[4], f: t[5]});
105-
}
106-
}
107-
});
108-
} else {
109-
const pointList = pointsConvQuick(jsonData.points);
110-
pointList.map((pt) => {
111-
if ((input_dita && jsonData.pt === 1) || (input_penna && jsonData.pt === 2)) {
112-
obj = svg.polyline(pt[1]).fill("none").stroke(strokeObj);
113-
}
114-
});
115-
}
116-
break;
117-
118-
case 9: // linea retta
119-
case 11: // linea tratteggiata
120-
case 13: // freccia
121-
obj = svg.line(jsonData.pps[0], jsonData.pps[1], jsonData.ppe[0], jsonData.ppe[1]);
122-
123-
if (jsonData.type === 11) {
124-
strokeObj.dasharray = "10,10";
125-
} else {
126-
strokeObj.linecap = "round";
127-
strokeObj.linejoin = "round";
128-
}
129-
130-
if (jsonData.type === 13) {
131-
obj.marker('end', 8, 5, function (add) {
132-
add.polygon("0 0, 8 2.5, 0 5").fill(strokeObj.color)
133-
})
134-
}
135-
136-
obj.stroke(strokeObj);
137-
break;
138-
139-
case 10: // ellisse
140-
const w = jsonData.rect[2] - jsonData.rect[0];
141-
const h = jsonData.rect[3] - jsonData.rect[1];
142-
if (jsonData.rect.toString() === jsonData.props.toString()) {
143-
console.log("Trovato ellisse malformato, sarà trattato come un ellisse non riempito e senza trasparenza")
144-
strokeObj.color = jsonData.pc;
145-
}
146-
obj = svg.ellipse(w, h).x(jsonData.rect[0]).y(jsonData.rect[1]).stroke(strokeObj);
147-
break;
148-
149-
case 12: // cerchio
150-
obj = svg.circle()
151-
.radius(jsonData.cr)
152-
.x(jsonData.cx - jsonData.cr)
153-
.y(jsonData.cy - jsonData.cr)
154-
.stroke(strokeObj);
155-
break;
156-
157-
case 14: // triangolo
158-
case 15: // esagono
159-
case 16: // quadrilateri: trapezio, parallelepipedo, quadrato, rettangolo
160-
let points = jsonData.rect || jsonData.pp;
161-
let ptStr = points.join(" ");
162-
obj = svg.polygon(ptStr).stroke(strokeObj);
163-
break;
164-
165-
default:
166-
console.log("Tag sconosciuto: ", jsonData.type, jsonData);
167-
err = true;
168-
break;
169-
}
170-
if (!err) {
171-
("fill" in jsonData) && jsonData.props.fill ? obj.fill(strokeObj.color) : obj.fill("none");
172-
173-
if ("transform" in jsonData && !skipTransform && !err) {
174-
let t = jsonData.transform;
175-
obj.transform({a: t[0], b: t[1], c: t[2], d: t[3], e: t[4], f: t[5]});
176-
}
177-
}
178-
break;
179-
180-
case "p":
181-
svg.css("background-color", signedInt2Hex(jsonData.bg.bc));
182-
break;
183-
default:
184-
break;
185-
}
186-
}
187-
let box = svg.bbox();
188-
svg.viewbox([box.x - (svgPadding / 2), box.y - (svgPadding / 2), box.width + svgPadding, box.height + svgPadding])
189-
console.timeEnd("parsing");
190-
}
191-
16+
// cambia la pagina assicurandosi che non vada sotto 0 e sopra le pagine disponibili, poi carica la pagina corretta
19217
function cambioPagina(prec) {
193-
const oldPage = currPage
194-
if (prec) currPage--; else currPage++;
195-
if (currPage >= pageList.length) currPage = pageList.length - 1;
196-
if (currPage < 0) currPage = 0;
197-
if (currPage !== oldPage) refreshPagina();
18+
if (prec) {
19+
if (currPage-1 < 0) return;
20+
currPage--;
21+
} else {
22+
if (currPage+1 >= pageList.length) return;
23+
currPage++;
24+
}
25+
refreshPagina();
19826
}
19927

28+
// pulisce il svg, aggiorna l'indicatore della pagina e carica l'svg della pagina corretta
20029
function refreshPagina() {
20130
if (pageList.length === 0) return;
202-
svg.clear();
31+
previewSvg.clear();
20332
document.getElementById("pagina").innerText = currPage + 1;
204-
parseIWB(pageList[currPage], cancellatiChk.checked, pennaChk.checked, touchChk.checked);
33+
previewSvg.remove();
34+
previewSvg = svgList[currPage].clone().addTo("body");
35+
//previewSvg.viewbox(svgList[currPage][0].viewbox())
36+
//previewSvg.css("background-color", svgList[currPage][1]);
37+
//parseIWB(pageList[currPage], cancellatiChk.checked, pennaChk.checked, touchChk.checked);
20538
}
20639

40+
// forza un regen delle pagine già caricate
41+
function rigeneraPagine() {
42+
batch_parseIWBList(pageList, cancellatiChk.checked, pennaChk.checked, touchChk.checked, precisioneChk.checked, svgPadding).then((value) => {
43+
svgList = value;
44+
refreshPagina();
45+
})
46+
}
47+
48+
// carica il file e avvia l'elaborazione
20749
iwbFile.addEventListener('change', (event) => {
20850
const fileList = event.target.files;
51+
if (fileList.length === 0) return;
20952
const reader = new FileReader();
21053

21154
reader.addEventListener("loadend", () => {
21255
let data = reader.result;
213-
pageList = parseInput(data);
56+
pageList = iwbToList(data);
21457
currPage = 0;
215-
refreshPagina();
58+
rigeneraPagine();
21659
});
21760
reader.readAsText(fileList[0]);
21861
});
62+
63+
// idk easteregg?
64+
function funfun() {
65+
return "fünfhundertfünfundfünfzigtausendfünfhundertfünfundfünfzig";
66+
}

styles.css

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ label {
1111
display: block;
1212
}
1313

14-
svg {
14+
/*svg {
1515
width: 90%;
16-
height: 90%;
17-
}
16+
height: 90vh;
17+
}*/

0 commit comments

Comments
 (0)