diff --git a/src/lib/assets/play-template.xml b/src/lib/assets/play-template.xml index 6c5151c..27a9115 100644 --- a/src/lib/assets/play-template.xml +++ b/src/lib/assets/play-template.xml @@ -1,15 +1,12 @@ - - <!-- generated title --> - <!-- generated subtitle --> Simplicius @@ -22,13 +19,14 @@ 107968169 - Du + Du Edited by Frank Fischer Viktor J. Illmer Nele Heindorf + Mark Schwindt @@ -43,9 +41,8 @@ - - »999 und noch etliche [mehr]«: Web app for Georg Nikolaus Bärmann’s Würfelalmanach - from 1829 + »999 und noch etliche [mehr]«: Web app for Georg Nikolaus Bärmann’s Würfelalmanach + from 1829

In the public domain.

@@ -60,7 +57,6 @@
- @@ -77,10 +73,8 @@ - - @@ -92,9 +86,7 @@ - -
diff --git a/src/lib/components/ShareButton.svelte b/src/lib/components/ShareButton.svelte index dfac61c..2bc7ac3 100644 --- a/src/lib/components/ShareButton.svelte +++ b/src/lib/components/ShareButton.svelte @@ -2,6 +2,7 @@ import shareIcon from "$lib/assets/share-icon.svg" import { locale } from "$lib/stores/locale" import { fade } from "svelte/transition" + import { downloadTEIDoc } from "$lib/tei" let { sequence } = $props<{ sequence: number[] }>() @@ -57,7 +58,7 @@ >
+ +
+ +
{/if} diff --git a/src/lib/tei.ts b/src/lib/tei.ts index cae0134..27ced78 100644 --- a/src/lib/tei.ts +++ b/src/lib/tei.ts @@ -1,6 +1,19 @@ +import { page } from "$app/state" import xmlTemplate from "$lib/assets/play-template.xml?raw" import { Almanac } from "./almanac" +function removeEmptyNewlinesBeforeFirstScene(segments: DocumentFragment, n: number) { + for (let i = 0; i < n; i++) { + if (segments.firstChild) { + segments.removeChild(segments.firstChild) + } + } +} + +function removePBsFromDiv(div: Element) { + Array.from(div.getElementsByTagName("pb")).forEach((pb) => pb.parentNode?.removeChild(pb)) +} + function getSegment(almanacDoc: Document, roll: number, pips: number): Element | null { const segmentId = Almanac.getSegmentId(roll, pips).toString() const segment = almanacDoc.querySelector(`div[type="segment"][n="${segmentId}"]`) @@ -22,15 +35,34 @@ function collectSegments(sequence: number[], almanacDoc: Document): DocumentFrag if (segment) { if (sceneNumber != null) { if (currentSceneDiv) segments.appendChild(currentSceneDiv) // finish previous scene + + // newline before new scene + segments.appendChild(document.createTextNode("\n" + " ".repeat(3))) // add line breaks and indentation + currentSceneDiv = document.createElementNS("http://www.tei-c.org/ns/1.0", "div") // start new scene currentSceneDiv.setAttribute("type", "scene") currentSceneDiv.setAttribute("n", sceneNumber.toString()) } - // append only the children of the div, not the outer
tag - Array.from(segment.childNodes).forEach((child) => { + removePBsFromDiv(segment) // remove page breaks from segments + + if (currentSceneDiv) { + currentSceneDiv.appendChild(document.createTextNode("\n" + " ".repeat(4))) + currentSceneDiv.appendChild( + document.createComment(`
`) + ) + } else { + segments.appendChild(document.createTextNode("\n")) + segments.appendChild( + document.createComment(`
`) + ) + } + // // append only the children of the div, not the outer
tag + Array.from(segment.children).forEach((child) => { if (currentSceneDiv) { + currentSceneDiv.appendChild(document.createTextNode("\n" + " ".repeat(4))) currentSceneDiv.appendChild(child.cloneNode(true)) } else { + segments.appendChild(document.createTextNode("\n" + " ".repeat(4))) // if no current scene yet, append directly segments.appendChild(child.cloneNode(true)) } @@ -59,9 +91,32 @@ export async function createTEIDoc( templateDoc.querySelector('teiHeader titleStmt > title[type="sub"]')!.textContent = subTitle templateDoc.querySelector('front > titlePage > docTitle > titlePart[type="main"]')!.textContent = mainTitle + + // add segment number comment before titles + const mainTitleEl = templateDoc.querySelector( + 'front > titlePage > docTitle > titlePart[type="main"]' + )! + const commentNode = segments.children[0].previousSibling!.previousSibling! + const lineBreakNode = document.createTextNode("\n" + " ".repeat(5)) + templateDoc.querySelector("front > titlePage > docTitle")!.insertBefore(commentNode, mainTitleEl) + templateDoc + .querySelector("front > titlePage > docTitle")! + .insertBefore(lineBreakNode, mainTitleEl) + templateDoc.querySelector('front > titlePage > docTitle > titlePart[type="sub"]')!.textContent = subTitle + segments.removeChild(segments.children[0]) // remove main title + segments.removeChild(segments.children[0]) // remove subtitle + + // add cast list and set description to front page (removed automatically) + const front = templateDoc.querySelector("front") + front?.appendChild(document.createTextNode(" ".repeat(3))) + front?.appendChild(segments.children[0].previousSibling!.previousSibling!) + front?.appendChild(document.createTextNode("\n" + " ".repeat(5))) + front?.appendChild(segments.children[0]) // cast list + front?.appendChild(segments.children[0]) // set description + // add url to generated play templateDoc.querySelector( 'teiHeader sourceDesc > bibl[type="edition"] > edition > idno' @@ -70,7 +125,7 @@ export async function createTEIDoc( // set sequence as edition in source description templateDoc.querySelector( 'teiHeader sourceDesc > bibl[type="digitalSource"] > idno' - )!.textContent = "https://temporal-communities.github.io/999/" + sequence.join("").toString() + )!.textContent = page.url.href + "#" + sequence.join("") // add timestamp const date = new Date() @@ -79,16 +134,12 @@ export async function createTEIDoc( .querySelector("teiHeader revisionDesc > listChange > change")! .setAttribute("when", timestamp) - // add titles, cast list and set description to front page and remove from segments - const front = templateDoc.querySelector("front") - for (let i = 0; i < 4 && segments.children[i]; i++) { - front?.appendChild(segments.children[i]) - segments.removeChild(segments.children[i]) - } + removeEmptyNewlinesBeforeFirstScene(segments, 7) // append segments wrapped in scene divs to template's main section - const mainDiv = templateDoc.querySelector('body > div[type="main"]') - mainDiv?.appendChild(segments) + const body = templateDoc.querySelector("body") + body?.appendChild(document.createTextNode(" ".repeat(1))) + body?.appendChild(segments) // convert DOM to XML string const serializer = new XMLSerializer()