diff options
Diffstat (limited to 'src/main/resources/eu')
| -rw-r--r-- | src/main/resources/eu/mulk/aendggner/web/app.js | 34 | ||||
| -rw-r--r-- | src/main/resources/eu/mulk/aendggner/web/index.html | 17 | ||||
| -rw-r--r-- | src/main/resources/eu/mulk/aendggner/web/style.css | 24 | ||||
| -rw-r--r-- | src/main/resources/eu/mulk/aendggner/web/worker.js | 5 |
4 files changed, 70 insertions, 10 deletions
diff --git a/src/main/resources/eu/mulk/aendggner/web/app.js b/src/main/resources/eu/mulk/aendggner/web/app.js index 3a2957c..97eca52 100644 --- a/src/main/resources/eu/mulk/aendggner/web/app.js +++ b/src/main/resources/eu/mulk/aendggner/web/app.js @@ -30,6 +30,15 @@ async function alsBase64(datei) { return { name: datei.name, base64: btoa(roh) }; } +/** Hängt der Meldung einen Verweis auf das Ergebnis an; ein Blob, kein Server. */ +function oeffne(inhalt, art, aufschrift) { + const verweis = document.createElement("a"); + verweis.href = URL.createObjectURL(new Blob([inhalt], { type: art })); + verweis.target = "_blank"; + verweis.textContent = aufschrift; + meldung.append(verweis); +} + formular.addEventListener("submit", async (ereignis) => { ereignis.preventDefault(); @@ -40,6 +49,9 @@ formular.addEventListener("submit", async (ereignis) => { return; } + const artikel = document.querySelector("#artikel").value.trim(); + const nurText = document.querySelector("#nurtext").checked; + knopf.disabled = true; zeige("Lade das Rechenwerk (einmalig einige Megabyte) und werte aus …", "arbeit"); @@ -60,7 +72,8 @@ formular.addEventListener("submit", async (ereignis) => { stamm, patches, vollstaendig: document.querySelector("#vollstaendig").checked, - artikel: null, + artikel: artikel === "" ? null : artikel, + nurText, }); }); @@ -69,22 +82,25 @@ formular.addEventListener("submit", async (ereignis) => { return; } - const blob = new Blob([ergebnis.html], { type: "text/html;charset=utf-8" }); - const adresse = URL.createObjectURL(blob); - // Kein window.open: Der Aufruf käme nach dem Warten auf den Worker und gälte dem Browser // nicht mehr als Nutzerhandlung — er würde als Popup blockiert. Stattdessen ein Link, der // sich öffnen und ebenso gut speichern lässt. + if (nurText) { + zeige( + `${ergebnis.text.length.toLocaleString("de-DE")} Zeichen gelesen; ` + + `keine Synopse erstellt. `, + "fertig", + ); + oeffne(ergebnis.text, "text/plain;charset=utf-8", "Gelesenen Text öffnen"); + return; + } + zeige( `${ergebnis.angewandt} Befehle angewandt, ${ergebnis.manuell} manuell zu prüfen, ` + `${ergebnis.normen} geänderte Normen. `, "fertig", ); - const verweis = document.createElement("a"); - verweis.href = adresse; - verweis.target = "_blank"; - verweis.textContent = "Synopse öffnen"; - meldung.append(verweis); + oeffne(ergebnis.html, "text/html;charset=utf-8", "Synopse öffnen"); } catch (e) { zeige("Verarbeitung fehlgeschlagen: " + (e && e.message ? e.message : e), "fehler"); } finally { diff --git a/src/main/resources/eu/mulk/aendggner/web/index.html b/src/main/resources/eu/mulk/aendggner/web/index.html index 680aa8c..edca09e 100644 --- a/src/main/resources/eu/mulk/aendggner/web/index.html +++ b/src/main/resources/eu/mulk/aendggner/web/index.html @@ -132,12 +132,29 @@ gewählten Reihenfolge nacheinander angewendet)</span></label> <input type="file" id="aenderung" name="aenderung" multiple required> </div> + <div class="feld"> + <label for="artikel">Anzuwendender Artikel + <span class="erl">(nur auszufüllen, wenn abweichend: ohne Angabe werden alle + Artikel angewandt, deren Einleitung das oben bezeichnete Stammgesetz + nennt)</span></label> + <input type="text" id="artikel" name="artikel" inputmode="numeric" + autocomplete="off" placeholder="z. B. 3"> + </div> <div class="feld ankreuzfeld"> <label> <input type="checkbox" id="vollstaendig" name="vollstaendig"> Unveränderte Vorschriften mit in die Synopse aufnehmen </label> </div> + <div class="feld ankreuzfeld"> + <label> + <input type="checkbox" id="nurtext" name="nurtext"> + Statt der Synopse nur den maschinell gelesenen Text der Änderungsdokumente ausgeben + </label> + <p class="erl nachsatz">Zur Nachschau, wenn ein Befehl unerklärlich unangewandt + bleibt: Der Text lässt sich sichern, von Hand berichtigen und als Klartextdatei + oben wieder einreichen.</p> + </div> </div> </div> diff --git a/src/main/resources/eu/mulk/aendggner/web/style.css b/src/main/resources/eu/mulk/aendggner/web/style.css index 36c2198..80479ff 100644 --- a/src/main/resources/eu/mulk/aendggner/web/style.css +++ b/src/main/resources/eu/mulk/aendggner/web/style.css @@ -215,6 +215,24 @@ input[type="file"] { font-size: 0.75rem; } +/* Die Eintragung von Hand steht auf einer Linie, wie im gedruckten Vordruck; sie ist kurz, + weil dort nur eine Artikelnummer hingehört. */ +input[type="text"] { + width: 8rem; + margin-top: 0.35rem; + padding: 0.1rem 0.2rem; + border: none; + border-bottom: 1px solid var(--linie); + background: transparent; + color: inherit; + font: inherit; + font-size: 0.8125rem; +} + +input[type="text"]::placeholder { + color: var(--muted); +} + /* Der Dateiwähler ist der einzige Knopf im Feld und trägt deshalb die Form der übrigen Eintragungsfelder: eckig, haarfein umrandet, weiß. */ input[type="file"]::file-selector-button { @@ -232,6 +250,12 @@ input[type="file"]::file-selector-button:hover { background: var(--grund); } +/* Der Nachsatz zu einem Ankreuzfeld steht unter dem Text, nicht neben ihm, und rückt bis + unter die Aufschrift ein. */ +.nachsatz { + margin: 0.15rem 0 0 1.6rem; +} + /* Das Ankreuzfeld steht vor dem Text und wird angekreuzt, nicht angehakt. */ .ankreuzfeld label { display: flex; diff --git a/src/main/resources/eu/mulk/aendggner/web/worker.js b/src/main/resources/eu/mulk/aendggner/web/worker.js index f20e873..827358e 100644 --- a/src/main/resources/eu/mulk/aendggner/web/worker.js +++ b/src/main/resources/eu/mulk/aendggner/web/worker.js @@ -19,7 +19,7 @@ const gestartet = GraalVM.run([], Object.assign(new GraalVM.Config(), { })); self.onmessage = async (nachricht) => { - const { stamm, patches, vollstaendig, artikel } = nachricht.data; + const { stamm, patches, vollstaendig, artikel, nurText } = nachricht.data; try { await gestartet; await bereit; @@ -28,9 +28,12 @@ self.onmessage = async (nachricht) => { patches, artikel: artikel ?? null, vollstaendig: Boolean(vollstaendig), + nurText: Boolean(nurText), }); if (ergebnis.fehler) { self.postMessage({ fehler: String(ergebnis.fehler) }); + } else if (nurText) { + self.postMessage({ text: String(ergebnis.text) }); } else { self.postMessage({ html: String(ergebnis.html), |
