Add commentary and dictionary resources
This commit is contained in:
@@ -6,5 +6,7 @@ This file is generated from source manifests and package catalogs. Edit `sources
|
|||||||
|
|
||||||
| Resource | Type | Language | Date / Edition | Source | License | Features | Attachments | Counts | Detail |
|
| Resource | Type | Language | Date / Edition | Source | License | Features | Attachments | Counts | Detail |
|
||||||
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
||||||
|
| [Easton's and Smith's Bible Dictionaries](docs/resources/easton-smith-dictionaries-neuu.md) | dictionary | English (eng) | n/a | NEUU Bible Dictionary Dataset | CC BY 4.0 dataset; original dictionaries public domain (redistributable) | English Bible dictionary entries, Dictionary scripture references | English term definitions, future: maps, future: timeline, future: person_place_index | 5998 dictionary entries | [Details](docs/resources/easton-smith-dictionaries-neuu.md) |
|
||||||
| [King James (Authorized) Version](docs/resources/kjv-eng-kjv2006.md) | translation | English (eng) - archaic British | 1611; 1769 edition | eBible.org | Public Domain (redistributable) | Bible text, Strong's-linked words, USFM source, Strong's dictionary lookup, Translator footnotes | Strong's links, Strong's dictionary lookup, Translator footnotes, future: study_notes, future: commentary, future: cross_references, future: morphology, future: lemma_links, future: lexicon, future: dictionary, future: maps, future: timeline, future: media | 66 books, 31102 verses, 348884 Strong's links, 6959 footnotes | [Details](docs/resources/kjv-eng-kjv2006.md) |
|
| [King James (Authorized) Version](docs/resources/kjv-eng-kjv2006.md) | translation | English (eng) - archaic British | 1611; 1769 edition | eBible.org | Public Domain (redistributable) | Bible text, Strong's-linked words, USFM source, Strong's dictionary lookup, Translator footnotes | Strong's links, Strong's dictionary lookup, Translator footnotes, future: study_notes, future: commentary, future: cross_references, future: morphology, future: lemma_links, future: lexicon, future: dictionary, future: maps, future: timeline, future: media | 66 books, 31102 verses, 348884 Strong's links, 6959 footnotes | [Details](docs/resources/kjv-eng-kjv2006.md) |
|
||||||
|
| [Matthew Henry's Concise Commentary on the Bible](docs/resources/matthew-henry-concise-ccel.md) | commentary | English (eng) | n/a | Christian Classics Ethereal Library | Public Domain (redistributable) | Verse-range commentary | Matthew Henry concise commentary, future: study_notes, future: cross_references | 66 books, 3930 commentary entries | [Details](docs/resources/matthew-henry-concise-ccel.md) |
|
||||||
| [Strong's Hebrew and Greek Dictionaries](docs/resources/strongs-open-scriptures.md) | lexicon | English (eng) | n/a | Open Scriptures | CC-BY-SA digital edition; original Strong's dictionaries public domain (redistributable) | Strong's dictionary entries, Hebrew and Aramaic entries, Greek entries | Strong's number definitions, future: morphology, future: lemma_links | 14197 dictionary entries | [Details](docs/resources/strongs-open-scriptures.md) |
|
| [Strong's Hebrew and Greek Dictionaries](docs/resources/strongs-open-scriptures.md) | lexicon | English (eng) | n/a | Open Scriptures | CC-BY-SA digital edition; original Strong's dictionaries public domain (redistributable) | Strong's dictionary entries, Hebrew and Aramaic entries, Greek entries | Strong's number definitions, future: morphology, future: lemma_links | 14197 dictionary entries | [Details](docs/resources/strongs-open-scriptures.md) |
|
||||||
|
|||||||
@@ -0,0 +1,86 @@
|
|||||||
|
# Easton's and Smith's Bible Dictionaries
|
||||||
|
|
||||||
|
Merged Easton's and Smith's Bible dictionary entries normalized by English term for margin lookup and study references.
|
||||||
|
|
||||||
|
## Identity
|
||||||
|
|
||||||
|
- Resource ID: `easton-smith-dictionaries-neuu`
|
||||||
|
- Type: dictionary
|
||||||
|
- Abbreviation: EAS/SMI
|
||||||
|
- Short title: Easton / Smith Bible Dictionaries
|
||||||
|
- Alternate IDs: neuu-org/bible-dictionary-dataset
|
||||||
|
- Language: English (eng)
|
||||||
|
- Canon: reference
|
||||||
|
|
||||||
|
## Translation
|
||||||
|
|
||||||
|
- Base title: n/a
|
||||||
|
- Translation year: n/a
|
||||||
|
- Edition: n/a
|
||||||
|
- Edition year: n/a
|
||||||
|
- Source text basis: n/a
|
||||||
|
- Tradition: n/a
|
||||||
|
|
||||||
|
## Source
|
||||||
|
|
||||||
|
- Provider: NEUU Bible Dictionary Dataset
|
||||||
|
- Upstream ID: neuu-org/bible-dictionary-dataset
|
||||||
|
- Upstream page: https://github.com/neuu-org/bible-dictionary-dataset
|
||||||
|
- Download URL: https://raw.githubusercontent.com/neuu-org/bible-dictionary-dataset/main/data/01_parsed/_index.json
|
||||||
|
- Source format: github-raw-json-index
|
||||||
|
- Upstream last updated: 2026-07-12
|
||||||
|
- Available upstream formats: json
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
- Name: CC BY 4.0 dataset; original dictionaries public domain
|
||||||
|
- Redistribution allowed: Yes
|
||||||
|
- License/source URL: https://github.com/neuu-org/bible-dictionary-dataset
|
||||||
|
- Attribution: Parsed dataset by NEUU. Original public-domain sources include Easton's Bible Dictionary and Smith's Bible Dictionary.
|
||||||
|
- Jurisdiction notes: n/a
|
||||||
|
- Restrictions: Preserve NEUU dataset attribution and CC BY 4.0 notice.
|
||||||
|
|
||||||
|
## Contributors
|
||||||
|
|
||||||
|
- M. G. Easton: Easton's Bible Dictionary original author
|
||||||
|
- William Smith: Smith's Bible Dictionary original editor
|
||||||
|
- NEUU: parsed dataset maintainer
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- English Bible dictionary entries: dictionary; languages: eng; embedded; package: packages/json/easton-smith-dictionaries-neuu/entries.jsonl
|
||||||
|
- Dictionary scripture references: cross_references; languages: eng; embedded; package: packages/json/easton-smith-dictionaries-neuu/entries.jsonl
|
||||||
|
|
||||||
|
## Attachments
|
||||||
|
|
||||||
|
Included:
|
||||||
|
- English term definitions: dictionary; english-term-to-dictionary-entry; anchors: word, term, scripture_reference; languages: eng; package: packages/json/easton-smith-dictionaries-neuu/entries.jsonl
|
||||||
|
|
||||||
|
Supported future attachment types:
|
||||||
|
- maps
|
||||||
|
- timeline
|
||||||
|
- person_place_index
|
||||||
|
|
||||||
|
## Generated Package
|
||||||
|
|
||||||
|
- Package catalog: packages/json/easton-smith-dictionaries-neuu/catalog.json
|
||||||
|
- Verses JSONL: n/a
|
||||||
|
- Strong's links JSONL: n/a
|
||||||
|
- Footnotes JSONL: n/a
|
||||||
|
- Entries JSONL: packages/json/easton-smith-dictionaries-neuu/entries.jsonl
|
||||||
|
- Source SHA-256: 0105d59e4376ed21d34e04195636f752388d2ce9f62babf8a552b8ef1a917666
|
||||||
|
- Last checked: 2026-07-12T15:58:00Z
|
||||||
|
|
||||||
|
## Counts
|
||||||
|
|
||||||
|
- Books: n/a
|
||||||
|
- Verses: n/a
|
||||||
|
- Strong's links: n/a
|
||||||
|
- Footnotes: n/a
|
||||||
|
- Entries: 5998
|
||||||
|
- Commentary entries: n/a
|
||||||
|
- Dictionary entries: 5998
|
||||||
|
|
||||||
|
## Package Checksums
|
||||||
|
|
||||||
|
- entries_jsonl: `entries.jsonl` (e0530558dd643296d1e44127762b86d4a663b00326727215ec96ba301a90e759)
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
# Matthew Henry's Concise Commentary on the Bible
|
||||||
|
|
||||||
|
Public-domain concise whole-Bible commentary by Matthew Henry, normalized into book/chapter/verse-range entries.
|
||||||
|
|
||||||
|
## Identity
|
||||||
|
|
||||||
|
- Resource ID: `matthew-henry-concise-ccel`
|
||||||
|
- Type: commentary
|
||||||
|
- Abbreviation: MHCC
|
||||||
|
- Short title: Matthew Henry Concise Commentary
|
||||||
|
- Alternate IDs: ccel/henry/mhcc
|
||||||
|
- Language: English (eng)
|
||||||
|
- Canon: whole-bible
|
||||||
|
|
||||||
|
## Translation
|
||||||
|
|
||||||
|
- Base title: n/a
|
||||||
|
- Translation year: n/a
|
||||||
|
- Edition: n/a
|
||||||
|
- Edition year: n/a
|
||||||
|
- Source text basis: n/a
|
||||||
|
- Tradition: n/a
|
||||||
|
|
||||||
|
## Source
|
||||||
|
|
||||||
|
- Provider: Christian Classics Ethereal Library
|
||||||
|
- Upstream ID: henry/mhcc
|
||||||
|
- Upstream page: https://www.ccel.org/ccel/henry/mhcc.html
|
||||||
|
- Download URL: https://www.ccel.org/ccel/h/henry/mhcc/cache/mhcc.txt
|
||||||
|
- Source format: plain-text
|
||||||
|
- Upstream last updated: 2001-06-20
|
||||||
|
- Available upstream formats: html, xml, text, pdf, epub
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
- Name: Public Domain
|
||||||
|
- Redistribution allowed: Yes
|
||||||
|
- License/source URL: https://www.ccel.org/ccel/h/henry/mhcc/cache/mhcc.txt
|
||||||
|
- Attribution: Matthew Henry's Concise Commentary on the Bible, digital text from Christian Classics Ethereal Library.
|
||||||
|
- Jurisdiction notes: n/a
|
||||||
|
- Restrictions: Preserve CCEL attribution for the digital source.
|
||||||
|
|
||||||
|
## Contributors
|
||||||
|
|
||||||
|
- Matthew Henry: original author
|
||||||
|
- Christian Classics Ethereal Library: digital text provider
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Verse-range commentary: commentary; languages: eng; embedded; package: packages/json/matthew-henry-concise-ccel/commentary.jsonl
|
||||||
|
|
||||||
|
## Attachments
|
||||||
|
|
||||||
|
Included:
|
||||||
|
- Matthew Henry concise commentary: commentary; verse-range-to-commentary; anchors: book, chapter, verse_range; languages: eng; package: packages/json/matthew-henry-concise-ccel/commentary.jsonl
|
||||||
|
|
||||||
|
Supported future attachment types:
|
||||||
|
- study_notes
|
||||||
|
- cross_references
|
||||||
|
|
||||||
|
## Generated Package
|
||||||
|
|
||||||
|
- Package catalog: packages/json/matthew-henry-concise-ccel/catalog.json
|
||||||
|
- Verses JSONL: n/a
|
||||||
|
- Strong's links JSONL: n/a
|
||||||
|
- Footnotes JSONL: n/a
|
||||||
|
- Entries JSONL: n/a
|
||||||
|
- Source SHA-256: 7af7f0feef2a8522263d48825a170125f4c421d14250212d83db6aef6d4f5269
|
||||||
|
- Last checked: 2026-07-12T15:58:00Z
|
||||||
|
|
||||||
|
## Counts
|
||||||
|
|
||||||
|
- Books: 66
|
||||||
|
- Verses: n/a
|
||||||
|
- Strong's links: n/a
|
||||||
|
- Footnotes: n/a
|
||||||
|
- Entries: 3930
|
||||||
|
- Commentary entries: 3930
|
||||||
|
- Dictionary entries: n/a
|
||||||
|
|
||||||
|
## Package Checksums
|
||||||
|
|
||||||
|
- commentary_jsonl: `commentary.jsonl` (897845ce215601932381d981592ac5e1eb1d3adfb753af1b1e695cb318401119)
|
||||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "libre-bible-data",
|
"name": "libre-bible-data",
|
||||||
"version": "0.1.7",
|
"version": "0.1.8",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "libre-bible-data",
|
"name": "libre-bible-data",
|
||||||
"version": "0.1.7",
|
"version": "0.1.8",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"adm-zip": "^0.5.16"
|
"adm-zip": "^0.5.16"
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-2
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "libre-bible-data",
|
"name": "libre-bible-data",
|
||||||
"version": "0.1.7",
|
"version": "0.1.8",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -9,7 +9,9 @@
|
|||||||
"catalog": "node scripts/generate-catalog.js",
|
"catalog": "node scripts/generate-catalog.js",
|
||||||
"import:kjv": "node scripts/import-usfm.js sources/kjv-eng-kjv2006.json",
|
"import:kjv": "node scripts/import-usfm.js sources/kjv-eng-kjv2006.json",
|
||||||
"import:strongs": "node scripts/import-strongs.js sources/strongs-open-scriptures.json",
|
"import:strongs": "node scripts/import-strongs.js sources/strongs-open-scriptures.json",
|
||||||
"build": "npm run check && npm run import:kjv && npm run import:strongs && npm run catalog && npm run docs"
|
"import:mhcc": "node scripts/import-mhcc.js sources/matthew-henry-concise-ccel.json",
|
||||||
|
"import:dictionaries": "node scripts/import-neuu-dictionaries.js sources/easton-smith-dictionaries-neuu.json",
|
||||||
|
"build": "npm run check && npm run import:kjv && npm run import:strongs && npm run import:mhcc && npm run import:dictionaries && npm run catalog && npm run docs"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"adm-zip": "^0.5.16"
|
"adm-zip": "^0.5.16"
|
||||||
|
|||||||
+241
-1
@@ -1,8 +1,136 @@
|
|||||||
{
|
{
|
||||||
"schema_version": "librebible.index-catalog.v1",
|
"schema_version": "librebible.index-catalog.v1",
|
||||||
"project": "LibreBible",
|
"project": "LibreBible",
|
||||||
"generated_at": "2026-07-12T14:08:30.649Z",
|
"generated_at": "2026-07-12T15:24:50.122Z",
|
||||||
"resources": [
|
"resources": [
|
||||||
|
{
|
||||||
|
"id": "easton-smith-dictionaries-neuu",
|
||||||
|
"resource_type": "dictionary",
|
||||||
|
"title": "Easton's and Smith's Bible Dictionaries",
|
||||||
|
"short_title": "Easton / Smith Bible Dictionaries",
|
||||||
|
"abbreviation": "EAS/SMI",
|
||||||
|
"alternate_ids": [
|
||||||
|
"neuu-org/bible-dictionary-dataset"
|
||||||
|
],
|
||||||
|
"language": {
|
||||||
|
"code": "eng",
|
||||||
|
"name": "English"
|
||||||
|
},
|
||||||
|
"script": "Latn",
|
||||||
|
"canon": {
|
||||||
|
"scope": "reference",
|
||||||
|
"notes": "Bible dictionary entries keyed by English term, with scripture references where present."
|
||||||
|
},
|
||||||
|
"contributors": [
|
||||||
|
{
|
||||||
|
"name": "M. G. Easton",
|
||||||
|
"role": "Easton's Bible Dictionary original author"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "William Smith",
|
||||||
|
"role": "Smith's Bible Dictionary original editor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "NEUU",
|
||||||
|
"role": "parsed dataset maintainer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"features": [
|
||||||
|
{
|
||||||
|
"id": "english-bible-dictionary",
|
||||||
|
"type": "dictionary",
|
||||||
|
"label": "English Bible dictionary entries",
|
||||||
|
"languages": [
|
||||||
|
"eng"
|
||||||
|
],
|
||||||
|
"embedded": true,
|
||||||
|
"package": "packages/json/easton-smith-dictionaries-neuu/entries.jsonl"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "dictionary-scripture-references",
|
||||||
|
"type": "cross_references",
|
||||||
|
"label": "Dictionary scripture references",
|
||||||
|
"languages": [
|
||||||
|
"eng"
|
||||||
|
],
|
||||||
|
"embedded": true,
|
||||||
|
"package": "packages/json/easton-smith-dictionaries-neuu/entries.jsonl"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"attachments": {
|
||||||
|
"included": [
|
||||||
|
{
|
||||||
|
"id": "easton-smith-term-definitions",
|
||||||
|
"resource_type": "dictionary",
|
||||||
|
"label": "English term definitions",
|
||||||
|
"relationship": "english-term-to-dictionary-entry",
|
||||||
|
"anchor_types": [
|
||||||
|
"word",
|
||||||
|
"term",
|
||||||
|
"scripture_reference"
|
||||||
|
],
|
||||||
|
"languages": [
|
||||||
|
"eng"
|
||||||
|
],
|
||||||
|
"source": "NEUU parsed dataset built from public-domain Easton's and Smith's Bible dictionaries.",
|
||||||
|
"package": "packages/json/easton-smith-dictionaries-neuu/entries.jsonl"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"supported_future_types": [
|
||||||
|
"maps",
|
||||||
|
"timeline",
|
||||||
|
"person_place_index"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"source": {
|
||||||
|
"provider": "NEUU Bible Dictionary Dataset",
|
||||||
|
"url": "https://github.com/neuu-org/bible-dictionary-dataset",
|
||||||
|
"download_url": "https://raw.githubusercontent.com/neuu-org/bible-dictionary-dataset/main/data/01_parsed/_index.json",
|
||||||
|
"format": "github-raw-json-index",
|
||||||
|
"upstream_id": "neuu-org/bible-dictionary-dataset",
|
||||||
|
"upstream_last_updated": "2026-07-12",
|
||||||
|
"available_formats": [
|
||||||
|
"json"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"license": {
|
||||||
|
"name": "CC BY 4.0 dataset; original dictionaries public domain",
|
||||||
|
"redistribution": true,
|
||||||
|
"source_license_url": "https://github.com/neuu-org/bible-dictionary-dataset",
|
||||||
|
"attribution": "Parsed dataset by NEUU. Original public-domain sources include Easton's Bible Dictionary and Smith's Bible Dictionary.",
|
||||||
|
"restricted_notes": "Preserve NEUU dataset attribution and CC BY 4.0 notice."
|
||||||
|
},
|
||||||
|
"catalog_display": {
|
||||||
|
"primary_features": [
|
||||||
|
"English Bible dictionary entries",
|
||||||
|
"Dictionary scripture references"
|
||||||
|
],
|
||||||
|
"summary": "Merged Easton's and Smith's Bible dictionary entries normalized by English term for margin lookup and study references."
|
||||||
|
},
|
||||||
|
"package_path": "packages/json/easton-smith-dictionaries-neuu/catalog.json",
|
||||||
|
"source_manifest_path": "sources/easton-smith-dictionaries-neuu.json",
|
||||||
|
"detail_doc_path": "docs/resources/easton-smith-dictionaries-neuu.md",
|
||||||
|
"counts": {
|
||||||
|
"entries": 5998,
|
||||||
|
"dictionary_entries": 5998,
|
||||||
|
"scripture_refs": 35089,
|
||||||
|
"source_entries": {
|
||||||
|
"EAS": 3962,
|
||||||
|
"SMI": 4561
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"files": {
|
||||||
|
"entries_jsonl": {
|
||||||
|
"path": "entries.jsonl",
|
||||||
|
"bytes": 7641121,
|
||||||
|
"sha256": "e0530558dd643296d1e44127762b86d4a663b00326727215ec96ba301a90e759"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"checks": {
|
||||||
|
"expected_sha256": "0105d59e4376ed21d34e04195636f752388d2ce9f62babf8a552b8ef1a917666",
|
||||||
|
"last_checked_at": "2026-07-12T15:58:00Z"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "kjv-eng-kjv2006",
|
"id": "kjv-eng-kjv2006",
|
||||||
"resource_type": "translation",
|
"resource_type": "translation",
|
||||||
@@ -244,6 +372,118 @@
|
|||||||
"last_checked_at": "2026-07-12T02:18:30Z"
|
"last_checked_at": "2026-07-12T02:18:30Z"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "matthew-henry-concise-ccel",
|
||||||
|
"resource_type": "commentary",
|
||||||
|
"title": "Matthew Henry's Concise Commentary on the Bible",
|
||||||
|
"short_title": "Matthew Henry Concise Commentary",
|
||||||
|
"abbreviation": "MHCC",
|
||||||
|
"alternate_ids": [
|
||||||
|
"ccel/henry/mhcc"
|
||||||
|
],
|
||||||
|
"language": {
|
||||||
|
"code": "eng",
|
||||||
|
"name": "English"
|
||||||
|
},
|
||||||
|
"script": "Latn",
|
||||||
|
"canon": {
|
||||||
|
"scope": "whole-bible",
|
||||||
|
"notes": "Concise commentary covering Old and New Testament books."
|
||||||
|
},
|
||||||
|
"contributors": [
|
||||||
|
{
|
||||||
|
"name": "Matthew Henry",
|
||||||
|
"role": "original author"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Christian Classics Ethereal Library",
|
||||||
|
"role": "digital text provider"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"features": [
|
||||||
|
{
|
||||||
|
"id": "verse-range-commentary",
|
||||||
|
"type": "commentary",
|
||||||
|
"label": "Verse-range commentary",
|
||||||
|
"languages": [
|
||||||
|
"eng"
|
||||||
|
],
|
||||||
|
"embedded": true,
|
||||||
|
"package": "packages/json/matthew-henry-concise-ccel/commentary.jsonl"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"attachments": {
|
||||||
|
"included": [
|
||||||
|
{
|
||||||
|
"id": "mhcc-verse-range-commentary",
|
||||||
|
"resource_type": "commentary",
|
||||||
|
"label": "Matthew Henry concise commentary",
|
||||||
|
"relationship": "verse-range-to-commentary",
|
||||||
|
"anchor_types": [
|
||||||
|
"book",
|
||||||
|
"chapter",
|
||||||
|
"verse_range"
|
||||||
|
],
|
||||||
|
"languages": [
|
||||||
|
"eng"
|
||||||
|
],
|
||||||
|
"source": "CCEL text edition of Matthew Henry's Concise Commentary.",
|
||||||
|
"package": "packages/json/matthew-henry-concise-ccel/commentary.jsonl"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"supported_future_types": [
|
||||||
|
"study_notes",
|
||||||
|
"cross_references"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"source": {
|
||||||
|
"provider": "Christian Classics Ethereal Library",
|
||||||
|
"url": "https://www.ccel.org/ccel/henry/mhcc.html",
|
||||||
|
"download_url": "https://www.ccel.org/ccel/h/henry/mhcc/cache/mhcc.txt",
|
||||||
|
"format": "plain-text",
|
||||||
|
"upstream_id": "henry/mhcc",
|
||||||
|
"upstream_last_updated": "2001-06-20",
|
||||||
|
"available_formats": [
|
||||||
|
"html",
|
||||||
|
"xml",
|
||||||
|
"text",
|
||||||
|
"pdf",
|
||||||
|
"epub"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"license": {
|
||||||
|
"name": "Public Domain",
|
||||||
|
"redistribution": true,
|
||||||
|
"source_license_url": "https://www.ccel.org/ccel/h/henry/mhcc/cache/mhcc.txt",
|
||||||
|
"attribution": "Matthew Henry's Concise Commentary on the Bible, digital text from Christian Classics Ethereal Library.",
|
||||||
|
"restricted_notes": "Preserve CCEL attribution for the digital source."
|
||||||
|
},
|
||||||
|
"catalog_display": {
|
||||||
|
"primary_features": [
|
||||||
|
"Verse-range commentary"
|
||||||
|
],
|
||||||
|
"summary": "Public-domain concise whole-Bible commentary by Matthew Henry, normalized into book/chapter/verse-range entries."
|
||||||
|
},
|
||||||
|
"package_path": "packages/json/matthew-henry-concise-ccel/catalog.json",
|
||||||
|
"source_manifest_path": "sources/matthew-henry-concise-ccel.json",
|
||||||
|
"detail_doc_path": "docs/resources/matthew-henry-concise-ccel.md",
|
||||||
|
"counts": {
|
||||||
|
"entries": 3930,
|
||||||
|
"commentary_entries": 3930,
|
||||||
|
"books": 66
|
||||||
|
},
|
||||||
|
"files": {
|
||||||
|
"commentary_jsonl": {
|
||||||
|
"path": "commentary.jsonl",
|
||||||
|
"bytes": 4462245,
|
||||||
|
"sha256": "897845ce215601932381d981592ac5e1eb1d3adfb753af1b1e695cb318401119"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"checks": {
|
||||||
|
"expected_sha256": "7af7f0feef2a8522263d48825a170125f4c421d14250212d83db6aef6d4f5269",
|
||||||
|
"last_checked_at": "2026-07-12T15:58:00Z"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "strongs-open-scriptures",
|
"id": "strongs-open-scriptures",
|
||||||
"resource_type": "lexicon",
|
"resource_type": "lexicon",
|
||||||
|
|||||||
@@ -0,0 +1,135 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "librebible.resource-catalog.v1",
|
||||||
|
"project": "LibreBible",
|
||||||
|
"id": "easton-smith-dictionaries-neuu",
|
||||||
|
"resource_type": "dictionary",
|
||||||
|
"title": "Easton's and Smith's Bible Dictionaries",
|
||||||
|
"short_title": "Easton / Smith Bible Dictionaries",
|
||||||
|
"abbreviation": "EAS/SMI",
|
||||||
|
"alternate_ids": [
|
||||||
|
"neuu-org/bible-dictionary-dataset"
|
||||||
|
],
|
||||||
|
"language": {
|
||||||
|
"code": "eng",
|
||||||
|
"name": "English"
|
||||||
|
},
|
||||||
|
"script": "Latn",
|
||||||
|
"canon": {
|
||||||
|
"scope": "reference",
|
||||||
|
"notes": "Bible dictionary entries keyed by English term, with scripture references where present."
|
||||||
|
},
|
||||||
|
"contributors": [
|
||||||
|
{
|
||||||
|
"name": "M. G. Easton",
|
||||||
|
"role": "Easton's Bible Dictionary original author"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "William Smith",
|
||||||
|
"role": "Smith's Bible Dictionary original editor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "NEUU",
|
||||||
|
"role": "parsed dataset maintainer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"features": [
|
||||||
|
{
|
||||||
|
"id": "english-bible-dictionary",
|
||||||
|
"type": "dictionary",
|
||||||
|
"label": "English Bible dictionary entries",
|
||||||
|
"languages": [
|
||||||
|
"eng"
|
||||||
|
],
|
||||||
|
"embedded": true,
|
||||||
|
"package": "packages/json/easton-smith-dictionaries-neuu/entries.jsonl"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "dictionary-scripture-references",
|
||||||
|
"type": "cross_references",
|
||||||
|
"label": "Dictionary scripture references",
|
||||||
|
"languages": [
|
||||||
|
"eng"
|
||||||
|
],
|
||||||
|
"embedded": true,
|
||||||
|
"package": "packages/json/easton-smith-dictionaries-neuu/entries.jsonl"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"attachments": {
|
||||||
|
"included": [
|
||||||
|
{
|
||||||
|
"id": "easton-smith-term-definitions",
|
||||||
|
"resource_type": "dictionary",
|
||||||
|
"label": "English term definitions",
|
||||||
|
"relationship": "english-term-to-dictionary-entry",
|
||||||
|
"anchor_types": [
|
||||||
|
"word",
|
||||||
|
"term",
|
||||||
|
"scripture_reference"
|
||||||
|
],
|
||||||
|
"languages": [
|
||||||
|
"eng"
|
||||||
|
],
|
||||||
|
"source": "NEUU parsed dataset built from public-domain Easton's and Smith's Bible dictionaries.",
|
||||||
|
"package": "packages/json/easton-smith-dictionaries-neuu/entries.jsonl"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"supported_future_types": [
|
||||||
|
"maps",
|
||||||
|
"timeline",
|
||||||
|
"person_place_index"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"source": {
|
||||||
|
"provider": "NEUU Bible Dictionary Dataset",
|
||||||
|
"url": "https://github.com/neuu-org/bible-dictionary-dataset",
|
||||||
|
"download_url": "https://raw.githubusercontent.com/neuu-org/bible-dictionary-dataset/main/data/01_parsed/_index.json",
|
||||||
|
"format": "github-raw-json-index",
|
||||||
|
"upstream_id": "neuu-org/bible-dictionary-dataset",
|
||||||
|
"upstream_last_updated": "2026-07-12",
|
||||||
|
"available_formats": [
|
||||||
|
"json"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"license": {
|
||||||
|
"name": "CC BY 4.0 dataset; original dictionaries public domain",
|
||||||
|
"redistribution": true,
|
||||||
|
"source_license_url": "https://github.com/neuu-org/bible-dictionary-dataset",
|
||||||
|
"attribution": "Parsed dataset by NEUU. Original public-domain sources include Easton's Bible Dictionary and Smith's Bible Dictionary.",
|
||||||
|
"restricted_notes": "Preserve NEUU dataset attribution and CC BY 4.0 notice."
|
||||||
|
},
|
||||||
|
"catalog_display": {
|
||||||
|
"primary_features": [
|
||||||
|
"English Bible dictionary entries",
|
||||||
|
"Dictionary scripture references"
|
||||||
|
],
|
||||||
|
"summary": "Merged Easton's and Smith's Bible dictionary entries normalized by English term for margin lookup and study references."
|
||||||
|
},
|
||||||
|
"importer": {
|
||||||
|
"name": "scripts/import-neuu-dictionaries.js",
|
||||||
|
"version": "0.1.0"
|
||||||
|
},
|
||||||
|
"source_manifest_file": "easton-smith-dictionaries-neuu.json",
|
||||||
|
"generated_at": "2026-07-12T15:24:50.122Z",
|
||||||
|
"source_sha256": "0105d59e4376ed21d34e04195636f752388d2ce9f62babf8a552b8ef1a917666",
|
||||||
|
"combined_source_sha256": "cf963f673d11af66d379a854d7f439b82fd4fbd377936750c6f214e70392c917",
|
||||||
|
"checks": {
|
||||||
|
"expected_sha256": "0105d59e4376ed21d34e04195636f752388d2ce9f62babf8a552b8ef1a917666",
|
||||||
|
"last_checked_at": "2026-07-12T15:58:00Z"
|
||||||
|
},
|
||||||
|
"counts": {
|
||||||
|
"entries": 5998,
|
||||||
|
"dictionary_entries": 5998,
|
||||||
|
"scripture_refs": 35089,
|
||||||
|
"source_entries": {
|
||||||
|
"EAS": 3962,
|
||||||
|
"SMI": 4561
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"files": {
|
||||||
|
"entries_jsonl": {
|
||||||
|
"path": "entries.jsonl",
|
||||||
|
"bytes": 7641121,
|
||||||
|
"sha256": "e0530558dd643296d1e44127762b86d4a663b00326727215ec96ba301a90e759"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because one or more lines are too long
@@ -214,7 +214,7 @@
|
|||||||
"name": "scripts/import-usfm.js",
|
"name": "scripts/import-usfm.js",
|
||||||
"version": "0.1.0"
|
"version": "0.1.0"
|
||||||
},
|
},
|
||||||
"generated_at": "2026-07-12T14:08:28.582Z",
|
"generated_at": "2026-07-12T15:24:45.357Z",
|
||||||
"source_sha256": "4ea6952590d070bfa22985aded48a49581e31b568a60aa09e25f73462e700e7d",
|
"source_sha256": "4ea6952590d070bfa22985aded48a49581e31b568a60aa09e25f73462e700e7d",
|
||||||
"checks": {
|
"checks": {
|
||||||
"expected_sha256": "4ea6952590d070bfa22985aded48a49581e31b568a60aa09e25f73462e700e7d",
|
"expected_sha256": "4ea6952590d070bfa22985aded48a49581e31b568a60aa09e25f73462e700e7d",
|
||||||
|
|||||||
@@ -0,0 +1,118 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "librebible.resource-catalog.v1",
|
||||||
|
"project": "LibreBible",
|
||||||
|
"id": "matthew-henry-concise-ccel",
|
||||||
|
"resource_type": "commentary",
|
||||||
|
"title": "Matthew Henry's Concise Commentary on the Bible",
|
||||||
|
"short_title": "Matthew Henry Concise Commentary",
|
||||||
|
"abbreviation": "MHCC",
|
||||||
|
"alternate_ids": [
|
||||||
|
"ccel/henry/mhcc"
|
||||||
|
],
|
||||||
|
"language": {
|
||||||
|
"code": "eng",
|
||||||
|
"name": "English"
|
||||||
|
},
|
||||||
|
"script": "Latn",
|
||||||
|
"canon": {
|
||||||
|
"scope": "whole-bible",
|
||||||
|
"notes": "Concise commentary covering Old and New Testament books."
|
||||||
|
},
|
||||||
|
"contributors": [
|
||||||
|
{
|
||||||
|
"name": "Matthew Henry",
|
||||||
|
"role": "original author"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Christian Classics Ethereal Library",
|
||||||
|
"role": "digital text provider"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"features": [
|
||||||
|
{
|
||||||
|
"id": "verse-range-commentary",
|
||||||
|
"type": "commentary",
|
||||||
|
"label": "Verse-range commentary",
|
||||||
|
"languages": [
|
||||||
|
"eng"
|
||||||
|
],
|
||||||
|
"embedded": true,
|
||||||
|
"package": "packages/json/matthew-henry-concise-ccel/commentary.jsonl"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"attachments": {
|
||||||
|
"included": [
|
||||||
|
{
|
||||||
|
"id": "mhcc-verse-range-commentary",
|
||||||
|
"resource_type": "commentary",
|
||||||
|
"label": "Matthew Henry concise commentary",
|
||||||
|
"relationship": "verse-range-to-commentary",
|
||||||
|
"anchor_types": [
|
||||||
|
"book",
|
||||||
|
"chapter",
|
||||||
|
"verse_range"
|
||||||
|
],
|
||||||
|
"languages": [
|
||||||
|
"eng"
|
||||||
|
],
|
||||||
|
"source": "CCEL text edition of Matthew Henry's Concise Commentary.",
|
||||||
|
"package": "packages/json/matthew-henry-concise-ccel/commentary.jsonl"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"supported_future_types": [
|
||||||
|
"study_notes",
|
||||||
|
"cross_references"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"source": {
|
||||||
|
"provider": "Christian Classics Ethereal Library",
|
||||||
|
"url": "https://www.ccel.org/ccel/henry/mhcc.html",
|
||||||
|
"download_url": "https://www.ccel.org/ccel/h/henry/mhcc/cache/mhcc.txt",
|
||||||
|
"format": "plain-text",
|
||||||
|
"upstream_id": "henry/mhcc",
|
||||||
|
"upstream_last_updated": "2001-06-20",
|
||||||
|
"available_formats": [
|
||||||
|
"html",
|
||||||
|
"xml",
|
||||||
|
"text",
|
||||||
|
"pdf",
|
||||||
|
"epub"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"license": {
|
||||||
|
"name": "Public Domain",
|
||||||
|
"redistribution": true,
|
||||||
|
"source_license_url": "https://www.ccel.org/ccel/h/henry/mhcc/cache/mhcc.txt",
|
||||||
|
"attribution": "Matthew Henry's Concise Commentary on the Bible, digital text from Christian Classics Ethereal Library.",
|
||||||
|
"restricted_notes": "Preserve CCEL attribution for the digital source."
|
||||||
|
},
|
||||||
|
"catalog_display": {
|
||||||
|
"primary_features": [
|
||||||
|
"Verse-range commentary"
|
||||||
|
],
|
||||||
|
"summary": "Public-domain concise whole-Bible commentary by Matthew Henry, normalized into book/chapter/verse-range entries."
|
||||||
|
},
|
||||||
|
"importer": {
|
||||||
|
"name": "scripts/import-mhcc.js",
|
||||||
|
"version": "0.1.0"
|
||||||
|
},
|
||||||
|
"source_manifest_file": "matthew-henry-concise-ccel.json",
|
||||||
|
"generated_at": "2026-07-12T15:24:47.876Z",
|
||||||
|
"source_sha256": "7af7f0feef2a8522263d48825a170125f4c421d14250212d83db6aef6d4f5269",
|
||||||
|
"checks": {
|
||||||
|
"expected_sha256": "7af7f0feef2a8522263d48825a170125f4c421d14250212d83db6aef6d4f5269",
|
||||||
|
"last_checked_at": "2026-07-12T15:58:00Z"
|
||||||
|
},
|
||||||
|
"counts": {
|
||||||
|
"entries": 3930,
|
||||||
|
"commentary_entries": 3930,
|
||||||
|
"books": 66
|
||||||
|
},
|
||||||
|
"files": {
|
||||||
|
"commentary_jsonl": {
|
||||||
|
"path": "commentary.jsonl",
|
||||||
|
"bytes": 4462245,
|
||||||
|
"sha256": "897845ce215601932381d981592ac5e1eb1d3adfb753af1b1e695cb318401119"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because one or more lines are too long
@@ -135,7 +135,7 @@
|
|||||||
"version": "0.1.0"
|
"version": "0.1.0"
|
||||||
},
|
},
|
||||||
"source_manifest_file": "strongs-open-scriptures.json",
|
"source_manifest_file": "strongs-open-scriptures.json",
|
||||||
"generated_at": "2026-07-12T14:08:30.649Z",
|
"generated_at": "2026-07-12T15:24:46.709Z",
|
||||||
"source_sha256": "04a2d6d0a13d75f17e562998bba7491beeed5a149909f904d12dd80aa1e47037",
|
"source_sha256": "04a2d6d0a13d75f17e562998bba7491beeed5a149909f904d12dd80aa1e47037",
|
||||||
"checks": {
|
"checks": {
|
||||||
"expected_sha256": "04a2d6d0a13d75f17e562998bba7491beeed5a149909f904d12dd80aa1e47037",
|
"expected_sha256": "04a2d6d0a13d75f17e562998bba7491beeed5a149909f904d12dd80aa1e47037",
|
||||||
|
|||||||
@@ -0,0 +1,254 @@
|
|||||||
|
import { mkdir, readFile, writeFile } from 'node:fs/promises'
|
||||||
|
import path from 'node:path'
|
||||||
|
import { downloadFile, readJson, sha256File, writeJson } from './lib.js'
|
||||||
|
|
||||||
|
const manifestPath = process.argv[2]
|
||||||
|
if (!manifestPath) {
|
||||||
|
console.error('Usage: node scripts/import-mhcc.js sources/<manifest>.json')
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
const root = process.cwd()
|
||||||
|
const manifest = await readJson(path.resolve(root, manifestPath))
|
||||||
|
const sourcePath = path.join(root, 'cache', manifest.id, path.basename(manifest.source.download_url))
|
||||||
|
const packageDir = path.join(root, 'packages', 'json', manifest.id)
|
||||||
|
|
||||||
|
const bibleBooks = [
|
||||||
|
'Genesis',
|
||||||
|
'Exodus',
|
||||||
|
'Leviticus',
|
||||||
|
'Numbers',
|
||||||
|
'Deuteronomy',
|
||||||
|
'Joshua',
|
||||||
|
'Judges',
|
||||||
|
'Ruth',
|
||||||
|
'1 Samuel',
|
||||||
|
'2 Samuel',
|
||||||
|
'1 Kings',
|
||||||
|
'2 Kings',
|
||||||
|
'1 Chronicles',
|
||||||
|
'2 Chronicles',
|
||||||
|
'Ezra',
|
||||||
|
'Nehemiah',
|
||||||
|
'Esther',
|
||||||
|
'Job',
|
||||||
|
'Psalms',
|
||||||
|
'Proverbs',
|
||||||
|
'Ecclesiastes',
|
||||||
|
'Song of Solomon',
|
||||||
|
'Isaiah',
|
||||||
|
'Jeremiah',
|
||||||
|
'Lamentations',
|
||||||
|
'Ezekiel',
|
||||||
|
'Daniel',
|
||||||
|
'Hosea',
|
||||||
|
'Joel',
|
||||||
|
'Amos',
|
||||||
|
'Obadiah',
|
||||||
|
'Jonah',
|
||||||
|
'Micah',
|
||||||
|
'Nahum',
|
||||||
|
'Habakkuk',
|
||||||
|
'Zephaniah',
|
||||||
|
'Haggai',
|
||||||
|
'Zechariah',
|
||||||
|
'Malachi',
|
||||||
|
'Matthew',
|
||||||
|
'Mark',
|
||||||
|
'Luke',
|
||||||
|
'John',
|
||||||
|
'Acts',
|
||||||
|
'Romans',
|
||||||
|
'1 Corinthians',
|
||||||
|
'2 Corinthians',
|
||||||
|
'Galatians',
|
||||||
|
'Ephesians',
|
||||||
|
'Philippians',
|
||||||
|
'Colossians',
|
||||||
|
'1 Thessalonians',
|
||||||
|
'2 Thessalonians',
|
||||||
|
'1 Timothy',
|
||||||
|
'2 Timothy',
|
||||||
|
'Titus',
|
||||||
|
'Philemon',
|
||||||
|
'Hebrews',
|
||||||
|
'James',
|
||||||
|
'1 Peter',
|
||||||
|
'2 Peter',
|
||||||
|
'1 John',
|
||||||
|
'2 John',
|
||||||
|
'3 John',
|
||||||
|
'Jude',
|
||||||
|
'Revelation',
|
||||||
|
]
|
||||||
|
const bibleBookSet = new Set(bibleBooks)
|
||||||
|
|
||||||
|
await downloadFile(manifest.source.download_url, sourcePath)
|
||||||
|
const sourceSha = await sha256File(sourcePath)
|
||||||
|
if (sourceSha !== manifest.checks.expected_sha256.toLowerCase()) {
|
||||||
|
throw new Error(`${manifest.id}: source checksum mismatch. Expected ${manifest.checks.expected_sha256}, got ${sourceSha}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const source = await readFile(sourcePath, 'utf8')
|
||||||
|
const entries = parseCommentary(source)
|
||||||
|
|
||||||
|
await mkdir(packageDir, { recursive: true })
|
||||||
|
await writeJsonl(path.join(packageDir, 'commentary.jsonl'), entries)
|
||||||
|
|
||||||
|
const files = {
|
||||||
|
commentary_jsonl: await fileInfo(path.join(packageDir, 'commentary.jsonl')),
|
||||||
|
}
|
||||||
|
|
||||||
|
await writeJson(path.join(packageDir, 'catalog.json'), {
|
||||||
|
schema_version: 'librebible.resource-catalog.v1',
|
||||||
|
project: manifest.project_name ?? 'LibreBible',
|
||||||
|
id: manifest.id,
|
||||||
|
resource_type: manifest.resource_type,
|
||||||
|
title: manifest.title,
|
||||||
|
short_title: manifest.short_title,
|
||||||
|
abbreviation: manifest.abbreviation,
|
||||||
|
alternate_ids: manifest.alternate_ids ?? [],
|
||||||
|
language: manifest.language,
|
||||||
|
script: manifest.script,
|
||||||
|
canon: manifest.canon,
|
||||||
|
contributors: manifest.contributors ?? [],
|
||||||
|
features: manifest.features ?? [],
|
||||||
|
attachments: manifest.attachments ?? {},
|
||||||
|
source: manifest.source,
|
||||||
|
license: manifest.license,
|
||||||
|
catalog_display: manifest.catalog_display,
|
||||||
|
importer: manifest.importer,
|
||||||
|
source_manifest_file: path.basename(manifestPath),
|
||||||
|
generated_at: new Date().toISOString(),
|
||||||
|
source_sha256: sourceSha,
|
||||||
|
checks: manifest.checks,
|
||||||
|
counts: {
|
||||||
|
entries: entries.length,
|
||||||
|
commentary_entries: entries.length,
|
||||||
|
books: new Set(entries.map((entry) => entry.book)).size,
|
||||||
|
},
|
||||||
|
files,
|
||||||
|
})
|
||||||
|
|
||||||
|
console.log(`${manifest.id}: imported ${entries.length} commentary entries`)
|
||||||
|
|
||||||
|
function parseCommentary(source) {
|
||||||
|
const lines = source.replace(/\r\n/g, '\n').split('\n')
|
||||||
|
const entries = []
|
||||||
|
let currentBook = null
|
||||||
|
let currentChapter = null
|
||||||
|
let currentRange = null
|
||||||
|
let buffer = []
|
||||||
|
|
||||||
|
function flush() {
|
||||||
|
if (!currentBook || !currentChapter || !currentRange || buffer.length === 0) return
|
||||||
|
const text = cleanParagraph(buffer.join(' '))
|
||||||
|
if (!text) return
|
||||||
|
entries.push({
|
||||||
|
id: `mhcc:${slug(currentBook)}:${currentChapter}:${currentRange.start}-${currentRange.end}`,
|
||||||
|
resource_id: 'matthew-henry-concise-ccel',
|
||||||
|
source: 'Matthew Henry Concise Commentary',
|
||||||
|
book: currentBook,
|
||||||
|
chapter: currentChapter,
|
||||||
|
verse_start: currentRange.start,
|
||||||
|
verse_end: currentRange.end,
|
||||||
|
reference: `${currentBook} ${currentChapter}:${currentRange.start}${currentRange.end !== currentRange.start ? `-${currentRange.end}` : ''}`,
|
||||||
|
title: `${currentBook} ${currentChapter}:${currentRange.start}${currentRange.end !== currentRange.start ? `-${currentRange.end}` : ''}`,
|
||||||
|
text,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const rawLine of lines) {
|
||||||
|
const line = rawLine.trim()
|
||||||
|
if (!line || /^_+$/.test(line) || line === 'Chapter Outline') continue
|
||||||
|
|
||||||
|
if (bibleBookSet.has(line)) {
|
||||||
|
flush()
|
||||||
|
currentBook = line
|
||||||
|
currentChapter = null
|
||||||
|
currentRange = null
|
||||||
|
buffer = []
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
const chapterMatch = /^Chapter\s+(\d+)$/i.exec(line)
|
||||||
|
if (chapterMatch && currentBook) {
|
||||||
|
flush()
|
||||||
|
currentChapter = Number(chapterMatch[1])
|
||||||
|
currentRange = null
|
||||||
|
buffer = []
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
const range = parseVerseRange(line)
|
||||||
|
if (range && currentBook && currentChapter) {
|
||||||
|
flush()
|
||||||
|
currentRange = range
|
||||||
|
buffer = []
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
const inlineRange = parseInlineReferenceRange(line, currentChapter)
|
||||||
|
if (inlineRange && currentBook && currentChapter) {
|
||||||
|
flush()
|
||||||
|
currentRange = inlineRange.range
|
||||||
|
buffer = inlineRange.text ? [inlineRange.text] : []
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentBook && currentChapter && currentRange) {
|
||||||
|
buffer.push(line)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
flush()
|
||||||
|
return entries
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseVerseRange(line) {
|
||||||
|
const match = /^Verses?\s+(.+)$/i.exec(line)
|
||||||
|
if (!match) return null
|
||||||
|
const numbers = [...match[1].matchAll(/\d+/g)].map((item) => Number(item[0]))
|
||||||
|
if (!numbers.length) return null
|
||||||
|
return {
|
||||||
|
start: numbers[0],
|
||||||
|
end: numbers[numbers.length - 1],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseInlineReferenceRange(line, currentChapter) {
|
||||||
|
const match = /^(?:[1-3]\s*)?[A-Z][A-Za-z.]+\s+(\d+):(\d+)(?:-(\d+))?\s*(.*)$/.exec(line)
|
||||||
|
if (!match) return null
|
||||||
|
const chapter = Number(match[1])
|
||||||
|
if (chapter !== currentChapter) return null
|
||||||
|
const start = Number(match[2])
|
||||||
|
const end = match[3] ? Number(match[3]) : start
|
||||||
|
return {
|
||||||
|
range: { start, end },
|
||||||
|
text: match[4]?.trim() ?? '',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function cleanParagraph(value) {
|
||||||
|
return value
|
||||||
|
.replace(/\s+/g, ' ')
|
||||||
|
.replace(/\s+([,.;:?!])/g, '$1')
|
||||||
|
.trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
function slug(value) {
|
||||||
|
return value.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')
|
||||||
|
}
|
||||||
|
|
||||||
|
async function writeJsonl(filePath, rows) {
|
||||||
|
await writeFile(filePath, `${rows.map((row) => JSON.stringify(row)).join('\n')}\n`, 'utf8')
|
||||||
|
}
|
||||||
|
|
||||||
|
async function fileInfo(filePath) {
|
||||||
|
const data = await readFile(filePath)
|
||||||
|
return {
|
||||||
|
path: path.basename(filePath),
|
||||||
|
bytes: data.length,
|
||||||
|
sha256: await sha256File(filePath),
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
import { createHash } from 'node:crypto'
|
||||||
|
import { mkdir, readFile, writeFile } from 'node:fs/promises'
|
||||||
|
import path from 'node:path'
|
||||||
|
import { downloadFile, readJson, sha256File, writeJson } from './lib.js'
|
||||||
|
|
||||||
|
const manifestPath = process.argv[2]
|
||||||
|
if (!manifestPath) {
|
||||||
|
console.error('Usage: node scripts/import-neuu-dictionaries.js sources/<manifest>.json')
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
const root = process.cwd()
|
||||||
|
const manifest = await readJson(path.resolve(root, manifestPath))
|
||||||
|
const indexPath = path.join(root, 'cache', manifest.id, path.basename(manifest.source.download_url))
|
||||||
|
const packageDir = path.join(root, 'packages', 'json', manifest.id)
|
||||||
|
|
||||||
|
await downloadFile(manifest.source.download_url, indexPath)
|
||||||
|
const indexSha = await sha256File(indexPath)
|
||||||
|
if (indexSha !== manifest.checks.expected_sha256.toLowerCase()) {
|
||||||
|
throw new Error(`${manifest.id}: source checksum mismatch. Expected ${manifest.checks.expected_sha256}, got ${indexSha}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const index = await readJson(indexPath)
|
||||||
|
const entries = []
|
||||||
|
const combinedHash = createHash('sha256')
|
||||||
|
|
||||||
|
for (const file of index.files) {
|
||||||
|
const url = new URL(file, manifest.source.download_url).toString()
|
||||||
|
const data = await fetchJson(url)
|
||||||
|
combinedHash.update(JSON.stringify(data))
|
||||||
|
|
||||||
|
for (const [key, entry] of Object.entries(data)) {
|
||||||
|
entries.push({
|
||||||
|
id: `easton-smith:${entry.slug ?? slug(key)}`,
|
||||||
|
resource_id: manifest.id,
|
||||||
|
term: entry.name ?? key,
|
||||||
|
slug: entry.slug ?? slug(key),
|
||||||
|
definitions: (entry.definitions ?? []).map((definition) => ({
|
||||||
|
source: definition.source,
|
||||||
|
source_name: index.source_names?.[definition.source] ?? definition.source,
|
||||||
|
text: cleanText(definition.text),
|
||||||
|
})),
|
||||||
|
scripture_refs: entry.scripture_refs ?? [],
|
||||||
|
sources: entry.sources ?? [],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
entries.sort((a, b) => a.term.localeCompare(b.term))
|
||||||
|
|
||||||
|
await mkdir(packageDir, { recursive: true })
|
||||||
|
await writeJsonl(path.join(packageDir, 'entries.jsonl'), entries)
|
||||||
|
|
||||||
|
const sourceCounts = {}
|
||||||
|
for (const entry of entries) {
|
||||||
|
for (const source of entry.sources) {
|
||||||
|
sourceCounts[source] = (sourceCounts[source] ?? 0) + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const files = {
|
||||||
|
entries_jsonl: await fileInfo(path.join(packageDir, 'entries.jsonl')),
|
||||||
|
}
|
||||||
|
|
||||||
|
await writeJson(path.join(packageDir, 'catalog.json'), {
|
||||||
|
schema_version: 'librebible.resource-catalog.v1',
|
||||||
|
project: manifest.project_name ?? 'LibreBible',
|
||||||
|
id: manifest.id,
|
||||||
|
resource_type: manifest.resource_type,
|
||||||
|
title: manifest.title,
|
||||||
|
short_title: manifest.short_title,
|
||||||
|
abbreviation: manifest.abbreviation,
|
||||||
|
alternate_ids: manifest.alternate_ids ?? [],
|
||||||
|
language: manifest.language,
|
||||||
|
script: manifest.script,
|
||||||
|
canon: manifest.canon,
|
||||||
|
contributors: manifest.contributors ?? [],
|
||||||
|
features: manifest.features ?? [],
|
||||||
|
attachments: manifest.attachments ?? {},
|
||||||
|
source: manifest.source,
|
||||||
|
license: manifest.license,
|
||||||
|
catalog_display: manifest.catalog_display,
|
||||||
|
importer: manifest.importer,
|
||||||
|
source_manifest_file: path.basename(manifestPath),
|
||||||
|
generated_at: new Date().toISOString(),
|
||||||
|
source_sha256: indexSha,
|
||||||
|
combined_source_sha256: combinedHash.digest('hex'),
|
||||||
|
checks: manifest.checks,
|
||||||
|
counts: {
|
||||||
|
entries: entries.length,
|
||||||
|
dictionary_entries: entries.length,
|
||||||
|
scripture_refs: entries.reduce((total, entry) => total + entry.scripture_refs.length, 0),
|
||||||
|
source_entries: sourceCounts,
|
||||||
|
},
|
||||||
|
files,
|
||||||
|
})
|
||||||
|
|
||||||
|
console.log(`${manifest.id}: imported ${entries.length} dictionary entries`)
|
||||||
|
|
||||||
|
async function fetchJson(url) {
|
||||||
|
const response = await fetch(url)
|
||||||
|
if (!response.ok) throw new Error(`Unable to load ${url}: ${response.status} ${response.statusText}`)
|
||||||
|
return response.json()
|
||||||
|
}
|
||||||
|
|
||||||
|
function cleanText(value) {
|
||||||
|
return String(value ?? '')
|
||||||
|
.replace(/“/g, '"')
|
||||||
|
.replace(/â€/g, '"')
|
||||||
|
.replace(/’/g, "'")
|
||||||
|
.replace(/‘/g, "'")
|
||||||
|
.replace(/—/g, '-')
|
||||||
|
.replace(/–/g, '-')
|
||||||
|
.replace(/…/g, '...')
|
||||||
|
.replace(/\s+/g, ' ')
|
||||||
|
.trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
function slug(value) {
|
||||||
|
return String(value).toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')
|
||||||
|
}
|
||||||
|
|
||||||
|
async function writeJsonl(filePath, rows) {
|
||||||
|
await writeFile(filePath, `${rows.map((row) => JSON.stringify(row)).join('\n')}\n`, 'utf8')
|
||||||
|
}
|
||||||
|
|
||||||
|
async function fileInfo(filePath) {
|
||||||
|
const data = await readFile(filePath)
|
||||||
|
return {
|
||||||
|
path: path.basename(filePath),
|
||||||
|
bytes: data.length,
|
||||||
|
sha256: await sha256File(filePath),
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,97 @@
|
|||||||
|
{
|
||||||
|
"id": "easton-smith-dictionaries-neuu",
|
||||||
|
"resource_type": "dictionary",
|
||||||
|
"project_name": "LibreBible",
|
||||||
|
"title": "Easton's and Smith's Bible Dictionaries",
|
||||||
|
"short_title": "Easton / Smith Bible Dictionaries",
|
||||||
|
"abbreviation": "EAS/SMI",
|
||||||
|
"alternate_ids": ["neuu-org/bible-dictionary-dataset"],
|
||||||
|
"language": {
|
||||||
|
"code": "eng",
|
||||||
|
"name": "English"
|
||||||
|
},
|
||||||
|
"script": "Latn",
|
||||||
|
"canon": {
|
||||||
|
"scope": "reference",
|
||||||
|
"notes": "Bible dictionary entries keyed by English term, with scripture references where present."
|
||||||
|
},
|
||||||
|
"contributors": [
|
||||||
|
{
|
||||||
|
"name": "M. G. Easton",
|
||||||
|
"role": "Easton's Bible Dictionary original author"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "William Smith",
|
||||||
|
"role": "Smith's Bible Dictionary original editor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "NEUU",
|
||||||
|
"role": "parsed dataset maintainer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"features": [
|
||||||
|
{
|
||||||
|
"id": "english-bible-dictionary",
|
||||||
|
"type": "dictionary",
|
||||||
|
"label": "English Bible dictionary entries",
|
||||||
|
"languages": ["eng"],
|
||||||
|
"embedded": true,
|
||||||
|
"package": "packages/json/easton-smith-dictionaries-neuu/entries.jsonl"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "dictionary-scripture-references",
|
||||||
|
"type": "cross_references",
|
||||||
|
"label": "Dictionary scripture references",
|
||||||
|
"languages": ["eng"],
|
||||||
|
"embedded": true,
|
||||||
|
"package": "packages/json/easton-smith-dictionaries-neuu/entries.jsonl"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"attachments": {
|
||||||
|
"included": [
|
||||||
|
{
|
||||||
|
"id": "easton-smith-term-definitions",
|
||||||
|
"resource_type": "dictionary",
|
||||||
|
"label": "English term definitions",
|
||||||
|
"relationship": "english-term-to-dictionary-entry",
|
||||||
|
"anchor_types": ["word", "term", "scripture_reference"],
|
||||||
|
"languages": ["eng"],
|
||||||
|
"source": "NEUU parsed dataset built from public-domain Easton's and Smith's Bible dictionaries.",
|
||||||
|
"package": "packages/json/easton-smith-dictionaries-neuu/entries.jsonl"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"supported_future_types": ["maps", "timeline", "person_place_index"]
|
||||||
|
},
|
||||||
|
"source": {
|
||||||
|
"provider": "NEUU Bible Dictionary Dataset",
|
||||||
|
"url": "https://github.com/neuu-org/bible-dictionary-dataset",
|
||||||
|
"download_url": "https://raw.githubusercontent.com/neuu-org/bible-dictionary-dataset/main/data/01_parsed/_index.json",
|
||||||
|
"format": "github-raw-json-index",
|
||||||
|
"upstream_id": "neuu-org/bible-dictionary-dataset",
|
||||||
|
"upstream_last_updated": "2026-07-12",
|
||||||
|
"available_formats": ["json"]
|
||||||
|
},
|
||||||
|
"license": {
|
||||||
|
"name": "CC BY 4.0 dataset; original dictionaries public domain",
|
||||||
|
"redistribution": true,
|
||||||
|
"source_license_url": "https://github.com/neuu-org/bible-dictionary-dataset",
|
||||||
|
"attribution": "Parsed dataset by NEUU. Original public-domain sources include Easton's Bible Dictionary and Smith's Bible Dictionary.",
|
||||||
|
"restricted_notes": "Preserve NEUU dataset attribution and CC BY 4.0 notice."
|
||||||
|
},
|
||||||
|
"checks": {
|
||||||
|
"expected_sha256": "0105d59e4376ed21d34e04195636f752388d2ce9f62babf8a552b8ef1a917666",
|
||||||
|
"last_checked_at": "2026-07-12T15:58:00Z"
|
||||||
|
},
|
||||||
|
"importer": {
|
||||||
|
"name": "scripts/import-neuu-dictionaries.js",
|
||||||
|
"version": "0.1.0"
|
||||||
|
},
|
||||||
|
"packages": {
|
||||||
|
"json_catalog": "packages/json/easton-smith-dictionaries-neuu/catalog.json",
|
||||||
|
"entries_jsonl": "packages/json/easton-smith-dictionaries-neuu/entries.jsonl"
|
||||||
|
},
|
||||||
|
"catalog_display": {
|
||||||
|
"primary_features": ["English Bible dictionary entries", "Dictionary scripture references"],
|
||||||
|
"summary": "Merged Easton's and Smith's Bible dictionary entries normalized by English term for margin lookup and study references."
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
{
|
||||||
|
"id": "matthew-henry-concise-ccel",
|
||||||
|
"resource_type": "commentary",
|
||||||
|
"project_name": "LibreBible",
|
||||||
|
"title": "Matthew Henry's Concise Commentary on the Bible",
|
||||||
|
"short_title": "Matthew Henry Concise Commentary",
|
||||||
|
"abbreviation": "MHCC",
|
||||||
|
"alternate_ids": ["ccel/henry/mhcc"],
|
||||||
|
"language": {
|
||||||
|
"code": "eng",
|
||||||
|
"name": "English"
|
||||||
|
},
|
||||||
|
"script": "Latn",
|
||||||
|
"canon": {
|
||||||
|
"scope": "whole-bible",
|
||||||
|
"notes": "Concise commentary covering Old and New Testament books."
|
||||||
|
},
|
||||||
|
"contributors": [
|
||||||
|
{
|
||||||
|
"name": "Matthew Henry",
|
||||||
|
"role": "original author"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Christian Classics Ethereal Library",
|
||||||
|
"role": "digital text provider"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"features": [
|
||||||
|
{
|
||||||
|
"id": "verse-range-commentary",
|
||||||
|
"type": "commentary",
|
||||||
|
"label": "Verse-range commentary",
|
||||||
|
"languages": ["eng"],
|
||||||
|
"embedded": true,
|
||||||
|
"package": "packages/json/matthew-henry-concise-ccel/commentary.jsonl"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"attachments": {
|
||||||
|
"included": [
|
||||||
|
{
|
||||||
|
"id": "mhcc-verse-range-commentary",
|
||||||
|
"resource_type": "commentary",
|
||||||
|
"label": "Matthew Henry concise commentary",
|
||||||
|
"relationship": "verse-range-to-commentary",
|
||||||
|
"anchor_types": ["book", "chapter", "verse_range"],
|
||||||
|
"languages": ["eng"],
|
||||||
|
"source": "CCEL text edition of Matthew Henry's Concise Commentary.",
|
||||||
|
"package": "packages/json/matthew-henry-concise-ccel/commentary.jsonl"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"supported_future_types": ["study_notes", "cross_references"]
|
||||||
|
},
|
||||||
|
"source": {
|
||||||
|
"provider": "Christian Classics Ethereal Library",
|
||||||
|
"url": "https://www.ccel.org/ccel/henry/mhcc.html",
|
||||||
|
"download_url": "https://www.ccel.org/ccel/h/henry/mhcc/cache/mhcc.txt",
|
||||||
|
"format": "plain-text",
|
||||||
|
"upstream_id": "henry/mhcc",
|
||||||
|
"upstream_last_updated": "2001-06-20",
|
||||||
|
"available_formats": ["html", "xml", "text", "pdf", "epub"]
|
||||||
|
},
|
||||||
|
"license": {
|
||||||
|
"name": "Public Domain",
|
||||||
|
"redistribution": true,
|
||||||
|
"source_license_url": "https://www.ccel.org/ccel/h/henry/mhcc/cache/mhcc.txt",
|
||||||
|
"attribution": "Matthew Henry's Concise Commentary on the Bible, digital text from Christian Classics Ethereal Library.",
|
||||||
|
"restricted_notes": "Preserve CCEL attribution for the digital source."
|
||||||
|
},
|
||||||
|
"checks": {
|
||||||
|
"expected_sha256": "7af7f0feef2a8522263d48825a170125f4c421d14250212d83db6aef6d4f5269",
|
||||||
|
"last_checked_at": "2026-07-12T15:58:00Z"
|
||||||
|
},
|
||||||
|
"importer": {
|
||||||
|
"name": "scripts/import-mhcc.js",
|
||||||
|
"version": "0.1.0"
|
||||||
|
},
|
||||||
|
"packages": {
|
||||||
|
"json_catalog": "packages/json/matthew-henry-concise-ccel/catalog.json",
|
||||||
|
"commentary_jsonl": "packages/json/matthew-henry-concise-ccel/commentary.jsonl"
|
||||||
|
},
|
||||||
|
"catalog_display": {
|
||||||
|
"primary_features": ["Verse-range commentary"],
|
||||||
|
"summary": "Public-domain concise whole-Bible commentary by Matthew Henry, normalized into book/chapter/verse-range entries."
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user