From 014bc81893007baee0f74b0a84b279981b627ec3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20M=C3=A4hr?= <14755525+maehr@users.noreply.github.com> Date: Sun, 7 Jun 2026 16:14:00 +0200 Subject: [PATCH 1/3] fix(perseus): replace dead license_url with /hopper/opensource The /hopper/about/copyright page 404s; the /hopper/opensource page is Perseus's current statement of their CC-BY-SA terms. Co-Authored-By: Claude Opus 4.7 --- works/aristotle.nicomachean-ethics.yaml | 2 +- works/plato.republic.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/works/aristotle.nicomachean-ethics.yaml b/works/aristotle.nicomachean-ethics.yaml index 2b3460c1..1cea9149 100644 --- a/works/aristotle.nicomachean-ethics.yaml +++ b/works/aristotle.nicomachean-ethics.yaml @@ -32,7 +32,7 @@ resolvers: language: grc access: open license: CC-BY-SA-3.0 - license_url: 'https://www.perseus.tufts.edu/hopper/about/copyright' + license_url: 'https://www.perseus.tufts.edu/hopper/opensource' # Perseus accepts the short citation form "Aristot. Nic. Eth. {page}{column}" # in the `doc` query; lands on the Bekker column. Line is not addressable. url: 'https://www.perseus.tufts.edu/hopper/text?doc=Aristot.+Nic.+Eth.+{page}{column}' diff --git a/works/plato.republic.yaml b/works/plato.republic.yaml index 641248b1..b68cbc6d 100644 --- a/works/plato.republic.yaml +++ b/works/plato.republic.yaml @@ -32,7 +32,7 @@ resolvers: language: grc access: open license: CC-BY-SA-3.0 - license_url: 'https://www.perseus.tufts.edu/hopper/about/copyright' + license_url: 'https://www.perseus.tufts.edu/hopper/opensource' # Perseus accepts the short citation form "Plat. Rep. {page}{section}" in # the `doc` query. Sub-line is not addressable; resolver lands on the # Stephanus section. From 5dc79a3ffa09e9eaacd30c62ed974e91fa5570a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20M=C3=A4hr?= <14755525+maehr@users.noreply.github.com> Date: Tue, 9 Jun 2026 23:12:50 +0200 Subject: [PATCH 2/3] feat(works): add second resolver to single-resolver works MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Each of six works had only one resolver, so a single provider's outage blanked the entire resolver target list. Add a complementary open-access second resolver to each: Perseus (Homer Iliad, Odyssey), Wikisource zh `論語/{name}第{ordinal}` keyed by book (Analects), and Project Gutenberg coarse landing pages (Aristotle NE #8438, Plato Republic #1497, Genji #19264) where no per-locator template fits. Co-Authored-By: Claude Opus 4.7 --- works/aristotle.nicomachean-ethics.yaml | 13 +++++++++++ works/confucius.analects.yaml | 31 +++++++++++++++++++++++++ works/homer.iliad.yaml | 10 ++++++++ works/homer.odyssey.yaml | 10 ++++++++ works/murasaki-shikibu.genji.yaml | 11 +++++++++ works/plato.republic.yaml | 13 +++++++++++ 6 files changed, 88 insertions(+) diff --git a/works/aristotle.nicomachean-ethics.yaml b/works/aristotle.nicomachean-ethics.yaml index 1cea9149..1024f3e3 100644 --- a/works/aristotle.nicomachean-ethics.yaml +++ b/works/aristotle.nicomachean-ethics.yaml @@ -37,6 +37,19 @@ resolvers: # in the `doc` query; lands on the Bekker column. Line is not addressable. url: 'https://www.perseus.tufts.edu/hopper/text?doc=Aristot.+Nic.+Eth.+{page}{column}' last_checked: '2026-06-03' + - provider: Project Gutenberg + edition: 'The Nicomachean Ethics of Aristotle' + language: en + access: open + license: 'public-domain' + # Coarse landing-page fallback: the Ross translation is a single ebook + # with no Bekker anchor, so the URL has no locator placeholders and + # resolves to the same page for every reference. The Perseus + # canonical-greekLit edition is indexed by Bywater book.section, not + # Bekker page+column, so a Scaife CTS URN cannot be derived from a + # Bekker locator alone. + url: 'https://www.gutenberg.org/ebooks/8438' + last_checked: '2026-06-09' # Page ranges by book: I 1094a–1103a, II 1103a–1109b, III 1109b–1119b, # IV 1119b–1128b, V 1129a–1138b, VI 1138b–1145a, VII 1145a–1154b, diff --git a/works/confucius.analects.yaml b/works/confucius.analects.yaml index 0af67f5e..3a127b31 100644 --- a/works/confucius.analects.yaml +++ b/works/confucius.analects.yaml @@ -54,6 +54,37 @@ resolvers: 18: 'https://ctext.org/analects/wei-zi' 19: 'https://ctext.org/analects/zi-zhang' 20: 'https://ctext.org/analects/yao-yue' + - provider: Wikisource + edition: 'Lunyu (論語), 朱熹集註 edition on zh.wikisource' + language: lzh + access: open + license: CC-BY-SA-4.0 + # Per-book pages keyed by the traditional chapter title plus ordinal + # (學而第一 … 堯曰第二十). Slugs are not derivable from the numeric book + # capture, so each is listed explicitly. + last_checked: '2026-06-09' + url_by: + book: + 1: 'https://zh.wikisource.org/wiki/論語/學而第一' + 2: 'https://zh.wikisource.org/wiki/論語/為政第二' + 3: 'https://zh.wikisource.org/wiki/論語/八佾第三' + 4: 'https://zh.wikisource.org/wiki/論語/里仁第四' + 5: 'https://zh.wikisource.org/wiki/論語/公冶長第五' + 6: 'https://zh.wikisource.org/wiki/論語/雍也第六' + 7: 'https://zh.wikisource.org/wiki/論語/述而第七' + 8: 'https://zh.wikisource.org/wiki/論語/泰伯第八' + 9: 'https://zh.wikisource.org/wiki/論語/子罕第九' + 10: 'https://zh.wikisource.org/wiki/論語/鄉黨第十' + 11: 'https://zh.wikisource.org/wiki/論語/先進第十一' + 12: 'https://zh.wikisource.org/wiki/論語/顏淵第十二' + 13: 'https://zh.wikisource.org/wiki/論語/子路第十三' + 14: 'https://zh.wikisource.org/wiki/論語/憲問第十四' + 15: 'https://zh.wikisource.org/wiki/論語/衛靈公第十五' + 16: 'https://zh.wikisource.org/wiki/論語/季氏第十六' + 17: 'https://zh.wikisource.org/wiki/論語/陽貨第十七' + 18: 'https://zh.wikisource.org/wiki/論語/微子第十八' + 19: 'https://zh.wikisource.org/wiki/論語/子張第十九' + 20: 'https://zh.wikisource.org/wiki/論語/堯曰第二十' # Per-book chapter counts (Yang Bojun / Legge tradition, with minor variant # divisions). Expands to 517 references across 20 books. diff --git a/works/homer.iliad.yaml b/works/homer.iliad.yaml index 4d227a64..b79b2143 100644 --- a/works/homer.iliad.yaml +++ b/works/homer.iliad.yaml @@ -34,6 +34,16 @@ resolvers: license: CC-BY-SA-4.0 url: 'https://scaife.perseus.org/reader/urn:cts:greekLit:tlg0012.tlg001.perseus-grc2:{book}.{line}/' last_checked: '2026-06-03' + - provider: Perseus Digital Library + edition: 'Homer, Iliad (Monro & Allen, OCT)' + language: grc + access: open + license: CC-BY-SA-3.0 + license_url: 'https://www.perseus.tufts.edu/hopper/opensource' + # Perseus accepts the short citation form "Hom. Il. {book}.{line}" in the + # `doc` query. + url: 'https://www.perseus.tufts.edu/hopper/text?doc=Hom.+Il.+{book}.{line}' + last_checked: '2026-06-09' # Per-book line counts (Allen OCT). The compiler expands these into # `1.1` … `24.804` — 15,693 references. diff --git a/works/homer.odyssey.yaml b/works/homer.odyssey.yaml index ea1a8b66..f134f516 100644 --- a/works/homer.odyssey.yaml +++ b/works/homer.odyssey.yaml @@ -34,6 +34,16 @@ resolvers: license: CC-BY-SA-4.0 url: 'https://scaife.perseus.org/reader/urn:cts:greekLit:tlg0012.tlg002.perseus-grc2:{book}.{line}/' last_checked: '2026-06-03' + - provider: Perseus Digital Library + edition: 'Homer, Odyssey (Murray, Loeb)' + language: grc + access: open + license: CC-BY-SA-3.0 + license_url: 'https://www.perseus.tufts.edu/hopper/opensource' + # Perseus accepts the short citation form "Hom. Od. {book}.{line}" in the + # `doc` query. + url: 'https://www.perseus.tufts.edu/hopper/text?doc=Hom.+Od.+{book}.{line}' + last_checked: '2026-06-09' # Per-book line counts (Allen OCT). The compiler expands these into # `1.1` … `24.548` — 12,110 references. diff --git a/works/murasaki-shikibu.genji.yaml b/works/murasaki-shikibu.genji.yaml index 862cb783..5794f96b 100644 --- a/works/murasaki-shikibu.genji.yaml +++ b/works/murasaki-shikibu.genji.yaml @@ -94,6 +94,17 @@ resolvers: 52: 'https://ja.wikisource.org/wiki/源氏物語/蜻蛉' 53: 'https://ja.wikisource.org/wiki/源氏物語/手習' 54: 'https://ja.wikisource.org/wiki/源氏物語/夢浮橋' + - provider: Project Gutenberg + edition: 'Japanese Literature (anthology incl. Genji Monogatari selections, transl. Suematsu Kenchō)' + language: en + access: open + license: 'public-domain' + # Coarse landing-page fallback: the Suematsu translation appears as a + # section of PG 19264 (Wilson, ed., *Japanese Literature*) with no + # per-chapter anchor, so the URL has no locator placeholders and + # resolves to the same page for every reference. + url: 'https://www.gutenberg.org/ebooks/19264' + last_checked: '2026-06-09' references_range: - kind: integer diff --git a/works/plato.republic.yaml b/works/plato.republic.yaml index b68cbc6d..fd7a3264 100644 --- a/works/plato.republic.yaml +++ b/works/plato.republic.yaml @@ -38,6 +38,19 @@ resolvers: # Stephanus section. url: 'https://www.perseus.tufts.edu/hopper/text?doc=Plat.+Rep.+{page}{section}' last_checked: '2026-06-03' + - provider: Project Gutenberg + edition: 'The Republic, transl. Benjamin Jowett' + language: en + access: open + license: 'public-domain' + # Coarse landing-page fallback: the Jowett translation is a single ebook + # with no Stephanus anchor, so the URL has no locator placeholders and + # resolves to the same page for every reference. The Perseus + # canonical-greekLit edition exposes only integer Stephanus pages under + # a book prefix (no `a`–`e` section letter), so a Scaife CTS URN cannot + # be derived from the Stephanus locator without losing the section. + url: 'https://www.gutenberg.org/ebooks/1497' + last_checked: '2026-06-09' # Republic spans 327a–621d; all five sections per page → 1,475 references. references_range: From be413a092bd71b36fecc04a91ac3c0b052f9c097 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20M=C3=A4hr?= <14755525+maehr@users.noreply.github.com> Date: Tue, 9 Jun 2026 23:23:49 +0200 Subject: [PATCH 3/3] refactor(works): replace target_kind hint with conforms_to IRI textrefs/textrefs.org#6 retires the informative target_kind label in favour of optional dcterms:conformsTo. Translate the existing wikidata/wikipedia hints to dereferenceable scheme IRIs (https://www.wikidata.org/ and https://en.wikipedia.org/) so the conformance claim carries through the JSON-LD context. Refs textrefs/textrefs.org#6. Co-Authored-By: Claude Opus 4.7 --- works/aristotle.nicomachean-ethics.yaml | 4 ++-- works/confucius.analects.yaml | 4 ++-- works/dhammapada.yaml | 4 ++-- works/homer.iliad.yaml | 4 ++-- works/homer.odyssey.yaml | 4 ++-- works/laozi.daodejing.yaml | 4 ++-- works/murasaki-shikibu.genji.yaml | 4 ++-- works/new-testament.yaml | 4 ++-- works/plato.republic.yaml | 4 ++-- works/tanakh.yaml | 4 ++-- works/wittgenstein.philosophical-investigations.yaml | 4 ++-- works/wittgenstein.tractatus.yaml | 4 ++-- 12 files changed, 24 insertions(+), 24 deletions(-) diff --git a/works/aristotle.nicomachean-ethics.yaml b/works/aristotle.nicomachean-ethics.yaml index 1024f3e3..50cfb9c2 100644 --- a/works/aristotle.nicomachean-ethics.yaml +++ b/works/aristotle.nicomachean-ethics.yaml @@ -12,14 +12,14 @@ citation_system: bekker mappings: - relation: exactMatch - target_kind: wikidata + conforms_to: 'https://www.wikidata.org/' identifier: 'https://www.wikidata.org/entity/Q474537' source: manual-curation status: candidate created: 2026-05-31 modified: 2026-06-02 - relation: closeMatch - target_kind: wikipedia + conforms_to: 'https://en.wikipedia.org/' identifier: 'https://en.wikipedia.org/wiki/Nicomachean_Ethics' source: 'wikidata:Q474537' status: candidate diff --git a/works/confucius.analects.yaml b/works/confucius.analects.yaml index 3a127b31..e4066db6 100644 --- a/works/confucius.analects.yaml +++ b/works/confucius.analects.yaml @@ -12,14 +12,14 @@ citation_system: analects-book-chapter mappings: - relation: exactMatch - target_kind: wikidata + conforms_to: 'https://www.wikidata.org/' identifier: 'https://www.wikidata.org/entity/Q276015' source: manual-curation status: candidate created: 2026-05-31 modified: 2026-06-02 - relation: closeMatch - target_kind: wikipedia + conforms_to: 'https://en.wikipedia.org/' identifier: 'https://en.wikipedia.org/wiki/Analects' source: 'wikidata:Q276015' status: candidate diff --git a/works/dhammapada.yaml b/works/dhammapada.yaml index 29c116cc..2126f62a 100644 --- a/works/dhammapada.yaml +++ b/works/dhammapada.yaml @@ -9,14 +9,14 @@ citation_system: dhammapada-chapter-verse mappings: - relation: exactMatch - target_kind: wikidata + conforms_to: 'https://www.wikidata.org/' identifier: 'https://www.wikidata.org/entity/Q748878' source: manual-curation status: candidate created: 2026-05-31 modified: 2026-06-02 - relation: closeMatch - target_kind: wikipedia + conforms_to: 'https://en.wikipedia.org/' identifier: 'https://en.wikipedia.org/wiki/Dhammapada' source: 'wikidata:Q748878' status: candidate diff --git a/works/homer.iliad.yaml b/works/homer.iliad.yaml index b79b2143..1384e037 100644 --- a/works/homer.iliad.yaml +++ b/works/homer.iliad.yaml @@ -12,14 +12,14 @@ citation_system: homer-book-line mappings: - relation: exactMatch - target_kind: wikidata + conforms_to: 'https://www.wikidata.org/' identifier: 'https://www.wikidata.org/entity/Q8275' source: manual-curation status: candidate created: 2026-05-31 modified: 2026-05-31 - relation: closeMatch - target_kind: wikipedia + conforms_to: 'https://en.wikipedia.org/' identifier: 'https://en.wikipedia.org/wiki/Iliad' source: 'wikidata:Q8275' status: candidate diff --git a/works/homer.odyssey.yaml b/works/homer.odyssey.yaml index f134f516..f4b1db0b 100644 --- a/works/homer.odyssey.yaml +++ b/works/homer.odyssey.yaml @@ -12,14 +12,14 @@ citation_system: homer-book-line mappings: - relation: exactMatch - target_kind: wikidata + conforms_to: 'https://www.wikidata.org/' identifier: 'https://www.wikidata.org/entity/Q35160' source: manual-curation status: candidate created: 2026-05-31 modified: 2026-05-31 - relation: closeMatch - target_kind: wikipedia + conforms_to: 'https://en.wikipedia.org/' identifier: 'https://en.wikipedia.org/wiki/Odyssey' source: 'wikidata:Q35160' status: candidate diff --git a/works/laozi.daodejing.yaml b/works/laozi.daodejing.yaml index b2a11a40..0b858ea9 100644 --- a/works/laozi.daodejing.yaml +++ b/works/laozi.daodejing.yaml @@ -12,14 +12,14 @@ citation_system: daodejing-chapter mappings: - relation: exactMatch - target_kind: wikidata + conforms_to: 'https://www.wikidata.org/' identifier: 'https://www.wikidata.org/entity/Q134425' source: manual-curation status: candidate created: 2026-05-31 modified: 2026-06-02 - relation: closeMatch - target_kind: wikipedia + conforms_to: 'https://en.wikipedia.org/' identifier: 'https://en.wikipedia.org/wiki/Tao_Te_Ching' source: 'wikidata:Q134425' status: candidate diff --git a/works/murasaki-shikibu.genji.yaml b/works/murasaki-shikibu.genji.yaml index 5794f96b..4e27f3a6 100644 --- a/works/murasaki-shikibu.genji.yaml +++ b/works/murasaki-shikibu.genji.yaml @@ -12,14 +12,14 @@ citation_system: genji-chapter mappings: - relation: exactMatch - target_kind: wikidata + conforms_to: 'https://www.wikidata.org/' identifier: 'https://www.wikidata.org/entity/Q8269' source: manual-curation status: candidate created: 2026-05-31 modified: 2026-06-02 - relation: closeMatch - target_kind: wikipedia + conforms_to: 'https://en.wikipedia.org/' identifier: 'https://en.wikipedia.org/wiki/The_Tale_of_Genji' source: 'wikidata:Q8269' status: candidate diff --git a/works/new-testament.yaml b/works/new-testament.yaml index 2781e59a..64fbfec4 100644 --- a/works/new-testament.yaml +++ b/works/new-testament.yaml @@ -9,14 +9,14 @@ citation_system: bible-book-chapter-verse mappings: - relation: exactMatch - target_kind: wikidata + conforms_to: 'https://www.wikidata.org/' identifier: 'https://www.wikidata.org/entity/Q18813' source: manual-curation status: candidate created: 2026-05-31 modified: 2026-05-31 - relation: closeMatch - target_kind: wikipedia + conforms_to: 'https://en.wikipedia.org/' identifier: 'https://en.wikipedia.org/wiki/New_Testament' source: 'wikidata:Q18813' status: candidate diff --git a/works/plato.republic.yaml b/works/plato.republic.yaml index fd7a3264..d88a8aa6 100644 --- a/works/plato.republic.yaml +++ b/works/plato.republic.yaml @@ -12,14 +12,14 @@ citation_system: stephanus mappings: - relation: exactMatch - target_kind: wikidata + conforms_to: 'https://www.wikidata.org/' identifier: 'https://www.wikidata.org/entity/Q123397' source: manual-curation status: candidate created: 2026-05-31 modified: 2026-06-02 - relation: closeMatch - target_kind: wikipedia + conforms_to: 'https://en.wikipedia.org/' identifier: 'https://en.wikipedia.org/wiki/Republic_(Plato)' source: 'wikidata:Q123397' status: candidate diff --git a/works/tanakh.yaml b/works/tanakh.yaml index 68f26b3d..6fea8243 100644 --- a/works/tanakh.yaml +++ b/works/tanakh.yaml @@ -9,14 +9,14 @@ citation_system: bible-book-chapter-verse mappings: - relation: exactMatch - target_kind: wikidata + conforms_to: 'https://www.wikidata.org/' identifier: 'https://www.wikidata.org/entity/Q83367' source: manual-curation status: candidate created: 2026-05-31 modified: 2026-05-31 - relation: closeMatch - target_kind: wikipedia + conforms_to: 'https://en.wikipedia.org/' identifier: 'https://en.wikipedia.org/wiki/Tanakh' source: 'wikidata:Q83367' status: candidate diff --git a/works/wittgenstein.philosophical-investigations.yaml b/works/wittgenstein.philosophical-investigations.yaml index e420f0d0..7b553088 100644 --- a/works/wittgenstein.philosophical-investigations.yaml +++ b/works/wittgenstein.philosophical-investigations.yaml @@ -13,14 +13,14 @@ citation_system: integer-section mappings: - relation: exactMatch - target_kind: wikidata + conforms_to: 'https://www.wikidata.org/' identifier: 'https://www.wikidata.org/entity/Q772496' source: manual-curation status: candidate created: 2026-06-02 modified: 2026-06-02 - relation: closeMatch - target_kind: wikipedia + conforms_to: 'https://en.wikipedia.org/' identifier: 'https://en.wikipedia.org/wiki/Philosophical_Investigations' source: manual-curation status: candidate diff --git a/works/wittgenstein.tractatus.yaml b/works/wittgenstein.tractatus.yaml index 7e041569..faff4a39 100644 --- a/works/wittgenstein.tractatus.yaml +++ b/works/wittgenstein.tractatus.yaml @@ -13,14 +13,14 @@ citation_system: tractatus-proposition mappings: - relation: exactMatch - target_kind: wikidata + conforms_to: 'https://www.wikidata.org/' identifier: 'https://www.wikidata.org/entity/Q655717' source: manual-curation status: candidate created: 2026-06-02 modified: 2026-06-02 - relation: closeMatch - target_kind: wikipedia + conforms_to: 'https://en.wikipedia.org/' identifier: 'https://en.wikipedia.org/wiki/Tractatus_Logico-Philosophicus' source: manual-curation status: candidate