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 @@
-
-
-
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 @@
>
{urlCopied
@@ -69,6 +70,15 @@
: "Copy link"}
+
+
+ downloadTEIDoc([...sequence])}
+ >
+ {$locale === "de" ? "TEI-Dokument herunterladen" : "Download TEI document"}
+
+
{/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()