Skip to content
schmaredPublic

About

Greek (LXX-Rahlfs-1935 and SBLGNT) to English Exhaustive Interpretation

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

18 Commits

Folders and files

Repository files navigation

Exhaustive Interpretive Rendering

An exhaustive interpretation of the Greek scriptures, not a translation.

Every load-bearing word is opened to the full range its lexicon gives it and left open. No single English equivalent is chosen, because choosing one is where the meaning goes. It follows the intent of the Amplified Bible but carries it all the way through, with far more verbosity, to stop concepts falling out of the English.

The Old Testament is read from the Greek — the Septuagint, never the Masoretic Hebrew — so that when the New Testament quotes it, the quotation is visible on the page rather than buried in a footnote. Ἐν ἀρχῇ opens Genesis 1:1 and John 1:1 alike, and the reading text says so.

The editorial rules are in CLAUDE.md. This file covers how the thing is built.

What a verse produces

Four things, in this order:

  1. Greek — the source line, unmodified.
  2. Notes — lexical range, verbal aspect, grammar English can't reproduce, and Hebrew↔Greek divergences. Terse and factual; no devotional register.
  3. Unanchored — headwords removed entirely. The reader rebuilds the referent from the gloss-chain alone.
  4. Anchored — the unanchored text with a headword put before each chain: the first sense the lexicon gives, in the form the text uses. The chain follows in em dashes, shaded. Nothing else differs — both panels are generated from one source string — and the unshaded words alone read as a plain word-for-word rendering.

The rendered page shows the last three side by side, with the Greek above them and two controls: one closes the word spaces — scriptio continua, which is what a fourth-century reader actually met on the page — and one opens the word-by-word layer.

Base texts

edition where the Greek comes from
Old Testament Septuagint, Rahlfs 1935 transcribed from the printed edition — see below
New Testament SBLGNT sources/sblgnt/ (CC BY 4.0)

Quick start

Python 3, standard library only — no dependencies.

Rebuild the word-by-word layer from sources/ (only needed when a chapter's Greek changes; the result is committed):

python build/words.py

Build site/index.html from the data:

python build/render.py

Check a chapter before committing it:

python build/validate.py -v

Check the checks — each one fired at deliberately broken data:

python build/test_validate.py

Confirm the render still matches the baseline byte-for-byte:

python build/render.py --check reference/gold-standard.html

Layout

data/<BOOK>/<chapter>.json   source of truth — a JSON array, one object per verse
data/<BOOK>/<chapter>.morph.txt    the project's own morphology of an LXX chapter
data/<BOOK>/<chapter>.words.json   the word-by-word layer, generated by build/words.py
build/words.py               sources/ -> the word-by-word layer
build/render.py              data -> site/index.html
build/validate.py            mechanical checks; run before committing
build/test_validate.py       those checks, fired at broken data
build/morph_diff.py          two independent passes at a chapter's morphology, compared
templates/page.html          the page shell (masthead, CSS, controls, footer, script)
templates/verse.html         one verse section — the three-panel layout
site/                        generated output — never hand-edit
reference/gold-standard.html the rendering baseline; regenerate, don't edit
reference/lexicon-notes.md   recurring gloss-chains, reused verbatim across books
reference/second-pass-brief.md  the brief for a chapter's independent second morphology pass
sources/                     the Greek source editions (see Licensing below)
CLAUDE.md                    editorial conventions

Content lives in JSON and the HTML is generated. Nothing is hand-written per chapter — otherwise the conventions drift between files and can't be checked mechanically.

Verse schema

{
  "ref": "GEN 1:1",
  "greek": "Ἐν ἀρχῇ ἐποίησεν ὁ θεὸς τὸν οὐρανὸν καὶ τὴν γῆν.",
  "print": "Rahlfs 1935 (1950 printing), vol. I, p. 1",
  "hint": "The oldest manuscripts carry no spaces, no accents, no lower case.",
  "notes": [
    { "lemma": "ἐν ἀρχῇ", "flag": null, "text": "ἀρχή holds together two things…" },
    { "lemma": "ἐποίησεν", "flag": "divergence", "text": "Aorist of ποιέω…" }
  ],
  "reading": "[[in beginning|within, inside of, and by means of the first moment…]], [[the God|he who is God definitively…]], …",
  "names": []
}

flag is one of null, divergence, not in this text, name, variant.

print is required on Old Testament verses: the printed page the Greek was transcribed from.

Optional keys: notes_sub and banner override the per-book defaults in render.py; demo turns the section into a standalone convention demonstration (used for John 1:6, which is where the naming rule is shown, since none of the four prologue verses contains a proper name). speech lists words capitalised because they open direct speech — both editions do this, as in Rahlfs's Gen 1:3 εἶπεν ὁ θεός Γενηθήτω φῶς — so the names check does not take them for proper names.

Inline markup

Four conventions inside the JSON strings, all expanded in one place in render.py, so the data stays free of HTML:

written where becomes
[[headword|chain]] reading the chain alone in the unanchored panel; headword — chain —, shaded, in the anchored panel
[[name:Ἰωάννης]] reading the name span and its gloss, drawn from the verse's names list
[[flag]] notes the note's flag badge at that position — a note with a flag and no marker gets it prepended
*emphasis* anywhere <em>emphasis</em>

Both reading panels come from the one reading string, so the anchored text is always the unanchored text with the headwords added — the two cannot drift apart. Genesis 1:2 begins:

[[but|but, however, whereas, on the other hand]], [[the earth|the land, the dry
ground, the terrestrial realm]] was, and kept on being …

which renders as

Unanchored — But, however, whereas, on the other hand, the land, the dry ground, the terrestrial realm was, and kept on being …

Anchored — But — but, however, whereas, on the other hand — the earth — the land, the dry ground, the terrestrial realm — was, and kept on being …

The headword may repeat inside its chain, as but does here: the chain is the whole range and the headword is its first sense. The renderer's only changes are typographic: a comma or em dash straight after a unit becomes the chain's closing dash, no closing dash goes before . ; : ! ?, and a unit that opens a sentence is capitalised. The rules for what goes in a unit — headword from the lexicon, strict, literal, no filler — are in CLAUDE.md, and each headword's derivation is in reference/lexicon-notes.md.

Word by word

Under each Greek line, Word by word opens every word of the verse as a card:

  • the form, as the verse prints it
  • its dictionary form (lemma) — what a concordance files it under
  • its parse — part of speech, tense, voice, mood, person, number, case, gender
  • for a verb, what its tense means where English can't show it, in the fixed aspect wording
  • the opening senses of its Middle Liddell entry, in the lexicon's order, context-free

A concordance stops at the lemma; this takes the step after it, to what the particular form adds. build/words.py writes the layer into data/<BOOK>/<chapter>.words.json. The file is committed, so the site builds without the sources, and validate.py fails if a verse's Greek changes without the layer being rebuilt.

lemma and parse senses
Old Testament the project's own analysis, data/<BOOK>/<chapter>.morph.txt Middle Liddell (1889); LSJ (PerseusDL) where it has no entry
New Testament MorphGNT's analysis of the SBLGNT, in sources/morphgnt/ Middle Liddell (1889); LSJ where it has no entry

A .morph.txt file is one word per line in MorphGNT's code scheme, so both testaments read alike; the header of data/GEN/1.morph.txt explains the columns and the two codes added to record only what a form itself says.

The analysis is the project's own, and a local reference module is only a reference. Where the two differ deliberately, the line says so and why:

2:13 N- ----NSN- ὄνομα ὄνομα  # module ASN — verbless clause, as at 2:11 where the module has NSN

validate.py prints an annotated difference as a note rather than a failure, and fails if the difference a note claims is no longer there — so the annotations cannot quietly become a place to bury mistakes.

The repository is also its own reference. validate.py holds the morphology to itself across every chapter: a form keeps its dictionary form, a verb its parse and a noun its gender and number wherever they recur. Where a form genuinely reads two ways — ὃ the relative at 2:19, ὅ the article at 2:25 — the line that introduces the second reading says so with # corpus …, under the same rule: a note that explains no difference fails.

And every chapter's morphology is written twice. The second pass is made by a separate agent, briefed from reference/second-pass-brief.md and never shown the first, and

python build/morph_diff.py data/GEN/3.morph.txt second-pass.txt

lists every place the two disagree. Each is settled before the chapter is committed: two passes seldom make the same slip in the same place.

Middle Liddell is read from the Perseus Digital Library's XML: only the translations inside an entry's numbered senses, never its etymology. Perseus marks a few Latin equivalents and one-construction glosses as translations too; NOT_SENSES in build/words.py skips those by name. Keep it short, and skim a new chapter's cards for more.

[[flag]] is positional because Genesis 1:1 puts its divergence badge mid-note rather than at the head. [[name:…]] resolves to the Greek transliteration in the unanchored panel and the conventional English form in the anchored one, so the two-form rule is mechanical rather than retyped:

"names": [{
  "greek": "Ἰωάννης",
  "unanchored": "Iōannēs",
  "anchored": "John",
  "gloss": "(Ἰωάννης, from Hebrew Yôḥānān, \"Yah has shown favour\")"
}]

A name is glossed once per chapter. Later occurrences carry the same entry marked "bare": true and no gloss, and print the form by itself — still Iōannēs in one panel and John in the other, which is why a later occurrence is a marker rather than plain text. validate.py enforces both halves: a bare entry on a first occurrence fails, and so does a second entry that tries to gloss again.

Adding a chapter

One chapter per session. Commit per chapter, with the reference as the message.

  1. Read reference/lexicon-notes.md first and reuse existing gloss-chains verbatim. ἀρχή must read the same way in Genesis 1:1 and John 1:1 — that consistency is what makes the quotation visible. If a recurring word has no entry, establish one and add it before continuing.
  2. For an Old Testament chapter, transcribe the Greek from the printed Rahlfs — sources/README.md says where — and cite each verse's page in print. Never copy it from sources/; that data is for checking only.
  3. Write data/<BOOK>/<chapter>.json, marking every headword and its chain in reading as [[headword|chain]]. The headword is the lexicon's first sense in the form the text uses; record how you derived it.
  4. For an Old Testament chapter, write its morphology as your own analysis in data/<BOOK>/<chapter>.morph.txt — then again, by a separate agent briefed from reference/second-pass-brief.md and never shown the first, and settle every disagreement python build/morph_diff.py reports.
  5. Add the chapter to PAGE in build/render.py, and the book to BOOKS and to EDITIONS in build/validate.py if it is new.
  6. Append any newly-established gloss-chains and headwords to reference/lexicon-notes.md.
  7. Run python build/words.py <BOOK>/<chapter> and skim the cards for lexicon scraps.
  8. Run python build/validate.py and fix what it reports.
  9. Run python build/render.py.

What validation checks

check what it does
fields ref, greek, notes, reading present and non-empty; notes well-formed; flag in the permitted vocabulary; every unit and marker well-formed; no em dash inside a chain; every Old Testament verse cites its printed page
names every proper name in the Greek glossed on first occurrence in the chapter, and bare thereafter
banned no phrase from BANNED_PHRASES in either panel
anchors no headword stands bare — none written as plain text outside its unit
words the word-by-word layer, where there is one, still matches the verse's Greek
morph the project's own Old Testament morphology is well-formed by its code's own grammar — an infinitive has a tense and no case, a participle has a case — so a shifted slot fails with no reference at all
corpus that morphology agrees with itself: a form keeps its dictionary form, a verb its parse, a noun its gender and number, wherever they recur
greek New Testament character-for-character against SBLGNT; the Old Testament against the printed page each verse cites

BANNED_PHRASES and ANCHORS are maintained editorial lists at the top of build/validate.py. They grow as chapters are written.

Two things worth knowing before editing them:

  • A headword may appear inside its own chain. The chain is the whole range and the headword is its first sense, so wind — breath, wind, moving air … is correct. What fails is a headword written as plain text outside its unit. Every verse's own headwords are checked automatically; ANCHORS exists to catch one written out as prose where the unit was forgotten.
  • Banned phrases are checked against the reading texts only. The notes are exactly where those phrases are supposed to be named and refused — Genesis 1:2 says in its apparatus that face of the waters is not in this text.

A check that fires on nothing is indistinguishable from no check, so build/test_validate.py breaks one thing at a time — an empty reading, an unglossed name, a headword written as prose, a stale word-by-word layer — and requires the matching check to notice. It also holds the controls, including the allowances above, and the derivation invariant: every chain appears in both panels, in order. Run it after editing a check. Where sources/ is absent the two greek cases report skip rather than a miss.

Proper names are detected as capitalised words that are not sentence-initial. Both editions capitalise only sentence starts, names, and the first word of direct speech; a verse lists its speech-openers in speech, and a listed word that is not actually capitalised there fails the check, so the list cannot go stale. Inflected forms are matched to the nominative in names on a shared accent-stripped stem no longer than a case ending apart, so Ἰωάννου finds Ἰωάννης while indeclinable Αδα and Αδαμ stay two names. A transliteration the edition prints in lower case — χερουβιμ at Gen 3:24 — has no capital to be found by, and a name opening a sentence — Αδαμ at Gen 4:1 — has one that proves nothing, so the verse's names entry finds both instead, wherever the verse prints the word.

Where the Old Testament Greek comes from

Every freely available digital Rahlfs carries terms this repository cannot pass on, so none of them is used or committed. Instead:

  • The Greek is transcribed by hand from Rahlfs's printed 1935 edition, from the 1950 printing (a reprint of the same text) scanned at the Internet Archive. Each verse cites its page in print, and the punctuation is Rahlfs's own.
  • The Old Testament morphology is the project's own analysis, in data/<BOOK>/<chapter>.morph.txt, written alongside the transcription.
  • Both can be cross-checked against a local Rahlfs morphological module, if LXX_RAHLFS_DIR points at one. Nothing here needs it, none is distributed with this repository, and without it those two checks report SKIP.

Swete's edition, the open alternative, was tested and set aside. Codex Vaticanus has lost Genesis 1–46, so there Swete prints Alexandrinus — a different text from Rahlfs, with its own spellings (ἴδεν for εἶδεν seven times in chapter 1) and additions (1:11, 1:14, 1:30, 1:31). And the only open digital copy is uncorrected OCR: about thirty defects in Genesis 1 alone — split words, wrong letters, wrong breathings — besides the missing verses and pages catalogued in First1KGreek issue #2579.

The licensing detail, including one open question about US copyright in the 1935 text, is in NOTICE.md.

Licensing

Two layers, because the code and the interpretive work want different terms:

what covers licence
Code build/, templates/ MIT — LICENSE
Content data/, reference/, site/, and the docs CC BY-SA 4.0 — LICENSE-CONTENT

The content licence covers this project's own contributions — the notes, the gloss-chains, the two reading texts, and its own Septuagint morphology. The Greek source lines are quotations from the editions below and stay under their terms.

sources/ is not committed. The source editions are fetched rather than redistributed; sources/README.md has the instructions. Without them the checks that need them report SKIP and the rest still run.

source licence used for
Rahlfs, Septuaginta (1935) out of copyright in life-plus-70 countries; see NOTICE on the US OT Greek, transcribed from print
SBLGNT CC BY 4.0 — © 2010 SBL and Logos Bible Software, ed. Michael W. Holmes NT Greek
MorphGNT CC BY-SA 3.0, adaptable under CC BY-SA 4.0 — J. K. Tauber, ed. NT lemma and parse
Middle Liddell (1889), Perseus XML text out of copyright; digital edition CC BY-SA 3.0 US headwords and lexicon senses
LSJ, PerseusDL edition CC BY-SA 4.0 senses Middle Liddell lacks

Full attributions and the reasoning are in NOTICE.md.

About

Greek (LXX-Rahlfs-1935 and SBLGNT) to English Exhaustive Interpretation

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages