{"id":50309353,"url":"https://github.com/dknauss/borges-bibliography-builder","last_synced_at":"2026-05-28T19:30:26.064Z","repository":{"id":349673333,"uuid":"1203393463","full_name":"dknauss/borges-bibliography-builder","owner":"dknauss","description":"WordPress bibliography block: DOI/BibTeX to static, reference-manager friendly bibliographies.","archived":false,"fork":false,"pushed_at":"2026-05-04T09:30:00.000Z","size":11026,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-04T09:31:26.420Z","etag":null,"topics":["academic-papers","academic-publishing","academic-writing","bibliography","bibtex","chicago-manual-of-style","citation-styles","citations","coins-data","crossref","csl-json","doi","ieee-format","scholarly-articles","scholarly-editing","scholarly-metadata","scholarly-publishing","wordpress-block","zotero"],"latest_commit_sha":null,"homepage":"https://playground.wordpress.net/?blueprint-url=https://raw.githubusercontent.com/dknauss/borges-bibliography-builder/main/playground/blueprint.json","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dknauss.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":"SECURITY.md","support":"docs/supported-input-style-matrix.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-04-07T02:13:32.000Z","updated_at":"2026-05-04T09:19:17.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/dknauss/borges-bibliography-builder","commit_stats":null,"previous_names":["dknauss/wp-bibliography-block","dknauss/bibliography-builder","dknauss/borges-bibliography-builder"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/dknauss/borges-bibliography-builder","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dknauss%2Fborges-bibliography-builder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dknauss%2Fborges-bibliography-builder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dknauss%2Fborges-bibliography-builder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dknauss%2Fborges-bibliography-builder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dknauss","download_url":"https://codeload.github.com/dknauss/borges-bibliography-builder/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dknauss%2Fborges-bibliography-builder/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33624202,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-28T02:00:06.440Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["academic-papers","academic-publishing","academic-writing","bibliography","bibtex","chicago-manual-of-style","citation-styles","citations","coins-data","crossref","csl-json","doi","ieee-format","scholarly-articles","scholarly-editing","scholarly-metadata","scholarly-publishing","wordpress-block","zotero"],"created_at":"2026-05-28T19:30:25.124Z","updated_at":"2026-05-28T19:30:26.052Z","avatar_url":"https://github.com/dknauss.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Borges Bibliography Builder for WordPress\n\n[![License: GPL v2+](https://img.shields.io/badge/License-GPLv2%2B-blue.svg)](https://www.gnu.org/licenses/gpl-2.0.html)\n[![WordPress tested](https://img.shields.io/badge/WordPress-6.4%E2%80%937.0-21759b.svg?logo=wordpress\u0026logoColor=white)](https://github.com/dknauss/borges-bibliography-builder/actions/workflows/runtime-matrix.yml)\n[![PHP tested](https://img.shields.io/badge/PHP-7.4%E2%80%938.4-777bb4.svg?logo=php\u0026logoColor=white)](https://github.com/dknauss/borges-bibliography-builder/actions/workflows/runtime-matrix.yml)\n[![CI](https://github.com/dknauss/borges-bibliography-builder/actions/workflows/ci.yml/badge.svg)](https://github.com/dknauss/borges-bibliography-builder/actions/workflows/ci.yml)\n[![Runtime matrix](https://github.com/dknauss/borges-bibliography-builder/actions/workflows/runtime-matrix.yml/badge.svg)](https://github.com/dknauss/borges-bibliography-builder/actions/workflows/runtime-matrix.yml)\n[![CodeQL](https://github.com/dknauss/borges-bibliography-builder/actions/workflows/codeql.yml/badge.svg)](https://github.com/dknauss/borges-bibliography-builder/actions/workflows/codeql.yml)\n[![codecov](https://codecov.io/gh/dknauss/borges-bibliography-builder/branch/main/graph/badge.svg?token=2MSXL46VTF)](https://codecov.io/gh/dknauss/borges-bibliography-builder)\n[![WordPress Playground](https://img.shields.io/badge/WordPress%20Playground-Try%20it-3858e9.svg?logo=wordpress\u0026logoColor=white)](https://playground.wordpress.net/?blueprint-url=https://raw.githubusercontent.com/dknauss/borges-bibliography-builder/main/playground/blueprint.json)\n[![WordPress.org](https://img.shields.io/badge/WordPress.org-Install-21759b.svg?logo=wordpress\u0026logoColor=white)](https://wordpress.org/plugins/borges-bibliography-builder/)\n\nBorges Bibliography Builder is named after Jorge Luis Borges (1899–1986), the Argentine writer, essayist, poet, and librarian whose work imagined infinite libraries, invented books, and self-referential labyrinths.\n\nBorges, the plugin, adds a single bibliography builder block to the WordPress editor. It transforms pasted scholarly references — DOI numbers/URLs, PubMed/PMID identifiers, BibTeX entries, and supported formatted citations — into a semantically rich, auto-sorted bibliography with static saved output. Export your work as CSL-JSON, BibTeX, BibLaTeX, and RIS for Zotero, Mendeley, EndNote, JabRef, BibDesk, and similar tools.\n\nNo shortcodes. No database storage. Static HTML output survives plugin deactivation.\n\nJust write out your citations or paste DOIs, PubMed/PMID identifiers, and BibTeX code, up to 50 at a time. Easily build a formatted, auto-sorted bibliography in any supported style.\n\n## Try it in WordPress Playground\n\nInstall the public release from [WordPress.org](https://wordpress.org/plugins/borges-bibliography-builder/) or launch a disposable WordPress instance with the plugin preinstalled: [Try the Borges Bibliography Builder in WordPress Playground](https://playground.wordpress.net/?blueprint-url=https://raw.githubusercontent.com/dknauss/borges-bibliography-builder/main/playground/blueprint.json). The GitHub-hosted demo Blueprint installs the latest GitHub Release ZIP through the WordPress Playground CORS proxy and explicitly requests PHP `intl` support because editor-time CSL formatting runs through the plugin's local PHP formatter. The WordPress.org Preview blueprint is separate; WordPress.org installs Borges automatically there, and the blueprint only seeds demo content and auxiliary plugin setup.\n\n![](.wordpress-org/banner-1544x500.png)\n\n## Screenshots\n\n| Front-end output | Editor with citations |\n|---|---|\n| ![](.wordpress-org/screenshot-1.png) | ![](.wordpress-org/screenshot-2.png) |\n| The rendered bibliography on the site front end with hanging indents, italic titles, and linked DOIs — all styled by the active theme. | The block in editor view showing a formatted bibliography. Hover over any entry to reveal copy, edit, and delete actions. |\n\n| Block inserter | Empty-state form | Manual entry |\n|---|---|---|\n| ![](.wordpress-org/screenshot-3.png) | ![](.wordpress-org/screenshot-4.png) | ![](.wordpress-org/screenshot-5.png) |\n| Discover the Bibliography block in the block inserter by searching for \"Bibliography.\" | Paste DOIs, PubMed/PMID identifiers, BibTeX entries, or supported citation text into the import form. The sidebar controls citation style, visible heading, and metadata output (JSON-LD, COinS, CSL-JSON). | Switch to Manual Entry to build a citation field by field: Publication Type, Author, Title, Container, Publisher, Year, Pages, DOI, and URL. These fields will be automatically populated from DOIs, PubMed/PMID records, and pasted input that can be parsed. |\n\n## Installation\n\n1. Upload the plugin files to `/wp-content/plugins/borges-bibliography-builder/`, or install directly through the WordPress plugin screen.\n2. Activate the plugin through the **Plugins** screen in WordPress.\n3. Add the **Bibliography** block to any post or page.\n4. Paste DOI(s), PubMed/PMID identifiers, BibTeX entries, or supported citations.\n\n## Compatibility\n\n- **WordPress** 6.4+; tested up to WordPress 7.0.\n- **PHP** 7.4+.\n- **Multisite** — supported and covered by CI smoke testing.\n\nDeveloper-facing CI/runtime coverage details are listed in the development section below.\n\n## Recent Release Highlights\n\n- **1.3.3** — Restores DOI imports in WordPress Playground with direct CrossRef CSL transform lookups, serializes DOI requests for CrossRef's public concurrency limit, and adds a PubMed sample to the demo starter content.\n- **1.3.0** — Enforces an explicit 50-citation cap with editor warnings, guards all editor mutation flows against stale async results, removes a redundant formatter call in the manual-entry path, prunes non-runtime vendor dead weight from the release zip, and caches successful PMID responses while deduplicating concurrent DOI requests.\n- **1.2.0** — Adds PubMed/PMID import through an authenticated REST proxy, BibLaTeX export, manual reordering for numeric styles, full-bibliography reformat parity, and compact matrix coverage across all nine styles.\n- **ABNT / NBR 6023:2018** — Brazilian bibliography output is available as ABNT (Associação Brasileira de Normas Técnicas) with `pt-BR` defaults and the `Referências` heading.\n- **1.1.x accessibility** — Adds optional Block Accessibility Checks integration and restores visible keyboard focus on editor row actions.\n\n## Features\n\n- **Multiple input paths** — Add bare DOIs, DOI URLs, PubMed/PMID records, BibTeX entries, and supported formatted citations.\n- **Nine citation styles** — Chicago Notes-Bibliography by default, with Chicago Author-Date, APA 7, Harvard, Vancouver, IEEE, MLA 9, OSCOLA, and ABNT (Associação Brasileira de Normas Técnicas / NBR 6023:2018) selectable.\n- **Structured editing** — Plain-text editing plus per-field editing for heuristic or warning-marked citations.\n- **Semantic output** — `role=\"doc-bibliography\"`, `\u003ccite\u003e` wrappers, `lang` attributes, and hanging-indent styling without deprecated bibliography-entry ARIA roles.\n- **JSON-LD** — Schema.org structured data for search engines, AI systems, and semantic consumers (on by default).\n- **COinS** — Optional OpenURL spans for browser-based citation manager detection, especially Zotero and legacy OpenURL workflows.\n- **CSL-JSON output** — Optional machine-readable metadata for citation-manager, citeproc, and scholarly-service interoperability.\n- **Export** — Download the current bibliography as CSL-JSON, UTF-8 BibTeX, BibLaTeX, or RIS; copy individual citations or the full bibliography as plain text.\n- **Static save** — Bibliography HTML and metadata are baked into post content at save time.\n- **Accessible editor UX** — Focus management, block-local Gutenberg notices, keyboard escape/cancel flows, and row action controls.\n- **Translation-ready interface** — strings use the `borges-bibliography-builder` text domain; WordPress.org publishes language packs as community translations are approved. (See **Language Support** below.)\n\n## Reference Manager Compatibility\n\nBorges is reference-manager-friendly by design. It outputs portable CSL-JSON, BibTeX, BibLaTeX, RIS, DOI links, Schema.org JSON-LD, and optional COinS metadata so your bibliographies can be imported directly into the most widely used bibliography management and academic publishing software.\n\n| Tool or workflow | How Borges supports it |\n|---|---|\n| **Zotero** | Strong compatibility through DOI links, BibTeX, RIS, CSL-JSON, and optional COinS metadata. Tested with the [@zotero](https://github.com/zotero) SaaS, macOS app, and Chrome browser extension from [@digitalscholar](https://github.com/digitalscholar). |\n| **Mendeley** | Compatible with Elsevier's [@Mendeley](https://github.com/Mendeley) SaaS, macOS app, and Chrome browser extension through BibTeX/RIS exports; DOI-backed entries are also browser-importer friendly. Use export/copy actions for non-DOI entries rather than relying on extension autodetection. |\n| **EndNote** | Compatible through RIS and BibTeX imports. EndNote XML is deferred as a Borges export format unless user feedback and/or future testing show a practical gap that RIS and BibTeX do not cover. |\n| **JabRef, BibDesk, LaTeX** | Compatible through UTF-8 BibTeX and BibLaTeX exports for BibTeX/Biber and LaTeX-family workflows. |\n| **CSL / citeproc tools** | Compatible through CSL-JSON, which is the plugin's canonical structured data model. |\n\n## Language Support\n\nWordPress.org language packs are generated from [translate.wordpress.org](https://translate.wordpress.org/projects/wp-plugins/borges-bibliography-builder/) after the Stable translation project reaches the approval threshold for a locale. The live WordPress.org plugin page's **Languages** list is the canonical list of currently published language packs; English (US) is the source language and is not counted as a translated locale.\n\nThis repository/package currently includes seed PO/MO files for translator review and import in `fr_FR`, `de_DE`, `nl_NL`, `sv_SE`, `es_ES`, `it_IT`, `pt_PT`, `pl_PL`, `ru_RU`, `ja`, `zh_CN`, `ko_KR`, `sr_RS`, `hr`, `pt_BR`, `hi_IN`, `bn_BD`, `ta_IN`, and `te`. These files cover plugin interface strings only, not user-provided citation content. They should not be described as official WordPress.org language-pack availability until the corresponding locale is approved and listed on WordPress.org.\n\n## Supported Input\n\n### First-Class Inputs\n\n- **Bare DOI** — `10.1000/xyz123`\n- **DOI URL** — `https://doi.org/10.1000/xyz123`\n- **PubMed/PMID** — `PMID:26673779` or `pmid:26673779`, resolved through the authenticated WordPress REST proxy\n- **BibTeX** — `@article{key, title={...}, ...}`\n\n### Supported Formatted Citation Coverage\n\nThe free-text parser currently supports a growing set of formatted citations for:\n\n- books\n- journal articles\n- chapters\n- webpages and social media posts\n- reviews\n- theses and dissertations\n\nSupport is heuristic rather than universal. Unsupported inputs fail closed with a block-local inline Gutenberg notice. Manual entry is now available as a fallback for unsupported formats.\n\n## REST API\n\nBorges exposes read-only bibliography data routes under `/wp-json/bibliography/v1` for published content, integrations, and export workflows.\n\n### List bibliographies in a post\n\n```http\nGET /wp-json/bibliography/v1/posts/\u003cpost_id\u003e/bibliographies\n```\n\nReturns every Borges Bibliography block found in the post, including nested blocks:\n\n```json\n{\n  \"postId\": 123,\n  \"bibliographies\": [\n    {\n      \"index\": 0,\n      \"entryCount\": 2,\n      \"citationStyle\": \"chicago-notes-bibliography\",\n      \"headingText\": \"References\",\n      \"outputJsonLd\": true,\n      \"outputCoins\": false,\n      \"outputCslJson\": false,\n      \"citations\": []\n    }\n  ]\n}\n```\n\n### Get one bibliography\n\n```http\nGET /wp-json/bibliography/v1/posts/\u003cpost_id\u003e/bibliographies/\u003cindex\u003e\n```\n\n`\u003cindex\u003e` is zero-based within the post. Supported formats:\n\n- `?format=json` — normalized bibliography block data. This is the default.\n- `?format=text` — one visible citation per line, stripped to plain text.\n- `?format=csl-json` — CSL-JSON array with `application/vnd.citationstyles.csl+json` content type.\n\n### Permissions and limitations\n\n- Published, non-password-protected posts are publicly readable.\n- Password-protected, draft, private, or otherwise non-public posts require `edit_post` permission.\n- Missing posts, forbidden posts, and missing bibliography indexes return explicit REST errors.\n- The public bibliography data routes are read-only. They do not add, update, delete, reorder, or persist citations.\n\nThe separate editor-only formatter endpoint accepts `POST /wp-json/bibliography/v1/format`, requires `edit_posts`, and returns formatted citation text for submitted CSL-JSON. It does not save changes.\n\nThe editor-only PubMed resolver accepts `GET /wp-json/bibliography/v1/pmid/\u003cpmid\u003e`, requires `edit_posts`, validates the PMID as numeric input, and returns normalized CSL-JSON from the fixed NCBI/PMC citation exporter endpoint. It is used for pasted `PMID:` input and does not persist citations by itself.\n\n## External Services\n\nThis plugin connects to fixed scholarly metadata services only when you explicitly add an identifier in the block editor — no citation data is sent automatically or in the background. No account or API key is required for the supported DOI or PMID lookups.\n\n### DOI metadata\n\nDOI input connects to the [CrossRef REST API](https://api.crossref.org/) to resolve citation metadata.\n\n- [CrossRef](https://www.crossref.org/)\n- [CrossRef REST API documentation](https://api.crossref.org/swagger-ui/index.html)\n- [CrossRef privacy policy](https://www.crossref.org/privacy/)\n- [CrossRef terms of service](https://www.crossref.org/terms/)\n\n### PubMed/PMID metadata\n\nPubMed/PMID input connects through the plugin's authenticated WordPress REST proxy to the [NCBI/PMC Literature Citation Exporter](https://pmc.ncbi.nlm.nih.gov/api/ctxp/) CSL endpoint. The proxy uses a fixed upstream host and validates the PMID before making the outbound request.\n\n- [NCBI APIs](https://www.ncbi.nlm.nih.gov/home/develop/api/)\n- [NCBI/PMC Literature Citation Exporter](https://pmc.ncbi.nlm.nih.gov/api/ctxp/)\n- [NLM Web Policies](https://www.nlm.nih.gov/web_policies.html)\n\n## Development\n\nRequires Node.js 18+, npm 9+, and Composer.\n\n```bash\nnpm install                  # Install dependencies\ncomposer install             # Install PHP tooling\nnpm run build                # Production build\nnpm run start                # Development mode with file watching\nnpm run lint:js              # ESLint\nnpm run lint:css             # Stylelint\nnpm run lint:php             # WPCS/PHPCS\nnpm run test                 # Unit tests\nnpm run test:js:coverage     # JS coverage for Codecov\nnpm run test:rest:local      # Local REST endpoint smoke test (Studio site)\nnpm run test:e2e             # Playwright smoke suite against local site\nnpm run test:e2e:playground  # Playground-based Playwright smoke suite\nnpm run test:e2e:lifecycle   # Plugin lifecycle e2e tests (activate/deactivate/delete)\nnpm run test:runtime:local   # Docker-based runtime smoke environment\nnpm run test:interop:zotero  # Zotero + citation format interoperability checks\ncomposer test:php            # PHPUnit REST and bootstrap tests\ncomposer test:php:coverage   # PHP coverage for Codecov\ncomposer analyze:php         # Psalm static analysis\n```\n\nGitHub Actions currently runs:\n\n- Node quality/build checks\n- PHPUnit and PHPCS on PHP 8.3\n- Psalm static analysis\n- CodeQL for JavaScript and PHP\n- Codecov uploads from JS + PHP coverage\n- Playwright smoke and lifecycle tests against WordPress Playground\n\nThe GitHub Actions runtime matrix currently covers:\n\n- Apache + PHP 7.4 + WordPress 6.4\n- Apache + PHP 8.1 + WordPress 6.4\n- Apache + PHP 8.1 + WordPress 6.7\n- Apache + PHP 8.2 + latest WordPress\n- Apache + PHP 8.3 + latest WordPress\n- Apache + PHP 8.4 + latest WordPress\n- Apache + PHP 8.3 + latest WordPress + Multisite\n- Nginx + PHP 8.1 + WordPress 6.7\n- Nginx + PHP 8.2 + latest WordPress\n- Nginx + PHP 8.3 + latest WordPress\n\nEach runtime smoke job uploads artifacts, including Docker logs, service status, HTTP responses, and environment summaries under `output/runtime-matrix/\u003cmatrix-name\u003e`.\n\nMultisite runtime smoke coverage is included in CI. SQLite is not currently part of the GitHub runtime matrix; add it when a compatibility risk justifies the extra lane.\n\n## Project Documentation and Operational Files\n\n- [Plugin specification](./SPEC.md)\n- [Changelog](./CHANGELOG.md)\n- [WordPress.org plugin listing](https://wordpress.org/plugins/borges-bibliography-builder/)\n- [GitHub releases](https://github.com/dknauss/borges-bibliography-builder/releases)\n- [Release readiness checklist](./docs/release-readiness-checklist.md)\n- [WordPress.org SVN deploy checklist](./docs/wporg-svn-checklist.md) — maintainer-facing notes\n- [Playground blueprint](./playground/blueprint.json) — GitHub demo Blueprint; keep its `features.intl` and `phpExtensionBundles` settings aligned with `.wordpress-org/blueprints/blueprint.json` for WordPress.org previews.\n- [Runtime matrix smoke script](./scripts/runtime-matrix/smoke.sh)\n- [Brand assets](./.wordpress-org/)\n\nWordPress.org branding assets live in [.wordpress-org](./.wordpress-org/), editable source files live in [.wordpress-org/source](./.wordpress-org/source/), and maintainer-facing deploy notes live in [docs/wporg-svn-checklist.md](./docs/wporg-svn-checklist.md).\n\n### Playground Blueprint maintenance\n\nThe Playground demo and WordPress.org Preview both rely on the PHP formatter used by the editor REST endpoint. That formatter uses `citeproc-php`, which requires PHP `intl`. Keep both Blueprint files in sync:\n\n- `playground/blueprint.json` powers the GitHub README and WordPress.org readme demo link; it installs the latest GitHub Release ZIP through the WordPress Playground CORS proxy so the demo exercises the packaged release artifact without direct GitHub asset CORS failures.\n- `.wordpress-org/blueprints/blueprint.json` deploys to WordPress.org SVN as `assets/blueprints/blueprint.json` for the plugin-directory Preview button. WordPress.org installs the plugin automatically in that preview, so this blueprint does not install Borges itself.\n- Both files intentionally declare `phpExtensionBundles: [\"kitchen-sink\"]` and `features: { \"networking\": true, \"intl\": true }`. The bundle form follows WordPress.org Preview documentation; the `features.intl` flag is required by the live browser Playground runtime so formatter requests do not fall back with `bibliography_builder_formatter_extension_missing`.\n\nRun `npm run test -- --runTestsByPath src/blueprint.test.js` after editing either Blueprint.\n\n### Plugin File Structure\n\n```text\nborges-bibliography-builder/\n├── bibliography-builder.php      # Plugin bootstrap\n├── block.json                    # Block metadata \u0026 attributes\n├── src/\n│   ├── index.js                  # Block registration\n│   ├── edit.js                   # Editor component\n│   ├── save.js                   # Static save entrypoint\n│   ├── save-markup.js            # Shared static save markup\n│   ├── editor.scss               # Editor-only styles\n│   ├── style.scss                # Frontend bibliography styles\n│   └── lib/\n│       ├── parser.js             # Input detection \u0026 parsing orchestration\n│       ├── sorter.js             # Style-family bibliography sort comparator\n│       ├── coins.js              # CSL-JSON → COinS builder\n│       ├── jsonld.js             # CSL-JSON → Schema.org JSON-LD mapper\n│       └── formatting/           # Style registry + CSL-backed formatting\n├── package.json\n└── readme.txt                    # WordPress.org readme\n```\n\nSee [SPEC.md](SPEC.md) for the authoritative behavior specification and future plans.\n\n## Known Limitations\n\n- **OSCOLA grouped bibliography** — OSCOLA convention requires the bibliography to be divided into source-type groups (cases, legislation, books, articles, online sources). Borges currently renders a single alphabetized list regardless of style. This limitation is displayed as a dismissible notice in the editor when OSCOLA is selected. Grouped-bibliography support is tracked as Epic-OSCOLA in [`docs/planning/sort-conformance-plan.md`](docs/planning/sort-conformance-plan.md).\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, coding standards, and PR process.\n\n## Security\n\nSee [SECURITY.md](SECURITY.md) for reporting vulnerabilities.\n\n## License\n\nGPL-2.0-or-later. See [LICENSE](LICENSE) for the full text.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdknauss%2Fborges-bibliography-builder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdknauss%2Fborges-bibliography-builder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdknauss%2Fborges-bibliography-builder/lists"}