aboutsummaryrefslogtreecommitdiff
path: root/src/main/resources/eu
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/resources/eu')
-rw-r--r--src/main/resources/eu/mulk/aendggner/web/app.js34
-rw-r--r--src/main/resources/eu/mulk/aendggner/web/index.html17
-rw-r--r--src/main/resources/eu/mulk/aendggner/web/style.css24
-rw-r--r--src/main/resources/eu/mulk/aendggner/web/worker.js5
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),