The contents of this file **must** give the author’s URL,
optionally followed by a trailing newline.
+ + **`2=TITLE`** (where `TITLE` might be anything):
+ This file is **optional** and indicates the title of the status.
+ The value of `TITLE` **should** be a file·system‐friendly version
+ of the title, but is ignored.
+ The contents of this file **must** give the title of the status,
+ optionally followed by a trailing newline.
+
+ **`3=YYYY-MM-DD`** (where `YYYY-MM-DD` is a date):
This file is **required** and indicates the date of the status.
Only one date is currently supported.
#topics h2{ Margin-Block-End: 0; Grid-Column: 1 / Span 2; Text-Align: Center }
#topics h2:Last-Child{ Display: None }
div.STATUS{ Border: Thin Solid; Padding-Inline: 1REM; Border-Radius: .5REM }
+summary{ Padding-Block: 1REM; Font-Weight: Bold }
+details[open]>summary{ Border-Block-End: Thin Solid }
footer{ Border-Block-Start: Thin Solid; Padding-Block: 1REM; Font-Size: Smaller; Text-Align: End }
footer p{ Margin-Block: 0 .5REM }
footer time:Not([datetime]),
const { documentElement: article } = parser.parseFromString(src, "application/xhtml+xml")
const footer = document.createElement("footer")
const authorshipP = footer.appendChild(document.createElement("p"))
- const { creator } = status
+ const { creator, title } = status
if (creator) {
const authorLink = authorshipP.appendChild(document.createElement("a"))
authorLink.href = creator["@id"]
const upLink = nav.appendChild(document.createElement("a"))
upLink.href = meta["@id"]
upLink.textContent = `See more ${ status.subject ? `“${status.subject}” posts` : "statuses" }.`
- container.replaceChildren(document.importNode(article, true), footer) })
+ if (title) {
+ const wrapper = document.createElement("article")
+ const details = wrapper.appendChild(document.createElement("details"))
+ details.setAttribute("open", "")
+ const summary = details.appendChild(document.createElement("summary"))
+ summary.textContent = title
+ details.append(...document.importNode(article, true).childNodes)
+ container.replaceChildren(wrapper, footer) }
+ else container.replaceChildren(document.importNode(article, true), footer) })
fetch("statuses.jsonld")
.then($ => $.json())
.then(meta => renderLatest(meta.current, document.getElementById("status")))
status["author"] = { "name": author_path.name[2:] }
with author_path.open("r", encoding="utf-8") as text:
status["author"]["@id"] = text.read().strip()
+ title_path = next(path.parent.glob("2=*"))
+ if title_path:
+ with title_path.open("r", encoding="utf-8") as text:
+ title = text.read().strip()
+ status["title"] = title
date_path = next(path.parent.glob("3=*"))
datetime = ""
if date_path:
<STYLE>
body{ Display: Grid; Box-Sizing: Border-Box; Margin: Auto; Padding-Inline: 1REM; Min-Block-Size: 100VH; Inline-Size: 100%; Max-Inline-Size: 45REM; Align-Content: Center; Justify-Content: Stretch; Font-Family: Sans-Serif }
article{ Font-Size: Larger }
+summary{ Padding-Block: 1REM; Font-Weight: Bold }
+details[open]>summary{ Border-Block-End: Thin Solid }
footer{ Border-Block-Start: Thin Solid; Padding-Block: 1REM; Text-Align: End }
footer p{ Margin-Block: 0 .5REM }
footer time:Not([datetime]),
const status = items[n]
const src = status.content
const { documentElement: article } = parser.parseFromString(src, "application/xhtml+xml")
- const { creator, created } = status
+ const { creator, created, title } = status
document.title = creator
? `Status by ${creator.name} @ ${status.created}`
: `Status @ ${created}`
? "".concat(...nextChars.slice(0, 27), "…")
: nextText }
nav.appendChild(document.createTextNode("."))
- document.body.replaceChildren(document.importNode(article, true), footer) })
+ if (title) {
+ const wrapper = document.createElement("article")
+ const details = wrapper.appendChild(document.createElement("details"))
+ details.setAttribute("open", "")
+ const summary = details.appendChild(document.createElement("summary"))
+ summary.textContent = title
+ details.append(...document.importNode(article, true).childNodes)
+ document.body.replaceChildren(wrapper, footer) }
+ else document.body.replaceChildren(document.importNode(article, true), footer) })
</SCRIPT>
.appendChild(document.createElement("dd"))
.appendChild(document.createElement("a"))
a.href = status["@id"]
- const summaryText = (() => {
- try {
- const d = parser.parseFromString(status.content, "application/xhtml+xml")
- const div = document.createElement("div")
- div.appendChild(document.importNode(d.documentElement, true))
- Object.assign(div.style,
- { position: "absolute"
- , top: "-2px"
- , height: "1px"
- , width: "1px"
- , overflow: "hidden" })
- document.body.appendChild(div)
- const text = div.innerText
- document.body.removeChild(div)
- return text }
- catch { } })() || "";
- const chars = Array.from(summaryText.trim().replaceAll(/\s+/gu, " "))
- a.textContent = chars.length > 28
- ? "".concat(...chars.slice(0, 27), "…")
- : summaryText || status.identifier }
+ const { title } = status
+ if (title) a.textContent = title.length > 28
+ ? "".concat(...title.slice(0, 27), "…")
+ : title
+ else {
+ const summaryText = (() => {
+ try {
+ const d = parser.parseFromString(status.content, "application/xhtml+xml")
+ const div = document.createElement("div")
+ div.appendChild(document.importNode(d.documentElement, true))
+ Object.assign(div.style,
+ { position: "absolute"
+ , top: "-2px"
+ , height: "1px"
+ , width: "1px"
+ , overflow: "hidden" })
+ document.body.appendChild(div)
+ const text = div.innerText
+ document.body.removeChild(div)
+ return text }
+ catch { } })() || "";
+ const chars = Array.from(summaryText.trim().replaceAll(/\s+/gu, " "))
+ a.textContent = chars.length > 28
+ ? "".concat(...chars.slice(0, 27), "…")
+ : summaryText || status.identifier } }
if (next) {
const a = nav
.appendChild(document.createElement("p"))