{"id":48274656,"url":"https://github.com/open-canon/open-canon-site","last_synced_at":"2026-04-04T22:24:55.255Z","repository":{"id":346262717,"uuid":"1164092847","full_name":"open-canon/open-canon-site","owner":"open-canon","description":"Website for viewing various Ancient Religious Texts","archived":false,"fork":false,"pushed_at":"2026-04-01T03:31:32.000Z","size":9914,"stargazers_count":0,"open_issues_count":6,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-01T05:38:30.453Z","etag":null,"topics":["apocrypha","bible","bible-study","lds","lds-scriptures","religion","scripture"],"latest_commit_sha":null,"homepage":"https://open-canon.github.io/open-canon-site/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/open-canon.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-22T16:21:32.000Z","updated_at":"2026-04-01T03:13:45.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/open-canon/open-canon-site","commit_stats":null,"previous_names":["open-canon/open-canon-site"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/open-canon/open-canon-site","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-canon%2Fopen-canon-site","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-canon%2Fopen-canon-site/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-canon%2Fopen-canon-site/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-canon%2Fopen-canon-site/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/open-canon","download_url":"https://codeload.github.com/open-canon/open-canon-site/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-canon%2Fopen-canon-site/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31416763,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T20:09:54.854Z","status":"ssl_error","status_checked_at":"2026-04-04T20:09:44.350Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apocrypha","bible","bible-study","lds","lds-scriptures","religion","scripture"],"created_at":"2026-04-04T22:24:53.290Z","updated_at":"2026-04-04T22:24:55.233Z","avatar_url":"https://github.com/open-canon.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# open-canon-site\n\nWebsite for viewing various Ancient Religious Texts\n\nA static site generator that reads [OSIS XML](http://www.bibletechnologies.net/) scriptural documents and produces a clean, three-panel reading interface inspired by the study tools of [churchofjesuschrist.org](https://www.churchofjesuschrist.org).\n\n## Features\n\n- **Left navigation sidebar** – lists all loaded documents; for the current document shows its top-level divisions (books, sections, etc.); for the current division shows all chapters\n- **Arabic chapter numbering** – normalizes chapter headings like `CHAPTER XVIII.` to `Chapter 18` in the sidebar and page titles while preserving the underlying OSIS chapter IDs\n- **In-page section links** – exposes section headings from introductions and other prose pages in the sidebar and links directly to the right anchor on the current page\n- **Center reading pane** – renders the full chapter text with verse numbers, inline formatting, and footnote/cross-reference markers\n- **Structured poetry support** – handles OSIS line groups such as `\u003clg\u003e` and `\u003cl\u003e` used in texts like 1 Enoch\n- **Front matter support** – renders non-chapter material such as introductions, prefaces, and prose-only sections into navigable pages\n- **Right notes tray** – displays all embedded notes for the chapter, automatically scrolling to stay aligned with whatever verse is currently visible in the center\n- **UV-managed dependencies** – project uses [UV](https://docs.astral.sh/uv/) for fast, reproducible package management\n\n## Quick start\n\n```bash\n# 1. Install UV (if you don't have it)\npip install uv\n\n# 2. Install the project and its dependencies\nuv sync\n\n# 3. Generate a site from the bundled sample OSIS file\nuv run open-canon-site sample_data/sample.osis.xml -o output\n\n# 4. Browse the site (Python's built-in server)\npython -m http.server --directory output 8080\n# → open http://localhost:8080\n```\n\n## Usage\n\n```text\nopen-canon-site [OPTIONS] OSIS_FILE [OSIS_FILE ...]\n\nPositional arguments:\n  OSIS_FILE   One or more OSIS XML files to render.\n\nOptions:\n  -o / --output DIR   Output directory (default: ./output)\n  --clean             Remove the output directory before generating\n  -h / --help         Show this message and exit\n```\n\n### Multiple documents\n\nPass several files to build a combined library:\n\n```bash\nuv run open-canon-site kjv.osis.xml bom.osis.xml -o output --clean\n```\n\n## Project layout\n\n```text\nopen-canon-site/\n├── pyproject.toml                  # UV/PEP-517 project metadata \u0026 dependencies\n├── sample_data/\n│   └── sample.osis.xml             # Demo OSIS excerpt (Genesis 1–3, KJV)\n├── src/\n│   └── open_canon_site/\n│       ├── __main__.py             # CLI entry point\n│       ├── generator.py            # Orchestrates parsing → HTML writing\n│       ├── parser.py               # Extracts document structure from OSIS\n│       ├── renderer.py             # Converts pyosis content nodes to HTML\n│       ├── static/\n│       │   ├── style.css           # Three-column layout \u0026 typography\n│       │   └── notes-sync.js       # Scroll-sync between text and notes tray\n│       └── templates/\n│           ├── base.html           # Shared HTML shell\n│           ├── index.html          # Library landing page\n│           ├── doc_index.html      # Per-document redirect page\n│           └── chapter.html        # Chapter reading page\n└── tests/\n    ├── test_generator.py           # Integration tests (full pipeline)\n    ├── test_parser.py              # Unit tests for OSIS parsing\n    └── test_renderer.py            # Unit tests for content rendering\n```\n\n## Running tests\n\n```bash\nuv sync --extra dev\nuv run --extra dev pytest\n```\n\n## GitHub Pages deployment\n\nProduction and PR preview deployments both publish to the `gh-pages` branch.\nKeep the repository Pages source set to `Deploy from a branch` with `gh-pages`\nselected; the preview workflow relies on branch-based deployments.\n\nThe preview jobs intentionally avoid conditions based on\n`github.event.pull_request.head.repo`. GitHub can omit that object when a\n`pull_request` workflow is manually re-run, which would incorrectly skip\nsame-repository preview deployments.\n\nThe preview deployment job also uses an explicit `always()` guard with a\n`needs.build.result == 'success'` check. Without that override, GitHub applies\nthe default `success()` condition to downstream jobs, and the PR preview job is\nsilently skipped because the release job is expected to be skipped on\n`pull_request` events.\n\n## Dependencies\n\n| Package                                        | Purpose                                    |\n| ---------------------------------------------- | ------------------------------------------ |\n| [pyosis](https://pypi.org/project/pyosis/)     | Parses OSIS XML into typed Python models   |\n| [Jinja2](https://jinja.palletsprojects.com/)   | HTML template rendering                    |\n\n## Contributing\n\nCommit messages must follow the **[Conventional Commits](https://www.conventionalcommits.org/)** format (Angular preset) — this drives automatic versioning via [python-semantic-release](https://python-semantic-release.readthedocs.io/).\n\n```text\nfeat(parser): support Hebrew right-to-left text direction\nfix(renderer): correct verse numbering for chapters \u003e 99\ndocs: clarify OSIS file requirements in README\n```\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for the full guide.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopen-canon%2Fopen-canon-site","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopen-canon%2Fopen-canon-site","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopen-canon%2Fopen-canon-site/lists"}