././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1785944092.7107775 citeproc_py-0.10.4/0000755000175100017510000000000015234654035013571 5ustar00runnerrunner././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944087.0 citeproc_py-0.10.4/CHANGELOG.md0000644000175100017510000002666115234654027015416 0ustar00runnerrunner# v0.10.4 (Wed Aug 05 2026) #### 🐛 Bug Fix - setup.py: Prune imports [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Remove unneeded nonuniversal wheel declaration [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Fix project URL [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Specify license file [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Add missing build dep: lxml [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Use entry points for running scripts [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Use setuptools' builtin multifile longdesc support [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Rely on setuptools' automatic package discovery [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Migrate versioneer to pyproject.toml [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Migrate simple metadata to pyproject.toml [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) #### Authors: 1 - [@hseg](https://github.com/hseg) --- # v0.10.3 (Fri Jul 24 2026) #### 🐛 Bug Fix - swap csl 1.0.1 harvard1 for harvard-cite-them-right [#197](https://github.com/citeproc-py/citeproc-py/pull/197) ([@tmorrell](https://github.com/tmorrell)) - tests: add python 3.14 [#199](https://github.com/citeproc-py/citeproc-py/pull/199) ([@tmorrell](https://github.com/tmorrell)) #### 🔩 Dependency Updates - build(deps): bump actions/setup-python from 6 to 7 [#200](https://github.com/citeproc-py/citeproc-py/pull/200) ([@dependabot[bot]](https://github.com/dependabot[bot])) #### Authors: 2 - [@dependabot[bot]](https://github.com/dependabot[bot]) - Tom Morrell ([@tmorrell](https://github.com/tmorrell)) --- # v0.10.2 (Tue Jul 21 2026) #### 🐛 Bug Fix - Additional chicago style page range formats in csl 1.0.2 [#198](https://github.com/citeproc-py/citeproc-py/pull/198) ([@tmorrell](https://github.com/tmorrell)) #### Authors: 1 - Tom Morrell ([@tmorrell](https://github.com/tmorrell)) --- # v0.10.1 (Wed Jul 08 2026) #### 🐛 Bug Fix - Update GitHub Actions for token and Python version [#196](https://github.com/citeproc-py/citeproc-py/pull/196) ([@tmorrell](https://github.com/tmorrell)) - Better handle decimals in multiple number regex [#195](https://github.com/citeproc-py/citeproc-py/pull/195) ([@tmorrell](https://github.com/tmorrell)) - fix spacing changes in csl 1.0.2 [#195](https://github.com/citeproc-py/citeproc-py/pull/195) ([@tmorrell](https://github.com/tmorrell)) #### Authors: 1 - Tom Morrell ([@tmorrell](https://github.com/tmorrell)) --- # v0.10.0 (Tue Jul 07 2026) #### 🚀 Enhancement - fix: preserve text case for non-english title case [#192](https://github.com/citeproc-py/citeproc-py/pull/192) ([@mairasalazar](https://github.com/mairasalazar)) - Upgrade to csl 1.0.2 [#192](https://github.com/citeproc-py/citeproc-py/pull/192) ([@mairasalazar](https://github.com/mairasalazar)) #### 🔩 Dependency Updates - Bump actions/checkout from 6 to 7 [#193](https://github.com/citeproc-py/citeproc-py/pull/193) ([@dependabot[bot]](https://github.com/dependabot[bot])) #### Authors: 2 - [@dependabot[bot]](https://github.com/dependabot[bot]) - Maira Salazar ([@mairasalazar](https://github.com/mairasalazar)) --- # v0.9.3 (Thu Apr 30 2026) #### 🐛 Bug Fix - fix: Et_Al looked up literal term name 'variable' instead of the local variable [#190](https://github.com/citeproc-py/citeproc-py/pull/190) ([@Jasaj4](https://github.com/Jasaj4)) #### 🔩 Dependency Updates - Bump actions/checkout from 4 to 6 [#187](https://github.com/citeproc-py/citeproc-py/pull/187) ([@dependabot[bot]](https://github.com/dependabot[bot])) - Bump actions/setup-python from 5 to 6 [#186](https://github.com/citeproc-py/citeproc-py/pull/186) ([@dependabot[bot]](https://github.com/dependabot[bot])) #### Authors: 2 - [@dependabot[bot]](https://github.com/dependabot[bot]) - [@Jasaj4](https://github.com/Jasaj4) --- # v0.9.2 (Tue Apr 21 2026) #### 🐛 Bug Fix - setup: add citeproc-py-styles to tests [#189](https://github.com/citeproc-py/citeproc-py/pull/189) ([@tmorrell](https://github.com/tmorrell)) #### Authors: 1 - Tom Morrell ([@tmorrell](https://github.com/tmorrell)) --- # v0.9.1 (Mon Apr 20 2026) #### 🐛 Bug Fix - Add Dependabot configuration for GitHub Actions [#185](https://github.com/citeproc-py/citeproc-py/pull/185) ([@tmorrell](https://github.com/tmorrell)) - tests: drop python 3.9 [#179](https://github.com/citeproc-py/citeproc-py/pull/179) ([@tmorrell](https://github.com/tmorrell)) - Fix ordinal suffixes when style has embedded locale without ordinal terms [#184](https://github.com/citeproc-py/citeproc-py/pull/184) ([@Copilot](https://github.com/Copilot)) #### Authors: 2 - [@Copilot](https://github.com/Copilot) - Tom Morrell ([@tmorrell](https://github.com/tmorrell)) --- # v0.9.0 (Mon Aug 25 2025) #### 🚀 Enhancement - Feature/flexible style loading [#180](https://github.com/citeproc-py/citeproc-py/pull/180) ([@yarikoptic](https://github.com/yarikoptic)) #### Authors: 1 - Yaroslav Halchenko ([@yarikoptic](https://github.com/yarikoptic)) --- # v0.8.3 (Mon Aug 18 2025) #### 🐛 Bug Fix - setup: match license label with actual text [#175](https://github.com/citeproc-py/citeproc-py/pull/175) ([@tmorrell](https://github.com/tmorrell)) - Fix Non-existent Terms [#156](https://github.com/citeproc-py/citeproc-py/pull/156) ([@JVickery-TBS](https://github.com/JVickery-TBS)) #### 🏠 Internal - Remove hardcoded option for auto to onlyPublishWithReleaseLabel [#178](https://github.com/citeproc-py/citeproc-py/pull/178) ([@yarikoptic](https://github.com/yarikoptic)) - release action: missing semicolon [#177](https://github.com/citeproc-py/citeproc-py/pull/177) ([@tmorrell](https://github.com/tmorrell)) - release action: missing quotes [#176](https://github.com/citeproc-py/citeproc-py/pull/176) ([@tmorrell](https://github.com/tmorrell)) - coveralls: try to reenable [#163](https://github.com/citeproc-py/citeproc-py/pull/163) ([@tmorrell](https://github.com/tmorrell)) #### 📝 Documentation - Fix some formatting issues in README [#164](https://github.com/citeproc-py/citeproc-py/pull/164) ([@alexfikl](https://github.com/alexfikl)) #### Authors: 4 - Alex Fikl ([@alexfikl](https://github.com/alexfikl)) - Jesse Vickery ([@JVickery-TBS](https://github.com/JVickery-TBS)) - Tom Morrell ([@tmorrell](https://github.com/tmorrell)) - Yaroslav Halchenko ([@yarikoptic](https://github.com/yarikoptic)) --- # v0.8.2 (Wed Mar 12 2025) #### 🏠 Internal - Explicitly specify utf-8 encoding while reading top level .md files for description [#162](https://github.com/citeproc-py/citeproc-py/pull/162) ([@yarikoptic](https://github.com/yarikoptic)) - Instruct that long description is in markdown and not ReST [#160](https://github.com/citeproc-py/citeproc-py/pull/160) ([@yarikoptic](https://github.com/yarikoptic)) #### Authors: 1 - Yaroslav Halchenko ([@yarikoptic](https://github.com/yarikoptic)) --- # v0.8.1 (Wed Mar 12 2025) #### 🏠 Internal - release: checkout with submodules [#159](https://github.com/citeproc-py/citeproc-py/pull/159) ([@yarikoptic](https://github.com/yarikoptic)) #### Authors: 1 - Yaroslav Halchenko ([@yarikoptic](https://github.com/yarikoptic)) --- # v0.8.0 (Wed Mar 12 2025) #### 🚀 Enhancement - release: use GitHUb App token for checkout and push [#158](https://github.com/citeproc-py/citeproc-py/pull/158) ([@tmorrell](https://github.com/tmorrell)) #### ⚠️ Pushed to `master` - Rename CHANGES to CHANGELOG ([@yarikoptic](https://github.com/yarikoptic)) #### 🏠 Internal - release: switch to using GitHub App to overcome branch protection [#157](https://github.com/citeproc-py/citeproc-py/pull/157) ([@tmorrell](https://github.com/tmorrell)) - Set up `auto` to automate releases [#153](https://github.com/citeproc-py/citeproc-py/pull/153) ([@jwodder](https://github.com/jwodder) [@yarikoptic](https://github.com/yarikoptic)) #### 📝 Documentation - Convert CHANGES.rst, CONTRIBUTING.rst, and README.md to markdown [#154](https://github.com/citeproc-py/citeproc-py/pull/154) ([@tmorrell](https://github.com/tmorrell)) #### Authors: 3 - John T. Wodder II ([@jwodder](https://github.com/jwodder)) - Tom Morrell ([@tmorrell](https://github.com/tmorrell)) - Yaroslav Halchenko ([@yarikoptic](https://github.com/yarikoptic)) --- # Release 0.7.0 (2025-02-19) Just to get a release out after long period. #### Bug fixes * Better handling of ordinals * Fix locator conditions (resolves #142) * Make family name optional * Allow date parts to not be integers * Support space macros * Fix multiple capitals * Fix parsing BibTex integer values #### Other changes: * Removed support for Python 3.6, 3.7, 3.8 and added for 3.10 - 3.13 * Switch versioning to versioneer # Release 0.6.0 (2021-05-27) #### Bug fixes * Various issues on Windows: testing, explicit utf-8 encoding * Strings with unescaped \ declared r"aw" #### Other changes: * Removed support for Python 2.7, 3.5 and added for 3.9 * Travis CI is removed in favor of GitHub actions testing across all 3 major OSes (MacOS, Windows, GNU/Linux Ubuntu) * CSL test-suite progressed from 5779a8c to c3db429 # Release 0.5.1 (2020-03-06) #### Bug fixed: * avoid rnc2rng 2.6.2 which breaks installation of citeproc-py # Release 0.5.0 (2020-02-09) #### Enhancements: * handle commas and ampersands in a functional style * Number: handle commas and ampersands * added symbol for textquotesingle * specify fallback locales for fr-CA and es-CL * improved page number and ranges parsing #### Bug fixed: * don't fail on empty page ranges (#90) (bbm) * detect end of file while parsing incorrect bib (#59) (John Vandenberg) #### Other changes: * Removed 3.2-3.4 and added 3.7, 3.8 to supported Pythons * Refactored locales handling # Release 0.4.0 (2017-06-23) #### New features: * allow specifying the encoding of a BibTeX database file (#20 and #25) * BibTeX 'month' field: support integers and " " values * BibTeX 'pages' field: support "10", "10+", "10-12" and "10--12" formats * BibTeX entry types: map the non-standard 'thesis' and 'report' entries * update the CSL schema to version 1.0.1 (#5) * update the CSL locales to commit 49bf3fc0 #### Bug fixed: * avoid crash when there is nothing to affix (David Lesieur) * fix BibTeX month to CSL month mapping (#24) * strip leading/trailing whitespace from BibTeX values (#37) # Release 0.3.0 (2014-11-07) #### Major improvements to the BibTeX parser: * split names into parts and assign them to the equivalent CSL name parts * fixed handling of accent macros and escaped characters * more compatible (La)TeX macro handling in general (but still basic) * handle standard Computer Modern ligatures such as --, ---, and << * added unit tests for the BibTeX and LaTeX parsers #### Other changes: * disable RelaxNG validation of CSL styles by default (API change) # Release 0.2.0 (2014-10-25) * bad cite callback function can determine how a bad cite is displayed (hetsch) * added option to disable RelaxNG validation (Jasper Op de Coul) * distutils was replaced with setuptools (Joshua Carp) * bug fixes (Yaroslav Halchenko, David Lesieur) * CitationStylesBibliography.bibliography() now returns the list of entries ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/LICENSE0000644000175100017510000000277615234654005014607 0ustar00runnerrunnerCopyright 2011-2013 Brecht Machiels. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of the copyright holder. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/MANIFEST.in0000644000175100017510000000042615234654005015326 0ustar00runnerrunnerinclude LICENSE README.md CHANGELOG.md recursive-include citeproc/data/schema *.rnc *.md *.rng recursive-include docs *.html *.css *.png recursive-include examples *.py *.csl *.bib recursive-include tests *.py *.bib recursive-include tests/local *.txt prune tests/citeproc-test ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1785944092.7101312 citeproc_py-0.10.4/PKG-INFO0000644000175100017510000004144115234654035014672 0ustar00runnerrunnerMetadata-Version: 2.4 Name: citeproc-py Version: 0.10.4 Summary: Citations and bibliography formatter Author-email: Brecht Machiels License-Expression: BSD-2-Clause-Views Project-URL: homepage, https://github.com/citeproc-py/citeproc-py Keywords: csl,citation,html,rst,bibtex,xml Classifier: Development Status :: 3 - Alpha Classifier: Environment :: Console Classifier: Environment :: Other Environment Classifier: Environment :: Web Environment Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Education Classifier: Intended Audience :: End Users/Desktop Classifier: Intended Audience :: Legal Industry Classifier: Intended Audience :: Other Audience Classifier: Intended Audience :: Science/Research Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 Classifier: Programming Language :: Python :: 3.13 Classifier: Programming Language :: Python :: 3.14 Classifier: Topic :: Documentation Classifier: Topic :: Printing Classifier: Topic :: Software Development :: Documentation Classifier: Topic :: Software Development :: Libraries :: Python Modules Provides: citeproc Requires-Python: >=3.9 Description-Content-Type: text/markdown License-File: LICENSE Requires-Dist: lxml Provides-Extra: full Requires-Dist: citeproc-py-styles; extra == "full" Provides-Extra: tests Requires-Dist: citeproc-py-styles; extra == "tests" Dynamic: license-file # citeproc-py [![PyPI - Version](https://img.shields.io/pypi/v/citeproc-py)](https://pypi.org/project/citeproc-py/) [![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/citeproc-py/citeproc-py/test.yml)](https://github.com/citeproc-py/citeproc-py/actions?query=branch%3Amaster+workflow%3ATest) [![Coveralls](https://img.shields.io/coverallsCoverage/github/citeproc-py/citeproc-py)](https://coveralls.io/github/citeproc-py/citeproc-py) citeproc-py is a [CSL](https://citationstyles.org/) processor for Python. It aims to implement the [CSL 1.0.2 specification](https://docs.citationstyles.org/en/v1.0.2/specification.html). citeproc-py can output styled citations and bibliographies in a number of different output formats. Currently supported are plain text, reStructuredText and HTML. Other formats can be added easily. citeproc-py uses [semantic versioning](https://semver.org/). Currently, its major version number is still at 0, meaning the API is not yet stable. However, you should not expect to see any major API changes soon. ## Requirements citeproc-py supports Python 3.9 and up. It depends on [lxml](https://lxml.de/) for parsing and navigating the CSL style and locale files. # Installation The recommended way of installing citeproc-py is by using [pip](https://pip.pypa.io/en/latest/): ```bash pip install citeproc-py ``` If `lxml` isn't installed, `pip` will try to install it for you. If you insist, you can manually install citeproc-py from distribution packages hosted at [PyPI](https://pypi.python.org/pypi/citeproc-py/). Please ignore the release archives offered by GitHub. ## Getting Started To get started with citeproc-py, take a look at the examples under `examples/`. Two examples are provided, one parsing references from a JSON representation of references as supported by citeproc-js, another parsing the references from a BibTeX file. Both show and explain how to cite references and render the bibliography. ## CSL Compatibility Currently, citeproc-py passes almost 60% of the (relevant) tests in the [citeproc-test suite](https://github.com/citation-style-language/test-suite). However, it is more than 60% complete, as citeproc-py doesn't take care of double spaces and repeated punctuation marks yet, making a good deal of the tests fail. In addition, the following features have not yet been implemented (there are probably some I forgot though): - disambiguation/year-suffix - et-al-subsequent-min/et-al-subsequent-use-first - collapsing - punctuation-in-quote - display Also, some [citeproc-js](https://github.com/juris-m/citeproc-js) functionality that is not part of the CSL spec is not (yet) supported: - raw dates - static-ordering - literal names ## Contributing citeproc-py is 100% volunteer maintained, and new contributions are always welcome. If you would like to contribute, please follow the guidelines in the [CONTRIBUTING.md](https://github.com/citeproc-py/citeproc-py/blob/master/CONTRIBUTING.md) file. ## Local Install and Running the Tests First clone the `citeproc-py` repository and install the submodules with ```bash git submodule update --init ``` Then install with ```bash pip install --editable . ``` Then move to the `tests` directory and run ```bash python citeproc-test.py ``` Run ```bash citeproc-test.py --help ``` to see its usage information. The first time you run the script it will clone the [citeproc-test suite](https://github.com/citation-style-language/test-suite) repository into the `tests` directory and checkout the last tested version. By default failed tests are automatically added into the `failing_tests.txt` file and aren't shown when running the test suite again. If you want git to fully ignore the submodule, you can type ```bash git update-index --assume-unchanged citeproc/data/schema ``` # v0.10.4 (Wed Aug 05 2026) #### 🐛 Bug Fix - setup.py: Prune imports [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Remove unneeded nonuniversal wheel declaration [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Fix project URL [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Specify license file [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Add missing build dep: lxml [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Use entry points for running scripts [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Use setuptools' builtin multifile longdesc support [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Rely on setuptools' automatic package discovery [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Migrate versioneer to pyproject.toml [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Migrate simple metadata to pyproject.toml [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) #### Authors: 1 - [@hseg](https://github.com/hseg) --- # v0.10.3 (Fri Jul 24 2026) #### 🐛 Bug Fix - swap csl 1.0.1 harvard1 for harvard-cite-them-right [#197](https://github.com/citeproc-py/citeproc-py/pull/197) ([@tmorrell](https://github.com/tmorrell)) - tests: add python 3.14 [#199](https://github.com/citeproc-py/citeproc-py/pull/199) ([@tmorrell](https://github.com/tmorrell)) #### 🔩 Dependency Updates - build(deps): bump actions/setup-python from 6 to 7 [#200](https://github.com/citeproc-py/citeproc-py/pull/200) ([@dependabot[bot]](https://github.com/dependabot[bot])) #### Authors: 2 - [@dependabot[bot]](https://github.com/dependabot[bot]) - Tom Morrell ([@tmorrell](https://github.com/tmorrell)) --- # v0.10.2 (Tue Jul 21 2026) #### 🐛 Bug Fix - Additional chicago style page range formats in csl 1.0.2 [#198](https://github.com/citeproc-py/citeproc-py/pull/198) ([@tmorrell](https://github.com/tmorrell)) #### Authors: 1 - Tom Morrell ([@tmorrell](https://github.com/tmorrell)) --- # v0.10.1 (Wed Jul 08 2026) #### 🐛 Bug Fix - Update GitHub Actions for token and Python version [#196](https://github.com/citeproc-py/citeproc-py/pull/196) ([@tmorrell](https://github.com/tmorrell)) - Better handle decimals in multiple number regex [#195](https://github.com/citeproc-py/citeproc-py/pull/195) ([@tmorrell](https://github.com/tmorrell)) - fix spacing changes in csl 1.0.2 [#195](https://github.com/citeproc-py/citeproc-py/pull/195) ([@tmorrell](https://github.com/tmorrell)) #### Authors: 1 - Tom Morrell ([@tmorrell](https://github.com/tmorrell)) --- # v0.10.0 (Tue Jul 07 2026) #### 🚀 Enhancement - fix: preserve text case for non-english title case [#192](https://github.com/citeproc-py/citeproc-py/pull/192) ([@mairasalazar](https://github.com/mairasalazar)) - Upgrade to csl 1.0.2 [#192](https://github.com/citeproc-py/citeproc-py/pull/192) ([@mairasalazar](https://github.com/mairasalazar)) #### 🔩 Dependency Updates - Bump actions/checkout from 6 to 7 [#193](https://github.com/citeproc-py/citeproc-py/pull/193) ([@dependabot[bot]](https://github.com/dependabot[bot])) #### Authors: 2 - [@dependabot[bot]](https://github.com/dependabot[bot]) - Maira Salazar ([@mairasalazar](https://github.com/mairasalazar)) --- # v0.9.3 (Thu Apr 30 2026) #### 🐛 Bug Fix - fix: Et_Al looked up literal term name 'variable' instead of the local variable [#190](https://github.com/citeproc-py/citeproc-py/pull/190) ([@Jasaj4](https://github.com/Jasaj4)) #### 🔩 Dependency Updates - Bump actions/checkout from 4 to 6 [#187](https://github.com/citeproc-py/citeproc-py/pull/187) ([@dependabot[bot]](https://github.com/dependabot[bot])) - Bump actions/setup-python from 5 to 6 [#186](https://github.com/citeproc-py/citeproc-py/pull/186) ([@dependabot[bot]](https://github.com/dependabot[bot])) #### Authors: 2 - [@dependabot[bot]](https://github.com/dependabot[bot]) - [@Jasaj4](https://github.com/Jasaj4) --- # v0.9.2 (Tue Apr 21 2026) #### 🐛 Bug Fix - setup: add citeproc-py-styles to tests [#189](https://github.com/citeproc-py/citeproc-py/pull/189) ([@tmorrell](https://github.com/tmorrell)) #### Authors: 1 - Tom Morrell ([@tmorrell](https://github.com/tmorrell)) --- # v0.9.1 (Mon Apr 20 2026) #### 🐛 Bug Fix - Add Dependabot configuration for GitHub Actions [#185](https://github.com/citeproc-py/citeproc-py/pull/185) ([@tmorrell](https://github.com/tmorrell)) - tests: drop python 3.9 [#179](https://github.com/citeproc-py/citeproc-py/pull/179) ([@tmorrell](https://github.com/tmorrell)) - Fix ordinal suffixes when style has embedded locale without ordinal terms [#184](https://github.com/citeproc-py/citeproc-py/pull/184) ([@Copilot](https://github.com/Copilot)) #### Authors: 2 - [@Copilot](https://github.com/Copilot) - Tom Morrell ([@tmorrell](https://github.com/tmorrell)) --- # v0.9.0 (Mon Aug 25 2025) #### 🚀 Enhancement - Feature/flexible style loading [#180](https://github.com/citeproc-py/citeproc-py/pull/180) ([@yarikoptic](https://github.com/yarikoptic)) #### Authors: 1 - Yaroslav Halchenko ([@yarikoptic](https://github.com/yarikoptic)) --- # v0.8.3 (Mon Aug 18 2025) #### 🐛 Bug Fix - setup: match license label with actual text [#175](https://github.com/citeproc-py/citeproc-py/pull/175) ([@tmorrell](https://github.com/tmorrell)) - Fix Non-existent Terms [#156](https://github.com/citeproc-py/citeproc-py/pull/156) ([@JVickery-TBS](https://github.com/JVickery-TBS)) #### 🏠 Internal - Remove hardcoded option for auto to onlyPublishWithReleaseLabel [#178](https://github.com/citeproc-py/citeproc-py/pull/178) ([@yarikoptic](https://github.com/yarikoptic)) - release action: missing semicolon [#177](https://github.com/citeproc-py/citeproc-py/pull/177) ([@tmorrell](https://github.com/tmorrell)) - release action: missing quotes [#176](https://github.com/citeproc-py/citeproc-py/pull/176) ([@tmorrell](https://github.com/tmorrell)) - coveralls: try to reenable [#163](https://github.com/citeproc-py/citeproc-py/pull/163) ([@tmorrell](https://github.com/tmorrell)) #### 📝 Documentation - Fix some formatting issues in README [#164](https://github.com/citeproc-py/citeproc-py/pull/164) ([@alexfikl](https://github.com/alexfikl)) #### Authors: 4 - Alex Fikl ([@alexfikl](https://github.com/alexfikl)) - Jesse Vickery ([@JVickery-TBS](https://github.com/JVickery-TBS)) - Tom Morrell ([@tmorrell](https://github.com/tmorrell)) - Yaroslav Halchenko ([@yarikoptic](https://github.com/yarikoptic)) --- # v0.8.2 (Wed Mar 12 2025) #### 🏠 Internal - Explicitly specify utf-8 encoding while reading top level .md files for description [#162](https://github.com/citeproc-py/citeproc-py/pull/162) ([@yarikoptic](https://github.com/yarikoptic)) - Instruct that long description is in markdown and not ReST [#160](https://github.com/citeproc-py/citeproc-py/pull/160) ([@yarikoptic](https://github.com/yarikoptic)) #### Authors: 1 - Yaroslav Halchenko ([@yarikoptic](https://github.com/yarikoptic)) --- # v0.8.1 (Wed Mar 12 2025) #### 🏠 Internal - release: checkout with submodules [#159](https://github.com/citeproc-py/citeproc-py/pull/159) ([@yarikoptic](https://github.com/yarikoptic)) #### Authors: 1 - Yaroslav Halchenko ([@yarikoptic](https://github.com/yarikoptic)) --- # v0.8.0 (Wed Mar 12 2025) #### 🚀 Enhancement - release: use GitHUb App token for checkout and push [#158](https://github.com/citeproc-py/citeproc-py/pull/158) ([@tmorrell](https://github.com/tmorrell)) #### ⚠️ Pushed to `master` - Rename CHANGES to CHANGELOG ([@yarikoptic](https://github.com/yarikoptic)) #### 🏠 Internal - release: switch to using GitHub App to overcome branch protection [#157](https://github.com/citeproc-py/citeproc-py/pull/157) ([@tmorrell](https://github.com/tmorrell)) - Set up `auto` to automate releases [#153](https://github.com/citeproc-py/citeproc-py/pull/153) ([@jwodder](https://github.com/jwodder) [@yarikoptic](https://github.com/yarikoptic)) #### 📝 Documentation - Convert CHANGES.rst, CONTRIBUTING.rst, and README.md to markdown [#154](https://github.com/citeproc-py/citeproc-py/pull/154) ([@tmorrell](https://github.com/tmorrell)) #### Authors: 3 - John T. Wodder II ([@jwodder](https://github.com/jwodder)) - Tom Morrell ([@tmorrell](https://github.com/tmorrell)) - Yaroslav Halchenko ([@yarikoptic](https://github.com/yarikoptic)) --- # Release 0.7.0 (2025-02-19) Just to get a release out after long period. #### Bug fixes * Better handling of ordinals * Fix locator conditions (resolves #142) * Make family name optional * Allow date parts to not be integers * Support space macros * Fix multiple capitals * Fix parsing BibTex integer values #### Other changes: * Removed support for Python 3.6, 3.7, 3.8 and added for 3.10 - 3.13 * Switch versioning to versioneer # Release 0.6.0 (2021-05-27) #### Bug fixes * Various issues on Windows: testing, explicit utf-8 encoding * Strings with unescaped \ declared r"aw" #### Other changes: * Removed support for Python 2.7, 3.5 and added for 3.9 * Travis CI is removed in favor of GitHub actions testing across all 3 major OSes (MacOS, Windows, GNU/Linux Ubuntu) * CSL test-suite progressed from 5779a8c to c3db429 # Release 0.5.1 (2020-03-06) #### Bug fixed: * avoid rnc2rng 2.6.2 which breaks installation of citeproc-py # Release 0.5.0 (2020-02-09) #### Enhancements: * handle commas and ampersands in a functional style * Number: handle commas and ampersands * added symbol for textquotesingle * specify fallback locales for fr-CA and es-CL * improved page number and ranges parsing #### Bug fixed: * don't fail on empty page ranges (#90) (bbm) * detect end of file while parsing incorrect bib (#59) (John Vandenberg) #### Other changes: * Removed 3.2-3.4 and added 3.7, 3.8 to supported Pythons * Refactored locales handling # Release 0.4.0 (2017-06-23) #### New features: * allow specifying the encoding of a BibTeX database file (#20 and #25) * BibTeX 'month' field: support integers and " " values * BibTeX 'pages' field: support "10", "10+", "10-12" and "10--12" formats * BibTeX entry types: map the non-standard 'thesis' and 'report' entries * update the CSL schema to version 1.0.1 (#5) * update the CSL locales to commit 49bf3fc0 #### Bug fixed: * avoid crash when there is nothing to affix (David Lesieur) * fix BibTeX month to CSL month mapping (#24) * strip leading/trailing whitespace from BibTeX values (#37) # Release 0.3.0 (2014-11-07) #### Major improvements to the BibTeX parser: * split names into parts and assign them to the equivalent CSL name parts * fixed handling of accent macros and escaped characters * more compatible (La)TeX macro handling in general (but still basic) * handle standard Computer Modern ligatures such as --, ---, and << * added unit tests for the BibTeX and LaTeX parsers #### Other changes: * disable RelaxNG validation of CSL styles by default (API change) # Release 0.2.0 (2014-10-25) * bad cite callback function can determine how a bad cite is displayed (hetsch) * added option to disable RelaxNG validation (Jasper Op de Coul) * distutils was replaced with setuptools (Joshua Carp) * bug fixes (Yaroslav Halchenko, David Lesieur) * CitationStylesBibliography.bibliography() now returns the list of entries ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/README.md0000644000175100017510000000741215234654005015051 0ustar00runnerrunner# citeproc-py [![PyPI - Version](https://img.shields.io/pypi/v/citeproc-py)](https://pypi.org/project/citeproc-py/) [![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/citeproc-py/citeproc-py/test.yml)](https://github.com/citeproc-py/citeproc-py/actions?query=branch%3Amaster+workflow%3ATest) [![Coveralls](https://img.shields.io/coverallsCoverage/github/citeproc-py/citeproc-py)](https://coveralls.io/github/citeproc-py/citeproc-py) citeproc-py is a [CSL](https://citationstyles.org/) processor for Python. It aims to implement the [CSL 1.0.2 specification](https://docs.citationstyles.org/en/v1.0.2/specification.html). citeproc-py can output styled citations and bibliographies in a number of different output formats. Currently supported are plain text, reStructuredText and HTML. Other formats can be added easily. citeproc-py uses [semantic versioning](https://semver.org/). Currently, its major version number is still at 0, meaning the API is not yet stable. However, you should not expect to see any major API changes soon. ## Requirements citeproc-py supports Python 3.9 and up. It depends on [lxml](https://lxml.de/) for parsing and navigating the CSL style and locale files. # Installation The recommended way of installing citeproc-py is by using [pip](https://pip.pypa.io/en/latest/): ```bash pip install citeproc-py ``` If `lxml` isn't installed, `pip` will try to install it for you. If you insist, you can manually install citeproc-py from distribution packages hosted at [PyPI](https://pypi.python.org/pypi/citeproc-py/). Please ignore the release archives offered by GitHub. ## Getting Started To get started with citeproc-py, take a look at the examples under `examples/`. Two examples are provided, one parsing references from a JSON representation of references as supported by citeproc-js, another parsing the references from a BibTeX file. Both show and explain how to cite references and render the bibliography. ## CSL Compatibility Currently, citeproc-py passes almost 60% of the (relevant) tests in the [citeproc-test suite](https://github.com/citation-style-language/test-suite). However, it is more than 60% complete, as citeproc-py doesn't take care of double spaces and repeated punctuation marks yet, making a good deal of the tests fail. In addition, the following features have not yet been implemented (there are probably some I forgot though): - disambiguation/year-suffix - et-al-subsequent-min/et-al-subsequent-use-first - collapsing - punctuation-in-quote - display Also, some [citeproc-js](https://github.com/juris-m/citeproc-js) functionality that is not part of the CSL spec is not (yet) supported: - raw dates - static-ordering - literal names ## Contributing citeproc-py is 100% volunteer maintained, and new contributions are always welcome. If you would like to contribute, please follow the guidelines in the [CONTRIBUTING.md](https://github.com/citeproc-py/citeproc-py/blob/master/CONTRIBUTING.md) file. ## Local Install and Running the Tests First clone the `citeproc-py` repository and install the submodules with ```bash git submodule update --init ``` Then install with ```bash pip install --editable . ``` Then move to the `tests` directory and run ```bash python citeproc-test.py ``` Run ```bash citeproc-test.py --help ``` to see its usage information. The first time you run the script it will clone the [citeproc-test suite](https://github.com/citation-style-language/test-suite) repository into the `tests` directory and checkout the last tested version. By default failed tests are automatically added into the `failing_tests.txt` file and aren't shown when running the test suite again. If you want git to fully ignore the submodule, you can type ```bash git update-index --assume-unchanged citeproc/data/schema ``` ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1785944092.6908922 citeproc_py-0.10.4/citeproc/0000755000175100017510000000000015234654035015401 5ustar00runnerrunner././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/citeproc/__init__.py0000644000175100017510000000370515234654005017514 0ustar00runnerrunner import os import json from . import types, formatter DATA_PATH = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'data') SCHEMA_PATH = os.path.join(DATA_PATH, 'schema', 'schemas', 'styles', 'csl.rng') LOCALES_PATH = os.path.join(DATA_PATH, 'locales') STYLES_PATH = os.path.join(DATA_PATH, 'styles') NAMES = ['author', 'collection_editor', 'composer', 'container_author', 'editor', 'editorial_director', 'illustrator', 'interviewer', 'original_author', 'recipient', 'translator'] DATES = ['accessed', 'container', 'event_date', 'issued', 'original_date', 'submitted'] NUMBERS = ['chapter_number', 'collection_number', 'edition', 'issue', 'number', 'number_of_pages', 'number_of_volumes', 'volume'] VARIABLES = (['abstract', 'annote', 'archive', 'archive_location', 'archive_place', 'authority', 'call_number', 'citation_label', 'citation_number', 'collection_title', 'container_title', 'container_title_short', 'dimensions', 'DOI', 'event', 'event_place', 'first_reference_note_number', 'genre', 'ISBN', 'ISSN', 'jurisdiction', 'keyword', 'language', 'locator', 'medium', 'note', 'original_publisher', 'original_publisher_place', 'original_title', 'page', 'page_first', 'PMCID', 'PMID', 'publisher', 'publisher_place', 'references', 'section', 'source', 'status', 'title', 'title_short', 'URL', 'version', 'year_suffix'] + NAMES + DATES + NUMBERS) with open(os.path.join(LOCALES_PATH, 'locales.json'), encoding='utf-8') as file: locales_json = json.load(file) PRIMARY_DIALECTS = locales_json['primary-dialects'] LANGUAGE_NAMES = locales_json['language-names'] from .frontend import CitationStylesStyle, CitationStylesBibliography from .source import Citation, CitationItem, Locator from . import _version __version__ = _version.get_versions()['version'] ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1785944092.7112699 citeproc_py-0.10.4/citeproc/_version.py0000644000175100017510000000076215234654035017604 0ustar00runnerrunner # This file was generated by 'versioneer.py' (0.29) from # revision-control system data, or from the parent directory name of an # unpacked source archive. Distribution tarballs contain a pre-generated copy # of this file. import json version_json = ''' { "date": "2026-08-05T15:34:47+0000", "dirty": false, "error": null, "full-revisionid": "8f606263f171c2fe21cef8e66402dc096f8edf05", "version": "0.10.4" } ''' # END VERSION_JSON def get_versions(): return json.loads(version_json) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1785944092.6871307 citeproc_py-0.10.4/citeproc/data/0000755000175100017510000000000015234654035016312 5ustar00runnerrunner././@PaxHeader0000000000000000000000000000003200000000000010210 xustar0026 mtime=1785944092.70179 citeproc_py-0.10.4/citeproc/data/locales/0000755000175100017510000000000015234654035017734 5ustar00runnerrunner././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-af-ZA.xml0000644000175100017510000007322015234654007022777 0ustar00runnerrunner This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2025-10-16T03:08:07+00:00 geraadpleeg aanlyn voordrukweergawe album en e.a. anoniem by klankopname beskikbaar by deur circa aangehaal et al. film voorhande van voortaan ibid. in ter perse internet brief loc.cit. sonder jaar sine loco sine nomine op aanlyn op.cit. oorspronklik gepubliseer persoonlike kommunikasie podsending podsendingepisode voordruk gelewer by die radio-uitsending radioreeks radioreeksepisode verwysing verwysings geraadpleeg resensie van skaal spesiale uitgawe spesiale afdeling televisie-uitsending televisiereeks televisiereeksepisode video konsepdokument anon. ca. s.j. s.l. s.n. verw. verws. resensie v. voordruk-artikel joernaalartikel tydskrifartikel koerantartikel wetsontwerp uitsending klassieke werk versameling datastel dokument inskrywing woordeboekinskrywing ensiklopedie-inskrywing geleentheid visuele materiaal verhoor onderhoud regsaak wetgewing manuskrip kaart video-opname musiekpartituur pamflet kongresartikel patent optrede tydskrif persoonlike kommunikasie inskrywing bloginskrywing regulasie verslag resensie boekresensie sagteware klankopname lesing norm tesis verdrag webblad joernaalart. tydskrifart. koerantart. dok. visuele mat. interv. ms. video rec. rep. rev. bk. rev. audio rec. getuienis gelewer deur geresenseer deur boekresensie van AD v.C. VAJ AJ : , ; ste ste de de de de de de ste de de de de de de de de de de de ste eerste tweede derde vierde vyfde sesde sewende agste negende tiende bedryf bedrywe bylaag bylae artikel artikels boek boeke kanon kanons hoofstuk hoofstukke kolom kolomme posisie posisies vergelyking vergelykings figuur figure folio folio's nommer nommers reël reëls aantekening aantekeninge opus opera bladsy bladsye paragraaf paragrawe deel dele bepaling bepalings toneel tonele afdeling afdelings sub verbo sub verbis bylaag bylae tabel tabelle titel titels vers verse volume volumes byl. byl. art. arts. bk. hfst. kol. loc. locs. verg. vergs. fig. fol. nr. r. aant. op. bl. ble. par. dl. bep. beps. sc. scs. afd. s.v. s.vv. byl. byl. tab. tabs. tit. tits. vs. vse. vol. vols. ¶¶ § §§ chapter chapters citation citations number numbers uitgawe uitgawes verwysing verwysings nommer nommers pagina paginas volume volumes pagina paginas druk drukke weergawe hfst. hfste. verw. verws. nr. uitg. verw. verws. nr. nrs. p. pp. vol. vols. p. pp. dr. dre. voorsitter voorsitters redakteur redakteurs samesteller samestellers bydraer bydraers kurator kuratore regisseur regisseurs redakteur redakteurs redakteur & vertaler redakteurs & vertalers redakteur & vertaler redakteurs & vertalers reeksredakteur reeksredakteurs uitvoerende vervaardiger uitvoerende vervaardigers gas gaste aanbieder aanbieders illustreerder illustreerders verteller vertellers organiseerder organiseerders kunstenaar kunstenaars vervaardiger vervaardigers draaiboekskrywer draaiboekskrywers reeksskepper reeksskeppers vertaler vertalers samest. samest. bydraer bydraers cur. curs. reg. regs. red. reds. red. & vert. reds. & verts. red. & vert. reds. & verts. red. reds. exec. prod. exec. prods. ill. ills. vert. verts. org. orgs. perf. perfs. prod. prods. skr. skrs. cre. cres. vert. verts. onder voorsitterskap van onder redaksie van saamgestel deur deur met onder kurasie van onder regie van geredigeer deur geredigeer en vertaal deur geredigeer en vertaal deur onder redaksie van uitvoerend vervaardig deur met verskyning deur aangebied deur geïllustreer deur onderhoud gevoer deur vertel deur georganiseer deur uitgevoer deur vervaardig deur aan resensie van geskryf deur geskep deur vertaal deur geredigeer deur opg. deur met gekureer deur gedir. deur o.r.v. gered. & vert. deur gered. & vert. deur o.r.v. exec. prod. by w. guest hosted by geïill. deur vertel georg. deur perf. by prod. by geskr. deur cre. by vert. deur Januarie Februarie Maart April Mei Junie Julie Augustus September Oktober November Desember Jan. Feb. Mrt. Apr. Mei Jun. Jul. Aug. Sep. Okt. Nov. Des. Lente Somer Herfs Winter ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-ar.xml0000644000175100017510000006237215234654007022511 0ustar00runnerrunner Mazen Amria t.mazenamria@gmail.com abdealikhurrum Dr. Ayman Saleh This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-03-09T22:17:05+01:00 تاريخ الوصول advance online publication album و وآخرون مجهول عند audio recording موجود في عن طريق حوالي وثق وآخرون film التالي من henceforth المرجع السابق في قيد النشر انترنت خطاب loc. cit. دون تاريخ no place no publisher on مباشر على الإنترنت op. cit. original work published اتصال شخصي podcast podcast episode preprint قُدَّم في radio broadcast radio series radio series episode مرجع مراجع استرجع في review of السلم الموسيقي special issue special section television broadcast television series television series episode video working paper مجهول حوالي د.ت n.p. n.p. مرجع مراجع rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing مقابلة legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical اتصال شخصي post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book ب.م. ق.م. BCE CE " " ' ' : , ; الأول الثاني الثالث الرابع الخامس السادس السابع الثامن التاسع العاشر الأولى الثانية الثالثة الرابعة الخامسة السادسة السابعة الثامنة التاسعة العاشرة act acts appendix appendices article articles كتاب كتب canon canons فصل فصول عمود أعمدة location locations equation equations رسم توضيحي رسوم توضيحية ورقة أوراق عدد أعداد سطر أسطر ملاحظة ملاحظات نوته موسيقية نوتات موسيقية صفحة صفحات فقرة فقرات جزء أجزاء rule rules scene scenes قسم أقسام تفسير فرعي تفسيرات فرعية supplement supplements table tables title titles بيت شعر أبيات شعر مجلد مجلدات app. apps. art. arts. كتاب فصل عمود loc. locs. eq. eqs. رسم توضيحي مطوية عدد سـ ملاحظة نوتة موسيقية ص ص فقرة ج r. rr. sc. scs. قسم تفسير فرعي تفسيرات فرعية supp. supps. tbl. tbls. tit. tits. بيت شعر أبيات شعر م م ¶¶ § §§ chapter chapters citation citations عدد أعداد الطبعة الطبعات ملاحظة ملاحظات number numbers صفحة صفحات volume volumes page pages printing printings إصدار إصدارات chap. chaps. cit. cits. عدد ط ملاحظة no. nos. ص ص vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators إدارة تحقيق ترجمة وتحقيق ترجمة وتحقيق إدارة التحرير executive producer executive producers guest guests host hosts رسوم narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators ترجمة comp. comps. contrib. contribs. cur. curs. exec. prod. exec. prods. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. chaired by edited by compiled by إنشاء with curated by إشراف تحقيق تحقيق وترجمة تحقيق وترجمة إعداد executive produced by with guest hosted by رسوم مقابلة مع narrated by organized by performed by produced by المستلم مراجعة written by created by ترجمة ed. by comp. by w. cur. by dir. by ed. by ed. & trans. by ed. & trans. by ed. by exec. prod. by w. guest hosted by narr. by org. by perf. by prod. by writ. by cre. by يناير فبراير مارس أبريل مايو يونيو يوليو أغسطس سبتمبر أكتوبر نوفمبر ديسمبر يناير فبراير مارس أبريل مايو يونيو يوليو أغسطس سبتمبر أكتوبر نوفمبر ديسمبر ربيع صيف خريف شتاء ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-bal-PK.xml0000644000175100017510000004410615234654007023150 0ustar00runnerrunner عثمان This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2025-10-18T05:53:07+00:00 رسایی کرتگ دیما شتگیں تندتاک البم ءُ آ دِگه گمنام پر تواربند رسان پر گون کم ءُ گیش سرشون داته آ دِگه تامُر آیوک از چد ءُ رند ایزن در در چاپار نٹ چٹی ایزن بے رمس بے جاه بے شنگکار پر تندیم ایزن اسلیں کار شنگ کرتگ زاتییں رسانک پاڈکسٹ پاڈکسٹ اپیسوڈ پریپرنٹ پیش کرتگ پر ریڈیو براڈکسٹ ریڈیو ردیگ ریڈیو ردیگ سرشون سرشون هاسل کرتگ چمشانک از سکیل هاسیں تاک هاسین باب ٹیوی براڈکسٹ ٹیوی ردیگ ٹیوی اپیسوڈ ویڈیو ورکنگ پیپر پریپرنٹ نبشتانک میگزینءِ نبشتانک اکبارءِ نبشتانک بِل براڈکسٹ کلیسک جمانک ڈیٹاسٹ مدرک اندراج لبزبلدءِ اندراج زانتگنجءِ اندراج گندک نگاری سمایت هالتران شر کانودسازی دزنبشت نکشه ویڈیو ریکارڈ زیمرییں سکور پمپلٹ کانفرنس پیپر پیٹنٹ ناٹک تیلبند زاتییں رسانک پُسٹ بلاگ پُسٹ ریگولیشن اهوال چمشانک کتابءِ چمشانک نرم‌ابزار تواربند گشتانک انجار تهیسس پیمان تندیم سبوت داته از چمشانک کرتگ از کتابءِ چمشانک کرتگ از میلادی پیشمیلاد پیشمیلاد میلادی : ، ؛ می یکمی دومی سیمی چارمی پنچمی ششمی هپتمی هشتمی نهمی دهمی ایکٹ ایکٹ زمیمه زمیمه نبشتانک نبشتانک کتاب کتاب کانون کانون در در تنب تنب جاه جاه مساوات مساوات تسویر تسویر پولیو پولیو تاک تاک بند بند نوٹ نوٹ کارنامه کارنامه تاکدیم تاکدیم بهرگ بهرگ بهر بهر رول رول ندارگ ندارگ باب باب زیر کلمه زیر کلمه لاهک لاهک ٹیبل ٹیبل سرگال سرگال لچه لچه جلد جلد ¶¶ § §§ در در سرشون سرشون نمبر نمبر چاپرد چاپرد سرشون سرشون نمبر نمبر تاکدیم تاکدیم جلد جلد تاکدیم تاکدیم چاپکاری چاپکاری ورژن ورژن چیر چیر شونکار شونکار نزاروک نزاروک بهرشتکار بهرشتکار کیوریٹر کیوریٹر سوجکار سوجکار شونکار شونکار شونکار ءُ رجانکار شونکار ءُ رجانکار شونکار ءُ رجانکار شونکار ءُ رجانکار سرشونکار سرشونکار انتزامیه انتزامیه مهمان مهمان واسیدار واسیدار مسور مسور راوی راوی برجمدار برجمدار ازمکار ازمکار پروڈیوسر پروڈیوسر لبزانت لبزانت ردیگءِ ساچشتکار ردیگءِ ساچشتکار رجانکار رجانکار چیر کرتگ گون ردینته گون نزآرته گون پربسته گون نبشته گون بهرشته گون کیوریٹ کرتگ گون سوج داته گون ردینته گون ردینته ءُ رجانک کرتگ گون ردینته ءُ رجانک کرتگ گون ردینته گون انتزامیه گون مهمان گون واسیدار گون مسور گون انٹرویو گون راوی گون واسیدار گون نبشته گون ازمکاری گون پروڈیوس کرتگ گون په نبشته گون نبشته گون ساچشته گون رجانک کرتگ گون جنوری پروری مارچ اپریل میی جون جلاییی اگست ستمبر اکتوبر نومبر دسمبر جنو پرو مار اپر میی جون جلا اگس‍ ستم‍ اکت‍ نوم‍ دسم‍ بهار گرماگ توهمشان زمستان ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-bg-BG.xml0000644000175100017510000006651615234654007022771 0ustar00runnerrunner This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 Valeriya Simeonova simeonova@fmi.uni-sofia.bg http://www.mendeley.com/profiles/valeriya-simeonova/ отворен на advance online publication album и и други анонимен в audio recording достъпен на от около цитиран и съавт. film предстоящ от henceforth пак там в под печат интернет писмо loc. cit. без дата no place no publisher on онлайн op. cit. original work published лична комуникация podcast podcast episode preprint представен на radio broadcast radio series radio series episode източник източници изтеглен на review of скала special issue special section television broadcast television series television series episode video working paper анон. ок. б.д. n.p. n.p. изт. изт. rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing интервю legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical лична комуникация post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book сл.хр. пр.хр. BCE CE : , ; то во ро то во ро то ти ви ри ти ви ри ти та ва ра та ва ра та първo вторo третo четвъртo петo шестo седмo осмo деветo десетo първи втори трети четверти пети шести седми осми девети десети първа втора трета четверта пета шеста седма осма девета десета act acts appendix appendices article articles книга книги canon canons глава глави колона колони location locations equation equations фигура фигури фолио фолия брой броеве ред редове бележка бележки опус опуси страница страници абзац абзаци част части rule rules scene scenes раздел раздели под раздел под раздели supplement supplements table tables title titles стихотворение стихове том томове app. apps. art. arts. кн. гл. кол. loc. locs. eq. eqs. фиг. фол. бр. р. бел. оп. стр. абз. ч. r. rr. sc. scs. разд. подразд. supp. supps. tbl. tbls. tit. tits. ст. том томове ¶¶ § §§ chapter chapters citation citations брой броеве издание издания бележка бележки number numbers брой страници volume volumes page pages printing printings версия chap. chaps. cit. cits. изд. бел. no. nos. бр.стр. vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators режисьор редактор редактори editor & translator editors & translators editor & translator editors & translators главен редактор редакторски колектив executive producer executive producers guest guests host hosts илюстрации narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators преводач преводачи comp. comps. contrib. contribs. cur. curs. реж. ред. ред.кол. ред. & прев. ред.кол. & прев. ред. & прев. ред.кол. & прев. гл.ред. гл.ред.кол. exec. prod. exec. prods. ил. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. прев прев.кол. chaired by edited by compiled by от with curated by под общата редакция на редактиран от редактирано & преведено от редактирано & преведено от главен редактор executive produced by with guest hosted by илюстрации от интервюиран от narrated by organized by performed by produced by до рецензент written by created by преведен от ed. by comp. by w. cur. by п.о.р. ред. ред. & прев. от ред. & прев. от гл.ред. exec. prod. by w. guest hosted by ил. narr. by org. by perf. by prod. by writ. by cre. by прев. Януари Февруари Март Април Май Юни Юли Август Септември Октомври Ноември Декември Яну Фев Мар Апр Май Юни Юли Авг Сеп Окт Ное Дек Пролет Лято Есен Зима ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-brh-PK.xml0000644000175100017510000004445415234654007023173 0ustar00runnerrunner عثمان This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2025-10-18T05:53:06+00:00 رسوخ کرے پیشگی آن لائن چھاپ البم پر پین پین گم پن اوڑیک آڈیو ریکارڈ داڑیک دوبروک اونگان تقریباً حوالہ تس پین پین فلم بردورہ‌ٹی ایکان اینگی ایضاً اونگی چھاپہ‌ٹی انٹرنیٹ چٹھی ایضاً بے تاریخ بے جاگہ بے چھاپہ خانہ زی آن لائن ایضاً اصل کار چھاپ کرے ذاتی ہیت پاڈکاسٹ پاڈکاسٹ ایپیسوڈ پریپرنٹ کانفرنس ریڈیو تالان کننگ ریڈیو سلسلہ ریڈیو ایپیسوڈ حوالہ حوالہ‌غاک حاصل کرے ریویوکہ سکیل خاص شمارہ خاص جز ٹیلی ویژن تالان کننگ ٹیلی ویژن سلسلہ ٹیلی ویژن ایپیسوڈ ویڈیو ورکنگ پیپر مضمون جرنیل‌نا مضمون میگزین‌نا مضمون اخبارنا مضمون بِل تالان کننگ کلیسک مجموعہ ڈیٹا سیٹ دستاویز اندراج ڈکشنری‌نا اندراج انسائیکلو پیڈیانا اندراج واقعہ نگاری پیشی انٹرویو مقدمہ قانود نامہ مسودہ نقشہ ویڈیو ریکارڈ سازی سکور پمفلٹ کانفرنس پیپر پیٹنٹ ناٹک مدت‌نا چھاپ ذاتی ہیت پوسٹ بلاگ پوسٹ ضابطہ روداد ریویو کتابی ریویو سافٹویر آڈیو ریکارڈ تران علمدار تهیسس عہد نامہ ویب پنہ پیشی‌کہ ریویوکہ کتاب‌نا ریویوکہ عیسوی سن مست عیسوی سن مست عام سن عام سن : ، ؛ میکو لیکو میکو اولیکو ارٹمیکو مسٹمیکو چارمیکو پنچمیکو ششمیکو ہفتمیکو ہشتمیکو نوہمیکو دہمیکو ایکٹ ایکٹاک ضمیمہ ضمیمہ‌غاک مضمون مضمونک کتاب کتاباک قانود قانوداک در دک کالم کالمک جاگہ جاگہ‌غاک مساوات مساواتاک تصویر تصویک فولیو فولیوک شمارہ شمارہ‌غاک قطار قطاک نوٹ نوٹاک کارنامہ کارنامہ‌غاک پنہ پنہ‌غاک بہرگ بہرگاک حصہ حصہ‌غاک رول رولک سین سینک جز جزک زیر کلمہ زیر کلمہ‌غاک لاحق لاحقاک ٹیبل ٹیبلک سرورق سرورقاک شعر شعک جلد جلداک ¶¶ § §§ در دک حوالہ حوالہ‌غاک نمبر نمبک چھاپ چھاپاک حوالہ حوالہ‌غاک نمبر نمبک پنہ پنہ‌غاک جلد جلداک پنہ پنہ‌غاک ٹپو ٹپوک ورژن ورژنک چیر چیک ایڈٹر ایڈٹک سرجم کروک سرجم کروکاک حصہ دار حصہ داک کیوریٹر کیودیٹک ڈائریکٹر ڈائریکٹک ایڈٹر ایڈٹک ایڈٹر & مترجم ایڈٹک & مترجمک ایڈٹر & مترجم ایڈٹک & مترجمک ایڈٹر ایڈٹک انتظامیہ انتظامیہ مہمان مہمانک مہمانی کروک مہمانی کروکاک مصور مصوک راوی راویک تنظیم کروک نظیم کروکاک فنکار فنکاک پیدا کروک پیدا کروکاک لکھوک لکھوکاک سلسلہ ودی کروک سلسلہ ودی کروکاک مترجم مترجمک چیرٹ ایڈٹرٹ سرجم کروکٹ ترکیب کروک لکھوکٹ حصہ دارٹ کیوریٹرٹ ڈائریکٹرٹ ایڈٹرٹ مترجمٹ & ایڈٹرٹ مترجمٹ & ایڈٹرٹ ایڈٹرٹ انتظامیٹ مہمانٹ مہمانی کروکٹ مصورٹ انٹرویوئٹ راویئٹ تنظیم کروکٹ لکھوکٹ فنکارٹ پیدا کروکٹ وصول کروکٹ لکھوکٹ لکھوکٹ سلسلہ ودی کروکٹ مترجمٹ جنوری فروری مارچ اپریل مئی جون جلائی اگست ستمبر اکتوبر نومبر دسمبر جنو فرو مار اپر مئی جون جلا اگس‍ ستم‍ اکت‌ نوم‍ دسم‌ ہتم تیرمہ خزان سیڷ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-ca-AD.xml0000644000175100017510000006435015234654007022752 0ustar00runnerrunner anidal javimat jotaemi This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2025-10-16T03:08:07+00:00 consulta avançament de publicació en línia àlbum i i altres anònim a enregistrament d'àudio disponible a per circa citat et al. pel·lícula previst de en endevant ibíd. dins en impremta internet carta loc. cit. sense data sense lloc sense nom a en línia op. cit. obra original publicada el comunicació personal pòdcast capítol de pòdcast preprint presentat a emissió de ràdio sèrie de ràdio capítol de sèrie de ràdio referència referències recuperat ressenya de escala número especial secció especial emissió de televisió sèrie de televisió capítol de sèrie de televisió vídeo working paper anòn. c. s.d. s.l. s.n. ref. ref. res. de preprint article de revista acadèmica article de revista article de diari projecte de llei emissió clàssic col·lecció dataset document entrada entrada de diccionari entrada d'enciclopèdia esdeveniment gràfic vista entrevista causa judicial legislació manuscrit mapa enregistrament de vídeo partitura musical fullet comunicació patent actuació periòdic comunicació personal post entrada de blog regulació informe revisió ressenya de llibre programari enregistrament d'àudio presentació estàndard tesi tractat lloc web art. acad. art. rev. art. diari doc. graf. entr. manus. video inf. rev. res. àudio testimoni de revisió de ressenya del llibre dC aC BCE CE « » - : , ; a è r n r t primera segona tercera quarta cinquena sisena setena vuitena novena desena primer segon tercer quart cinquè sisè setè vuitè novè desè acte actes apèndix apèndixs article articles llibre llibres cànon cànons capítol capítols columna columnes localització localitzacions equació equacions figura figures foli folis número números línia línies nota notes opus opera pàgina pàgines paràgraf paràgrafs part parts norma normes escena escenes secció seccions sub voce sub vocibus suplement suplements taula taules títol títols vers versos volum volums ap. aps. art. arts. llib. cap. col. loc. locs. eq. eqs. fig. f. núm. l. n. op. p. pp. par. pt. r. rr. sc. scs. sec. s.v. s.v. sup. sups. tbl. tbls. tit. tits. v. v. vol. vol. § § § § capítol capítols cita cites número números edició edicions referència referències número números pàgina pàgines volum volums pàgina pàgines impressió impressions versió cap. caps. cit. cits. núm. ed. ref. refs. núm. núms. p. pp. vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators director directors editor editors editor i traductor editors i traductors editor i traductor editors i traductors editor editors executive producer executive producers guest guests host hosts il·lustrador il·lustradors narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators traductor traductors comp. comps. contrib. contribs. cur. curs. dir. dir. ed. ed. ed. i trad. ed. i trad. ed. i trad. ed. i trad. ed. ed. exec. prod. exec. prods. il·lust. il·lust. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. trad. trad. chaired by editat per compilat per per amb curat per dirigit per editat per editat i traduït per editat i traduït per editat per producció executiva de amb la participació de presentat per il·lustrat per entrevista feta per narrat per organitzat per representat per produït per a per escrit per creat per traduït per ed. comp. amb cur. dir. ed. ed. i trad. per ed. i trad. per ed. prod. exec. amb pres. il·lust. narr. org. act. prod. escr. crea. trad. gener febrer març abril maig juny juliol agost setembre octubre novembre desembre gen. feb. març abr. maig juny jul. ago. set. oct. nov. des. primavera estiu tardor hivern ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-cs-CZ.xml0000644000175100017510000006103215234654007023016 0ustar00runnerrunner nosaal Andrew Dunning https://orcid.org/0000-0003-0464-5036 libora Michal Hoftich This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-02-04T00:00:00+00:00 viděno dostupné online před tiskem album a a další anonym v zvukový záznam dostupné z od asi citován et al. film nadcházející z dále jen ibid. in v tisku internet dopis loc. cit. nedatováno sine loco neuvedeno on online op. cit. původní dílo vydáno osobní komunikace podcast podcast episode preprint prezentováno v radio broadcast radio series radio series episode reference reference získáno review of měřítko special issue special section television broadcast television series television series episode video working paper vid. anon. cca. b.r. s.l. neuved. ref. ref. rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing interview legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical osobní komunikace post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book n. l. př. n. l. BCE CE : , ; . první druhé třetí čtvrté páté šesté sedmé osmé deváté desáté act acts appendix appendices article articles kniha knihy canon canons kapitola kapitoly sloupec sloupce location locations equation equations obrázek obrázky list listy číslo čísla řádek řádky poznámka poznámky opus opusy strana strany odstavec odstavce část části rule rules scene scenes sekce sekce pod heslem pod hesly supplement supplements table tables title titles verš verše ročník ročníky app. apps. art. arts. k. kap. sl. loc. locs. eq. eqs. obr. l. č. ř. pozn. op. s. s. odst. č. r. rr. sc. scs. sek. s.v. s.v. supp. supps. tbl. tbls. tit. tits. v. v. roč. roč. ¶¶ § §§ chapter chapters citation citations číslo čísla vydání vydání poznámka poznámky number numbers strana strany volume volumes page pages printing printings verze chap. chaps. cit. cits. č. vyd. pozn. no. nos. s. s. vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators ředitel ředitelé editor editoři editor a překladatel editoři a překladatelé editor a překladatel editoři a překladatelé vedoucí editor vedoucí editoři executive producer executive producers guest guests host hosts ilustrátor ilustrátoři narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators překladatel překladatelé comp. comps. contrib. contribs. cur. curs. řed. řed. ed. ed. ed. a přel. ed. a přel. ed. a přel. ed. a přel. ed. ed. exec. prod. exec. prods. il. il. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. přel. přel. chaired by edited by compiled by with curated by řídil editoval editoval a přeložil editoval a přeložil editoval executive produced by with guest hosted by ilustroval rozhovor vedl narrated by organized by performed by produced by pro recenzoval written by created by přeložil ed. by comp. by w. cur. by řed. ed. ed. a přel. ed. a přel. ed. exec. prod. by w. guest hosted by ilust. narr. by org. by perf. by prod. by writ. by cre. by přel. leden únor březen duben květen červen červenec srpen září říjen listopad prosinec led. úno. bře. dub. kvě. čer. čvc. srp. zář. říj. lis. pro. jaro léto podzim zima ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-cy-GB.xml0000644000175100017510000006075015234654007023006 0ustar00runnerrunner This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 gwelwyd advance online publication album a/ac ac eraill di-enw at audio recording ar gael gan circa dyfynnwyd et al. film ar fin ymddangos gan henceforth ibid. yn yn y wasg rhyngrwyd llythyr loc. cit. dim dyddiad no place no publisher on arlein op. cit. original work published cyfathrebu personol podcast podcast episode preprint cyflwynwyd yn radio broadcast radio series radio series episode cyfeirnod cyfeirnodau gwelwyd review of graddfa special issue special section television broadcast television series television series episode video working paper dienw c. d.d. n.p. n.p. cyf. cyf’au. rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing cyfweliad legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical cyfathrebu personol post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book OC CC BCE CE : , ; th af il ydd ed ed ed cyntaf ail trydydd pedwerydd pumed chweched seithfed wythfed nawfed degfed act acts appendix appendices article articles llyfr llyfrau canon canons pennod penodau colofn colofnau location locations equation equations ffigwr ffigyrau ffolio ffolios rhifyn rhifynnau llinell llinellau nodyn nodiadau opus opera tudalen tudalennau paragraff paragraffau rhan rhannau rule rules scene scenes adran adrannau sub verbo sub verbis supplement supplements table tables title titles pennill penillion cyfrol cyfrolau app. apps. art. arts. llyfr. pen. col. loc. locs. eq. eqs. ffig. ff. rhif. ll. n. op. t. tt. para. rhan. r. rr. sc. scs. adr. s.v. s.vv. supp. supps. tbl. tbls. tit. tits. p. pp. rhif. rhifu. ¶¶ § §§ chapter chapters citation citations rhifyn rhifynnau argraffiad argraffiadau nodyn nodiadau number numbers tudalen tudalennau volume volumes page pages printing printings fersiwn chap. chaps. cit. cits. rhif. arg. n. no. nos. t. tt. vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators cyfarwyddwr cyfarwyddwyr golygydd golygyddion golygydd a chyfieithydd golygyddion a chyfieithwyr golygydd a chyfieithydd golygyddion a chyfieithwyr cyfarwyddwr-golygyddol cyfarwyddwyr-golygyddol executive producer executive producers guest guests host hosts darlunydd darlunwyr narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators cyfieithydd cyfieithwyr comp. comps. contrib. contribs. cur. curs. cyf. cyfy. gol. goln. gol. a chyf. goln. a chyf. gol. a chyf. goln. a chyf. gol. goln. exec. prod. exec. prods. darlun. darlun. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. cyf. cyf. chaired by edited by compiled by gan with curated by cyfarwyddwyd gan golygwyd gan golygwyd a chyfieithwyd gan golygwyd a chyfieithwyd gan cyfarwyddwyd a golygwyd gan executive produced by with guest hosted by darlunwyd gan cyfweliad gan narrated by organized by performed by produced by i gan written by created by cyfieithwyd gan ed. by comp. by w. cur. by cyf. gan gol. gan gol. a chyf. gan gol. a chyf. gan cyf.-gol. gan exec. prod. by w. guest hosted by darlun. gan narr. by org. by perf. by prod. by writ. by cre. by cyf. gan Ionawr Chwefror Mawrth Ebrill Mai Mehefin Gorffennaf Awst Medi Hydref Tachwedd Rhagfyr Ion. Chwe. Maw. Ebr. Mai Meh. Gorff. Aws. Med. Hyd. Tach. Rhag. Gwanwyn Haf Hydref Gaeaf ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-da-DK.xml0000644000175100017510000006061715234654007022767 0ustar00runnerrunner Niels Erik Wille Jonas Nyrup hafnius mufalab mufa@kb.dk This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-04-29T00:00:00+00:00 set online forhåndsvisning album og med flere anonym lydoptagelse tilgængelig hos af cirka henvist m.fl. film kommende fra fra nu af ibid. i i trykken internet brev loc. cit. uden år uden sted uden forlag on online op. cit. originalt værk udgivet personlig kommunikation podcast podcast episode preprint præsenteret ved radio broadcast radio series radioudsendelse reference referencer hentet anmeldelse af skala temanummer særafsnit tv-udsendelse tv-serie tv-serie episode video arbejdspapir anon. ca. u.å. u.s. u.f. ref. refr. rev. of artikel tidsskriftsartikel magasinartikel avisartikel lovforslag broadcast klassik samling dataset dokument entry ordbog opslag encyklopædi opslag begivenhed figur høring interview dom lovgivning manuskript kort film partitur pamflet konferencepapir patent performance tidsskrift personlig kommunikation post blog post bestemmelse rapport anmeldelse boganmeldelse software sang presentation standard afhandling traktat hjemmeside tss.art. mag.art. avisart. doc. fig. interv. MS film rep. rev. bog anm. sang testimony of review of review of the book e.v.t. f.v.t. BCE CE : , ; . første anden tredje fjerde femte sjette syvende ottende niende tiende act acts appendix appendices article articles bog bøger canon canons kapitel kapitler kolonne kolonner location locations equation equations figur figurer folio folio nummer numre linje linjer note noter opus opus side sider afsnit afsnit del dele rule rules scene scenes paragraf paragraffer sub voce sub voce supplement supplements table tables title titles vers vers bind bind app. apps. art. arts. b. kap. kol. loc. locs. eq. eqs. fig. fol. nr. l. n. op. s. s. afs. d. r. rr. sc. scs. par. s.v. s.v. supp. supps. tbl. tbls. tit. tits. v. v. bd. bd. ¶¶ § §§ chapter chapters citation citations nummer numre udgave udgaver note noter nummer numre side sider volume volumes page pages printing printings version chap. chaps. cit. cits. nr. udg. n. no. nos. s. s. vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators instruktør instruktører redaktør redaktører redaktør & oversætter redaktører & oversættere redaktør & oversætter redaktører & oversættere redaktør redaktører executive producer executive producers guest guests host hosts illustrator illustratorer narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators oversætter oversættere comp. comps. contrib. contribs. cur. curs. instr. instr. red. red. red. & overs. red. & overs. red. & overs. red. & overs. red. red. exec. prod. exec. prods. ill. ill. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. overs. overs. chaired by edited by compiled by af with curated by instrueret af redigeret af redigeret & oversat af redigeret & oversat af redigeret af executive produced by with guest hosted by illustreret af interviewet af narrated by organized by performed by produced by modtaget af af written by created by oversat af ed. by comp. by w. cur. by instr. red. red. & overs. af red. & overs. af red. exec. prod. by w. guest hosted by illus. narr. by org. by perf. by prod. by writ. by cre. by overs. januar februar marts april maj juni juli august september oktober november december jan. feb. mar. apr. maj jun. jul. aug. sep. okt. nov. dec. Forår Sommer Efterår Vinter ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-de-AT.xml0000644000175100017510000006221515234654007022775 0ustar00runnerrunner Till A. Heilmann Georg Duffner Sebastian Karcher Sylvester Keil jakov Frank Bennett Patrick O'Brien Nicolas Chachereau This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2025-10-16T03:24:00+00:00 zugegriffen Online-Vorab-Publikation Album und und andere ohne Autor auf Tonaufnahme verfügbar unter von circa zitiert u. a. Film i. E. von zukünftig ebd. in im Druck Internet Brief loc. cit. ohne Datum ohne Ort ohne Verlag auf online op. cit. Ursprünglich erschienen persönliche Kommunikation Podcast Podcast-Episode Preprint gehalten auf der Radioaufzeichnung Sendereihe Sendereihenfolge Referenz Referenzen abgerufen review of Maßstab Spezialausgabe Sonderbereich Fernsehsendung Fernsehserie Serienfolge Video Arbeitspapier o. A. ca. o. J. o. O. o. V. Ref. Ref. rev. of Zeitschriftenartikel Magazinartikel Zeitungsartikel Gesetzentwurf Sendung Klassiker Sammlung Datensatz Dokument Eintrag Wörterbucheintrag Lexikoneintrag Event Bild Anhörung Interview Rechtsfall Gesetz Manuskript Karte Videoaufnahme Partitur Broschüre Konferenzbeitrag Patent Aufführung Zeitschrift persönliche Kommunikation Post Blogeintrag Verordnung Bericht Rezension Buchbesprechung Software Audioaufnahme Vortrag Norm Abschlussarbeit Abkommen Webseite Zeitschriftenart. Mag. Art. Zeitungsart. doc. Bild Interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book  n. Chr.  v. Chr. BCE CE : , ; . erster zweiter dritter vierter fünfter sechster siebter achter neunter zehnter act acts Appendix Appendices Artikel Artikel Buch Bücher canon canons Kapitel Kapitel Spalte Spalten location locations equation equations Abbildung Abbildungen Blatt Blätter Nummer Nummern Zeile Zeilen Anmerkung Anmerkungen Opus Opera Seite Seiten Absatz Absätze Teil Teile rule rules scene scenes Abschnitt Abschnitte sub verbo sub verbis supplement supplements table tables title titles Vers Verse Band Bände app. apps. art. arts. B. Kap. Sp. loc. locs. eq. eqs. Abb. Fol. Nr. Z. Anm. op. S. S. Abs. Teil r. rr. sc. scs. Abschn. s. v. s. vv. supp. supps. tbl. tbls. tit. tits. V. V. Bd. Bde. ¶¶ § §§ chapter chapters citation citations Nummer Nummern Auflage Auflagen Ref. Ref. Nummer Nummern Seite Seiten volume volumes page pages printing printings Version chap. chaps. cit. cits. Nr. Aufl. Ref. Ref. Nr. Nr. S. S. vol. vols. p. pp. print. prints. Vorsitz Vorsitz Reihenherausgeber Reihenherausgeber Bearbeiter Bearbeiter Beitragende Beitragende Direktor Direktor Regisseur Regisseure Herausgeber Herausgeber Herausgeber & Übersetzer Herausgeber & Übersetzer Herausgeber & Übersetzer Herausgeber & Übersetzer Herausgeber Herausgeber Produktionsleiter Produktionsleiter Gast Gäste Gastgeber Gastgeber Illustrator Illustratoren Erzähler Erzähler Organisator Organisatoren Künstler Künstler Produzent Produzenten Drehbuchautor Drehbuchautoren Idee Idee Übersetzer Übersetzer Hrsg. Hrsg. comp. comps. contrib. contribs. cur. curs. Reg. Reg. Hrsg. Hrsg. Hrsg. & Übers. Hrsg. & Übers. Hrsg. & Übers. Hrsg. & Übers. Hrsg. Hrsg. exec. prod. exec. prods. Ill. Ill. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. Übers. Übers. Vorsitz durch herausgegeben von kompiliert von von mit kuriert von Regie von herausgegeben von herausgegeben und übersetzt von herausgegeben und übersetzt von herausgegeben von Produktionsleitung von mit Gast veranstaltet von illustriert von interviewt von Narration von organisiert von Aufführung von produziert von an von geschrieben von Idee von übersetzt von hrsg. von komp. von m. kur. von Reg. hrsg. von hg. & übers. von hg. & übers. von hrsg. von Prod. gel. v. w. guest veranst. von illus. von Narr. von org. von aufg. von prod. von geschr. von Idee von übers. von Jänner Februar März April Mai Juni Juli August September Oktober November Dezember Jän. Feb. März Apr. Mai Juni Juli Aug. Sep. Okt. Nov. Dez. Frühjahr Sommer Herbst Winter ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-de-CH.xml0000644000175100017510000006170015234654007022761 0ustar00runnerrunner Till A. Heilmann Sylvester Keil jakov Sebastian Karcher Patrick O'Brien Nicolas Chachereau This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2025-10-16T03:24:00+00:00 zugegriffen Online-Vorab-Publikation Album und und andere ohne Autor auf Tonaufnahme verfügbar unter von circa zitiert u. a. Film i. E. von zukünftig ebd. in im Druck Internet Brief loc. cit. ohne Datum ohne Ort ohne Verlag auf online op. cit. Ursprünglich erschienen persönliche Kommunikation Podcast Podcast-Episode preprint gehalten auf der Radioaufzeichnung Sendereihe Sendereihenfolge Referenz Referenzen abgerufen Review von Massstab Spezialausgabe Sonderbereich Fernsehsendung Fernsehserie Serienfolge Video Arbeitspapier o. A. ca. o. J. o. O. o. V. Ref. Ref. Rev. von Preprint Zeitschriftenartikel Magazinartikel Zeitungsartikel Gesetzentwurf broadcast Klassiker Sammlung Datensatz Dokument Eintrag Wörterbucheintrag Lexikoneintrag Event Rechtsfall Gesetz Manuskript Karte Videoaufnahme Partitur Broschüre Konferenzbeitrag Patent Aufführung Zeitschrift persönliche Kommunikation Post Blogeintrag Verordnung Bericht Rezension Buchbesprechung Software Audioaufnahme Vortrag Norm Abschlussarbeit Abkommen Webseite Zeitschriftenart. Mag. Art. Yeitungsart. doc. Bild Interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book  n. Chr.  v. Chr. BCE CE « » : , ; . erster zweiter dritter vierter fünfter sechster siebter achter neunter zehnter act acts Appendix Appendices Artikel Artikel Buch Bücher canon canons Kapitel Kapitel Spalte Spalten location locations equation equations Abbildung Abbildungen Blatt Blätter Nummer Nummern Zeile Zeilen Anmerkung Anmerkungen Opus Opera Seite Seiten Absatz Absätze Teil Teile rule rules scene scenes Abschnitt Abschnitte sub verbo sub verbis supplement supplements table tables title titles Vers Verse Band Bände app. apps. art. arts. B. Kap. Sp. loc. locs. eq. eqs. Abb. Fol. Nr. Z. Anm. op. S. S. Abs. Teil r. rr. sc. scs. Abschn. s. v. s. vv. supp. supps. tbl. tbls. tit. tits. V. V. Bd. Bde. ¶¶ § §§ chapter chapters citation citations Nummer Nummern Auflage Auflagen Ref. Ref. number numbers Seite Seiten volume volumes page pages printing printings Version chap. chaps. cit. cits. Nr. Aufl. Ref. Ref. no. nos. S. S. vol. vols. p. pp. print. prints. Vorsitz Vorsitz Reihenherausgeber Reihenherausgeber Bearbeiter Bearbeiter Beitragende Beitragende Direktor Direktor Regisseur Regisseure Herausgeber Herausgeber Herausgeber & Übersetzer Herausgeber & Übersetzer Herausgeber & Übersetzer Herausgeber & Übersetzer Herausgeber Herausgeber Produktionsleiter Produktionsleiter Gast Gäste Gastgeber Gastgeber Illustrator Illustratoren Erzähler Erzähler Organisator Organisatoren Darsteller Darsteller Produzent Produzenten Drehbuchautor Drehbuchautoren Seriencreator Seriencreatoren Übersetzer Übersetzer Hrsg. Hrsg. comp. comps. Bearb. Bearb. Dir. Dir. Reg. Reg. Hrsg. Hrsg. Hrsg. & Übers. Hrsg. & Übers. Hrsg. & Übers. Hrsg. & Übers. Hrsg. Hrsg. exec. prod. exec. prods. Ill. Ill. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. Übers. Übers. Vorsitz durch herausgegeben von kompiliert von von mit kuriert von Regie von herausgegeben von herausgegeben und übersetzt von herausgegeben und übersetzt von herausgegeben von Produktionsleitung von mit Gast veranstaltet von illustriert von interviewt von Narration von organisiert von Aufführung von produziert von an von geschrieben von Idee von übersetzt von hrsg. von komp. von m. kur. von Reg. hrsg. von hg. & übers. von hg. & übers. von hrsg. von Prod. gel. v. mit Gast veranst. von illus. von Narr. von org. von aufg. von prod. von writ. by cre. by übers. von Januar Februar März April Mai Juni Juli August September Oktober November Dezember Jan. Feb. März Apr. Mai Juni Juli Aug. Sep. Okt. Nov. Dez. Frühjahr Sommer Herbst Winter ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-de-DE.xml0000644000175100017510000006215115234654007022760 0ustar00runnerrunner Till A. Heilmann Ulrich Rintze M. Zelle Sebastian Karcher jakov Patrick O'Brien Nicolas Chachereau This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2025-10-16T03:24:00+00:00 zugegriffen Online-Vorab-Publikation Album und und andere ohne Autor auf Tonaufnahme verfügbar unter von circa zitiert u. a. Film i. E. von zukünftig ebd. in im Druck Internet Brief loc. cit. ohne Datum ohne Ort ohne Verlag auf online op. cit. Ursprünglich erschienen persönliche Kommunikation Podcast Podcast-Episode Preprint gehalten auf der Radioaufzeichnung Sendereihe Sendereihenfolge Referenz Referenzen abgerufen review of Maßstab Spezialausgabe Sonderbereich Fernsehsendung Fernsehserie Serienfolge Video Arbeitspapier o. A. ca. o. J. o. O. o. V. Ref. Ref. rev. of preprint Zeitschriftenartikel Magazinartikel Zeitungsartikel Gesetzentwurf Sendung Klassiker Sammlung Datensatz Dokument Eintrag Wörterbucheintrag Lexikoneintrag Event Bild Anhörung Interview Rechtsfall Gesetz Manuskript Karte Videoaufnahme Partitur Broschüre Konferenzbeitrag Patent Aufführung Zeitschrift persönliche Kommunikation Post Blogeintrag Verordnung Bericht Rezension Buchbesprechung Software Audioaufnahme Vortrag Norm Abschlussarbeit Abkommen Webseite Zeitschriftenart. Mag. Art. newspaper art. doc. Bild Interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book  n. Chr.  v. Chr. BCE CE : , ; . erster zweiter dritter vierter fünfter sechster siebter achter neunter zehnter Akt Akten Appendix Appendices Artikel Artikel Buch Bücher canon canons Kapitel Kapitel Spalte Spalten location locations equation equations Abbildung Abbildungen Blatt Blätter Nummer Nummern Zeile Zeilen Anmerkung Anmerkungen Opus Opera Seite Seiten Absatz Absätze Teil Teile rule rules scene scenes Abschnitt Abschnitte sub verbo sub verbis supplement supplements table tables title titles Vers Verse Band Bände app. apps. art. arts. B. Kap. Sp. loc. locs. eq. eqs. Abb. Fol. Nr. Z. Anm. op. S. S. Abs. Teil r. rr. sc. scs. Abschn. s. v. s. vv. supp. supps. tbl. tbls. tit. tits. V. V. Bd. Bde. ¶¶ § §§ chapter chapters citation citations Nummer Nummern Auflage Auflagen Ref. Ref. Nummer Nummern Seite Seiten volume volumes page pages printing printings Version chap. chaps. cit. cits. Nr. Aufl. Ref. Ref. Nr. Nr. S. S. vol. vols. p. pp. print. prints. Vorsitz Vorsitz Reihenherausgeber Reihenherausgeber Bearbeiter Bearbeiter Beitragende Beitragende Direktor Direktor Regisseur Regisseure Herausgeber Herausgeber Herausgeber & Übersetzer Herausgeber & Übersetzer Herausgeber & Übersetzer Herausgeber & Übersetzer Herausgeber Herausgeber Produktionsleiter Produktionsleiter Gast Gäste Gastgeber Gastgeber Illustrator Illustratoren Erzähler Erzähler Veranstalter Veranstalter Künstler Künstler Produzent Produzenten Drehbuchautor Drehbuchautoren Idee Idee Übersetzer Übersetzer Hrsg. Hrsg. comp. comps. contrib. contribs. cur. curs. Reg. Reg. Hrsg. Hrsg. Hrsg. & Übers. Hrsg. & Übers. Hrsg. & Übers. Hrsg. & Übers. Hrsg. Hrsg. exec. prod. exec. prods. Ill. Ill. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. Idee Idee Übers. Übers. Vorsitz durch herausgegeben von kompiliert von von mit kuriert von Regie von herausgegeben von herausgegeben und übersetzt von herausgegeben und übersetzt von herausgegeben von Produktionsleitung von mit Gast veranstaltet von illustriert von interviewt von Narration von organisiert von Aufführung von produziert von an von geschrieben von Idee von übersetzt von hrsg. von komp. von m. kur. von Reg. hrsg. von hg. & übers. von hg. & übers. von hrsg. von Prod. gel. v. w. guest veranst. von illus. von Narr. von org. von aufg. von prod. von writ. by Idee von übers. von Januar Februar März April Mai Juni Juli August September Oktober November Dezember Jan. Feb. März Apr. Mai Juni Juli Aug. Sep. Okt. Nov. Dez. Frühjahr Sommer Herbst Winter ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-el-GR.xml0000644000175100017510000006415515234654007023016 0ustar00runnerrunner thanasis57 dimtamb Patrick O'Brien This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 ημερομηνία πρόσβασης advance online publication album και και άλλοι ανώνυμο εφ. audio recording διαθέσιμο στο από περίπου παρατίθεται κ.ά. film προσεχές από henceforth στο ίδιο στο υπό έκδοση διαδίκτυο επιστολή loc. cit. χωρίς χρονολογία no place no publisher on έκδοση σε ψηφιακή μορφή op. cit. original work published προσωπική επικοινωνία podcast podcast episode preprint παρουσιάστηκε στο radio broadcast radio series radio series episode παραπομπή παραπομπές ανακτήθηκε review of κλίμακα special issue special section television broadcast television series television series episode video working paper ανών. περ. χ.χ. n.p. n.p. παρ. παρ. rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing συνέντευξη legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical προσωπική επικοινωνία post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book μ.Χ. π.Χ. BCE CE ' ' : , · ο η ος πρώτος δεύτερος τρίτος τέταρτος πέμπτος έκτος έβδομος όγδοος ένατος δέκατος act acts appendix appendices article articles βιβλίο βιβλία canon canons κεφάλαιο κεφάλαια στήλη στήλες location locations equation equations εικόνα εικόνες φάκελος φάκελοι τεύχος τεύχη σειρά σειρές σημείωση σημειώσεις έργο έργα σελίδα σελίδες παράγραφος παράγραφοι μέρος μέρη rule rules scene scenes τμήμα τμήματα λήμμα λήμματα supplement supplements table tables title titles στίχος στίχοι τόμος τόμοι app. apps. art. arts. βιβ. κεφ. στ. loc. locs. eq. eqs. εικ. φάκ τχ. γρ. σημ. έργ. σελ. σελ. παρ. μέρ. r. rr. sc. scs. τμ. λήμ. λήμ. supp. supps. tbl. tbls. tit. tits. στ. στ. τ. τ. ¶¶ § §§ chapter chapters citation citations τεύχος τεύχη έκδοση εκδόσεις σημείωση σημειώσεις number numbers σελίδα σελίδες volume volumes page pages printing printings εκδοχή chap. chaps. cit. cits. τχ. έκδ. σημ. no. nos. σ. σσ. vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators Διευθυντής Διευθυντές επιμελητής επιμελητές μεταφραστής και επιμελητής μεταφραστές και επιμελητές μεταφραστής και επιμελητής μεταφραστές και επιμελητές διευθυντής σειράς διευθυντές σειράς executive producer executive producers guest guests host hosts εικονογράφος εικονογράφοι narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators μεταφραστής μεταφραστές comp. comps. contrib. contribs. cur. curs. δ/ντης. δ/ντές. επιμ. επιμ. μτφ. και επιμ. μτφ. και επιμ. μτφ. και επιμ. μτφ. και επιμ. δ/ντής σειράς δ/ντές σειρας exec. prod. exec. prods. εικ. εικ.. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. μτφ. μτφ. chaired by edited by compiled by στον συλλ. τόμο with curated by διεύθυνση επιμέλεια μετάφραση και επιμέλεια μετάφραση και επιμέλεια διεύθυνση σειράς executive produced by with guest hosted by εικονογράφηση: συνέντευξη narrated by organized by performed by produced by παραλήπτης συγγραφέας: written by created by μετάφραση ed. by comp. by w. cur. by διευθ. επιμέλ. μετάφρ. και επιμέλ. μετάφρ. και επιμέλ. δ/νση σειράς exec. prod. by w. guest hosted by εικον. narr. by org. by perf. by prod. by writ. by cre. by μετάφρ. Ιανουάριος Φεβρουάριος Μάρτιος Απρίλιος Μάιος Ιούνιος Ιούλιος Αύγουστος Σεπτέμβριος Οκτώβριος Νοέμβριος Δεκέμβριος Ιανουαρίου Φεβρουαρίου Μαρτίου Απριλίου Μαΐου Ιουνίου Ιουλίου Αυγούστου Σεπτεμβρίου Οκτωβρίου Νοεμβρίου Δεκεμβρίου Άνοιξη Καλοκαίρι Φθινόπωρο Χειμώνας ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-en-GB.xml0000644000175100017510000007760315234654007023002 0ustar00runnerrunner Andrew Dunning https://orcid.org/0000-0003-0464-5036 Sebastian Karcher https://orcid.org/0000-0001-8249-7388 Rintze M. Zelle https://orcid.org/0000-0003-1779-8883 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 accessed advance online publication album and and others anonymous at audio recording available at by circa cited et al. film forthcoming from henceforth ibid. in in press internet letter loc. cit. no date no place no publisher on online op. cit. original work published personal communication podcast podcast episode preprint presented at the radio broadcast radio series radio series episode reference references retrieved review of scale special issue special section television broadcast television series television series episode video working paper adv. online pub. anon. au. rec. avail. at c. cit. flm fr. let. n.d. n.p. n.p. orig. pub. pers. comm. podcast ep. radio bdcst radio ser. radio ser. ep. ref. refs rtvd rev. of sc. spec. iss. spec. sect. TV bdcst TV ser. TV ser. ep. vid. wkg paper & @ preprint journal article magazine article newspaper article bill broadcast classical work archival collection data set document entry dictionary entry encyclopedia entry event graphic hearing interview legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical personal communication post blog post regulation report review book review software audio recording presentation standard thesis treaty web page jour. art. mag. art. newspaper art. bdcst class. wk arch. coll. doc. dict. entry ency. entry gr. int. leg. case legis. MS MSS vid. rec. mus. score pam. conf. paper pat. prfm. pers. comm. reg. rep. rev. bk rev. sftw. au. rec. std thes. web pg. testimony of review of review of the book test. of rev. of rev. of the bk AD BC BCE CE : , ; th st nd rd th th th first second third fourth fifth sixth seventh eighth ninth tenth act acts appendix appendices article articles book books canon canons chapter chapters column columns location locations equation equations figure figures folio folios issue issues line lines note notes opus opera page pages paragraph paragraphs part parts rule rules scene scenes section sections sub verbo sub verbis supplement supplements table tables title titles verse verses volume volumes app. apps art. arts bk bks can. cann. ch. chs col. cols loc. locs eq. eqq. fig. figs fol. fols no. nos l. ll. n. nn. op. opp. p. pp. para. paras pt pts r. rr. sc. scs sect. sects s.v. s.vv. suppl. suppls tbl. tbls tit. titt. v. vv. vol. vols c. cc. ¶¶ § §§ chapter chapters citation citations number numbers edition editions note notes number numbers page pages volume volumes page pages printing printings version versions ch. chs cit. cits no. nos edn edns n. nn. no. nos p. pp. vol. vols p. pp. ptg ptgs v. chair chairs editor editors compiler compilers contributor contributors curator curators director directors editor editors editor & translator editors & translators editor & translator editors & translators editor editors executive producer executive producers guest guests host hosts illustrator illustrators narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators translator translators ed. eds comp. comps contrib. contribs cur. curs dir. dirs ed. eds ed. & trans. eds & trans. ed. & trans. eds & trans. ed. eds exec. prod. exec. prods illus. narr. narrs org. orgs perf. perfs prod. prods wrtr wrtrs ser. creator ser. creators trans. chaired by edited by compiled by composed by by with curated by directed by edited by edited & translated by edited & translated by edited by executive produced by with guest with guests hosted by illustrated by interview by read by organized by by performed by produced by to by written by created by translated by ed. by comp. by comp. by cur. by dir. by ed. by ed. & trans. by ed. & trans. by ed. by exec. prod. by illus. by read by org. by perfd by prod. by writ. by trans. by January February March April May June July August September October November December Jan. Feb. Mar. Apr. May June July Aug. Sept. Oct. Nov. Dec. Spring Summer Autumn Winter ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-en-US.xml0000644000175100017510000007761115234654007023040 0ustar00runnerrunner Andrew Dunning https://orcid.org/0000-0003-0464-5036 Sebastian Karcher https://orcid.org/0000-0001-8249-7388 Rintze M. Zelle https://orcid.org/0000-0003-1779-8883 Denis Meier Brenton M. Wiernik https://orcid.org/0000-0001-9560-6336 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 accessed advance online publication album and and others anonymous at audio recording available at by circa cited et al. film forthcoming from henceforth ibid. in in press internet letter loc. cit. no date no place no publisher on online op. cit. original work published personal communication podcast podcast episode preprint presented at the radio broadcast radio series radio series episode reference references retrieved review of scale special issue special section television broadcast television series television series episode video working paper adv. online pub. anon. au. rec. avail. at c. cit. flm. fr. let. n.d. n.p. n.p. orig. pub. pers. comm. podcast ep. radio bdcst. radio ser. radio ser. ep. ref. refs. rtvd. rev. of sc. spec. iss. spec. sec. TV bdcst. TV ser. TV ser. ep. vid. wkg. paper & @ preprint journal article magazine article newspaper article bill broadcast classical work archival collection dataset document entry dictionary entry encyclopedia entry event graphic hearing interview legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical personal communication post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage jour. art. mag. art. newspaper art. bdcst. class. wk. arch. coll. doc. dict. entry ency. entry gr. int. leg. case legis. MS MSS vid. rec. mus. score pam. conf. paper pat. prfm. pers. comm. reg. rep. rev. bk. rev. sftw. au. rec. std. thes. webpg. testimony of review of review of the book test. of rev. of rev. of the bk. AD BC BCE CE : , ; th st nd rd th th th first second third fourth fifth sixth seventh eighth ninth tenth act acts appendix appendices article articles book books canon canons chapter chapters column columns location locations equation equations figure figures folio folios issue issues line lines note notes opus opera page pages paragraph paragraphs part parts rule rules scene scenes section sections sub verbo sub verbis supplement supplements table tables title titles verse verses volume volumes app. apps. art. arts. bk. bks. can. cann. chap. chaps. col. cols. loc. locs. eq. eqq. fig. figs. fol. fols. no. nos. l. ll. n. nn. op. opp. p. pp. para. paras. pt. pts. r. rr. sc. scs. sec. secs. s.v. s.vv. supp. supps. tbl. tbls. tit. titt. v. vv. vol. vols. c. cc. ¶¶ § §§ chapter chapters citation citations number numbers edition editions note notes number numbers page pages volume volumes page pages printing printings version versions chap. chaps. cit. cits. no. nos. ed. eds. n. nn. no. nos. p. pp. vol. vols. p. pp. ptg. ptgs. v. chair chairs editor editors compiler compilers contributor contributors curator curators director directors editor editors editor & translator editors & translators editor & translator editors & translators editor editors executive producer executive producers guest guests host hosts illustrator illustrators narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators translator translators ed. eds. comp. comps. contrib. contribs. cur. curs. dir. dirs. ed. eds. ed. & trans. eds. & trans. ed. & trans. eds. & trans. ed. eds. exec. prod. exec. prods. ill. ills. narr. narrs. org. orgs. perf. perfs. prod. prods. wrtr. wrtrs. ser. creator ser. creators trans. chaired by edited by compiled by composed by by with curated by directed by edited by edited & translated by edited & translated by edited by executive produced by with guest with guests hosted by illustrated by interview by narrated by organized by by performed by produced by to by written by created by translated by ed. by comp. by comp. by cur. by dir. by ed. by ed. & trans. by ed. & trans. by ed. by exec. prod. by ill. by narr. by org. by perf. by prod. by writ. by trans. by January February March April May June July August September October November December Jan. Feb. Mar. Apr. May June July Aug. Sept. Oct. Nov. Dec. Spring Summer Autumn Winter ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-es-CL.xml0000644000175100017510000006044515234654007023011 0ustar00runnerrunner Scott Sadowsky http://sadowsky.cl/ This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 accedido advance online publication album y et al. anónimo en audio recording disponible en de circa citado et al. film en preparación a partir de henceforth ibid. en en imprenta internet carta loc. cit. sin fecha no place no publisher on en línea op. cit. original work published comunicación personal podcast podcast episode preprint presentado en radio broadcast radio series radio series episode referencia referencias recuperado review of escala special issue special section television broadcast television series television series episode video working paper anón. c. s. f. n.p. n.p. ref. refs. rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing entrevista legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical comunicación personal post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book d. C. a. C. BCE CE : , ; ª primera segunda tercera cuarta quinta sexta séptima octava novena décima act acts appendix appendices article articles libro libros canon canons capítulo capítulos columna columnas location locations equation equations figura figuras folio folios número números línea líneas nota notas opus opera página páginas párrafo párrafos parte partes rule rules scene scenes sección secciones sub voce sub vocibus supplement supplements table tables title titles verso versos volumen volúmenes app. apps. art. arts. lib. cap. col. loc. locs. eq. eqs. fig. f. l. n. op. p. pp. párr. pt. r. rr. sc. scs. sec. s. v. s. vv. supp. supps. tbl. tbls. tit. tits. v. vv. vol. vols. § § § § chapter chapters citation citations número números edición ediciones nota notas number numbers página páginas volume volumes page pages printing printings versión chap. chaps. cit. cits. ed. n. no. nos. p. pp. vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators director directores editor editores editor y traductor editores y traductores editor y traductor editores y traductores coordinador coordinadores executive producer executive producers guest guests host hosts ilustrador ilustradores narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators traductor traductores comp. comps. contrib. contribs. cur. curs. dir. dirs. ed. eds. ed. y trad. eds. y trads. ed. y trad. eds. y trads. coord. coords. exec. prod. exec. prods. ilust. ilusts. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. trad. trads. chaired by edited by compiled by de with curated by dirigido por editado por editado y traducido por editado y traducido por coordinado por executive produced by with guest hosted by ilustrado por entrevistado por narrated by organized by performed by produced by a por written by created by traducido por ed. by comp. by w. cur. by dir. ed. ed. y trad. ed. y trad. coord. exec. prod. by w. guest hosted by ilust. narr. by org. by perf. by prod. by writ. by cre. by trad. enero febrero marzo abril mayo junio julio agosto septiembre octubre noviembre diciembre ene. feb. mar. abr. may jun. jul. ago. sep. oct. nov. dic. primavera verano otoño invierno ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-es-ES.xml0000644000175100017510000006033215234654007023015 0ustar00runnerrunner javimat This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 accedido advance online publication album y y otros anónimo en audio recording disponible en de circa citado et al. film previsto a partir de henceforth ibid. en en imprenta internet carta loc. cit. sin fecha no place no publisher on en línea op. cit. obra original publicada en comunicación personal podcast podcast episode preprint presentado en radio broadcast radio series radio series episode referencia referencias recuperado review of escala special issue special section television broadcast television series television series episode video working paper anón. c. s. f. n.p. n.p. ref. refs. rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing entrevista legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical comunicación personal post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book d. C. a. C. BCE CE « » - : , ; primera segunda tercera cuarta quinta sexta séptima octava novena décima act acts appendix appendices article articles libro libros canon canons capítulo capítulos columna columnas location locations equation equations figura figuras folio folios número números línea líneas nota notas opus opera página páginas párrafo párrafos parte partes rule rules scene scenes sección secciones sub voce sub vocibus supplement supplements table tables title titles verso versos volumen volúmenes app. apps. art. arts. lib. cap. col. loc. locs. eq. eqs. fig. f. n.º l. n. op. p. pp. párr. pt. r. rr. sc. scs. sec. s. v. s. vv. supp. supps. tbl. tbls. tit. tits. v. vv. vol. vols. § § § § chapter chapters citation citations número números edición ediciones nota notas number numbers página páginas volume volumes page pages printing printings versión chap. chaps. cit. cits. n.º ed. n. no. nos. p. pp. vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators director directores editor editores editor y traductor editores y traductores editor y traductor editores y traductores editor editores executive producer executive producers guest guests host hosts ilustrador ilustradores narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators traductor traductores comp. comps. contrib. contribs. cur. curs. dir. dirs. ed. eds. ed. y trad. eds. y trads. ed. y trad. eds. y trads. ed. eds. exec. prod. exec. prods. ilust. ilusts. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. trad. trads. chaired by edited by compiled by de with curated by dirigido por editado por editado y traducido por editado y traducido por editado por executive produced by with guest hosted by ilustrado por entrevistado por narrated by organized by performed by produced by a por written by created by traducido por ed. by comp. by w. cur. by dir. ed. ed. y trad. ed. y trad. ed. exec. prod. by w. guest hosted by ilust. narr. by org. by perf. by prod. by writ. by cre. by trad. enero febrero marzo abril mayo junio julio agosto septiembre octubre noviembre diciembre ene. feb. mar. abr. may jun. jul. ago. sep. oct. nov. dic. primavera verano otoño invierno ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-es-MX.xml0000644000175100017510000006265115234654007023040 0ustar00runnerrunner Juan Ignacio Flores Salgado https://www.mendeley.com/profiles/juan-ignacio-flores-salgado/ This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 consultado advance online publication album y et al. anónimo en audio recording disponible en de circa citado et al. film en preparación a partir de henceforth ibid. en en imprenta internet carta loc. cit. sin fecha no place no publisher on en línea op. cit. obra original publicada en comunicación personal podcast podcast episode preprint presentado en radio broadcast radio series radio series episode referencia referencias recuperado review of escala special issue special section television broadcast television series television series episode video working paper anón. c. s/f n.p. n.p. ref. refs. rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing entrevista legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical comunicación personal post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book d. C. a. C. BCE CE : , ; a a o primera segunda tercera cuarta quinta sexta séptima octava novena décima act acts appendix appendices article articles libro libros canon canons capítulo capítulos columna columnas location locations equation equations figura figuras folio folios número números línea líneas nota notas opus opera página páginas párrafo párrafos parte partes rule rules scene scenes sección secciones sub voce sub vocibus supplement supplements table tables title titles verso versos volumen volúmenes app. apps. art. arts. lib. libs. cap. caps. col. cols. loc. locs. eq. eqs. fig. figs. f. ff. núm. núms. l. ls. n. nn. op. opp. p. pp. párr. párrs. pt. pts. r. rr. sc. scs. sec. secs. s. v. s. vv. supp. supps. tbl. tbls. tit. tits. v. vv. vol. vols. § § chapter chapters citation citations número números edición ediciones nota notas number numbers página páginas volume volumes page pages printing printings versión chap. chaps. cit. cits. núm. núms. ed. eds. n. nn. no. nos. p. pp. vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators director directores editor editores editor y traductor editores y traductores editor y traductor editores y traductores coordinador coordinadores executive producer executive producers guest guests host hosts ilustrador ilustradores narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators traductor traductores comp. comps. contrib. contribs. cur. curs. dir. dirs. ed. eds. ed. y trad. eds. y trads. ed. y trad. eds. y trads. coord. coords. exec. prod. exec. prods. ilust. ilusts. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. trad. trads. chaired by edited by compiled by de with curated by dirigido por editado por editado y traducido por editado y traducido por coordinado por executive produced by with guest hosted by ilustrado por entrevistado por narrated by organized by performed by produced by a por written by created by traducido por ed. by comp. by w. cur. by dir. ed. ed. y trad. ed. y trad. coord. exec. prod. by w. guest hosted by ilust. narr. by org. by perf. by prod. by writ. by cre. by trad. enero febrero marzo abril mayo junio julio agosto septiembre octubre noviembre diciembre ene. feb. mar. abr. may jun. jul. ago. sep. oct. nov. dic. primavera verano otoño invierno ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-et-EE.xml0000644000175100017510000006030715234654007023002 0ustar00runnerrunner Andrew Dunning https://orcid.org/0000-0003-0464-5036 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-04-29T00:00:00+00:00 vaadatud advance online publication album ja ja teised anonüümne audio recording kättesaadav aadressil umbes tsiteeritud et al. film ilmumisel henceforth ibid. trükis internet kiri loc. cit. s.a. no place no publisher on online op. cit. original work published isiklik suhtlus podcast podcast episode preprint esitatud radio broadcast radio series radio series episode viide viited vaadatud review of scale special issue special section television broadcast television series television series episode video working paper anon u s.a. n.p. n.p. viide viited rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing intervjuu legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical isiklik suhtlus post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book pKr eKr BCE CE : , ; . esimene teine kolmas neljas viies kuues seitsmes kaheksas üheksas kümnes act acts appendix appendices article articles raamat raamatud canon canons peatükk peatükid veerg veerud location locations equation equations joonis joonised foolio fooliod number numbrid rida read viide viited opus opera lehekülg leheküljed lõik lõigud osa osad rule rules scene scenes alajaotis alajaotised sub verbo sub verbis supplement supplements table tables title titles värss värsid köide köited app. apps. art. arts. rmt ptk v loc. locs. eq. eqs. joon f nr l. n. op lk lk lõik osa r. rr. sc. scs. alajaot. s.v. s.vv. supp. supps. tbl. tbls. tit. tits. v vv kd kd ¶¶ § §§ chapter chapters citation citations number numbrid väljaanne väljaanded viide viited number numbers lehekülg leheküljed volume volumes page pages printing printings version chap. chaps. cit. cits. nr tr n. no. nos. lk lk vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators director directors toimetaja toimetajad toimetaja & tõlkija toimetajad & tõlkijad toimetaja & tõlkija toimetajad & tõlkijad toimetaja toimetajad executive producer executive producers guest guests host hosts illustrator illustrators narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators tõlkija tõlkijad comp. comps. contrib. contribs. cur. curs. dir. dirs. toim toim toim & tõlk toim & tõlk toim & tõlk toim & tõlk toim toim exec. prod. exec. prods. ill. ills. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. tõlk tõlk chaired by edited by compiled by with curated by directed by toimetanud toimetanud & tõlkinud toimetanud & tõlkinud toimetanud executive produced by with guest hosted by illustrated by intervjueerinud narrated by organized by performed by produced by by written by created by tõlkinud ed. by comp. by w. cur. by dir. toim toim & tõlk toim & tõlk toim exec. prod. by w. guest hosted by illus. narr. by org. by perf. by prod. by writ. by cre. by tõlk jaanuar veebruar märts aprill mai juuni juuli august september oktoober november detsember jaan veebr märts apr mai juuni juuli aug sept okt nov dets kevad suvi sügis talv ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-eu.xml0000644000175100017510000006077015234654007022520 0ustar00runnerrunner Amaraun Miren BZ This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 eskuratua advance online publication album eta eta beste ezezaguna -(e)n audio recording available at -(e)k egina inguru aipatua et al. film bidean hemendik: henceforth ibíd. in moldiztegian internet gutuna loc. cit. datarik gabe no place no publisher on sarean op. cit. original work published komunikazio pertsonala podcast podcast episode preprint -(e)n aurkeztua radio broadcast radio series radio series episode aipamena aipamenak berreskuratua review of scale special issue special section television broadcast television series television series episode video working paper ezez. ing. d. g. n.p. n.p. aip. aip. rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing elkarrizketa legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical komunikazio pertsonala post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book K.a. K.o. BCE CE « » : , ; . lehenengo bigarren hirugarren laugarren bosgarren seigarren zazpigarren zortzigarren bederatzigarren hamargarren act acts appendix appendices article articles liburua liburuak canon canons kapitulua kapituluak zutabea zutabeak location locations equation equations irudia irudiak orria orriak zenbakia zenbakiak lerroa lerroak oharra oharrak obra obrak orrialdea orrialdeak paragrafoa paragrafoak zatia zatiak rule rules scene scenes atala atalak sub voce sub vocem supplement supplements table tables title titles bertsoa bertsoak liburukia liburukiak app. apps. art. arts. lib. kap. zut. loc. locs. eq. eqs. iru. or. zenb. l. n. op. or. or. par. zt. r. rr. sc. scs. atal. s.v. s.v. supp. supps. tbl. tbls. tit. tits. b. bb. libk. libk. ¶¶ § § chapter chapters citation citations zenbakia zenbakiak argitalpena argitalpenak oharra oharrak number numbers orrialdea orrialdeak volume volumes page pages printing printings bertsioa chap. chaps. cit. cits. zenb. arg. n. no. nos. or. or. vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators director directors argitaratzailea argitaratzaileak argitaratzaile eta itzultzailea argitaratzaile eta itzultzaileak argitaratzaile eta itzultzailea argitaratzaile eta itzultzaileak argitaratzailea argitaratzaileak executive producer executive producers guest guests host hosts illustrator illustrators narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators itzultzailea itzultzaileak comp. comps. contrib. contribs. cur. curs. dir. dirs. arg. arg. arg. eta itzul. arg. eta itzul. arg. eta itzul. arg. eta itzul. arg. arg. exec. prod. exec. prods. ill. ills. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. itzul. itzul. chaired by edited by compiled by with curated by directed by -(e)k argitaratua -(e)k argitaratu eta itzulia -(e)k argitaratu eta itzulia -(e)k argitaratua executive produced by with guest hosted by illustrated by -(e)k elkarrizketatua narrated by organized by performed by produced by -(r)entzat by written by created by -(e)k itzulia ed. by comp. by w. cur. by dir. arg. -(e)k arg. eta itzul. -(e)k arg. eta itzul. arg. exec. prod. by w. guest hosted by illus. narr. by org. by perf. by prod. by writ. by cre. by itzul. urtarrila otsaila martxoa apirila maiatza ekaina uztaila abuztua iraila urria azaroa abendua urt. ots. mar. apr. mai. eka. uzt. abz. ira. urr. aza. abe. udaberria uda udazkena negua ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-fa-IR.xml0000644000175100017510000006253715234654007023010 0ustar00runnerrunner Hamed Heydari abdealikhurrum This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 دسترسی advance online publication album و و دیگران ناشناس در audio recording قابل دسترس در توسط تقریباً ارجاع شده و همکاران film در دست انتشار از henceforth همان در زیر چاپ اینترنت نامه loc. cit. بدون تاریخ no place no publisher on آنلاین op. cit. original work published ارتباط شخصی podcast podcast episode preprint ارائه شده در radio broadcast radio series radio series episode مرجع مراجع retrieved review of scale special issue special section television broadcast television series television series episode video working paper ناشناس c. بدون تاریخ n.p. n.p. مرجع مراجع rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing مصاحبه legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical ارتباط شخصی post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book بعد از میلاد قبل از میلاد BCE CE : , ; اول دوم سوم چهارم پنجم ششم هفتم هشتم نهم دهم act acts appendix appendices article articles کتاب کتاب‌های canon canons فصل فصل‌های ستون ستون‌های location locations equation equations تصویر تصاویر برگ برگ‌های شماره شماره‌های خط خطوط یادداشت یادداشت‌های قطعه قطعات صفحه صفحات پاراگراف پاراگراف‌های بخش بخش‌های rule rules scene scenes قسمت قسمت‌های در ذیلِ واژه در ذیلِ واژه‌های supplement supplements table tables title titles بیت بیت‌های جلد جلدهای app. apps. art. arts. کتاب فصل ستون loc. locs. eq. eqs. تصویر برگ ش خط یادداشت قطعه ص صص پاراگراف بخش r. rr. sc. scs. قسمت s.v s.vv supp. supps. tbl. tbls. tit. tits. بیت ابیات ج جج ¶¶ § §§ chapter chapters citation citations شماره شماره‌های ویرایش ویرایش‌های یادداشت یادداشت‌های number numbers صفحه صفحات volume volumes page pages printing printings نسخه chap. chaps. cit. cits. ش ویرایش یادداشت no. nos. ص صص vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators director directors ویراستار ویراستاران ویراستار و مترجم ویراستاران و مترجمین ویراستار و مترجم ویراستاران و مترجمین ویراستار ویراستاران executive producer executive producers guest guests host hosts طراح گرافیک طراحان گرافیک narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators مترجم مترجمین comp. comps. contrib. contribs. cur. curs. dir. dirs. ویراستار ویراستاران ویراستار و مترجم ویراستاران و مترجمین ویراستار و مترجم ویراستاران و مترجمین ویراستار ویراستاران exec. prod. exec. prods. تصویرگر تصویرگران narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. مترجم مترجمین chaired by edited by compiled by توسط with curated by زیر نظر ویراسته‌ی ترجمه و ویراسته‌ی ترجمه و ویراسته‌ی ویراسته‌ی executive produced by with guest hosted by طراحی گرافیکی از مصاحبه توسط narrated by organized by performed by produced by به بازبینی توسط written by created by ترجمه‌ی ed. by comp. by w. cur. by dir. ویراسته‌ی ترجمه و ویراسته‌ی ترجمه و ویراسته‌ی ویراسته‌ی exec. prod. by w. guest hosted by طراحی از narr. by org. by perf. by prod. by writ. by cre. by ترجمه‌ی ژانویه فوریه مارس آوریل می ژوئن جولای آگوست سپتامبر اکتبر نوامبر دسامبر ژانویه فوریه مارس آوریل می ژوئن جولای آگوست سپتامبر اکتبر نوامبر دسامبر بهار تابستان پاییز زمستان ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-fi-FI.xml0000644000175100017510000006135315234654007022777 0ustar00runnerrunner Janne Huovari snissine villelahtinen Juhana Venäläinen Tuomas Hietala Luukas Pörtfors This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2025-10-16T03:24:01+00:00 viitattu advance online publication albumi ja ym. tuntematon osoitteessa äänite saatavissa tekijä noin viitattu ym. film tulossa osoitteesta henceforth mt. teoksessa painossa internet kirje loc. cit. ei päivämäärää no place no publisher on verkossa op. cit. original work published henkilökohtainen viestintä podcast podcast episode preprint esitetty tilaisuudessa radiolähetys radio series radio series episode viittaus viittaukset noudettu review of mittakaava erikoisnumero special section televisiolähetys televisiosarja televisiosarjan jakso video working paper tuntematon n. ei pvm. n.p. n.p. viit. viit. rev. of preprint journal article magazine article newspaper article bill lähetys classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing haastattelu legal case legislation käsikirjoitus kartta videotallenne musical score pamphlet conference paper patentti esitys periodical henkilökohtainen viestintä post blogikirjoitus regulation raportti review kirja-arvostelu ohjelmisto äänite esitys standardi thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book jKr. eKr. eaa. jaa. : , ; . ensimmäinen toinen kolmas neljäs viides kuudes seitsemäs kahdeksas yhdeksäs kymmenes act acts appendix appendices article articles kirja kirjat canon canons luku luvut palsta palstat location locations equation equations kuvio kuviot folio foliot numero numerot rivi rivit huomautus huomautukset opus opukset sivu sivut kappale kappaleet osa osat rule rules scene scenes osa osat sub verbo sub verbis supplement supplements table tables title titles säkeistö säkeistöt volyymi volyymit app. apps. art. arts. kirja luku palsta loc. locs. eq. eqs. kuv. fol. nro r. huom. op. s. s. kappale osa r. rr. sc. scs. osa s.v. s.vv. supp. supps. tbl. tbls. tit. tits. säk. säk. vol. vol. ¶¶ § §§ luku luvut viite viitteet numero numerot painos painokset viite viitteet number numbers sivu sivut volume volumes sivu sivut printing printings versio chap. chaps. cit. cits. nro p. ref. refs. no. nos. s. s. vol. vols. s. s. print. prints. chair chairs toim. toim. compiler compilers contributor contributors kuraattori kuraattorit ohjaaja ohjaajat toimittaja toimittajat toimittaja ja kääntäjä toimittajat ja kääntäjät toimittaja ja kääntäjä toimittajat ja kääntäjät toimittaja toimittajat executive producer executive producers guest guests host hosts kuvittaja kuvittajat narrator narrators järjestäjä järjestäjät esittäjä esittäjät tuottaja tuottajat käsikirjoittaja käsikirjoittajat sarjan luoja sarjan luojat kääntäjä kääntäjät comp. comps. contrib. contribs. cur. curs. ohj. ohj. toim. toim. toim. ja käänt. toim. ja käänt. toim. ja käänt. toim. ja käänt. toim. toim. exec. prod. exec. prods. kuv. kuv. narr. narrs. org. orgs. esitt. esitt. tuott. tuott. käsik. käsik. cre. cres. käänt. käänt. chaired by toimittanut compiled by with kuratoinut ohjannut toimittanut toimittanut ja kääntänyt toimittanut ja kääntänyt toimittanut executive produced by with guest hosted by kuvittanut haastatellut narrated by järjestänyt esittänyt tuottanut vastaanottaja käsikirjoittanut created by kääntänyt ed. by comp. by w. cur. by ohj. toim. toim. ja käänt. toim. ja käänt. toim. exec. prod. by w. guest hosted by kuv. narr. by org. by esitt. tuott. käsik. cre. by käänt. tammikuuta helmikuuta maaliskuuta huhtikuuta toukokuuta kesäkuuta heinäkuuta elokuuta syyskuuta lokakuuta marraskuuta joulukuuta tammi helmi maalis huhti touko kesä heinä elo syys loka marras joulu kevät kesä syksy talvi ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-fr-CA.xml0000644000175100017510000007612415234654007022777 0ustar00runnerrunner Grégoire Colly Collectif Zotero francophone This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2025-10-18T05:52:36+00:00 consulté le publication en ligne anticipée album et et autres anonyme sur enregistrement audio disponible sur par vers cité et al. film à paraître à l'adresse désormais ibid. dans sous presse Internet lettre loc. cit. sans date sans lieu sans nom sur en ligne op. cit. édition originale communication personnelle balladodiffusion épisode de balladodiffusion prépublication présenté à émission de radio série radiophonique épisode de série radiophonique référence références consulté recension de échelle numéro spécial section spéciale émission de télévision série télévisée épisode de série télévisée vidéo document de travail publ. en ligne antic. anon. enr. audio dispo. sur v. cité film à l'adr. let. s. d. s. l. s. n. éd. orig. comm. perso. épis. de ballado. émiss. de radio épis. de série radio réf. réf. consulté recens. de éch. nᵒ spéc. sect. spéc. émiss. de TV série TV épis. de série TV vidéo doc. de travail & @ article article de revue article de magazine article de presse projet de loi émission classique collection jeu de données document entrée entrée de dictionnaire entrée d'encyclopédie événement image audience entretien affaire acte juridique manuscrit carte enregistrement vidéo partition musicale pamphlet article de colloque brevet interprétation périodique communication personnelle billet billet de blogue règlement rapport recension recension de livre logiciel chanson présentation norme thèse traité page web art. de revue art. de mag. art. de presse class. coll. doc. entrée de dict. entrée d'encycl. img. entret. aff. acte jurid. ms. mss. enr. vidéo partit. music. pamph. art. de conf. brevet interprét. comm. perso. règl. rapp. recens. recens. de livre logic. enr. audio norme thèse p. web témoignage de recension recension de livre témoign. de recens. de recens. de livre apr. J.-C. av. J.-C. av. n. è. n. è. «   »  : ,  ; ʳᵉ ᵉʳ premier deuxième troisième quatrième cinquième sixième septième huitième neuvième dixième acte actes appendice appendices article articles livre livres canon canons chapitre chapitres colonne colonnes emplacement emplacements équation équations figure figures folio folios numéro numéros ligne lignes note notes opus opus page pages paragraphe paragraphes partie parties règle règles scène scènes section sections sub verbo sub verbis supplément suppléments tableau tableaux titre titres verset versets volume volumes append. append. art. art. livre livres can. can. chap. chap. col. col. emplact emplact eqt. eqt. fig. fig. fᵒ fᵒˢ nᵒ nᵒˢ l. l. n. n. op. op. p. p. paragr. paragr. part. part. règle règles sc. sc. sect. sect. s. v. s. v. suppl. suppl. tab. tab. tit. tit. v. v. vol. vol. c. c. § § § § chapitre chapitres citation citations numéro numéros édition éditions référence références numéro numéros page pages volume volumes page pages impression impressions version versions chap. chap. cit. cit. nᵒ nᵒˢ éd. éd. réf. réf. nᵒ nᵒˢ p. p. vol. vol. p. p. impr. impr. v. président présidents directeur directeurs compilateur compilateurs contributeur contributeurs commissaire commissaires réalisateur réalisateurs directeur scientifique directeurs scientifiques directeur scientifique et traducteur directeurs scientifiques et traducteurs directeur scientifique et traducteur directeurs scientifiques et traducteurs directeur directeurs producteur exécutif producteurs exécutifs invité invités hôte hôtes illustrateur illustrateurs narrateur narrateurs organisateur organisateurs interprète interprètes producteur producteurs scénariste scénaristes créateur de série créateurs de série traducteur traducteurs dir. dir. compil. compil. contrib. contrib. commiss. commiss. réal. réal. dir. dir. dir. et trad. dir. et trad. dir. et trad. dir. et trad. dir. dir. prod. exé. prod. exé. ill. ill. narr. narr. org. org. interpr. interpr. prod. prod. scénar. scénar. créat. créat. trad. trad. présidé par sous la direction de compilé par composé par par avec organisé par réalisé par sous la direction de sous la direction de et traduit par sous la direction de et traduit par sous la direction de production exécutive par avec pour invité avec pour invités animé par illustré par entretien réalisé par lu par organisé par par interprété par produit par à par scénario de créé par traduit par sous la dir. de compil. par comp. par ac org. par réal. par sous la dir. de dir. et trad. dir. et trad. sous la dir. de prod. exé. par ac pr inv. animé par ill. par lu par org. par interpr. par prod. par scénar. de créé par trad. par janvier février mars avril mai juin juillet août septembre octobre novembre décembre janv. févr. mars avr. mai juin juill. août sept. oct. nov. déc. printemps été automne hiver ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-fr-FR.xml0000644000175100017510000007460615234654007023026 0ustar00runnerrunner Grégoire Colly Collectif Zotero francophone This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2025-10-18T05:52:35+00:00 consulté le publication en ligne anticipée album et et autres anonyme sur enregistrement audio disponible sur par vers cité et al. film à paraître à l'adresse désormais ibid. in sous presse Internet lettre loc. cit. sans date sans lieu sans nom sur en ligne op. cit. édition originale communication personnelle podcast épisode de podcast prépublication présenté à émission de radio série radiophonique épisode de série radiophonique référence références consulté recension de échelle numéro spécial section spéciale émission de télévision série télévisée épisode de série télévisée vidéo document de travail publ. en ligne antic. anon. enr. audio dispo. sur v. cité film à l'adr. let. s. d. s. l. s. n. éd. orig. comm. perso. épis. de podcast émiss. de radio épis. de série radio réf. réf. consulté recens. de éch. nᵒ spéc. sect. spéc. émiss. de TV série TV épis. de série TV vidéo doc. de travail & @ article article de revue article de magazine article de presse projet de loi émission classique collection jeu de données document entrée entrée de dictionnaire entrée d'encyclopédie événement image audience entretien affaire acte juridique manuscrit carte enregistrement vidéo partition musicale pamphlet article de colloque brevet interprétation périodique communication personnelle billet billet de blog règlement rapport recension recension de livre logiciel chanson présentation norme thèse traité page web art. de revue art. de mag. art. de presse class. coll. doc. entrée de dict. entrée d'encycl. img. entret. aff. acte jurid. ms. mss. enr. vidéo partit. music. pamph. art. de conf. brevet interprét. comm. perso. règl. rapp. recens. recens. de livre logic. enr. audio norme thèse p. web témoignage de recension recension de livre témoign. de recens. de recens. de livre apr. J.-C. av. J.-C. av. n. è. n. è. «   »  : ,  ; ʳᵉ ᵉʳ premier deuxième troisième quatrième cinquième sixième septième huitième neuvième dixième acte actes appendice appendices article articles livre livres canon canons chapitre chapitres colonne colonnes emplacement emplacements équation équations figure figures folio folios numéro numéros ligne lignes note notes opus opus page pages paragraphe paragraphes partie parties règle règles scène scènes section sections sub verbo sub verbis supplément suppléments tableau tableaux titre titres verset versets volume volumes append. append. art. art. livre livres can. can. chap. chap. col. col. emplact emplact eqt. eqt. fig. fig. fᵒ fᵒˢ nᵒ nᵒˢ l. l. n. n. op. op. p. p. paragr. paragr. part. part. règle règles sc. sc. sect. sect. s. v. s. v. suppl. suppl. tab. tab. tit. tit. v. v. vol. vol. c. c. § § § § chapitre chapitres citation citations numéro numéros édition éditions référence références numéro numéros page pages volume volumes page pages impression impressions version versions chap. chap. cit. cit. nᵒ nᵒˢ éd. éd. réf. réf. nᵒ nᵒˢ p. p. vol. vol. p. p. impr. impr. v. président présidents directeur directeurs compilateur compilateurs contributeur contributeurs commissaire commissaires réalisateur réalisateurs éditeur éditeurs éditeur et traducteur éditeurs et traducteurs éditeur et traducteur éditeurs et traducteurs directeur directeurs producteur exécutif producteurs exécutifs invité invités hôte hôtes illustrateur illustrateurs narrateur narrateurs organisateur organisateurs interprète interprètes producteur producteurs scénariste scénaristes créateur de série créateurs de série traducteur traducteurs dir. dir. compil. compil. contrib. contrib. commiss. commiss. réal. réal. éd. éd. éd. et trad. éd. et trad. éd. et trad. éd. et trad. dir. dir. prod. exé. prod. exé. ill. ill. narr. narr. org. org. interpr. interpr. prod. prod. scénar. scénar. créat. créat. trad. trad. présidé par sous la direction de compilé par composé par par avec organisé par réalisé par édité par édité et traduit par édité et traduit par sous la direction de production exécutive par avec pour invité avec pour invités animé par illustré par entretien réalisé par lu par organisé par par interprété par produit par à par scénario de créé par traduit par ss la dir. de compil. par comp. par ac org. par réal. par éd. par éd. et trad. par éd. et trad. par ss la dir. de prod. exé. par ac pr inv. animé par ill. par lu par org. par interpr. par prod. par scénar. de créé par trad. par janvier février mars avril mai juin juillet août septembre octobre novembre décembre janv. févr. mars avr. mai juin juill. août sept. oct. nov. déc. printemps été automne hiver ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-gl-ES.xml0000644000175100017510000006322215234654007023011 0ustar00runnerrunner This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2025-10-16T03:24:00+00:00 Manuel Magán David Cotelo Varela Andrea Real accedido publicación en liña anticipada álbum e e outros/as anónimo en gravación de son dispoñíbel en por circa citado e outros/as filme a publicar de en adiante íb. en no prelo internet carta loc. cit. sen data sen lugar sen editorial en en liña o. cit. traballo orixinal publicado comunicado persoal podcast episodio de podcast pre-impresión presentado en emisión de radio serie de radio episodio de serie de radio referencia referencias obtido recensión de escala número especial sección especial emisión de televisión serie de televisión episodio de serie de televisión vídeo artigo inacabado anón. ca. s. d. s. l. s. ed. ref. refs. rec. de pre-impresión artigo artigo de revista artigo de xornal proxecto de lei emisión clásico colección conxunto de datos documento entrada entrada no dicionario entrada na enciclopedia evento gráfica audio entrevista suceso legal lexislación manuscrito mapa gravación de vídeo partitura musical panfleto artigo de congreso patente actuación periódico comunicado persoal publicación publicación web regulamento informe revisión recensión software canción discurso estándar tese tratado páxina web art. acad. art. rev. art. xornal doc. gráf. ms. grav. vídeo inf. rev. rec. libro canción d. C. a. C. BCE CE « » : , ; º ª primeiro segundo terceiro cuarto quinto sexto sétimo oitavo nono décimo primeira segunda terceira cuarta quinta sexta sétima oitava nona décima acta actas apéndice apéndices artigo artigos libro libros canon canons capítulo capítulos columna columnas localización localizacións ecuación ecuacións figura figuras folio folios número números liña liñas nota notas opus ópera páxina páxinas parágrafo parágrafos parte partes regra regras escena escenas sección seccións sub verbo sub verbos suplemento suplementos táboa táboas título títulos verso versos volume volumes ap. aps. art. arts. lib. cap. col. loc. locs. ec. ecs. fig. f. núm. l. n. op. páx. páxs. par. pt. regra regras escena escenas sec. s. v. s. vv. supl. supls. táb. tábs. tít. títs. v. vv. vol. vols. ¶¶ § §§ capítulo capítulos cita citas número números edición edicións referencia referencias número números páxina páxinas volume volumes páxina páxina impreso impresos versión cap. caps. cit. cits. núm. ed. ref. refs. núm. núms. páx. páxs. vol. vols. páx. páxs. impr. imprs. presidente presidentes editor editores compilador compiladores contribuínte contribuíntes conservador conservadores director directores editor editores editor e tradutor editores e tradutores editor e tradutor editores e tradutores editor editores produtor executivo produtores executivos convidado convidados anfitrión anfitrións ilustrador ilustradores narrador narradores organizador organizadores intérprete intérpretes produtor produtores escritor escritores creador da serie creadores da serie tradutor tradutores comp. comps. contrib. contribs. conservador conservadores dir. dirs. ed. eds. ed. e trad. eds. e trads. ed. e trad. eds. e trads. ed. eds. prod. exec. prods. execs. il. ils. narr. narrs. org. orgs. intérp. intérps. prod. prods. escritor escritores cre. cres. trad. trads. presidido por editado por compilado con por contribuído por conservado por dirixido por editado por editado e traducido por editado e traducido por editado por produción executiva de coa participación de presentado por ilustrado por entrevistado por narrado por organizado por interpretado por producido por para revisado por escrito por creado por traducido por ed. por comp. por con con dir. ed. ed. e trad. ed. e trad. ed. prod. exec. con ilus. narr. org. interp. prod. escr. crea. trad. xaneiro febreiro marzo abril maio xuño xullo agosto setembro outubro novembro decembro xan. feb. mar. abr. mai. xuñ. xul. ago. set. out. nov. dec. primavera verán outono inverno ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-he-IL.xml0000644000175100017510000006252515234654007023005 0ustar00runnerrunner roypeled1 dinkame This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 נבדק לאחרונה advance online publication album ו ואחרים אלמוני audio recording זמין ב על-ידי לערך מצוטט ב ואחרים סרט צפוי מתוך henceforth שם בתוך בדפוס אתר מכתב loc. cit. לא ידוע no place no publisher on מקוון op. cit. פורסם במקור בשנת תקשורת אישית הסכת פרק בהסכת preprint הוצג ב תשדיר רדיו תוכנית רדיו פרק בתוכנית רדיו הפניה הפניות אוחזר review of קנ"מ special issue special section television broadcast סדרת טלוויזיה television series episode וידאו working paper ~ n.p. n.p. ref. refs. rev. of preprint מאמר בכתב עת magazine article מאמר בעיתון bill תשדיר classic collection dataset document entry ערך מילוני ערך אנציקלופדי event graphic hearing ראיון legal case legislation manuscript מפה video recording musical score pamphlet conference paper patent performance periodical תקשורת אישית פוסט פוסט בבלוג regulation דוח review סקירת ספר תוכנה audio recording presentation standard תזה treaty עמוד אינטרנט מאמר mag. art. newspaper art. doc. graph. ראיון MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book לספירה לפני הספירה לספירה לפני הספירה " " ' ' - : , ; 1 2 3 4 5 6 7 8 9 10 ראשון שני שלישי רביעי חמישי שישי שביעי שמיני תשיעי עשירי act acts appendix appendices article articles ספר ספרים canon canons פרק פרקים טור טורים location locations משוואה משוואות איור איורים פוליו פוליו מספר מספרים שורה שורות הערה הערות אופוס אופרה עמוד עמודים פיסקה פיסקאות חלק חלקים חוק חוקים scene scenes סעיף סעיפים sub verbo sub verbis supplement supplements table tables title titles פסוק פסוקים כרך כרכים app. apps. art. arts. פ' ט' loc. locs. eq. eqs. א. פול' מס' ש' הע' אופ' 'עמ 'עמ פ. חלק r. rr. סצנה סצנות סע' s.v. s.vv. supp. supps. tbl. tbls. tit. tits. פס' פס' כרך כרכים ¶¶ § §§ פרק פרקים ציטוט ציטוטים מספר מספרים מהדורה מהדורות הערה הערות number numbers עמוד עמודים כרך כרכים עמוד עמודים printing printings גירסה פרק. פרקים cit. cits. no מהדורה הע' מס׳ מס׳ 'עמ 'עמ כרך כרכים עמ׳ עמ׳ print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators במאי במאים עורך עורכים editor & translator editors & translators בתרגום ועריכת בתרגום ועריכת: עורך ראשי עורכים ראשיים executive producer executive producers guest guests host hosts איור איור narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators תרגום תרגום comp. comps. contrib. contribs. cur. curs. בימוי בימוי: בעריכת בעריכת: ed. & tran. eds. & trans. עריכה ותרגום עריכה ותרגום: ע.ר. עריכה ראשית: exec. prod. exec. prods. איור איור: narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. בתרגום בתרגום: chaired by edited by compiled by על ידי with curated by בוים ע"י נערך ע"י תורגם ונכרך על ידי: תורגם ונכרך על ידי: בוים ע"י executive produced by with guest hosted by אויר ע"י רואיין ע"י narrated by organized by performed by produced by אל ע"י written by created by תורגם ע"י ed. by comp. by w. cur. by בימוי עריכה: עריכה ותרגום: עריכה ותרגום: עריכה ראשית: exec. prod. by w. guest hosted by מאיירים: narr. by org. by perf. by prod. by writ. by cre. by תרגום: ינואר פברואר מרץ אפריל מאי יוני יולי אוגוסט ספטמבר אוקטובר נובמבר דצמבר ינו' פב' מרץ אפר' מאי יונ' יול' אוג' ספט' אוק' נוב' דצמ' אביב קיץ סתיו חורף ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-hi-IN.xml0000644000175100017510000006662615234654007023021 0ustar00runnerrunner Neha Srivastava neha-srivastava@outlook.com This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 अंतिम उपयोग advance online publication album व अन्य अज्ञात पर audio recording पर उपलब्ध द्वारा सन उल्लेखित इत्यादि film आगामी से henceforth उक्त में मुद्रण में इंटर्नेट पत्र loc. cit. दिनांक अज्ञात no place no publisher on ऑनलाइन op. cit. original work published personal communication podcast podcast episode preprint पर प्रस्तुत radio broadcast radio series radio series episode संदर्भ references पुनर्प्राप्त review of scale special issue special section television broadcast television series television series episode video working paper अज्ञात सन. n.d. n.p. n.p. ref. refs. rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing साक्षात्कार legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical personal communication post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book CE BCE BCE CE : , ; वाँ पहला दूसरा तीसरा चौथा पाँचवा छठा सातवाँ आठवाँ नवाँ दसवाँ पहली दूसरी तीसरी चौथी पाँचवी छठी सातवीं आठवीं नौवीं दसवीं act acts appendix appendices article articles पुस्तक पुस्तकें canon canons अध्याय अध्याय कॉलम columns location locations equation equations चित्र चित्रों पर्ण folios संख्या संख्याएँ पंक्ति पंक्तियाँ नोट टिप्पणियाँ opus opera पृष्ठ पृष्ठ अनुच्छेद paragraphs भाग parts rule rules scene scenes अनुभाग sections sub verbo sub verbis supplement supplements table tables title titles पद verses वॉल्यूम वॉल्यूम्ज़ app. apps. art. arts. bk. bks. chap. chaps. col. cols. loc. locs. eq. eqs. fig. figs. fol. fols. no. nos. l. ll. n. nn. op. opp. पृ. पृ. para. paras. pt. pts. r. rr. sc. scs. sec. secs. s.v. s.vv. supp. supps. tbl. tbls. tit. tits. v. vv. vol. vols. ¶¶ § §§ chapter chapters citation citations संख्या संख्याएँ संस्करण संस्करण नोट टिप्पणियाँ number numbers पृष्ठ संख्या पृष्ठों की संख्या volume volumes page pages printing printings संस्करण chap. chaps. cit. cits. no. nos. ed. n. nn. no. nos. पृ. स. पृ. स. vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators निर्देशक directors सम्पादक editors सम्पादक & अनुवादक editors & translators सम्पादक & अनुवादक editors & translators सम्पादक editors executive producer executive producers guest guests host hosts चित्रकार illustrators narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators अनुवादक translators comp. comps. contrib. contribs. cur. curs. dir. dirs. ed. eds. ed. & tran. eds. & trans. ed. & tran. eds. & trans. ed. eds. exec. prod. exec. prods. ill. ills. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. tran. trans. chaired by edited by compiled by द्वारा with curated by निर्देशन सम्पादन सम्पादन & अनुवाद सम्पादन & अनुवाद निर्देशन executive produced by with guest hosted by चित्रकारी साक्षात्कारकर्ता narrated by organized by performed by produced by सेवा में द्वारा written by created by अनुवाद ed. by comp. by w. cur. by dir. by ed. by ed. & trans. by ed. & trans. by ed. by exec. prod. by w. guest hosted by illus. by narr. by org. by perf. by prod. by writ. by cre. by trans. by जनवरी फ़रवरी मार्च अप्रैल मई जून जुलाई अगस्त सितम्बर अक्टूबर नवम्बर दिसम्बर जन. फ़र. मार्च अप्रैल मई जून जुलाई अग. सित. अक्ट. नव. दिस. वसंत ऋतु ग्रीष्म ऋतु पतझड़ ऋतु शिशिर ऋतु ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-hr-HR.xml0000644000175100017510000006041515234654007023023 0ustar00runnerrunner tvrbanec This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 pristupljeno advance online publication album i i dr. anonimno na audio recording dostupno na od oko citirano i sur. film u pripremi od henceforth ibid. u u tisku internet pismo loc. cit. bez datuma no place no publisher on na internetu op. cit. original work published osobna komunikacija podcast podcast episode preprint predstavljeno na radio broadcast radio series radio series episode reference reference preuzeto review of skala special issue special section television broadcast television series television series episode video working paper anon. oko bez dat. n.p. n.p. ref. ref. rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing intervju legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical osobna komunikacija post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book pr. Kr. BCE CE : , ; . prvi drugi treći četvrti peti šesti sedmi osmi deveti deseti act acts appendix appendices article articles knjiga knjige canon canons poglavlje poglavlja stupac stupci location locations equation equations crtež crteži folija folije izdanje izdanja red redovi bilješka bilješke djelo djela stranica stranice pasus pasusi dio dijelova rule rules scene scenes odjeljak odjeljci sub verbo sub verbis supplement supplements table tables title titles stih stihovi svezak svesci app. apps. art. arts. knj. pogl. stup. loc. locs. eq. eqs. crt. fol. izd. red bilj. sv. str. str. par. dio r. rr. sc. scs. od. s.v. s.vv. supp. supps. tbl. tbls. tit. tits. st. st. sv. sv. ¶¶ § §§ chapter chapters citation citations izdanje izdanja izdanje izdanja bilješka bilješke number numbers stranica stranice volume volumes page pages printing printings verzija chap. chaps. cit. cits. izd. izd. bilj. no. nos. str. str. vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators voditelj voditelji urednik urednici urednik & prevoditelj urednici & prevoditelji urednik & prevoditelj urednici & prevoditelji urednik urednici executive producer executive producers guest guests host hosts ilustrator ilustratori narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators prevoditelj prevoditelji comp. comps. contrib. contribs. cur. curs. vod. vod. ur. ur. ur. & prev. ur. & prev. ur. & prev. ur. & prev. ur.-vod. ur.-vod. exec. prod. exec. prods. il. il. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. prev. prev. chaired by edited by compiled by od with curated by vodio uredio uredio & preveo uredio & preveo uredio executive produced by with guest hosted by ilustrirao intervjuirao narrated by organized by performed by produced by primatelj pregledao written by created by preveo ed. by comp. by w. cur. by vod. ur. ur. & prev. ur. & prev. ur. vod. exec. prod. by w. guest hosted by ilus. narr. by org. by perf. by prod. by writ. by cre. by prev. siječanj veljača ožujak travanj svibanj lipanj srpanj kolovoz rujan listopad studeni prosinac sij. velj. ožu. tra. svi. lip. srp. kol. ruj. lis. stu. pros. proljeće ljeto jesen zima ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-hu-HU.xml0000644000175100017510000006150715234654007023034 0ustar00runnerrunner Miklos Vajna Simon Farády This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-03-29T11:35:00+00:00 elérés előzetes online publikáció album és és mások szerző nélkül hangfelvétel elérhető by körülbelül idézi és mtsai. film megjelenés alatt forrás a továbbiakban uo. in nyomtatás alatt internet levél loc. cit. évszám nélkül hely nélkül kiadó nélkül on online op. cit. eredeti mű kiadva személyes kommunikáció podcast podcast epizód preprint előadás rádióadás rádiósorozat rádiósorozat epizód hivatkozás hivatkozás elérés recenzió skála különszám különleges rovat televíziós adás televíziós sorozat televíziós sorozat epizód videó munkadolgozat sz. n. kb. é. n. h. n. k. n. hiv. hiv. rec. preprint folyóiratcikk magazincikk újságcikk törvényjavaslat közvetítés klasszikus gyűjtemény adatbázis dokumentum cikk szótár-bejegyzés enciklopédia-bejegyzés esemény grafika tárgyalás interjú jogi eset jogszabály kézirat térkép mozgókép zenei partitúra röpirat konferencia dolgozat szabadalom előadás folyóirat személyes kommunikáció bejegyzés blogbejegyzés előírás jelentés recenzió könyvrecenzió szoftver hangfelvétel előadás szabvány dolgozat egyezmény weboldal foly.c. mag.c. újs.c. dok. graf. interjú kézir. mozgókép jel. rec. könyvrec. hangfelv. beszámolója recenziója könyvrecenziója Kr. u. Kr. e. i. e. i. sz. » « : , ; . első második harmadik negyedik ötödik hatodik hetedik nyolcadik kilencedik tizedik törvénycikk törvénycikk függelék függelék cikk cikk könyv könyv kánon kánon fejezet fejezet oszlop oszlop cikkazonosító cikkazonosító egyenlet egyenletek ábra ábra fóliáns fóliáns szám szám sor sor jegyzet jegyzet oldal oldal bekezdés bekezdés rész rész szabály szabály jelenet jelenet szakasz szakasz sub verbo sub verbis melléklet melléklet táblázat táblázat rész rész versszak versszak kötet kötet függ. függ. cikk cikk könyv fej. oszl. cikkazon. cikkazon. egyenlet egyenlet ábr. fol. sz. s. j. o. o. bek. rész r. rr. jelenet jelenet szak. s. v. s. vv. mell. mell. tábl. tábl. rész rész vers vers köt. köt. ¶¶ § §§ fejezet fejezet hivatkozás hivatkozás szám szám kiadás kiadás hivatkozás hivatkozás szám szám oldal oldal kötet kötet oldal oldal nyomtatás nyomtatás verzió fej. fej. hiv. hiv. sz. kiad. hiv. hiv. szám szám o. o. köt. köt. o. o. nyom. nyom. elnök elnök sorozatszerkesztő sorozatszerkesztő összeállító összeállító közreműködő közreműködő kurátor kurátor igazgató igazgató szerkesztő szerkesztő szerkesztő & fordító szerkesztő & fordító szerkesztő & fordító szerkesztő & fordító szerkesztőségi igazgató szerkesztőségi igazgató executive producer executive producer vendég vendég házigazda házigazda illusztrátor illusztrátor narrátor narrátor szervező szervező előadó előadó producer producer forgatókönyvíró forgatókönyvíró sorozat készítője sorozat készítője fordító fordító összeáll. összeáll. közr. közr. kur. kur. ig. ig. szerk. szerk. szerk. & ford. szerk. & ford. szerk. & ford. szerk. & ford. szerk. ig. szerk. ig. exec. prod. exec. prod. ill. ill. narr. narr. szerv. szerv. előadó előadó prod. prod. forg.könyvíró forg.könyvíró sor.kész. sor.kész. ford. ford. elnök sorozatszerkesztő összeállította által közreműködésével gondozta rendezte szerkesztette szerkesztette & fordította szerkesztette & fordította szerkesztette executive producer vendég házigazda illusztrálta interjúkészítő narrátor szervezte előadó producer címzett ismertette írta készítette fordította sor.szerk. összeáll. közr. gond. ig. szerk. szerk. & ford. szerk. & ford. szerk. exec. prod. vendég házigazda ill. narr. szerv. előadó prod. f.könyvíró sor.kész. ford. január február március április május június július augusztus szeptember október november december jan. febr. márc. ápr. máj. jún. júl. aug. szept. okt. nov. dec. tavasz nyár ősz tél ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-hy-AM.xml0000644000175100017510000007427415234654007023026 0ustar00runnerrunner Hayk M. Kocharyan https://orcid.org/0000-0002-1370-3325 Marat M. Yavrumyan https://orcid.org/0000-0002-9722-0653 Armenian Language Technology Research Laboratory https://github.com/RLALT This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-31T12:37:21+04:00 դիտված առցանց առաջնատիպ ալբոմ և և ուրիշներ անանուն ըստ՝ ձայնագրություն հասանելի է մոտ մեջբերումն ըստ՝ և ուրիշներ կինոնկար հանձնված է հրապարակման իմա՝ այսուհետ՝ նույնը ի մեջ հանձնված է տպագրության համացանց նամակ նույն տեղում ա. թ. ա. տ. ա. հ. ընդ առցանց նշվ. աշխ. սկզբնապես հրապարակվել է մասնավոր հաղորդակցություն փոդքաստ թողարկում փոդքաստում սկզբնագիր ներկայացվել է ռադիոհաղորդում ռադիոշարք թողարկում ռադիոշարքում տե՛ս քաղված է գրախոսված է՝ չափ հատուկ թողարկում հատուկ պրակ հեռուստահաղորդում հեռուստաշարք թողարկում հեռուստաշարքում տեսանյութ աշխատանքային նյութեր անան. և ուրիշ. մջբ.՝ և ուրիշ. և @ հոդված հոդված հանդեսում հոդված ամսագրում հոդված թերթում օրինագիծ հեռարձակում դասական երկ հավաքածո տվյալակազմ վավերագիր գլխաբառ բառահոդված հանրագիտարանային հոդված միջոցառում գծագիր լսումներ հարցազրույց դատական գործ օրենսդրություն ձեռագիր քարտեզ շարժանկար երաժշտական ստեղծագործություն գրքույկ զեկույց գիտաժողովում արտոնագիր պերֆորմանս պարբերական մասնավոր հաղորդակցություն գրառում բլոգ իրավակարգավորում զեկույց գրախոսություն մատենախոսություն ծրագրաշար ձայնագրություն ելույթ ստանդարտ ավարտագիր համաձայնագիր կայքէջ գծ. ձեռ. պբ. ցուցմունք գրախոսվել է՝ գրախոսվել է՝ Ք.հ.  Ք.ա.  մ.թ.ա.  մ.թ.  « » « » ։ , ; -րդ -ին առաջին երկրորդ երրորդ չորրորդ հինգերորդ վեցերորդ յոթերորդ ութերորդ իններորդ տասներորդ ակտ ակտեր հավելված հավելվածներ հոդված հոդվածներ գիրք գրքեր կանոն կանոններ գլուխ գլուխներ սյունակ սյունակներ հասցե հասցեներ հավասարում հավասարումներ պատկեր պատկերներ թերթ թերթեր թողարկում թողարկումներ տող տողեր ծանոթագրություն ծանոթագրություններ երկ երկեր էջ էջեր պարբերություն պարբերություններ մաս մասեր կանոն կանոններ գործողություն գործողություններ բաժին բաժիններ տե՛ս գլխաբառ հավելված հավելվածներ աղյուսակ աղյուսակներ վերնագիր վերնագրեր բանատող բանատողեր տարբերակ տարբերակներ հատոր հատորներ հոդվ. գլ. թող. ծնթ. պրբ. բաժ. աղ. տարբ. հտ. ¶¶ § §§ գլուխ գլուխներ հղում հղումներ համար համարներ հրատարակություն հրատարակություններ ծանոթագրություն ծանոթագրություններ թիվ թվեր էջ էջեր հատոր հատորներ էջ էջեր վերատպություն վերատպություններ տարբերակ տարբերակներ գլ. հղ. հմ. հրատ. ծնթ. №№ էջ էջեր հտ. էջ էջեր վերատպ. տարբ. նախագահություն նախագահություններ շարքի խմբագիր շարքի խմբագիրներ կազմող կազմողներ համահեղինակ համահեղինակներ համակարգող համակարգողներ ռեժիսոր ռեժիսորներ խմբագիր խմբագիրներ խմբագիր-թարգմանիչ խմբագիր-թարգմանիչներ խմբագիր և թարգմանիչ խմբագիրներ և թարգմանիչներ պատասխանատու խմբագիր պատասխանատու խմբագիրներ գործադիր պրոդյուսեր գործադիր պրոդյուսերներ հյուր հյուրեր հաղորդավար հաղորդավարներ նկարազարդող նկարազարդողներ մեկնաբան մեկնաբաններ կազմակերպիչ կազմակերպիչներ կատարող կատարողներ պրոդյուսեր պրոդյուսերներ սցենարի հեղինակ սցենարի հեղինակներ շարքի հիմնադիր շարքի հիմնադիրներ թարգմանիչ թարգմանիչներ շարքի խմբ. կազմ. համահեղ. ռեժ. խմբ. խմբ.-թարգմ. խմբ. և թարգմ. պատ. խմբ. մեկնաբ. պրոդ. սց. հեղ. շարքի հիմն. թարգմ. նախագահությամբ՝ շարքը խմբագրեց՝ կազմեց՝ աշխատասիրեց՝ հեղինակեց՝ համահեղինակեց՝ համակարգեց՝ ռեժիսուրան՝ խմբագրեց՝ խմբագրեց-թարգմանեց՝ խմբագրեց և թարգմանեց՝ պատ. խմբագրությամբ՝ գործ. պրոդյուսերը՝ հյուրը՝ հաղորդավարը՝ նկարազարդումը՝ հարցազրույցը՝ մեկնաբանը՝ կազմակերպեց՝ հեղինակեց՝ կատարողը՝ պրոդյուսերը՝ ի սցենարն ըստ՝ շարքը հիմնադրեց՝ թարգմանեց՝ շարքը խմբ.՝ կազմ.՝ աշխատ.՝ ռեժ.՝ խմբ.՝ խմբ.-թարգմ.՝ խմբ. և թարգմ.՝ պատ. խմբ.՝ գործ. պրոդ.՝ պրոդ.՝ սց. ըստ՝ թարգմ.՝ հունվար փետրվար մարտ ապրիլ մայիս հունիս հուլիս օգոստոս սեպտեմբեր հոկտեմբեր նոյեմբեր դեկտեմբեր հնվ. փտր. մրտ. ապր. մյս. հնս. հլս. օգս. սպտ. հկտ. նյմ. դկտ. գարուն ամառ աշուն ձմեռ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-id-ID.xml0000644000175100017510000006123515234654007022772 0ustar00runnerrunner faizhabibullah Deden Habibi xbypass mzaini30 rusli3 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 diakses advance online publication album dan dan lainnya anonim pada rekaman audio tersedia pada oleh circa dikutip dkk. film mendatang dari selanjutnya ibid. dalam dalam proses cetak internet surat loc. cit. tanpa tanggal tanpa tempat tanpa penerbit on daring op. cit. original work published komunikasi pribadi podcast podcast episode preprint dipresentasikan pada radio broadcast seri radio episode seri radio referensi referensi diambil review of skala edisi khusus bagian khusus siaran televisi seri televisi episode seri televisi video naskah kerja anon. ca. t.t. n.p. n.p. ref. ref. rev. of artikel artikel jurnal artikel majalah artikel koran rancangan undang-undang siaran klasik koleksi dataset dokumen entry dictionary entry encyclopedia entry acara grafis dengar pendapat wawancara kasus legal legislation manuskrip peta video recording skor musik pamflet makalah konferensi paten pertunjukan berkala komunikasi pribadi postingan postingan blog regulasi laporan ulasan ulasan buku perangkat lunak lagu pidato standar tesis perjanjian internasional laman web journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book M SM BCE CE : , ; pertama kedua ketiga keempat kelima keenam ketujuh kedelapan kesembilan kesepuluh act acts appendix appendices article articles buku buku canon canons bab bab kolom kolom location locations equation equations gambar gambar folio folio nomor nomor baris baris catatan catatan opus opera halaman halaman paragraf paragraf bagian bagian rule rules scene scenes bagian bagian sub verbo sub verbis supplement supplements table tables title titles ayat ayat volume volume app. apps. art. arts. bk. bb. kol. loc. locs. eq. eqs. gbr. fol. no. brs. ctt. op. hlm. hlm. para. bag. r. rr. sc. scs. bag. s.v. s.vv. supp. supps. tbl. tbls. tit. tits. a. a. vol. vol. ¶¶ § §§ chapter chapters citation citations nomor nomor edisi edisi catatan catatan number numbers halaman halaman volume volumes page pages printing printings versi chap. chaps. cit. cits. no. ed. ctt. no. nos. hlm. hlm. vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators sutradara sutradara editor editor editor & penerjemah editor & penerjemah editor & penerjemah editor & penerjemah editor editor executive producer executive producers guest guests host hosts ilustrator ilustrator narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators penerjemah penerjemah comp. comps. contrib. contribs. cur. curs. dir. dir. ed. ed. ed. & penerj. ed. & penerj. ed. & penerj. ed. & penerj. ed. ed. exec. prod. exec. prods. il. il. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. penerj. penerj. chaired by edited by compiled by oleh with curated by diarahkan oleh disunting oleh disunting & diterjemahkan oleh disunting & diterjemahkan oleh disunting oleh executive produced by with guest hosted by diilustrasi oleh diwawancara oleh narrated by organized by performed by produced by kepada oleh written by created by diterjemahkan oleh ed. by comp. by w. cur. by dir. oleh ed. oleh ed. & penerj. oleh ed. & penerj. oleh ed. oleh exec. prod. by w. guest hosted by illus. oleh narr. by org. by perf. by prod. by writ. by cre. by trans. oleh Januari Februari Maret April Mei Juni Juli Agustus September Oktober November Desember Jan Feb Mar Apr Mei Jun Jul Agu Sep Okt Nov Des Semi Panas Gugur Dingin ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-is-IS.xml0000644000175100017510000006115115234654007023025 0ustar00runnerrunner dadamaster styrmirm magnimarels This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2025-10-16T03:24:01+00:00 sótt advance online publication albúm og og fleiri nafnlaus af hljóðupptaka aðgengilegt á eftir sirka tilvitnun o.fl. film óbirt af henceforth sama heimild í í prentun rafrænt bréf loc. cit. engin dagsetning no place no publisher on rafrænt op. cit. original work published persónuleg samskipti hlaðvarp hlaðvarpsþáttur forprentun flutt á útvarpsútsending útvarpssería útvarpsþáttur tilvitnun tilvitnanir sótt gagnrýni á skali sérstök útgáfa special section sjónvarpsútsending sjónvarpssería sjónvarpsþáttur myndband working paper nafnl. u.þ.b. e.d. n.p. n.p. tilv. tilv. gagnr. á forprentun tímaritsgrein tímaritsgrein blaðagrein bill broadcast klassísk samansafn gagnasafn skjal færsla orðabókarfærsla alfræðiorðabókarfærsla viðburður graphic hearing viðtal réttarmál lagasetning handrit kort myndbandsupptaka söngleikur bæklingur conference paper einkaleyfi flutningur periodical persónuleg samskipti færsla bloggfærsla reglugerð skýrsla gagnrýni bókagagnrýni hugbúnaður hljóðupptaka kynning staðall ritgerð sáttmáli vefsíða tímaritsgr. tímaritsgr. blaðagr. skj. graph. viðt. MS myndbandsuppt. skýrsla gagnr. bókagagnr.. hlóðuppt. vitnisburður um gagnrýni á gagnrýni á bók e.Kr. f.Kr. BCE CE : , ; . fyrsti annar þriðji fjórði fimmti sjötti sjöundi áttundi níundi tíundi act acts appendix appendices article articles bók bækur canon canons kafli kaflar dálkur dálkar location locations equation equations mynd myndir handrit handrit tölublað tölublöð lína línur athugasemd athugasemdir tónverk tónverk blaðsíða blaðsíður málsgrein málsgreinar hluti hlutar rule rules scene scenes hluti hlutar sub verbo sub verbis supplement supplements table tables title titles vers vers bindi bindi app. apps. art. arts. bók k. d. loc. locs. eq. eqs. mynd. handr. tbl. l. ath. tónv. bls. bls. málsgr. hl. r. rr. sc. scs. hl. s.v. s.vv. supp. supps. tbl. tbls. tit. tits. v. v. b. b. ¶¶ § §§ kafli kaflar tilvitnun tilvitnanir tölublað tölublöð útgáfa útgáfur tilvísun tilvísanir númer númer blaðsíða blaðsíður bindi bindi síða síður printing printings útgáfa kafli kaflar tilv. tilv. tbl. útg. tilv. tilv. nr. nr. bls. bls. vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators leikstjóri leikstjórar ritstjóri ritstjórar ritstjóri og þýðandi ritstjórar og þýðendur ritstjóri og þýðandi ritstjórar og þýðendur ritstjóri ritstjórar executive producer executive producers gestur gestir host hosts höfundur myndskreytinga höfundar myndskreytinga narrator narrators organizer organizers flytjandi flytjendur framleiðandi framleiðendur rithöfundur rithöfundar series creator series creators þýðandi þýðendur comp. comps. contrib. contribs. cur. curs. leikstj. leikstj. ritstj. ritstj. ritstj. og þýð. ritstj. og þýð. ritstj. og þýð. ritstj. og þýð. ritstj. ritstj. exec. prod. exec. prods. höf. mynd. höf. mynd. narr. narrs. org. orgs. flytj. flytj. framl. framl. rith. rith. cre. cres. þýð. þýð. chaired by breytt af compiled by eftir með curated by leikstýrt af ritstýrt af ritstýrt og þýtt af ritstýrt og þýtt af ritstýrt af executive produced by með gesti haldið af myndskreytt af viðtal tók narrated by organized by flutt af framleitt af til af skrifað created by þýddi ristj. comp. by w. cur. by leikstj. ritstj. ritstj. og þýð. ritstj. og þýð. ritstj. exec. prod. by w. guest hosted by myndskr. narr. by org. by perf. by prod. by writ. by cre. by þýð. janúar febrúar mars apríl maí júní júlí ágúst september október nóvember desember jan. feb. mar. apr. maí jún. júl. ágú. sep. okt. nóv. des. vor sumar haust vetur ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-it-IT.xml0000644000175100017510000006471715234654007023042 0ustar00runnerrunner Filippo Vomiero filippo.vomiero@unipd.it This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 consultato pubblicazione online ad accesso anticipato album e e altri anonimo a registrazione audio disponibile su di circa citato et al. film in corso di pubblicazione da d'ora in poi ibidem in in stampa internet lettera loc. cit. sine data sine loco sine nomine su online op. cit. opera originale pubblicata comunicazione personale podcast episodio di podcast preprint presentato al trasmissione radiofonica serie radiofonica episodio di serie radiofonica riferimento riferimenti recuperato review of scala edizione speciale sezione speciale trasmissione televisiva serie televisiva episodio di serie televisiva video documento di lavoro anon. su c. ibid. s.d. s.l. s.n. rif. rif. rev. of preprint articolo di rivista articolo di rivista generalista articolo di giornale proposta di legge broadcast classico collezione dataset documento voce voce di dizionario voce di enciclopedia evento opera d'arte udienza intervista causa legislazione manoscritto mappa film spartito musicale opuscolo atto di convegno brevetto esecuzione periodico comunicazione personale messaggio messaggio di blog decreto report review recensione di libro software registrazione audio presentazione norma tesi trattato pagina web art. di riv. art. di riv art. di g. doc. op. d'arte interv. ms. film rep. rev. rec. di l. reg. audio testimony of review of review of the book d.C. a.C. BCE CE « » : , ; º º ª prima seconda terza quarta quinta sesta settima ottava nona decima primo secondo terzo quarto quinto sesto settimo ottavo nono decimo prima seconda terza quarta quinta sesta settima ottava nona decima atto atto appendice appendici articolo articoli libro libri canone canoni capitolo capitoli colonna colonne indirizzo indirizzi equazione equazioni figura figure foglio fogli fascicolo fascicoli riga righe nota note opera opere pagina pagine paragrafo paragrafi parte parti regola regole scena scene sezione sezioni sub verbo sub verbis supplement supplements tavola tavole titolo titoli verso versi volume volumi app. app. art. art. lib. cap. capp. col. loc. locs. eq. eq. fig. fgl. fasc. r. n. op. p. pp. par. pt. r. r. sc. sc. sez. s.v. s.vv. supp. supps. tab. tab. tit. tits. v. vv. vol. voll. ¶¶ § §§ chapter chapters citation citations fascicolo fascicoli edizione edizioni nota note number numbers pagina pagine volume volumes page pages printing printings versione chap. chaps. cit. cits. fasc. ed. n. no. nos. p. pp. vol. vols. p. pp. print. prints. presidente presidenti ed. eds. compilatore compilatori collaboratore collaboratori curatore curatori regista registi curatore curatori curatore e traduttore curatori e tradutori curatore e traduttore curatori e tradutori direttore editoriale direttori editoriali produttore esecutivo produttori esecutivi ospite ospiti conduttore conduttori illustratore illustratori narratore narratori organizzatore organizzatori esecutore esecutori produttore produttori sceneggiatore sceneggiatori autore della serie autori della serie traduttore traduttori comp. comp. collab. collab. cur. cur. reg. reg. a c. di a c. di cur. e trad. cur. e trad. cur. e trad. cur. e trad. dir. ed. dir. ed. prod.es. prod. es. ill. ill. narr. narr. org. org. esec. esec. prod. prod. scen. scen. aut. d. serie aut. d. serie trad. trad. presieduto da edited by compilato da di con un contributo di a cura di diretto da a cura di a cura di e tradotto da a cura di e tradotto da direzione editoriale di produzione esecutiva di con ospite condotto da illustrato da intervista di narrato da organizzato da esecuzione di prodotto da a di scritto da creato da tradotto da ed. by comp. da con un contrib. di a c. di dir. da a c. di a c. di e trad. da a c. di e trad. da dir. ed. di prod. esec. di con osp. cond. da ill. da narr. da org. da esec. di prod. da scr. da cre. da trad. da gennaio febbraio marzo aprile maggio giugno luglio agosto settembre ottobre novembre dicembre gen. feb. mar. apr. mag. giu. lug. ago. set. ott. nov. dic. primavera estate autunno inverno ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-ja-JP.xml0000644000175100017510000005744015234654007023010 0ustar00runnerrunner Shoji Takahashi cmplstofB This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 参照 早期公開 アルバム ほか 匿名 にて 音声録音 入手先 による およそ 引用 ほか 映像作品 近刊 から 現在より 前掲 近刊 インターネット 手紙 同頁 日付なし 所在不詳 作者不詳 において オンライン 同前 original work published 個人間疎通 音声配信 音声配信の一話 査読前原稿 講演場所 ラジオ配信 ラジオ番組 ラジオ番組の一話 参照 参照 回収 review of 特別号 特別節 テレビ放送 テレビ番組 テレビ番組の一話 動画 報告書 匿名 およそ 日付なし 所在不詳 作者不詳 参照 参照 rev. of 記事 学術論文 雑誌記事 報道記事 証書 配信 古典 集体 データ集合 文書 見出し語 辞書の見出し語 辞典の見出し語 催し 視覚的 聴覚的 面接 裁判事例 法律 写本 地図 映像記録 楽譜 小冊子 会議論文 特許 実演 定期刊行物 個人間疎通 投稿 ブログ投稿 規則 報告書 論評 書評 ソフトウェア 音声記録 講演 標準 定立 条約 Webページ 学術論文 雑誌記事 報道記事 文書 視覚的 写本 映像記録 報告書 論評 書評 音声記録 testimony of review of review of the book 紀元前 紀元後 通用紀元前 通用紀元 : , ; 番目 番目 番目 番目 番目 番目 番目 1番目 2番目 3番目 4番目 5番目 6番目 7番目 8番目 9番目 10番目 附録 附録 記事 記事 書籍 書籍 規範 規範 場所 場所 作品 作品 ページ ページ 段落 段落 規則 規則 舞台 舞台 における における supplement supplements 題名 題名 詩歌 詩歌 附録 附録 記事 記事 書籍 場所 場所 作品 ページ ページ 段落 規則 規則 舞台 舞台 における における supp. supps. 題名 題名 tit. tits. 詩歌 詩歌 ¶¶ § §§ chapter chapters citation citations number numbers ページ ページ volume volumes page pages printing printings chap. chaps. cit. cits. no. no. nos. ページ ページ vol. vols. p. pp. print. prints. 議長 ed. eds. 編纂者 協力者 協力者 管理者 管理者 指導者 指導者 編集者 編集者 編集・翻訳者 編集・翻訳者 編集・翻訳者 編集・翻訳者 編集者 編集者 制作総指揮者 制作総指揮者 特別出演者 特別出演者 主催者 主催者 図解者 図解者 語り手 語り手 組織者 組織者 演者 演者 指揮者 指揮者 執筆者 執筆者 番組制作者 番組制作者 翻訳者 翻訳者 協力 管理 指導 編・訳 編・訳 編・指導 総指揮 図解 語り 組織 指揮 執筆 番組制作 議長: 編集者: 編纂者: 作者: 協力者: 蒐集者: 指導者: 編集者: 編集・翻訳者: 編集・翻訳者: 編集者: 制作総指揮者: 特別出演者: 主催者: 図解者: 面接者: 語り手: 組織者: 演者: 指揮者: 受領者: 査読者: 執筆者: 番組作成者: 翻訳者: 編: 纂: 協力: 管理: 指導: 編: 編・訳: 編・訳: 編: 総指揮: 特別出演: 主催: 図: 語り: 組織: 演: 指揮: 執筆: 番組制作: 訳: 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 春季 夏季 秋季 冬季 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-km-KH.xml0000644000175100017510000006165215234654007023016 0ustar00runnerrunner This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 accessed advance online publication album and and others anonymous at audio recording available at by circa cited et al. film forthcoming from henceforth ibid in in press internet letter loc. cit. no date no place no publisher on online op. cit. original work published personal communication podcast podcast episode preprint presented at the radio broadcast radio series radio series episode reference references retrieved review of scale special issue special section television broadcast television series television series episode video working paper anon. c. n.d. n.p. n.p. ref. refs. rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing interview legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical personal communication post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book AD BC BCE CE : , ; th st nd rd th th th ទីមួយ ទីពីរ ទីបី ទីបួន ទីប្រាំ ទីប្រាំមួយ ទីប្រាំពីរ ទីប្រាំបី ទីប្រាំបួន ទីដប់មួយ act acts appendix appendices article articles សៀវភៅ សៀវភៅ canon canons ជំពូក ជំពូក កាឡោន កាឡោន location locations equation equations តួលេខ តួលេខ folio folios ចំនួន ចំនួន បន្ទាត់ បន្ទាត់ កំណត់ចំណាំ កំណត់ចំណាំ opus opera ទំព័រ ទំព័រ កថាខណ្ឌ កថាខណ្ឌ ជំពូក ជំពូក rule rules scene scenes ផ្នែក ផ្នែក sub verbo sub verbis supplement supplements table tables title titles verse verses វ៉ុល វ៉ុល app. apps. art. arts. bk. chap. col. loc. locs. eq. eqs. fig. f. no. l. n. op. p. pp. para. pt. r. rr. sc. scs. sec. s.v. s.vv. supp. supps. tbl. tbls. tit. tits. v. vv. vol. vols. ¶¶ § §§ chapter chapters citation citations ចំនួន ចំនួន edition editions កំណត់ចំណាំ កំណត់ចំណាំ number numbers ទំព័រ ទំព័រ volume volumes page pages printing printings version chap. chaps. cit. cits. no. ed. n. no. nos. p. pp. vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators director directors editor editors editor & translator editors & translators editor & translator editors & translators editors executive producer executive producers guest guests host hosts illustrator illustrators narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators translator translator comp. comps. contrib. contribs. cur. curs. dir. dirs. ed. eds. ed. & tran. eds. & trans. ed. & tran. eds. & trans. ed. eds. exec. prod. exec. prods. ill. ills. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. tran. trans. chaired by edited by compiled by by with curated by directed by edited by edited & translated by edited & translated by edited by executive produced by with guest hosted by illustrated by interview by narrated by organized by performed by produced by to by written by created by translated by ed. by comp. by w. cur. by dir. ed. ed. & trans. by ed. & trans. by ed. exec. prod. by w. guest hosted by illus. narr. by org. by perf. by prod. by writ. by cre. by trans. មករា កុម្ភៈ មីនា មេសា ឧសភា មិថុនា កក្កដា សីហា កញ្ញា តុលា វិច្ឆិកា ធ្នូ Jan. Feb. Mar. Apr. May Jun. Jul. Aug. Sep. Oct. Nov. Dec. Spring Summer Autumn Winter ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-ko-KR.xml0000644000175100017510000006050615234654007023027 0ustar00runnerrunner This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 접근된 advance online publication album 와/과 and others anonymous at audio recording available at by circa cited 기타 film 근간 (으)로부터 henceforth ibid. in in press internet 편지 loc. cit. no date no place no publisher on online op. cit. original work published 개인 서신 podcast podcast episode preprint presented at the radio broadcast radio series radio series episode reference references retrieved review of scale special issue special section television broadcast television series television series episode video working paper anon c. 일자 없음 n.p. n.p. ref. refs. rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing interview legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical 개인 서신 post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book AD BC BCE CE : , ; th st nd rd th th th first second third fourth fifth sixth seventh eighth ninth tenth act acts appendix appendices article articles book books canon canons chapter chapters column columns location locations equation equations figure figures folio folios number numbers note notes opus opera 페이지 페이지 단락 단락 part parts rule rules scene scenes section sections sub verbo sub verbis supplement supplements table tables title titles verse verses volume volumes app. apps. art. arts. bk chap col loc. locs. eq. eqs. fig f l. n. op p pp para pt r. rr. sc. scs. sec s.v. s.vv. supp. supps. tbl. tbls. tit. tits. v vv vol vols ¶¶ § §§ chapter chapters citation citations number numbers edition editions note notes number numbers 페이지 페이지 volume volumes page pages printing printings version chap. chaps. cit. cits. ed n. no. nos. p pp vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators director directors 편집자 편집자 editor & translator editors & translators editor & translator editors & translators editor editors executive producer executive producers guest guests host hosts illustrator illustrators narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators 번역자 번역자 comp. comps. contrib. contribs. cur. curs. dir. dirs. 편집자 편집자 ed. & tran. eds. & trans. ed. & tran. eds. & trans. ed. eds. exec. prod. exec. prods. ill. ills. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. 번역자 번역자 chaired by edited by compiled by by with curated by directed by 편집자: edited & translated by edited & translated by edited by executive produced by with guest hosted by illustrated by interview by narrated by organized by performed by produced by to by written by created by 번역자: ed. by comp. by w. cur. by dir. ed ed. & trans. by ed. & trans. by ed. exec. prod. by w. guest hosted by illus. narr. by org. by perf. by prod. by writ. by cre. by trans 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월 1 2 3 4 5 6 7 8 9 10 11 12 Spring Summer Autumn Winter ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-la.xml0000644000175100017510000006057515234654007022506 0ustar00runnerrunner Andrew Dunning https://orcid.org/0000-0003-0464-5036 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 consultatus advance online publication album et et alii anonymus ad audio recording praestatus ad a circa citatus et al. film futurus ab henceforth ibid. in impressorio interrete epistula loc. cit. sine die no place no publisher on in linea op. cit. original work published personal communication podcast podcast episode preprint praebitus ad radio broadcast radio series radio series episode relatio relationes recuperatus review of scala special issue special section television broadcast television series television series episode video working paper anon. c. s.d. n.p. n.p. rel. rell. rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing congressus legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical personal communication post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book A.D. A.C. BCE CE : , ; º primus secundus tertius quartus quintus sextus septimus octauus nonus decimus act acts appendix appendices article articles liber libri canon canons capitulum capitula columna columnae location locations equation equations figura figurae folium folii numerus numeri linea lineae nota notae opus opera pagina paginae paragraphus paragraphi pars partes rule rules scene scenes paragraphus paragraphi sub uerbo sub uerbis supplement supplements table tables title titles versus versus tomus tomi app. apps. art. arts. lib. cap. col. loc. locs. eq. eqs. fig. fol. n. l. ll. n. nn. op. p. pp. par. pr. r. rr. sc. scs. par. s.u. s.uu. supp. supps. tbl. tbls. tit. tits. u. uu. t. tt. ¶¶ § §§ chapter chapters citation citations numerus numeri editio editiones nota notae number numbers pagina paginae volume volumes page pages printing printings uersio chap. chaps. cit. cits. n. ed. n. no. nos. p. pp. vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators director directores curator curatores curator et interpres curatores et interpretes curator et interpres curatores et interpretes editor editores executive producer executive producers guest guests host hosts illustrator illustratores narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators interpres interpretes comp. comps. contrib. contribs. cur. curs. dir. dirs. cur. curs. cur. et interp. curs. et interps. cur. et interp. curs. et interps. ed. eds. exec. prod. exec. prods. ill. ills. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. interp. interps. chaired by edited by compiled by a with curated by a directione a cura a cura et interpretatione a cura et interpretatione ab editione executive produced by with guest hosted by ab illustratione a congressione narrated by organized by performed by produced by a a written by created by a interpretatione ed. by comp. by w. cur. by dir. cur. a cur. et interp. a cur. et interp. ed. exec. prod. by w. guest hosted by illus. narr. by org. by perf. by prod. by writ. by cre. by interp. ianuarius februarius martius aprilis maius iunius iulius augustus september october nouember december ian. feb. mar. apr. mai. iun. iul. aug. sep. oct. nou. dec. uer aestas autumnus hiems ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-lij-IT.xml0000644000175100017510000006516515234654007023202 0ustar00runnerrunner Jean Maillard This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2025-10-16T03:24:00+00:00 consultou pubricaçion in linia antiçipâ album e e atri anònimo à registraçion audio disponibile in sce de circa çittou et al. cine in pubricaçion da de chì in avanti ibidem inte in stampa internet lettia loc. cit. sine data sine loco sine nomine in sce in linia op. cit. euvia originale pubricâ communicaçion personale podcast pontâ de podcast preprint presentou à trasmiscion pe l'aradio serie pe l'aradio pontâ de serie pe l'aradio referensa referense ottegnuo reçenscion de scâ ediçion speçiale seçion speçiale trasmiscion pe televixon serie pe televixon pontâ de serie pe televixon video documento de travaggio anòn. in sce c. ibid. s.d. s.l. s.n. ref. reff. reç. de articolo articolo de revista articolo de revista generalista articolo de giornale propòsta de lezze trasmiscion clascico arrecuggeita dataset documento intrâ intrâ de diçionäio intrâ d'ençiclopedia evento euvia d'arte udiensa intervista causa legislaçion manoscrito carta cine spartio de muxica volantin atto de convëgno brevetto esecuçion periòdico communicaçion personale messaggio messaggio de blog decretto report reçenscion reçenscion de libbro software registraçion audio presentaçion nòrma texi trattato pagina web art. de rev. art. de rev. gen. art. de giorn. doc. euv. d'arte interv. ms. cine rep. reç. reç. de l. reg. audio testimoniansa de reçenscion de reçenscion do libbro d.C. a.C. AEV EV « » : , ; º º ª primma segonda tersa quarta quinta sesta setteña otteña noveña dexeña primmo segondo terso quarto quinto sesto setten otten noven dexen primma segonda tersa quarta quinta sesta setteña otteña noveña dexeña atto atto appendixe appendixe articolo articoli libbro libbri canone canoni cavo cavi colònna colònne adresso adressi equaçion equaçioin figua figue feuggio feuggi fascicolo fascicoli riga righe nòtta nòtte euvia euvie pagina pagine paragrafo paragrafi parte parte regola regole scena scene seçion seçioin sub verbo sub verbis supplemento supplementi töa töe titolo titoli verso versci volumme volummi app. app. art. art. lib. cap. capp. col. loc. locc. eq. eqq. fig. fgg. fasc. r. n. euv. p. pp. par. pt. r. r. sc. sc. seç. s.v. s.vv. supp. supp. töa töe tit. tit. v. vv. vol. voll. ¶¶ § §§ cavo cavi çittaçion çittaçioin fascicolo fascicoli ediçion ediçioin referensa referense numero numeri pag. pagg. volumme volummi pagina pagine stampa stampe verscion cav. cavv. çit. çitt. fasc. ed. ref. reff. n. nn. p. pp. vol. voll. p. pp. st. stt. prescidente prescidenti ed. edd. realizzatô realizzatoî conlaboratô conlaboratoî cuatô cuatoî regista registi cuatô cuatoî cuatô e traduttô curatoî e traduttoî cuatô e traduttô curatoî e traduttoî direttô editoriale direttoî editoriali produttô executivo produttoî executivi òspite òspiti conduttô conduttoî inlustratô inlustratoî narratô narratoî organizzatô organizzatoî executô executoî produttô produttoî scenezzatô scenezzatoî autô da serie autoî da serie traduttô traduttoî realizz. realizz. conlab. conlab. cua. cua. reg. reg. à c. de à c. de cua. e trad. cua. e trad. cua. e trad. cua. e trad. dir. ed. dir. ed. prod.ex. prod.ex. inl. inl. narr. narr. org. org. exec. exec. prod. prod. scen. scen. autô da serie autoî da serie trad. trad. prescieduo da à cua de realizzou da de con un contributo de à cua de diretto da à cua de à cua de e traduto da à cua de e traduto da direçion editoriale de produçion executiva de con òspite conduto da inlustrou da intervista de narrou da organizzou da execuçion de produto da à de scrito da creou da traduto da ed. da realizz. da con un contrib. de à c. de dir. da à c. de à c. de e trad. da à c. de e trad. da dir. ed. de prod. exec. de con òsp. cond. da inl. da narr. da org. da exec. de prod. da scr. da cre. da trad. da zenâ frevâ marso avrî mazzo zugno luggio agosto settembre ottobre novembre dexembre zen. fre. mar. avr. maz. zug. lug. ago. set. ott. nov. dex. primmaveia estæ ötunno inverno ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-lt-LT.xml0000644000175100017510000006312315234654007023036 0ustar00runnerrunner Valdemaras Klumbys This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 žiūrėta advance online publication album ir ir kt. anonimas audio recording adresas apie žiūrėta ir kt. film ruošiamas henceforth ten pat priimta spaudai prieiga per internetą laiškas loc. cit. sine anno no place no publisher on interaktyvus op. cit. original work published communicationis personalis podcast podcast episode preprint pristatytas radio broadcast radio series radio series episode nuoroda nuorodos gauta review of mastelis special issue special section television broadcast television series television series episode video working paper anon. apie s.a. n.p. n.p. nuor. nuor. rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing interviu legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical communicationis personalis post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book po Kr. pr. Kr. BCE CE , : , ; -asis -asis -iasis -asis -oji -ioji -oji pirmasis antrasis trečiasis ketvirtasis penktasis šeštasis septintasis aštuntasis devintasis dešimtasis pirmoji antroji trečioji ketvirtoji penktoji šeštoji septintoji aštuntoji devintoji dešimtoji act acts appendix appendices article articles knyga knygos canon canons skyrius skyriai skiltis skiltys location locations equation equations iliustracija iliustracijos lapas lapai numeris numeriai eilutė eilutės pastaba pastabos kūrinys kūriniai puslapis puslapiai pastraipa pastraipos dalis dalys rule rules scene scenes poskyris poskyriai žiūrėk žiūrėk supplement supplements table tables title titles eilėraštis eilėraščiai tomas tomai app. apps. art. arts. kn. sk. skilt. loc. locs. eq. eqs. il. l. nr. eil. pstb. kūr. p. p. pastr. d. r. rr. sc. scs. posk. žr. žr. supp. supps. tbl. tbls. tit. tits. eilėr. eilėr. t. t. ¶¶ § §§ chapter chapters citation citations numeris numeriai leidimas leidimai pastaba pastabos number numbers puslapis puslapiai volume volumes page pages printing printings versija chap. chaps. cit. cits. nr. leid. pstb. no. nos. p. p. vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators vadovas vadovai sudarytojas sudarytojai sudarytojas ir vertėjas sudarytojai ir vertėjai sudarytojas ir vertėjas sudarytojai ir vertėjai atsakingasis redaktorius atsakingieji redaktoriai executive producer executive producers guest guests host hosts iliustratorius iliustratoriai narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators vertėjas vertėjai comp. comps. contrib. contribs. cur. curs. vad. vad. sud. sud. sud. ir vert. sud. ir vert. sud. ir vert. sud. ir vert. ats. red. ats. red. exec. prod. exec. prods. iliustr. iliustr. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. vert. vert. chaired by edited by compiled by with curated by vadovavo sudarė sudarė ir vertė sudarė ir vertė parengė executive produced by with guest hosted by iliustravo interviu ėmė narrated by organized by performed by produced by gavo recenzavo written by created by vertė ed. by comp. by w. cur. by vad. sud. sud. ir vert. sud. ir vert. pareng. exec. prod. by w. guest hosted by iliustr. narr. by org. by perf. by prod. by writ. by cre. by vert. sausio vasario kovo balandžio gegužės birželio liepos rugpjūčio rugsėjo spalio lapkričio gruodžio saus. vas. kovo bal. geg. birž. liep. rugpj. rugs. spal. lapkr. gruodž. pavasaris vasara ruduo žiema ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-lv-LV.xml0000644000175100017510000006516615234654007023053 0ustar00runnerrunner Andris Lupgins Kristiāns Francis Cagulis Andrew Dunning https://orcid.org/0000-0003-0464-5036 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 skatīts agrīna tiešsaistes publikācija albums un un citi anonīms audioieraksts pieejams apmēram citēts u.c. films gaidāms no turpmāk turpat no presē internets vēstule loc. cit. bez datuma bez vietas bez izdevēja par tiešsaiste op. cit. oriģināldarbs publicētājs personīga komunikācija podkāsts podkāsta epizode pirmsdruka iesniegts radio pārraide radio seriāls radio seriāla epizode atsauce atsauces iegūts recenzija par mērogs speciālizlaidums speciāllā sadaļa televīzijas pārraide televīzijas seriāls televīzijas seriāla epizode videoieraksts darba dokuments anon. apm. b.d. b.v. b.i. ats. ats. rec. par raksts žurnāla raksts žurnāla raksts laikraksta raksts likumprojekts raidījums klasisks darbs krājums datu kopa dokuments ieraksts vārdnīcas ieraksts enciklopēdijas ieraksts pasākums attēls uzklausīšana intervija tiesas lieta tisību akts manuskripts karte kinofilma partitūra brošūra konferences referāts patents priekšnesums periodisks izdevums personīga komunikācija ieraksts bloga ieraksts regula pārskats recenzija grāmatas recenzija programmatūra dziesma runa standarts diplomdarbs līgums tīmekļa vietne žurn. raksts mag. raksts laikr. raksts dok. att. interv. MS kinof. pārsk. rec. grām. rec. dz. liecība no recenzija par grāmatas recenzija m.ē. p.m.ē. p.m.ē. m.ē. : , ; -ais pirmais otrais trešais ceturtais piektais sestais septītais astotais devītais desmitais pirmā otrā trešā ceturtā piektā sestā septītā astotā devītā desmitā cēliens cēlieni pielikums pielikumi pants panti grāmata grāmatas kanons kanoni nodaļa nodaļas sleja slejas atrašanās vieta atrašanās vietas vienādojums vienādojumi ilustrācija ilustrācijas folio folio numurs numuri rinda rindas piezīme piezīmes opuss opusi lappuse lappuses rindkopa rindkopas daļa daļas noteikums noteikumi aina ainas apakšnodaļa apakšnodaļas skatīt skatīt papildinājums papildinājumi tabula tabulas sadaļa sadaļas pants panti sējums sējumi piel. piel. p. p. grām. nod. sl. atr. v. atr. v. vien. vien. il. fo. nr. r. piez. op. lpp. lpp. rindk. d. not. not. ain. ain. apakšnod. sk. sk. papild. papild. tab. tab. sad. sad. p. p. sēj. sēj. ¶¶ § §§ nodaļa nodaļās citāts citāti numurs numuri redakcija redakcijas atsauce atsauces numurs numuri lappuse lappuses sējums sējumi lappuse lappuses izdruka izdrukas versija nod. nod. cit. cits. nr. red. ats. ats. nr. nr. lpp. lpp. sēj. sēj. lpp. lpp. izdr. izdr. priekšsēdētājs priekšsēdētāji krājuma redaktors krājuma redaktori sastādītājs sastādītāji sastādītājs sastādītāji pamatmateriāla autors pamatmateriāla autori līdzautors līdzautori kurators kuratori vadītājs vadītāji redaktors redaktors redaktors un tulkotājs redaktors un tulkotājs redaktors un tulkotājs redaktors un tulkotājs galvenais redaktors galvenie redaktori izpildproducents izpildproducenti viesis viesi vadītājs vadītāji ilustrators ilustratori intervētājs intervētāji stāstītājs stāstītāji organizators organizatori izpildītājs izpildītāji producents producenti saņēmējs saņēmēji scenārists scenāristi seriāla veidotājs seriāla veidotāji tulkotājs tulkotāji kr. red. kr. red. sast. sast. sast. sast. pamatmat. aut. pamatmat. aut. līdzaut. līdzaut. kur. kurs. vad. vad. red. red. red. un tulk. red. un tulk. red. un tulk. red. un tulk. galv. red. galv. red. izpildprod. izpildprod. ilustr. ilustr. interv. interv. stāst. stāst. org. orgs. izp. izp. prod. prod. saņ. saņ. scen. scen. ser. veid. ser. veid. tulk. tulk. priekšsēdētājs: sastādīja sastādīja piedaloties kurators: vadīja sagatavoja sagatavoja un tulkoja sagatavoja un tulkoja sagatavoja izpildproducents: ar viesi vadīja ilustrēja intervēja stāstīja organizēja izpildīja producēja saņēma scenārija autors: izveidoja tulkoja sast. pied. kur. sast. sag. sag. un tulk. sag. un tulk. sag. izpildprod. ar viesi vad. ilustr. stāst. org. izp. prod. scen. aut. izv. tulk. janvāris februāris marts aprīlis maijs jūnijs jūlijs augusts septembris oktobris novembris decembris janv. febr. mar. apr. mai. jūn. jūl. aug. sept. okt. nov. dec. pavasaris vasara rudens ziema ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-mn-MN.xml0000644000175100017510000006161515234654007023030 0ustar00runnerrunner This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 accessed advance online publication album and and others anonymous at audio recording available at by circa cited et al. film forthcoming from henceforth ibid. in in press internet захиа loc. cit. no date no place no publisher on online op. cit. original work published хувийн харилцаа холбоо podcast podcast episode preprint presented at the radio broadcast radio series radio series episode reference references retrieved review of scale special issue special section television broadcast television series television series episode video working paper anon c. n.d. n.p. n.p. ref. refs. rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing interview legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical хувийн харилцаа холбоо post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book AD BC BCE CE « » : , ; -p нэгдүгээр хоёрдугаар гуравдугаар дөрөвдүгээр тавдугаар зургаадугаар долоодугаар наймдугаар есдүгээр аравдугаар act acts appendix appendices article articles ном номнууд canon canons chapter chapters багана баганууд location locations equation equations figure figures folio folios тоо тоонууд шугам шугамнууд note notes opus opera хуудас хуудаснууд paragraph paragraph part parts rule rules scene scenes section sections sub verbo sub verbis supplement supplements table tables title titles verse verses volume volumes app. apps. art. arts. bk chap col loc. locs. eq. eqs. fig f no l. n. op p pp para pt r. rr. sc. scs. sec s.v. s.vv. supp. supps. tbl. tbls. tit. tits. v vv vol vols ¶¶ § §§ chapter chapters citation citations тоо тоонууд edition editions note notes number numbers хуудас хуудаснууд volume volumes page pages printing printings version chap. chaps. cit. cits. no ed n. no. nos. p pp vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators director directors редактор редакторууд редактор ба орчуулагч редакторууд ба орчуулагчид редактор ба орчуулагч редакторууд ба орчуулагчид редактор редакторууд executive producer executive producers guest guests host hosts illustrator illustrators narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators орчуулагч орчуулагчид comp. comps. contrib. contribs. cur. curs. dir. dirs. ред. ред. ред. ба орч. ред. ба орч. ред. ба орч. ред. ба орч. ред. ред. exec. prod. exec. prods. ill. ills. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. орч орч chaired by edited by compiled by by with curated by directed by edited by edited & translated by edited & translated by edited by executive produced by with guest hosted by illustrated by interview by narrated by organized by performed by produced by to by written by created by translated by ed. by comp. by w. cur. by dir. ed ed. & trans. by ed. & trans. by ed. exec. prod. by w. guest hosted by illus. narr. by org. by perf. by prod. by writ. by cre. by trans Нэгдүгээр сар Хоёрдугаар сар Гуравдугаар сар Дөрөвдүгээр сар Тавдугаар сар Зургаадугаар сар Долдугаар сар Наймдугаар сар Есдүгээр сар Аравдугаар сар Арван нэгдүгээр сар Арван хоёрдугаар сар 1-р сар 2-р сар 3-р сар 4-р сар 5-р сар 6-р сар 7-р сар 8-р сар 9-р сар 10-р сар 11-р сар 12-р сар Хавар Зун Намар Өвөл ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-ms-MY.xml0000644000175100017510000002704715234654007023051 0ustar00runnerrunner Fareed Sairi fareed@ukm.edu.my Farah Diba Abu Bakar This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2025-10-16T03:24:00+00:00 diakses dan dan lainnya anon pada tersedia pada oleh lebih kurang disitasi et al. mendatang dari ibid. dalam dalam proses cetakan internet surat tiada tarikh dalam talian dibentangkan pada rujukan rujukan diambil skala anon. ca. t.th. ruj. ruj. wawancara M SM pertama kedua ketiga keempat kelima keenam ketujuh kelapan kesembilan kesepuluh buku buku bab bab ruang ruang rajah rajah folio folio isu isu baris baris catatan catatan opus opus halaman halaman perenggan perenggan fasal fasal bahagian bahagian sub verbo sub verbis ayat ayat jilid jilid bk. bab kol. raj. fol. no. brs. ctt. op. hlm. hlm. pgn. fs. bag. s.v. s.vv. ayat ayat jil. jil. ¶¶ § §§ edisi edisi halaman halaman versi ed. hlm. hlm. pengarah pengarah penyunting penyunting editor & penterjemah editor & penterjemah editor & penterjemah editor & penterjemah pengarah penyuntingan pengarah penyuntingan ilustrator ilustrator penterjemah penterjemah dir. dir. pnyt. pnyt. pnyt. & ptrj. pnyt. & ptrj. pnyt. & ptrj. pnyt. & ptrj. ed. ed. il. il. ptrj. ptrj. oleh diarahkan oleh disunting oleh disunting & diterjemahkan oleh disunting & diterjemahkan oleh disunting oleh diilustrasi oleh diwawancara oleh kepada oleh diterjemahkan oleh dir. oleh ed. oleh ed. & penerj. oleh ed. & penerj. oleh ed. oleh illus. oleh trans. oleh Januari Februari Mac April Mei Jun Julai Ogoss September Oktober November Disember Jan Feb Mac Apr Mei Jun Jul Ogo Sep Okt Nov Dis Bunga Panas Luruh Sejuk ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-nb-NO.xml0000644000175100017510000005311515234654007023013 0ustar00runnerrunner Guttorm Flatabø Stian Øby Johansen This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-02-04T00:00:00+00:00 åpnet forhåndspublisert på nett album og med flere anonym lydopptak tilgjengelig på av circa sitert mfl. film kommende fra heretter ibid. i i trykk Internett brev loc. cit. uten dato mangler sted mangler utgiver om online op. cit. opprinnelig verk utgitt personlig kommunikasjon podkast podkastepisode innsendt manuskript presentert på radiosending radioserie radioserieepisode referanse referanser hentet anmeldelse av målestokk spesialutgave spesialseksjon fjernsynssending fjernsynsserie fjernsynsserieepisode video notat anon. ca. u.å. s.n. ref. ref. rev. of innsendt manuskript tidsskriftartikkel magasinartikkel avisartikkel proposisjon kringkasting klassiker samling datasett dokument oppføring ordbokoppføring leksikonoppføring begivenhet grafikk høring intervju rettssak lovgiving manuskript kart videoopptak partitur pamflett konferanseartikkel patent fremføring tidsskrift personlig kommunikasjon innlegg blogginnlegg forskrift rapport anmeldelse bokanmeldelse programvare lydopptak presentasjon standard avhandling traktat nettside tidsskriftart. avisart. dok. ms. høring av anmeldelse av anmeldelse av boken e.Kr. f.Kr. fvt. evt. « » : , ; . første andre tredje fjerde femte sjette sjuende åttende niende tiende akt akt appendiks appendiks artikkel artikkel bok bok kanon kanon kapittel kapittel kolonne kolonne sted sted ligning ligning figur figur folio folio nummer nummer linje linje note note opus opus side side avsnitt avsnitt del del regel regel scene scene paragraf paragraf sub verbo sub verbis supplement supplements tabell tabell tittel tittel vers vers bind bind art. art. kap. kol. fig. fol. nr. op. s. s. avsn. pargr. s.v. s.vv. supp. supps. tab. tab. v. v. bd. bd. ¶¶ § §§ kapittel kapitler note noter nummer nummer utgave utgave note note nummer nummer side sider bind bind side sider opplag opplag versjon kap. kap. note note nr. utg. nr. nr. s. s. bind bind s. s. oppl. oppl. leder ledere red. red. kompilator kompilatorer bidragsyter bidragsytere kurator kuratorer regissør regissører redaktør redaktører redaktør og oversetter redaktører og oversettere redaktør og oversetter redaktører og oversettere redaktør redaktører utøvende produsent utøvende produsenter gjest gjester vert verter illustratør illustratører forteller fortellere organisator organisatorer utøver utøvere produsent produsenter manusforfatter manusforfattere serieskaper serieskapere oversetter oversettere regi regi red. red. red. og overs. red. og overs. red. og overs. red. og overs. red. red. utøv. prod. utøv. prod. ill. ill. prod. prod. forf. forf. overs. overs. leda av redigert av kompilert av av med kuratert av regissert av redigert av redigert og oversatt av redigert og oversatt av redigert av utøvende produsert av med gjest vertskap av illustrert av intervjuet av fortalt av organisert av fremført av produsert av til av forfatta av skapt av oversatt av red. av regi red. red. og overs. av red. og overs. av red. utøv. prod. av illus. prod. av forf. av overs. januar februar mars april mai juni juli august september oktober november desember jan. feb. mar. apr. mai jun. jul. aug. sep. okt. nov. des. vår sommer høst vinter ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-nl-NL.xml0000644000175100017510000006252015234654007023022 0ustar00runnerrunner Rintze M. Zelle http://twitter.com/rintzezelle K. Avonts This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 geraadpleegd advance online publication album en en anderen anoniem bij audio recording beschikbaar op door circa geciteerd e.a. film in voorbereiding van henceforth ibid. in in druk internet brief loc. cit. zonder datum no place no publisher on online op. cit. original work published persoonlijke communicatie podcast podcast episode preprint gepresenteerd bij radio broadcast radio series radio series episode referentie referenties geraadpleegd review of schaal special issue special section television broadcast television series television series episode video working paper anon. c. z.d. n.p. n.p. ref. refs. rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing interview legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical persoonlijke communicatie post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book AD BC BCE CE - : , ; ste de de de de de de de de de de de de de de de de de de eerste tweede derde vierde vijfde zesde zevende achtste negende tiende act acts appendix appendices article articles boek boeken canon canons hoofdstuk hoofdstukken column columns location locations equation equations figuur figuren folio folio's nummer nummers regel regels aantekening aantekeningen opus opera pagina pagina's paragraaf paragrafen deel delen rule rules scene scenes sectie secties sub verbo sub verbis supplement supplements table tables title titles vers versen volume volumes app. apps. art. arts. bk. hfdst. col. loc. locs. eq. eqs. fig. f. nr. l. n. op. p. pp. par. deel r. rr. sc. scs. sec. s.v. s.vv. supp. supps. tbl. tbls. tit. tits. v. vv. vol. vols. ¶¶ § §§ chapter chapters citation citations nummer nummers druk drukken aantekening aantekeningen number numbers pagina pagina's volume volumes page pages printing printings versie chap. chaps. cit. cits. nr. dr. n. no. nos. p. pp. vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators regisseur regisseurs redacteur redacteuren redacteur & vertaler redacteuren & vertalers redacteur & vertaler redacteuren & vertalers redacteur redacteuren executive producer executive producers guest guests host hosts illustrator illustrators narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators vertaler vertalers comp. comps. contrib. contribs. cur. curs. reg. reg. red. red. red. & vert. red. & vert. red. & vert. red. & vert. red. red. exec. prod. exec. prods. ill. ill. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. vert. vert. chaired by edited by compiled by door with curated by geregisseerd door onder redactie van bewerkt & vertaald door bewerkt & vertaald door onder redactie van executive produced by with guest hosted by geïllustreerd door geïnterviewd door narrated by organized by performed by produced by ontvangen door door written by created by vertaald door ed. by comp. by w. cur. by geregisseerd door onder redactie van bewerkt & vertaald door bewerkt & vertaald door bewerkt door exec. prod. by w. guest hosted by geïllustreerd door narr. by org. by perf. by prod. by writ. by cre. by vertaald door januari februari maart april mei juni juli augustus september oktober november december jan. feb. mrt. apr. mei jun. jul. aug. sep. okt. nov. dec. lente zomer herfst winter ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-nn-NO.xml0000644000175100017510000005310215234654007023023 0ustar00runnerrunner Guttorm Flatabø Stian Øby Johansen This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-02-04T00:00:00+00:00 vitja førehandspublisert på nett album og med fleire anonym lydopptak tilgjengeleg på av circa sitert mfl. film kommande frå heretter ibid. i i trykk Internett brev loc. cit. utan dato manglar stad manglar utgjevar om på nett op. cit. opphavleg verk utgitt personlig kommunikasjon podkast podkast-episode innsendt manuskript presentert på radiosending radioserie radioserie-episode referanse referanse henta review of målestokk spesialutgåve spesialbolk fjernsynssending fjernsynsserie fjernsynsserie-episode video notat anon. ca. u.å. s.n. ref. ref. rev. of innsendt manuskript tidsskriftartikkel magasinartikkel avisartikkel proposisjon kringkasting klassikar samling datasett dokument oppføring ordbokoppføring leksikonoppføring hending grafikk høyring intervju rettssak lovgjeving manuskript kart video-opptak partitur pamflett konferanseartikkel patent framføring tidsskrift personleg kommunikasjon innlegg blogginnlegg forskrift rapport melding bokmelding programvare lydopptak presentasjon standard avhandling traktat nettside tidsskrift art. avisart. dok. ms. testimony of review of review of the book e.Kr. f.Kr. fvt. evt. « » : , ; . første andre tredje fjerde femte sjette sjuande åttande niande tiande akt akt appendiks appendiks artikkel artikkel bok bok kanon kanon kapittel kapittel kolonne kolonne stad stad likning likning figur figur folio folio nummer nummer linje linje note note opus opus side side avsnitt avsnitt del del regel regel scene scene paragraf paragraf sub verbo sub verbis supplement supplements tabell tabell tittel tittel vers vers bind bind art. art. kap. kol. fig. fol. nr. op. s. s. avsn. par. s.v. s.vv. supp. supps. tab. tab. v. v. bd. bd. ¶¶ § §§ kapittel kapitler citation citations nummer nummer utgåve utgåve note note number numbers side sider volume volumes page pages printing printings versjon kap. kap. cit. cits. nr. utg. nr. nr. s. s. vol. vols. s. s. print. prints. leiar leiarar ed. eds. kompilator kompilatorar bidragsytar bidragsytarar kurator kuratorar regissør regissørar redaktør redaktørar redaktør & omsetjar redaktørar & omsetjarar redaktør & omsetjar redaktørar & omsetjarar redaktør redaktørar utøvande produsent utøvande produsentar gjest gjester vert vertar illustratør illustratørar forteljar forteljarar organisator organisatorar utøvar utøvarar produsent produsentar manusforfattar manusforfattarar serieskapar serieskaparar omsetjar omsetjarar regi regi red. red. red. & oms. red. & oms. red. & oms. red. & oms. red. red. utøv. prod. utøv. prod. ill. ill. prod. prod. forf. forf. oms. oms. leia av edited by kompilert av av med kuratert av regissert av redigert av redigert & omsett av redigert & omsett av redigert av utøvande produsert av med gjest vertskap av illustrert av intervjua av fortald av organisert av utført av produsert av til av forfatta av skapt av omsett av ed. by regi red. red. & oms. av red. & oms. av red. vert ill. prod. av forf. av oms. januar februar mars april mai juni juli august september oktober november desember jan. feb. mar. apr. mai jun. jul. aug. sep. okt. nov. des. vår sommar haust vinter ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-pa-PK.xml0000644000175100017510000005127715234654007023021 0ustar00runnerrunner عثمان This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2025-10-16T03:24:00+00:00 پہنچیا آن لائن اگاؤں دتی اشاعت البم تے تے ہور گم نام پر آدیو ریکارڈ دستیابی دی پتا وسیلیوں تقریباً حوالہ دتا تے ہور فلم آوݨ والا از ہݨ توں ایضاً در پریس وچ انٹرنیٹ چٹھی ایضاً بے تاریخ بے تھاں بے چھاپا خانہ پر آن لائن ایضاً اصل کم چھاپیا نجی گل کرن پاڈ کاسٹ پاڈ کاسٹ ایپیسوڈ پریپرنٹ کانفرنس ریڈیو براڈ کاسٹ ریڈیو سلسلہ ریڈیو ایپیسوڈ حوالہ حوالے حاصل کیتا ریویو از سکیل خاص شمارہ خاص جز ٹیلی ویژن براڈ کاسٹ ٹیلی ویژن سلسلہ ٹیلی ویژن ایپیسوڈ ویڈیو ورکنگ پیپر پریپرنٹ جرنل دا لیکھ میگزین دا لیکھ اخبار دا لیکھ بِل براڈ کاسٹ کلیسک مجموعہ ڈیٹا سیٹ دستاویز اندراج لغت وچ اندراج انسائیکلو پیڈیا وچ اندراج واقعہ نگاری سماعت انٹرویو مقدمہ قانون نامہ مسودہ نقشہ ویڈیو ریکارڈ موسیقار سکور پمفلٹ کانفرنس پیپر پیٹنٹ ناٹک رسالہ نجی گل کرن پوسٹ بلاگ پوسٹ ریگولیشن ریپورٹ ریویو کتابی ریویو سافٹویر آڈیو ریکارڈ سپیچ سٹینڈرڈ تھیسس معاہدہ ویب صفحہ ثبوت دتا از ریویو کیتا از کتاب دا ریویو کیتا عیسوی قبل مسیح قبل عام زمانہ عام زمانہ : ، ؛ واں لا جا جا تھا واں واں واں واں ویں لی جی جی تھی ویں ویں ویں ویں پہلا دوجا تیجا چوتھا پنجواں چھیواں ستواں اٹھواں نوواں دسواں پہلی دوجی تیجی چوتھی پنجویں چھیویں ستویں اٹھویں نوویں دسویں ایکٹ ایکٹ ضمیمہ ضمیمے لیکھ لیکھ کتاب کتاباں قانون قانون کانڈ کانڈ کالم کالم تھاں تھاواں مساوات مساواتاں تصویر تصویراں فولیو فولیو شمارہ شمارے قطار قطاراں نوٹ نوٹ کارنامہ کارنامے صفحہ صفحے پیرا پیرے حصہ حصے رول رول سین سین جز جز زیر کلمہ زیر کلمے لاحق لاحق ٹیبل ٹیبل عنوان عنوان شعر شعر جلد جلد ¶¶ § §§ کانڈ کانڈ حوالہ حوالے نمبر نمبر چھپائی چھپائیاں حوالہ حوالے نمبر نمبر صفحہ صفحے جلد جلد صفحہ صفحے چھاپ چھاپاں ورژن ورژن چیر چیر سودھی سودھی مرتب مرتب حصہ لاوݨ والا حصہ لاوݨ والے کیوریٹر کیوریٹر ڈائریکٹر ڈائریکٹر سودھی سودھی سودھی & مترجم سودھی & مترجم سودھی & مترجم سودھی & مترجم سودھی سودھی انتظامیہ انتظامیہ مہمان مہمان میزبان میزبان مصور مصور راوی راوی تنظیم کرن والا تنظیم کرن والے کلاکار کلاکار پروڈیوسر پروڈیوسر لکھاری لکھاری سلسلہ بݨاوݨ والا سلسلہ بݨاوݨ والے مترجم مترجم چیر نال سودھی نال مرتب نال رچنا کار نال بقلم تے حصہ لاوݨ والے نال کیوریٹر نال ڈائریکٹر نال سودھی نال سودھی & مترجم نال سودھی & مترجم نال سودھی نال انتظامیے نال مہمان نال میزبان نال مصور نال انٹرویو نال راوی نال تنظیم کرن والے نال بقلم کلاکار نال پروڈیوسر نال توں بقلم بقلم رچنا کار نال مترجم نال جنوری فروری مارچ اپریل مئی جون جولئی اگست ستمبر اکتوبر نومبر دسمبر جنو فرو مار اپر مئی جون جول‍ اگس‍ ستم‍ اکت‍ نوم‍ دسم‍ بہار گرمی پتجھڑ سردی ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-pl-PL.xml0000644000175100017510000006140415234654007023026 0ustar00runnerrunner pAo Michal Pendzoncymisio Natalia L Kacper Kłosowski This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 dostęp advance online publication album i i inni anonim na nagranie dźwiękowe dostępne na przez około cytowane et al. film w przygotowaniu z odtąd ibid. w w druku internet list loc. cit. brak daty brak miejsca wydania brak wydawcy na online op. cit. wydanie oryginalne korespondencja prywatna podcast odcinek podcastu preprint zaprezentowano na audycja radiowa serial radiowy odcinek serialu radiowego referencja referencje pobrano recenzja skala wydanie specjalne sekcja specjalna transmisja telewizyjna serial telewizyjny odcinek serialu telewizyjnego wideo working paper anon. ok. b.d. b.m. b.w. ref. ref. rec. preprint journal article magazine article newspaper article bill broadcast classic collection dataset document hasło hasło w słowniku hasło w encyklopedii event graphic hearing wywiad legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical osobista komunikacja post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book n.e. p.n.e. BCE CE « » : , ; . pierwszy drugi trzeci czwarty piąty szósty siódmy ósmy dziewiąty dziesiąty akt akty załącznik załączniki artykuł artykuły książka książki kanon kanony rozdział rozdziały kolumna kolumny lokalizacja lokalizacje równanie równania rycina ryciny folio folio numer numery wiersz wiersze notatka notatki opus opera strona strony akapit akapity część części zasada zasady scena sceny sekcja sekcje sub verbo sub verbis suplement suplementy tabela tabele tytuł tytuły wers wersy tom tomy zał. zał. art. art. książka rozdz. kol. lok. lok. równ. równ. ryc. fol. nr l. n. op. s. s. akap. cz. zas. zas. sc. sc. sekc. s.v. s.vv. sup. sup. tab. tab. tyt. tyt. w. w. t. t. ¶¶ § §§ rozdział rozdziały cytowanie cytowania numer numery wydanie wydania notatka notatki numer numery strona strony tom tomy strona strony druk druki wersja rozdz. rozdz. cyt. cyt. nr nr. wyd. n. nr nr. s. s. t. t. s. s. druk druk. chair chairs ed. eds. compiler compilers contributor contributors curator curators reżyser reżyserzy redaktor redaktorzy redaktor & tłumacz redaktorzy & tłumacze redaktor & tłumacz redaktorzy & tłumacze edytor edytorzy executive producer executive producers guest guests host hosts ilustrator ilustratorzy narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators tłumacz tłumacze comp. comps. contrib. contribs. cur. curs. reż. reż. red. red. red.tłum. red.tłum. red.tłum. red.tłum. red. red. exec. prod. exec. prods. il. il. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. tłum. tłum. chaired by edited by compiled by przez with curated by reżyserowane przez zredagowane przez zredagowane i przetłumaczone przez zredagowane i przetłumaczone przez zredagowane przez executive produced by with guest hosted by ilustrowane przez przeprowadzony przez narrated by organized by performed by produced by dla przez written by created by przetłumaczone przez ed. by comp. by w. cur. by reż. red. red.tłum. red.tłum. red. exec. prod. by w. guest hosted by il. narr. by org. by perf. by prod. by writ. by cre. by tłum. stycznia lutego marca kwietnia maja czerwca lipca sierpnia września października listopada grudnia sty. lut. mar. kwi. maja cze. lip. sie. wrz. paź. lis. grud. wiosna lato jesień zima ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-pt-BR.xml0000644000175100017510000006534315234654007023034 0ustar00runnerrunner José Antonio Meira da Rocha Meira da Rocha Renato Cirino André Luiz Appel https://orcid.org/0000-0002-9608-803X Isabelly Silva This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 acesso em publicação prévia em linha álbum e e outros anônimo em gravação de áudio disponível em por circa citado et al. filme a ser publicado de daqui em diante ibidem em no prelo internet carta loc. cit. sem data sem local sem editor em online op. cit. trabalho original publicado comunicação pessoal podcast episódio de podcast preprint apresentado em transmissão de rádio série radiofônica episódio de série radiofônica referência referências recuperado revisão de escala edição especial sessão especial transmissão de tv série de tv episódio de série de televisão vídeo artigo inacabado anôn. c. s.d. s.l. s.e. ref. refs. rev. de pré-impressão artigo de periódico artigo de revista artigo de jornal lei transmissão clássico coleção conjunto de dados documento verbete verbete de dicionário verbete de enciclopédia evento iconográfico audiência entrevista jurisprudência legislação manuscrito mapa gravação de vídeo partitura musical panleto trabalho em evento patente performance periódico comunicação pessoal publicação publicação de blog regulamento relatório resenha resenha de livro programa de computador gravação de áudio apresentação norma tese tratado página da web art. periódico art. rev. art. j. doc. iconog. entrev. ms. grav. vídeo rel. rev. resenha liv. gravação áudio audiência de revisão de revisão do livro depois de Cristo AC BCE CE : , ; º ª º primeira segunda terceira quarta quinta sexta sétima oitava nona décima primeiro segundo terceiro quarto quinto sexto sétimo oitavo nono décimo ato atos apêndice apêndices artigo artigos livro livros cânone cânones capítulo capítulos coluna colunas localizador localizadores equação equações figura fólio fólios número números linha linhas nota notas opus opera página páginas parágrafo parágrafos parte partes norma normas cena cenas seção seções sub verbo sub verbis supplement supplements tabela tabelas título títulos verso versos volume volumes app. apps. art. arts. liv. cap. col. local. locals. eq. eqs. fig. f. n. l. n. op. p. p. par. pt. pt. norma normas c. cns. seç. s.v. s.vv. supl. supl. tbl. tbls. tit. tits. v. p. v. v. ¶¶ § §§ chapter chapters citation citations número números edição edições nota notas number numbers página páginas volume volumes página inicial páginas iniciais impressão impressões versão cap. cap. cit. cit. ed. n. n. n. p. p. vol. vols. p. p. impr. imprs. presidente presidentes editor editores compilador compiladores contribuidor contribuidores curador curadores diretor diretores organizador organizadores editor e tradutor editores e tradutores editor e tradutor editores e tradutores editor editores produtor executivo produtores executivos convidado convidados anfitrião anfitriões ilustrador ilustradores narrador narradores organizador organizadores intérprete intérpretes produtor produtores roteirista roteiristas criador da série criadores da série tradutor tradutores pres. pres. ed. ed. comp. comps. contrib. contribs. cur. curs. dir. dirs. org. org. ed. e trad. eds. e trads. ed. e trad. eds. e trads. ed. eds. prod. exec. prods. execs. il. ils. narr. narrs. org. org. intérp. intérps. prod. prods. roteir. roteirs. cre. cres. trad. trads. presidido por compilado por por contribuição de curadoria de organizado por editado e traduzido por editado e traduzido por editado por produção executiva de com participação de apresentado por ilustrado por entrevista cedida a narração de organizado por interpretado por produzido por destinado a por escrito por criado por traduzido por editorado por comp. por com contrib. de cur. de dir. por org. por ed. e trad. por ed. e trad. por ed. por prod. exec. de com part. de apres. por ilus. por narr. por org. por interp. por prod. por escr. por criado por trad. por janeiro fevereiro março abril maio junho julho agosto setembro outubro novembro dezembro jan. fev. mar. abr. maio jun. jul. ago. set. out. nov. dez. Primavera Verão Outono Inverno ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-pt-PT.xml0000644000175100017510000006341115234654007023046 0ustar00runnerrunner This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2025-10-16T03:24:00+00:00 Jonadabe PT André Luiz Appel https://orcid.org/0000-0002-9608-803X acedido publicação prévia em linha álbum e e outros anónimo em gravação de áudio disponível em por circa citado et al. filme a publicar de daqui em diante ibid. em no prelo internet carta loc. cit. sem data sem local sem editor em em linha op. cit. trabalho original publicado comunicação pessoal podcast episódio de podcast preprint apresentado em transmissão de rádio série de rádio episódio de série de rádio referência referências obtido revisão de escala edição especial secção especial transmissão televisiva série televisiva episódio de série televisiva vídeo trabalho em progresso anón. c. s.d. s.l. s.e. ref. refs. rev. de preprint artigo de revista artigo de revista artigo de jornal fatura transmissão clássico coleção conjunto de dados documento entrada entrada de dicionário entrada de enciclopédia evento gráfico audiência entrevista jurisprudência legislação manuscrito mapa gravação de vídeo partitura panfleto artigo de conferência patente performance periódico comunicação pessoal postagem postagem de blogue regulamento relatório revisão revisão de livro programa de computador gravação áudio discurso norma tése tratado página da internet art. rev. art. rev. art. j. doc. gráf. entrev. MS grav. vídeo rel. rev. rev. l. grav. áudio audiência de revisão de revisão do livro AD AC AEC EC « » : , ; primeiro segundo terceiro quarto quinto sexto sétimo oitavo nono décimo primeira segunda terceira quarta quinta sexta sétima oitava nona décima ata atas apêndice apêndices artigo artigos livro livros cânone cânones capítulo capítulos coluna colunas localização localizações equação equações figura figuras fólio fólios número números linha linhas nota notas opus opera página páginas parágrafo parágrafos parte partes regra regras cena cenas secção secções sub verbo sub verbis suplemento suplementos tabela tabelas título títulos versículo versículos volume volumes app. apps. art. arts. liv. cap. col. loc. locs. eq. eqs. fig. f. n.º l. n. op. p. pp. par. pt. r. rr. sc. scs. sec. s.v. s.vv. supl. supls. tbl. tbls. tít. títs. v vv vol. vols. ¶¶ § §§ capítulo capítulos citação citações número números edição edições referência referências número números página páginas volume volumes página páginas impressão impressões versão núm. cap. núms. cáp. cit. cits. n.º ed. ref. refs. n. ns. p. pp. vol. vols. p. pp. impr. imprs. cadeira cadeiras ed. eds. compilador compiladores contribuinte contribuintes curador curadores diretor diretores editor editores editor e tradutor editores e tradutores editor e tradutor editores e tradutores diretor editorial diretores editoriais produtor executivo produtores executivos convidado convidados anfitrião anfitriões ilustrador ilustradores narrador narradores organizador organizadores ator atores produtor produtores escritor escritores criador de séries criadores de séries tradutor tradutores compil. compils. contrib. contribs. cur. curs. dir. dirs. ed. eds. ed. & trad. eds. & trads. ed. & trad. eds. & trads. ed. eds. prod. exec. prods. exec. il. ils. narr. narrs. org. orgs. perf. perfs. prod. prods. roteir. roteirs. cri. cris. trad. trads. presidido por editado por compilado por por com curado por dirigido por editado por editado e traduzido por editado e traduzido por editorial de produção executiva de com convidado apresentado por ilustrado por entrevistado por narrado por organizado por atuado por produzido por para revisto por escrito por criado por traduzido por ed. por comp. por c/ cur. por dir. ed. ed. & trad. por ed. & trad. por ed. prod. exec. de c/ convid. apres. por ilus. narr. de org. por perf. por prod. por escr. por criado por trad. janeiro fevereiro março abril maio junho julho agosto setembro outubro novembro dezembro jan. fev. mar. abr. mai. jun. jul. ago. set. out. nov. dez. Primavera Verão Outono Inverno ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-ro-RO.xml0000644000175100017510000006172315234654007023044 0ustar00runnerrunner Nicolae Turcan nturcan@gmail.com Alin Andrei Bălașa alin.andrei.balasa@blsalin.dev Dorin Jorea dorin.jorea@gmail.com This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2025-10-16T03:24:00+00:00 data accesării publicare online în avans album și și alții anonim la înregistrare audio disponibil la de circa citat et al. film în curs de apariție din de aici înainte ibidem în sub tipar internet scrisoare loc. cit. fără dată fără loc fără editor pe online op. cit. lucrare originală publicată comunicare personală podcast episod de podcast preprint prezentat la transmisie radio serie radio episod de serie radio referință referințe preluat în recenzie a scală număr special secțiune specială emisiune de televiziune serial televizat episod al serialului televizat înregistrare video lucrare în curs de elaborare anon. cca. f.a. f. l. f. e. ref. ref. rec. a preprint articol de revistă articol de revistă articol de ziar proiect de lege transmisie clasic colecție set de date document intrare intrare în dicționar intrare în enciclopedie eveniment grafică audiere interviu caz juridic legislație manuscris hartă înregistrare video partitură muzicală pamflet articol de conferință brevet interpretare periodic comunicare personală postare postare pe blog reglementare raport recenzie recenzie de carte software înregistrare audio prezentare standard teză tratat pagină Web art. revistă art. revistă art. ziar doc. graf. interv. MS înreg. video rap. rec. rec. carte înreg. audio mărturie a recenzie a recenzie a cărții d.Hr. î.Hr. BCE CE « » - : , ; -lea primul al doilea al treilea al patrulea al cincilea al șaselea al șaptelea al optulea al nouălea al zecelea actul actele anexa anexele articolul articolele cartea cărțile canonul canoanele capitolul capitolele coloana coloanele locul locurile ecuația ecuațiile figura figurile folioul foliourile numărul numerele linia liniile nota notele opusul opusurile pagina paginile paragraful paragrafele partea părțile regula regulile scena scenele secțiunea secțiunile sub verbo sub verbis suplimentul suplimentele tabelul tabelele titlul titlurile versetul versetele volumul volumele app. apps. art. cart. cap. col. loc. locs. ec. ecs. fig. fol. nr. l. n. op. p. pp. par. part. r. rr. sc. scs. sec. s.v. s.vv. suplim. suplim. tbl. tbls. tit. tits. v. vv. vol. vol. ƒ ƒƒ ¶¶ § §§ capitolul capitolele citarea citările numărul numerele ediția edițiile referință referințe numărul numerele pagina paginile volumul volumele pagina paginile tiparul tiparele versiunea cap. chaps. cit. cits. nr. ed. cf. nr. p. pp. vol. vol. p. pp. print. print. președinte președinți editorul seriei editorii seriei compilator compilatori contributor contributori curator curatori director directori editor editori editor și traducător editori și traducători editor și traducător editori și traducători coordonator coordonatori producător executiv producători executivi invitat invitați gazdă gazde ilustrator ilustratori narator naratori organizator organizatori interpret interpreți producător producători scriitor scriitori creator de serie creatori de serie traducător traducători comp. comp. contrib. contrib. curat. curat. dir. dir. ed. ed. ed. și trad. ed. și trad. ed. și trad. ed. și trad. coord. coord. prod. exec. prod. exec. ilustr. ilustr. nar. nar. org. org. interpr. interpr.. prod. prod. scriit. scriit. ed. col. ed. col. trad. trad. condus de editat de compilat de de cu contribuția curator coordonat de ediție de ediție și traducere de ediție și traducere de coordonat de produs executiv de cu invitatul găzduit de ilustrații de interviu de narat de organizat de realizat de produs de în de scris de colecție editată de traducere de ed. de comp. de cu cur. dir. ed. de ed. și trad. de ed. și trad. de coord. de prod. exec. de cu invit. găzd. de ilustr. de nar. de org. de interpr. de prod. de scen. de ed. col. de trad. de ianuarie februarie martie aprilie mai iunie iulie august septembrie octombrie noiembrie decembrie ian. feb. mar. apr. mai iun. iul. aug. sep. oct. nov. dec. primăvara vara toamna iarna ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-ru-RU.xml0000644000175100017510000007110615234654007023054 0ustar00runnerrunner Alexei Kouprianov alexei.kouprianov@gmail.com This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 просмотрено advance online publication album и и др. аноним на audio recording доступно на около цитируется по и др. film ожидается от henceforth там же в в печати Интернет письмо loc. cit. без даты no place no publisher on онлайн op. cit. original work published личная переписка podcast podcast episode preprint представлено на radio broadcast radio series radio series episode ссылка ссылки извлечено review of масштаб special issue special section television broadcast television series television series episode video working paper анон. ок. цит. по б. д. n.p. n.p. ссылка ссылки rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing интервью legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical личная переписка post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book н. э. до н. э. BCE CE « » : , ; первое второе третье четвертое пятое шестое седьмое восьмое девятое десятое первый второй третий четвертый пятый шестой седьмой восьмой девятый десятый первая вторая третья четвертая пятая шестая седьмая восьмая девятая десятая act acts appendix appendices article articles книга книги canon canons глава главы столбец столбцы location locations equation equations рисунок рисунки лист листы выпуск выпуски строка строки примечание примечания сочинение сочинения страница страницы параграф параграфы часть части rule rules scene scenes раздел разделы смотри supplement supplements table tables title titles стих стихи том тома app. apps. art. arts. кн. гл. стб. loc. locs. eq. eqs. рис. л. лл. вып. стр. прим. соч. с. сс. п. пп. ч. чч. r. rr. sc. scs. разд. см. supp. supps. tbl. tbls. tit. tits. ст. т. тт. ¶¶ § §§ chapter chapters citation citations выпуск выпуски издание издания примечание примечания number numbers страница страницы volume volumes page pages printing printings версия chap. chaps. cit. cits. вып. изд. прим. no. nos. с. сс. vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators режиссер режиссеры редактор редакторы редактор и переводчик редакторы и переводчики редактор и переводчик редакторы и переводчики ответственный редактор ответственные редакторы executive producer executive producers guest guests host hosts иллюстратор иллюстраторы narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators переводчик переводчики comp. comps. contrib. contribs. cur. curs. реж. ред. ред. и пер. ред. и пер. отв. ред. exec. prod. exec. prods. ил. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. пер. chaired by edited by compiled by with curated by режиссировано под редакцией под редакцией и переведено под редакцией и переведено под ответственной редакцией executive produced by with guest hosted by иллюстрировано интервью проведено narrated by organized by performed by produced by к written by created by переведено ed. by comp. by w. cur. by реж. под ред. под ред. и пер. под ред. и пер. под отв. ред. exec. prod. by w. guest hosted by ил. narr. by org. by perf. by prod. by writ. by cre. by пер. январь февраль март апрель май июнь июль август сентябрь октябрь ноябрь декабрь янв. фев. мар. апр. май июн. июл. авг. сен. окт. ноя. дек. весна лето осень зима ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-sk-SK.xml0000644000175100017510000006137015234654007023034 0ustar00runnerrunner Tomáš Ferianc kohafan Peter Kubala This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2025-10-16T03:24:00+00:00 cit advance online publication album a a ďalší anonym v zvukový záznam dostupné na by circa cit et al. film nadchádzajúci z ďalej ibid. v v tlači internet list loc. cit. no date sine loco sine nomine na online op. cit. pôvodné dielo publikované osobná komunikácia podcast epizóda podcastu preprint prezentované na rozhlasové vysielanie rozhlasový seriál epizóda rozhlasového seriálu referencia referencie cit recenzia mierka osobitné vydanie osobitná sekcia televízne vysielanie televízny seriál epizóda televízneho seriálu video pracovný dokument anon. cca. n.d. s.l. s.n. ref. ref. rec. článok vedecký článok článok v časopise článok v novinách účet vysielanie classic zborník dataset dokument záznam slovníkové heslo encyklopedický záznam udalosť grafika pojednávanie osobná komunikácia právny prípad legislatíva rukopis mapa videonahrávka musical score brožúra konferečný príspevok patent vystúpenie periodikum osobná komunikácia príspevok príspevok na blogu smernica správa recenzia recenzia knihy softvér pieseň prejav štandard téza zmluva webová stránka journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. spr. rev. bk. rev. audio rec. testimony of review of review of the book po Kr. pred Kr. BCE CE : , ; th st nd rd th th th first second third fourth fifth sixth seventh eighth ninth tenth act acts appendix appendices article articles kniha knihy canon canons kapitola kapitoly stĺpec stĺpce location locations rovnica rovnice obrázok obrázky list listy číslo čísla riadok riadky poznámka poznámky opus opera strana strany odstavec odstavce časť časti pravidlo pravidlá scéna scény sekcia sekcie sub verbo sub verbis supplement supplements tabuľka tabuľky názov názvy verš verše zväzok zväzky app. apps. art. arts. k. kap. stĺp. loc. locs. rov. rov. obr. l. č. l. n. op. s. s. ods. č. r. rr. sc. scs. sek. s.v. s.vv. supp. supps. tab. tab. tit. tits. v. v. zv. zv. § § kapitola kapitoly citation citations číslo čísla vydanie vydania referencia referencie číslo čísla strana strany zväzok zväzky strana strany printing printings verzia kap. kap. cit. cits. č. vyd. ref. refs. č. č. s. s. zv. zv. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators director directors editor editori zostavovateľ & prekladateľ zostavovatelia & prekladatelia zostavovateľ & prekladateľ zostavovatelia & prekladatelia zostavovateľ zostavovatelia executive producer executive producers guest guests host hosts illustrátor illustrátori narrator narrators organizátor organizátori performer performers producent producenti scenárista scenáristi series creator series creators prekladateľ prekladatelia comp. comps. contrib. contribs. cur. curs. dir. dirs. ed. ed. ed. & tran. eds. & trans. ed. & tran. eds. & trans. zost. zost. exec. prod. exec. prods. ill. ills. narr. narrs. org. org. perf. perfs. prod. prod. writ. writs. cre. cres. prel. prel. chaired by edited by compiled by by with curated by directed by zostavil zostavil & preložil zostavil & preložil zostavil executive produced by with guest hosted by illustrated by rozhovor urobil narrated by organized by performed by produced by adresát by written by created by preložil ed. by comp. by w. cur. by dir. ed. zost. & prel. zost. & prel. ed. exec. prod. by w. guest hosted by illus. narr. by org. by perf. by prod. by writ. by cre. by prel. január február marec apríl máj jún júl august september október november december jan. feb. mar. apr. máj. jún. júl. aug. sep. okt. nov. dec. Jar Leto Jeseň Zima ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-sl-SI.xml0000644000175100017510000006046015234654007023032 0ustar00runnerrunner Kristof Ostir ratek1 Uroš Mikanovič This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 pridobljeno advance online publication album in in drugi anonimni pri audio recording dostopno na približno citirano idr. film pred izidom s henceforth isto v v tisku internet pismo loc. cit. brez datuma no place no publisher on na spletu op. cit. original work published osebna komunikacija podcast podcast episode preprint predstavljeno na radio broadcast radio series radio series episode referenca reference pridobljeno review of merilo special issue special section television broadcast television series television series episode video working paper anon. prib. b. d. n.p. n.p. ref. ref. rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing intervju legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical osebna komunikacija post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book n. št. pr. n. št. BCE CE » « : , ; . prva druga tretja četrta peta šesta sedma osma deveta deseta act acts appendix appendices article articles knjiga knjige canon canons poglavje poglavja stolpec stolpci location locations equation equations slika slike folio folii številka številke vrstica vrstice opomba opombe opus opusi stran strani odstavek odstavki del deli rule rules scene scenes odsek odseki sub verbo sub verbis supplement supplements table tables title titles verz verzi letnik letniki app. apps. art. arts. knj. pogl. stolp. loc. locs. eq. eqs. sl. fol. št. vrst. op. opus str. str. odst. del r. rr. sc. scs. ods. s. v. s. v. supp. supps. tbl. tbls. tit. tits. v. v. let. let. ¶¶ § §§ chapter chapters citation citations številka številke izdaja izdaje opomba opombe number numbers stran strani volume volumes page pages printing printings različica chap. chaps. cit. cits. št. izd. op. no. nos. str. str. vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators režiser režiserji urednik uredniki urednik & prevajalec uredniki & prevajalci urednik & prevajalec uredniki & prevajalci glavni urednik glavni uredniki executive producer executive producers guest guests host hosts ilustrator ilustratorji narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators prevajalec prevajalci comp. comps. contrib. contribs. cur. curs. rež. rež. ur. ur. ur. & prev. ur. & prev. ur. & prev. ur. & prev. gl. ur. gl. ur. exec. prod. exec. prods. ilus. ilus. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. prev. prev. chaired by edited by compiled by with curated by režiral uredil uredil & prevedel uredil & prevedel uredil executive produced by with guest hosted by ilustriral intervjuval narrated by organized by performed by produced by za od written by created by prevedel ed. by comp. by w. cur. by rež. ured. ured. & prev. by ured. & prev. by ured. exec. prod. by w. guest hosted by ilus. narr. by org. by perf. by prod. by writ. by cre. by prev. januar februar marec april maj junij julij avgust september oktober november december jan. feb. mar. apr. maj jun. jul. avg. sep. okt. nov. dec. pomlad poletje jesen zima ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-sr-Cyrl-RS.xml0000644000175100017510000006205715234654007023764 0ustar00runnerrunner This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 приступљено advance online publication album и и остали анонимна на audio recording available at by circa цитирано и остали film долазећи од henceforth ibid. у у штампи Интернет писмо loc. cit. no date no place no publisher on на Интернету op. cit. original work published лична комуникација podcast podcast episode preprint представљено на radio broadcast radio series radio series episode reference references преузето review of scale special issue special section television broadcast television series television series episode video working paper анон. c. без датума n.p. n.p. ref. refs. rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing интервју legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical лична комуникација post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book AD BC BCE CE : , ; th st nd rd th th th first second third fourth fifth sixth seventh eighth ninth tenth act acts appendix appendices article articles књига књиге canon canons поглавље поглавља колона колоне location locations equation equations цртеж цртежи фолио фолији број бројеви линија линије белешка белешке опус опера страница странице параграф параграфи део делова rule rules scene scenes одељак одељака sub verbo sub verbis supplement supplements table tables title titles строфа строфе том томова app. apps. art. arts. књига Пог. кол. loc. locs. eq. eqs. црт. фолио изд. l. n. оп. стр. стр. пар. део r. rr. sc. scs. од. s.v. s.vv. supp. supps. tbl. tbls. tit. tits. стр. стр. том томови ¶¶ § §§ chapter chapters citation citations број бројеви издање издања белешка белешке number numbers страница странице volume volumes page pages printing printings version chap. chaps. cit. cits. изд. изд. n. no. nos. стр. стр. vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators director directors уредник урединици editor & translator editors & translators editor & translator editors & translators editor editors executive producer executive producers guest guests host hosts illustrator illustrators narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators преводилац преводиоци comp. comps. contrib. contribs. cur. curs. dir. dirs. ур. ур. ed. & tran. eds. & trans. ed. & tran. eds. & trans. ed. eds. exec. prod. exec. prods. ill. ills. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. прев. прев. chaired by edited by compiled by by with curated by directed by уредио edited & translated by edited & translated by edited by executive produced by with guest hosted by illustrated by интервјуисао narrated by organized by performed by produced by прима by written by created by превео ed. by comp. by w. cur. by dir. ур. ed. & trans. by ed. & trans. by ed. exec. prod. by w. guest hosted by illus. narr. by org. by perf. by prod. by writ. by cre. by прев. Јануар Фебруар Март Април Мај Јуни Јули Август Септембар Октобар Новембар Децембар Јан. Феб. Март Апр. Мај Јуни Јули Авг. Сеп. Окт. Нов. Дец. Spring Summer Autumn Winter ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-sr-Latn-RS.xml0000644000175100017510000005334315234654007023747 0ustar00runnerrunner Nikola N. Grubor nikola.n.grubor@med.bg.ac.rs nikola-grubor.github.io/ This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2025-10-18T05:50:06+00:00 pristupljeno advance online publication album i i ostali anonimno na audio zapis dostupno na by circa citirano i ostali film dolazeći od henceforth ibid. u u štampi Internet pismo loc. cit. bez datuma no place no publisher on na Internetu op. cit. original work published lična komunikacija podkast podcast episode preprint predstavljeno na radio broadcast radio series radio series episode referenca reference preuzeto skala special issue special section television broadcast television series television series episode video working paper anon. c. bez datuma n.p. n.p. ref. refs. preprint članak iz časopisa članak iz magazina novinarski članak bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing интервју legal case legislation rukopis mapa video recording musical score pamphlet conference paper patent performance periodical лична комуникација post blog post regulation report review book review software audio recording presentation standard teza treaty web stranica journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. AD BC BCE CE : , ; th st nd rd th th th prvi drugi treći četvrti peti šesti sedmi osmi deveti deseti act acts appendix appendices članak članci knjiga knjige canon canons poglavlje poglavlja kolona kolone location locations equation equations figura figure folio foliji broj brojevi linija linije beleška beleške opus opera stranica stranice paragraf paragrafi deo delova rule rules scene scenes odeljak odeljaka sub verbo sub verbis table tables title titles strofa strofe tom tomova app. apps. art. arts. knjiga Pog. Kol. loc. locs. eq. eqs. fig. folio izd. l. n. op. str. str. par. deo r. rr. sc. scs. od. s.v. s.vv. tbl. tbls. tit. tits. str. str. tom tomovi ¶¶ § §§ izdanje izdanja stranica stranice verzija izd. str. str. chair chairs compiler compilers contributor contributors curator curators director directors urednik urednici editor & translator editors & translators editor editors executive producer executive producers guest guests host hosts illustrator illustrators narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators prevodilac prevodioci comp. comps. sarad. sarad. cur. curs. dir. dirs. ur. ur. ed. & tran. eds. & trans. ed. eds. exec. prod. exec. prods. ill. ills. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. prev. prev. chaired by compiled by by with curated by directed by uredio edited & translated by edited by executive produced by with guest hosted by illustrated by intervjuisao narrated by organized by performed by produced by prima by written by created by preveo comp. by w. cur. by dir. ur. ed. & trans. by ed. exec. prod. by w. guest hosted by illus. narr. by org. by perf. by prod. by writ. by cre. by prev. Januar Februar Mart April Maj Juni Juli Avgust Septembar Oktobar Novembar Decembar Jan. Feb. Mart Apr. Maj Juni Juli Avg. Sep. Okt. Nov. Dec. Proleće Leto Jesen Zima ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-sv-SE.xml0000644000175100017510000006120415234654007023035 0ustar00runnerrunner torfeur Sylvester Keil Sebastian Karcher Ulf Harnhammar This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 åtkomstdatum advance online publication album och och andra anonym vid audio recording tillgänglig vid av cirka citerad m.fl. film kommande från henceforth ibid. i i tryck internet brev loc. cit. utan årtal no place no publisher on online op. cit. original work published personlig kommunikation podcast podcast episode preprint presenterad vid radio broadcast radio series radio series episode referens referenser hämtad review of scale special issue special section television broadcast television series television series episode video working paper anon. ca u.å. n.p. n.p. ref. ref. rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing intervju legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical personlig kommunikation post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book e.Kr. f.Kr. BCE CE : , ; :e :a :a :e :e första andra tredje fjärde femte sjätte sjunde åttonde nionde tionde act acts appendix appendices article articles bok böcker canon canons kapitel kapitel kolumn kolumner location locations equation equations figur figurer folio folios nummer nummer rad rader not noter opus opera sida sidor stycke stycken del delar rule rules scene scenes avsnitt avsnitt sub verbo sub verbis supplement supplements table tables title titles vers verser volym volymer app. apps. art. arts. bok kap. kol. loc. locs. eq. eqs. fig. f. nr l. n. op. s. s. st. del r. rr. sc. scs. avs. s.v. s.vv. supp. supps. tbl. tbls. tit. tits. vers verser vol. vol. ¶¶ § §§ chapter chapters citation citations nummer nummer upplaga upplagor not noter number numbers sida sidor volume volumes page pages printing printings version chap. chaps. cit. cits. nr uppl. n. no. nos. s. s. vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators director directors redaktör redaktörer redaktör & översättare redaktörer & översättare redaktör & översättare redaktörer & översättare editor editors executive producer executive producers guest guests host hosts illustratör illustratörer narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators översättare översättare comp. comps. contrib. contribs. cur. curs. dir. dirs. red. red. red. & övers. red. & övers. red. & övers. red. & övers. ed. eds. exec. prod. exec. prods. ill. ill. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. övers. övers. chaired by edited by compiled by av with curated by directed by redigerad av redigerad & översatt av redigerad & översatt av edited by executive produced by with guest hosted by illustrerad av intervjuad av narrated by organized by performed by produced by till by written by created by översatt av ed. by comp. by w. cur. by dir. red. red. & övers. av red. & övers. av ed. exec. prod. by w. guest hosted by illus. narr. by org. by perf. by prod. by writ. by cre. by övers. januari februari mars april maj juni juli augusti september oktober november december jan. feb. mar. apr. maj juni juli aug. sep. okt. nov. dec. vår sommar höst vinter ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-th-TH.xml0000644000175100017510000006515415234654007023034 0ustar00runnerrunner Dusit Laohasinnarong Watcharakorn Kaobath This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 สืบค้น advance online publication album และ และคณะ นิรนาม ที่ audio recording เข้าถึงได้จาก โดย โดยประมาณ อ้างถึง และคณะ film เต็มใจให้ข้อมูล จาก henceforth ในที่เดียวกัน ใน กำลังรอตีพิมพ์ อินเทอร์เน็ต จดหมาย loc. cit. ไม่ปรากฏปีที่พิมพ์ no place no publisher on ออนไลน์ op. cit. original work published การสื่อสารส่วนบุคคล podcast podcast episode preprint นำเสนอที่ radio broadcast radio series radio series episode เอกสารอ้างอิง เอกสารอ้างอิง สืบค้น review of scale special issue special section television broadcast television series television series episode video working paper นิรนาม ประมาณ ม.ป.ป. n.p. n.p. อ้างอิง อ้างอิง rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing การสัมภาษณ์ legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical การสื่อสารส่วนบุคคล post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book ค.ศ. พ.ศ. BCE CE : , ; หนึ่ง สอง สาม สี่ ห้า หก เจ็ด แปด เก้า สิบ act acts appendix appendices article articles หนังสือ หนังสือ canon canons บทที่ บทที่ สดมภ์ สดมภ์ location locations equation equations รูปภาพ รูปภาพ หน้า หน้า ฉบับที่ ฉบับที่ บรรทัดที่ บรรทัดที่ บันทึก บันทึก บทประพันธ์ บทประพันธ์ หน้า หน้า ย่อหน้า ย่อหน้า ส่วนย่อย ส่วนย่อย rule rules scene scenes หมวด หมวด ใต้คำ ใต้คำ supplement supplements table tables title titles ร้อยกรอง ร้อยกรอง ปีที่ ปีที่ app. apps. art. arts. หนังสือ บทที่ สดมภ์ loc. locs. eq. eqs. รูปภาพ หน้า ฉบับที่ l. n. บทประพันธ์ น. น. ย่อหน้า ส่วนย่อย r. rr. sc. scs. หมวด ใต้คำ ใต้คำ supp. supps. tbl. tbls. tit. tits. ร้อยกรอง ร้อยกรอง ปี ปี ¶¶ § §§ chapter chapters citation citations ฉบับที่ ฉบับที่ พิมพ์ครั้งที่ พิมพ์ครั้งที่ บันทึก บันทึก number numbers หน้า หน้า volume volumes page pages printing printings version chap. chaps. cit. cits. ฉบับที่ พิมพ์ครั้งที่ n. no. nos. น. น. vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators director directors บรรณาธิการ บรรณาธิการ บรรณาธิการและผู้แปล บรรณาธิการและผู้แปล บรรณาธิการและผู้แปล บรรณาธิการและผู้แปล ผู้อำนวยการบทบรรณาธิการ ผู้อำนวยการบทบรรณาธิการ executive producer executive producers guest guests host hosts illustrator illustrators narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators ผู้แปล ผู้แปล comp. comps. contrib. contribs. cur. curs. dir. dirs. บ.ก. บ.ก. บ.ก. บ.ก. บ.ก. บ.ก. ผอ.บทบรรณาธิการ ผอ.บทบรรณาธิการ exec. prod. exec. prods. ill. ills. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. ผู้แปล ผู้แปล chaired by edited by compiled by โดย with curated by directed by เรียบเรียงโดย แปลและเรียบเรียงโดย แปลและเรียบเรียงโดย เรียบเรียงโดย executive produced by with guest hosted by illustrated by สัมภาษณ์โดย narrated by organized by performed by produced by ถึง by written by created by แปลโดย ed. by comp. by w. cur. by dir. โดย แปลและเรียบเรียงโดย แปลและเรียบเรียงโดย โดย exec. prod. by w. guest hosted by illus. narr. by org. by perf. by prod. by writ. by cre. by แปล มกราคม กุมภาพันธ์ มีนาคม เมษายน พฤษภาคม มิถุนายน กรกฎาคม สิงหาคม กันยายน ตุลาคม พฤศจิกายน ธันวาคม ม.ค. ก.พ. มี.ค. เม.ย. พ.ค. มิ.ย. ก.ค. ส.ค. ก.ย. ต.ค. พ.ย. ธ.ค. ฤดูใบไม้ผลิ ฤดูร้อน ฤดูใบไม้ร่วง ฤดูหนาว ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-tl-PH.xml0000644000175100017510000010022615234654007023022 0ustar00runnerrunner leen p This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-02-01T00:00:00+00:00 inakses noong advance online publication album at at iba pa anonymous sa audio recording available sa ni nina circa sinipi et al. pelikula forthcoming mula sa henceforth ibid. nasa in press internet liham loc. cit. walang petsa no place walang tagalimbag sa online op. cit. original work published personal communication podcast podcast episode preprint iprinisenta sa radio broadcast radyo serye episode ng radyo serye reference references retrieved review ng scale special issue special section television broadcast teleserye episode ng teleserye video working paper adv. online pub. anon. au. rec. avail. sa c. cit. flm. fr. let. w.p. n.p. w.l. orig. pub. pers. comm. podcast ep. radio bdcst. radio ser. radio ser. ep. ref. refs. rtvd. rev. of sc. spec. iss. spec. sec. TV bdcst. TV ser. TV ser. ep. vid. wkg. paper & @ preprint artikulo sa journal artikulo sa magasin artikulo sa pahayagan bill brodkast classical work archival collection dataset dokumento entry entry sa diksiyonaryo entry sa ensayklopidya event graphic pagdinig interbiyu kaso batas manuskrito mapa video recording musical score pamphlet conference paper patent performance peryodiko personal na komunikasyon post blog post regulation ulat review book review software audio recording talumpati standard tesis treaty webpage jour. art. mag. art. newspaper art. bdcst. class. wk. arch. coll. doc. dict. entry ency. entry gr. int. leg. case legis. MS MSS vid. rec. mus. score pam. conf. paper pat. prfm. pers. comm. reg. rep. rev. bk. rev. sftw. au. rec. std. thes. webpg. testimonyo ni review ng review ng librong test. of rev. of rev. of the bk. AD BC BCE CE : , ; th st nd rd th th th unang ikalawang ikatlong ikaapat na ikalimang ikaanim na ikapitong ikawalong ikasiyam na ikasampung yugto mga yugto apendiks mga apendiks artikulo mga artikulo tomo mga tomo canon canons kabanata mga kabanata kolum mga kolum location locations equation equations pigura mga pigura folio folios isyu mga isyu linya mga linya talâ mga talâ opus opera pahina mga pahina talata mga talata bahagi mga bahagi rule rules eksena mga eksena seksiyon mga seksiyon sub verbo sub verbis supplement supplements talahanayan pamagat mga pamagat berso mga berso tomo mga tomo app. apps. art. arts. bk. bks. can. cann. chap. chaps. col. cols. loc. locs. eq. eqq. pig. figs. fol. fols. blg. nos. l. ll. n. nn. op. opp. p. pp. para. paras. pt. pts. r. rr. sc. scs. sek. secs. s.v. s.vv. supp. supps. tbl. tbls. tit. titt. v. vv. vol. vols. c. cc. ¶¶ § §§ kabanata citation citations bilang mga bilang edisyon reference references bilang pahina tomo pahina limbag bersiyon chap. chaps. cit. cits. no. nos. ed. eds. ref. refs. no. nos. p. pp. vol. vols. p. pp. ptg. ptgs. v. tagapangulo mga tagapangulo editor mga editor tagatipon mga tagatipon kontributor mga kontributor curator mga curator direktor mga direktor editor mga editor editor at tagasalin mga editor at tagasalin editor at tagasalin mga editor at tagasalin editor mga editor ehekutibong prodyuser mga ehekutibong prodyuser panauhin mga panauhin tagapangasiwa mga tagapangasiwa illustrator mga illustrator tagapagsalaysay mga tagapagsalaysay organisador mga organisador performer mga performer prodyuser mga prodyuser manunulat mga manunulat series creator mga series creator tagasalin mga tagasalin ed. mga ed. comp. comps. contrib. contribs. cur. curs. dir. mga dir. pat. ed. at salin mga ed. at salin ed. at salin mga ed. at salin pat. exec. prod. exec. prods. ill. ills. narr. narrs. org. orgs. perf. perfs. prod. mga prod. wrtr. wrtrs. ser. creator ser. creators trans. chaired by inedit ni inedit nina compiled by composed by ni nina kasama si kasama sina curated by sa direksyon ni sa direksyon nina inedit ni inedit nina edit at salin ni edit at salin nina edit at salin ni edit at salin nina inedit ni inedit nina executive produced by kasama si kasama sina hosted by guhit ni guhit nina panayam ni panayam nina isinalaysay ni isinalaysay nina inorganisa ni inorganisa nina ni nina itinanghal ni itinanghal nina produced by para kay ni nina isinulat ni isinulat nina katha ni katha nina salin ni salin nina ed. ni ed. nina comp. by comp. by cur. by dir. ni dir. nina ed. ni ed. nina ed. at salin ni ed. at salin nina ed. at salin ni ed. at salin nina ed. ni ed. nina exec. prod. by ill. by narr. by org. by perf. by prod. by writ. by salin ni salin nina Enero Pebrero Marso Abril Mayo Hunyo Hulyo Agosto Setyembre Oktubre Nobyembre Disyembre Ene. Peb. Mar. Abr. May. Hun. Hul. Ago. Set. Okt. Nob. Dis. Tagsibol Tag-araw Taglagas Taglamig ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-tr-TR.xml0000644000175100017510000006160615234654007023056 0ustar00runnerrunner ekizyener Binici cengiza Muhammet Tarakçı muhammettarakci@gmail.com A. Harun Korkmaz korkmazaharun@gmail.com This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2025-10-16T03:24:00+00:00 erişim çevrimiçi erken görünüm albüm ve ve diğerleri anonim de ses kaydı erişim adresi tarafından yaklaşık a.yer vd. film gelecek gönderen bundan sonra a.g.e. içinde basımda internet mektup a.e. tarih yok yer yok yayıncı yok üzerinde çevrimiçi a.g.e. yayınlanan asıl eser kişisel iletişim podcast podcast bölümü önbasım program adı: radyo yayını radyo dizisi radyo dizi bölümü atıf atıflar geliş tarihi gözden geçirme ölçek özel sayı özel bölüm televizyon yayını televizyon dizisi televizyon dizisi bölümü video ön makale anonim yakl. t.y. y.y. y.y. atf. atf. g.g. önbasım dergi makalesi dergi makalesi gazete yazısı kanun taslağı yayın klasik koleksiyon veri kümesi belge girdi sözlük maddesi ansiklopedi maddesi etkinlik grafik duruşma mülakat dava mevzuat el yazması harita video kaydı müzik notaları broşür konferans bildirisi patent performans süreli kişisel iletişim gönderi blog gönderisi düzenleme rapor inceleme kitap incelemesi yazılım ses kaydı sunum standart tez antlaşma web sayfası dergi mak. derg. mak. gazete yzs. belg. graf. mülak. el yazm. video kyd. rap. inc. kit. inc. ses kyd. ifadesi incelemesi kitabın incelemesi M.S. M.Ö. BCE CE - : , ; . birinci ikinci üçüncü dördüncü beşinci altıncı yedinci sekizinci dokuzuncu onuncu perde perdeler ek ekler makale makaleler kitap kitaplar kitap kitaplar bölüm bölümler sütun sütunlar konum konumlar eşitlik eşitlikler şekil şekiller folyo folyo sayı sayılar satır satırlar not notlar eser eserler sayfa sayfalar paragraf paragraflar kısım kısımlar kural kurallar sahne sahneler bölüm bölümler madde maddeler zeyil zeyil masa masalar başlık başlıklar ayet ayetler cilt ciltler ek. eklr. mak. mak. kit. böl. süt. kon. kon. eşt. eşt. şek. fl. sy. satır n. eser s. ss. par. ksm. kur. kur. sahn. sahn. blm. md. md. supp. supps. mas. mas. başl. başl. ay. ay. c. c. par. par. kısım kısımlar bölüm numarası bölümler numarası atıf atıflar sayı sayı baskı baskılar atıf atıflar sayı sayılar sayfa sayısı sayfa sayıları cilt ciltler ilk sayfa ilk sayfa çıktı çıktılar versiyon böl. num. böl. num. cit. cits. sy bs. atf. atf. sy. sy. s. ss. cilt ciltler i.s. i.s. çıktı çıktılar başkan başkanlar editör editörler derleye derleyenler katkıda bulunan katkıda bulunanlar küratör küratörler direktör direktörler editör editörler editör & çeviren editörler & çevirenler editör & çeviren editörler & çevirenler sorumlu editör sorumlu editörler baş yapımcı baş yapımcılar misafir misafirler ev sahibi ev sahipleri çizen çizenler anlatıcı anlatıcılar düzenleyen düzenleyenler icra eden icra edenler yapımcı yapımcılar metin yazarı metin yazarları dizi yapımcısı dizi yapımcıları çeviren çevirenler comp. comps. contrib. contribs. cur. curs. dir. dir. ed. ed. ed. & çev. ed. & çev. ed. & çev. ed. & çev. sor.ed. sor.ed. exec. prod. exec. prods. çzm. çzm. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. çev. çev. chaired by edited by compiled by kitap editörü with curated by direktör editör düzenleyen & çeviren by düzenleyen & çeviren by sorumlu editör executive produced by with guest hosted by çizen röportaj yapan narrated by organized by performed by produced by alıcı tanıtım yazarı written by created by çeviren ed. by comp. by w. cur. by dir. ed. ed. & çev. ed. & çev. sor.ed. exec. prod. by w. guest hosted by çizen narr. by org. by perf. by prod. by writ. by cre. by çev. Ocak Şubat Mart Nisan Mayıs Haziran Temmuz Ağustos Eylül Ekim Kasım Aralık Oca. Şub. Mar. Nis. May. Haz. Tem. Ağu. Eyl. Eki. Kas. Ara. Bahar Yaz Sonbahar Kış ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-uk-UA.xml0000644000175100017510000006420015234654007023021 0ustar00runnerrunner Bohdana Ivahnenko ivahnenko.bohdana@knu.ua This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 дата звернення advance online publication album і та інші анонімний на audio recording доступний у відповідно до близько цит. за та ін. film майбутній із henceforth там само у у пресі інтернет лист loc. cit. без дати no place no publisher on URL op. cit. original work published особисте спілкування podcast podcast episode preprint представлений у radio broadcast radio series radio series episode список використаних джерел вилучено review of масштаб special issue special section television broadcast television series television series episode video working paper анон. бл. б. д. n.p. n.p. дж. rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing інтерв'ю legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical особисте спілкування post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book н. е. до н. е. BCE CE « » : , ; е ий а перше друге третє четверте п'яте шосте сьоме восьме дев'яте десяте перший другий третій четвертий п'ятий шостий сьомий восьмий дев'ятий десятий перша друга третя четверта п'ята шоста сьома восьма дев'ята десята act acts appendix appendices article articles книга книги canon canons розділ розділи графа графи location locations equation equations рисунок рисунки фоліант фоліанти випуск рядок рядки примітка примітки опус опуси С. С. абзац абзаци частина частини rule rules scene scenes параграф параграфи див. supplement supplements table tables title titles вірш вірші том томи app. apps. art. arts. кн. розд. гр. loc. locs. eq. eqs. рис. ф. вип. ряд. прим. оп. С. абз. ч. r. rr. sc. scs. пар. s.v. s.vv. supp. supps. tbl. tbls. tit. tits. в. т. ¶¶ § §§ chapter chapters citation citations випуск видання примітка примітки number numbers с. с. volume volumes page pages printing printings версія chap. chaps. cit. cits. вип. вид. прим. no. nos. с. vol. vols. p. pp. print. prints. вер. chair chairs ed. eds. compiler compilers contributor contributors curator curators режисер режисери редактор редактори редактор і перекладач редактор і перекладач відповідальний редактор відповідальні редактори executive producer executive producers guest guests host hosts ілюстратор ілюстратори narrator narrators organizer organizers performer performers producer producers writer writers series creator series creators перекладач перекладачі comp. comps. contrib. contribs. cur. curs. реж. ред. за ред. і пер. за ред. і пер. відповідальний редактор exec. prod. exec. prods. іл. narr. narrs. org. orgs. perf. perfs. prod. prods. writ. writs. cre. cres. пер. chaired by edited by compiled by написано with curated by зрежисовано за редакцією відредаговано й перекладено відредаговано й перекладено за загальною редакцією executive produced by with guest hosted by ілюстровано інтерв'ю narrated by organized by performed by produced by для рецензія від written by created by перекладено ed. by comp. by w. cur. by реж. зе ред. ed. & trans. by ed. & trans. by за заг. ред. exec. prod. by w. guest hosted by іл. narr. by org. by perf. by prod. by writ. by cre. by пер. січень лютий березень квітень травень червень липень серпень вересень жовтень листопад грудень січ. лют. берез. квіт. трав. чер. лип. серп. верес. жовт. листоп. груд. весна літо осінь зима ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-vi-VN.xml0000644000175100017510000006370315234654007023045 0ustar00runnerrunner dowens76 Hung Quoc Vo Tran Quang Cuong This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2025-10-16T03:24:00+00:00 truy cập tiền bản trực tuyến album và những người khác khuyết danh tại bản ghi âm có tại bởi khoảng được trích dẫn và c.s. phim sắp tới từ kể từ đây n.t. trong in press internet thư n.t. không ngày không rõ địa điểm không rõ nhà xuất bản vào online đ.d. nguyên bản giao tiếp cá nhân podcast tập podcast preprint được trình bày tại phát thanh xê-ri phát thanh tập của xê-ri phát thanh tài liệu tham khảo tài liệu tham khảo truy vấn bài đánh giá về scale số đặc biệt mục đặc biệt truyền hình xê-ri truyền hình tập của xê-ri truyền hình video bản thảo nghiên cứu k.d k. không ngày k.r.đ.đ. k.r.n.x.b. t.l.t.k. t.l.t.k. b.đ.g. về preprint bài báo khoa học bài báo tạp chí bài báo báo chí dự luật phát sóng tác phẩm kinh điển tuyển tập tập dữ liệu tài liệu mục mục từ điển mục bách khoa sự kiện hình ảnh phiên điều trần phỏng vấn vụ án pháp lý văn bản pháp luật bản thảo bản đồ phim điện ảnh bản nhạc tờ rơi or sách mỏng báo cáo hội nghị bằng sáng chế buổi biểu diễn định kỳ or tạp chí định kỳ giao tiếp cá nhân bài đăng bài đăng blog quy định báo cáo đánh giá đánh giá sách phần mềm bản ghi âm bài trình chiếu chuẩn luận văn hiệp ước trang web b.b. k.h. báo tc. báo doc. graph. interv. MS phim rep. rev. đ.g. s. b.h. lời khai của bài đánh giá về đánh giá sách SCN TCN TCN SCN : , ; thứ nhất thứ hai thứ ba thứ tư thứ năm thứ sáu thứ bảy thứ tám thứ chín thứ mười act acts appendix appendices article articles sách sách canon canons chương chương cột cột location locations equation equations figure figures folio folios số số dòng dòng ghi chú ghi chú opus opera trang trang đoạn đoạn phần phần rule rules scene scenes mục mục sub verbo sub verbis phụ lục phụ lục table tables title titles câu câu tập tập p.l. p.l. art. arts. sách ch. cột loc. locs. eq. eqs. hình f số d. g.c. op tr tr đ. r. rr. sc. scs. m. s.v. s.vv. p.l. p.l. tbl. tbls. tit. tits. v vv tập tập ¶¶ § §§ chương chương tài liệu tài liệu số số ấn bản ấn bản tài liệu tài liệu số số trang trang tập tập trang trang printing printings phiên bản ch. ch. tl. tl. số p.h a.b t.l. t.l. số số tr tr t. t. tr. tr. print. prints. chủ tọa chủ tọa b.t. b.t. người tổng hợp người tổng hợp cộng tác viên cộng tác viên người giám tuyển người giám tuyển chủ biênr chủ biên biên tập viên biên tập viên biên tập viên & biên dịch viên biên tập viên & biên dịch viên biên tập viên & biên dịch viên biên tập viên & biên dịch viên tổng biên tập tổng biên tập sản xuất - điều hành esản xuất - điều hành khách khách người dẫn người dẫn họa sĩ họa sĩ tường thuật viên tường thuật viên người tổ chức người tổ chức nghệ sĩ nghệ sĩ nhà sản xuất nhà sản xuất người biên soạn người biên soạn người biên soạn xê-ri người biên soạn xê-ri biên dịch viên biên dịch viên n.t.h. n.t.h. c.t.v. c.t.v. g.t.v. g.t.v. đ.d. đ.d. b.t.v. b.t.v. b.t.v. & b.d.v. b.t.v. & b.d.v. b.t.v. & b.d.v. b.t.v. & b.d.v. b.t.v. b.t.v. s.x.&đ.h. s.x.&đ.h. h.s. h.s. t.t.v. t.t.v. n.t.c. n.t.c. n.s. n.s. n.s.x. n.s.x. n.b.s. n.b.s. n.b.s. xê-ri n.b.s. xê-ri b.d.v. b.d.v. chủ trì bởi biên tập tổng hợp bởi bởi với giám tuyển bởi đạo diễn bởi biên tập bởi biên tập & biên dịch bởi biên tập & biên dịch bởi biên tập bởi sản xuất-điều hành bởi với khách mời dẫn bởi minh họa bởi phỏng vấn bởi thuật lại bởi tổ chức bởi biểu diễn bởi sản xuất bởi đến bởi viết bởi viết bởi biên dịch bởi b.t. bởi t.h. bởi với g.t. bởi đ.d. b.t. b.t. & b.d. bởi b.t. & b.d. bởi b.t. s.x.; đ.h. bởi với khách mời dẫn bởi h.s. thuật lại bởi tổ chức bởi biểu diễn bởi s.x. bởi viết bởi viết bởi b.d. Tháng Giêng Tháng Hai Tháng Ba Tháng Tư Tháng Năm Tháng Sáu Tháng Bảy Tháng Tám Tháng Chín Tháng Mười Tháng Mười Một Tháng Mười Hai thg. 1 thg. 2 thg. 3 thg. 4 thg. 5 thg. 6 thg. 7 thg. 8 thg. 9 thg. 10 thg. 11 thg. 12 Mùa Xuân Mùa Hè Mùa Thu Mùa Đông ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-zh-CN.xml0000644000175100017510000004432115234654007023020 0ustar00runnerrunner rongls sati-bodhi Heromyth Zeping Lee 韩小土 韩敏义 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2025-10-16T11:24:00+08:00 见于 网络首发 专辑 及其他 作者不详 录音 载于 介于 见引于 电影 即将出版 从此以后 同上 收入 送印中 网际网络 信函 同前注 日期不详 出版地不详 出版者不详 在线 同前注 原著出版于 的私人交流 播客 播客集 预印本 发表于 电台广播 广播剧 广播剧集 参考 取读于 评论 比例 特刊 特稿 电视广播 电视剧 电视剧集 视频 工作论文 无名氏 不详 出版地不详 出版者不详 预印本 期刊文章 杂志文章 报纸文章 法案 广播 古籍 馆藏 数据集 文档 词条 字典词条 百科词条 活动 视觉作品 听证会 访谈 司法案例 法律 手稿 地图 录像 乐谱 小册子 会议论文 专利 演出 期刊 的私人交流 帖子 博客帖子 法规 报告 评论 书评 软件 录音 演讲 标准 学位论文 条约 网页 期刊文章 杂志文章 报纸文章 文档 视觉作品 采访 手稿 录像 报告 评论 书评 录音 听证会 评论 书评 公元 公元前 公元前 公元 附录 准则 位置 公式 图表 注脚 作品 段落 部分 规则 另见 补充 表格 附录 位置 op. 规则 另见 补充 ¶¶ § §§ 引用 版本 前注 编号 总页数 编号 引用 前注 no. nos. 编号 主席 总编辑 编撰 贡献者 策展人 导演 编辑 编译 编译 主编 监制 嘉宾 主持 绘图 朗读者 组织者 表演 制片人 编剧 创作 翻译 贡献 策展 导演 编译 编译 主编 监制 朗读 组织 表演 制片人 编剧 创作 主席 总编辑 编撰 贡献 策展 指导 编辑 编译 编译 主编 监制 嘉宾 主持 绘图 采访 朗读 组织 表演 制片 受函 校订 编剧 创作 翻译 总编 贡献 策展 编译 编译 主编 监制 嘉宾 主持 朗读 组织 表演 制片 编剧 创作 一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales-zh-TW.xml0000644000175100017510000005340115234654007023051 0ustar00runnerrunner sati-bodhi This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License 2026-01-10T00:00:00+00:00 引見於 advance online publication album 及其他 作者不詳 audio recording 載於 介於 見引於 film 即將出版 henceforth 同上 收入 印行中 互聯網 信函 loc. cit. 日期不詳 no place no publisher on 線上 op. cit. original work published 私人通訊 podcast podcast episode preprint 發表於 radio broadcast radio series radio series episode 參考 讀取於 review of 比例 special issue special section television broadcast television series television series episode video working paper 無名氏 不詳 n.p. n.p. rev. of preprint journal article magazine article newspaper article bill broadcast classic collection dataset document entry dictionary entry encyclopedia entry event graphic hearing 訪談 legal case legislation manuscript map video recording musical score pamphlet conference paper patent performance periodical 私人通訊 post blog post regulation report review book review software audio recording presentation standard thesis treaty webpage journal art. mag. art. newspaper art. doc. graph. interv. MS video rec. rep. rev. bk. rev. audio rec. testimony of review of review of the book 西元 西元前 BCE CE : , ; act acts appendix appendices article articles canon canons location locations equation equations 圖表 註腳 作品 段落 部分 rule rules scene scenes 另見 supplement supplements table tables title titles app. apps. art. arts. loc. locs. eq. eqs. op. r. rr. sc. scs. 另見 supp. supps. tbl. tbls. tit. tits. ¶¶ § §§ chapter chapters citation citations 版本 註腳 number numbers 總頁數 volume volumes page pages printing printings chap. chaps. cit. cits. no. nos. vol. vols. p. pp. print. prints. chair chairs ed. eds. compiler compilers contributor contributors curator curators 導演 編輯 編譯員 編譯員 主編 executive producer executive producers guest guests host hosts 繪圖師 採訪員 narrator narrators organizer organizers performer performers producer producers 收信人 評論人 writer writers series creator series creators 翻譯員 comp. comps. contrib. contribs. cur. curs. 導演 編輯 編譯員 編譯員 主編 exec. prod. exec. prods. 繪圖師 採訪員 narr. narrs. org. orgs. perf. perfs. prod. prods. 收信人 評論人 writ. writs. cre. cres. 翻譯員 chaired by 點校 compiled by with curated by 指導 編輯 編譯 編譯 主編 executive produced by with guest hosted by 繪圖 採訪 narrated by organized by performed by produced by 受函 點評 written by created by 翻譯 comp. by w. cur. by ed. & trans. by ed. & trans. by exec. prod. by w. guest hosted by narr. by org. by perf. by prod. by writ. by cre. by 一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/locales.json0000644000175100017510000001501215234654007022247 0ustar00runnerrunner{ "primary-dialects": { "af": "af-ZA", "ar": "ar", "bal": "bal-PK", "bg": "bg-BG", "brh": "brh-PK", "ca": "ca-AD", "cs": "cs-CZ", "cy": "cy-GB", "da": "da-DK", "de": "de-DE", "el": "el-GR", "en": "en-US", "es": "es-ES", "et": "et-EE", "eu": "eu", "fa": "fa-IR", "fi": "fi-FI", "fr": "fr-FR", "gl": "gl-ES", "he": "he-IL", "hi": "hi-IN", "hr": "hr-HR", "hu": "hu-HU", "hy": "hy-AM", "id": "id-ID", "is": "is-IS", "it": "it-IT", "ja": "ja-JP", "km": "km-KH", "ko": "ko-KR", "la": "la", "lij": "lij-IT", "lt": "lt-LT", "lv": "lv-LV", "mn": "mn-MN", "ms": "ms-MY", "nb": "nb-NO", "nl": "nl-NL", "nn": "nn-NO", "pa": "pa-PK", "pl": "pl-PL", "pt": "pt-PT", "ro": "ro-RO", "ru": "ru-RU", "sk": "sk-SK", "sl": "sl-SI", "sr": "sr-Latn-RS", "sv": "sv-SE", "th": "th-TH", "tl": "tl-PH", "tr": "tr-TR", "uk": "uk-UA", "vi": "vi-VN", "zh": "zh-CN" }, "language-names": { "af-ZA": [ "Afrikaans", "Afrikaans" ], "ar": [ "العربية", "Arabic" ], "bal-PK": [ "بلوچی (پاکستان)", "Balochi (Pakistan)" ], "bg-BG": [ "Български", "Bulgarian" ], "brh-PK": [ "براہوئی", "Brahui" ], "ca-AD": [ "Català", "Catalan" ], "cs-CZ": [ "Čeština", "Czech" ], "cy-GB": [ "Cymraeg", "Welsh" ], "da-DK": [ "Dansk", "Danish" ], "de-AT": [ "Deutsch (Österreich)", "German (Austria)" ], "de-CH": [ "Deutsch (Schweiz)", "German (Switzerland)" ], "de-DE": [ "Deutsch (Deutschland)", "German (Germany)" ], "el-GR": [ "Ελληνικά", "Greek" ], "en-GB": [ "English (UK)", "English (UK)" ], "en-US": [ "English (US)", "English (US)" ], "es-CL": [ "Español (Chile)", "Spanish (Chile)" ], "es-ES": [ "Español (España)", "Spanish (Spain)" ], "es-MX": [ "Español (México)", "Spanish (Mexico)" ], "et-EE": [ "Eesti keel", "Estonian" ], "eu": [ "Euskara", "Basque" ], "fa-IR": [ "فارسی", "Persian" ], "fi-FI": [ "Suomi", "Finnish" ], "fr-CA": [ "Français (Canada)", "French (Canada)" ], "fr-FR": [ "Français (France)", "French (France)" ], "gl-ES": [ "Galego (Spain)", "Galician (Spain)" ], "he-IL": [ "עברית", "Hebrew" ], "hi-IN": [ "हिंदी", "Hindi" ], "hr-HR": [ "Hrvatski", "Croatian" ], "hu-HU": [ "Magyar", "Hungarian" ], "hy-AM": [ "Հայերեն", "Armenian" ], "id-ID": [ "Bahasa Indonesia", "Indonesian" ], "is-IS": [ "Íslenska", "Icelandic" ], "it-IT": [ "Italiano", "Italian" ], "ja-JP": [ "日本語", "Japanese" ], "km-KH": [ "ភាសាខ្មែរ", "Khmer" ], "ko-KR": [ "한국어", "Korean" ], "la": [ "Latina", "Latin" ], "lij-IT": [ "Lìgure", "Ligurian" ], "lt-LT": [ "Lietuvių kalba", "Lithuanian" ], "lv-LV": [ "Latviešu", "Latvian" ], "mn-MN": [ "Монгол", "Mongolian" ], "ms-MY": [ "Bahasa Melayu", "Malay" ], "nb-NO": [ "Norsk bokmål", "Norwegian (Bokmål)" ], "nl-NL": [ "Nederlands", "Dutch" ], "nn-NO": [ "Norsk nynorsk", "Norwegian (Nynorsk)" ], "pa-PK": [ "پنجابی (شاہ‌مکھی)", "Punjabi (Shahmukhi)" ], "pl-PL": [ "Polski", "Polish" ], "pt-BR": [ "Português (Brasil)", "Portuguese (Brazil)" ], "pt-PT": [ "Português (Portugal)", "Portuguese (Portugal)" ], "ro-RO": [ "Română", "Romanian" ], "ru-RU": [ "Русский", "Russian" ], "sk-SK": [ "Slovenčina", "Slovak" ], "sl-SI": [ "Slovenščina", "Slovenian" ], "sr-Cyrl-RS": [ "Српски", "Serbian (Cyrllic)" ], "sr-Latn-RS": [ "Srpski", "Serbian (Latin)" ], "sv-SE": [ "Svenska", "Swedish" ], "th-TH": [ "ไทย", "Thai" ], "tl-PH": [ "Tagalog", "Tagalog" ], "tr-TR": [ "Türkçe", "Turkish" ], "uk-UA": [ "Українська", "Ukrainian" ], "vi-VN": [ "Tiếng Việt", "Vietnamese" ], "zh-CN": [ "中文 (中国大陆)", "Chinese (PRC)" ], "zh-TW": [ "中文 (台灣)", "Chinese (Taiwan)" ] } } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1785944092.7021158 citeproc_py-0.10.4/citeproc/data/locales/util/0000755000175100017510000000000015234654035020711 5ustar00runnerrunner././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/util/add-locale-terms.py0000644000175100017510000000772115234654007024406 0ustar00runnerrunner# MIT license # Copy new terms of `locales-en-US.xml` to other locals. # Step 1: Add new terms in `locales-en-US.xml`. Make sure the "short", "verb", # "verb-short" forms of each new term are also included. # Step 2: Run `python3 add-locale-terms.py` import glob import os import re from lxml import etree LOCALES_DIR = '.' NSMAP = {'cs': 'http://purl.org/net/xbiblio/csl'} def get_term_id(term) -> str: # e.g., `editor|short` term_id = term.attrib['name'] if 'form' in term.attrib: term_id += '|' + term.attrib['form'] # ignore "gender" and "gender-form" return term_id def add_new_terms_to_locale(path, element_tree, new_terms, english_term_ids, english_term_dict, locale_terms_el, locale_term_ids, locale_term_list): for term_id in new_terms: common_terms = [ tid for tid in english_term_ids if tid in locale_term_ids ] previous_terms = english_term_ids[:english_term_ids.index(term_id)] previous_common_term = [ tid for tid in previous_terms if tid in common_terms ][-1] insert_index = locale_terms_el.index( locale_term_list[locale_term_ids.index(previous_common_term)]) locale_terms_el.insert(insert_index, english_term_dict[term_id]) et_str = etree.tostring(element_tree, pretty_print=True, xml_declaration=True, encoding='utf-8').decode('utf-8') # https://github.com/citation-style-language/utilities/blob/master/csl-reindenting-and-info-reordering.py et_str = et_str.replace("'", '"', 4) # replace quotes on XML declaration et_str = et_str.replace(' ', ' ') # no-break space # et_str = et_str.replace('ᵉ', 'ᵉ') et_str = et_str.replace(' ', ' ') # em space et_str = et_str.replace(' ', ' ') # thin space et_str = et_str.replace('‑', '‑') # non-breaking hyphen # # et_str = et_str.replace('–', "–") # en dash # et_str = et_str.replace('—', '—') # em dash et_str = et_str.replace(' ', ' ') # narrow no-break space et_str = re.sub(r'', r'', et_str) et_str = et_str.replace('', '') et_str = et_str.replace('', '') with open(path, 'w') as f: f.write(et_str.strip()) f.write('\n') def main(): english_locale = 'locales-en-US.xml' english_path = os.path.join(LOCALES_DIR, english_locale) english_term_dict = dict() english_term_ids = [] for term in etree.parse(english_path).findall('.//cs:term', NSMAP): term_id = get_term_id(term) english_term_ids.append(term_id) english_term_dict[term_id] = term for path in sorted(glob.glob(os.path.join(LOCALES_DIR, 'locales-*.xml'))): locale_file = os.path.split(path)[1] if locale_file == english_locale: continue element_tree = etree.parse(path) locale_terms_el = element_tree.find('.//cs:terms', NSMAP) locale_term_ids = [] locale_term_list = [] for term in locale_terms_el.findall('.//cs:term', NSMAP): term_id = get_term_id(term) locale_term_ids.append(term_id) locale_term_list.append(term) new_terms = [ term_id for term_id in english_term_ids if term_id not in locale_term_ids and 'ordinal-' not in term_id ] new_terms = [ term_id for term_id in new_terms if term_id.split('|')[0] in new_terms ] if new_terms: add_new_terms_to_locale(path, element_tree, new_terms, english_term_ids, english_term_dict, locale_terms_el, locale_term_ids, locale_term_list) if __name__ == '__main__': main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/locales/util/sort_terms.py0000644000175100017510000003032115234654007023462 0ustar00runnerrunner# /// script # requires-python = ">=3.10" # dependencies = [ # "lxml<7", # ] # /// """sort_terms.py Utility for sorting and normalizing CSL locale XML files. This script parses CSL locale files (XML) and sorts elements according to the canonical ordering derived from `locales-en-US.xml`, and rewrites the files preserving comments and structure. It also provides helpers to parse the terms into a dictionary (`get_terms_dict`) to ensure the script is semantics-preserving: running the sorter and then reparsing the file should produce the same terms dictionary. Typical usage (from the repository root): python util/sort_terms.py [-a] [locales-xx-YY.xml ...] """ import argparse import re from copy import deepcopy from dataclasses import dataclass from datetime import datetime, timezone from pathlib import Path from typing import Any from lxml import etree CSL_NAMESPACE = {"cs": "http://purl.org/net/xbiblio/csl"} GENDER_FORM_ORDER: dict[str, int] = {"": 0, "masculine": 1, "feminine": 2} @dataclass class Section: term_names: set[str] form: str def is_section_title(node) -> bool: if not isinstance(node, etree._Comment): return False previous = node.getprevious() if previous is not None and "\n" not in (previous.tail or ""): return False text = node.text if isinstance(node.text, str) else "" return text.isupper() def get_en_us_sections() -> dict[str, Section]: tree = etree.parse("locales-en-US.xml") terms = tree.getroot().find(".//cs:terms", namespaces=CSL_NAMESPACE) assert terms is not None sections: dict[str, Section] = {} category: str = "" section: str = "" term_names: set[str] = set() term_forms: set[str] = set() for node in terms: if is_section_title(node): title = str(node.text).strip() if section: assert term_names assert len(term_forms) == 1 form = term_forms.pop() if form == "": # section of long forms sections[section] = Section(term_names=set(term_names), form=form) term_names = set() term_forms = set() category = section else: sections[section] = Section( term_names=set(sections[category].term_names).union(term_names), form=form, ) section = title elif isinstance(node.tag, str): name: str = node.attrib.get("name", "") assert name form: str = node.attrib.get("form", "") term_names.add(name) term_forms.add(form) if section: assert term_names assert len(term_forms) == 1 form = term_forms.pop() if form == "": sections[section] = Section(term_names=set(term_names), form=form) else: sections[section] = Section( term_names=set(sections[category].term_names), form=form ) return sections def sort_locale_terms(path: Path, sections: dict[str, Section]) -> None: print(str(path)) original_text = path.read_text(encoding="utf-8") tree = etree.parse(str(path)) terms = tree.getroot().find(".//cs:terms", namespaces=CSL_NAMESPACE) assert terms is not None grouped_terms = group_by_section(sections, terms) new_terms = flatten(grouped_terms) terms[:] = new_terms text = etree.tostring(tree, encoding="utf-8", xml_declaration=True).decode("utf-8") text = re.sub(r"[ \t]+\n", "\n", text) + "\n" text = text.replace("'", '"', 4) text = text.replace(" ", " ") text = text.replace("‑", "‑") text = text.replace("—", "—") if text != original_text: now = datetime.now().astimezone(timezone.utc).isoformat(timespec="seconds") text = re.sub(r".*?", f"{now}", text) path.write_text(text, encoding="utf-8") @dataclass class TermContent: name: str sort_key: tuple[int, str, str] elements: list[etree._Element] # May include comments following the term def group_by_section( sections: dict[str, Section], terms: etree._Element ) -> dict[str, list[TermContent]]: grouped_terms: dict[str, list[TermContent]] = {section: [] for section in sections} term_content: TermContent | None = None other_terms: list[TermContent] = [] tmp_comments: list[etree._Comment] = [] # Comments before any term gender_form_order = GENDER_FORM_ORDER.copy() for term in terms.iterchildren(tag=etree.Element): gender_form = term.attrib.get("gender-form") if gender_form: if gender_form == "feminine": gender_form_order["masculine"] = 2 gender_form_order["feminine"] = 1 break for node in terms: if isinstance(node, etree._Comment): text = node.text.strip() if isinstance(node.text, str) else "" if text in sections or is_section_title(node): term_content = None continue tail = "" previous = node.getprevious() if previous is not None: tail = previous.tail or "" if "\n" not in tail and term_content: term_content.elements.append(deepcopy(node)) else: tmp_comments.append(deepcopy(node)) elif isinstance(node.tag, str): term = node name: str = term.attrib.get("name", "") assert name form = term.attrib.get("form", "") gender_form = term.attrib.get("gender-form", "") for section_name, section in sections.items(): if (name in section.term_names and form == section.form) or ( (name == "ordinal" or name.startswith("ordinal-")) and section_name == "ORDINALS" ): new_term = deepcopy(term) # new_term.tail = "\n " term_content = TermContent( name=name, sort_key=( gender_form_order.get(gender_form, 0), "editor-translator" if name == "editortranslator" else name, name, ), elements=[*tmp_comments, new_term], ) tmp_comments = [] grouped_terms[section_name].append(term_content) break else: term_content = TermContent( name=name, sort_key=(0, name, ""), elements=[deepcopy(term)] ) other_terms.append(term_content) if other_terms: grouped_terms["REMAINDERS"] = other_terms return grouped_terms def flatten(grouped_terms: dict[str, list[TermContent]]) -> list[etree._Element]: new_terms: list[etree._Element] = [] for section_name, section_terms in grouped_terms.items(): # print(section_name) if new_terms: new_terms[-1].tail = "\n\n " section_title = etree.Comment(f" {section_name} ") section_title.tail = "\n " new_terms.append(section_title) if section_name not in {"PUNCTUATION", "REMAINDERS"}: section_terms = sorted(section_terms, key=lambda x: x.sort_key) for term_content in section_terms: new_terms.extend(term_content.elements) new_terms[-1].tail = "\n " if new_terms: new_terms[-1].tail = "\n " return new_terms # The parsed form is based on `src/util_locale.js` of `Juris-M/citeproc-js`. # def get_terms_dict(path: Path) -> dict[str, Any]: tree = etree.parse(str(path)) terms = tree.getroot().find(".//cs:terms", namespaces=CSL_NAMESPACE) assert terms is not None term_dict = { "terms": {}, "ord": {}, "noun-genders": {}, } term_dict["ord"]["1.0.1"] = None term_dict["ord"]["keys"] = {} ordinals_101 = {"last-digit": {}, "last-two-digits": {}, "whole-number": {}} ordinals101_toggle = False genderized_terms: dict[str, bool] = {} for term in terms.iterchildren(tag=etree.Element): name = term.attrib.get("name", "") if name == "issue": pass assert name if name == "sub verbo": name = "sub-verbo" if name == "ordinal" or name.startswith("ordinal-"): if name == "ordinal": ordinals101_toggle = True else: match = term.attrib.get("match", "") term_stub = name[8:] gender_form = term.attrib.get("gender-form", "neuter") if not match: match = "last-two-digits" if term_stub[:1] == "0": match = "last-digit" if term_stub[:1] == "0": term_stub = term_stub[1:] if term_stub not in ordinals_101[match]: ordinals_101[match][term_stub] = {} ordinals_101[match][term_stub][gender_form] = name term_dict["ord"]["keys"][name] = True if name not in term_dict["terms"]: term_dict["terms"][name] = {} form = term.attrib.get("form", "long") gender_form = term.attrib.get("gender-form", "") gender = term.attrib.get("gender", "") if gender: term_dict["noun-genders"][name] = gender if gender_form: term_dict["terms"][name][gender_form] = {} term_dict["terms"][name][gender_form][form] = [] target = term_dict["terms"][name][gender_form] genderized_terms[name] = True else: term_dict["terms"][name][form] = [] target = term_dict["terms"][name] multiple = term.find("cs:multiple", namespaces=CSL_NAMESPACE) if multiple is not None: single = term.find("cs:single", namespaces=CSL_NAMESPACE) assert single is not None target[form].append(single.text or "") target[form].append(multiple.text or "") else: target[form] = term.text or "" if ordinals101_toggle: for ikey in genderized_terms: gender_segments = {} form_segments = 0 for jkey in term_dict["terms"][ikey]: if jkey in {"masculine", "feminine"}: gender_segments[jkey] = term_dict["terms"][ikey][jkey] else: form_segments += 1 if not form_segments: if "feminine" in gender_segments: for jkey in gender_segments["feminine"]: term_dict["terms"][ikey][jkey] = gender_segments["feminine"][ jkey ] elif "masculine" in gender_segments: for jkey in gender_segments["masculine"]: term_dict["terms"][ikey][jkey] = gender_segments["masculine"][ jkey ] term_dict["ord"]["1.0.1"] = ordinals_101 return term_dict def main(): parser = argparse.ArgumentParser() parser.add_argument("-a", "--all", action="store_true") parser.add_argument("files", nargs="*") args = parser.parse_args() paths = [Path(path) for path in args.files] if args.all or not paths: paths = sorted(Path().glob("locales-*.xml")) sections = get_en_us_sections() for path in paths: original_terms_dict = get_terms_dict(path) # pprint(original_terms_dict) sort_locale_terms(path, sections) terms_dict = get_terms_dict(path) # Path("original-terms-dict.json").write_text( # json.dumps( # original_terms_dict, ensure_ascii=False, indent="\t", sort_keys=True # ) # ) # Path("terms-dict.json").write_text( # json.dumps(terms_dict, ensure_ascii=False, indent="\t", sort_keys=True) # ) assert terms_dict == original_terms_dict if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1785944092.7026238 citeproc_py-0.10.4/citeproc/data/schema/0000755000175100017510000000000015234654035017552 5ustar00runnerrunner././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1785944092.702773 citeproc_py-0.10.4/citeproc/data/schema/.github/0000755000175100017510000000000015234654035021112 5ustar00runnerrunner././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1785944092.7029252 citeproc_py-0.10.4/citeproc/data/schema/.github/ISSUE_TEMPLATE/0000755000175100017510000000000015234654035023275 5ustar00runnerrunner././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/schema/.github/ISSUE_TEMPLATE/feature_request.md0000644000175100017510000000152215234654007027021 0ustar00runnerrunner--- name: Feature request about: Suggest an idea for this project title: '' labels: enhancement assignees: '' --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context about the feature request here. *For changes to the CSL RNC schemas, this should include links to citation style guides.* It's better to include links to more than one style guide, and no more than five, for us to assess how widely needed this feature might be. - [MSRI style guide](https://www.mdpi.com/authors/references) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/schema/.github/PULL_REQUEST_TEMPLATE.md0000644000175100017510000000207415234654007024715 0ustar00runnerrunner## Description Please include a concise summary of the change and which issue it fixes. Please also include relevant motivation and context, on a separate line. Fixes # (issue) ## Type of change Please delete options that are not relevant. - [X] Bug fix (non-breaking change which fixes an issue) - [X] Variable addition (adds a new variable or type string) - [X] New feature (non-breaking change which adds functionality) - [X] Breaking change (fix or feature that would cause existing functionality to not work as expected) - [X] This change requires a documentation update ## Checklist - [X] I have installed the repo [pre-commit hook](https://github.com/citation-style-language/schema/blob/master/CONTRIBUTING.md#pre-commit-hooks); if not, and I have modified any of the schema files, I have run trang and/or prettier on the files, per [CONTRIBUTING](https://github.com/citation-style-language/schema/blob/master/CONTRIBUTING.md) - [X] I have performed a self-review of my own code - [X] I have included suggested corresponding changes to the documentation (if relevant) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/schema/CHANGELOG.md0000644000175100017510000002130315234654007021361 0ustar00runnerrunner# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). ## [Unreleased](https://github.com/citation-style-language/schema/compare/v1.0.1...HEAD) ### Merged - Restructure repo, update JSON schema ids [`#212`](https://github.com/citation-style-language/schema/pull/212) - Simplify and add structure to csl.rnc formatting [`#210`](https://github.com/citation-style-language/schema/pull/210) - Add terms for "no-place" and "no-name" [`#206`](https://github.com/citation-style-language/schema/pull/206) - Add "document" type [`#207`](https://github.com/citation-style-language/schema/pull/207) - Add new item types; classic, hearing, etc [`#194`](https://github.com/citation-style-language/schema/pull/194) - Add additional locator variables [`#201`](https://github.com/citation-style-language/schema/pull/201) - remove redundant java setup [`#199`](https://github.com/citation-style-language/schema/pull/199) - CI: RNC schema validation via Java trang [`#198`](https://github.com/citation-style-language/schema/pull/198) - update to iso-schematron, adding macro dup check [`#192`](https://github.com/citation-style-language/schema/pull/192) - Reformat readme for improved aesthetics [`#191`](https://github.com/citation-style-language/schema/pull/191) - Travis CI: basic Python test suite [`#156`](https://github.com/citation-style-language/schema/pull/156) - Remove duplicate literal types [`#155`](https://github.com/citation-style-language/schema/pull/155) - Fix references [`#149`](https://github.com/citation-style-language/schema/pull/149) - Switch licensing over to MIT license [`#143`](https://github.com/citation-style-language/schema/pull/143) - Specify draft via $schema in JSON schema [`#153`](https://github.com/citation-style-language/schema/pull/153) - Move csl-citation.txt content into the README, re-organize a little [`#117`](https://github.com/citation-style-language/schema/pull/117) ### Fixed - Restructure repo, update JSON schema ids (#212) [`#216`](https://github.com/citation-style-language/schema/issues/216) - Simplify and add structure to csl.rnc formatting (#210) [`#209`](https://github.com/citation-style-language/schema/issues/209) - Add terms for "no-place" and "no-name" (#206) [`#138`](https://github.com/citation-style-language/schema/issues/138) - Add "document" type (#207) [`#40`](https://github.com/citation-style-language/csl-evolution/issues/40) - Add additional locator variables (#201) [`#166`](https://github.com/citation-style-language/schema/issues/166) - Update CSL JSON schemas to draft-07 [`#127`](https://github.com/citation-style-language/schema/issues/127) - adding "standard" itemtype [`#176`](https://github.com/citation-style-language/schema/issues/176) - adding "software" itemtype [`#177`](https://github.com/citation-style-language/schema/issues/177) - adding "volume-title" variable [`#180`](https://github.com/citation-style-language/schema/issues/180) - adding "license" variable [`#181`](https://github.com/citation-style-language/schema/issues/181) - adding "language" variable [`#55`](https://github.com/citation-style-language/schema/issues/55) ### Commits - move date-variable to definitions [`fbe6a12`](https://github.com/citation-style-language/schema/commit/fbe6a12ad44df880838ac6f5fa2cd40f214d27d6) - Freshen up README.md a bit [`4846e02`](https://github.com/citation-style-language/schema/commit/4846e02f0a775a8272819204379a4f8d7f45c16c) - name-variable definition [`ec3d575`](https://github.com/citation-style-language/schema/commit/ec3d575704aeb157c0b2e6118af49f1b3f2c3967) - Be more picky about repository dependents, too [`262af55`](https://github.com/citation-style-language/schema/commit/262af55030bd3f5b389d1b327b2e725d83da34c8) - Be more demanding of independents styles (cs:link, cs:category) [`4f26fc2`](https://github.com/citation-style-language/schema/commit/4f26fc2912d4dc0b842706f979dc30b84c6c7191) - Start of extended CSL schema for styles repository [`1730a30`](https://github.com/citation-style-language/schema/commit/1730a3085564a15ba9271c5286eac2823b7bdc8d) - Add content to CHANGELOG [`227ae3b`](https://github.com/citation-style-language/schema/commit/227ae3b28ba0250c7eb6df84a3699f3df74322c3) - Work on CSL extension schema for styles repository [`b62494c`](https://github.com/citation-style-language/schema/commit/b62494cbfe0ea85b9cc430365b235f00480eaebb) - Use variables.standard pattern, format [`a6928c3`](https://github.com/citation-style-language/schema/commit/a6928c394bd0778d539e22c876c4da53672ea188) - Delete test.rnc [`9a64b1c`](https://github.com/citation-style-language/schema/commit/9a64b1c5e58d829c0d94b9dc9eccb5d40d2e50b7) - Add extracted Schematron schema [`602ad40`](https://github.com/citation-style-language/schema/commit/602ad40976b7b455a3ce0b79f5534e8e75f088e9) - Delete .hgtags [`6b56c7b`](https://github.com/citation-style-language/schema/commit/6b56c7b07e7c2a3c71f16d85523665f6e8579d43) - CSL JSON: date-parts set minItems to 1 [`6bbb80b`](https://github.com/citation-style-language/schema/commit/6bbb80b5e22ac33f139a34caa3c8575cce899812) - Update schema paths on README [`38b9fee`](https://github.com/citation-style-language/schema/commit/38b9fee8b4b622522a51b3bb8b47a685013bb7d1) - add github actions test workflow [`88f3db5`](https://github.com/citation-style-language/schema/commit/88f3db57c9ee8e4f50dea533040a7b09c5e77845) ## v1.0.1 - 2012-09-03 ### Merged - Update the version number of the first Mendeley Desktop release that sup... [`#92`](https://github.com/citation-style-language/schema/pull/92) - Slight update to embedded citation JSON - now using ADDIN (wdFieldAddin) field type [`#57`](https://github.com/citation-style-language/schema/pull/57) - Updated embedded schema description [`#44`](https://github.com/citation-style-language/schema/pull/44) ### Fixed - adding 'jurisdiction', fixes #2 [`#2`](https://github.com/citation-style-language/schema/issues/2) ### Commits - Restructuring of the CSL schema. Renamed most definitions, pulled some logic into new defitions, made a few minor modifications to logic (should have no effect), updated schema metadata, ran schema components through Trang to standardize indenting (white space is a little wonky). [`ab8f90d`](https://github.com/citation-style-language/schema/commit/ab8f90ddeb9824028e86a0cd86f6e1e4986d1c6b) - updating schema [`f93b5a0`](https://github.com/citation-style-language/schema/commit/f93b5a0b352d0dc5a053e03a72ad140d447b7cf8) - Remove csl.rnc in (old) schema folder [`d746ae1`](https://github.com/citation-style-language/schema/commit/d746ae180fcee986f7af554d886d22c17e429c24) - Revert to CSL 0.8 [`64eabc2`](https://github.com/citation-style-language/schema/commit/64eabc268b90be296d19209ae49cc183b48aadfb) - adding schema [`bb1cb53`](https://github.com/citation-style-language/schema/commit/bb1cb53336f80d6947152bc3cdfae28bc843e4c5) - bundled changes post-1.0-RC1 [`caa6706`](https://github.com/citation-style-language/schema/commit/caa67068d2ce84169bbc09a4046b7e3714e06a0a) - cleaned up pattern names on variable, moved dates to csl-variables.rnc file [`e1d0842`](https://github.com/citation-style-language/schema/commit/e1d08421d5335626eb4829f36df69e6ce98fc152) - adding new split schema files [`81759fb`](https://github.com/citation-style-language/schema/commit/81759fb72e39dcaa516c9adf26d684332a7efeb9) - Use info-text instead of string for cs:link [`c1e3963`](https://github.com/citation-style-language/schema/commit/c1e39636ee1afe5cd7ce8ce4fa9b68358f97df75) - from Rintze, added global initialize-with-hyphen option, introduced hierarchical name and et-al options. [`332b55a`](https://github.com/citation-style-language/schema/commit/332b55aa084ca763a902b9154f0edd35f2976535) - adding csl data schema [`6dc9bb6`](https://github.com/citation-style-language/schema/commit/6dc9bb675a3d5fe81c3f8b37e8116e2c7f9f053a) - adding separate categories file [`739b6ff`](https://github.com/citation-style-language/schema/commit/739b6ff4df710303e83f18175411a69497460919) - Added required version attribute (with value "1.0") to cs:locale when occurring in standalone locale files [`d89ece9`](https://github.com/citation-style-language/schema/commit/d89ece982b6c6e983fcbb13ac4c6f490d5e75edb) - Renamed "references" to "reference", removed "reference item", added season-terms ("season-01", etc), added "ad"/"bc", put some existing terms in alphabetical order [`a0ec839`](https://github.com/citation-style-language/schema/commit/a0ec8399e3958e21e93f04f60f226e1e1cb14bf0) - Allow et-al-* attributes on cs:name [`5f0dfe6`](https://github.com/citation-style-language/schema/commit/5f0dfe69de6eac35a06e3cf805e7073e73a40a16) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/schema/CONTRIBUTING.md0000644000175100017510000000337115234654007022006 0ustar00runnerrunner# How to Contribute ## Pull Requests We encourage pull requests. Please use the following guidelines: - in general, follow [these recommendations](https://www.freecodecamp.org/news/writing-good-commit-messages-a-practical-guide/) on writing good commit messages - make sure your PRs are focused, and link where possible to existing issues - follow the instructions on the PR template ## Issues Regardless of the change, however, the current status of CSL requires us to be fairly conservative. For issue reports, please follow the template instructions, and include all specified information. It's important for us to be able to quickly understand what you are requesting, how broad the need is, and what implementation options there are. ## Versioning ### Changes to the CSL Schema At this point, changes to the CSL RELAX NG schema consist of the following:
Changes to csl-categories.rnc, csl-terms.rnc, csl-types.rnc, or csl-variables.rnc
Adding new variables, item types, locators, or terms; these can usually be added to minor x.x.x version changes.
Changes to csl.rnc
These are often more significant and may have an impact on compatability, and so are typically reserved for major x.x version changes.
### Changes to the CSL-JSON Schema The data schemas are intended to mirror the `rnc` files, and so follow similar conventions. Ideally when we add variables, we add to both at the same time. ## Pre-Commit Hooks The repository includes a [pre-commit](https://pre-commit.com) configuration file, and a pre-commit hook, which will run linters for changes on any `rnc`, `json`, or `yaml` files. To install them, do the following from your local repo: ``` console pip install pre-commit pre-commit install ``` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/schema/README.md0000644000175100017510000000616515234654007021040 0ustar00runnerrunner# Schemas describing the Citation Style Language This is the official repository for schemas describing the Citation Style Language (CSL). Current schemas include: * [CSL schema](#csl-schema) - describes CSL style and locale XML files * [CSL-JSON schema](#csl-json-schema) - describes a commonly used JSON data model for storing CSL processor input (such as bibliographic metadata). For more information about CSL, visit . For general quesions and discussions have a look at the [CSL-forum](https://discourse.citationstyles.org/). ## CSL Schema The CSL schema is written in the compact syntax of [RELAX NG](http://relaxng.org/), and currently consists of the following files: * [`csl.rnc`](schemas/styles/csl.rnc) * [`csl-categories.rnc`](schemas/styles/csl-categories.rnc) * [`csl-terms.rnc`](schemas/styles/csl-terms.rnc) * [`csl-types.rnc`](schemas/styles/csl-types.rnc) * [`csl-variables.rnc`](schemas/styles/csl-variables.rnc) CSL style and locale files should be validated against `csl.rnc`, which incorporates the content of the other files. The CSL schema contains several [Schematron](http://www.schematron.com/) rules to make sure all macros called in a CSL style are actually defined. Since the popular [Jing](https://github.com/relaxng/jing-trang) XML validator currently ignores embedded Schematron rules, we also provide the `csl.sch` Schematron schema, which contains the Schematron rules extracted from the CSL schema. Jing users can use `csl.sch` to perform a secondary validation of CSL styles. ## CSL-JSON Schema The CSL-JSON schema is written in [JSON Schema](http://json-schema.org/), and currently consists of the following files: * [`csl-data.json`](schemas/input/csl-data.json) * [`csl-citation.json`](schemas/input/csl-citation.json) To render citations and bibliographies, CSL processors not only require CSL style and locale files, but also bibliographic metadata. The citeproc-js CSL processor [introduced](http://gsl-nagoya-u.net/http/pub/citeproc-doc.html#data-input) a JSON format to store such metadata, and this format has since been adopted by various other software products. The format, also known as "citeproc-JSON", has been codified in the CSL-JSON Schema. This same schema can be used to validate YAML. **At this point the CSL-JSON schema is not yet fully normative, and care must be taken to ensure compatibility with other tools built around CSL-JSON.** Whereas `csl-data.json` describes how the metadata of bibliographic items can be stored, `csl-citation.json` incorporates `csl-data.json` and adds an additional layer of information to also describe the context in which bibliographic items are cited. This includes information such as the order in which items are cited, which items are cited together in a single citation, etc. ## Licensing This repository is released under the [MIT license](LICENSE.txt). ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1785944092.6861305 citeproc_py-0.10.4/citeproc/data/schema/schemas/0000755000175100017510000000000015234654035021175 5ustar00runnerrunner././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1785944092.7041788 citeproc_py-0.10.4/citeproc/data/schema/schemas/styles/0000755000175100017510000000000015234654035022520 5ustar00runnerrunner././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/schema/schemas/styles/csl-categories.rnc0000644000175100017510000000143115234654007026126 0ustar00runnerrunnernamespace a = "http://relaxng.org/ns/compatibility/annotations/1.0" ## Categories for style metadata div { category.citation-format = "author" | "author-date" | "label" | "note" | "numeric" ## Use "generic-base" for styles that are non-discipline specific, such as ## APA, Harvard, etc. category.field = "anthropology" | "astronomy" | "biology" | "botany" | "chemistry" | "communications" | "engineering" | "generic-base" | "geography" | "geology" | "history" | "humanities" | "law" | "linguistics" | "literature" | "math" | "medicine" | "philosophy" | "physics" | "political_science" | "psychology" | "science" | "social_science" | "sociology" | "theology" | "zoology" } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/schema/schemas/styles/csl-choose.rnc0000644000175100017510000000442515234654007025267 0ustar00runnerrunnernamespace a = "http://relaxng.org/ns/compatibility/annotations/1.0" namespace cs = "http://purl.org/net/xbiblio/csl" ## cs:choose - Conditional Statements" div { rendering-element.choose = ## Use to conditionally render rendering elements. element cs:choose { choose.if, choose.else-if*, choose.else? } choose.if = element cs:if { condition+, match, rendering-element* } choose.else-if = element cs:else-if { condition+, match, rendering-element* } choose.else = element cs:else { rendering-element+ } condition = ## If used, the element content is only rendered if it disambiguates two ## otherwise identical citations. This attempt at disambiguation is only ## made after all other disambiguation methods have failed. [ a:defaultValue = "true" ] attribute disambiguate { "true" } | ## Tests whether the given variables contain numeric text. attribute is-numeric { list { variables+ } } | ## Tests whether the given date variables contain approximate dates. attribute is-uncertain-date { list { variables.dates+ } } | ## Tests whether the locator matches the given locator types. attribute locator { list { terms.locator+ } } | ## Tests whether the cite position matches the given positions. attribute position { list { ("first" | "subsequent" | "ibid" | "ibid-with-locator" | "near-note")+ } } | ## Tests whether the item matches the given types. attribute type { list { item-types+ } } | ## Tests whether the default ("long") forms of the given variables ## contain non-empty values. attribute variable { list { variables+ } } match = ## Set the testing logic. [ a:defaultValue = "all" ] attribute match { ## Element only tests "true" when all conditions test "true" for all ## given test values. "all" | ## Element tests "true" when any condition tests "true" for any given ## test value. "any" | ## Element only tests "true" when none of the conditions test "true" ## for any given test value. "none" }? } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/schema/schemas/styles/csl-relaxed.rnc0000644000175100017510000000064115234654007025427 0ustar00runnerrunnernamespace cs = "http://purl.org/net/xbiblio/csl" namespace dc = "http://purl.org/dc/elements/1.1/" dc:title [ "Citation Style Language Schema - Relaxed" ] dc:creator [ "Bruce D'Arcus" ] dc:rights [ "Permission to freely use, copy and distribute." ] dc:description [ "Relaxes the need for a cs:updated value in the official CSL schema." ] include "csl.rnc" { info-updated = element cs:updated { xsd:dateTime? } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/schema/schemas/styles/csl-repository.rnc0000644000175100017510000001006315234654007026221 0ustar00runnerrunnernamespace a = "http://relaxng.org/ns/compatibility/annotations/1.0" namespace cs = "http://purl.org/net/xbiblio/csl" namespace dc = "http://purl.org/dc/elements/1.1/" dc:title [ "Extension schema for the Citation Style Language styles repository" ] dc:creator [ "Rintze M. Zelle" ] dc:rights [ "Copyright 2013-2018 Citation Style Language and contributors" ] dc:license [ "MIT license" ] dc:description [ "Enforces stricter requirements for the styles in the official CSL styles repository." ] include "csl.rnc" { ## Remove legacy attributes from cs:style of dependents dependent-style.style = element cs:style { style.default-locale, version, dependent-style.style.info } ## - Only allow cs:issn once ## - Require a cs:rights element ## - Forgo "interleave" (so the elements need to be in the order specified), ## so that we can require ## * one cs:link with "self" ## * any number of cs:link with "template" ## * at least one cs:link with "documentation" ## * one cs:category with "citation-format" ## * any number of cs:category with "field". ## Metadata for independent styles. independent-style.style.info = element cs:info { info.title, info.title-short?, info.id, independent-style.info.link.self, independent-style.info.link.template*, independent-style.info.link.documentation+, info.author*, info.contributor*, info.category.citation-format, info.category.field*, info.issn?, info.eissn?, info.issnl?, info.summary?, info.published?, info.updated, info.rights } ## - Only allow cs:issn once ## - Require a cs:rights element ## - Forgo "interleave" (so the elements need to be in the order specified), ## so that we can require ## * one cs:link with "self" ## * one cs:link with "independent-parent" ## * any number of cs:link with "documentation" ## * one cs:category with "citation-format" ## * any number of cs:category with "field". ## Metadata for dependent styles. dependent-style.style.info = element cs:info { info.title, info.title-short?, info.id, independent-style.info.link.self, independent-style.info.link.independent-parent, independent-style.info.link.documentation*, info.author*, info.contributor*, info.category.citation-format, info.category.field*, info.issn?, info.eissn?, info.issnl?, info.summary?, info.published?, info.updated, info.rights } ## Require "license" attribute; require specific value for "license" attribute and ## text content for cs:rights info.rights = element cs:rights { attribute license { "http://creativecommons.org/licenses/by-sa/3.0/" }, attribute xml:lang { xsd:language }?, "This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License" } ## Remove legacy attributes from cs:et-al names.et-al = ## Specify the term used for et-al abbreviation and its formatting. element cs:et-al { ## Select the term to use for et-al abbreviation. [ a:defaultValue = "et-al" ] attribute term { "et-al" | "and others" }?, font-formatting } } independent-style.info.link.self = element cs:link { attribute href { xsd:anyURI }, attribute rel { "self" }, info-text } independent-style.info.link.template = element cs:link { attribute href { xsd:anyURI }, attribute rel { "template" }, info-text } independent-style.info.link.independent-parent = element cs:link { attribute href { xsd:anyURI }, attribute rel { "independent-parent" }, info-text } independent-style.info.link.documentation = element cs:link { attribute href { xsd:anyURI }, attribute rel { "documentation" }, info-text } info.category.citation-format = element cs:category { attribute citation-format { category.citation-format } } info.category.field = element cs:category { attribute field { category.field } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/schema/schemas/styles/csl-terms.rnc0000644000175100017510000000646715234654007025151 0ustar00runnerrunnernamespace a = "http://relaxng.org/ns/compatibility/annotations/1.0" ## Terms div { terms = terms.gender-assignable | terms.gender-variants | terms.locator | item-types | ## Contributor roles variables.names | "editortranslator" | ## Miscellaneous terms "accessed" | "ad" | "advance-online-publication" | "album" | "and" | "and others" | "anonymous" | "at" | "audio-recording" | "available at" | "bc" | "bce" | "by" | "ce" | "circa" | "cited" | "et-al" | "film" | "forthcoming" | "from" | "henceforth" | "ibid" | "in" | "in press" | "internet" | "interview" | "letter" | "loc-cit" | "no date" | "no-place" | "no-publisher" | "on" | "online" | "op-cit" | "original-work-published" | "personal-communication" | "podcast" | "podcast-episode" | "preprint" | "presented at" | "radio-broadcast" | "radio-series" | "radio-series-episode" | "reference" | "retrieved" | "review-of" | "scale" | "special-issue" | "special-section" | "television-broadcast" | "television-series" | "television-series-episode" | "video" | "working-paper" | ## Punctuation "open-quote" | "close-quote" | "open-inner-quote" | "close-inner-quote" | "page-range-delimiter" | "colon" | "comma" | "semicolon" | ## Seasons "season-01" | "season-02" | "season-03" | "season-04" ## Terms to which a gender may be assigned terms.gender-assignable = ## Months "month-01" | "month-02" | "month-03" | "month-04" | "month-05" | "month-06" | "month-07" | "month-08" | "month-09" | "month-10" | "month-11" | "month-12" | terms.non-locator-number-variables | terms.locator-number-variables ## Terms for which gender variants may be specified terms.gender-variants = terms.ordinals | terms.long-ordinals terms.ordinals = ## Ordinals xsd:string { pattern = "ordinal(-\d{2})?" } terms.long-ordinals = ## Long ordinals "long-ordinal-01" | "long-ordinal-02" | "long-ordinal-03" | "long-ordinal-04" | "long-ordinal-05" | "long-ordinal-06" | "long-ordinal-07" | "long-ordinal-08" | "long-ordinal-09" | "long-ordinal-10" ## Locators terms.locator = "act" | "appendix" | "article-locator" | "book" | "canon" | "chapter" | "column" | "elocation" | "equation" | "figure" | "folio" | "line" | "note" | "opus" | "paragraph" | "rule" | "scene" | "sub-verbo" | "table" | "timestamp" | "title-locator" | "verse" | terms.locator-number-variables ## Locator terms with matching number variables terms.locator-number-variables = "issue" | "page" | "part" | "section" | "supplement" | "version" | "volume" ## Non-locator terms accompanying number variables terms.non-locator-number-variables = "chapter-number" | "citation-number" | "collection-number" | "edition" | "first-reference-note-number" | "number" | "number-of-pages" | "number-of-volumes" | "page-first" | "printing" } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/schema/schemas/styles/csl-types.rnc0000644000175100017510000000163115234654007025147 0ustar00runnerrunnernamespace a = "http://relaxng.org/ns/compatibility/annotations/1.0" ## Item types div { item-types = "article" | "article-journal" | "article-magazine" | "article-newspaper" | "bill" | "book" | "broadcast" | "chapter" | "classic" | "collection" | "dataset" | "document" | "entry" | "entry-dictionary" | "entry-encyclopedia" | "event" | "figure" | "graphic" | "hearing" | "interview" | "legal_case" | "legislation" | "manuscript" | "map" | "motion_picture" | "musical_score" | "pamphlet" | "paper-conference" | "patent" | "performance" | "periodical" | "personal_communication" | "post" | "post-weblog" | "regulation" | "report" | "review" | "review-book" | "software" | "song" | "speech" | "standard" | "thesis" | "treaty" | "webpage" } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/schema/schemas/styles/csl-variables.rnc0000644000175100017510000000475115234654007025761 0ustar00runnerrunnernamespace a = "http://relaxng.org/ns/compatibility/annotations/1.0" ## Variables div { ## All variables variables = variables.dates | variables.names | variables.standard ## Standard variables variables.standard = variables.numbers | variables.strings | variables.titles ## Date variables variables.dates = "accessed" | "available-date" | "event-date" | "issued" | "original-date" | "submitted" ## Name variables variables.names = "author" | "chair" | "collection-editor" | "compiler" | "composer" | "container-author" | "contributor" | "curator" | "director" | "editor" | "editor-translator" | "editorial-director" | "executive-producer" | "guest" | "host" | "illustrator" | "interviewer" | "narrator" | "organizer" | "original-author" | "performer" | "producer" | "recipient" | "reviewed-author" | "script-writer" | "series-creator" | "translator" ## Number variables variables.numbers = "chapter-number" | "citation-number" | "collection-number" | "edition" | "first-reference-note-number" | "issue" | "locator" | "number" | "number-of-pages" | "number-of-volumes" | "page" | "page-first" | "part-number" | "printing-number" | "section" | "supplement-number" | "version" | "volume" ## Title variables variables.titles = "collection-title" | "container-title" | "original-title" | "part-title" | "reviewed-title" | "title" | "volume-title" | # Short title forms. Will be removed in CSL 1.1 "title-short" | "container-title-short" ## String variables variables.strings = "abstract" | "annote" | "archive" | "archive_collection" | "archive_location" | "archive-place" | "authority" | "call-number" | "citation-key" | "citation-label" | "dimensions" | "division" | "DOI" | # Alias for 'event-title'. Deprecated. Will be removed in CSL 1.1. "event" | "event-title" | "event-place" | "genre" | "ISBN" | "ISSN" | "jurisdiction" | "keyword" | "language" | "license" | "medium" | "note" | "original-publisher" | "original-publisher-place" | "PMCID" | "PMID" | "publisher" | "publisher-place" | "references" | "reviewed-genre" | "scale" | "source" | "status" | "URL" | "year-suffix" } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/schema/schemas/styles/csl.rnc0000644000175100017510000010064615234654007024013 0ustar00runnerrunnernamespace a = "http://relaxng.org/ns/compatibility/annotations/1.0" namespace bibo = "http://purl.org/ontology/bibo/" namespace cs = "http://purl.org/net/xbiblio/csl" namespace dc = "http://purl.org/dc/elements/1.1/" namespace sch = "http://purl.oclc.org/dsdl/schematron" namespace xhtml = "http://www.w3.org/1999/xhtml" # CSL schema metadata dc:title [ "Citation Style Language" ] dc:creator [ "Bruce D'Arcus" ] dc:creator [ "Simon Kornblith" ] bibo:editor [ "Frank Bennett" ] bibo:editor [ "Rintze Zelle" ] dc:rights [ "Copyright 2007-2020 Citation Style Language and contributors" ] dc:license [ "MIT license" ] dc:description [ "RELAX NG compact schema for the Citation Style Language (CSL)." ] ## Subparts of the CSL schema include "csl-choose.rnc" include "csl-terms.rnc" include "csl-types.rnc" include "csl-variables.rnc" include "csl-categories.rnc" # ============================================================================== ## cs:style and cs:locale - Root Elements div { start = independent-style.style | dependent-style.style | locale-file.locale independent-style.style = element cs:style { ## Select whether citations appear in-text or as notes. attribute class { "in-text" | "note" }, style.default-locale, style.options, version, independent-style.style.info, (style.locale* & style.macro* & style.citation & style.bibliography?) } dependent-style.style = element cs:style { style.default-locale, version, dependent-style.style.info } style.default-locale = ## Set a default style locale. attribute default-locale { xsd:language }? version = ## Indicate CSL version compatibility. [ a:defaultValue = "1.0" ] attribute version { "1.0" } } # ============================================================================== ## cs:info - Style and Locale File Metadata div { ## Metadata for independent styles. independent-style.style.info = element cs:info { info.author* & info.category* & info.contributor* & info.id & info.issn* & info.eissn? & info.issnl? & independent-style.info.link* & info.published? & info.rights? & info.summary? & info.title & info.title-short? & info.updated } ## Metadata for dependent styles. dependent-style.style.info = element cs:info { info.author* & info.category* & info.contributor* & info.id & info.issn* & info.eissn? & info.issnl? & dependent-style.info.link+ & info.published? & info.rights? & info.summary? & info.title & info.title-short? & info.updated } ## Metadata for locale files. locale-file.locale.info = element cs:info { info.translator* & info.rights? & info.updated? } info.author = element cs:author { personal-details } info.contributor = element cs:contributor { personal-details } info.translator = element cs:translator { personal-details } personal-details = element cs:name { text } & element cs:email { text }? & element cs:uri { xsd:anyURI }? info.category = ## Specify the citation format of the style (using the "citation-format" ## attribute) or the fields and disciplines for which the style is ## relevant (using the "field" attribute). element cs:category { attribute citation-format { category.citation-format } | attribute field { category.field } } info.id = ## Specify the unique and stable identifier for the style. A URI ## is valid, but new styles should use a UUID to ensure stability ## and uniqueness. element cs:id { xsd:anyURI } info.issn = ## Specify the journal's ISSN(s) for journal-specific styles. An ISSN ## must consist of four digits, a hyphen, three digits, and a check ## digit (a numeral digit or roman X), e.g. "1234-1231". element cs:issn { issn } info.eissn = ## Specify the journal's eISSN for journal-specific styles. element cs:eissn { issn } info.issnl = ## Specify the journal's ISSN-L for journal-specific styles. element cs:issnl { issn } issn = xsd:string { pattern = "\d{4}\-\d{3}(\d|x|X)" } independent-style.info.link = element cs:link { attribute href { xsd:anyURI }, ## Specify how the URL relates to the style. attribute rel { ## The URI of the CSL style itself. "self" | ## URI of the style from which the current style is derived. "template" | ## URI of style documentation. "documentation" }, info-text } dependent-style.info.link = element cs:link { attribute href { xsd:anyURI }, ## Specify how the URL relates to the style. attribute rel { ## The URI of the CSL style itself. "self" | ## URI of the CSL style whose content should be used for ## processing. Required for dependent styles. "independent-parent" | ## URI of style documentation. "documentation" }, info-text } info.published = ## Specify when the style was initially created or made available. element cs:published { xsd:dateTime } info.rights = element cs:rights { attribute license { xsd:anyURI }?, info-text } info.summary = element cs:summary { info-text } info.title = element cs:title { info-text } info.title-short = ## Specify an abbreviated style title (e.g., "APA") element cs:title-short { info-text } info.updated = ## Specify when the style was last updated (e.g., ## "2007-10-26T21:32:52+02:00") element cs:updated { xsd:dateTime } info-text = attribute xml:lang { xsd:language }?, text } # ============================================================================== ## cs:locale in Independent Styles div { style.locale = ## Use to (re)define localized terms, dates and options. element cs:locale { ## Specify the affected locale(s). If "xml:lang" is not set, the ## "cs:locale" element affects all locales. attribute xml:lang { xsd:language }?, (locale.style-options? & locale.date* & locale.terms?) } } # ============================================================================== ## cs:locale Contents - Localization Data div { ## Localized global options are specified as attributes in the ## cs:style-options element. If future versions of CSL include localized ## options that are citation or bibliography specific, the elements ## cs:citation-options and cs:bibliography-options can be added. locale.style-options = element cs:style-options { ## Limit the "ordinal" form to the first day of the month. [ a:defaultValue = "false" ] attribute limit-day-ordinals-to-day-1 { xsd:boolean }?, ## Specify whether punctuation (a period or comma) is placed within ## or outside (default) the closing quotation mark. [ a:defaultValue = "false" ] attribute punctuation-in-quote { xsd:boolean }? } locale-file.locale = element cs:locale { ## Specify the locale of the locale file. attribute xml:lang { xsd:language }, version, locale-file.locale.info?, (locale.style-options & locale.date+ & locale.terms) } locale.date = element cs:date { date.form, delimiter, font-formatting, text-case, locale.date.date-part+ } date.form = ## Select the localized date format ("text" or "numeric"). attribute form { ## Text date form (e.g., "December 15, 2005"). "text" | ## Numeric date form (e.g., "2005-12-15"). "numeric" } locale.date.date-part = element cs:date-part { affixes, font-formatting, text-case, (day | month | year) } locale.terms = element cs:terms { terms.term+ } ## The "cs:term" element can either hold a basic string, or "cs:single" and ## "cs:multiple" child elements to give singular and plural forms of the term. terms.term = element cs:term { term.attributes, (text | (term.single, term.multiple)) } term.attributes = (attribute name { terms }, [ a:defaultValue = "long" ] attribute form { term.form }?) | (attribute name { terms.ordinals }, attribute form { "long" }?, attribute gender-form { "masculine" | "feminine" }?, attribute match { "last-digit" | "last-two-digits" | "whole-number" }?) | (attribute name { terms.long-ordinals }, attribute form { "long" }?, attribute gender-form { "masculine" | "feminine" }) | (attribute name { terms.gender-assignable }, attribute form { "long" }?, attribute gender { "masculine" | "feminine" }) ## "verb-short" reverts to "verb" if the "verb-short" form is not available. ## "symbol" reverts to "short" if the "symbol" form is not available. ## "verb" and "short" revert to "long" if the specified form is not available. term.form = "long" | "verb" | "short" | "verb-short" | "symbol" term.single = ## Singular version of the term. element cs:single { text } term.multiple = ## Plural version of the term. element cs:multiple { text } } # ============================================================================== ## cs:macro div { style.macro = ## Use to create collections of (reusable) formatting instructions. element cs:macro { attribute name { xsd:NMTOKEN }, rendering-element+ } } # ============================================================================== ## Rendering Elements div { rendering-element = rendering-element.names | rendering-element.date | rendering-element.label | rendering-element.text | rendering-element.number | rendering-element.choose | rendering-element.group } # ============================================================================== ## cs:citation and cs:bibliography div { style.citation = ## Use to describe the formatting of citations. element cs:citation { citation.options, sort?, citation.layout } style.bibliography = ## Use to describe the formatting of the bibliography. element cs:bibliography { bibliography.options, sort?, bibliography.layout } citation.layout = element cs:layout { affixes, delimiter, font-formatting, rendering-element+ } bibliography.layout = element cs:layout { affixes, font-formatting, rendering-element+ } } # ============================================================================== ## cs:names Rendering Element div { rendering-element.names = element cs:names { names.attributes, ((names.name?, names.et-al?) & names.label?), names.substitute? } names.attributes = attribute variable { list { variables.names+ } }, affixes, ## Specify the delimiter for name lists of name variables rendered by ## the same cs:names element. delimiter, display, font-formatting names.name = element cs:name { name.attributes, ## Select the "long" (first name + last name, for Western names), ## "short" (last name only, for Western names), or "count" name form ## (returning the number of names in the name variable, which can be ## useful for some sorting algorithms). [ a:defaultValue = "long" ] attribute form { "long" | "short" | "count" }?, affixes, ## Set the delimiter for names in a name variable (e.g., ", " in ## "Doe, Smith") [ a:defaultValue = ", " ] delimiter, font-formatting, name.name-part* } name.attributes = ## Use to separate the second-to-last and last name of a name list by ## the "and" term or ampersand. attribute and { ## Use the "and" term (e.g., "Doe, Johnson and Smith"). "text" | ## Use the "ampersand" (e.g., "Doe, Johnson & Smith"). "symbol" }?, ## Specify when the name delimiter is used between a truncated name list ## and the "et-al" (or "and others") term in case of et-al abbreviation ## (e.g., "Smith, Doe et al." or "Smith, Doe, et al."). [ a:defaultValue = "contextual" ] attribute delimiter-precedes-et-al { ## The name delimiter is only used when the truncated name list ## consists of two or more names. "contextual" | ## The name delimiter is always used. "always" | ## The name delimiter is never used. "never" | ## The name delimiter is only used if the preceding name is inverted as ## a result of the "name-as-sort-order" attribute. "after-inverted-name" }?, ## Specify when the name delimiter is used between the second-to-last ## and last name of a non-truncated name list. Only has an effect when ## the "and" term or ampersand is used (e.g., "Doe and Smith" or "Doe, ## and Smith"). [ a:defaultValue = "contextual" ] attribute delimiter-precedes-last { ## The name delimiter is only used when the name list consists of ## three or more names. "contextual" | ## The name delimiter is always used. "always" | ## The name delimiter is never used. "never" | ## The name delimiter is only used if the preceding name is inverted as ## a result of the "name-as-sort-order" attribute. "after-inverted-name" }?, ## Set the minimum number of names needed in a name variable to activate ## et-al abbreviation. attribute et-al-min { xsd:integer }?, ## Set the number of names to render when et-al abbreviation is active. attribute et-al-use-first { xsd:integer }?, ## As "et-al-min", but only affecting subsequent citations to an item. attribute et-al-subsequent-min { xsd:integer }?, ## As "et-al-use-first", but only affecting subsequent citations to an ## item. attribute et-al-subsequent-use-first { xsd:integer }?, ## If set to "true", the "et-al" (or "and others") term is replaced by ## an ellipsis followed by the last name of the name variable. [ a:defaultValue = "false" ] attribute et-al-use-last { xsd:boolean }?, ## If set to "false", names are not initialized and "initialize-with" ## only affects initials already present in the input data. [ a:defaultValue = "true" ] attribute initialize { xsd:boolean }?, ## Activate initializing of given names. The attribute value is appended ## to each initial (e.g., with ". ", "Orson Welles" becomes "O. Welles"). attribute initialize-with { text }?, ## Specify whether (and which) names should be rendered in their sort ## order (e.g., "Doe, John" instead of "John Doe"). attribute name-as-sort-order { ## Render the first name of each name variable in sort order. "first" | ## Render all names in sort order. "all" }?, ## Sets the delimiter for name-parts that have switched positions as a ## result of "name-as-sort-order" (e.g., ", " in "Doe, John"). [ a:defaultValue = ", " ] attribute sort-separator { text }? name.name-part = ## Use to format individual name parts (e.g., "Jane DOE"). element cs:name-part { attribute name { "family" | "given" }, affixes, font-formatting, text-case } names.et-al = ## Specify the term used for et-al abbreviation and its formatting. element cs:et-al { ## Select the term to use for et-al abbreviation. [ a:defaultValue = "et-al" ] attribute term { "et-al" | "and others" }?, font-formatting } ## Inherits variable from the parent cs:names element. names.label = element cs:label { [ a:defaultValue = "long" ] attribute form { term.form }?, label.attributes-shared } names.substitute = ## Specify substitution options when the name variables selected on the ## parent cs:names element are empty. element cs:substitute { (substitute.names | rendering-element)+ } ## Short version of cs:names, without children, allowed in cs:substitute. substitute.names = element cs:names { names.attributes } } # ============================================================================== ## cs:date Rendering Element div { rendering-element.date = element cs:date { attribute variable { variables.dates }, (( ## Limit the date parts rendered. [ a:defaultValue = "year-month-day" ] attribute date-parts { ## Year, month and day "year-month-day" | ## Year and month "year-month" | ## Year only "year" }?, date.form, rendering-element.date.date-part.localized*) | (rendering-element.date.date-part.non-localized+, delimiter)), affixes, display, font-formatting, text-case } rendering-element.date.date-part.localized = ## Specify overriding formatting for localized dates (affixes ## cannot be overridden, as these are considered locale-specific). ## Example uses are forcing the use of leading-zeros, or of the ## "short" month form. Has no effect on which, and in what order, ## date parts are rendered. element cs:date-part { font-formatting, text-case, (day | month | year) } rendering-element.date.date-part.non-localized = ## Specify, in the desired order, the date parts that should be ## rendered and their formatting. element cs:date-part { affixes, font-formatting, text-case, (day | month | year) } day = attribute name { "day" }, ## Day forms: "numeric" ("5"), "numeric-leading-zeros" ("05"), "ordinal" ## ("5th"). [ a:defaultValue = "numeric" ] attribute form { "numeric" | "numeric-leading-zeros" | "ordinal" }?, range-delimiter month = attribute name { "month" }, ## Months forms: "long" (e.g., "January"), "short" ("Jan."), "numeric" ## ("1"), and "numeric-leading-zeros" ("01"). [ a:defaultValue = "long" ] attribute form { "long" | "short" | "numeric" | "numeric-leading-zeros" }?, range-delimiter, strip-periods year = attribute name { "year" }, ## Year forms: "long" ("2005"), "short" ("05"). [ a:defaultValue = "long" ] attribute form { "short" | "long" }?, range-delimiter range-delimiter = ## Specify a delimiter for date ranges (by default the en-dash). A custom ## delimiter is retrieved from the largest date part ("day", "month" or ## "year") that differs between the two dates. [ a:defaultValue = "–" ] attribute range-delimiter { text }? } # ============================================================================== ## cs:text Rendering Element div { rendering-element.text = ## Use to call macros, render variables, terms, or verbatim text. element cs:text { text.attributes, affixes, display, font-formatting, quotes, strip-periods, text-case } text.attributes = ## Select a macro. attribute macro { xsd:NMTOKEN } | ( ## Select a term. attribute term { terms }, [ a:defaultValue = "long" ] attribute form { term.form }?, ## Specify term plurality: singular ("false") or plural ("true"). [ a:defaultValue = "false" ] attribute plural { xsd:boolean }?) | ## Specify verbatim text. attribute value { text } | ( ## Select a variable. attribute variable { variables.standard }, [ a:defaultValue = "long" ] attribute form { "short" | "long" }?) } # ============================================================================== ## cs:number Rendering Element div { rendering-element.number = ## Use to render a number variable. element cs:number { number.attributes, affixes, display, font-formatting, text-case } number.attributes = attribute variable { variables.numbers }, ## Number forms: "numeric" ("4"), "ordinal" ("4th"), "long-ordinal" ## ("fourth"), "roman" ("iv"). [ a:defaultValue = "numeric" ] attribute form { "numeric" | "ordinal" | "long-ordinal" | "roman" }? } # ============================================================================== ## cs:label Rendering Element div { rendering-element.label = ## Use to render a term whose pluralization depends on the content of a ## variable. E.g., if "page" variable holds a range, the plural label ## "pp." is selected instead of the singular "p.". element cs:label { label.attributes, label.attributes-shared } label.attributes = attribute variable { variables.numbers | "locator" | "page" }, [ a:defaultValue = "long" ] attribute form { "long" | "short" | "symbol" }? label.attributes-shared = ## Specify when the plural version of a term is selected. [ a:defaultValue = "contextual" ] attribute plural { "always" | "never" | "contextual" }?, affixes, font-formatting, strip-periods, text-case } # ============================================================================== ## cs:group Rendering Element div { rendering-element.group = ## Use to group rendering elements. Groups are useful for setting a ## delimiter for the group children, for organizing the layout of ## bibliographic entries (using the "display" attribute), and for ## suppressing the rendering of terms and verbatim text when variables ## are empty. element cs:group { group.attributes, affixes, delimiter, display, font-formatting, rendering-element+ } group.attributes = notAllowed? } # ============================================================================== ## Style Options div { style.options = style.demote-non-dropping-particle, style.initialize-with-hyphen, style.page-range-format, names-inheritable-options, name-inheritable-options citation.options = citation.cite-group-delimiter, citation.collapse-options, citation.disambiguate-options, citation.near-note-distance, names-inheritable-options, name-inheritable-options bibliography.options = bibliography.hanging-indent, bibliography.line-formatting-options, bibliography.second-field-align, bibliography.subsequent-author-substitute-options, names-inheritable-options, name-inheritable-options style.demote-non-dropping-particle = ## Specify whether the non-dropping particle is demoted in inverted ## names (e.g., "Koning, W. de"). [ a:defaultValue = "display-and-sort" ] attribute demote-non-dropping-particle { "never" | "sort-only" | "display-and-sort" }? style.initialize-with-hyphen = ## Specify whether compound given names (e.g., "Jean-Luc") are ## initialized with ("J-L") or without a hyphen ("JL"). [ a:defaultValue = "true" ] attribute initialize-with-hyphen { xsd:boolean }? style.page-range-format = ## Reformat page ranges in the "page" variable. attribute page-range-format { "expanded" | "minimal" | "minimal-two" | "chicago" | "chicago-15" | "chicago-16" }? citation.cite-group-delimiter = ## Activate cite grouping and specify the delimiter for cites within a ## cite group. [ a:defaultValue = ", " ] attribute cite-group-delimiter { text }? citation.collapse-options = ## Activate cite grouping and specify the method of citation collapsing. attribute collapse { ## Collapse ranges of numeric cites, e.g. from "[1,2,3]" to "[1-3]". "citation-number" | ## Collapse cites by suppressing repeated names, e.g. from "(Doe ## 2000, Doe 2001)" to "(Doe 2000, 2001)". "year" | ## Collapse cites as with "year", but also suppresses repeated ## years, e.g. from "(Doe 2000a, Doe 2000b)" to "(Doe 2000a, b)". "year-suffix" | ## Collapses cites as with "year-suffix", but also collapses ## ranges of year-suffixes, e.g. from "(Doe 2000a, Doe 2000b, ## Doe 2000c)" to "(Doe 2000a-c)". "year-suffix-ranged" }?, ## Specify the delimiter between year-suffixes. Defaults to the cite ## delimiter. attribute year-suffix-delimiter { text }?, ## Specify the delimiter following a group of collapsed cites. Defaults ## to the cite delimiter. attribute after-collapse-delimiter { text }? citation.disambiguate-options = ## Set to "true" to activate disambiguation by showing names that were ## originally hidden as a result of et-al abbreviation. [ a:defaultValue = "false" ] attribute disambiguate-add-names { xsd:boolean }?, ## Set to "true" to activate disambiguation by expanding names, showing ## initials or full given names. [ a:defaultValue = "false" ] attribute disambiguate-add-givenname { xsd:boolean }?, ## Set to "true" to activate disambiguation by adding year-suffixes ## (e.g., "(Doe 2007a, Doe 2007b)") for items from the same author(s) ## and year. [ a:defaultValue = "false" ] attribute disambiguate-add-year-suffix { xsd:boolean }?, ## Specify how name are expanded for disambiguation. [ a:defaultValue = "by-cite" ] attribute givenname-disambiguation-rule { ## Each ambiguous names is progressively transformed until ## disambiguated (when disambiguation is not possible, the name ## remains in its original form). "all-names" | ## As "all-names", but name expansion is limited to showing ## initials. "all-names-with-initials" | ## As "all-names", but disambiguation is limited to the first name ## of each cite. "primary-name" | ## As "all-names-with-initials", but disambiguation is limited to ## the first name of each cite. "primary-name-with-initials" | ## As "all-names", but only ambiguous names in ambiguous cites are ## expanded. "by-cite" }? citation.near-note-distance = ## Set the number of preceding notes (footnotes or endnotes) within ## which the current item needs to have been previously cited in order ## for the "near-note" position to be "true". [ a:defaultValue = "5" ] attribute near-note-distance { xsd:integer }? bibliography.hanging-indent = ## Set to "true" to render bibliographic entries with hanging indents. [ a:defaultValue = "false" ] attribute hanging-indent { xsd:boolean }? bibliography.line-formatting-options = ## Set the spacing between bibliographic entries. [ a:defaultValue = "1" ] attribute entry-spacing { xsd:nonNegativeInteger }?, ## Set the spacing between bibliographic lines. [ a:defaultValue = "1" ] attribute line-spacing { xsd:integer { minExclusive = "0" } }? bibliography.second-field-align = ## Use to align any subsequent lines of bibliographic entries with the ## beginning of the second field. attribute second-field-align { ## Align the first field with the margin. "flush" | ## Put the first field in the margin and align all subsequent ## lines of text with the margin. "margin" }? bibliography.subsequent-author-substitute-options = ## Substitute names that repeat in subsequent bibliographic entries by ## the attribute value. attribute subsequent-author-substitute { text }?, ## Specify the method of substitution of names repeated in subsequent ## bibliographic entries. [ a:defaultValue = "complete-all" ] attribute subsequent-author-substitute-rule { ## Requires a match of all rendered names in the name variable, and ## substitutes once for all names. "complete-all" | ## Requires a match of all rendered names in the name variable, ## and substitutes for each name. "complete-each" | ## Substitutes for each name, until the first mismatch. "partial-each" | ## Substitutes the first name if it matches. "partial-first" }? ## Options affecting cs:names, for cs:style, cs:citation and cs:bibliography. names-inheritable-options = ## Inheritable name option, companion for "delimiter" on cs:names. attribute names-delimiter { text }? ## Options affecting cs:name, for cs:style, cs:citation and cs:bibliography. name-inheritable-options = name.attributes, ## Inheritable name option, companion for "delimiter" on cs:name. attribute name-delimiter { text }?, ## Inheritable name option, companion for "form" on cs:name. [ a:defaultValue = "long" ] attribute name-form { "long" | "short" | "count" }? } # ============================================================================== ## cs:sort - Sorting div { sort = ## Specify how cites and bibliographic entries should be sorted. By ## default, items appear in the order in which they were cited. element cs:sort { sort.key+ } sort.key = element cs:key { (attribute variable { variables } | attribute macro { xsd:NMTOKEN }), ## The minimum number of names needed in a name variable to activate ## name list truncation. Overrides the values set on any ## "et-al-(subsequent-)min" attributes. attribute names-min { xsd:integer }?, ## The number of names to render when name list truncation is ## activated. Overrides the values set on the ## "et-al-(subsequent-)use-first" attributes. attribute names-use-first { xsd:integer }?, ## Use to override the value of the "et-at-use-last" attribute. attribute names-use-last { xsd:boolean }?, ## Select between an ascending and descending sort. [ a:defaultValue = "ascending" ] attribute sort { "ascending" | "descending" }? } } # ============================================================================== ## Formatting attributes. div { affixes = [ a:defaultValue = "" ] attribute prefix { text }?, [ a:defaultValue = "" ] attribute suffix { text }? delimiter = attribute delimiter { text }? display = ## By default, bibliographic entries consist of continuous runs of text. ## With the "display" attribute, portions of each entry can be ## individually positioned. attribute display { ## Places the content in a block stretching from margin to margin. "block" | ## Places the content in a block starting at the left margin. "left-margin" | ## Places the content in a block to the right of a preceding ## "left-margin" block. "right-inline" | ## Places the content in a block indented to the right by a standard ## amount. "indent" }? ## The font-formatting attributes are based on those of CSS and XSL-FO. font-formatting = [ a:defaultValue = "normal" ] attribute font-style { "italic" | "normal" | "oblique" }?, [ a:defaultValue = "normal" ] attribute font-variant { "normal" | "small-caps" }?, [ a:defaultValue = "normal" ] attribute font-weight { "normal" | "bold" | "light" }?, [ a:defaultValue = "none" ] attribute text-decoration { "none" | "underline" }?, [ a:defaultValue = "baseline" ] attribute vertical-align { "baseline" | "sup" | "sub" }? quotes = ## When set to "true", quotes are placed around the rendered text. [ a:defaultValue = "false" ] attribute quotes { xsd:boolean }? strip-periods = ## When set to "true", periods are removed from the rendered text. [ a:defaultValue = "false" ] attribute strip-periods { xsd:boolean }? text-case = attribute text-case { ## Renders text in lowercase. "lowercase" | ## Renders text in uppercase. "uppercase" | ## Capitalizes the first character (other characters remain in ## their original case). "capitalize-first" | ## Capitalizes the first character of every word (other characters ## remain in their original case). "capitalize-all" | ## Renders text in title case. "title" | ## Renders text in sentence case. ## Deprecated. Will be removed in CSL 1.1 "sentence" }? } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1785944092.6861305 citeproc_py-0.10.4/citeproc/data/schema/tests/0000755000175100017510000000000015234654035020714 5ustar00runnerrunner././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1785944092.6861305 citeproc_py-0.10.4/citeproc/data/schema/tests/schemas/0000755000175100017510000000000015234654035022337 5ustar00runnerrunner././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1785944092.7043355 citeproc_py-0.10.4/citeproc/data/schema/tests/schemas/input/0000755000175100017510000000000015234654035023476 5ustar00runnerrunner././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/schema/tests/schemas/input/test_json.py0000644000175100017510000000716615234654007026071 0ustar00runnerrunnerimport json import pathlib import jsonschema import pytest """ The following section defines pytest fixtures, which can be used as arguments to tests, causing those tests to be run for all fixture values. """ root = pathlib.Path(__file__).parent.parent.parent.parent json_paths = list(root.glob('**/*.json')) @pytest.fixture(params=json_paths, ids=[x.name for x in json_paths]) def json_path(request): """ Paths that correspond to JSON files. """ return root.joinpath(request.param) @pytest.fixture(params=[ 'schemas/input/csl-citation.json', 'schemas/input/csl-data.json', ]) def json_schema(request): """ JSON objects that correspond to JSON schemas. """ path = root.joinpath(request.param) text = path.read_text() schema = json.loads(text) return schema @pytest.fixture def csl_data_validator(): text = root.joinpath('schemas/input/csl-data.json').read_text() schema = json.loads(text) Validator = jsonschema.validators.validator_for(schema) return Validator(schema) @pytest.fixture def csl_citation_validator(): text = root.joinpath('schemas/input/csl-citation.json').read_text() schema = json.loads(text) Validator = jsonschema.validators.validator_for(schema) return Validator(schema) """ The following section contains the tests. """ def test_read_json(json_path): """ Test that a JSON file can be read into Python. """ text = json_path.read_text() json.loads(text) def test_schema_property_specified(json_schema): """ Test that JSON schemas set the $schema property. https://json-schema.org/understanding-json-schema/reference/schema.html https://github.com/citation-style-language/schema/pull/153 """ json_schema['$schema'] def test_schema_is_valid(json_schema): """ Infer the JSON Schema draft from $schema and then check that the input schema is valid. """ Validator = jsonschema.validators.validator_for(json_schema) Validator.check_schema(json_schema) def test_basic_data_schema_validates(csl_data_validator): csl = [{ 'id': 'example-id', 'type': 'report', }] csl_data_validator.validate(csl) def test_basic_citation_schema_validates(csl_citation_validator): cite = { "schema": "https://resource.citationstyles.org/schema/latest/input/json/csl-citation.json", "citationID": "item1", "citationItems": [ { "id": "item1", "itemData": { "id": "item1", "type": "book", "title": "test title" } } ] } csl_citation_validator.validate(cite) def test_basic_data_schema_with_author_validates(csl_data_validator): csl = [{ 'id': 'example-id', 'type': 'report', "author": [ {"given": "Jane", "family": "Roe"}, {"literal": "John Doe"} ], }] csl_data_validator.validate(csl) def test_data_schema_with_extra_property_fails(csl_data_validator): csl = [{ 'id': 'example-id', 'type': 'report', 'not-a-csl-key': None, }] with pytest.raises(jsonschema.exceptions.ValidationError): csl_data_validator.validate(csl) def test_data_schema_with_empty_date_parts(csl_data_validator): """ empty arrays in date-parts can cause downstream citeproc failures https://github.com/citation-style-language/schema/pull/158 """ csl = [{ 'id': 'example-id', 'type': 'report', 'issued': { "date-parts": [] }, }] with pytest.raises(jsonschema.exceptions.ValidationError): csl_data_validator.validate(csl) ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1785944092.704523 citeproc_py-0.10.4/citeproc/data/schema/tools/0000755000175100017510000000000015234654035020712 5ustar00runnerrunner././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944071.0 citeproc_py-0.10.4/citeproc/data/schema/tools/rnc-validate-format.py0000755000175100017510000000320215234654007025122 0ustar00runnerrunner#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import subprocess import argparse from shutil import which from glob import glob # to validate and pretty print the rnc schema files before commit: # tools/rnc-validate-format.py parser = argparse.ArgumentParser(description="process csl schema files") parser.add_argument("--commit", action="store_true", help="commit the file(s)") args, unknown = parser.parse_known_args() rncdir = os.path.join("schemas", "styles") def rnc_format(rncfile): try: which("trang") is not None except Exception: raise SystemExit("trang commnd not found; please install") rng_new = rncfile + "_new.rng" # round-trip the rnc file through trang subprocess.run(["trang", rncfile, rng_new]) subprocess.run(["trang", rng_new, rncfile]) # remove the intermediate files tempfiles = glob(os.path.join(rncdir, "csl*.rng")) for file in tempfiles: os.remove(file) def rnc_pre_commit(): # this will only work as part of a pre-commit process, where it will run # rnc_format on any staged rnc files, and then restage cmd = ["git", "diff", "--name-only", "--cached"] changed_files = subprocess.check_output(cmd, text=True).splitlines() for changed_file in changed_files: if changed_file.endswith(".rnc"): rnc_format(changed_file) subprocess.run(["git", "add", changed_file]) def main(): if args.commit: rnc_pre_commit() else: rnc_format(os.path.join("schemas", "styles", "csl.rnc")) print("\n====> rnc schema files validated and formatted .....") if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1785944092.7046769 citeproc_py-0.10.4/citeproc/data/styles/0000755000175100017510000000000015234654035017635 5ustar00runnerrunner././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/citeproc/data/styles/harvard-cite-them-right.csl0000644000175100017510000002451115234654005024757 0ustar00runnerrunner ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1785944092.7052896 citeproc_py-0.10.4/citeproc/formatter/0000755000175100017510000000000015234654035017404 5ustar00runnerrunner././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/citeproc/formatter/__init__.py0000644000175100017510000000004015234654005021504 0ustar00runnerrunner from . import plain, html, rst ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/citeproc/formatter/html.py0000644000175100017510000000212315234654005020715 0ustar00runnerrunner try: from html import escape except ImportError: from cgi import escape def preformat(text): return escape(str(text), quote=False) class TagWrapper(str): tag = None attributes = None @classmethod def _wrap(cls, text): if cls.attributes: attrib = ' ' + ' '.join(['{}="{}"'.format(key, value) for key, value in cls.attributes.items()]) else: attrib = '' return '<{tag}{attrib}>{text}'.format(tag=cls.tag, attrib=attrib,text=text) def __new__(cls, text): return super(TagWrapper, cls).__new__(cls, cls._wrap(text)) class Italic(TagWrapper): tag = 'i' class Oblique(Italic): pass class Bold(TagWrapper): tag = 'b' class Light(TagWrapper): tag = 'l' class Underline(TagWrapper): tag = 'u' class Superscript(TagWrapper): tag = 'sup' class Subscript(TagWrapper): tag = 'sub' class SmallCaps(TagWrapper): tag = 'span' attributes = {'style': 'font-variant:small-caps;'} ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/citeproc/formatter/plain.py0000644000175100017510000000023415234654005021055 0ustar00runnerrunner def preformat(text): return text Italic = str Oblique = str Bold = str Light = str Underline = str Superscript = str Subscript = str SmallCaps = str ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/citeproc/formatter/rst.py0000644000175100017510000000130015234654005020555 0ustar00runnerrunner def escape(text): text = text.replace('*', r'\*') text = text.replace('`', r'\`') return text def preformat(text): return escape(str(text)) class RoleWrapper(str): role = None @classmethod def _wrap(cls, text): return ':{role}:`{text}`'.format(role=cls.role, text=text) def __new__(cls, text): return super(RoleWrapper, cls).__new__(cls, cls._wrap(text)) class Italic(RoleWrapper): role = 'emphasis' class Oblique(Italic): pass class Bold(RoleWrapper): role = 'strong' Light = str Underline = str class Superscript(RoleWrapper): role = 'superscript' class Subscript(RoleWrapper): role = 'subscript' SmallCaps = str ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/citeproc/frontend.py0000644000175100017510000001312715234654005017573 0ustar00runnerrunner import os from warnings import warn from lxml import etree from . import SCHEMA_PATH, LOCALES_PATH, STYLES_PATH from .model import CitationStylesElement from .formatter import html class CitationStylesXML(object): def __init__(self, f, validate=True): lookup = etree.ElementNamespaceClassLookup() namespace = lookup.get_namespace('http://purl.org/net/xbiblio/csl') namespace[None] = CitationStylesElement namespace.update(dict([(cls.__name__.replace('_', '-').lower(), cls) for cls in CitationStylesElement.__subclasses__()])) self.parser = etree.XMLParser(remove_comments=True, encoding='UTF-8', no_network=True) self.parser.set_element_class_lookup(lookup) self.xml = etree.parse(f, self.parser)#, base_url=".") if validate: self.schema = etree.RelaxNG(etree.parse(SCHEMA_PATH)) if not self.schema.validate(self.xml): err = self.schema.error_log #raise Exception("XML file didn't pass schema validation:\n%s" % err) warn("XML file didn't pass schema validation:\n%s" % err) # TODO: proper error reporting self.root = self.xml.getroot() class CitationStylesLocale(CitationStylesXML): def __init__(self, locale, validate=True): locale_path = os.path.join(LOCALES_PATH, 'locales-{}.xml'.format(locale)) try: super(CitationStylesLocale, self).__init__(locale_path, validate=validate) except IOError: raise ValueError("'{}' is not a known locale".format(locale)) class CitationStylesStyle(CitationStylesXML): def __init__(self, style, locale=None, validate=True): style_src = None try: # lxml can take file-like objects, so check if we are dealing with # strings first if not isinstance(style, str): pass # pass through for a generic handling below # It could still be a URL etc, first check if style is a path that exists elif os.path.exists(style): style_src = style else: # Try bundled styles bundled_path = os.path.join(STYLES_PATH, f'{style}.csl') if os.path.exists(bundled_path): style_src = bundled_path else: # Try to load from citeproc-py-styles if available try: import citeproc_styles except ImportError: # citeproc-py-styles not installed, raise with helpful message raise ValueError( f"'{style}' not found in bundled styles ({STYLES_PATH}). " f"To access more styles, install the citeproc-py-styles package with: " f"pip install citeproc-py-styles" ) try: from citeproc_styles import get_style_filepath style_src = get_style_filepath(style) except (KeyError, FileNotFoundError): # Style not found in citeproc-py-styles raise ValueError( f"'{style}' not found in bundled styles ({bundled_path}) " f"or in citeproc-py-styles package" ) except TypeError: pass if style_src is None: if style: # Assume it's a file-like object or string containing XML data style_src = style else: # If we couldn't find the style anywhere, raise an error raise ValueError(f"'{style}' is not a known style") try: super(CitationStylesStyle, self).__init__( style_src, validate=validate) except IOError: raise ValueError(f"'{style}' is not a known style") if locale is None: locale = self.root.get('default-locale', 'en-US') self.root.set_locale_list(locale, validate=validate) def has_bibliography(self): return self.root.bibliography is not None def render_citation(self, citation, cites, callback=None): return self.root.citation.render(citation, cites, callback) def sort_bibliography(self, citation_items): return self.root.bibliography.sort(citation_items) def render_bibliography(self, citation_items): return self.root.bibliography.render(citation_items) class CitationStylesBibliography(object): def __init__(self, style, source, formatter=html): self.style = style self.source = source self.formatter = self.style.root.formatter = formatter self.keys = [] self.items = [] self._cites = [] def register(self, citation, callback=None): citation.bibliography = self for item in citation.cites: if item.key in self.source: if item.key not in self.keys: self.keys.append(item.key) self.items.append(item) elif callback is not None: callback(item) def sort(self): self.items = self.style.sort_bibliography(self.items) self.keys = [item.key for item in self.items] def cite(self, citation, callback): return self.style.render_citation(citation, self._cites, callback) def bibliography(self): return self.style.render_bibliography(self.items) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/citeproc/model.py0000644000175100017510000016575315234654005017071 0ustar00runnerrunner import re import unicodedata import os from functools import cmp_to_key from glob import glob from operator import itemgetter from lxml import etree from . import NAMES, DATES, NUMBERS, PRIMARY_DIALECTS, LANGUAGE_NAMES from .source import VariableError, DateRange, LiteralDate from .string import String, join # Base class class SomewhatObjectifiedElement(etree.ElementBase): nsmap = {'cs': 'http://purl.org/net/xbiblio/csl', 'xml': 'http://www.w3.org/XML/1998/namespace'} # TODO: what about multiple instances of the same name? def __getattr__(self, name): return self.find('cs:' + name, self.nsmap) class CitationStylesElement(SomewhatObjectifiedElement): _default_options = {# global options 'initialize-with-hyphen': 'true', 'page-range-format': None, 'demote-non-dropping-particle': 'display-and-sort', # inheritable name(s) options 'and': None, 'delimiter-precedes-et-al': 'contextual', 'delimiter-precedes-last': 'contextual', 'et-al-min': 0, 'et-al-use-first': 1, 'et-al-subsequent-min': 0, 'et-al-subsequent-use-first': 1, 'et-al-use-last': 'false', 'initialize-with': None, 'name-as-sort-order': None, 'sort-separator': ', ', 'name-form': 'long', 'name-delimiter': ', ', 'names-delimiter': ''} def get_root(self): return self.getroottree().getroot() def xpath_search(self, expression): return self.xpath(expression, namespaces=self.nsmap) @property def loc(self): full_xpath = self.getroottree().getpath(self) xpath = '' tree = [] for i, node in enumerate(full_xpath.split('/')[1:]): xpath += '/' + node element = self.xpath(xpath)[0] namespace, tag = element.tag.split('}', 1) attribs = ''.join(' {}="{}"'.format(key, value) for key, value in element.attrib.items()) tree.append('{:>4}: {}<{}{}>'.format(element.sourceline, i * ' ', tag, attribs)) print('\n'.join(tree)) def get_option(self, name): return self.get(name, self._default_options[name]) def get_macro(self, name): expression = "cs:macro[@name='{}'][1]".format(name) return self.get_root().xpath_search(expression)[0] def get_layout(self): return self.xpath_search('./ancestor-or-self::cs:layout[1]')[0] def get_formatter(self): if isinstance(self.get_root(), Locale): return self.get_root().style.formatter else: return self.get_root().formatter def preformat(self, text): return self.get_formatter().preformat(text) def unicode_character(self, name): return self.preformat(unicodedata.lookup(name)) def render(self, *args, **kwargs): return self.markup(self.process(*args, **kwargs)) # TODO: Locale methods def get_term(self, name, form=None, fallback_locale=True, zero_padded=False): lg_key = "{http://www.w3.org/XML/1998/namespace}lang" if isinstance(self.get_root(), Locale): return self.get_root().get_term(name, form) else: locales = self.get_root().locales if not fallback_locale and len(locales) > 1: main_locale = locales[0] main_lg = main_locale.attrib.get(lg_key, None) if main_lg: new_locales = [main_locale] for locale in locales[1::]: if locale.get(lg_key, main_lg) == main_lg: new_locales.append(locale) locales = new_locales for locale in locales: try: return locale.get_term(name, form, zero_padded=zero_padded) except IndexError: # TODO: create custom exception continue def get_plural_term(self, name, *args, **kwargs): """ Return plural form of the term or empty string if no term found """ if (term := self.get_term(name, *args, **kwargs)) is not None: return term.multiple return String('') def get_single_term(self, name, *args, **kwargs): """ Return singular form of the term or empty string if no term found """ if (term := self.get_term(name, *args, **kwargs)) is not None: return term.single return String('') def get_date(self, form): for locale in self.get_root().locales: try: return locale.get_date(form) except IndexError: continue def get_locale_option(self, name): for locale in self.get_root().locales: try: return locale.get_option(name) except IndexError: continue # Top level elements class Style(CitationStylesElement): def set_locale_list(self, output_locale, validate=True): """Set up list of locales in which to search for localizable units""" from .frontend import CitationStylesLocale self.locales = [] system_locales_added = set() def add_instyle_locale(locale): expr = ('./cs:locale[@xml:lang="{}"]'.format(locale) if locale else './cs:locale[not(@xml:lang)]') results = self.xpath_search(expr) if results: locale_element, = results self.locales.append(locale_element) def add_system_locale(locale): if locale not in system_locales_added: csl_locale = CitationStylesLocale(locale, validate=validate) self.locales.append(csl_locale.root) system_locales_added.add(locale) # 1) (in-style locale) chosen dialect add_instyle_locale(output_locale) # 2) (in-style locale) matching language language = output_locale.split('-')[0] add_instyle_locale(language) # 3) (in-style locale) no language set add_instyle_locale(None) # 4) (locale files) chosen or primary dialect if output_locale in LANGUAGE_NAMES: add_system_locale(output_locale) # 5) (locale files) fall back to primary language dialect if language in PRIMARY_DIALECTS: add_system_locale(PRIMARY_DIALECTS[language]) # 6) (locale files) default locale (en-US) add_system_locale('en-US') for locale in self.locales: locale.style = self class Locale(CitationStylesElement): _default_options = {'limit-day-ordinals-to-day-1': 'false', 'punctuation-in-quote': 'false'} def get_term(self, name, form=None, zero_padded=False): attributes = "@name='{}'".format(name) if form is not None: attributes += " and @form='{}'".format(form) else: attributes += " and not(@form)" if zero_padded: attributes += "and not(@match='whole-number')" attributes += "and not(@match='last-two-digits')" expr = './cs:term[{}]'.format(attributes) try: return self.terms.xpath_search(expr)[0] except AttributeError: raise IndexError def get_date(self, form): expr = "./cs:date[@form='{}']".format(form) return self.xpath_search(expr)[0] def get_option(self, name): options = self.find('cs:style-options', self.nsmap) if options is None: raise IndexError return options.get(name, self._default_options[name]) def get_formatter(self): return self.style.formatter class FormattingInstructions(object): def get_option(self, name): if name in self._default_options: return self.get(name, self._default_options[name]) else: return self.get(name, self.get_root().get_option(name)) def render(self, reference): raise NotImplementedError class Citation(FormattingInstructions, CitationStylesElement): _default_options = {# disambiguation 'disambiguate-add-names': False, 'disambiguate-add-givenname': False, 'givenname-disambiguation-rule': 'all-names', 'disambiguate-add-year-suffix': False, # citation collapsing 'collapse': None, 'year-suffix-delimiter': None, 'after-collapse-delimiter': None, # note distance 'near-note-distance': 5} def render(self, citation, cites, callback): self.cites = cites return self.layout.render_citation(citation, callback) class Bibliography(FormattingInstructions, CitationStylesElement): _default_options = {# whitespace 'hanging-indent': False, 'second-field-align': None, 'line-spacing': 1, 'entry-spacing': 1, # reference grouping 'subsequent-author-substitute': None} def sort(self, citation_items): return self.layout.sort_bibliography(citation_items) def render(self, citation_items): return self.layout.render_bibliography(citation_items) # Style behavior class Formatted(object): def format(self, string): if isinstance(string, (int, float)): string = str(string) text = self.font_style(string) text = self.font_variant(text) text = self.font_weight(text) text = self.text_decoration(text) text = self.vertical_align(text) return text def font_style(self, text): formatter = self.get_formatter() font_style = self.get('font-style', 'normal') if font_style == 'normal': formatted = text elif font_style == 'italic': formatted = formatter.Italic(text) elif font_style == 'oblique': formatted = formatter.Oblique(text) return formatted def font_variant(self, text): formatter = self.get_formatter() font_variant = self.get('font-variant', 'normal') if font_variant == 'normal': formatted = text elif font_variant == 'small-caps': formatted = formatter.SmallCaps(text) return formatted def font_weight(self, text): formatter = self.get_formatter() font_weight = self.get('font-weight', 'normal') if font_weight == 'normal': formatted = text elif font_weight == 'bold': formatted = formatter.Bold(text) elif font_weight == 'light': formatted = formatter.Light(text) return formatted def text_decoration(self, text): formatter = self.get_formatter() text_decoration = self.get('text-decoration', 'none') if text_decoration == 'none': formatted = text elif text_decoration == 'underline': formatted = formatter.Underline(text) return formatted def vertical_align(self, text): formatter = self.get_formatter() vertical_align = self.get('vertical-align', 'baseline') if vertical_align == 'baseline': formatted = text elif vertical_align == 'sup': formatted = formatter.Superscript(text) elif vertical_align == 'sub': formatted = formatter.Subscript(text) return formatted class Affixed(object): def wrap(self, string): if string is not None: prefix = self.get('prefix', '') suffix = self.get('suffix', '') return prefix + string + suffix return None class Delimited(object): def join(self, strings, default_delimiter=''): delimiter = self.get('delimiter', default_delimiter) try: text = join((s for s in strings if s is not None), delimiter) except: text = String('') return text class Displayed(object): pass class Quoted(object): def quote(self, string): piq = self.get_locale_option('punctuation-in-quote').lower() == 'true' if self.get('quotes', 'false').lower() == 'true': open_quote = self.get_single_term(name='open-quote') close_quote = self.get_single_term(name='close-quote') string = open_quote + string + close_quote ## quoted_string = QuotedString(string, open_quote, close_quote, piq) return string class StrippedPeriods(object): def strip_periods(self, string): strip_periods = self.get('strip-periods', 'false').lower() == 'true' if strip_periods: string = string.replace('.', '') return string class TextCased(object): _stop_words = ['a', 'an', 'and', 'as', 'at', 'but', 'by', 'down', 'for', 'from', 'in', 'into', 'nor', 'of', 'on', 'onto', 'or', 'over', 'so', 'the', 'till', 'to', 'up', 'via', 'with', 'yet'] def case(self, text, language=None): text_case = self.get('text-case') if text_case is not None: if language != 'en' and text_case == 'title': return text if text_case == 'lowercase': text = text.lower() elif text_case == 'uppercase': text = text.upper() elif text_case == 'capitalize-first': text = text.capitalize_first() elif text_case == 'capitalize-all': output = [] for word in text.words(): word = word.capitalize_first() output.append(word) text = ' '.join(output) elif text_case == 'title': output = [] prev = ':' #This ensures first word is capitilized for word in text.words(): if word.islower() and (str(word) not in self._stop_words or prev in (':', '.')): word = word.capitalize_first() elif word.islower(): #Lowercase stop words word = word.soft_lower() prev = word[-1] output.append(word) text = ' '.join(output) elif text_case == 'sentence': output = [] for i, word in enumerate(text.words()): if not text.isupper() and not word.isupper(): word = word.soft_lower() if i == 0: word = word.capitalize_first() output.append(word) text = ' '.join(output) return text # Locale elements class Term(CitationStylesElement): @property def single(self): try: text = self.find('cs:single', self.nsmap).text except AttributeError: text = self.text text = self.preformat(text or '') return String(text) @property def multiple(self): try: text = self.find('cs:multiple', self.nsmap).text except AttributeError: text = self.text text = self.preformat(text or '') return String(text) # Sorting elements class Sort(CitationStylesElement): def sort(self, items, context): # custom sort function to push items with None keys to bottom def multi_key_sort(items, keys, descending): lst = zip(items, *keys) comparers = [(itemgetter(i + 1), descending[i]) for i in range(len(keys))] def mycmp(left, right): for getter, desc in comparers: left_key, right_key = getter(left), getter(right) if left_key is not None and right_key is not None: try: left_key = str(left_key.lower()) right_key = str(right_key.lower()) except AttributeError: pass try: left_key, right_key = (int(str(left_key)), int(str(right_key))) except ValueError: pass result = (left_key > right_key) - (left_key < right_key) if result: return -1 * result if desc else result elif left_key is not None: return -1 elif right_key is not None: return 1 else: continue else: return 0 sorted_lst = sorted(lst, key=cmp_to_key(mycmp)) return [item[0] for item in sorted_lst] sort_descending = [] sort_keys = [] for key in self.findall('cs:key', self.nsmap): descending = key.get('sort', 'ascending').lower() == 'descending' sort_descending.append(descending) sort_keys.append(key.sort_keys(items, context)) return multi_key_sort(items, sort_keys, sort_descending) class Key(CitationStylesElement): def sort_keys(self, items, context): if 'variable' in self.attrib: variable = self.get('variable').replace('-', '_') if variable in NAMES: sort_keys = [self._format_name(item, variable) for item in items] elif variable in DATES: sort_keys = [] for item in items: date = item.reference.get(variable) if date is not None: sort_keys.append(date.sort_key()) else: sort_keys.append(None) elif variable in NUMBERS: sort_keys = [self._format_number(item, variable) for item in items] elif variable == 'citation_number': sort_keys = [item.number for item in items] else: sort_keys = [item.get_field(variable) for item in items] elif 'macro' in self.attrib: layout = context.get_layout() # override name options sort_options = {'name-as-sort-order': 'all'} for option in ('names-min', 'names-use-first', 'names-use-last'): if option in self.attrib: name = option.replace('names', 'et-al') sort_options[name] = self.get(option) macro = self.get_macro(self.get('macro')) sort_keys = [] for item in items: layout.repressed = {} sort_key = macro.render(item, context=context, sort_options=sort_options) sort_keys.append(sort_key) return sort_keys def _format_name(self, item, variable): names = item.reference.get(variable) if names is not None: output = [] for name in names: demote_ndp = self.get_root().get('demote-non-dropping-particle', 'display-and-sort').lower() sort_separator = self._default_options['sort-separator'] # TODO: encapsulate in function (to share with Name) given, family, dp, ndp, suffix = name.parts() if demote_ndp in ('sort-only', 'display-and-sort'): given = ' '.join([n for n in (given, dp, ndp) if n]) else: family = ' '.join([n for n in (ndp, family) if n]) given = ' '.join([n for n in (given, dp) if n]) order = family, given, suffix output.append(sort_separator.join([n for n in order if n])) return ';'.join(output) else: return None def _format_number(self, item, variable): date = item.reference.get(variable) if date is not None: try: return str(Number.re_numeric.match(date).group(1)) except AttributeError: return date else: return None # Rendering elements class Parent(object): def calls_variable(self): return any([child.calls_variable() for child in self.getchildren()]) def process_children(self, item, **kwargs): output = [] for child in self.iterchildren(): try: text = child.process(item, **kwargs) if text is not None: output.append(text) except VariableError: pass if output: return ''.join(output) else: return None def render_children(self, item, delimiter='', **kwargs): # `delimiter` is the delimiter inherited from an enclosing element (a # `cs:group`). `cs:choose` is transparent, so this delimiter has to be # threaded through `cs:if`/`cs:else-if`/`cs:else` to delimit their # rendered children (and any nested `cs:choose`). output = [] for child in self.iterchildren(): try: if isinstance(child, Choose): text = child.render(item, delimiter=delimiter, **kwargs) else: text = child.render(item, **kwargs) if text is not None: output.append(text) except VariableError: pass if output: return join(output, delimiter) else: return None class Macro(CitationStylesElement, Parent): def process(self, item, context=None, sort_options=None): return self.process_children(item, context=context, sort_options=sort_options) def render(self, item, context=None, sort_options=None): return self.render_children(item, context=context, sort_options=sort_options) class Layout(CitationStylesElement, Parent, Formatted, Affixed, Delimited): def render_citation(self, citation, callback): # first sort citation items according to bibliography order bibliography = citation.bibliography good_cites = [cite for cite in citation.cites if not cite.is_bad()] bad_cites = [cite for cite in citation.cites if cite.is_bad()] good_cites.sort(key=lambda item: bibliography.keys.index(item.key)) # sort using citation/sort element if self.getparent().sort is not None: good_cites = self.getparent().sort.sort(good_cites, self) out = [] for item in good_cites: self.repressed = {} prefix = item.get('prefix', '') suffix = item.get('suffix', '') try: output = self.render_children(item) if output is not None: text = prefix + output + suffix out.append(text) self.getparent().cites.append(item) except VariableError: pass for item in bad_cites: callback_value = callback(item) out.append(callback_value or '{}?'.format(item.key)) return self.format(self.wrap(self.join(out))) def sort_bibliography(self, citation_items): sort = self.getparent().find('cs:sort', self.nsmap) if sort is not None: citation_items = sort.sort(citation_items, self) return citation_items def render_bibliography(self, citation_items): output_items = [] for item in citation_items: self.repressed = {} text = self.format(self.wrap(self.render_children(item))) if text is not None: output_items.append(text) return output_items class FormatNumber(object): def _process(self, value, variable): page_range_delimiter = self.get_single_term(name='page-range-delimiter') \ if variable.startswith('page') else None range_delimiter = (page_range_delimiter or self.unicode_character('EN DASH')) en_dash = unicodedata.lookup('EN DASH') def format_number_or_range(item): try: first, last = (number.strip() for number in item.replace(en_dash, '-').split('-')) except ValueError: return self.format_number(item.strip()) first = self.format_number(first) if variable == 'page-first': return first last = self.format_number(self._format_last_page(first, last) if variable == 'page' else last) return join((first, last), range_delimiter) amp_delimiter = ' ' + self.unicode_character('AMPERSAND') + ' ' return join((join((format_number_or_range(item) for item in comma_item.split('&')), amp_delimiter) for comma_item in str(value).split(',')), delimiter=', ') def _format_last_page(self, first, last): def find_common(first, last): count = 0 for count, (f, l) in enumerate(zip(first, last)): if f != l: return count return count + 1 range_format = self.get_root().get_option('page-range-format') common = find_common(first, last) if range_format in ('chicago', 'chicago-15', 'chicago-16'): m = re.search(r'\d+', first) if not m: return last first_number = int(m.group()) if first_number < 100 or first_number % 100 == 0: range_format = 'expanded' elif len(first) >= 4 and common < 2: range_format = 'expanded' elif first_number % 100 in range(1, 10): range_format = 'minimal' elif first_number % 100 in range(10, 100): range_format = 'minimal-two' index = 0 # 'expanded' format (and default): return the full last page if range_format == 'minimal': index = common elif range_format == 'minimal-two': index = min(common, len(first) - 2) return last[index:] def format_number(self, number): return str(number) class Text(CitationStylesElement, FormatNumber, Formatted, Affixed, Quoted, TextCased, StrippedPeriods): generated_variables = ('year-suffix', 'citation-number') def calls_variable(self): if 'variable' in self.attrib: return self.get('variable') not in self.generated_variables elif 'macro' in self.attrib: return self.get_macro(self.get('macro')).calls_variable() else: return False def render(self, *args, **kwargs): text, language = self.process(*args, **kwargs) return self.markup(text, language) def process(self, item, context=None, **kwargs): if context is None: context = self try: language = item.reference.language[:2] except VariableError: language = self.get_root().get('default-locale', 'en')[:2] if 'variable' in self.attrib: text = self._variable(item, context) elif 'macro' in self.attrib: text = self.get_macro(self.get('macro')).render(item, context) elif 'term' in self.attrib: text = self._term(item) elif 'value' in self.attrib: text = String(self.preformat(self.get('value'))) return text, language def _variable(self, item, context): variable = self.get('variable') repressed = context.get_layout().repressed if self.tag in repressed and variable in repressed[self.tag]: return None if self.get('form') == 'short': short_variable = variable + '-short' if short_variable.replace('-', '_') in item.reference: variable = short_variable if variable.startswith('page'): text = self._process(item.reference.page, variable) elif variable == 'citation-number': text = item.number elif variable == 'locator': en_dash = self.unicode_character('EN DASH') text = str(item.locator.identifier).replace('-', en_dash) else: text = item.reference[variable.replace('-', '_')] return text def _term(self, item): form = self.get('form', 'long') plural = self.get('plural', 'false').lower() == 'true' variable = self.get('term') if plural: text = self.get_plural_term(name=variable, form=form if form != 'long' else None) else: text = self.get_single_term(name=variable, form=form if form != 'long' else None) return text def markup(self, text, language): if text: tmp = self.format(self.case(self.strip_periods(text), language)) return self.wrap(self.quote(tmp)) else: return None class Date(CitationStylesElement, Parent, Formatted, Affixed, Delimited): def calls_variable(self): return True def is_locale_date(self): expr = './ancestor::cs:locale[1]' try: self.xpath_search(expr)[0] return True except IndexError: return False def render_single_date(self, date, show_parts=None, context=None): form = self.get('form') if context != self: parts = self.parts(date, show_parts, context) else: parts = self.parts(date, show_parts) if parts: style_context = context if self.is_locale_date() else self return style_context.join(parts) else: return None def render_date_range(self, date_range, show_parts=None, context=None): same_show_parts = [] if date_range.end.is_nil(): same = None diff_begin = self.render_single_date(date_range.begin, show_parts, context) diff_end = '' else: if date_range.begin.year == date_range.end.year: show_parts.remove('year') same_show_parts.append('year') try: if ('month' in show_parts and date_range.begin.month == date_range.end.month): show_parts.remove('month') same_show_parts.append('month') try: if ('day' in show_parts and date_range.begin.day == date_range.end.day): show_parts.remove('day') same_show_parts.append('day') except AttributeError: show_parts.remove('day') except AttributeError: show_parts.remove('month') same = self.render_single_date(date_range.end, same_show_parts, context) diff_begin = self.render_single_date(date_range.begin, show_parts, context) diff_end = self.render_single_date(date_range.end, show_parts, context) if not (diff_begin and diff_begin): return None diff = (diff_begin.rstrip() + self.unicode_character('EN DASH') + diff_end) if same: text = context.join([diff, same.rstrip()]) else: text = diff return text def process(self, item, variable=None, show_parts=None, context=None, **kwargs): if variable is None: variable = self.get('variable') if show_parts is None: show_parts = ['year', 'month', 'day'] if context is None: context = self form = self.get('form') date_parts = self.get('date-parts') if not self.is_locale_date() and form is not None: localized_date = self.get_date(form) if date_parts is not None: show_parts = date_parts.split('-') return localized_date.render(item, variable, show_parts=show_parts, context=self) else: date_or_range = item.reference[variable.replace('-', '_')] if not date_or_range: text = None elif isinstance(date_or_range, LiteralDate): text = date_or_range.text elif isinstance(date_or_range, DateRange): text = self.render_date_range(date_or_range, show_parts, context) else: text = self.render_single_date(date_or_range, show_parts, context) if text is not None: style_context = context if self.is_locale_date() else self return style_context.wrap(text) else: return None def parts(self, date, show_parts, context=None): output = [] for part in self.iterchildren(): if part.get('name') in show_parts: try: part_text = part.render(date, context) if part_text is not None: output.append(part_text) except VariableError: pass return output def markup(self, text): # TODO: fix return text class Date_Part(CitationStylesElement, Formatted, Affixed, TextCased, StrippedPeriods): def process(self, date, context=None): name = self.get('name') range_delimiter = self.get('range-delimiter', '-') attrib = self.attrib if context is None: context = self try: expr = './cs:date-part[@name="{}"]'.format(name) attrib.update(dict(context.xpath_search(expr)[0].attrib)) except (AttributeError, IndexError): pass if name == 'day': form = self.get('form', 'numeric') if (form == 'ordinal' and self.get_locale_option('limit-day-ordinals-to-day-1') .lower() == 'true' and date.day > 1): form = 'numeric' if form == 'numeric': text = date.day elif form == 'numeric-leading-zeros': text = '{:02}'.format(date.day) elif form == 'ordinal': text = to_ordinal(date.day, context) elif name == 'month': form = self.get('form', 'long') strip_periods = self.get('form', False) try: index = date.month term = 'month' except VariableError: index = date.season term = 'season' if form == 'long' or form == 'short': text = context.get_single_term(name='{}-{:02}'.format(term, index), form='short' if form == 'short' else None) else: assert term == 'month' if form == 'numeric': text = '{}'.format(index) elif form == 'numeric-leading-zeros': text = '{:02}'.format(index) elif name == 'year': form = self.get('form', 'long') if form == 'long': text = str(abs(date.year)) if date.year < 0: text += context.get_single_term(name='bc') elif date.year < 1000: text += context.get_single_term(name='ad') elif form == 'short': text = str(date.year)[-2:] return text def markup(self, text): if text: return self.wrap(self.format(self.case(self.strip_periods(text)))) else: return None class Number(CitationStylesElement, FormatNumber, Formatted, Affixed, Displayed, TextCased, StrippedPeriods): def calls_variable(self): return True def process(self, item, context=None, **kwargs): variable = self.get('variable') if variable == 'locator': try: variable = item.locator.label value = item.locator.identifier except KeyError: return None elif variable == 'page-first': value = item.reference.page else: value = item.reference[variable] return self._process(value, variable) def format_number(self, number): form = self.get('form', 'numeric') try: number = int(number) except ValueError: return number if form == 'numeric': text = str(number) elif form == 'ordinal' or form == 'long-ordinal' and number > 10: text = to_ordinal(number, self) elif form == 'long-ordinal': text = self.get_single_term(name='long-ordinal-{:02}'.format(number)) elif form == 'roman': text = romanize(number).lower() return text def markup(self, text): if text: return self.wrap(self.format(self.case(self.strip_periods(text)))) else: return None class Names(CitationStylesElement, Parent, Formatted, Affixed, Delimited): def calls_variable(self): return True def get_parent_delimiter(self, context=None): expr = './ancestor::*[self::cs:citation or self::cs:bibliography][1]' if context is None: context = self parent = context.xpath_search(expr)[0] return parent.get_option('names-delimiter') def substitute(self): expr = './cs:substitute[1]' try: result = self.xpath_search(expr)[0] except IndexError: result = None return result def process(self, item, names_context=None, context=None, **kwargs): if context is None: context = self if names_context is None: names_context = self roles = self.get('variable').split() try: ed_trans = (set(roles) == set(['editor', 'translator']) and item.reference.editor == item.reference.translator and self.get_term('editortranslator').getchildren()) if ed_trans: roles = ['editor'] except VariableError: ed_trans = False output = [] for role in roles: if role in item.reference: name_elem = names_context.name if name_elem is None: name_elem = Name() names_context.insert(0, name_elem) text = name_elem.render(item, role, context=context, **kwargs) plural = len(item.reference[role]) > 1 try: if ed_trans: role = 'editortranslator' label_element = names_context.label label = label_element.render(item, role, plural, **kwargs) if label is not None: if label_element is names_context.getchildren()[0]: text = label + text else: text = text + label except AttributeError: pass output.append(text) if output: try: total = sum(output) except TypeError: is_int = False else: is_int = isinstance(total, int) if is_int: text = str(total) if total > 0 else None else: text = self.join(output, self.get_parent_delimiter(context)) else: substitute = self.substitute() if substitute is not None: text = substitute.render(item, context=context, **kwargs) try: return text except NameError: raise VariableError def markup(self, text): if text: return self.wrap(self.format(text)) else: return None class Name(CitationStylesElement, Formatted, Affixed, Delimited): def get_option(self, name, context=None, sort_options=None): try: value = sort_options[name] except (TypeError, KeyError): expr = ('./ancestor::*[self::cs:citation or ' 'self::cs:bibliography][1]') if context is None: context = self parent = context.xpath_search(expr)[0] if name in ('form', 'delimiter'): value = self.get(name, parent.get_option('name-' + name)) else: value = self.get(name, parent.get_option(name)) if name in ('initialize-with-hyphen', 'et-al-use-last'): value = value.lower() == 'true' elif name.startswith('et-al'): value = int(value) return value def et_al(self): expr = './following-sibling::cs:et-al[1]' try: result = self.xpath_search(expr)[0].render() except IndexError: result = self.get_single_term(name='et-al') return result def process(self, item, variable, context=None, sort_options=None, **kwargs): def get_option(name): return self.get_option(name, context, sort_options) and_ = get_option('and') delimiter = get_option('delimiter') delimiter_precedes_et_al = get_option('delimiter-precedes-et-al') delimiter_precedes_last = get_option('delimiter-precedes-last') et_al_min = get_option('et-al-min') et_al_use_first = get_option('et-al-use-first') et_al_subseq_min = get_option('et-al-subsequent-min') et_al_subseq_use_first = get_option('et-al-subsequent-use-first') et_al_use_last = get_option('et-al-use-last') initialize_with = get_option('initialize-with') name_as_sort_order = get_option('name-as-sort-order') sort_separator = get_option('sort-separator') form = get_option('form') demote_ndp = get_option('demote-non-dropping-particle') def format_name_parts(given, family): for part in self.findall('cs:name-part', self.nsmap): given, family = part.format_part(given, family) return given, family names = item.reference.get(variable, []) if and_ == 'text': and_term = self.get_single_term(name='and') elif and_ == 'symbol': and_term = self.preformat('&') et_al = self.et_al() output = [] if form == 'count': count = min(len(names), et_al_use_first) output.append(count) return sum(output) else: et_al_truncate = (len(names) > 1 and et_al_min and len(names) >= et_al_min) et_al_last = et_al_use_last and et_al_use_first <= et_al_min - 2 if et_al_truncate: if et_al_last: names = names[:et_al_use_first] + [names[-1]] else: names = names[:et_al_use_first] for i, name in enumerate(names): given, family, dp, ndp, suffix = name.parts() if given is not None and initialize_with is not None: given = self.initialize(given, initialize_with, context) if form == 'long': if (name_as_sort_order == 'all' or (name_as_sort_order == 'first' and i == 0)): if demote_ndp in ('never', 'sort-only'): family = ' '.join([n for n in (ndp, family) if n]) given = ' '.join([n for n in (given, dp) if n]) else: given = ' '.join([n for n in (given, dp, ndp) if n]) given, family = format_name_parts(given, family) order = family, given, suffix text = sort_separator.join([n for n in order if n]) else: family = ' '.join([n for n in (dp, ndp, family) if n]) given, family = format_name_parts(given, family) order = given, family, suffix text = ' '.join([n for n in order if n]) elif form == 'short': family = ' '.join([n for n in (ndp, family) if n]) given, family = format_name_parts(given, family) text = family output.append(text) if et_al_truncate and et_al: if et_al_last: ellipsis = self.unicode_character('horizontal ellipsis') output[-1] = ellipsis + ' ' + output[-1] text = self.join(output, delimiter) elif (delimiter_precedes_et_al == 'always' or (delimiter_precedes_et_al == 'contextual' and len(output) >= 2)): output.append(et_al) text = self.join(output, delimiter) else: text = self.join(output, delimiter) + ' ' + et_al elif and_ is not None and len(output) > 1: text = self.join(output[:-1], ', ') if (delimiter_precedes_last == 'always' or (delimiter_precedes_last == 'contextual' and len(output) > 2)): text = self.join([text, '']) else: text += ' ' text += '{} '.format(and_term) + output[-1] else: text = self.join(output, delimiter) return text def initialize(self, given, mark, context): if self.get_option('initialize-with-hyphen', context): hyphen_parts = given.split('-') else: hyphen_parts = [given.replace('-', ' ')] result_parts = [] for hyphen_part in hyphen_parts: parts = hyphen_part.replace('.', ' ').split() hyphen_result = '' group = [] for part in parts: if part[0].isupper(): group.append(part[0]) else: # don't initialize particles (which aren't capitalized) hyphen_result += mark.join(group) + mark + ' ' + part + ' ' group = [] hyphen_result += mark.join(group) + mark # remove double spaces hyphen_result = ' '.join(hyphen_result.split()) result_parts.append(hyphen_result) return '-'.join(result_parts) def markup(self, text): if text: return self.wrap(self.format(text)) else: return None class Name_Part(CitationStylesElement, Formatted, Affixed, TextCased): def format_part(self, given, family): if self.get('name') == 'given': given = self.wrap(self.format(self.case(given))) elif self.get('name') == 'family': family = self.wrap(self.format(self.case(family))) return given, family class Et_Al(CitationStylesElement, Formatted, Affixed): def process(self): variable = self.get('term', 'et-al') return self.get_single_term(variable) def markup(self, text): if text: return self.wrap(self.format(text)) else: return None class Substitute(CitationStylesElement, Parent): def render(self, item, context=None, **kwargs): for child in self.getchildren(): try: if isinstance(child, Names) and child.name is None: names = self.xpath_search('./parent::cs:names[1]')[0] text = child.render(item, names_context=names, context=context, **kwargs) else: text = child.render(item, context=context, **kwargs) except VariableError: continue if text: self.add_to_repressed_list(child, context) break try: return text except NameError: return None def add_to_repressed_list(self, child, context): layout = context.get_layout() tag_list = layout.repressed.get(child.tag, []) tag_list.append(child.get('variable')) layout.repressed[child.tag] = tag_list class Label(CitationStylesElement, Formatted, Affixed, StrippedPeriods, TextCased): def calls_variable(self): return self.get('variable') == 'locator' def process(self, item, variable=None, plural=None, context=None, **kwargs): if variable is None: variable = self.get('variable') form = self.get('form', 'long') plural_option = self.get('plural', 'contextual') if plural is None: plural = self._is_plural(item) if variable == 'locator' and item.has_locator: variable = item.locator.label if (plural_option == 'contextual' and plural or plural_option == 'always'): text = self.get_plural_term(name=variable, form=form if form != 'long' else None) else: text = self.get_single_term(name=variable, form=form if form != 'long' else None) return text def markup(self, text): if text: return self.wrap(self.format(self.case(self.strip_periods(text)))) else: return None # Content is plural when it holds multiple numbers separated by a list or # range separator (e.g. "1, 2" or "1-3"). A period is not such a separator: # it is part of a single dotted number/version (e.g. "2.0"), which stays # singular ("Version 2.0", not "Versions 2.0"). RE_MULTIPLE_NUMBERS = re.compile(r'\d+[^\d.]+\d+') def _is_plural(self, item): variable = self.get('variable') if variable == 'locator': value = item.locator.identifier else: try: value = item.reference[variable.replace('-', '_')] except VariableError: return False if variable.startswith('number-of') and int(item[variable]) > 1: return True else: return self.RE_MULTIPLE_NUMBERS.search(str(value)) is not None class Group(CitationStylesElement, Parent, Formatted, Affixed, Delimited): def calls_variable(self): return True def process(self, item, context=None, **kwargs): output = [] variable_called = False variable_rendered = False # A `cs:group` delimiter also delimits the children of a transparent # `cs:choose` child, so pass it down (see `Parent.render_children`). delimiter = self.get('delimiter', '') for child in self.iterchildren(): variable_called = variable_called or child.calls_variable() try: if isinstance(child, Choose): child_text = child.render(item, context=context, delimiter=delimiter, **kwargs) else: child_text = child.render(item, context=context, **kwargs) if child_text is not None: output.append(child_text) variable_rendered = (variable_rendered or child.calls_variable()) except VariableError: pass output = [item for item in output if item is not None] success = not variable_called or (variable_called and variable_rendered) if output and success: return self.join(output) else: raise VariableError def markup(self, text): if text: return self.wrap(self.format(text)) else: return None class ConditionFailed(Exception): pass class Choose(CitationStylesElement, Parent): def render(self, item, context=None, delimiter='', **kwargs): # `cs:choose` is transparent: the delimiter of the enclosing element is # forwarded to the children of the matching branch. for child in self.getchildren(): try: return child.render(item, context=context, delimiter=delimiter, **kwargs) except ConditionFailed: continue return None class If(CitationStylesElement, Parent): def render(self, item, context=None, delimiter='', **kwargs): # TODO self.get('disambiguate') results = [] if 'type' in self.attrib: results += self._type(item) if 'variable' in self.attrib: results += self._variable(item) if 'is-numeric' in self.attrib: results += self._is_numeric(item) if 'is-uncertain-date' in self.attrib: results += self._is_uncertain_date(item) if 'locator' in self.attrib: results += self._locator(item) if 'position' in self.attrib: results += self._position(item, context) # TODO: 'match' also applies to individual tests above! if self.get('match') == 'any': result = any(results) elif self.get('match') == 'none': result = not any(results) else: result = all(results) if not result: raise ConditionFailed return self.render_children(item, context=context, delimiter=delimiter, **kwargs) def _type(self, item): return [typ.lower() == item.reference.type for typ in self.get('type').split()] def _variable(self, item): variables = [var.replace('-', '_') for var in self.get('variable').split()] output = [] for variable in variables: if variable == 'locator': output.append('locator' in item) else: output.append(variable in item.reference) return output re_numeric = re.compile(r'^([A-Z]*\d+[A-Z]*)$', re.I) def _is_numeric(self, item): numeric_match = self.re_numeric.match return [var.replace('-', '_') in item.reference and numeric_match(str(item.reference[var.replace('-', '_')])) for var in self.get('is-numeric').split()] def _is_uncertain_date(self, item): result = [] for date in self.get('is-uncertain-date').split(): date_variable = date.replace('-', '_') try: circa = item.reference[date_variable].get('circa', False) except VariableError: circa = False except AttributeError: circa = False result.append(circa) return result def _locator(self, item): return [item.has_locator and var.replace('-', ' ') == item.locator.label for var in self.get('locator').split()] def _position(self, item, context): if context is None: context = self if context.xpath_search('./ancestor::*[self::cs:bibliography]'): return [False] # citation node cites = context.get_layout().getparent().cites last_cite = cites[-1] if cites else None already_cited = item.key in (cite.key for cite in cites) possibly_ibid = (already_cited and item.key == last_cite.key and (item.citation is last_cite.citation or len(last_cite.citation.cites) == 1)) results = [] for position in self.get('position').split(): result = False if position == 'first': result = not already_cited elif position == 'subsequent': result = already_cited elif possibly_ibid and position == 'ibid': result = item.has_locator or not last_cite.has_locator elif possibly_ibid and position == 'ibid-with-locator': result = (item.has_locator and not last_cite.has_locator or (item.has_locator and last_cite.has_locator and item.locator != last_cite.locator)) elif already_cited and position == 'near-note': max_distance = self.get_root().get_option('near-note-distance') citations = 1 last_citation = None for cite in reversed(cites): if item.key == cite.key and citations <= max_distance: result = True break elif cite.citation is not last_citation: citations += 1 last_citation = cite.citation results.append(result) return results class Else_If(If, CitationStylesElement): pass class Else(CitationStylesElement, Parent): def render(self, item, context=None, delimiter='', **kwargs): return self.render_children(item, context=context, delimiter=delimiter, **kwargs) # utility functions def to_ordinal(number, context): def _find_ordinal(fallback_locale): if len(str(number)) == 1: ordinal_term = f'ordinal-{number:02}' else: ordinal_term = f'ordinal-{number}' if (term := context.get_single_term(name=ordinal_term, fallback_locale=fallback_locale, zero_padded=False)): return term ordinal_term = f'ordinal-{int(str(number)[-1]):02}' if (term := context.get_single_term(name=ordinal_term, fallback_locale=fallback_locale, zero_padded=True)): return term return context.get_single_term(name='ordinal', fallback_locale=fallback_locale, zero_padded=False) result = _find_ordinal(fallback_locale=False) if not result: result = _find_ordinal(fallback_locale=True) return str(number) + result def romanize(n): # by Kay Schluehr - from http://billmill.org/python_roman.html numerals = (('M', 1000), ('CM', 900), ('D', 500), ('CD', 400), ('C', 100),('XC', 90),('L', 50),('XL', 40), ('X', 10), ('IX', 9), ('V', 5), ('IV', 4), ('I', 1)) roman = [] for ltr, num in numerals: (k, n) = divmod(n, num) roman.append(ltr * k) return ''.join(roman) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1785944092.7054377 citeproc_py-0.10.4/citeproc/scripts/0000755000175100017510000000000015234654035017070 5ustar00runnerrunner././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/citeproc/scripts/csl_unsorted.py0000755000175100017510000000610715234654005022152 0ustar00runnerrunner#!/usr/bin/env python import os import sys import warnings from optparse import OptionParser # The references are parsed from a BibTeX database, so we import the # corresponding parser. from citeproc.source.bibtex import BibTeX # Import the citeproc-py classes we'll use below. from citeproc import frontend from citeproc import CitationStylesStyle, CitationStylesBibliography from citeproc import formatter from citeproc import Citation, CitationItem def main(): usage = \ """usage: %prog [options] ' Output a formatted bibliography from bibtex file to stdout You might want to put the path to your CSL styles in the `CSL_STYLES_PATH` environment variable with something like (bash shell):: export CSL_STYLES_PATH=$HOME/dev_trees/styles """ parser = OptionParser(usage) parser.add_option('-s', '--style', dest='style', default='harvard-cite-them-right', help='style file', metavar='STYLE_FILE') parser.add_option('-f', '--format', dest='format', default='rst', help='output type', metavar='FORMAT') (options, args) = parser.parse_args() if len(args) != 1: parser.print_usage() sys.exit(1) output_format = options.format try: output_format = getattr(formatter, options.format) except AttributeError: available_formatters = (attr for attr in dir(formatter) if not attr.startswith('__')) print('style should be one of: ' + ', '.join(available_formatters)) sys.exit(1) # Get styles path out of the environment variable env_path = os.environ.get('CSL_STYLES_PATH') if env_path is not None: frontend.STYLES_PATH = env_path # Silence lots of warnings warnings.simplefilter('ignore') # Read bibliography bib_source = BibTeX(args[0]) # load a CSL style (full path or name of style in style path) bib_style = CitationStylesStyle(options.style) # Create the citeproc-py bibliography, passing it the: # * CitationStylesStyle, # * BibliographySource (BibTeX in this case), and # * a formatter (plain, html, or rst) bibliography = CitationStylesBibliography(bib_style, bib_source, output_format) # Processing citations in a document need to be done in two passes as for # some CSL styles, a citation can depend on the order of citations in the # bibliography and thus on citations following the current one. # For this reason, we first need to register all citations with the # CitationStylesBibliography. # Just read every one in key order for name in sorted(bib_source): bibliography.register(Citation([CitationItem(name)])) # In the second pass, CitationStylesBibliography can generate citations. # CitationStylesBibliography.cite() requires a callback function to be # passed along to be called in case a CitationItem's key is not present in # the bibliography. for item in bibliography.bibliography(): print(str(item)) if __name__ == '__main__': main() ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1785944092.705766 citeproc_py-0.10.4/citeproc/source/0000755000175100017510000000000015234654035016701 5ustar00runnerrunner././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/citeproc/source/__init__.py0000644000175100017510000001327215234654005021014 0ustar00runnerrunner # http://sourceforge.net/mailarchive/message.php?msg_id=25355232 # http://dret.net/bibconvert/tex2unicode from warnings import warn from .. import VARIABLES class CustomDict(dict): def __init__(self, args, required=set(), optional=set(), required_or=[]): passed_keywords = set(args.keys()) missing = required - passed_keywords if missing: raise TypeError('The following required arguments are missing: ' + ', '.join(missing)) required_or_merged = set() for required_options in required_or: if not passed_keywords & required_options: raise TypeError('Require at least one of: ' + ', '.join(required_options)) required_or_merged |= required_options unsupported = passed_keywords - required - optional - required_or_merged if unsupported: cls_name = self.__class__.__name__ warn('The following arguments for {} are '.format(cls_name) + 'unsupported: ' + ', '.join(unsupported)) self.update(args) def __setattr__(self, name, value): self[name] = value def __getattr__(self, name): return self[name] def __getitem__(self, key): try: return super(CustomDict, self).__getitem__(key) except KeyError: raise VariableError class Reference(CustomDict): def __init__(self, key, type, **args): self.key = key self.type = type #required_or = [set(csl.VARIABLES)] optional = ({'uri', 'container_uri', 'contributor', 'date'} | set(VARIABLES)) super(Reference, self).__init__(args, optional=optional) def __repr__(self): return '{}({})'.format(self.__class__.__name__, self.key) class VariableError(Exception): pass class Name(CustomDict): def __init__(self, **args): if 'literal' in args: required, optional = {'literal'}, set() else: required = set() optional = {'family', 'given', 'dropping-particle', 'non-dropping-particle', 'suffix'} super(Name, self).__init__(args, required, optional) def parts(self): if 'literal' in self: return (None, self['literal'], None, None, None) else: return (self.get('given'), self.get('family'), self.get('dropping-particle'), self.get('non-dropping-particle'), self.get('suffix')) class DateBase(CustomDict): def __init__(self, args, required=set(), optional=set()): optional = {'circa'} | optional super(DateBase, self).__init__(args, required, optional) # defaults if 'circa' not in self: self['circa'] = False class Date(DateBase): def __init__(self, **args): required = {'year'} optional = {'month', 'day', 'season'} if 'day' in args and 'month' not in args: raise TypeError('When specifying the day, you should also specify ' 'the month') for key, value in args.items(): try: args[key] = int(value) except ValueError: pass super(Date, self).__init__(args, required, optional) def sort_key(self): year = self.year month = self.get('month', 0) day = self.get('day', 0) return '{:05}{:02}{:02}'.format(year + 10000, month, day) def is_nil(self): return (self.year == 0 and self.get('month', 0) == 0 and self.get('day', 0) == 0) class LiteralDate(DateBase): def __init__(self, text, **args): self.text = text super(LiteralDate, self).__init__(args) def sort_key(self): return self.text class DateRange(DateBase): def __init__(self, **args): required = {'begin'} optional = {'end'} super(DateRange, self).__init__(args, required, optional) def sort_key(self): begin = self.begin.sort_key() end = self.get('end', Date(year=0)).sort_key() return begin + '-' + end def __eq__(self, other): # TODO: for sorting raise NotImplementedError class Citation(CustomDict): def __init__(self, cites, **kwargs): for cite in cites: cite.citation = self self.cites = cites super(Citation, self).__init__(kwargs) def __repr__(self): cites = ', '.join([cite.key for cite in self.cites]) return '{}({})'.format(self.__class__.__name__, cites) class CitationItem(CustomDict): def __init__(self, key, bibliography=None, **args): self.key = key.lower() optional = {'locator', 'prefix', 'suffix'} super(CitationItem, self).__init__(args, optional=optional) def __repr__(self): return '{}({})'.format(self.__class__.__name__, self.key) @property def bibliography(self): return self.citation.bibliography @property def reference(self): return self.bibliography.source[self.key] @property def number(self): return self.bibliography.keys.index(self.key) + 1 @property def has_locator(self): return 'locator' in self def get_field(self, field): string = self.reference.get(field) if string is not None: return self.bibliography.formatter.preformat(string) def is_bad(self): return self.key not in self.bibliography.keys class Locator(object): def __init__(self, label, identifier): self.label = label self.identifier = identifier class BibliographySource(dict): def add(self, entry): self[entry.key] = entry from . import bibtex, json ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1785944092.706211 citeproc_py-0.10.4/citeproc/source/bibtex/0000755000175100017510000000000015234654035020156 5ustar00runnerrunner././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/citeproc/source/bibtex/__init__.py0000644000175100017510000000003415234654005022261 0ustar00runnerrunner from .bibtex import BibTeX ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/citeproc/source/bibtex/bibparse.py0000644000175100017510000001564715234654005022331 0ustar00runnerrunner # http://maverick.inria.fr/~Xavier.Decoret/resources/xdkbibtex/bibtex_summary.html # http://www.lsv.ens-cachan.fr/~markey/bibla.php?lang=en class BibTeXEntry(dict): def __init__(self, document_type, attributes): super(BibTeXEntry, self).__init__(attributes) self.document_type = document_type class BibTeXDecodeError(Exception): """Exception raised when the encoding passed to BibTeXParser cannot decode the BibTeX database file.""" def __init__(self, decode_error, line_number): msg = ("'{}' decode error on line {}: {}. Please specify the BibTeX's " "database character encoding when instantiating BibTeXParser." .format(decode_error.encoding, line_number, decode_error.reason)) super(BibTeXDecodeError, self).__init__(msg) self.line_number = line_number self.decode_error = decode_error class BibTeXParser(dict): standard_variables = {'jan': 'January', 'feb': 'February', 'mar': 'March', 'apr': 'April', 'may': 'May', 'jun': 'June', 'jul': 'July', 'aug': 'August', 'sep': 'September', 'oct': 'October', 'nov': 'November', 'dec': 'December'} def __init__(self, file_or_filename, encoding='ascii'): try: self.file = open(file_or_filename, 'rt', encoding=encoding) except TypeError: self.file = file_or_filename self.variables = {} self.preamble = '' self._parse(self.file) self.file.close() def _parse(self, file): while True: try: entry = self._parse_entry(file) if entry is not None: entry_type, key, attributes = entry self[key] = BibTeXEntry(entry_type, attributes) except UnicodeDecodeError as decode_error: # I'm not convinced the following is robust safe_part = decode_error.object[:decode_error.start] line_number = len(safe_part.splitlines()) offset = file.tell() - len(decode_error.object) if offset > 0: file.seek(0) line_number += file.read(offset).count(file.newlines) raise BibTeXDecodeError(decode_error, line_number) except EOFError: break def _parse_entry(self, file): while True: char = file.read(1) if char == '@': break elif char == '': raise EOFError entry_type = '' while True: char = file.read(1) if char in '{(': sentinel = '}' if char == '{' else ')' break entry_type += char if entry_type.lower().startswith('comment'): self._jump_to_next_line(file) return None entry_type = entry_type.strip().lower() if entry_type == 'string': name = self._parse_name(file) value = self._parse_value(file) self.variables[name] = value assert self._eat_whitespace(file) == sentinel return None elif entry_type == 'preamble': self.preamble += self._parse_value(file) assert self._eat_whitespace(file) == sentinel return None key = self._parse_key(file) entry = {} while True: name = self._parse_name(file) value = self._parse_value(file) entry[name] = value char = self._eat_whitespace(file) if char != ',': if char != sentinel: assert char in ' \t\n\r' assert self._eat_whitespace(file) == sentinel break else: restore_point = file.tell() if self._eat_whitespace(file) == sentinel: break file.seek(restore_point) return entry_type.strip().lower(), key, entry def _parse_key(self, file): key = '' char = file.read(1) while char != ',': key += char char = file.read(1) if not char: raise ValueError('End of file while parsing key') return key.strip().lower() def _parse_name(self, file): name = '' char = self._eat_whitespace(file) while True: if char == '=': break name += char char = file.read(1) return name.strip().lower() def _parse_value(self, file): char = self._eat_whitespace(file) if char in '{"': value = self._parse_string(file, char) elif char.isalpha(): value = self._parse_variable(file, char) else: value = self._parse_integer(file, char) restore_position = file.tell() char = self._eat_whitespace(file) if char == '#': value += self._parse_value(file) else: file.seek(restore_position) return value def _parse_string(self, file, opening_character): closing_character = '"' if opening_character == '"' else '}' string = '' depth = 0 while True: char = file.read(1) if not char: raise ValueError('End of file while parsing string value') if char == '{': depth += 1 elif depth == 0 and char == closing_character: break elif char == '}': depth -= 1 string += char return string def _parse_variable(self, file, char): key = '' restore_point = file.tell() while char.isalnum() or char in '-_': key += char restore_point = file.tell() char = file.read(1) file.seek(restore_point) if key.lower() in self.variables: value = self.variables[key.lower()] else: value = self.standard_variables[key.lower()] return value def _parse_integer(self, file, char): integer = '' restore_point = file.tell() while char.isdigit(): integer += char restore_point = file.tell() char = file.read(1) file.seek(restore_point) return int(integer) # TODO: rename to next_token? def _eat_whitespace(self, file): char = file.read(1) while char in ' \t\n\r': char = file.read(1) return char def _jump_to_next_line(self, file): char = '' while char != '\n': restore_point = file.tell() char = file.read(1) file.seek(restore_point) def _split_name(self, name): pass ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/citeproc/source/bibtex/bibtex.py0000644000175100017510000003033515234654005022006 0ustar00runnerrunner import re import unicodedata from warnings import warn from ...types import (ARTICLE, ARTICLE_JOURNAL, BOOK, CHAPTER, MANUSCRIPT, PAMPHLET, PAPER_CONFERENCE, REPORT, THESIS) from ...string import String, MixedString, NoCase from .. import BibliographySource, Reference, Name, Date, DateRange from .bibparse import BibTeXParser from .latex import parse_latex from .latex.macro import NewCommand, Macro class BibTeX(BibliographySource): fields = {'abstract': 'abstract', 'address': 'publisher_place', 'annote': 'annote', 'author': 'author', 'booktitle': 'container_title', 'chapter': 'chapter_number', 'doi': 'DOI', 'edition': 'edition', 'editor': 'editor', # 'howpublished': None, # 'institution': None, 'journal': 'container_title', # 'month': None, 'note': 'note', 'number': 'issue', # 'organization': None, 'pages': 'page', 'pmid': 'PMID', 'publisher': 'publisher', # 'school': None, 'series': 'collection_title', 'title': 'title', # 'type': None, # 'year': None, 'volume': 'volume', # non-standard fields 'isbn': 'ISBN', 'issn': 'ISSN'} types = {# standard entry types 'article': ARTICLE_JOURNAL, 'book': BOOK, 'booklet': PAMPHLET, 'conference': PAPER_CONFERENCE, 'inbook': CHAPTER, 'incollection': ARTICLE_JOURNAL, 'inproceedings': PAPER_CONFERENCE, 'manual': BOOK, 'mastersthesis': THESIS, 'misc': ARTICLE, 'phdthesis': THESIS, 'proceedings': BOOK, 'techreport': REPORT, 'unpublished': MANUSCRIPT, # non-standard entry types 'thesis': THESIS, 'report': REPORT, } def __init__(self, filename, encoding='ascii'): bibtex_database = BibTeXParser(filename, encoding) self.preamble_macros = {} parse_latex(bibtex_database.preamble, {'newcommand': NewCommand(self.preamble_macros), 'mbox': Macro(1, '{0}'), 'cite': Macro(1, 'CITE({0})')}) for key, entry in bibtex_database.items(): self.add(self.create_reference(key, entry)) def _bibtex_to_csl(self, bibtex_entry): csl_dict = {} for field, value in bibtex_entry.items(): try: value = value.strip() except AttributeError: pass try: csl_field = self.fields[field] except KeyError: if field not in ('year', 'month', 'filename'): warn("Unsupported BibTeX field '{}'".format(field)) continue if field in ('number', 'volume'): try: value = int(value) except ValueError: pass elif field == 'pages': value = self._bibtex_to_csl_pages(value) elif field in ('author', 'editor'): value = [name for name in self._parse_author(value)] else: try: value = self._parse_string(value) except TypeError: value = str(value) csl_dict[csl_field] = value return csl_dict @staticmethod def _bibtex_to_csl_pages(value): value = value.replace(' ', '') if '-' in value: try: first, last = value.split('--') except ValueError: first, last = value.split('-') pages = '-'.join((first, last)) else: pages = value[:-1] if value.endswith('+') else value return pages def _bibtex_to_csl_date(self, bibtex_entry): if 'month' in bibtex_entry: begin_dict, end_dict = self._parse_month(bibtex_entry['month']) else: begin_dict, end_dict = {}, {} if 'year' in bibtex_entry: begin_dict['year'], end_dict['year'] \ = self._parse_year(bibtex_entry['year']) if not begin_dict: return None if begin_dict == end_dict: return Date(**begin_dict) else: return DateRange(begin=Date(**begin_dict), end=Date(**end_dict)) def _parse_year(self, year): try: year_str = parse_latex(year, self.preamble_macros) except TypeError: year_str = str(year) if EN_DASH in year_str: begin_year, end_year = year_str.split(EN_DASH) begin_len, end_len = len(begin_year), len(end_year) if end_len < begin_len: end_year = begin_year[:begin_len - end_len] + end_year else: begin_year = end_year = int(year_str) return begin_year, end_year MONTHS = ('jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec') RE_DAY = r'(?P\d+)' RE_MONTH = r'(?P\w+)' @staticmethod def _parse_month(month): def month_name_to_index(name): try: return BibTeX.MONTHS.index(name[:3].lower()) + 1 except ValueError: return int(name) begin = {} end = {} month = month.strip() month = month.replace(', ', '-') if month.isdecimal(): begin['month'] = end['month'] = month elif month.replace('-', '').isalpha(): if '-' in month: begin['month'], end['month'] = month.split('-') else: begin['month'] = end['month'] = month else: m = re.match(BibTeX.RE_DAY + '[ ~]*' + BibTeX.RE_MONTH, month) if m is None: m = re.match(BibTeX.RE_MONTH + '[ ~]*' + BibTeX.RE_DAY, month) begin['day'] = end['day'] = int(m.group('day')) begin['month'] = end['month'] = m.group('month') begin['month'] = month_name_to_index(begin['month']) end['month'] = month_name_to_index(end['month']) return begin, end def _parse_string(self, title): def make_string(string, top_level_group=False): unlatexed = parse_latex(string, self.preamble_macros) fixed_case = top_level_group and not string.startswith('\\') string_cls = NoCase if fixed_case else String return string_cls(unlatexed) output = MixedString() level = 0 string = '' for char in title: if char == '{': if level == 0: if string: output += make_string(string) string = '' level += 1 elif char == '}': level -= 1 if level == 0: output += make_string(string, True) string = '' else: string += char if level != 0: raise SyntaxError('Non-matching braces in "{}"'.format(title)) if string: output += make_string(string) return output def _parse_author(self, authors): csl_authors = [] for author in split_names(authors): first, von, last, jr = parse_name(author) csl_parts = {} for part, csl_label in [(first, 'given'), (von, 'non-dropping-particle'), (last, 'family'), (jr, 'suffix')]: if part is not None: csl_parts[csl_label] = parse_latex(part, self.preamble_macros) name = Name(**csl_parts) csl_authors.append(name) return csl_authors def create_reference(self, key, bibtex_entry): csl_type = self.types[bibtex_entry.document_type] csl_fields = self._bibtex_to_csl(bibtex_entry) csl_date = self._bibtex_to_csl_date(bibtex_entry) if csl_date: csl_fields['issued'] = csl_date return Reference(key, csl_type, **csl_fields) # BibTeX name handling # # references # - BibTeXing by Oren Patashnik (Feb 8, 1988), 4. Helpful Hints, item 18 # (BibTeX 0.99d - http://www.ctan.org/tex-archive/biblio/bibtex/base/btxdoc.pdf) # - A summary of BibTex by Xavier Décoret # (http://maverick.inria.fr/~Xavier.Decoret/resources/xdkbibtex/bibtex_summary.html) # - Tame the BeaST by Nicolas Markey # (http://tug.ctan.org/info/bibtex/tamethebeast/ttb_en.pdf) AND = ' and ' def split_names(string): """Split a string of names separated by 'and' into a list of names.""" brace_level = 0 names = [] last_index = 0 for i in range(len(string)): char = string[i] if brace_level == 0 and string[i:].startswith(AND): names.append(string[last_index:i]) last_index = i + len(AND) elif char == '{': brace_level += 1 elif char == '}': brace_level -= 1 last_name = string[last_index:] if last_name: names.append(last_name) return names def parse_name(name): """Parse a BibTeX name string and split it into First, von, Last and Jr parts. """ parts = split_name(name) if len(parts) == 1: # First von Last first_von_last, = parts index = 0 first, jr = [], [] for word in first_von_last[:-1]: if is_capitalized(word) not in (True, None): break first.append(word) index += 1 von_last = first_von_last[index:] elif len(parts) == 2: # von Last, First jr = [] von_last, first = parts elif len(parts) == 3: # von Last, Jr, First von_last, jr, first = parts von, last = split_von_last(von_last) join = ' '.join return join(first) or None, join(von) or None, join(last), join(jr) or None def split_name(name): """Split a name in into parts delimited by commas (at brace-level 0), and each part into words. Returns a list of of lists of words. """ brace_level = 0 parts = [] current_part = [] word = '' for char in name: if char in ' \t,': if brace_level == 0: if word: current_part.append(word) word = '' if char == ',': parts.append(current_part) current_part = [] continue elif char == '{': brace_level += 1 elif char == '}': brace_level -= 1 word += char if word: current_part.append(word) parts.append(current_part) return parts def is_capitalized(string): """Check if a BibTeX substring is capitalized. A string can be "case-less", in which case `None` is returned. """ brace_level = 0 special_char = False for char, next_char in lookahead_iter(string): if (brace_level == 0 or special_char) and char.isalpha(): return char.isupper() elif char == '{': brace_level += 1 if brace_level == 1 and next_char == '\\': special_char = True elif char == '}': brace_level -= 1 if brace_level == 0: special_char = False return None # case-less def split_von_last(words): """Split "von Last" name into von and Last parts.""" if len(words) > 1 and is_capitalized(words[0]) is False: for j, word in enumerate(reversed(words[:-1])): if is_capitalized(word) not in (True, None): return words[:-j - 1], words[-j - 1:] return [], words def lookahead_iter(iterable): """Iterator that also yields the next item along with each item. The next item is `None` when yielding the last item. """ items = iter(iterable) item = next(items) for next_item in items: yield item, next_item item = next_item yield item, None EN_DASH = unicodedata.lookup('EN DASH') ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1785944092.706559 citeproc_py-0.10.4/citeproc/source/bibtex/latex/0000755000175100017510000000000015234654035021273 5ustar00runnerrunner././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/citeproc/source/bibtex/latex/__init__.py0000644000175100017510000001103315234654005023377 0ustar00runnerrunner import unicodedata from collections import namedtuple from warnings import warn __all__ = ['parse_latex', 'substitute_ligatures'] def parse_latex(string, macros={}): tokens = Tokenizer(string) output = '' for result in dispatch(tokens, macros): output += result return substitute_ligatures(output) Token = namedtuple('Token', ['type', 'value']) TOGGLE_MATH = 'TOGGLE-MATH' WHITESPACE = 'WHITESPACE' CLOSE_SCOPE = 'CLOSE-SCOPE' OPEN_SCOPE = 'OPEN-SCOPE' START_MACRO = 'START-MACRO' CHARACTER = 'CHARACTER' class Tokenizer(object): def __init__(self, string): self.string = string self._tokens = self.tokenize(string) self._next_token = None @staticmethod def tokenize(input_string): for char in input_string: if char == '\\': yield Token(START_MACRO, char) elif char == '{': yield Token(OPEN_SCOPE, char) elif char == '}': yield Token(CLOSE_SCOPE, char) elif char in ' \t\n': yield Token(WHITESPACE, char) elif char == '$': yield Token(TOGGLE_MATH, char) else: yield Token(CHARACTER, char) def __iter__(self): return self def __next__(self): if self._next_token: token = self._next_token self._next_token = None else: token = next(self._tokens) return token next = __next__ def peek(self): if self._next_token is None: self._next_token = next(self._tokens) return self._next_token def eat_whitespace(tokens): while tokens.peek().type == WHITESPACE: next(tokens) class ScopeClosing(Exception): pass def dispatch(tokens, macros, level=0): while True: try: next_token = tokens.peek() except StopIteration: if level > 0: warn("Unbalanced parenthesis in '{}'".format(tokens.string)) break if next_token.type == OPEN_SCOPE: yield handle_scope(tokens, macros, level) elif next_token.type == CLOSE_SCOPE: raise ScopeClosing elif next_token.type == START_MACRO: yield handle_macro(tokens, macros) elif next_token.type == TOGGLE_MATH: yield handle_math(tokens) else: assert next_token.type in (CHARACTER, WHITESPACE) yield next(tokens).value def handle_scope(tokens, macros, level): assert next(tokens).type == OPEN_SCOPE output = '' try: for result in dispatch(tokens, macros, level + 1): output += result except ScopeClosing: assert next(tokens).type == CLOSE_SCOPE return output def parse_argument(tokens, macros, level=0): eat_whitespace(tokens) return next(dispatch(tokens, macros, level)) def handle_macro(tokens, macros): assert next(tokens).type == START_MACRO name = parse_macro_name(tokens) try: macro = MACROS[name] except KeyError: macro = macros[name] return macro.parse_arguments_and_expand(tokens, macros) def parse_macro_name(tokens): token = next(tokens) assert token.type in (CHARACTER, TOGGLE_MATH, WHITESPACE) name = token.value if name.isalpha(): while tokens.peek().type == CHARACTER and tokens.peek().value.isalpha(): name += next(tokens).value eat_whitespace(tokens) return name def handle_math(tokens): assert next(tokens).type == TOGGLE_MATH output = '' for token in tokens: if token.type == START_MACRO: output += token.value token = next(tokens) elif token.type == TOGGLE_MATH: break output += token.value return '$' + output + '$' def substitute_ligatures(string): for chars, ligature in SUBSTITUTIONS.items(): string = string.replace(chars, unicodedata.lookup(ligature)) return string SUBSTITUTIONS = {"~": 'NO-BREAK SPACE', # ligatures defined in Computer Modern (symbol shortcuts) "--": 'EN DASH', "---": 'EM DASH', "''": 'RIGHT DOUBLE QUOTATION MARK', "``": 'LEFT DOUBLE QUOTATION MARK', "!`": 'INVERTED EXCLAMATION MARK', "?`": 'INVERTED QUESTION MARK', ",,": 'DOUBLE LOW-9 QUOTATION MARK', "<<": 'LEFT-POINTING DOUBLE ANGLE QUOTATION MARK', ">>": 'RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK', } from .macro import MACROS ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/citeproc/source/bibtex/latex/macro.py0000644000175100017510000001745415234654005022756 0ustar00runnerrunner# coding: utf-8 import unicodedata from . import (parse_argument, eat_whitespace, parse_macro_name, OPEN_SCOPE, CLOSE_SCOPE, START_MACRO) __all__ = ['MACROS', 'NewCommand', 'Macro'] class MacroBase(object): def parse_arguments(self, tokens): raise NotImplementedError def parse_arguments_and_expand(self, tokens): raise NotImplementedError class NewCommand(MacroBase): r""" \newcommand{cmd}[args]{def} """ def __init__(self, macros): self.macros = macros @staticmethod def _parse_macro_name(tokens): eat_whitespace(tokens) token = next(tokens) in_group = token.type == OPEN_SCOPE if in_group: eat_whitespace(tokens) token = next(tokens) assert token.type == START_MACRO name = parse_macro_name(tokens) if in_group: eat_whitespace(tokens) assert next(tokens).type == CLOSE_SCOPE return name @staticmethod def _parse_optional_arguments(tokens, macros): eat_whitespace(tokens) if tokens.peek().value == '[': next(tokens) num_args = '' for token in tokens: if token.value == ']': break num_args += token.value else: num_args = 0 return int(num_args) def parse_arguments_and_expand(self, tokens, macros): name = self._parse_macro_name(tokens) num_args = self._parse_optional_arguments(tokens, macros) definition = parse_argument(tokens, macros) for i in range(10): definition = definition.replace('#{}'.format(i + 1), '{' + str(i) + '}') self.macros[name] = Macro(num_args, definition) return '' class Macro(object): def __init__(self, num_args, format_string): self.num_args = num_args self.format_string = format_string def parse_arguments_and_expand(self, tokens, macros): args = [parse_argument(tokens, macros) for _ in range(self.num_args)] return self.expand(args) def expand(self, arguments): assert len(arguments) == self.num_args return self.format_string.format(*arguments) class Symbol(Macro): def __init__(self, symbol): super(Symbol, self).__init__(0, symbol) class SymbolByName(Macro): def __init__(self, unicode_symbol_name): unicode_symbol = unicodedata.lookup(unicode_symbol_name) super(SymbolByName, self).__init__(0, unicode_symbol) class Combining(Macro): def __init__(self, unicode_accent_name): unicode_accent = unicodedata.lookup('COMBINING ' + unicode_accent_name) super(Combining, self).__init__(1, '{0}' + unicode_accent) DOTTED_CHARS = {'ı': 'i', 'ȷ': 'j'} def expand(self, arguments): assert len(arguments) == self.num_args accented, rest = arguments[0][0], arguments[0][1:] accented = self.DOTTED_CHARS.get(accented, accented) expanded = super(Combining, self).expand([accented]) return unicodedata.normalize('NFC', expanded) + rest MACROS = { # accents '`': Combining('GRAVE ACCENT'), "'": Combining('ACUTE ACCENT'), '^': Combining('CIRCUMFLEX ACCENT'), '"': Combining('DIAERESIS'), 'H': Combining('DOUBLE ACUTE ACCENT'), '~': Combining('TILDE'), 'c': Combining('CEDILLA'), 'k': Combining('OGONEK'), '=': Combining('MACRON'), 'b': Combining('MACRON BELOW'), '.': Combining('DOT ABOVE'), 'd': Combining('DOT BELOW'), 'r': Combining('RING ABOVE'), 'u': Combining('BREVE'), 'v': Combining('CARON'), # '|': Combining('VERTICAL LINE ABOVE'), # 'h': Combining('HOOK ABOVE'), 'G': Combining('DOUBLE GRAVE ACCENT'), 'U': Combining('DOUBLE VERTICAL LINE ABOVE'), 't': Combining('DOUBLE INVERTED BREVE'), 'textcircled': Combining('ENCLOSING CIRCLE'), # symbols 'o': SymbolByName('LATIN SMALL LETTER O WITH STROKE'), 'O': SymbolByName('LATIN CAPITAL LETTER O WITH STROKE'), 'i': SymbolByName('LATIN SMALL LETTER DOTLESS I'), 'l': SymbolByName('LATIN SMALL LETTER L WITH STROKE'), 'L': SymbolByName('LATIN CAPITAL LETTER L WITH STROKE'), 'oe': SymbolByName('LATIN SMALL LIGATURE OE'), 'OE': SymbolByName('LATIN CAPITAL LIGATURE OE'), 'ae': SymbolByName('LATIN SMALL LETTER AE'), 'AE': SymbolByName('LATIN CAPITAL LETTER AE'), 'aa': SymbolByName('LATIN SMALL LETTER A WITH RING ABOVE'), 'AA': SymbolByName('LATIN CAPITAL LETTER A WITH RING ABOVE'), 'ss': SymbolByName('LATIN SMALL LETTER SHARP S'), 'dh': SymbolByName('LATIN SMALL LETTER ETH'), 'DH': SymbolByName('LATIN CAPITAL LETTER ETH'), 'dj': SymbolByName('LATIN SMALL LETTER D WITH STROKE'), 'DJ': SymbolByName('LATIN CAPITAL LETTER D WITH STROKE'), 'ng': SymbolByName('LATIN SMALL LETTER ENG'), 'NG': SymbolByName('LATIN CAPITAL LETTER ENG'), 'th': SymbolByName('LATIN SMALL LETTER THORN'), 'TH': SymbolByName('LATIN CAPITAL LETTER THORN'), 'emspace': SymbolByName('EM SPACE'), 'enspace': SymbolByName('EN SPACE'), 'dag': SymbolByName('DAGGER'), 'ddag': SymbolByName('DOUBLE DAGGER'), 'dots': SymbolByName('HORIZONTAL ELLIPSIS'), 'ldots': SymbolByName('HORIZONTAL ELLIPSIS'), 'P': SymbolByName('PILCROW SIGN'), 'S': SymbolByName('SECTION SIGN'), 'copyright': SymbolByName('COPYRIGHT SIGN'), 'pounds': SymbolByName('POUND SIGN'), 'guillemotleft': SymbolByName('LEFT-POINTING DOUBLE ANGLE QUOTATION MARK'), 'guillemotright': SymbolByName('RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK'), 'guilsinglleft': SymbolByName('SINGLE LEFT-POINTING ANGLE QUOTATION MARK'), 'guilsinglright': SymbolByName('SINGLE RIGHT-POINTING ANGLE QUOTATION MARK'), 'quotedblbase': SymbolByName('DOUBLE LOW-9 QUOTATION MARK'), 'quotesinglbase': SymbolByName('SINGLE LOW-9 QUOTATION MARK'), 'thinspace': SymbolByName('THIN SPACE'), 'textasciicircum': Symbol('^'), 'textasciitilde': Symbol('~'), 'textasteriskcentered': Symbol('*'), 'textbackslash': Symbol('\\'), 'textbar': Symbol('|'), 'textbraceleft': Symbol('{'), 'textbraceright': Symbol('}'), 'textbullet': SymbolByName('BULLET'), 'textcopyright': SymbolByName('COPYRIGHT SIGN'), 'textdagger': SymbolByName('DAGGER'), 'textdaggerdbl': SymbolByName('DOUBLE DAGGER'), 'textdollar': Symbol('$'), 'textellipsis': SymbolByName('HORIZONTAL ELLIPSIS'), 'textemdash': SymbolByName('EM DASH'), 'textendash': SymbolByName('EN DASH'), 'textexclamdown': SymbolByName('INVERTED EXCLAMATION MARK'), 'textgreater': Symbol('>'), 'textless': Symbol('<'), 'textordfeminine': SymbolByName('FEMININE ORDINAL INDICATOR'), 'textordmasculine': SymbolByName('MASCULINE ORDINAL INDICATOR'), 'textparagraph': SymbolByName('PILCROW SIGN'), 'textperiodcentered': SymbolByName('MIDDLE DOT'), 'textquestiondown': SymbolByName('INVERTED QUESTION MARK'), 'textquotesingle': Symbol("'"), # from the textcomp package 'textquotedbl': Symbol('"'), 'textquotedblleft': SymbolByName('LEFT DOUBLE QUOTATION MARK'), 'textquotedblright': SymbolByName('RIGHT DOUBLE QUOTATION MARK'), 'textquoteleft': SymbolByName('LEFT SINGLE QUOTATION MARK'), 'textquoteright': SymbolByName('RIGHT SINGLE QUOTATION MARK'), 'textregistered': SymbolByName('REGISTERED SIGN'), 'textsection': SymbolByName('SECTION SIGN'), 'textsterling': SymbolByName('POUND SIGN'), 'texttrademark': SymbolByName('TRADE MARK SIGN'), 'textunderscore': Symbol('_'), 'textvisiblespace': SymbolByName('OPEN BOX'), 'TeX': Macro(0, 'TeX'), # escaped characters ' ': Symbol(' '), '&': Symbol('&'), '$': Symbol('$'), '{': Symbol('{'), '}': Symbol('}'), '%': Symbol('%'), '#': Symbol('#'), '_': Symbol('_'), } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/citeproc/source/json.py0000644000175100017510000000630315234654005020223 0ustar00runnerrunner import sys import unicodedata from . import BibliographySource, Reference from . import Name, Date, DateRange, LiteralDate from ..string import String, MixedString, NoCase from .. import NAMES, DATES class CiteProcJSON(BibliographySource): def __init__(self, json_data): for ref in json_data: ref_data = {} for key, value in ref.items(): python_key = key.replace('-', '_') if python_key == 'id': ref_key = str(value).lower() continue elif python_key == 'type': ref_type = value continue elif python_key == 'key': # conflicts with the ref_key, so ignore continue if python_key == 'shortTitle': python_key = 'title_short' if python_key in NAMES: value = self.parse_names(value) elif python_key in DATES: value = self.parse_date(value) elif key not in ('language', ): value = self.parse_string(value) ref_data[python_key] = value self.add(Reference(ref_key, ref_type, **ref_data)) start_tag = '' end_tag = '' def parse_string(self, string): string = str(string) lower_string = string.lower() end = 0 output = MixedString() try: while True: start = lower_string.index(self.start_tag, end) regular = string[end:start] if regular: output += String(regular) end = lower_string.index(self.end_tag, start + 1) start += len(self.start_tag) no_case = string[start:end] output += NoCase(no_case) end += len(self.end_tag) except ValueError: regular = string[end:] if regular: output += String(regular) return output def parse_names(self, json_data): names = [] for name_data in json_data: name = Name(**name_data) names.append(name) return names def parse_date(self, json_data): def parse_single_date(json_date): date_data = {} try: for i, part in enumerate(('year', 'month', 'day')): date_data[part] = json_date[i] except IndexError: pass return date_data dates = [] for json_date in json_data.get('date-parts', []): date = parse_single_date(json_date) if 'season' in json_data: date['season'] = json_data['season'] dates.append(date) circa = json_data.get('circa', 0) != 0 if len(dates) == 1: return Date(circa=circa, **dates[0]) elif len(dates) > 1: return DateRange(begin=Date(**dates[0]), end=Date(**dates[1]), circa=circa) elif 'literal' in json_data: return LiteralDate(json_data['literal'], circa=circa) else: return None ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/citeproc/string.py0000644000175100017510000000666315234654005017271 0ustar00runnerrunner from functools import wraps, reduce def discard_empty_other(method): """Decorator for addition operator methods that returns the object itself if `other` is the empty string.""" @wraps(method) def wrapper(obj, other): if other == '': return obj else: return method(obj, other) return wrapper class String(str): @discard_empty_other def __radd__(self, other): return MixedString([other]).__add__(self) @discard_empty_other def __add__(self, other): return MixedString([self]).__add__(other) def __iadd__(self, other): return self.__add__(other) def replace(self, *args, **kwargs): return self.__class__(super(String, self).replace(*args, **kwargs)) def rstrip(self, *args, **kwargs): return self.__class__(super(String, self).rstrip(*args, **kwargs)) def lower(self): return self.__class__(super(String, self).lower()) def upper(self): return self.__class__(super(String, self).upper()) def soft_lower(self): return self.lower() def soft_upper(self): return self.upper() def capitalize_first(self): return self.__class__(self[0].upper() + self[1:]) def words(self): for word in self.split(): yield self.__class__(word) class MixedString(list): @discard_empty_other def __add__(self, other): super_obj = super(MixedString, self) try: return self.__class__(super_obj.__add__(other)) except TypeError: return self.__class__(super_obj.__add__(MixedString([other]))) @discard_empty_other def __radd__(self, other): return self.__class__([other]).__add__(self) def __iadd__(self, other): return self.__add__(other) def __str__(self): return ''.join(map(str, self)) def __getitem__(self, index): return str(self)[index] def replace(self, *args): return self.__class__([string.replace(*args) for string in self]) def translate(self, table): return self.__class__([string.translate(table) for string in self]) def lower(self): return self.__class__([string.lower() for string in self]) def upper(self): return self.__class__([string.upper() for string in self]) def title(self): return self.__class__([string.title() for string in self]) def capitalize_first(self): self_iter = iter(self) output = [next(self_iter).capitalize_first()] output += [string for string in self_iter] return self.__class__(output) def isupper(self): return all(string.isupper() for string in self) def split(self, *args, **kwargs): return str(self).split(*args, **kwargs) def rstrip(self, *args, **kwargs): rev_iter = reversed(self) output = [next(rev_iter).rstrip(*args, **kwargs)] output += [string for string in rev_iter] return self.__class__(reversed(output)) def words(self): for string in self: for word in string.words(): yield word class NoCase(String): def __repr__(self): return '{}({})'.format(self.__class__.__name__, str(self)) def soft_lower(self): return self def soft_upper(self): return self def capitalize_first(self): return self def join(items, delimiter=''): return reduce(lambda a, b: a + delimiter + b, items) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/citeproc/types.py0000644000175100017510000000151515234654005017116 0ustar00runnerrunner ARTICLE = 'article' ARTICLE_JOURNAL = 'article-journal' ARTICLE_MAGAZINE = 'article-magazine' ARTICLE_NEWSPAPER = 'article-newspaper' BILL = 'bill' BOOK = 'book' BROADCAST = 'broadcast' CHAPTER = 'chapter' ENTRY = 'entry' ENTRY_DICTIONARY = 'entry-dictionary' ENTRY_ENCYCLOPEDIA = 'entry-encyclopedia' FIGURE = 'figure' GRAPHIC = 'graphic' INTERVIEW = 'interview' LEGAL_CASE = 'legal_case' LEGISLATION = 'legislation' MANUSCRIPT = 'manuscript' MAP = 'map' MOTION_PICTURE = 'motion_picture' MUSICAL_SCORE = 'musical_score' PAMPHLET = 'pamphlet' PAPER_CONFERENCE = 'paper-conference' PATENT = 'patent' PERSONAL_COMMUNICATION = 'personal_communication' POST = 'post' POST_WEBLOG = 'post-weblog' REPORT = 'report' REVIEW = 'review' REVIEW_BOOK = 'review-book' SONG = 'song' SPEECH = 'speech' THESIS = 'thesis' TREATY = 'treaty' WEBPAGE = 'webpage' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1785944092.7098453 citeproc_py-0.10.4/citeproc_py.egg-info/0000755000175100017510000000000015234654035017603 5ustar00runnerrunner././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944092.0 citeproc_py-0.10.4/citeproc_py.egg-info/PKG-INFO0000644000175100017510000004144115234654034020703 0ustar00runnerrunnerMetadata-Version: 2.4 Name: citeproc-py Version: 0.10.4 Summary: Citations and bibliography formatter Author-email: Brecht Machiels License-Expression: BSD-2-Clause-Views Project-URL: homepage, https://github.com/citeproc-py/citeproc-py Keywords: csl,citation,html,rst,bibtex,xml Classifier: Development Status :: 3 - Alpha Classifier: Environment :: Console Classifier: Environment :: Other Environment Classifier: Environment :: Web Environment Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Education Classifier: Intended Audience :: End Users/Desktop Classifier: Intended Audience :: Legal Industry Classifier: Intended Audience :: Other Audience Classifier: Intended Audience :: Science/Research Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 Classifier: Programming Language :: Python :: 3.13 Classifier: Programming Language :: Python :: 3.14 Classifier: Topic :: Documentation Classifier: Topic :: Printing Classifier: Topic :: Software Development :: Documentation Classifier: Topic :: Software Development :: Libraries :: Python Modules Provides: citeproc Requires-Python: >=3.9 Description-Content-Type: text/markdown License-File: LICENSE Requires-Dist: lxml Provides-Extra: full Requires-Dist: citeproc-py-styles; extra == "full" Provides-Extra: tests Requires-Dist: citeproc-py-styles; extra == "tests" Dynamic: license-file # citeproc-py [![PyPI - Version](https://img.shields.io/pypi/v/citeproc-py)](https://pypi.org/project/citeproc-py/) [![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/citeproc-py/citeproc-py/test.yml)](https://github.com/citeproc-py/citeproc-py/actions?query=branch%3Amaster+workflow%3ATest) [![Coveralls](https://img.shields.io/coverallsCoverage/github/citeproc-py/citeproc-py)](https://coveralls.io/github/citeproc-py/citeproc-py) citeproc-py is a [CSL](https://citationstyles.org/) processor for Python. It aims to implement the [CSL 1.0.2 specification](https://docs.citationstyles.org/en/v1.0.2/specification.html). citeproc-py can output styled citations and bibliographies in a number of different output formats. Currently supported are plain text, reStructuredText and HTML. Other formats can be added easily. citeproc-py uses [semantic versioning](https://semver.org/). Currently, its major version number is still at 0, meaning the API is not yet stable. However, you should not expect to see any major API changes soon. ## Requirements citeproc-py supports Python 3.9 and up. It depends on [lxml](https://lxml.de/) for parsing and navigating the CSL style and locale files. # Installation The recommended way of installing citeproc-py is by using [pip](https://pip.pypa.io/en/latest/): ```bash pip install citeproc-py ``` If `lxml` isn't installed, `pip` will try to install it for you. If you insist, you can manually install citeproc-py from distribution packages hosted at [PyPI](https://pypi.python.org/pypi/citeproc-py/). Please ignore the release archives offered by GitHub. ## Getting Started To get started with citeproc-py, take a look at the examples under `examples/`. Two examples are provided, one parsing references from a JSON representation of references as supported by citeproc-js, another parsing the references from a BibTeX file. Both show and explain how to cite references and render the bibliography. ## CSL Compatibility Currently, citeproc-py passes almost 60% of the (relevant) tests in the [citeproc-test suite](https://github.com/citation-style-language/test-suite). However, it is more than 60% complete, as citeproc-py doesn't take care of double spaces and repeated punctuation marks yet, making a good deal of the tests fail. In addition, the following features have not yet been implemented (there are probably some I forgot though): - disambiguation/year-suffix - et-al-subsequent-min/et-al-subsequent-use-first - collapsing - punctuation-in-quote - display Also, some [citeproc-js](https://github.com/juris-m/citeproc-js) functionality that is not part of the CSL spec is not (yet) supported: - raw dates - static-ordering - literal names ## Contributing citeproc-py is 100% volunteer maintained, and new contributions are always welcome. If you would like to contribute, please follow the guidelines in the [CONTRIBUTING.md](https://github.com/citeproc-py/citeproc-py/blob/master/CONTRIBUTING.md) file. ## Local Install and Running the Tests First clone the `citeproc-py` repository and install the submodules with ```bash git submodule update --init ``` Then install with ```bash pip install --editable . ``` Then move to the `tests` directory and run ```bash python citeproc-test.py ``` Run ```bash citeproc-test.py --help ``` to see its usage information. The first time you run the script it will clone the [citeproc-test suite](https://github.com/citation-style-language/test-suite) repository into the `tests` directory and checkout the last tested version. By default failed tests are automatically added into the `failing_tests.txt` file and aren't shown when running the test suite again. If you want git to fully ignore the submodule, you can type ```bash git update-index --assume-unchanged citeproc/data/schema ``` # v0.10.4 (Wed Aug 05 2026) #### 🐛 Bug Fix - setup.py: Prune imports [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Remove unneeded nonuniversal wheel declaration [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Fix project URL [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Specify license file [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Add missing build dep: lxml [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Use entry points for running scripts [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Use setuptools' builtin multifile longdesc support [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Rely on setuptools' automatic package discovery [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Migrate versioneer to pyproject.toml [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) - Migrate simple metadata to pyproject.toml [#191](https://github.com/citeproc-py/citeproc-py/pull/191) ([@hseg](https://github.com/hseg)) #### Authors: 1 - [@hseg](https://github.com/hseg) --- # v0.10.3 (Fri Jul 24 2026) #### 🐛 Bug Fix - swap csl 1.0.1 harvard1 for harvard-cite-them-right [#197](https://github.com/citeproc-py/citeproc-py/pull/197) ([@tmorrell](https://github.com/tmorrell)) - tests: add python 3.14 [#199](https://github.com/citeproc-py/citeproc-py/pull/199) ([@tmorrell](https://github.com/tmorrell)) #### 🔩 Dependency Updates - build(deps): bump actions/setup-python from 6 to 7 [#200](https://github.com/citeproc-py/citeproc-py/pull/200) ([@dependabot[bot]](https://github.com/dependabot[bot])) #### Authors: 2 - [@dependabot[bot]](https://github.com/dependabot[bot]) - Tom Morrell ([@tmorrell](https://github.com/tmorrell)) --- # v0.10.2 (Tue Jul 21 2026) #### 🐛 Bug Fix - Additional chicago style page range formats in csl 1.0.2 [#198](https://github.com/citeproc-py/citeproc-py/pull/198) ([@tmorrell](https://github.com/tmorrell)) #### Authors: 1 - Tom Morrell ([@tmorrell](https://github.com/tmorrell)) --- # v0.10.1 (Wed Jul 08 2026) #### 🐛 Bug Fix - Update GitHub Actions for token and Python version [#196](https://github.com/citeproc-py/citeproc-py/pull/196) ([@tmorrell](https://github.com/tmorrell)) - Better handle decimals in multiple number regex [#195](https://github.com/citeproc-py/citeproc-py/pull/195) ([@tmorrell](https://github.com/tmorrell)) - fix spacing changes in csl 1.0.2 [#195](https://github.com/citeproc-py/citeproc-py/pull/195) ([@tmorrell](https://github.com/tmorrell)) #### Authors: 1 - Tom Morrell ([@tmorrell](https://github.com/tmorrell)) --- # v0.10.0 (Tue Jul 07 2026) #### 🚀 Enhancement - fix: preserve text case for non-english title case [#192](https://github.com/citeproc-py/citeproc-py/pull/192) ([@mairasalazar](https://github.com/mairasalazar)) - Upgrade to csl 1.0.2 [#192](https://github.com/citeproc-py/citeproc-py/pull/192) ([@mairasalazar](https://github.com/mairasalazar)) #### 🔩 Dependency Updates - Bump actions/checkout from 6 to 7 [#193](https://github.com/citeproc-py/citeproc-py/pull/193) ([@dependabot[bot]](https://github.com/dependabot[bot])) #### Authors: 2 - [@dependabot[bot]](https://github.com/dependabot[bot]) - Maira Salazar ([@mairasalazar](https://github.com/mairasalazar)) --- # v0.9.3 (Thu Apr 30 2026) #### 🐛 Bug Fix - fix: Et_Al looked up literal term name 'variable' instead of the local variable [#190](https://github.com/citeproc-py/citeproc-py/pull/190) ([@Jasaj4](https://github.com/Jasaj4)) #### 🔩 Dependency Updates - Bump actions/checkout from 4 to 6 [#187](https://github.com/citeproc-py/citeproc-py/pull/187) ([@dependabot[bot]](https://github.com/dependabot[bot])) - Bump actions/setup-python from 5 to 6 [#186](https://github.com/citeproc-py/citeproc-py/pull/186) ([@dependabot[bot]](https://github.com/dependabot[bot])) #### Authors: 2 - [@dependabot[bot]](https://github.com/dependabot[bot]) - [@Jasaj4](https://github.com/Jasaj4) --- # v0.9.2 (Tue Apr 21 2026) #### 🐛 Bug Fix - setup: add citeproc-py-styles to tests [#189](https://github.com/citeproc-py/citeproc-py/pull/189) ([@tmorrell](https://github.com/tmorrell)) #### Authors: 1 - Tom Morrell ([@tmorrell](https://github.com/tmorrell)) --- # v0.9.1 (Mon Apr 20 2026) #### 🐛 Bug Fix - Add Dependabot configuration for GitHub Actions [#185](https://github.com/citeproc-py/citeproc-py/pull/185) ([@tmorrell](https://github.com/tmorrell)) - tests: drop python 3.9 [#179](https://github.com/citeproc-py/citeproc-py/pull/179) ([@tmorrell](https://github.com/tmorrell)) - Fix ordinal suffixes when style has embedded locale without ordinal terms [#184](https://github.com/citeproc-py/citeproc-py/pull/184) ([@Copilot](https://github.com/Copilot)) #### Authors: 2 - [@Copilot](https://github.com/Copilot) - Tom Morrell ([@tmorrell](https://github.com/tmorrell)) --- # v0.9.0 (Mon Aug 25 2025) #### 🚀 Enhancement - Feature/flexible style loading [#180](https://github.com/citeproc-py/citeproc-py/pull/180) ([@yarikoptic](https://github.com/yarikoptic)) #### Authors: 1 - Yaroslav Halchenko ([@yarikoptic](https://github.com/yarikoptic)) --- # v0.8.3 (Mon Aug 18 2025) #### 🐛 Bug Fix - setup: match license label with actual text [#175](https://github.com/citeproc-py/citeproc-py/pull/175) ([@tmorrell](https://github.com/tmorrell)) - Fix Non-existent Terms [#156](https://github.com/citeproc-py/citeproc-py/pull/156) ([@JVickery-TBS](https://github.com/JVickery-TBS)) #### 🏠 Internal - Remove hardcoded option for auto to onlyPublishWithReleaseLabel [#178](https://github.com/citeproc-py/citeproc-py/pull/178) ([@yarikoptic](https://github.com/yarikoptic)) - release action: missing semicolon [#177](https://github.com/citeproc-py/citeproc-py/pull/177) ([@tmorrell](https://github.com/tmorrell)) - release action: missing quotes [#176](https://github.com/citeproc-py/citeproc-py/pull/176) ([@tmorrell](https://github.com/tmorrell)) - coveralls: try to reenable [#163](https://github.com/citeproc-py/citeproc-py/pull/163) ([@tmorrell](https://github.com/tmorrell)) #### 📝 Documentation - Fix some formatting issues in README [#164](https://github.com/citeproc-py/citeproc-py/pull/164) ([@alexfikl](https://github.com/alexfikl)) #### Authors: 4 - Alex Fikl ([@alexfikl](https://github.com/alexfikl)) - Jesse Vickery ([@JVickery-TBS](https://github.com/JVickery-TBS)) - Tom Morrell ([@tmorrell](https://github.com/tmorrell)) - Yaroslav Halchenko ([@yarikoptic](https://github.com/yarikoptic)) --- # v0.8.2 (Wed Mar 12 2025) #### 🏠 Internal - Explicitly specify utf-8 encoding while reading top level .md files for description [#162](https://github.com/citeproc-py/citeproc-py/pull/162) ([@yarikoptic](https://github.com/yarikoptic)) - Instruct that long description is in markdown and not ReST [#160](https://github.com/citeproc-py/citeproc-py/pull/160) ([@yarikoptic](https://github.com/yarikoptic)) #### Authors: 1 - Yaroslav Halchenko ([@yarikoptic](https://github.com/yarikoptic)) --- # v0.8.1 (Wed Mar 12 2025) #### 🏠 Internal - release: checkout with submodules [#159](https://github.com/citeproc-py/citeproc-py/pull/159) ([@yarikoptic](https://github.com/yarikoptic)) #### Authors: 1 - Yaroslav Halchenko ([@yarikoptic](https://github.com/yarikoptic)) --- # v0.8.0 (Wed Mar 12 2025) #### 🚀 Enhancement - release: use GitHUb App token for checkout and push [#158](https://github.com/citeproc-py/citeproc-py/pull/158) ([@tmorrell](https://github.com/tmorrell)) #### ⚠️ Pushed to `master` - Rename CHANGES to CHANGELOG ([@yarikoptic](https://github.com/yarikoptic)) #### 🏠 Internal - release: switch to using GitHub App to overcome branch protection [#157](https://github.com/citeproc-py/citeproc-py/pull/157) ([@tmorrell](https://github.com/tmorrell)) - Set up `auto` to automate releases [#153](https://github.com/citeproc-py/citeproc-py/pull/153) ([@jwodder](https://github.com/jwodder) [@yarikoptic](https://github.com/yarikoptic)) #### 📝 Documentation - Convert CHANGES.rst, CONTRIBUTING.rst, and README.md to markdown [#154](https://github.com/citeproc-py/citeproc-py/pull/154) ([@tmorrell](https://github.com/tmorrell)) #### Authors: 3 - John T. Wodder II ([@jwodder](https://github.com/jwodder)) - Tom Morrell ([@tmorrell](https://github.com/tmorrell)) - Yaroslav Halchenko ([@yarikoptic](https://github.com/yarikoptic)) --- # Release 0.7.0 (2025-02-19) Just to get a release out after long period. #### Bug fixes * Better handling of ordinals * Fix locator conditions (resolves #142) * Make family name optional * Allow date parts to not be integers * Support space macros * Fix multiple capitals * Fix parsing BibTex integer values #### Other changes: * Removed support for Python 3.6, 3.7, 3.8 and added for 3.10 - 3.13 * Switch versioning to versioneer # Release 0.6.0 (2021-05-27) #### Bug fixes * Various issues on Windows: testing, explicit utf-8 encoding * Strings with unescaped \ declared r"aw" #### Other changes: * Removed support for Python 2.7, 3.5 and added for 3.9 * Travis CI is removed in favor of GitHub actions testing across all 3 major OSes (MacOS, Windows, GNU/Linux Ubuntu) * CSL test-suite progressed from 5779a8c to c3db429 # Release 0.5.1 (2020-03-06) #### Bug fixed: * avoid rnc2rng 2.6.2 which breaks installation of citeproc-py # Release 0.5.0 (2020-02-09) #### Enhancements: * handle commas and ampersands in a functional style * Number: handle commas and ampersands * added symbol for textquotesingle * specify fallback locales for fr-CA and es-CL * improved page number and ranges parsing #### Bug fixed: * don't fail on empty page ranges (#90) (bbm) * detect end of file while parsing incorrect bib (#59) (John Vandenberg) #### Other changes: * Removed 3.2-3.4 and added 3.7, 3.8 to supported Pythons * Refactored locales handling # Release 0.4.0 (2017-06-23) #### New features: * allow specifying the encoding of a BibTeX database file (#20 and #25) * BibTeX 'month' field: support integers and " " values * BibTeX 'pages' field: support "10", "10+", "10-12" and "10--12" formats * BibTeX entry types: map the non-standard 'thesis' and 'report' entries * update the CSL schema to version 1.0.1 (#5) * update the CSL locales to commit 49bf3fc0 #### Bug fixed: * avoid crash when there is nothing to affix (David Lesieur) * fix BibTeX month to CSL month mapping (#24) * strip leading/trailing whitespace from BibTeX values (#37) # Release 0.3.0 (2014-11-07) #### Major improvements to the BibTeX parser: * split names into parts and assign them to the equivalent CSL name parts * fixed handling of accent macros and escaped characters * more compatible (La)TeX macro handling in general (but still basic) * handle standard Computer Modern ligatures such as --, ---, and << * added unit tests for the BibTeX and LaTeX parsers #### Other changes: * disable RelaxNG validation of CSL styles by default (API change) # Release 0.2.0 (2014-10-25) * bad cite callback function can determine how a bad cite is displayed (hetsch) * added option to disable RelaxNG validation (Jasper Op de Coul) * distutils was replaced with setuptools (Joshua Carp) * bug fixes (Yaroslav Halchenko, David Lesieur) * CitationStylesBibliography.bibliography() now returns the list of entries ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944092.0 citeproc_py-0.10.4/citeproc_py.egg-info/SOURCES.txt0000644000175100017510000001073515234654034021474 0ustar00runnerrunnerCHANGELOG.md LICENSE MANIFEST.in README.md pyproject.toml setup.py versioneer.py citeproc/__init__.py citeproc/_version.py citeproc/frontend.py citeproc/model.py citeproc/string.py citeproc/types.py citeproc/data/locales/locales-af-ZA.xml citeproc/data/locales/locales-ar.xml citeproc/data/locales/locales-bal-PK.xml citeproc/data/locales/locales-bg-BG.xml citeproc/data/locales/locales-brh-PK.xml citeproc/data/locales/locales-ca-AD.xml citeproc/data/locales/locales-cs-CZ.xml citeproc/data/locales/locales-cy-GB.xml citeproc/data/locales/locales-da-DK.xml citeproc/data/locales/locales-de-AT.xml citeproc/data/locales/locales-de-CH.xml citeproc/data/locales/locales-de-DE.xml citeproc/data/locales/locales-el-GR.xml citeproc/data/locales/locales-en-GB.xml citeproc/data/locales/locales-en-US.xml citeproc/data/locales/locales-es-CL.xml citeproc/data/locales/locales-es-ES.xml citeproc/data/locales/locales-es-MX.xml citeproc/data/locales/locales-et-EE.xml citeproc/data/locales/locales-eu.xml citeproc/data/locales/locales-fa-IR.xml citeproc/data/locales/locales-fi-FI.xml citeproc/data/locales/locales-fr-CA.xml citeproc/data/locales/locales-fr-FR.xml citeproc/data/locales/locales-gl-ES.xml citeproc/data/locales/locales-he-IL.xml citeproc/data/locales/locales-hi-IN.xml citeproc/data/locales/locales-hr-HR.xml citeproc/data/locales/locales-hu-HU.xml citeproc/data/locales/locales-hy-AM.xml citeproc/data/locales/locales-id-ID.xml citeproc/data/locales/locales-is-IS.xml citeproc/data/locales/locales-it-IT.xml citeproc/data/locales/locales-ja-JP.xml citeproc/data/locales/locales-km-KH.xml citeproc/data/locales/locales-ko-KR.xml citeproc/data/locales/locales-la.xml citeproc/data/locales/locales-lij-IT.xml citeproc/data/locales/locales-lt-LT.xml citeproc/data/locales/locales-lv-LV.xml citeproc/data/locales/locales-mn-MN.xml citeproc/data/locales/locales-ms-MY.xml citeproc/data/locales/locales-nb-NO.xml citeproc/data/locales/locales-nl-NL.xml citeproc/data/locales/locales-nn-NO.xml citeproc/data/locales/locales-pa-PK.xml citeproc/data/locales/locales-pl-PL.xml citeproc/data/locales/locales-pt-BR.xml citeproc/data/locales/locales-pt-PT.xml citeproc/data/locales/locales-ro-RO.xml citeproc/data/locales/locales-ru-RU.xml citeproc/data/locales/locales-sk-SK.xml citeproc/data/locales/locales-sl-SI.xml citeproc/data/locales/locales-sr-Cyrl-RS.xml citeproc/data/locales/locales-sr-Latn-RS.xml citeproc/data/locales/locales-sv-SE.xml citeproc/data/locales/locales-th-TH.xml citeproc/data/locales/locales-tl-PH.xml citeproc/data/locales/locales-tr-TR.xml citeproc/data/locales/locales-uk-UA.xml citeproc/data/locales/locales-vi-VN.xml citeproc/data/locales/locales-zh-CN.xml citeproc/data/locales/locales-zh-TW.xml citeproc/data/locales/locales.json citeproc/data/locales/util/add-locale-terms.py citeproc/data/locales/util/sort_terms.py citeproc/data/schema/CHANGELOG.md citeproc/data/schema/CONTRIBUTING.md citeproc/data/schema/README.md citeproc/data/schema/.github/PULL_REQUEST_TEMPLATE.md citeproc/data/schema/.github/ISSUE_TEMPLATE/feature_request.md citeproc/data/schema/schemas/styles/csl-categories.rnc citeproc/data/schema/schemas/styles/csl-choose.rnc citeproc/data/schema/schemas/styles/csl-relaxed.rnc citeproc/data/schema/schemas/styles/csl-repository.rnc citeproc/data/schema/schemas/styles/csl-terms.rnc citeproc/data/schema/schemas/styles/csl-types.rnc citeproc/data/schema/schemas/styles/csl-variables.rnc citeproc/data/schema/schemas/styles/csl.rnc citeproc/data/schema/tests/schemas/input/test_json.py citeproc/data/schema/tools/rnc-validate-format.py citeproc/data/styles/harvard-cite-them-right.csl citeproc/formatter/__init__.py citeproc/formatter/html.py citeproc/formatter/plain.py citeproc/formatter/rst.py citeproc/scripts/csl_unsorted.py citeproc/source/__init__.py citeproc/source/json.py citeproc/source/bibtex/__init__.py citeproc/source/bibtex/bibparse.py citeproc/source/bibtex/bibtex.py citeproc/source/bibtex/latex/__init__.py citeproc/source/bibtex/latex/macro.py citeproc_py.egg-info/PKG-INFO citeproc_py.egg-info/SOURCES.txt citeproc_py.egg-info/dependency_links.txt citeproc_py.egg-info/entry_points.txt citeproc_py.egg-info/requires.txt citeproc_py.egg-info/top_level.txt examples/bibtex.py examples/citeproc_json.py examples/xampl.bib tests/check_string.py tests/citeproc-test.py tests/test.bib tests/test_base.py tests/test_bibliography.py tests/test_bibparse.py tests/test_bibtex.py tests/test_latex.py tests/test_style_loading.py tests/local/condition_LocatorVariables.txt tests/local/term_EmptyValueForTermSkipsField.txt././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944092.0 citeproc_py-0.10.4/citeproc_py.egg-info/dependency_links.txt0000644000175100017510000000000115234654034023650 0ustar00runnerrunner ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944092.0 citeproc_py-0.10.4/citeproc_py.egg-info/entry_points.txt0000644000175100017510000000010415234654034023073 0ustar00runnerrunner[console_scripts] csl_unsorted = citeproc.scripts.csl_unsorted:main ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944092.0 citeproc_py-0.10.4/citeproc_py.egg-info/requires.txt0000644000175100017510000000007415234654034022203 0ustar00runnerrunnerlxml [full] citeproc-py-styles [tests] citeproc-py-styles ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944092.0 citeproc_py-0.10.4/citeproc_py.egg-info/top_level.txt0000644000175100017510000000001115234654034022324 0ustar00runnerrunnerciteproc ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1785944092.707956 citeproc_py-0.10.4/examples/0000755000175100017510000000000015234654035015407 5ustar00runnerrunner././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/examples/bibtex.py0000755000175100017510000000472415234654005017245 0ustar00runnerrunner#!/usr/bin/env python # The references are parsed from a BibTeX database, so we import the # corresponding parser. from citeproc.source.bibtex import BibTeX # Import the citeproc-py classes we'll use below. from citeproc import CitationStylesStyle, CitationStylesBibliography from citeproc import formatter from citeproc import Citation, CitationItem # Parse the BibTeX database. bib_source = BibTeX('xampl.bib') # load a CSL style (from the current directory) bib_style = CitationStylesStyle('harvard-cite-them-right', validate=False) # Create the citeproc-py bibliography, passing it the: # * CitationStylesStyle, # * BibliographySource (BibTeX in this case), and # * a formatter (plain, html, or you can write a custom formatter) bibliography = CitationStylesBibliography(bib_style, bib_source, formatter.plain) # Processing citations in a document needs to be done in two passes as for some # CSL styles, a citation can depend on the order of citations in the # bibliography and thus on citations following the current one. # For this reason, we first need to register all citations with the # CitationStylesBibliography. citation1 = Citation([CitationItem('whole-collection')]) citation2 = Citation([CitationItem('whole-set'), CitationItem('misc-full')]) citation3 = Citation([CitationItem('techreport-full')]) citation4 = Citation([CitationItem('mastersthesis-minimal')]) citation5 = Citation([CitationItem('inproceedings-full'), CitationItem('unpublished-full')]) bibliography.register(citation1) bibliography.register(citation2) bibliography.register(citation3) bibliography.register(citation4) bibliography.register(citation5) # In the second pass, CitationStylesBibliography can generate citations. # CitationStylesBibliography.cite() requires a callback function to be passed # along to be called in case a CitationItem's key is not present in the # bibliography. def warn(citation_item): print("WARNING: Reference with key '{}' not found in the bibliography." .format(citation_item.key)) print('Citations') print('---------') print(bibliography.cite(citation1, warn)) print(bibliography.cite(citation2, warn)) print(bibliography.cite(citation3, warn)) print(bibliography.cite(citation4, warn)) print(bibliography.cite(citation5, warn)) # And finally, the bibliography can be rendered. print('') print('Bibliography') print('------------') for item in bibliography.bibliography(): print(str(item)) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/examples/citeproc_json.py0000755000175100017510000001034615234654005020626 0ustar00runnerrunner#!/usr/bin/env python # We'll use json.loads for parsing the JSON data. import json # Import the citeproc-py classes we'll use below. from citeproc import CitationStylesStyle, CitationStylesBibliography from citeproc import Citation, CitationItem from citeproc import formatter from citeproc.source.json import CiteProcJSON # The following JSON data describes 5 references picked from the CSL test suite. json_input = """ [ { "id": "ITEM-1", "issued": { "date-parts": [[1987, 8, 3], [2003, 10, 23]] }, "title": "Ignore me", "type": "book" }, { "id" : "ITEM-2", "page" : "1-7", "type" : "article-journal", "issued" : { "date-parts": [[2006]] } }, { "author": [ { "family": "Doe", "given": "John" } ], "id": "ITEM-3", "issued": { "date-parts": [["1965", "6", "1"]] }, "title": "His Anonymous Life", "type": "book" }, { "author": [ { "family": "Grignon", "given": "Cyril" }, { "family": "Sentenac", "given": "Corey" } ], "id": "ITEM-4", "issued": { "date-parts": [[2000]] }, "type": "book" }, { "id": "ITEM-5", "title":"Boundaries of Dissent: Protest and State Power in the Media Age", "author": [ { "family": "D'Arcus", "given": "Bruce", "static-ordering": false } ], "publisher": "Routledge", "publisher-place": "New York", "issued": { "date-parts":[[2006]] }, "type": "book", "URL": "http://www.test01.com" } ] """ # Parse the JSON input using json.loads() # (parsing from a file object can be done with json.load) json_data = json.loads(json_input) # Process the JSON data to generate a citeproc-py BibliographySource. bib_source = CiteProcJSON(json_data) ##for key, entry in bib_source.items(): ## print(key) ## for name, value in entry.items(): ## print(' {}: {}'.format(name, value)) # load a CSL style (from the current directory) bib_style = CitationStylesStyle('harvard-cite-them-right', validate=False) # Create the citeproc-py bibliography, passing it the: # * CitationStylesStyle, # * BibliographySource (CiteProcJSON in this case), and # * a formatter (plain, html, or you can write a custom formatter) bibliography = CitationStylesBibliography(bib_style, bib_source, formatter.html) # Processing citations in a document needs to be done in two passes as for some # CSL styles, a citation can depend on the order of citations in the # bibliography and thus on citations following the current one. # For this reason, we first need to register all citations with the # CitationStylesBibliography. citation1 = Citation([CitationItem('ITEM-3')]) citation2 = Citation([CitationItem('ITEM-1'), CitationItem('ITEM-2')]) citation3 = Citation([CitationItem('ITEM-4')]) citation4 = Citation([CitationItem('ITEM-5')]) citation5 = Citation([CitationItem('MISSING')]) bibliography.register(citation1) bibliography.register(citation2) bibliography.register(citation3) bibliography.register(citation4) bibliography.register(citation5) # In the second pass, CitationStylesBibliography can generate citations. # CitationStylesBibliography.cite() requires a callback function to be passed # along to be called in case a CitationItem's key is not present in the # bibliography. def warn(citation_item): print("WARNING: Reference with key '{}' not found in the bibliography." .format(citation_item.key)) print('Citations') print('---------') print(bibliography.cite(citation1, warn)) print(bibliography.cite(citation2, warn)) print(bibliography.cite(citation3, warn)) print(bibliography.cite(citation4, warn)) print(bibliography.cite(citation5, warn)) # And finally, the bibliography can be rendered. print('') print('Bibliography') print('------------') for item in bibliography.bibliography(): print(str(item)) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/examples/xampl.bib0000644000175100017510000002362515234654005017213 0ustar00runnerrunner% Copyright (C) 1988, 2010 Oren Patashnik. % Unlimited copying and redistribution of this file are permitted if it % is unmodified. Modifications (and their redistribution) are also % permitted, as long as the resulting file is renamed. @preamble{ "\newcommand{\noopsort}[1]{} " # "\newcommand{\printfirst}[2]{#1} " # "\newcommand{\singleletter}[1]{#1} " # "\newcommand{\switchargs}[2]{#2#1} " } @ARTICLE{article-minimal, author = {L[eslie] A. Aamport}, title = {The Gnats and Gnus Document Preparation System}, journal = {\mbox{G-Animal's} Journal}, year = 1986, } @ARTICLE{article-full, author = {L[eslie] A. Aamport}, title = {The Gnats and Gnus Document Preparation System}, journal = {\mbox{G-Animal's} Journal}, year = 1986, volume = 41, number = 7, pages = "73+", month = jul, note = "This is a full ARTICLE entry", } The KEY field is here to override the KEY field in the journal being cross referenced (so is the NOTE field, in addition to its imparting information). @ARTICLE{article-crossref, crossref = {WHOLE-JOURNAL}, key = "", author = {L[eslie] A. Aamport}, title = {The Gnats and Gnus Document Preparation System}, pages = "73+", note = "This is a cross-referencing ARTICLE entry", } @ARTICLE{whole-journal, key = "GAJ", journal = {\mbox{G-Animal's} Journal}, year = 1986, volume = 41, number = 7, month = jul, note = {The entire issue is devoted to gnats and gnus (this entry is a cross-referenced ARTICLE (journal))}, } @INBOOK{inbook-minimal, author = "Donald E. Knuth", title = "Fundamental Algorithms", publisher = "Addison-Wesley", year = "{\noopsort{1973b}}1973", chapter = "1.2", } @INBOOK{inbook-full, author = "Donald E. Knuth", title = "Fundamental Algorithms", volume = 1, series = "The Art of Computer Programming", publisher = "Addison-Wesley", address = "Reading, Massachusetts", edition = "Second", month = "10~" # jan, year = "{\noopsort{1973b}}1973", type = "Section", chapter = "1.2", pages = "10--119", note = "This is a full INBOOK entry", } @INBOOK{inbook-crossref, crossref = "whole-set", title = "Fundamental Algorithms", volume = 1, series = "The Art of Computer Programming", edition = "Second", year = "{\noopsort{1973b}}1973", type = "Section", chapter = "1.2", note = "This is a cross-referencing INBOOK entry", } @BOOK{book-minimal, author = "Donald E. Knuth", title = "Seminumerical Algorithms", publisher = "Addison-Wesley", year = "{\noopsort{1973c}}1981", } @BOOK{book-full, author = "Donald E. Knuth", title = "Seminumerical Algorithms", volume = 2, series = "The Art of Computer Programming", publisher = "Addison-Wesley", address = "Reading, Massachusetts", edition = "Second", month = "10~" # jan, year = "{\noopsort{1973c}}1981", note = "This is a full BOOK entry", } @BOOK{book-crossref, crossref = "whole-set", title = "Seminumerical Algorithms", volume = 2, series = "The Art of Computer Programming", edition = "Second", year = "{\noopsort{1973c}}1981", note = "This is a cross-referencing BOOK entry", } @BOOK{whole-set, author = "Donald E. Knuth", publisher = "Addison-Wesley", title = "The Art of Computer Programming", series = "Four volumes", year = "{\noopsort{1973a}}{\switchargs{--90}{1968}}", note = "Seven volumes planned (this is a cross-referenced set of BOOKs)", } @BOOKLET{booklet-minimal, key = "Kn{\printfirst{v}{1987}}", title = "The Programming of Computer Art", } @BOOKLET{booklet-full, author = "Jill C. Knvth", title = "The Programming of Computer Art", howpublished = "Vernier Art Center", address = "Stanford, California", month = feb, year = 1988, note = "This is a full BOOKLET entry", } @INCOLLECTION{incollection-minimal, author = "Daniel D. Lincoll", title = "Semigroups of Recurrences", booktitle = "High Speed Computer and Algorithm Organization", publisher = "Academic Press", year = 1977, } @INCOLLECTION{incollection-full, author = "Daniel D. Lincoll", title = "Semigroups of Recurrences", editor = "David J. Lipcoll and D. H. Lawrie and A. H. Sameh", booktitle = "High Speed Computer and Algorithm Organization", number = 23, series = "Fast Computers", chapter = 3, type = "Part", pages = "179--183", publisher = "Academic Press", address = "New York", edition = "Third", month = sep, year = 1977, note = "This is a full INCOLLECTION entry", } @INCOLLECTION{incollection-crossref, crossref = "whole-collection", author = "Daniel D. Lincoll", title = "Semigroups of Recurrences", pages = "179--183", note = "This is a cross-referencing INCOLLECTION entry", } @BOOK{whole-collection, editor = "David J. Lipcoll and D. H. Lawrie and A. H. Sameh", title = "High Speed Computer and Algorithm Organization", booktitle = "High Speed Computer and Algorithm Organization", number = 23, series = "Fast Computers", publisher = "Academic Press", address = "New York", edition = "Third", month = sep, year = 1977, note = "This is a cross-referenced BOOK (collection) entry", } @MANUAL{manual-minimal, key = "Manmaker", title = "The Definitive Computer Manual", } @MANUAL{manual-full, author = "Larry Manmaker", title = "The Definitive Computer Manual", organization = "Chips-R-Us", address = "Silicon Valley", edition = "Silver", month = apr # "-" # may, year = 1986, note = "This is a full MANUAL entry", } @MASTERSTHESIS{mastersthesis-minimal, author = "{\'{E}}douard Masterly", title = "Mastering Thesis Writing", school = "Stanford University", year = 1988, } @MASTERSTHESIS{mastersthesis-full, author = "{\'{E}}douard Masterly", title = "Mastering Thesis Writing", school = "Stanford University", type = "Master's project", address = "English Department", month = jun # "-" # aug, year = 1988, note = "This is a full MASTERSTHESIS entry", } @MISC{misc-minimal, key = "Missilany", note = "This is a minimal MISC entry", } @MISC{misc-full, author = "Joe-Bob Missilany", title = "Handing out random pamphlets in airports", howpublished = "Handed out at O'Hare", month = oct, year = 1984, note = "This is a full MISC entry", } @STRING{STOC-key = "OX{\singleletter{stoc}}"} @STRING{ACM = "The OX Association for Computing Machinery"} @STRING{STOC = " Symposium on the Theory of Computing"} @INPROCEEDINGS{inproceedings-minimal, author = "Alfred V. Oaho and Jeffrey D. Ullman and Mihalis Yannakakis", title = "On Notions of Information Transfer in {VLSI} Circuits", booktitle = "Proc. Fifteenth Annual ACM" # STOC, year = 1983, } @INPROCEEDINGS{inproceedings-full, author = "Alfred V. Oaho and Jeffrey D. Ullman and Mihalis Yannakakis", title = "On Notions of Information Transfer in {VLSI} Circuits", editor = "Wizard V. Oz and Mihalis Yannakakis", booktitle = "Proc. Fifteenth Annual ACM" # STOC, number = 17, series = "All ACM Conferences", pages = "133--139", month = mar, year = 1983, address = "Boston", organization = ACM, publisher = "Academic Press", note = "This is a full INPROCEDINGS entry", } @INPROCEEDINGS{inproceedings-crossref, crossref = "whole-proceedings", author = "Alfred V. Oaho and Jeffrey D. Ullman and Mihalis Yannakakis", title = "On Notions of Information Transfer in {VLSI} Circuits", organization = "", pages = "133--139", note = "This is a cross-referencing INPROCEEDINGS entry", } @PROCEEDINGS{proceedings-minimal, key = STOC-key, title = "Proc. Fifteenth Annual" # STOC, year = 1983, } @PROCEEDINGS{proceedings-full, editor = "Wizard V. Oz and Mihalis Yannakakis", title = "Proc. Fifteenth Annual" # STOC, number = 17, series = "All ACM Conferences", month = mar, year = 1983, address = "Boston", organization = ACM, publisher = "Academic Press", note = "This is a full PROCEEDINGS entry", } @PROCEEDINGS{whole-proceedings, key = STOC-key, organization = ACM, title = "Proc. Fifteenth Annual" # STOC, address = "Boston", year = 1983, booktitle = "Proc. Fifteenth Annual ACM" # STOC, note = "This is a cross-referenced PROCEEDINGS", } @PHDTHESIS{phdthesis-minimal, author = "F. Phidias Phony-Baloney", title = "Fighting Fire with Fire: Festooning {F}rench Phrases", school = "Fanstord University", year = 1988, } @PHDTHESIS{phdthesis-full, author = "F. Phidias Phony-Baloney", title = "Fighting Fire with Fire: Festooning {F}rench Phrases", school = "Fanstord University", type = "{PhD} Dissertation", address = "Department of French", month = jun # "-" # aug, year = 1988, note = "This is a full PHDTHESIS entry", } @TECHREPORT{techreport-minimal, author = "Tom Terrific", title = "An {$O(n \log n / \! \log\log n)$} Sorting Algorithm", institution = "Fanstord University", year = 1988, } @TECHREPORT{techreport-full, author = "Tom T{\'{e}}rrific", title = "An {$O(n \log n / \! \log\log n)$} Sorting Algorithm", institution = "Fanstord University", type = "Wishful Research Result", number = "7", address = "Computer Science Department, Fanstord, California", month = oct, year = 1988, note = "This is a full TECHREPORT entry", } @UNPUBLISHED{unpublished-minimal, author = "Ulrich {\"{U}}nderwood and Ned {\~N}et and Paul {\={P}}ot", title = "Lower Bounds for Wishful Research Results", note = "Talk at Fanstord University (this is a minimal UNPUBLISHED entry)", } @UNPUBLISHED{unpublished-full, author = "Ulrich {\"{U}}nderwood and Ned {\~N}et and Paul {\={P}}ot", title = "Lower Bounds for Wishful Research Results", month = nov # ", " # dec, year = 1988, note = "Talk at Fanstord University (this is a full UNPUBLISHED entry)", } @MISC{random-note-crossref, key = {Volume-2}, note = "Volume~2 is listed under Knuth \cite{book-full}" } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/pyproject.toml0000644000175100017510000000436015234654005016505 0ustar00runnerrunner[build-system] requires = [ "setuptools", "versioneer[toml]", "rnc2rng>=2.6.1,!=2.6.2", "lxml", ] build-backend = "setuptools.build_meta" [project] dynamic = [ "version", "readme" ] name = "citeproc-py" authors= [ { name = "Brecht Machiels", email = "brecht@mos6581.org" } ] urls = { homepage = "https://github.com/citeproc-py/citeproc-py" } description = "Citations and bibliography formatter" keywords = [ "csl", "citation", "html", "rst", "bibtex", "xml" ] license = "BSD-2-Clause-Views" license-files = [ "LICENSE" ] classifiers = [ "Development Status :: 3 - Alpha", "Environment :: Console", "Environment :: Other Environment", "Environment :: Web Environment", "Intended Audience :: Developers", "Intended Audience :: Education", "Intended Audience :: End Users/Desktop", "Intended Audience :: Legal Industry", "Intended Audience :: Other Audience", "Intended Audience :: Science/Research", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Topic :: Documentation", "Topic :: Printing", "Topic :: Software Development :: Documentation", "Topic :: Software Development :: Libraries :: Python Modules", ] requires-python = ">=3.9" dependencies = [ "lxml" ] [project.optional-dependencies] full = [ "citeproc-py-styles" ] tests = [ "citeproc-py-styles" ] [project.scripts] csl_unsorted = "citeproc.scripts.csl_unsorted:main" [tool.setuptools] provides = [ "citeproc" ] package-data.citeproc = [ "data/locales/*.xml", "data/locales/locales.json", "data/schema/schemas/styles/*.rng", "data/styles/*.csl", ] [tool.setuptools.dynamic] version = { attr = "citeproc.__version__" } readme = { file = [ "README.md", "CHANGELOG.md" ], content-type = "text/markdown" } [tool.versioneer] VCS = "git" style = "pep440" versionfile_source = "citeproc/_version.py" versionfile_build = "citeproc/_version.py" tag_prefix = "v" parentdir_prefix = "citeproc-" ././@PaxHeader0000000000000000000000000000003200000000000010210 xustar0026 mtime=1785944092.71115 citeproc_py-0.10.4/setup.cfg0000644000175100017510000000004615234654035015412 0ustar00runnerrunner[egg_info] tag_build = tag_date = 0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/setup.py0000755000175100017510000000222315234654005015302 0ustar00runnerrunner#!/usr/bin/env python """ Setup script for citeproc-py """ import io import os from setuptools import setup from setuptools.command.build_py import build_py from setuptools.command.develop import develop import versioneer PACKAGE = 'citeproc' BASE_PATH = os.path.dirname(os.path.abspath(__file__)) PACKAGE_ABSPATH = os.path.join(BASE_PATH, PACKAGE) VERSION_FILE = os.path.join(PACKAGE_ABSPATH, 'version.py') # All external commands are relative to BASE_PATH os.chdir(BASE_PATH) CSL_SCHEMA_RNC = 'citeproc/data/schema/schemas/styles/csl.rnc' def convert_rnc(): import rnc2rng filename_root, _ = os.path.splitext(CSL_SCHEMA_RNC) root = rnc2rng.load(CSL_SCHEMA_RNC) with io.open(filename_root + '.rng', 'w', encoding='utf-8') as rng: rnc2rng.dump(root, rng) class custom_build_py(build_py): def run(self): convert_rnc() build_py.run(self) class custom_develop(develop): def run(self): convert_rnc() develop.run(self) setup( version=versioneer.get_version(), cmdclass=versioneer.get_cmdclass({'build_py': custom_build_py, 'develop': custom_develop}), #test_suite='nose.collector', ) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1785944092.7093432 citeproc_py-0.10.4/tests/0000755000175100017510000000000015234654035014733 5ustar00runnerrunner././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/tests/check_string.py0000644000175100017510000000051615234654005017747 0ustar00runnerrunnerfrom citeproc.string import String, NoCase a = String('a ') b = String(' b ') nocase = NoCase('NoCase') nocase2 = NoCase('NoCaseTwo') c = a + nocase + b + nocase2 print(c) print(c.upper()) print(c.lower()) print('test' + b) print('test ' + nocase) print(a + 'test') print(nocase + ' test') print('test ' + c) print(c + ' test') ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/tests/citeproc-test.py0000644000175100017510000003742715234654005020104 0ustar00runnerrunner import glob import io import os import sys import traceback from codecs import utf_8_encode from functools import reduce from optparse import OptionParser from subprocess import Popen, PIPE from citeproc import CitationStylesStyle, CitationStylesBibliography from citeproc.source import Citation, CitationItem, Locator from citeproc.source.json import CiteProcJSON CITEPROC_TEST_REPOSITORY = 'https://github.com/citation-style-language/test-suite.git' CITEPROC_TEST_COMMIT = '6eefc5b07c6969ab8999e48542acbcc131cba864' CITEPROC_TEST_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), 'test-suite')) TEST_PARSER_PATH = os.path.join(CITEPROC_TEST_PATH, 'processor.py') TESTS_PATH = os.path.join(CITEPROC_TEST_PATH, 'processor-tests', 'humans') LOCAL_TESTS_PATH = os.path.join(os.path.dirname(__file__), "local") FAILING_TESTS_FILE = 'failing_tests.txt' # The results of the following tests are ignored, since they don't test CSL # features, but citeproc-js specific features IGNORED_RESULS = { 'date_Accessed': 'raw date', 'date_LopsidedDataYearSuffixCollapse': 'raw date', 'date_SeasonRange1': 'raw date', 'date_SeasonRange2': 'raw date', 'date_SeasonRange3': 'raw date', 'date_String': 'raw date', } class ProcessorTest(object): """Parses atest fixture and provides a method for processing the tests defined in it.""" bib_prefix = '
' bib_suffix = '
' item_prefix = '
' item_suffix = '
' def __init__(self, filename): self.csl_test = CslTest({}, None, (filename, ), os.path.basename(filename)) self.csl_test.parse() csl_io = io.BytesIO(utf_8_encode(self.data['csl'])[0]) self.style = CitationStylesStyle(csl_io) self._fix_input(self.data['input']) self.references = [item['id'] for item in self.data['input']] self.references_dict = CiteProcJSON(self.data['input']) self.bibliography = CitationStylesBibliography(self.style, self.references_dict) self.expected = self.data['result'].splitlines() @property def data(self): return self.csl_test.data @staticmethod def _fix_input(input_data): for i, ref in enumerate(input_data): if 'id' not in ref: ref['id'] = i if 'type' not in ref: ref['type'] = 'book' def execute(self): if self.data['citation_items']: citations = [self.parse_citation(item) for item in self.data['citation_items']] elif self.data['citations']: citations = [] for cit in self.data['citations']: cit = cit[0] citation_items = [self.parse_citation_item(cititem) for cititem in cit['citationItems']] citation = Citation(citation_items) citation.key = cit['citationID'] citation.note_index = cit['properties']['noteIndex'] citations.append(citation) elif self.data['bibentries']: citation_items = [self.parse_citation_item({'id': entry}) for entry in self.data['bibentries'][-1]] citations = [Citation(citation_items)] else: citation_items = [self.parse_citation_item({'id': ref}) for ref in self.references] citations = [Citation(citation_items)] for citation in citations: self.bibliography.register(citation) if self.style.has_bibliography(): self.bibliography.sort() results = [] do_nothing = lambda x: None # callback passed to cite() if self.data['mode'] == 'citation': if self.data['citations']: for i, citation in enumerate(citations): if i == len(citations) - 1: dots_or_other = '>>' else: dots_or_other = '..' results.append('{}[{}] '.format(dots_or_other, i) + self.bibliography.cite(citation, do_nothing)) else: for citation in citations: results.append(self.bibliography.cite(citation, do_nothing)) elif self.data['mode'] in ('bibliography', 'bibliography-nosort'): results.append(self.bib_prefix) for entry in self.bibliography.bibliography(): text = self.item_prefix + str(entry) + self.item_suffix results.append(text) results.append(self.bib_suffix) return results def parse_citation(self, citation_data): citation_items = [] for item in citation_data: citation_item = self.parse_citation_item(item) citation_items.append(citation_item) return Citation(citation_items) def parse_citation_item(self, citation_item_data): options = {} for key, value in citation_item_data.items(): python_key = key.replace('-', '_') if python_key == 'id': reference_key = str(value) continue elif python_key == 'locator': try: options['locator'] = Locator(citation_item_data['label'], value) except KeyError: # some tests don't specify the label options['locator'] = Locator('page', value) elif python_key == 'label': pass else: options[python_key] = value return CitationItem(reference_key, **options) class FailedTests(object): """Read the known failed tests from a file and update the file with the results from a new test run.""" def __init__(self, filename): self.filename = filename with open(filename, 'r') as file: self.lines = file.readlines() self.now_failing = {} self.updated_lines = [] def mark_failure(self, test_name, reason=None): self.now_failing[test_name] = reason def compare(self): assert not self.updated_lines was_failing = set() new_failing_tests = [] new_fixed_tests = [] for line in self.lines: test_name, comment = (line.split('#') if '#' in line else (line, None)) test_name = test_name.strip() if test_name and test_name not in self.now_failing: new_fixed_tests.append(test_name) continue was_failing.add(test_name) self.updated_lines.append(line) for test_name in sorted(self.now_failing.keys()): if test_name not in was_failing: reason = self.now_failing[test_name] line = ('{:<66} # {}'.format(test_name, reason) if reason else test_name) self.updated_lines.append(line + '\n') new_failing_tests.append(test_name) return new_failing_tests, new_fixed_tests def update_file(self): assert self.updated_lines with open(self.filename, 'w') as file: file.writelines(self.updated_lines) def execute_git_command(args, echo=False): """Execute a git command, exiting this script when it returns a non-zero error code.""" command = ['git'] + args if echo: print(' '.join(command)) process = Popen(command, stdin=PIPE, stdout=PIPE, stderr=PIPE) out, err = process.communicate() if process.returncode: print('Calling git failed. Make sure git is installed. Aborting.') sys.exit(1) return out, err def clone_test_suite(): """Clone the citeproc-test repository if it is not present. Otherwise, check whether the correct commit is checked out.""" if not os.path.exists(CITEPROC_TEST_PATH): git_clone = ['clone', CITEPROC_TEST_REPOSITORY, CITEPROC_TEST_PATH] print('Cloning the test-suite repository...') execute_git_command(git_clone, echo=True) git_checkout = ['-C', CITEPROC_TEST_PATH, 'checkout', CITEPROC_TEST_COMMIT] print('Checking out the specified commit...') execute_git_command(git_checkout) else: git_ref = ['-C', CITEPROC_TEST_PATH, 'rev-parse', 'HEAD'] commit_ref, _ = execute_git_command(git_ref) if commit_ref.strip() != CITEPROC_TEST_COMMIT.encode('ascii'): print('The checked-out commit of test-suite does not match \n' 'the one recorded in this test script. Aborting.') sys.exit(1) git_fetch = ['-C', CITEPROC_TEST_PATH, 'fetch'] execute_git_command(git_fetch) git_ref = ['-C', CITEPROC_TEST_PATH, 'rev-parse', 'origin/master'] commit_ref, _ = execute_git_command(git_ref) has_updates = commit_ref.strip() != CITEPROC_TEST_COMMIT.encode('ascii') return has_updates RED = '\033[91m' GREEN = '\033[92m' BOLD = '\033[1m' END = '\033[0m' if __name__ == '__main__': usage = ('usage: %prog [options] glob_pattern\n\n' 'glob_pattern limits the tests that are executed, for example:\n' ' %prog *Sort*\n' 'runs only test fixtures that have "Sort" in the filename') parser = OptionParser(usage) parser.add_option('-m', '--max', dest='max', default=-1, help='run up to MAX tests', metavar='MAX') parser.add_option('-v', '--verbose', dest='verbose', action='store_true', default=False, help='print results for each test') parser.add_option('-r', '--raise', dest='catch_exceptions', default=True, action='store_false', help='do not catch exceptions (aborts program)') parser.add_option('-s', '--summary', dest='summary', action='store_true', default=False, help='print a summary of the test results') parser.add_option('-n', '--no-update', dest='update', action='store_false', default=True, help='do not update {}' .format(FAILING_TESTS_FILE)) parser.add_option('-f', '--file', dest='file', default=None, help='write output to FILE', metavar='FILE') (options, args) = parser.parse_args() max_tests = int(options.max) try: destination = open(options.file, 'wt', encoding='utf-8') class UnicodeWriter(object): def write(self, s): destination.write(str(s)) sys.stderr = UnicodeWriter() except TypeError: destination = sys.stdout def out(*args): if not args: destination.write('\n') else: print(*args, file=destination) def print_result(name, passed, total): out(' {:<13} {:>3} / {:>3} ({:>4.0%})'.format(name, passed, total, passed / total)) try: glob_pattern = args[0] run_all_tests = False except IndexError: glob_pattern = '*' run_all_tests = True test_repo_has_updates = clone_test_suite() # import the text fixture parser included with citeproc-test try: # Python 3.3+ from importlib.machinery import SourceFileLoader loader = SourceFileLoader('processor', TEST_PARSER_PATH) processor = loader.load_module() except ImportError: # older Python versions from imp import load_source processor = load_source('processor', TEST_PARSER_PATH) from processor import CslTest global CslTest total_count = {} passed_count = {} failed_tests = FailedTests(os.path.join(os.path.dirname(__file__), FAILING_TESTS_FILE)) count = 0 test_files = list(glob.glob(os.path.join(TESTS_PATH, '{}.txt'.format(glob_pattern)))) test_files += list(glob.glob(os.path.join(LOCAL_TESTS_PATH, '{}.txt'.format(glob_pattern)))) for filename in sorted(test_files): test_name, _ = os.path.basename(filename).split('.txt') category, _ = os.path.basename(filename).split('_') passed_count.setdefault(category, 0) if count == max_tests: break reason = None try: if test_name not in IGNORED_RESULS: total_count[category] = total_count.get(category, 0) + 1 count += 1 t = ProcessorTest(filename) if run_all_tests and (t.data['mode'] == 'bibliography-header' or t.data['bibsection']): continue if options.verbose: out('>>> Testing {}'.format(os.path.basename(filename))) out('EXP: ' + '\n '.join(t.expected)) results = t.execute() results = reduce(lambda x, y: x+y, [item.split('\n') for item in results]) results = [item.replace('&', '&') for item in results] if options.verbose: out('RES: ' + '\n '.join(results)) if results == t.expected: if test_name not in IGNORED_RESULS: passed_count[category] += 1 if options.verbose: out('<<< SUCCESS\n') continue else: if options.verbose: out('<<< FAILED\n') del t except Exception as e: if not options.catch_exceptions: raise if options.verbose: out('Exception in', os.path.basename(filename)) traceback.print_exc() out('<<< FAILED\n') reason = 'uncaught exception' if test_name not in IGNORED_RESULS: failed_tests.mark_failure(test_name, reason) success = False if sum(total_count.values()) == 0: print(': check README.md file for instructions') else: if run_all_tests: new_failing, new_fixed = failed_tests.compare() success = not (new_failing or new_fixed) if options.update: failed_tests.update_file() if new_failing: out(BOLD + 'New failing tests:' + END) for test_name in new_failing: out(' ' + RED + test_name + END) if new_failing or new_fixed: out() else: out('All is well.') if new_fixed: out(BOLD + 'Fixed tests:' + END) for test_name in new_fixed: out(' ' + GREEN + test_name + END) out() out('You need to fix the newly failing tests and may commit the \n' 'removal of the fixed tests from {}'.format(FAILING_TESTS_FILE)) if test_repo_has_updates: out() out(BOLD + 'The test-suite repository has updates! Consider ' 'updating the test script.' + END) else: failing = sorted(failed_tests.now_failing.keys()) success = not failing out(BOLD + 'Failing tests:' + END) for test_name in failing: out(' ' + RED + test_name + END) if options.summary: out() out(BOLD + 'Summary:' + END) for category in sorted(total_count.keys()): print_result(category, passed_count[category], total_count[category]) out() print_result('total', sum(passed_count.values()), sum(total_count.values())) try: destination.close() except AttributeError: pass sys.exit(0 if success else 1) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1785944092.7096736 citeproc_py-0.10.4/tests/local/0000755000175100017510000000000015234654035016025 5ustar00runnerrunner././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/tests/local/condition_LocatorVariables.txt0000644000175100017510000000405015234654005024064 0ustar00runnerrunner>>===== MODE =====>> citation <<===== MODE =====<< >>===== DESCRIPTION =====>> <<===== DESCRIPTION =====<< >>===== RESULT =====>> (Doe) (Doe 23) <<===== RESULT =====<< >>===== CITATION-ITEMS =====>> [ [ { "id": "ITEM-1" } ], [ { "id": "ITEM-1", "label": "page", "locator": 23 } ] ] <<===== CITATION-ITEMS =====<< >>===== CSL =====>> <<===== CSL =====<< >>===== INPUT =====>> [ { "id": "ITEM-1", "type": "book", "author": [ { "family": "Doe", "given": "John" } ], "issued": { "date-parts": [ [ "1984" ] ] }, "title": "Title" } ] <<===== INPUT =====<< >>===== VERSION =====>> 1.0 <<===== VERSION =====<< ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/tests/local/term_EmptyValueForTermSkipsField.txt0000644000175100017510000024704615234654005025177 0ustar00runnerrunner>>===== MODE =====>> bibliography <<===== MODE =====<< >>===== DESCRIPTION =====>> <<===== DESCRIPTION =====<< >>===== RESULT =====>>
Doe, J.. (2015). Page Title. Website Title. https://example.com
<<===== RESULT =====<< >>===== CSL =====>> <<===== CSL =====<< >>===== INPUT =====>> [ { "id": "ITEM-1", "type": "webpage", "author": [ { "family": "Doe", "given": "John" } ], "issued": { "date-parts": [ [ "2015" ] ] }, "title": "Page Title", "container_title": "Website Title", "URL": "https://example.com" } ] <<===== INPUT =====<< >>===== VERSION =====>> 1.0 <<===== VERSION =====<< ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/tests/test.bib0000644000175100017510000000101715234654005016364 0ustar00runnerrunner@INPROCEEDINGS{Blakley1979, AUTHOR = {Blakley, G. R.}, BOOKTITLE = {Proceedings of the National Computer Conference}, DOI = {10.1109/AFIPS.1979.98}, LOCATION = {Los Alamitos, CA, USA}, PAGES = {313}, PUBLISHER = {IEEE Computer Society}, TITLE = {{Safeguarding cryptographic key’s}}, URL = {http://www.computer.org/csdl/proceedings/afips/1979/5087/00/50870313-abs.html http://www.computer.org/csdl/proceedings/afips/1979/5087/00/50870313.pdf}, VOLUME = {0}, YEAR = {1979}, }././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/tests/test_base.py0000644000175100017510000000024315234654005017252 0ustar00runnerrunnerfrom citeproc import __version__ def test_version(): assert len(__version__.split(".")) >= 3, f"__version__ should have MAJOR.MINOR.PATCH, got {__version__}" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/tests/test_bibliography.py0000644000175100017510000000735515234654005021026 0ustar00runnerrunner# coding: utf-8 from citeproc import ( Citation, CitationItem, CitationStylesBibliography, CitationStylesStyle, formatter, source, ) from unittest import TestCase from citeproc.source.bibtex.bibparse import BibTeXParser template = { "type": "book", "title": "La Rettorica", "author": [{"literal": "Brunetto Latini"}], "issued": {"date-parts": [[1968]]}, "editor": [{"literal": "Francesco Maggini"}], "publisher": "Le Monnier", "location": "Firenze", } def _pp(string): # The edition renders as an ordinal (e.g. "2nd edn"); its word position # varies by locale, but it is the only token that starts with a digit (the # year is parenthesized), so pick that token out. return next(word for word in string.split(" ") if word[:1].isdigit()) class TestBibliographyGeneration(TestCase): def test_generate(self): expected_ordinals = { "en-US": {0: "1st", 1: "2nd", 3: "4th", 19: "20th"}, "de-DE": {0: "1.", 9: "10."}, "es-ES": {0: "1.ª"}, "fr-FR": {0: "1ʳᵉ", 9: "10ᵉ"}, "hi-IN": {0: "1वाँ"}, "it-IT": {0: "1º"} } for lg, ordinals in expected_ordinals.items(): bib_style = CitationStylesStyle("harvard-cite-them-right", lg) entries = [] for edition in range(1, 26): template["id"] = str(edition) template["edition"] = edition entries.append(template.copy()) bib = source.json.CiteProcJSON(entries) bibliography = CitationStylesBibliography(bib_style, bib, formatter.plain) citations = [CitationItem(str(x)) for x in range(1, 26)] bibliography.register(Citation(citations)) generated_ordinals = [_pp(x) for x in bibliography.style.render_bibliography(citations)] for index, expected_value in ordinals.items(): assert generated_ordinals[index] == expected_value, f"Failed for {lg} at index {index}. Expected: {expected_value}, Got: {generated_ordinals[index]}" def test_ordinals_with_embedded_locale(self): """chicago-author-date has an embedded that defines editor/translator terms but no ordinal terms. Ordinals must still be resolved from the file-based en-US locale data. Regression test for https://github.com/citeproc-py/citeproc-py/issues/183.""" bib_style = CitationStylesStyle("chicago-author-date", "en-US") entries = [ { "id": str(n), "type": "book", "title": "Some Book", "author": [{"family": "Smith", "given": "John"}], "issued": {"date-parts": [[2020]]}, "publisher": "Publisher", "publisher-place": "New York", "edition": n, } for n in range(1, 5) ] bib = source.json.CiteProcJSON(entries) bibliography = CitationStylesBibliography(bib_style, bib, formatter.plain) citations = [CitationItem(str(x)) for x in range(1, 5)] bibliography.register(Citation(citations)) rendered = bibliography.style.render_bibliography(citations) # The ordinal edition token is the 6th whitespace-delimited word, e.g.: # "Smith, John. 2020. Some Book. 2nd ed. New York: Publisher." ordinals = [r.split()[5] for r in rendered] assert ordinals[0] == "1st", f"Expected '1st', got '{ordinals[0]}'" assert ordinals[1] == "2nd", f"Expected '2nd', got '{ordinals[1]}'" assert ordinals[2] == "3rd", f"Expected '3rd', got '{ordinals[2]}'" assert ordinals[3] == "4th", f"Expected '4th', got '{ordinals[3]}'" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/tests/test_bibparse.py0000644000175100017510000000540015234654005020127 0ustar00runnerrunner# coding: utf-8 import os from io import StringIO from unittest import TestCase from citeproc.source.bibtex.bibparse import BibTeXParser, BibTeXDecodeError TEST_BIB = os.path.join(os.path.dirname(__file__), 'test.bib') class TestBibTeXParser(TestCase): def test_parse(self): file = StringIO(sample) bib = BibTeXParser(file) self.print_entries(bib) # TODO: perform useful checks def test_parse_file(self): test_bib = BibTeXParser(TEST_BIB, encoding='utf-8') self.print_entries(test_bib) def test_parse_file_bad_encoding(self): with self.assertRaises(BibTeXDecodeError): BibTeXParser(TEST_BIB) @staticmethod def print_entries(bib): for key, entry in bib.items(): print(key) for name, value in entry.items(): print(' {}: {}'.format(name, value)) # based on the sample BibTeX database by Xavier Décoret # http://artis.imag.fr/~Xavier.Decoret/resources/xdkbibtex/bibtex_summary.html sample = r""" @Article(py03, author = {Xavier D\'ecoret}, title = "PyBiTex", year = 2003 ) @Article{key03, title = "A {bunch {of} braces {in}} title" } @Article{key01a, author = "Simon {"}the {saint"} Templar", } @Article{key01b, title = "The history of @ sign" } Some {{comments} with unbalanced braces ....and a "commented" entry... Book{landru21, author = {Landru, Henri D\'esir\'e}, title = {A hundred recipes for you wife}, publisher = {Culinary Expert Series}, year = 1921 } ..some other comments..before a valid entry... @Book{steward03a, author = { Martha Steward }, title = {Cooking behind bars}, publisher = {Culinary Expert Series}, year = 2003 } ...and finally an entry commented by the use of the special @Comment entry type. @Comment{steward03b, author = {Martha Steward}, title = {Cooking behind bars}, publisher = {Culinary Expert Series}, year = 2003 } @Comment{ @Book{steward03c, author = {Martha Steward}, title = {Cooking behind bars}, publisher = {Culinary Expert Series}, year = 2003 } } @String(mar = "march") @Book{sweig42, Author = { Stefan Sweig }, title = { The impossible book }, publisher = { Dead Poet Society}, year = 1942, month = mar } @String {firstname = "Xavier"} @String {lastname = "Decoret"} @String {email = firstname # "." # lastname # "@imag.fr"} @preamble{ "\newcommand{\noopsort}[1]{} " # "\newcommand{\printfirst}[2]{#1} " # "\newcommand{\singleletter}[1]{#1} " # "\newcommand{\switchargs}[2]{#2#1} " } @INBOOK{inbook-minimal, author = "Donald E. Knuth", title = "Fundamental Algorithms", publisher = "Addison-Wesley", year = "{\noopsort{1973b}}1973", chapter = "1.2", } """ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/tests/test_bibtex.py0000644000175100017510000003477415234654005017635 0ustar00runnerrunner# coding: utf-8 from unittest import TestCase from citeproc.source.bibtex import BibTeX from citeproc.source.bibtex.bibtex import split_names, split_name, parse_name class TestBibTeX(TestCase): def test_split_names(self): for names, parts in SPLIT_NAMES: print(names, split_names(names)) self.assertEqual(split_names(names), parts) def test_split_name(self): for name, parts in SPLIT_NAME: self.assertEqual(split_name(name), parts) def test_parse_name(self): for name, reference in DECORET_NAMES: print('{:24} {}'.format(name, parse_name(name))) self.assertEqual(parse_name(name), reference) for name, parts in PYBTEX_NAMES: reference = tuple(' '.join(pieces) if pieces else None for pieces in parts) print('{:24} {}'.format(name, parse_name(name))) self.assertEqual(parse_name(name), reference) for name, reference in EXTRA_NAMES: print('{:24} {}'.format(name, parse_name(name))) self.assertEqual(parse_name(name), reference) def test_date_months(self): for january in ['jan', 'JAN', '01']: self.assertEqual(BibTeX._parse_month(january), ({'month': 1}, ) * 2) self.assertEqual(BibTeX._parse_month("10~jan"), ({'month': 1, 'day': 10}, ) * 2) self.assertEqual(BibTeX._parse_month("jul~4"), ({'month': 7, 'day': 4}, ) * 2) def test_pages(self): def test(bibtex, csl): self.assertEqual(BibTeX._bibtex_to_csl_pages(bibtex), csl) test('313', '313') test('R112', 'R112') test('12+', '12') # page ranges test('1--3', '1-3') test('1-3', '1-3') test('i-iv', 'i-iv') test('11.1--11.27', '11.1-11.27') test('S43--S67', 'S43-S67') # Arabic letters test('ا-ي', 'ا-ي') SPLIT_NAMES = [ ('AA BB', ['AA BB']), ('AA and BB', ['AA', 'BB']), ('AA{ and }BB', ['AA{ and }BB']), ('AA{ }and BB', ['AA{ }and BB']), ] SPLIT_NAME = [ ('aa bb cc', [['aa', 'bb', 'cc']]), ('aa{ }bb cc', [['aa{ }bb', 'cc']]), ('aa{, }bb cc', [['aa{, }bb', 'cc']]), ('aa {bb} cc', [['aa', '{bb}', 'cc']]), ('aa bb, cc', [['aa', 'bb'], ['cc']]), ] # http://maverick.inria.fr/~Xavier.Decoret/resources/xdkbibtex/bibtex_summary.html DECORET_NAMES = [ # name string First von Last Jr ( 'AA BB' , ( 'AA' , None , 'BB' , None )), # Testing simple case with no von. ( 'AA' , ( None , None , 'AA' , None )), # Testing that Last cannot be empty. ( 'AA bb' , ( 'AA' , None , 'bb' , None )), # Idem. ( 'aa' , ( None , None , 'aa' , None )), # Idem. ( 'AA bb CC' , ( 'AA' , 'bb' , 'CC' , None )), # Testing simple von. ( 'AA bb CC dd EE' , ( 'AA' , 'bb CC dd' , 'EE' , None )), # Testing simple von (with inner uppercase words) ( 'AA 1B cc dd' , ( 'AA 1B' , 'cc' , 'dd' , None )), # Testing that digits are caseless (B fixes the case of 1B to uppercase). ( 'AA 1b cc dd' , ( 'AA' , '1b cc' , 'dd' , None )), # Testing that digits are caseless (b fixes the case of 1b to lowercase) ( 'AA {b}B cc dd' , ( 'AA {b}B' , 'cc' , 'dd' , None )), # Testing that pseudo letters are caseless. ( 'AA {b}b cc dd' , ( 'AA' , '{b}b cc' , 'dd' , None )), # Idem. ( 'AA {B}b cc dd' , ( 'AA' , '{B}b cc' , 'dd' , None )), # Idem. ( 'AA {B}B cc dd' , ( 'AA {B}B' , 'cc' , 'dd' , None )), # Idem. (r'AA \BB{b} cc dd', (r'AA \BB{b}', 'cc' , 'dd' , None )), # Testing that non letters are case less (in particular show how latex command are considered). (r'AA \bb{b} cc dd', ( 'AA' ,r'\bb{b} cc' , 'dd' , None )), # Idem. ( 'AA {bb} cc DD' , ( 'AA {bb}' , 'cc' , 'DD' , None )), # Testing that caseless words are grouped with First primilarily and then with Last. ( 'AA bb {cc} DD' , ( 'AA' , 'bb' , '{cc} DD' , None )), # Idem. ( 'AA {bb} CC' , ( 'AA {bb}' , None , 'CC' , None )), # Idem. ( 'bb CC, AA' , ('AA' , 'bb' , 'CC' , None )), # Simple case. Case do not matter for First. ( 'bb CC, aa' , ('aa' , 'bb' , 'CC' , None )), # Idem. ( 'bb CC dd EE, AA', ('AA' , 'bb CC dd' , 'EE' , None )), # Testing simple von (with inner uppercase). ( 'bb, AA' , ('AA' , None , 'bb' , None )), # Testing that the Last part cannot be empty. ( 'BB,' , ( None , None , 'BB' , None )), # Testing that first can be empty after coma ( 'bb CC,XX, AA' , ('AA' , 'bb' , 'CC' , 'XX' )), # Simple Jr. Case do not matter for it. ( 'bb CC,xx, AA' , ('AA' , 'bb' , 'CC' , 'xx' )), # Idem. ( 'BB,, AA' , ('AA' , None , 'BB' , None )), # Testing that jr can be empty in between comas. (r"Paul \'Emile Victor" , (r"Paul \'Emile" , None , "Victor", None)), (r"Paul {\'E}mile Victor" , (r"Paul {\'E}mile", None , "Victor", None)), (r"Paul \'emile Victor" , ( "Paul" , r"\'emile" , "Victor", None)), (r"Paul {\'e}mile Victor" , ( "Paul" , r"{\'e}mile", "Victor", None)), (r"Victor, Paul \'Emile" , (r"Paul \'Emile" , None , "Victor", None)), (r"Victor, Paul {\'E}mile", (r"Paul {\'E}mile", None , "Victor", None)), (r"Victor, Paul \'emile" , (r"Paul \'emile" , None , "Victor", None)), (r"Victor, Paul {\'e}mile", (r"Paul {\'e}mile", None , "Victor", None)), ('Dominique Galouzeau de Villepin', ('Dominique Galouzeau', 'de' , 'Villepin' , None)), ('Dominique {G}alouzeau de Villepin', ('Dominique' , '{G}alouzeau de', 'Villepin' , None)), ('Galouzeau de Villepin, Dominique', ('Dominique' , None , 'Galouzeau de Villepin', None)), ] # from Pybtex - /pybtex/tests/parse_name_test.py PYBTEX_NAMES = [ ('A. E. Siegman', (['A.', 'E.'], [], ['Siegman'], [])), ('A. G. W. Cameron', (['A.', 'G.', 'W.'], [], ['Cameron'], [])), ('A. Hoenig', (['A.'], [], ['Hoenig'], [])), ('A. J. Van Haagen', (['A.', 'J.', 'Van'], [], ['Haagen'], [])), ('A. S. Berdnikov', (['A.', 'S.'], [], ['Berdnikov'], [])), ('A. Trevorrow', (['A.'], [], ['Trevorrow'], [])), ('Adam H. Lewenberg', (['Adam', 'H.'], [], ['Lewenberg'], [])), ('Addison-Wesley Publishing Company', (['Addison-Wesley', 'Publishing'], [], ['Company'], [])), ('Advogato (Raph Levien)', (['Advogato', '(Raph'], [], ['Levien)'], [])), ('Andrea de Leeuw van Weenen', (['Andrea'], ['de', 'Leeuw', 'van'], ['Weenen'], [])), ('Andreas Geyer-Schulz', (['Andreas'], [], ['Geyer-Schulz'], [])), ("Andr{\\'e} Heck", (["Andr{\\'e}"], [], ['Heck'], [])), ('Anne Br{\\"u}ggemann-Klein', (['Anne'], [], ['Br{\\"u}ggemann-Klein'], [])), ('Anonymous', ([], [], ['Anonymous'], [])), ('B. Beeton', (['B.'], [], ['Beeton'], [])), ('B. Hamilton Kelly', (['B.', 'Hamilton'], [], ['Kelly'], [])), ('B. V. Venkata Krishna Sastry', (['B.', 'V.', 'Venkata', 'Krishna'], [], ['Sastry'], [])), ('Benedict L{\\o}fstedt', (['Benedict'], [], ['L{\\o}fstedt'], [])), ('Bogus{\\l}aw Jackowski', (['Bogus{\\l}aw'], [], ['Jackowski'], [])), ('Christina A. L.\\ Thiele', (['Christina', 'A.', 'L.\\'], [], ['Thiele'], [])), ("D. Men'shikov", (['D.'], [], ["Men'shikov"], [])), ("Darko \\v{Z}ubrini{\\'c}", (['Darko'], [], ["\\v{Z}ubrini{\\'c}"], [])), ("Dunja Mladeni{\\'c}", (['Dunja'], [], ["Mladeni{\\'c}"], [])), ('Edwin V. {Bell, II}', (['Edwin', 'V.'], [], ['{Bell, II}'], [])), ('Frank G. {Bennett, Jr.}', (['Frank', 'G.'], [], ['{Bennett, Jr.}'], [])), ("Fr{\\'e}d{\\'e}ric Boulanger", (["Fr{\\'e}d{\\'e}ric"], [], ['Boulanger'], [])), ('Ford, Jr., Henry', (['Henry'], [], ['Ford'], ['Jr.'])), ('mr Ford, Jr., Henry', (['Henry'], ['mr'], ['Ford'], ['Jr.'])), ('Fukui Rei', (['Fukui'], [], ['Rei'], [])), ('G. Gr{\\"a}tzer', (['G.'], [], ['Gr{\\"a}tzer'], [])), ('George Gr{\\"a}tzer', (['George'], [], ['Gr{\\"a}tzer'], [])), ('Georgia K. M. Tobin', (['Georgia', 'K.', 'M.'], [], ['Tobin'], [])), ('Gilbert van den Dobbelsteen', (['Gilbert'], ['van', 'den'], ['Dobbelsteen'], [])), ('Gy{\\"o}ngyi Bujdos{\\\'o}', (['Gy{\\"o}ngyi'], [], ["Bujdos{\\'o}"], [])), ('Helmut J{\\"u}rgensen', (['Helmut'], [], ['J{\\"u}rgensen'], [])), ('Herbert Vo{\\ss}', (['Herbert'], [], ['Vo{\\ss}'], [])), ("H{\\'a}n Th{\\^e}\\llap{\\raise 0.5ex\\hbox{\\'{\\relax}}} Th{\\'a}nh", (["H{\\'a}n", "Th{\\^e}\\llap{\\raise 0.5ex\\hbox{\\'{\\relax}}}"], [], ["Th{\\'a}nh"], [])), ("H{\\`a}n Th\\^e\\llap{\\raise0.5ex\\hbox{\\'{\\relax}}} Th{\\`a}nh", (['H{\\`a}n', "Th\\^e\\llap{\\raise0.5ex\\hbox{\\'{\\relax}}}"], [], ['Th{\\`a}nh'], [])), ("J. Vesel{\\'y}", (['J.'], [], ["Vesel{\\'y}"], [])), ("Javier Rodr\\'{\\i}guez Laguna", (['Javier', "Rodr\\'{\\i}guez"], [], ['Laguna'], [])), ("Ji\\v{r}\\'{\\i} Vesel{\\'y}", (["Ji\\v{r}\\'{\\i}"], [], ["Vesel{\\'y}"], [])), ("Ji\\v{r}\\'{\\i} Zlatu{\\v{s}}ka", (["Ji\\v{r}\\'{\\i}"], [], ['Zlatu{\\v{s}}ka'], [])), ("Ji\\v{r}{\\'\\i} Vesel{\\'y}", (["Ji\\v{r}{\\'\\i}"], [], ["Vesel{\\'y}"], [])), ("Ji\\v{r}{\\'{\\i}}Zlatu{\\v{s}}ka", ([], [], ["Ji\\v{r}{\\'{\\i}}Zlatu{\\v{s}}ka"], [])), ('Jim Hef{}feron', (['Jim'], [], ['Hef{}feron'], [])), ('J{\\"o}rg Knappen', (['J{\\"o}rg'], [], ['Knappen'], [])), ('J{\\"o}rgen L. Pind', (['J{\\"o}rgen', 'L.'], [], ['Pind'], [])), ("J{\\'e}r\\^ome Laurens", (["J{\\'e}r\\^ome"], [], ['Laurens'], [])), ('J{{\\"o}}rg Knappen', (['J{{\\"o}}rg'], [], ['Knappen'], [])), ('K. Anil Kumar', (['K.', 'Anil'], [], ['Kumar'], [])), ("Karel Hor{\\'a}k", (['Karel'], [], ["Hor{\\'a}k"], [])), ("Karel P\\'{\\i}{\\v{s}}ka", (['Karel'], [], ["P\\'{\\i}{\\v{s}}ka"], [])), ("Karel P{\\'\\i}{\\v{s}}ka", (['Karel'], [], ["P{\\'\\i}{\\v{s}}ka"], [])), ("Karel Skoup\\'{y}", (['Karel'], [], ["Skoup\\'{y}"], [])), ("Karel Skoup{\\'y}", (['Karel'], [], ["Skoup{\\'y}"], [])), ('Kent McPherson', (['Kent'], [], ['McPherson'], [])), ('Klaus H{\\"o}ppner', (['Klaus'], [], ['H{\\"o}ppner'], [])), ('Lars Hellstr{\\"o}m', (['Lars'], [], ['Hellstr{\\"o}m'], [])), ('Laura Elizabeth Jackson', (['Laura', 'Elizabeth'], [], ['Jackson'], [])), ("M. D{\\'{\\i}}az", (['M.'], [], ["D{\\'{\\i}}az"], [])), ('M/iche/al /O Searc/oid', (['M/iche/al', '/O'], [], ['Searc/oid'], [])), ("Marek Ry{\\'c}ko", (['Marek'], [], ["Ry{\\'c}ko"], [])), ('Marina Yu. Nikulina', (['Marina', 'Yu.'], [], ['Nikulina'], [])), ("Max D{\\'{\\i}}az", (['Max'], [], ["D{\\'{\\i}}az"], [])), ('Merry Obrecht Sawdey', (['Merry', 'Obrecht'], [], ['Sawdey'], [])), ("Miroslava Mis{\\'a}kov{\\'a}", (['Miroslava'], [], ["Mis{\\'a}kov{\\'a}"], [])), ('N. A. F. M. Poppelier', (['N.', 'A.', 'F.', 'M.'], [], ['Poppelier'], [])), ('Nico A. F. M. Poppelier', (['Nico', 'A.', 'F.', 'M.'], [], ['Poppelier'], [])), ('Onofrio de Bari', (['Onofrio'], ['de'], ['Bari'], [])), ("Pablo Rosell-Gonz{\\'a}lez", (['Pablo'], [], ["Rosell-Gonz{\\'a}lez"], [])), ('Paco La Bruna', (['Paco', 'La'], [], ['Bruna'], [])), ('Paul Franchi-Zannettacci', (['Paul'], [], ['Franchi-Zannettacci'], [])), ('Pavel \\v{S}eve\\v{c}ek', (['Pavel'], [], ['\\v{S}eve\\v{c}ek'], [])), ('Petr Ol{\\v{s}}ak', (['Petr'], [], ['Ol{\\v{s}}ak'], [])), ("Petr Ol{\\v{s}}{\\'a}k", (['Petr'], [], ["Ol{\\v{s}}{\\'a}k"], [])), ('Primo\\v{z} Peterlin', (['Primo\\v{z}'], [], ['Peterlin'], [])), ('Prof. Alban Grimm', (['Prof.', 'Alban'], [], ['Grimm'], [])), ("P{\\'e}ter Husz{\\'a}r", (["P{\\'e}ter"], [], ["Husz{\\'a}r"], [])), ("P{\\'e}ter Szab{\\'o}", (["P{\\'e}ter"], [], ["Szab{\\'o}"], [])), ('Rafa{\\l}\\.Zbikowski', ([], [], ['Rafa{\\l}\\.Zbikowski'], [])), ('Rainer Sch{\\"o}pf', (['Rainer'], [], ['Sch{\\"o}pf'], [])), ('T. L. (Frank) Pappas', (['T.', 'L.', '(Frank)'], [], ['Pappas'], [])), ('TUG 2004 conference', (['TUG', '2004'], [], ['conference'], [])), # ('TUG {\\sltt DVI} Driver Standards Committee', # (['TUG', '{\\sltt DVI}', 'Driver', 'Standards'], [], ['Committee'], [])), ('University of M{\\"u}nster', (['University'], ['of'], ['M{\\"u}nster'], [])), ('Walter van der Laan', (['Walter'], ['van', 'der'], ['Laan'], [])), ('Wendy G. McKay', (['Wendy', 'G.'], [], ['McKay'], [])), ('Wendy McKay', (['Wendy'], [], ['McKay'], [])), ('W{\\l}odek Bzyl', (['W{\\l}odek'], [], ['Bzyl'], [])), ('\\LaTeX Project Team', (['\\LaTeX', 'Project'], [], ['Team'], [])), ('\\rlap{Lutz Birkhahn}', ([], [], ['\\rlap{Lutz Birkhahn}'], [])), ('{Jim Hef{}feron}', ([], [], ['{Jim Hef{}feron}'], [])), ('{Kristoffer H\\o{}gsbro Rose}', ([], [], ['{Kristoffer H\\o{}gsbro Rose}'], [])), ('{TUG} {Working} {Group} on a {\\TeX} {Directory} {Structure}', (['{TUG}', '{Working}', '{Group}'], ['on', 'a'], ['{\\TeX}', '{Directory}', '{Structure}'], [])), ('{The \\TUB{} Team}', ([], [], ['{The \\TUB{} Team}'], [])), ('{\\LaTeX} project team', (['{\\LaTeX}'], ['project'], ['team'], [])), ('{\\NTG{} \\TeX{} future working group}', ([], [], ['{\\NTG{} \\TeX{} future working group}'], [])), ('{{\\LaTeX\\,3} Project Team}', ([], [], ['{{\\LaTeX\\,3} Project Team}'], [])), ('Johansen Kyle, Derik Mamania M.', (['Derik', 'Mamania', 'M.'], [], ['Johansen', 'Kyle'], [])), ] EXTRA_NAMES = [ ('others', (None, None, 'others', None)), ('Charles Louis Xavier Joseph de la Vall{\’e}e Poussin', ('Charles Louis Xavier Joseph', 'de la', 'Vall{\’e}e Poussin', None)), # the following name of the Pybtex tests doesn't agree with BibTeX's output # (verified using Xavier Décoret's names.bst) ('TUG {\\sltt DVI} Driver Standards Committee', ('TUG', '{\\sltt DVI}', 'Driver Standards Committee', None)), ] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/tests/test_latex.py0000644000175100017510000000710015234654005017454 0ustar00runnerrunner# coding: utf-8 from unittest import TestCase from citeproc.source.bibtex.latex import parse_latex, substitute_ligatures class TestLatex(TestCase): # from "A TEX Primer for Scientists" (sections 5.2 and 5.3) # by Stanley A. Sawyer, Steven G. Krantz MACROS = [("Æsop's fables", r"\AE sop's fables"), ('Æ is a Latin ligature', r"\AE\ is a Latin ligature"), ('A TeX expert is a TeXnician.', r"A \TeX\ expert is a \TeX nician."), ('This book is ©ed.', r"This book is \copyright ed."), ('Umeå, Sweden', r"Ume\aa, Sweden"), ('Your serial number is Å1102.', r"Your serial number is \AA1102."), ('Your serial number is Å1102.', r"Your serial number is \AA 1102."), ('$22.50 plus $ 4.07 tax.', r"\$22.50 plus \$ 4.07 tax."), ('Crève Cœur, Missouri', r"Cr\`eve C\oe ur, Missouri"), ('Pëtr, meet Françoise', r"P\"etr, meet Fran\c coise"), ('Pëtr Pëtr Pëtr', r'P\" etr P\" etr ' 'P\\"\tetr'), ] ACCENT_MACROS = [('très élevé', r"tr\`es \'elev\'e"), ('übel Föhn', r'\"ubel F\"ohn'), ('Andō Tokutarō', r"And\=o Tokutar\=o"), ('García Lorca', r"Garc\'\i a Lorca"), ('naïve', r'na\"\i ve'), ('hát hàt hȧt hät hāt', r"h\'at h\`at h\.at h\"at h\=at"), ('hãt hât ha̧t ha̱t', r"h\~at h\^at h\c at h\b at"), ('hạt hǎt ha̋t', "h\\d at h\\v at h\\H at"), ('hăt ha͡at', "h\\u at h\\t aat"), ('øre', r"\o re"), ('Øre', r"\O re"), ('łódka', r"\l\'odka"), ('Łodz', r"\L odz"), ('Altstraße', r"Altstra\ss e"), ('æsthete', r"\ae sthete"), ('Ålm', r"\AA lm"), # ('', r"{\it\$}5"), ('Œuvre', r"\OE uvre"), ] # assorted string with macros ASSORTED = [('Escobar, María José', r"Escobar, Mar{\'\i}a Jos{\'e}"), ('Escobar, María-José', r"Escobar, Mar\'{\i}a-Jos\'{e}")] WARNINGS = [('Åke José Édouard Gödel', r"\AA{ke} {Jos{\'{e}} {\'{E}douard} G{\"o}del", "Unbalanced parenthesis")] MATH = [(r'An $O(n \log n / \! \log\log n)$ Sorting Algorithm', r"An $O(n \log n / \! \log\log n)$ Sorting Algorithm")] def test_parse_latex(self): for reference, string in self.MACROS: self.assertEqual(reference, parse_latex(string)) for reference, string in self.ACCENT_MACROS: self.assertEqual(reference, parse_latex(string)) for reference, string in self.ASSORTED: self.assertEqual(reference, parse_latex(string)) for reference, string, warning in self.WARNINGS: with self.assertWarns(UserWarning) as record: self.assertEqual(reference, parse_latex(string)) message, = (rec.message.args[0] for rec in record.warnings) assert warning in message for reference, string in self.MATH: self.assertEqual(reference, parse_latex(string)) LIGATURES = [('¿Que pasa?', "?`Que pasa?"), ('¡Que!', "!`Que!")] def test_substitute_ligatures(self): for reference, string in self.LIGATURES: self.assertEqual(reference, substitute_ligatures(string)) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/tests/test_style_loading.py0000644000175100017510000001363715234654005021210 0ustar00runnerrunner""" Tests for flexible style loading from citeproc-py-styles package """ import os import sys import tempfile import unittest from unittest.mock import patch, MagicMock from citeproc import CitationStylesStyle, STYLES_PATH class TestStyleLoading(unittest.TestCase): """Test suite for flexible style loading""" def test_bundled_style_loads(self): """Test that the bundled harvard-cite-them-right style loads correctly""" style = CitationStylesStyle('harvard-cite-them-right', validate=False) self.assertIsNotNone(style) def test_full_path_style_loads(self): """Test that a style specified with full path loads correctly""" harvard_path = os.path.join(STYLES_PATH, 'harvard-cite-them-right.csl') style = CitationStylesStyle(harvard_path, validate=False) self.assertIsNotNone(style) def test_nonexistent_style_without_citeproc_py_styles(self): """Test error message when style not found and citeproc-py-styles not installed""" with patch('citeproc.frontend.os.path.exists') as mock_exists: # Make sure the style doesn't exist as a file or bundled mock_exists.side_effect = lambda path: False # Mock the import to fail with patch.dict('sys.modules', {'citeproc_styles': None}): with self.assertRaises(ValueError) as context: CitationStylesStyle('nonexistent-style', validate=False) error_msg = str(context.exception) self.assertIn('nonexistent-style', error_msg) self.assertIn('not found in bundled styles', error_msg) self.assertIn('pip install citeproc-py-styles', error_msg) def test_style_from_citeproc_py_styles(self): """Test that styles load from citeproc-py-styles when available""" # Create a mock module mock_module = MagicMock() mock_module.get_style_filepath = MagicMock(return_value='/mock/path/to/apa.csl') with patch('citeproc.frontend.os.path.exists') as mock_exists: # First call checks if 'apa' exists as path (False) # Second call checks bundled path (False) mock_exists.side_effect = [False, False] with patch.dict('sys.modules', {'citeproc_styles': mock_module}): # Mock the parent class __init__ to set root properly def mock_init(self, path, validate=False): # Create a mock root object self.root = MagicMock() self.root.get.return_value = 'en-US' self.root.set_locale_list = MagicMock() # Store the path for verification self._test_path = path with patch('citeproc.frontend.CitationStylesXML.__init__', mock_init): style = CitationStylesStyle('apa', validate=False) # Verify get_style_filepath was called with correct argument mock_module.get_style_filepath.assert_called_once_with('apa') # Verify parent init was called with the path from citeproc-py-styles self.assertEqual(style._test_path, '/mock/path/to/apa.csl') def test_style_not_in_citeproc_py_styles(self): """Test error when style not found even in citeproc-py-styles""" # Create a mock module that raises KeyError mock_module = MagicMock() mock_module.get_style_filepath = MagicMock(side_effect=KeyError('Style not found')) with patch('citeproc.frontend.os.path.exists') as mock_exists: # Style doesn't exist as file or bundled mock_exists.return_value = False with patch.dict('sys.modules', {'citeproc_styles': mock_module}): with self.assertRaises(ValueError) as context: CitationStylesStyle('unknown-style', validate=False) error_msg = str(context.exception) self.assertIn('unknown-style', error_msg) self.assertIn('not found in bundled styles', error_msg) self.assertIn('or in citeproc-py-styles package', error_msg) def test_style_file_not_found_in_citeproc_py_styles(self): """Test error when citeproc-py-styles returns path but file doesn't exist""" # Create a mock module that raises FileNotFoundError mock_module = MagicMock() mock_module.get_style_filepath = MagicMock(side_effect=FileNotFoundError('File not found')) with patch('citeproc.frontend.os.path.exists') as mock_exists: # Style doesn't exist as file or bundled mock_exists.return_value = False with patch.dict('sys.modules', {'citeproc_styles': mock_module}): with self.assertRaises(ValueError) as context: CitationStylesStyle('missing-style', validate=False) error_msg = str(context.exception) self.assertIn('missing-style', error_msg) self.assertIn('not found in bundled styles', error_msg) self.assertIn('or in citeproc-py-styles package', error_msg) def test_citeproc_py_styles_load(self): """Test loading a real style from citeproc-py-styles if installed""" try: import citeproc_styles except ImportError: self.skipTest("citeproc-py-styles (provides citeproc_styles package) not installed") from citeproc_styles import get_style_filepath # Attempt to load a known style from citeproc-py-styles style_name = 'chicago-author-date' style_path = get_style_filepath(style_name) style = CitationStylesStyle(style_name, validate=False) self.assertIsNotNone(style) self.assertTrue(hasattr(style, 'root')) # And loading with the full path should also work style = CitationStylesStyle(style_path, validate=False) self.assertIsNotNone(style) self.assertTrue(hasattr(style, 'root'))././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1785944069.0 citeproc_py-0.10.4/versioneer.py0000644000175100017510000025122515234654005016330 0ustar00runnerrunner # Version: 0.29 """The Versioneer - like a rocketeer, but for versions. The Versioneer ============== * like a rocketeer, but for versions! * https://github.com/python-versioneer/python-versioneer * Brian Warner * License: Public Domain (Unlicense) * Compatible with: Python 3.7, 3.8, 3.9, 3.10, 3.11 and pypy3 * [![Latest Version][pypi-image]][pypi-url] * [![Build Status][travis-image]][travis-url] This is a tool for managing a recorded version number in setuptools-based python projects. The goal is to remove the tedious and error-prone "update the embedded version string" step from your release process. Making a new release should be as easy as recording a new tag in your version-control system, and maybe making new tarballs. ## Quick Install Versioneer provides two installation modes. The "classic" vendored mode installs a copy of versioneer into your repository. The experimental build-time dependency mode is intended to allow you to skip this step and simplify the process of upgrading. ### Vendored mode * `pip install versioneer` to somewhere in your $PATH * A [conda-forge recipe](https://github.com/conda-forge/versioneer-feedstock) is available, so you can also use `conda install -c conda-forge versioneer` * add a `[tool.versioneer]` section to your `pyproject.toml` or a `[versioneer]` section to your `setup.cfg` (see [Install](INSTALL.md)) * Note that you will need to add `tomli; python_version < "3.11"` to your build-time dependencies if you use `pyproject.toml` * run `versioneer install --vendor` in your source tree, commit the results * verify version information with `python setup.py version` ### Build-time dependency mode * `pip install versioneer` to somewhere in your $PATH * A [conda-forge recipe](https://github.com/conda-forge/versioneer-feedstock) is available, so you can also use `conda install -c conda-forge versioneer` * add a `[tool.versioneer]` section to your `pyproject.toml` or a `[versioneer]` section to your `setup.cfg` (see [Install](INSTALL.md)) * add `versioneer` (with `[toml]` extra, if configuring in `pyproject.toml`) to the `requires` key of the `build-system` table in `pyproject.toml`: ```toml [build-system] requires = ["setuptools", "versioneer[toml]"] build-backend = "setuptools.build_meta" ``` * run `versioneer install --no-vendor` in your source tree, commit the results * verify version information with `python setup.py version` ## Version Identifiers Source trees come from a variety of places: * a version-control system checkout (mostly used by developers) * a nightly tarball, produced by build automation * a snapshot tarball, produced by a web-based VCS browser, like github's "tarball from tag" feature * a release tarball, produced by "setup.py sdist", distributed through PyPI Within each source tree, the version identifier (either a string or a number, this tool is format-agnostic) can come from a variety of places: * ask the VCS tool itself, e.g. "git describe" (for checkouts), which knows about recent "tags" and an absolute revision-id * the name of the directory into which the tarball was unpacked * an expanded VCS keyword ($Id$, etc) * a `_version.py` created by some earlier build step For released software, the version identifier is closely related to a VCS tag. Some projects use tag names that include more than just the version string (e.g. "myproject-1.2" instead of just "1.2"), in which case the tool needs to strip the tag prefix to extract the version identifier. For unreleased software (between tags), the version identifier should provide enough information to help developers recreate the same tree, while also giving them an idea of roughly how old the tree is (after version 1.2, before version 1.3). Many VCS systems can report a description that captures this, for example `git describe --tags --dirty --always` reports things like "0.7-1-g574ab98-dirty" to indicate that the checkout is one revision past the 0.7 tag, has a unique revision id of "574ab98", and is "dirty" (it has uncommitted changes). The version identifier is used for multiple purposes: * to allow the module to self-identify its version: `myproject.__version__` * to choose a name and prefix for a 'setup.py sdist' tarball ## Theory of Operation Versioneer works by adding a special `_version.py` file into your source tree, where your `__init__.py` can import it. This `_version.py` knows how to dynamically ask the VCS tool for version information at import time. `_version.py` also contains `$Revision$` markers, and the installation process marks `_version.py` to have this marker rewritten with a tag name during the `git archive` command. As a result, generated tarballs will contain enough information to get the proper version. To allow `setup.py` to compute a version too, a `versioneer.py` is added to the top level of your source tree, next to `setup.py` and the `setup.cfg` that configures it. This overrides several distutils/setuptools commands to compute the version when invoked, and changes `setup.py build` and `setup.py sdist` to replace `_version.py` with a small static file that contains just the generated version data. ## Installation See [INSTALL.md](./INSTALL.md) for detailed installation instructions. ## Version-String Flavors Code which uses Versioneer can learn about its version string at runtime by importing `_version` from your main `__init__.py` file and running the `get_versions()` function. From the "outside" (e.g. in `setup.py`), you can import the top-level `versioneer.py` and run `get_versions()`. Both functions return a dictionary with different flavors of version information: * `['version']`: A condensed version string, rendered using the selected style. This is the most commonly used value for the project's version string. The default "pep440" style yields strings like `0.11`, `0.11+2.g1076c97`, or `0.11+2.g1076c97.dirty`. See the "Styles" section below for alternative styles. * `['full-revisionid']`: detailed revision identifier. For Git, this is the full SHA1 commit id, e.g. "1076c978a8d3cfc70f408fe5974aa6c092c949ac". * `['date']`: Date and time of the latest `HEAD` commit. For Git, it is the commit date in ISO 8601 format. This will be None if the date is not available. * `['dirty']`: a boolean, True if the tree has uncommitted changes. Note that this is only accurate if run in a VCS checkout, otherwise it is likely to be False or None * `['error']`: if the version string could not be computed, this will be set to a string describing the problem, otherwise it will be None. It may be useful to throw an exception in setup.py if this is set, to avoid e.g. creating tarballs with a version string of "unknown". Some variants are more useful than others. Including `full-revisionid` in a bug report should allow developers to reconstruct the exact code being tested (or indicate the presence of local changes that should be shared with the developers). `version` is suitable for display in an "about" box or a CLI `--version` output: it can be easily compared against release notes and lists of bugs fixed in various releases. The installer adds the following text to your `__init__.py` to place a basic version in `YOURPROJECT.__version__`: from ._version import get_versions __version__ = get_versions()['version'] del get_versions ## Styles The setup.cfg `style=` configuration controls how the VCS information is rendered into a version string. The default style, "pep440", produces a PEP440-compliant string, equal to the un-prefixed tag name for actual releases, and containing an additional "local version" section with more detail for in-between builds. For Git, this is TAG[+DISTANCE.gHEX[.dirty]] , using information from `git describe --tags --dirty --always`. For example "0.11+2.g1076c97.dirty" indicates that the tree is like the "1076c97" commit but has uncommitted changes (".dirty"), and that this commit is two revisions ("+2") beyond the "0.11" tag. For released software (exactly equal to a known tag), the identifier will only contain the stripped tag, e.g. "0.11". Other styles are available. See [details.md](details.md) in the Versioneer source tree for descriptions. ## Debugging Versioneer tries to avoid fatal errors: if something goes wrong, it will tend to return a version of "0+unknown". To investigate the problem, run `setup.py version`, which will run the version-lookup code in a verbose mode, and will display the full contents of `get_versions()` (including the `error` string, which may help identify what went wrong). ## Known Limitations Some situations are known to cause problems for Versioneer. This details the most significant ones. More can be found on Github [issues page](https://github.com/python-versioneer/python-versioneer/issues). ### Subprojects Versioneer has limited support for source trees in which `setup.py` is not in the root directory (e.g. `setup.py` and `.git/` are *not* siblings). The are two common reasons why `setup.py` might not be in the root: * Source trees which contain multiple subprojects, such as [Buildbot](https://github.com/buildbot/buildbot), which contains both "master" and "slave" subprojects, each with their own `setup.py`, `setup.cfg`, and `tox.ini`. Projects like these produce multiple PyPI distributions (and upload multiple independently-installable tarballs). * Source trees whose main purpose is to contain a C library, but which also provide bindings to Python (and perhaps other languages) in subdirectories. Versioneer will look for `.git` in parent directories, and most operations should get the right version string. However `pip` and `setuptools` have bugs and implementation details which frequently cause `pip install .` from a subproject directory to fail to find a correct version string (so it usually defaults to `0+unknown`). `pip install --editable .` should work correctly. `setup.py install` might work too. Pip-8.1.1 is known to have this problem, but hopefully it will get fixed in some later version. [Bug #38](https://github.com/python-versioneer/python-versioneer/issues/38) is tracking this issue. The discussion in [PR #61](https://github.com/python-versioneer/python-versioneer/pull/61) describes the issue from the Versioneer side in more detail. [pip PR#3176](https://github.com/pypa/pip/pull/3176) and [pip PR#3615](https://github.com/pypa/pip/pull/3615) contain work to improve pip to let Versioneer work correctly. Versioneer-0.16 and earlier only looked for a `.git` directory next to the `setup.cfg`, so subprojects were completely unsupported with those releases. ### Editable installs with setuptools <= 18.5 `setup.py develop` and `pip install --editable .` allow you to install a project into a virtualenv once, then continue editing the source code (and test) without re-installing after every change. "Entry-point scripts" (`setup(entry_points={"console_scripts": ..})`) are a convenient way to specify executable scripts that should be installed along with the python package. These both work as expected when using modern setuptools. When using setuptools-18.5 or earlier, however, certain operations will cause `pkg_resources.DistributionNotFound` errors when running the entrypoint script, which must be resolved by re-installing the package. This happens when the install happens with one version, then the egg_info data is regenerated while a different version is checked out. Many setup.py commands cause egg_info to be rebuilt (including `sdist`, `wheel`, and installing into a different virtualenv), so this can be surprising. [Bug #83](https://github.com/python-versioneer/python-versioneer/issues/83) describes this one, but upgrading to a newer version of setuptools should probably resolve it. ## Updating Versioneer To upgrade your project to a new release of Versioneer, do the following: * install the new Versioneer (`pip install -U versioneer` or equivalent) * edit `setup.cfg` and `pyproject.toml`, if necessary, to include any new configuration settings indicated by the release notes. See [UPGRADING](./UPGRADING.md) for details. * re-run `versioneer install --[no-]vendor` in your source tree, to replace `SRC/_version.py` * commit any changed files ## Future Directions This tool is designed to make it easily extended to other version-control systems: all VCS-specific components are in separate directories like src/git/ . The top-level `versioneer.py` script is assembled from these components by running make-versioneer.py . In the future, make-versioneer.py will take a VCS name as an argument, and will construct a version of `versioneer.py` that is specific to the given VCS. It might also take the configuration arguments that are currently provided manually during installation by editing setup.py . Alternatively, it might go the other direction and include code from all supported VCS systems, reducing the number of intermediate scripts. ## Similar projects * [setuptools_scm](https://github.com/pypa/setuptools_scm/) - a non-vendored build-time dependency * [minver](https://github.com/jbweston/miniver) - a lightweight reimplementation of versioneer * [versioningit](https://github.com/jwodder/versioningit) - a PEP 518-based setuptools plugin ## License To make Versioneer easier to embed, all its code is dedicated to the public domain. The `_version.py` that it creates is also in the public domain. Specifically, both are released under the "Unlicense", as described in https://unlicense.org/. [pypi-image]: https://img.shields.io/pypi/v/versioneer.svg [pypi-url]: https://pypi.python.org/pypi/versioneer/ [travis-image]: https://img.shields.io/travis/com/python-versioneer/python-versioneer.svg [travis-url]: https://travis-ci.com/github/python-versioneer/python-versioneer """ # pylint:disable=invalid-name,import-outside-toplevel,missing-function-docstring # pylint:disable=missing-class-docstring,too-many-branches,too-many-statements # pylint:disable=raise-missing-from,too-many-lines,too-many-locals,import-error # pylint:disable=too-few-public-methods,redefined-outer-name,consider-using-with # pylint:disable=attribute-defined-outside-init,too-many-arguments import configparser import errno import json import os import re import subprocess import sys from pathlib import Path from typing import Any, Callable, cast, Dict, List, Optional, Tuple, Union from typing import NoReturn import functools have_tomllib = True if sys.version_info >= (3, 11): import tomllib else: try: import tomli as tomllib except ImportError: have_tomllib = False class VersioneerConfig: """Container for Versioneer configuration parameters.""" VCS: str style: str tag_prefix: str versionfile_source: str versionfile_build: Optional[str] parentdir_prefix: Optional[str] verbose: Optional[bool] def get_root() -> str: """Get the project root directory. We require that all commands are run from the project root, i.e. the directory that contains setup.py, setup.cfg, and versioneer.py . """ root = os.path.realpath(os.path.abspath(os.getcwd())) setup_py = os.path.join(root, "setup.py") pyproject_toml = os.path.join(root, "pyproject.toml") versioneer_py = os.path.join(root, "versioneer.py") if not ( os.path.exists(setup_py) or os.path.exists(pyproject_toml) or os.path.exists(versioneer_py) ): # allow 'python path/to/setup.py COMMAND' root = os.path.dirname(os.path.realpath(os.path.abspath(sys.argv[0]))) setup_py = os.path.join(root, "setup.py") pyproject_toml = os.path.join(root, "pyproject.toml") versioneer_py = os.path.join(root, "versioneer.py") if not ( os.path.exists(setup_py) or os.path.exists(pyproject_toml) or os.path.exists(versioneer_py) ): err = ("Versioneer was unable to run the project root directory. " "Versioneer requires setup.py to be executed from " "its immediate directory (like 'python setup.py COMMAND'), " "or in a way that lets it use sys.argv[0] to find the root " "(like 'python path/to/setup.py COMMAND').") raise VersioneerBadRootError(err) try: # Certain runtime workflows (setup.py install/develop in a setuptools # tree) execute all dependencies in a single python process, so # "versioneer" may be imported multiple times, and python's shared # module-import table will cache the first one. So we can't use # os.path.dirname(__file__), as that will find whichever # versioneer.py was first imported, even in later projects. my_path = os.path.realpath(os.path.abspath(__file__)) me_dir = os.path.normcase(os.path.splitext(my_path)[0]) vsr_dir = os.path.normcase(os.path.splitext(versioneer_py)[0]) if me_dir != vsr_dir and "VERSIONEER_PEP518" not in globals(): print("Warning: build in %s is using versioneer.py from %s" % (os.path.dirname(my_path), versioneer_py)) except NameError: pass return root def get_config_from_root(root: str) -> VersioneerConfig: """Read the project setup.cfg file to determine Versioneer config.""" # This might raise OSError (if setup.cfg is missing), or # configparser.NoSectionError (if it lacks a [versioneer] section), or # configparser.NoOptionError (if it lacks "VCS="). See the docstring at # the top of versioneer.py for instructions on writing your setup.cfg . root_pth = Path(root) pyproject_toml = root_pth / "pyproject.toml" setup_cfg = root_pth / "setup.cfg" section: Union[Dict[str, Any], configparser.SectionProxy, None] = None if pyproject_toml.exists() and have_tomllib: try: with open(pyproject_toml, 'rb') as fobj: pp = tomllib.load(fobj) section = pp['tool']['versioneer'] except (tomllib.TOMLDecodeError, KeyError) as e: print(f"Failed to load config from {pyproject_toml}: {e}") print("Try to load it from setup.cfg") if not section: parser = configparser.ConfigParser() with open(setup_cfg) as cfg_file: parser.read_file(cfg_file) parser.get("versioneer", "VCS") # raise error if missing section = parser["versioneer"] # `cast`` really shouldn't be used, but its simplest for the # common VersioneerConfig users at the moment. We verify against # `None` values elsewhere where it matters cfg = VersioneerConfig() cfg.VCS = section['VCS'] cfg.style = section.get("style", "") cfg.versionfile_source = cast(str, section.get("versionfile_source")) cfg.versionfile_build = section.get("versionfile_build") cfg.tag_prefix = cast(str, section.get("tag_prefix")) if cfg.tag_prefix in ("''", '""', None): cfg.tag_prefix = "" cfg.parentdir_prefix = section.get("parentdir_prefix") if isinstance(section, configparser.SectionProxy): # Make sure configparser translates to bool cfg.verbose = section.getboolean("verbose") else: cfg.verbose = section.get("verbose") return cfg class NotThisMethod(Exception): """Exception raised if a method is not valid for the current scenario.""" # these dictionaries contain VCS-specific tools LONG_VERSION_PY: Dict[str, str] = {} HANDLERS: Dict[str, Dict[str, Callable]] = {} def register_vcs_handler(vcs: str, method: str) -> Callable: # decorator """Create decorator to mark a method as the handler of a VCS.""" def decorate(f: Callable) -> Callable: """Store f in HANDLERS[vcs][method].""" HANDLERS.setdefault(vcs, {})[method] = f return f return decorate def run_command( commands: List[str], args: List[str], cwd: Optional[str] = None, verbose: bool = False, hide_stderr: bool = False, env: Optional[Dict[str, str]] = None, ) -> Tuple[Optional[str], Optional[int]]: """Call the given command(s).""" assert isinstance(commands, list) process = None popen_kwargs: Dict[str, Any] = {} if sys.platform == "win32": # This hides the console window if pythonw.exe is used startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW popen_kwargs["startupinfo"] = startupinfo for command in commands: try: dispcmd = str([command] + args) # remember shell=False, so use git.cmd on windows, not just git process = subprocess.Popen([command] + args, cwd=cwd, env=env, stdout=subprocess.PIPE, stderr=(subprocess.PIPE if hide_stderr else None), **popen_kwargs) break except OSError as e: if e.errno == errno.ENOENT: continue if verbose: print("unable to run %s" % dispcmd) print(e) return None, None else: if verbose: print("unable to find command, tried %s" % (commands,)) return None, None stdout = process.communicate()[0].strip().decode() if process.returncode != 0: if verbose: print("unable to run %s (error)" % dispcmd) print("stdout was %s" % stdout) return None, process.returncode return stdout, process.returncode LONG_VERSION_PY['git'] = r''' # This file helps to compute a version number in source trees obtained from # git-archive tarball (such as those provided by githubs download-from-tag # feature). Distribution tarballs (built by setup.py sdist) and build # directories (produced by setup.py build) will contain a much shorter file # that just contains the computed version number. # This file is released into the public domain. # Generated by versioneer-0.29 # https://github.com/python-versioneer/python-versioneer """Git implementation of _version.py.""" import errno import os import re import subprocess import sys from typing import Any, Callable, Dict, List, Optional, Tuple import functools def get_keywords() -> Dict[str, str]: """Get the keywords needed to look up the version information.""" # these strings will be replaced by git during git-archive. # setup.py/versioneer.py will grep for the variable names, so they must # each be defined on a line of their own. _version.py will just call # get_keywords(). git_refnames = "%(DOLLAR)sFormat:%%d%(DOLLAR)s" git_full = "%(DOLLAR)sFormat:%%H%(DOLLAR)s" git_date = "%(DOLLAR)sFormat:%%ci%(DOLLAR)s" keywords = {"refnames": git_refnames, "full": git_full, "date": git_date} return keywords class VersioneerConfig: """Container for Versioneer configuration parameters.""" VCS: str style: str tag_prefix: str parentdir_prefix: str versionfile_source: str verbose: bool def get_config() -> VersioneerConfig: """Create, populate and return the VersioneerConfig() object.""" # these strings are filled in when 'setup.py versioneer' creates # _version.py cfg = VersioneerConfig() cfg.VCS = "git" cfg.style = "%(STYLE)s" cfg.tag_prefix = "%(TAG_PREFIX)s" cfg.parentdir_prefix = "%(PARENTDIR_PREFIX)s" cfg.versionfile_source = "%(VERSIONFILE_SOURCE)s" cfg.verbose = False return cfg class NotThisMethod(Exception): """Exception raised if a method is not valid for the current scenario.""" LONG_VERSION_PY: Dict[str, str] = {} HANDLERS: Dict[str, Dict[str, Callable]] = {} def register_vcs_handler(vcs: str, method: str) -> Callable: # decorator """Create decorator to mark a method as the handler of a VCS.""" def decorate(f: Callable) -> Callable: """Store f in HANDLERS[vcs][method].""" if vcs not in HANDLERS: HANDLERS[vcs] = {} HANDLERS[vcs][method] = f return f return decorate def run_command( commands: List[str], args: List[str], cwd: Optional[str] = None, verbose: bool = False, hide_stderr: bool = False, env: Optional[Dict[str, str]] = None, ) -> Tuple[Optional[str], Optional[int]]: """Call the given command(s).""" assert isinstance(commands, list) process = None popen_kwargs: Dict[str, Any] = {} if sys.platform == "win32": # This hides the console window if pythonw.exe is used startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW popen_kwargs["startupinfo"] = startupinfo for command in commands: try: dispcmd = str([command] + args) # remember shell=False, so use git.cmd on windows, not just git process = subprocess.Popen([command] + args, cwd=cwd, env=env, stdout=subprocess.PIPE, stderr=(subprocess.PIPE if hide_stderr else None), **popen_kwargs) break except OSError as e: if e.errno == errno.ENOENT: continue if verbose: print("unable to run %%s" %% dispcmd) print(e) return None, None else: if verbose: print("unable to find command, tried %%s" %% (commands,)) return None, None stdout = process.communicate()[0].strip().decode() if process.returncode != 0: if verbose: print("unable to run %%s (error)" %% dispcmd) print("stdout was %%s" %% stdout) return None, process.returncode return stdout, process.returncode def versions_from_parentdir( parentdir_prefix: str, root: str, verbose: bool, ) -> Dict[str, Any]: """Try to determine the version from the parent directory name. Source tarballs conventionally unpack into a directory that includes both the project name and a version string. We will also support searching up two directory levels for an appropriately named parent directory """ rootdirs = [] for _ in range(3): dirname = os.path.basename(root) if dirname.startswith(parentdir_prefix): return {"version": dirname[len(parentdir_prefix):], "full-revisionid": None, "dirty": False, "error": None, "date": None} rootdirs.append(root) root = os.path.dirname(root) # up a level if verbose: print("Tried directories %%s but none started with prefix %%s" %% (str(rootdirs), parentdir_prefix)) raise NotThisMethod("rootdir doesn't start with parentdir_prefix") @register_vcs_handler("git", "get_keywords") def git_get_keywords(versionfile_abs: str) -> Dict[str, str]: """Extract version information from the given file.""" # the code embedded in _version.py can just fetch the value of these # keywords. When used from setup.py, we don't want to import _version.py, # so we do it with a regexp instead. This function is not used from # _version.py. keywords: Dict[str, str] = {} try: with open(versionfile_abs, "r") as fobj: for line in fobj: if line.strip().startswith("git_refnames ="): mo = re.search(r'=\s*"(.*)"', line) if mo: keywords["refnames"] = mo.group(1) if line.strip().startswith("git_full ="): mo = re.search(r'=\s*"(.*)"', line) if mo: keywords["full"] = mo.group(1) if line.strip().startswith("git_date ="): mo = re.search(r'=\s*"(.*)"', line) if mo: keywords["date"] = mo.group(1) except OSError: pass return keywords @register_vcs_handler("git", "keywords") def git_versions_from_keywords( keywords: Dict[str, str], tag_prefix: str, verbose: bool, ) -> Dict[str, Any]: """Get version information from git keywords.""" if "refnames" not in keywords: raise NotThisMethod("Short version file found") date = keywords.get("date") if date is not None: # Use only the last line. Previous lines may contain GPG signature # information. date = date.splitlines()[-1] # git-2.2.0 added "%%cI", which expands to an ISO-8601 -compliant # datestamp. However we prefer "%%ci" (which expands to an "ISO-8601 # -like" string, which we must then edit to make compliant), because # it's been around since git-1.5.3, and it's too difficult to # discover which version we're using, or to work around using an # older one. date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) refnames = keywords["refnames"].strip() if refnames.startswith("$Format"): if verbose: print("keywords are unexpanded, not using") raise NotThisMethod("unexpanded keywords, not a git-archive tarball") refs = {r.strip() for r in refnames.strip("()").split(",")} # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of # just "foo-1.0". If we see a "tag: " prefix, prefer those. TAG = "tag: " tags = {r[len(TAG):] for r in refs if r.startswith(TAG)} if not tags: # Either we're using git < 1.8.3, or there really are no tags. We use # a heuristic: assume all version tags have a digit. The old git %%d # expansion behaves like git log --decorate=short and strips out the # refs/heads/ and refs/tags/ prefixes that would let us distinguish # between branches and tags. By ignoring refnames without digits, we # filter out many common branch names like "release" and # "stabilization", as well as "HEAD" and "master". tags = {r for r in refs if re.search(r'\d', r)} if verbose: print("discarding '%%s', no digits" %% ",".join(refs - tags)) if verbose: print("likely tags: %%s" %% ",".join(sorted(tags))) for ref in sorted(tags): # sorting will prefer e.g. "2.0" over "2.0rc1" if ref.startswith(tag_prefix): r = ref[len(tag_prefix):] # Filter out refs that exactly match prefix or that don't start # with a number once the prefix is stripped (mostly a concern # when prefix is '') if not re.match(r'\d', r): continue if verbose: print("picking %%s" %% r) return {"version": r, "full-revisionid": keywords["full"].strip(), "dirty": False, "error": None, "date": date} # no suitable tags, so version is "0+unknown", but full hex is still there if verbose: print("no suitable tags, using unknown + full revision id") return {"version": "0+unknown", "full-revisionid": keywords["full"].strip(), "dirty": False, "error": "no suitable tags", "date": None} @register_vcs_handler("git", "pieces_from_vcs") def git_pieces_from_vcs( tag_prefix: str, root: str, verbose: bool, runner: Callable = run_command ) -> Dict[str, Any]: """Get version from 'git describe' in the root of the source tree. This only gets called if the git-archive 'subst' keywords were *not* expanded, and _version.py hasn't already been rewritten with a short version string, meaning we're inside a checked out source tree. """ GITS = ["git"] if sys.platform == "win32": GITS = ["git.cmd", "git.exe"] # GIT_DIR can interfere with correct operation of Versioneer. # It may be intended to be passed to the Versioneer-versioned project, # but that should not change where we get our version from. env = os.environ.copy() env.pop("GIT_DIR", None) runner = functools.partial(runner, env=env) _, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root, hide_stderr=not verbose) if rc != 0: if verbose: print("Directory %%s not under git control" %% root) raise NotThisMethod("'git rev-parse --git-dir' returned error") # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] # if there isn't one, this yields HEX[-dirty] (no NUM) describe_out, rc = runner(GITS, [ "describe", "--tags", "--dirty", "--always", "--long", "--match", f"{tag_prefix}[[:digit:]]*" ], cwd=root) # --long was added in git-1.5.5 if describe_out is None: raise NotThisMethod("'git describe' failed") describe_out = describe_out.strip() full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root) if full_out is None: raise NotThisMethod("'git rev-parse' failed") full_out = full_out.strip() pieces: Dict[str, Any] = {} pieces["long"] = full_out pieces["short"] = full_out[:7] # maybe improved later pieces["error"] = None branch_name, rc = runner(GITS, ["rev-parse", "--abbrev-ref", "HEAD"], cwd=root) # --abbrev-ref was added in git-1.6.3 if rc != 0 or branch_name is None: raise NotThisMethod("'git rev-parse --abbrev-ref' returned error") branch_name = branch_name.strip() if branch_name == "HEAD": # If we aren't exactly on a branch, pick a branch which represents # the current commit. If all else fails, we are on a branchless # commit. branches, rc = runner(GITS, ["branch", "--contains"], cwd=root) # --contains was added in git-1.5.4 if rc != 0 or branches is None: raise NotThisMethod("'git branch --contains' returned error") branches = branches.split("\n") # Remove the first line if we're running detached if "(" in branches[0]: branches.pop(0) # Strip off the leading "* " from the list of branches. branches = [branch[2:] for branch in branches] if "master" in branches: branch_name = "master" elif not branches: branch_name = None else: # Pick the first branch that is returned. Good or bad. branch_name = branches[0] pieces["branch"] = branch_name # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] # TAG might have hyphens. git_describe = describe_out # look for -dirty suffix dirty = git_describe.endswith("-dirty") pieces["dirty"] = dirty if dirty: git_describe = git_describe[:git_describe.rindex("-dirty")] # now we have TAG-NUM-gHEX or HEX if "-" in git_describe: # TAG-NUM-gHEX mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) if not mo: # unparsable. Maybe git-describe is misbehaving? pieces["error"] = ("unable to parse git-describe output: '%%s'" %% describe_out) return pieces # tag full_tag = mo.group(1) if not full_tag.startswith(tag_prefix): if verbose: fmt = "tag '%%s' doesn't start with prefix '%%s'" print(fmt %% (full_tag, tag_prefix)) pieces["error"] = ("tag '%%s' doesn't start with prefix '%%s'" %% (full_tag, tag_prefix)) return pieces pieces["closest-tag"] = full_tag[len(tag_prefix):] # distance: number of commits since tag pieces["distance"] = int(mo.group(2)) # commit: short hex revision ID pieces["short"] = mo.group(3) else: # HEX: no tags pieces["closest-tag"] = None out, rc = runner(GITS, ["rev-list", "HEAD", "--left-right"], cwd=root) pieces["distance"] = len(out.split()) # total number of commits # commit date: see ISO-8601 comment in git_versions_from_keywords() date = runner(GITS, ["show", "-s", "--format=%%ci", "HEAD"], cwd=root)[0].strip() # Use only the last line. Previous lines may contain GPG signature # information. date = date.splitlines()[-1] pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) return pieces def plus_or_dot(pieces: Dict[str, Any]) -> str: """Return a + if we don't already have one, else return a .""" if "+" in pieces.get("closest-tag", ""): return "." return "+" def render_pep440(pieces: Dict[str, Any]) -> str: """Build up version string, with post-release "local version identifier". Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty Exceptions: 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty] """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"] or pieces["dirty"]: rendered += plus_or_dot(pieces) rendered += "%%d.g%%s" %% (pieces["distance"], pieces["short"]) if pieces["dirty"]: rendered += ".dirty" else: # exception #1 rendered = "0+untagged.%%d.g%%s" %% (pieces["distance"], pieces["short"]) if pieces["dirty"]: rendered += ".dirty" return rendered def render_pep440_branch(pieces: Dict[str, Any]) -> str: """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] . The ".dev0" means not master branch. Note that .dev0 sorts backwards (a feature branch will appear "older" than the master branch). Exceptions: 1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty] """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"] or pieces["dirty"]: if pieces["branch"] != "master": rendered += ".dev0" rendered += plus_or_dot(pieces) rendered += "%%d.g%%s" %% (pieces["distance"], pieces["short"]) if pieces["dirty"]: rendered += ".dirty" else: # exception #1 rendered = "0" if pieces["branch"] != "master": rendered += ".dev0" rendered += "+untagged.%%d.g%%s" %% (pieces["distance"], pieces["short"]) if pieces["dirty"]: rendered += ".dirty" return rendered def pep440_split_post(ver: str) -> Tuple[str, Optional[int]]: """Split pep440 version string at the post-release segment. Returns the release segments before the post-release and the post-release version number (or -1 if no post-release segment is present). """ vc = str.split(ver, ".post") return vc[0], int(vc[1] or 0) if len(vc) == 2 else None def render_pep440_pre(pieces: Dict[str, Any]) -> str: """TAG[.postN.devDISTANCE] -- No -dirty. Exceptions: 1: no tags. 0.post0.devDISTANCE """ if pieces["closest-tag"]: if pieces["distance"]: # update the post release segment tag_version, post_version = pep440_split_post(pieces["closest-tag"]) rendered = tag_version if post_version is not None: rendered += ".post%%d.dev%%d" %% (post_version + 1, pieces["distance"]) else: rendered += ".post0.dev%%d" %% (pieces["distance"]) else: # no commits, use the tag as the version rendered = pieces["closest-tag"] else: # exception #1 rendered = "0.post0.dev%%d" %% pieces["distance"] return rendered def render_pep440_post(pieces: Dict[str, Any]) -> str: """TAG[.postDISTANCE[.dev0]+gHEX] . The ".dev0" means dirty. Note that .dev0 sorts backwards (a dirty tree will appear "older" than the corresponding clean one), but you shouldn't be releasing software with -dirty anyways. Exceptions: 1: no tags. 0.postDISTANCE[.dev0] """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"] or pieces["dirty"]: rendered += ".post%%d" %% pieces["distance"] if pieces["dirty"]: rendered += ".dev0" rendered += plus_or_dot(pieces) rendered += "g%%s" %% pieces["short"] else: # exception #1 rendered = "0.post%%d" %% pieces["distance"] if pieces["dirty"]: rendered += ".dev0" rendered += "+g%%s" %% pieces["short"] return rendered def render_pep440_post_branch(pieces: Dict[str, Any]) -> str: """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] . The ".dev0" means not master branch. Exceptions: 1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty] """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"] or pieces["dirty"]: rendered += ".post%%d" %% pieces["distance"] if pieces["branch"] != "master": rendered += ".dev0" rendered += plus_or_dot(pieces) rendered += "g%%s" %% pieces["short"] if pieces["dirty"]: rendered += ".dirty" else: # exception #1 rendered = "0.post%%d" %% pieces["distance"] if pieces["branch"] != "master": rendered += ".dev0" rendered += "+g%%s" %% pieces["short"] if pieces["dirty"]: rendered += ".dirty" return rendered def render_pep440_old(pieces: Dict[str, Any]) -> str: """TAG[.postDISTANCE[.dev0]] . The ".dev0" means dirty. Exceptions: 1: no tags. 0.postDISTANCE[.dev0] """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"] or pieces["dirty"]: rendered += ".post%%d" %% pieces["distance"] if pieces["dirty"]: rendered += ".dev0" else: # exception #1 rendered = "0.post%%d" %% pieces["distance"] if pieces["dirty"]: rendered += ".dev0" return rendered def render_git_describe(pieces: Dict[str, Any]) -> str: """TAG[-DISTANCE-gHEX][-dirty]. Like 'git describe --tags --dirty --always'. Exceptions: 1: no tags. HEX[-dirty] (note: no 'g' prefix) """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"]: rendered += "-%%d-g%%s" %% (pieces["distance"], pieces["short"]) else: # exception #1 rendered = pieces["short"] if pieces["dirty"]: rendered += "-dirty" return rendered def render_git_describe_long(pieces: Dict[str, Any]) -> str: """TAG-DISTANCE-gHEX[-dirty]. Like 'git describe --tags --dirty --always -long'. The distance/hash is unconditional. Exceptions: 1: no tags. HEX[-dirty] (note: no 'g' prefix) """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] rendered += "-%%d-g%%s" %% (pieces["distance"], pieces["short"]) else: # exception #1 rendered = pieces["short"] if pieces["dirty"]: rendered += "-dirty" return rendered def render(pieces: Dict[str, Any], style: str) -> Dict[str, Any]: """Render the given version pieces into the requested style.""" if pieces["error"]: return {"version": "unknown", "full-revisionid": pieces.get("long"), "dirty": None, "error": pieces["error"], "date": None} if not style or style == "default": style = "pep440" # the default if style == "pep440": rendered = render_pep440(pieces) elif style == "pep440-branch": rendered = render_pep440_branch(pieces) elif style == "pep440-pre": rendered = render_pep440_pre(pieces) elif style == "pep440-post": rendered = render_pep440_post(pieces) elif style == "pep440-post-branch": rendered = render_pep440_post_branch(pieces) elif style == "pep440-old": rendered = render_pep440_old(pieces) elif style == "git-describe": rendered = render_git_describe(pieces) elif style == "git-describe-long": rendered = render_git_describe_long(pieces) else: raise ValueError("unknown style '%%s'" %% style) return {"version": rendered, "full-revisionid": pieces["long"], "dirty": pieces["dirty"], "error": None, "date": pieces.get("date")} def get_versions() -> Dict[str, Any]: """Get version information or return default if unable to do so.""" # I am in _version.py, which lives at ROOT/VERSIONFILE_SOURCE. If we have # __file__, we can work backwards from there to the root. Some # py2exe/bbfreeze/non-CPython implementations don't do __file__, in which # case we can only use expanded keywords. cfg = get_config() verbose = cfg.verbose try: return git_versions_from_keywords(get_keywords(), cfg.tag_prefix, verbose) except NotThisMethod: pass try: root = os.path.realpath(__file__) # versionfile_source is the relative path from the top of the source # tree (where the .git directory might live) to this file. Invert # this to find the root from __file__. for _ in cfg.versionfile_source.split('/'): root = os.path.dirname(root) except NameError: return {"version": "0+unknown", "full-revisionid": None, "dirty": None, "error": "unable to find root of source tree", "date": None} try: pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose) return render(pieces, cfg.style) except NotThisMethod: pass try: if cfg.parentdir_prefix: return versions_from_parentdir(cfg.parentdir_prefix, root, verbose) except NotThisMethod: pass return {"version": "0+unknown", "full-revisionid": None, "dirty": None, "error": "unable to compute version", "date": None} ''' @register_vcs_handler("git", "get_keywords") def git_get_keywords(versionfile_abs: str) -> Dict[str, str]: """Extract version information from the given file.""" # the code embedded in _version.py can just fetch the value of these # keywords. When used from setup.py, we don't want to import _version.py, # so we do it with a regexp instead. This function is not used from # _version.py. keywords: Dict[str, str] = {} try: with open(versionfile_abs, "r") as fobj: for line in fobj: if line.strip().startswith("git_refnames ="): mo = re.search(r'=\s*"(.*)"', line) if mo: keywords["refnames"] = mo.group(1) if line.strip().startswith("git_full ="): mo = re.search(r'=\s*"(.*)"', line) if mo: keywords["full"] = mo.group(1) if line.strip().startswith("git_date ="): mo = re.search(r'=\s*"(.*)"', line) if mo: keywords["date"] = mo.group(1) except OSError: pass return keywords @register_vcs_handler("git", "keywords") def git_versions_from_keywords( keywords: Dict[str, str], tag_prefix: str, verbose: bool, ) -> Dict[str, Any]: """Get version information from git keywords.""" if "refnames" not in keywords: raise NotThisMethod("Short version file found") date = keywords.get("date") if date is not None: # Use only the last line. Previous lines may contain GPG signature # information. date = date.splitlines()[-1] # git-2.2.0 added "%cI", which expands to an ISO-8601 -compliant # datestamp. However we prefer "%ci" (which expands to an "ISO-8601 # -like" string, which we must then edit to make compliant), because # it's been around since git-1.5.3, and it's too difficult to # discover which version we're using, or to work around using an # older one. date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) refnames = keywords["refnames"].strip() if refnames.startswith("$Format"): if verbose: print("keywords are unexpanded, not using") raise NotThisMethod("unexpanded keywords, not a git-archive tarball") refs = {r.strip() for r in refnames.strip("()").split(",")} # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of # just "foo-1.0". If we see a "tag: " prefix, prefer those. TAG = "tag: " tags = {r[len(TAG):] for r in refs if r.startswith(TAG)} if not tags: # Either we're using git < 1.8.3, or there really are no tags. We use # a heuristic: assume all version tags have a digit. The old git %d # expansion behaves like git log --decorate=short and strips out the # refs/heads/ and refs/tags/ prefixes that would let us distinguish # between branches and tags. By ignoring refnames without digits, we # filter out many common branch names like "release" and # "stabilization", as well as "HEAD" and "master". tags = {r for r in refs if re.search(r'\d', r)} if verbose: print("discarding '%s', no digits" % ",".join(refs - tags)) if verbose: print("likely tags: %s" % ",".join(sorted(tags))) for ref in sorted(tags): # sorting will prefer e.g. "2.0" over "2.0rc1" if ref.startswith(tag_prefix): r = ref[len(tag_prefix):] # Filter out refs that exactly match prefix or that don't start # with a number once the prefix is stripped (mostly a concern # when prefix is '') if not re.match(r'\d', r): continue if verbose: print("picking %s" % r) return {"version": r, "full-revisionid": keywords["full"].strip(), "dirty": False, "error": None, "date": date} # no suitable tags, so version is "0+unknown", but full hex is still there if verbose: print("no suitable tags, using unknown + full revision id") return {"version": "0+unknown", "full-revisionid": keywords["full"].strip(), "dirty": False, "error": "no suitable tags", "date": None} @register_vcs_handler("git", "pieces_from_vcs") def git_pieces_from_vcs( tag_prefix: str, root: str, verbose: bool, runner: Callable = run_command ) -> Dict[str, Any]: """Get version from 'git describe' in the root of the source tree. This only gets called if the git-archive 'subst' keywords were *not* expanded, and _version.py hasn't already been rewritten with a short version string, meaning we're inside a checked out source tree. """ GITS = ["git"] if sys.platform == "win32": GITS = ["git.cmd", "git.exe"] # GIT_DIR can interfere with correct operation of Versioneer. # It may be intended to be passed to the Versioneer-versioned project, # but that should not change where we get our version from. env = os.environ.copy() env.pop("GIT_DIR", None) runner = functools.partial(runner, env=env) _, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root, hide_stderr=not verbose) if rc != 0: if verbose: print("Directory %s not under git control" % root) raise NotThisMethod("'git rev-parse --git-dir' returned error") # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] # if there isn't one, this yields HEX[-dirty] (no NUM) describe_out, rc = runner(GITS, [ "describe", "--tags", "--dirty", "--always", "--long", "--match", f"{tag_prefix}[[:digit:]]*" ], cwd=root) # --long was added in git-1.5.5 if describe_out is None: raise NotThisMethod("'git describe' failed") describe_out = describe_out.strip() full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root) if full_out is None: raise NotThisMethod("'git rev-parse' failed") full_out = full_out.strip() pieces: Dict[str, Any] = {} pieces["long"] = full_out pieces["short"] = full_out[:7] # maybe improved later pieces["error"] = None branch_name, rc = runner(GITS, ["rev-parse", "--abbrev-ref", "HEAD"], cwd=root) # --abbrev-ref was added in git-1.6.3 if rc != 0 or branch_name is None: raise NotThisMethod("'git rev-parse --abbrev-ref' returned error") branch_name = branch_name.strip() if branch_name == "HEAD": # If we aren't exactly on a branch, pick a branch which represents # the current commit. If all else fails, we are on a branchless # commit. branches, rc = runner(GITS, ["branch", "--contains"], cwd=root) # --contains was added in git-1.5.4 if rc != 0 or branches is None: raise NotThisMethod("'git branch --contains' returned error") branches = branches.split("\n") # Remove the first line if we're running detached if "(" in branches[0]: branches.pop(0) # Strip off the leading "* " from the list of branches. branches = [branch[2:] for branch in branches] if "master" in branches: branch_name = "master" elif not branches: branch_name = None else: # Pick the first branch that is returned. Good or bad. branch_name = branches[0] pieces["branch"] = branch_name # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] # TAG might have hyphens. git_describe = describe_out # look for -dirty suffix dirty = git_describe.endswith("-dirty") pieces["dirty"] = dirty if dirty: git_describe = git_describe[:git_describe.rindex("-dirty")] # now we have TAG-NUM-gHEX or HEX if "-" in git_describe: # TAG-NUM-gHEX mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) if not mo: # unparsable. Maybe git-describe is misbehaving? pieces["error"] = ("unable to parse git-describe output: '%s'" % describe_out) return pieces # tag full_tag = mo.group(1) if not full_tag.startswith(tag_prefix): if verbose: fmt = "tag '%s' doesn't start with prefix '%s'" print(fmt % (full_tag, tag_prefix)) pieces["error"] = ("tag '%s' doesn't start with prefix '%s'" % (full_tag, tag_prefix)) return pieces pieces["closest-tag"] = full_tag[len(tag_prefix):] # distance: number of commits since tag pieces["distance"] = int(mo.group(2)) # commit: short hex revision ID pieces["short"] = mo.group(3) else: # HEX: no tags pieces["closest-tag"] = None out, rc = runner(GITS, ["rev-list", "HEAD", "--left-right"], cwd=root) pieces["distance"] = len(out.split()) # total number of commits # commit date: see ISO-8601 comment in git_versions_from_keywords() date = runner(GITS, ["show", "-s", "--format=%ci", "HEAD"], cwd=root)[0].strip() # Use only the last line. Previous lines may contain GPG signature # information. date = date.splitlines()[-1] pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) return pieces def do_vcs_install(versionfile_source: str, ipy: Optional[str]) -> None: """Git-specific installation logic for Versioneer. For Git, this means creating/changing .gitattributes to mark _version.py for export-subst keyword substitution. """ GITS = ["git"] if sys.platform == "win32": GITS = ["git.cmd", "git.exe"] files = [versionfile_source] if ipy: files.append(ipy) if "VERSIONEER_PEP518" not in globals(): try: my_path = __file__ if my_path.endswith((".pyc", ".pyo")): my_path = os.path.splitext(my_path)[0] + ".py" versioneer_file = os.path.relpath(my_path) except NameError: versioneer_file = "versioneer.py" files.append(versioneer_file) present = False try: with open(".gitattributes", "r") as fobj: for line in fobj: if line.strip().startswith(versionfile_source): if "export-subst" in line.strip().split()[1:]: present = True break except OSError: pass if not present: with open(".gitattributes", "a+") as fobj: fobj.write(f"{versionfile_source} export-subst\n") files.append(".gitattributes") run_command(GITS, ["add", "--"] + files) def versions_from_parentdir( parentdir_prefix: str, root: str, verbose: bool, ) -> Dict[str, Any]: """Try to determine the version from the parent directory name. Source tarballs conventionally unpack into a directory that includes both the project name and a version string. We will also support searching up two directory levels for an appropriately named parent directory """ rootdirs = [] for _ in range(3): dirname = os.path.basename(root) if dirname.startswith(parentdir_prefix): return {"version": dirname[len(parentdir_prefix):], "full-revisionid": None, "dirty": False, "error": None, "date": None} rootdirs.append(root) root = os.path.dirname(root) # up a level if verbose: print("Tried directories %s but none started with prefix %s" % (str(rootdirs), parentdir_prefix)) raise NotThisMethod("rootdir doesn't start with parentdir_prefix") SHORT_VERSION_PY = """ # This file was generated by 'versioneer.py' (0.29) from # revision-control system data, or from the parent directory name of an # unpacked source archive. Distribution tarballs contain a pre-generated copy # of this file. import json version_json = ''' %s ''' # END VERSION_JSON def get_versions(): return json.loads(version_json) """ def versions_from_file(filename: str) -> Dict[str, Any]: """Try to determine the version from _version.py if present.""" try: with open(filename) as f: contents = f.read() except OSError: raise NotThisMethod("unable to read _version.py") mo = re.search(r"version_json = '''\n(.*)''' # END VERSION_JSON", contents, re.M | re.S) if not mo: mo = re.search(r"version_json = '''\r\n(.*)''' # END VERSION_JSON", contents, re.M | re.S) if not mo: raise NotThisMethod("no version_json in _version.py") return json.loads(mo.group(1)) def write_to_version_file(filename: str, versions: Dict[str, Any]) -> None: """Write the given version number to the given _version.py file.""" contents = json.dumps(versions, sort_keys=True, indent=1, separators=(",", ": ")) with open(filename, "w") as f: f.write(SHORT_VERSION_PY % contents) print("set %s to '%s'" % (filename, versions["version"])) def plus_or_dot(pieces: Dict[str, Any]) -> str: """Return a + if we don't already have one, else return a .""" if "+" in pieces.get("closest-tag", ""): return "." return "+" def render_pep440(pieces: Dict[str, Any]) -> str: """Build up version string, with post-release "local version identifier". Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty Exceptions: 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty] """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"] or pieces["dirty"]: rendered += plus_or_dot(pieces) rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) if pieces["dirty"]: rendered += ".dirty" else: # exception #1 rendered = "0+untagged.%d.g%s" % (pieces["distance"], pieces["short"]) if pieces["dirty"]: rendered += ".dirty" return rendered def render_pep440_branch(pieces: Dict[str, Any]) -> str: """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] . The ".dev0" means not master branch. Note that .dev0 sorts backwards (a feature branch will appear "older" than the master branch). Exceptions: 1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty] """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"] or pieces["dirty"]: if pieces["branch"] != "master": rendered += ".dev0" rendered += plus_or_dot(pieces) rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) if pieces["dirty"]: rendered += ".dirty" else: # exception #1 rendered = "0" if pieces["branch"] != "master": rendered += ".dev0" rendered += "+untagged.%d.g%s" % (pieces["distance"], pieces["short"]) if pieces["dirty"]: rendered += ".dirty" return rendered def pep440_split_post(ver: str) -> Tuple[str, Optional[int]]: """Split pep440 version string at the post-release segment. Returns the release segments before the post-release and the post-release version number (or -1 if no post-release segment is present). """ vc = str.split(ver, ".post") return vc[0], int(vc[1] or 0) if len(vc) == 2 else None def render_pep440_pre(pieces: Dict[str, Any]) -> str: """TAG[.postN.devDISTANCE] -- No -dirty. Exceptions: 1: no tags. 0.post0.devDISTANCE """ if pieces["closest-tag"]: if pieces["distance"]: # update the post release segment tag_version, post_version = pep440_split_post(pieces["closest-tag"]) rendered = tag_version if post_version is not None: rendered += ".post%d.dev%d" % (post_version + 1, pieces["distance"]) else: rendered += ".post0.dev%d" % (pieces["distance"]) else: # no commits, use the tag as the version rendered = pieces["closest-tag"] else: # exception #1 rendered = "0.post0.dev%d" % pieces["distance"] return rendered def render_pep440_post(pieces: Dict[str, Any]) -> str: """TAG[.postDISTANCE[.dev0]+gHEX] . The ".dev0" means dirty. Note that .dev0 sorts backwards (a dirty tree will appear "older" than the corresponding clean one), but you shouldn't be releasing software with -dirty anyways. Exceptions: 1: no tags. 0.postDISTANCE[.dev0] """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"] or pieces["dirty"]: rendered += ".post%d" % pieces["distance"] if pieces["dirty"]: rendered += ".dev0" rendered += plus_or_dot(pieces) rendered += "g%s" % pieces["short"] else: # exception #1 rendered = "0.post%d" % pieces["distance"] if pieces["dirty"]: rendered += ".dev0" rendered += "+g%s" % pieces["short"] return rendered def render_pep440_post_branch(pieces: Dict[str, Any]) -> str: """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] . The ".dev0" means not master branch. Exceptions: 1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty] """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"] or pieces["dirty"]: rendered += ".post%d" % pieces["distance"] if pieces["branch"] != "master": rendered += ".dev0" rendered += plus_or_dot(pieces) rendered += "g%s" % pieces["short"] if pieces["dirty"]: rendered += ".dirty" else: # exception #1 rendered = "0.post%d" % pieces["distance"] if pieces["branch"] != "master": rendered += ".dev0" rendered += "+g%s" % pieces["short"] if pieces["dirty"]: rendered += ".dirty" return rendered def render_pep440_old(pieces: Dict[str, Any]) -> str: """TAG[.postDISTANCE[.dev0]] . The ".dev0" means dirty. Exceptions: 1: no tags. 0.postDISTANCE[.dev0] """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"] or pieces["dirty"]: rendered += ".post%d" % pieces["distance"] if pieces["dirty"]: rendered += ".dev0" else: # exception #1 rendered = "0.post%d" % pieces["distance"] if pieces["dirty"]: rendered += ".dev0" return rendered def render_git_describe(pieces: Dict[str, Any]) -> str: """TAG[-DISTANCE-gHEX][-dirty]. Like 'git describe --tags --dirty --always'. Exceptions: 1: no tags. HEX[-dirty] (note: no 'g' prefix) """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"]: rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) else: # exception #1 rendered = pieces["short"] if pieces["dirty"]: rendered += "-dirty" return rendered def render_git_describe_long(pieces: Dict[str, Any]) -> str: """TAG-DISTANCE-gHEX[-dirty]. Like 'git describe --tags --dirty --always -long'. The distance/hash is unconditional. Exceptions: 1: no tags. HEX[-dirty] (note: no 'g' prefix) """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) else: # exception #1 rendered = pieces["short"] if pieces["dirty"]: rendered += "-dirty" return rendered def render(pieces: Dict[str, Any], style: str) -> Dict[str, Any]: """Render the given version pieces into the requested style.""" if pieces["error"]: return {"version": "unknown", "full-revisionid": pieces.get("long"), "dirty": None, "error": pieces["error"], "date": None} if not style or style == "default": style = "pep440" # the default if style == "pep440": rendered = render_pep440(pieces) elif style == "pep440-branch": rendered = render_pep440_branch(pieces) elif style == "pep440-pre": rendered = render_pep440_pre(pieces) elif style == "pep440-post": rendered = render_pep440_post(pieces) elif style == "pep440-post-branch": rendered = render_pep440_post_branch(pieces) elif style == "pep440-old": rendered = render_pep440_old(pieces) elif style == "git-describe": rendered = render_git_describe(pieces) elif style == "git-describe-long": rendered = render_git_describe_long(pieces) else: raise ValueError("unknown style '%s'" % style) return {"version": rendered, "full-revisionid": pieces["long"], "dirty": pieces["dirty"], "error": None, "date": pieces.get("date")} class VersioneerBadRootError(Exception): """The project root directory is unknown or missing key files.""" def get_versions(verbose: bool = False) -> Dict[str, Any]: """Get the project version from whatever source is available. Returns dict with two keys: 'version' and 'full'. """ if "versioneer" in sys.modules: # see the discussion in cmdclass.py:get_cmdclass() del sys.modules["versioneer"] root = get_root() cfg = get_config_from_root(root) assert cfg.VCS is not None, "please set [versioneer]VCS= in setup.cfg" handlers = HANDLERS.get(cfg.VCS) assert handlers, "unrecognized VCS '%s'" % cfg.VCS verbose = verbose or bool(cfg.verbose) # `bool()` used to avoid `None` assert cfg.versionfile_source is not None, \ "please set versioneer.versionfile_source" assert cfg.tag_prefix is not None, "please set versioneer.tag_prefix" versionfile_abs = os.path.join(root, cfg.versionfile_source) # extract version from first of: _version.py, VCS command (e.g. 'git # describe'), parentdir. This is meant to work for developers using a # source checkout, for users of a tarball created by 'setup.py sdist', # and for users of a tarball/zipball created by 'git archive' or github's # download-from-tag feature or the equivalent in other VCSes. get_keywords_f = handlers.get("get_keywords") from_keywords_f = handlers.get("keywords") if get_keywords_f and from_keywords_f: try: keywords = get_keywords_f(versionfile_abs) ver = from_keywords_f(keywords, cfg.tag_prefix, verbose) if verbose: print("got version from expanded keyword %s" % ver) return ver except NotThisMethod: pass try: ver = versions_from_file(versionfile_abs) if verbose: print("got version from file %s %s" % (versionfile_abs, ver)) return ver except NotThisMethod: pass from_vcs_f = handlers.get("pieces_from_vcs") if from_vcs_f: try: pieces = from_vcs_f(cfg.tag_prefix, root, verbose) ver = render(pieces, cfg.style) if verbose: print("got version from VCS %s" % ver) return ver except NotThisMethod: pass try: if cfg.parentdir_prefix: ver = versions_from_parentdir(cfg.parentdir_prefix, root, verbose) if verbose: print("got version from parentdir %s" % ver) return ver except NotThisMethod: pass if verbose: print("unable to compute version") return {"version": "0+unknown", "full-revisionid": None, "dirty": None, "error": "unable to compute version", "date": None} def get_version() -> str: """Get the short version string for this project.""" return get_versions()["version"] def get_cmdclass(cmdclass: Optional[Dict[str, Any]] = None): """Get the custom setuptools subclasses used by Versioneer. If the package uses a different cmdclass (e.g. one from numpy), it should be provide as an argument. """ if "versioneer" in sys.modules: del sys.modules["versioneer"] # this fixes the "python setup.py develop" case (also 'install' and # 'easy_install .'), in which subdependencies of the main project are # built (using setup.py bdist_egg) in the same python process. Assume # a main project A and a dependency B, which use different versions # of Versioneer. A's setup.py imports A's Versioneer, leaving it in # sys.modules by the time B's setup.py is executed, causing B to run # with the wrong versioneer. Setuptools wraps the sub-dep builds in a # sandbox that restores sys.modules to it's pre-build state, so the # parent is protected against the child's "import versioneer". By # removing ourselves from sys.modules here, before the child build # happens, we protect the child from the parent's versioneer too. # Also see https://github.com/python-versioneer/python-versioneer/issues/52 cmds = {} if cmdclass is None else cmdclass.copy() # we add "version" to setuptools from setuptools import Command class cmd_version(Command): description = "report generated version string" user_options: List[Tuple[str, str, str]] = [] boolean_options: List[str] = [] def initialize_options(self) -> None: pass def finalize_options(self) -> None: pass def run(self) -> None: vers = get_versions(verbose=True) print("Version: %s" % vers["version"]) print(" full-revisionid: %s" % vers.get("full-revisionid")) print(" dirty: %s" % vers.get("dirty")) print(" date: %s" % vers.get("date")) if vers["error"]: print(" error: %s" % vers["error"]) cmds["version"] = cmd_version # we override "build_py" in setuptools # # most invocation pathways end up running build_py: # distutils/build -> build_py # distutils/install -> distutils/build ->.. # setuptools/bdist_wheel -> distutils/install ->.. # setuptools/bdist_egg -> distutils/install_lib -> build_py # setuptools/install -> bdist_egg ->.. # setuptools/develop -> ? # pip install: # copies source tree to a tempdir before running egg_info/etc # if .git isn't copied too, 'git describe' will fail # then does setup.py bdist_wheel, or sometimes setup.py install # setup.py egg_info -> ? # pip install -e . and setuptool/editable_wheel will invoke build_py # but the build_py command is not expected to copy any files. # we override different "build_py" commands for both environments if 'build_py' in cmds: _build_py: Any = cmds['build_py'] else: from setuptools.command.build_py import build_py as _build_py class cmd_build_py(_build_py): def run(self) -> None: root = get_root() cfg = get_config_from_root(root) versions = get_versions() _build_py.run(self) if getattr(self, "editable_mode", False): # During editable installs `.py` and data files are # not copied to build_lib return # now locate _version.py in the new build/ directory and replace # it with an updated value if cfg.versionfile_build: target_versionfile = os.path.join(self.build_lib, cfg.versionfile_build) print("UPDATING %s" % target_versionfile) write_to_version_file(target_versionfile, versions) cmds["build_py"] = cmd_build_py if 'build_ext' in cmds: _build_ext: Any = cmds['build_ext'] else: from setuptools.command.build_ext import build_ext as _build_ext class cmd_build_ext(_build_ext): def run(self) -> None: root = get_root() cfg = get_config_from_root(root) versions = get_versions() _build_ext.run(self) if self.inplace: # build_ext --inplace will only build extensions in # build/lib<..> dir with no _version.py to write to. # As in place builds will already have a _version.py # in the module dir, we do not need to write one. return # now locate _version.py in the new build/ directory and replace # it with an updated value if not cfg.versionfile_build: return target_versionfile = os.path.join(self.build_lib, cfg.versionfile_build) if not os.path.exists(target_versionfile): print(f"Warning: {target_versionfile} does not exist, skipping " "version update. This can happen if you are running build_ext " "without first running build_py.") return print("UPDATING %s" % target_versionfile) write_to_version_file(target_versionfile, versions) cmds["build_ext"] = cmd_build_ext if "cx_Freeze" in sys.modules: # cx_freeze enabled? from cx_Freeze.dist import build_exe as _build_exe # type: ignore # nczeczulin reports that py2exe won't like the pep440-style string # as FILEVERSION, but it can be used for PRODUCTVERSION, e.g. # setup(console=[{ # "version": versioneer.get_version().split("+", 1)[0], # FILEVERSION # "product_version": versioneer.get_version(), # ... class cmd_build_exe(_build_exe): def run(self) -> None: root = get_root() cfg = get_config_from_root(root) versions = get_versions() target_versionfile = cfg.versionfile_source print("UPDATING %s" % target_versionfile) write_to_version_file(target_versionfile, versions) _build_exe.run(self) os.unlink(target_versionfile) with open(cfg.versionfile_source, "w") as f: LONG = LONG_VERSION_PY[cfg.VCS] f.write(LONG % {"DOLLAR": "$", "STYLE": cfg.style, "TAG_PREFIX": cfg.tag_prefix, "PARENTDIR_PREFIX": cfg.parentdir_prefix, "VERSIONFILE_SOURCE": cfg.versionfile_source, }) cmds["build_exe"] = cmd_build_exe del cmds["build_py"] if 'py2exe' in sys.modules: # py2exe enabled? try: from py2exe.setuptools_buildexe import py2exe as _py2exe # type: ignore except ImportError: from py2exe.distutils_buildexe import py2exe as _py2exe # type: ignore class cmd_py2exe(_py2exe): def run(self) -> None: root = get_root() cfg = get_config_from_root(root) versions = get_versions() target_versionfile = cfg.versionfile_source print("UPDATING %s" % target_versionfile) write_to_version_file(target_versionfile, versions) _py2exe.run(self) os.unlink(target_versionfile) with open(cfg.versionfile_source, "w") as f: LONG = LONG_VERSION_PY[cfg.VCS] f.write(LONG % {"DOLLAR": "$", "STYLE": cfg.style, "TAG_PREFIX": cfg.tag_prefix, "PARENTDIR_PREFIX": cfg.parentdir_prefix, "VERSIONFILE_SOURCE": cfg.versionfile_source, }) cmds["py2exe"] = cmd_py2exe # sdist farms its file list building out to egg_info if 'egg_info' in cmds: _egg_info: Any = cmds['egg_info'] else: from setuptools.command.egg_info import egg_info as _egg_info class cmd_egg_info(_egg_info): def find_sources(self) -> None: # egg_info.find_sources builds the manifest list and writes it # in one shot super().find_sources() # Modify the filelist and normalize it root = get_root() cfg = get_config_from_root(root) self.filelist.append('versioneer.py') if cfg.versionfile_source: # There are rare cases where versionfile_source might not be # included by default, so we must be explicit self.filelist.append(cfg.versionfile_source) self.filelist.sort() self.filelist.remove_duplicates() # The write method is hidden in the manifest_maker instance that # generated the filelist and was thrown away # We will instead replicate their final normalization (to unicode, # and POSIX-style paths) from setuptools import unicode_utils normalized = [unicode_utils.filesys_decode(f).replace(os.sep, '/') for f in self.filelist.files] manifest_filename = os.path.join(self.egg_info, 'SOURCES.txt') with open(manifest_filename, 'w') as fobj: fobj.write('\n'.join(normalized)) cmds['egg_info'] = cmd_egg_info # we override different "sdist" commands for both environments if 'sdist' in cmds: _sdist: Any = cmds['sdist'] else: from setuptools.command.sdist import sdist as _sdist class cmd_sdist(_sdist): def run(self) -> None: versions = get_versions() self._versioneer_generated_versions = versions # unless we update this, the command will keep using the old # version self.distribution.metadata.version = versions["version"] return _sdist.run(self) def make_release_tree(self, base_dir: str, files: List[str]) -> None: root = get_root() cfg = get_config_from_root(root) _sdist.make_release_tree(self, base_dir, files) # now locate _version.py in the new base_dir directory # (remembering that it may be a hardlink) and replace it with an # updated value target_versionfile = os.path.join(base_dir, cfg.versionfile_source) print("UPDATING %s" % target_versionfile) write_to_version_file(target_versionfile, self._versioneer_generated_versions) cmds["sdist"] = cmd_sdist return cmds CONFIG_ERROR = """ setup.cfg is missing the necessary Versioneer configuration. You need a section like: [versioneer] VCS = git style = pep440 versionfile_source = src/myproject/_version.py versionfile_build = myproject/_version.py tag_prefix = parentdir_prefix = myproject- You will also need to edit your setup.py to use the results: import versioneer setup(version=versioneer.get_version(), cmdclass=versioneer.get_cmdclass(), ...) Please read the docstring in ./versioneer.py for configuration instructions, edit setup.cfg, and re-run the installer or 'python versioneer.py setup'. """ SAMPLE_CONFIG = """ # See the docstring in versioneer.py for instructions. Note that you must # re-run 'versioneer.py setup' after changing this section, and commit the # resulting files. [versioneer] #VCS = git #style = pep440 #versionfile_source = #versionfile_build = #tag_prefix = #parentdir_prefix = """ OLD_SNIPPET = """ from ._version import get_versions __version__ = get_versions()['version'] del get_versions """ INIT_PY_SNIPPET = """ from . import {0} __version__ = {0}.get_versions()['version'] """ def do_setup() -> int: """Do main VCS-independent setup function for installing Versioneer.""" root = get_root() try: cfg = get_config_from_root(root) except (OSError, configparser.NoSectionError, configparser.NoOptionError) as e: if isinstance(e, (OSError, configparser.NoSectionError)): print("Adding sample versioneer config to setup.cfg", file=sys.stderr) with open(os.path.join(root, "setup.cfg"), "a") as f: f.write(SAMPLE_CONFIG) print(CONFIG_ERROR, file=sys.stderr) return 1 print(" creating %s" % cfg.versionfile_source) with open(cfg.versionfile_source, "w") as f: LONG = LONG_VERSION_PY[cfg.VCS] f.write(LONG % {"DOLLAR": "$", "STYLE": cfg.style, "TAG_PREFIX": cfg.tag_prefix, "PARENTDIR_PREFIX": cfg.parentdir_prefix, "VERSIONFILE_SOURCE": cfg.versionfile_source, }) ipy = os.path.join(os.path.dirname(cfg.versionfile_source), "__init__.py") maybe_ipy: Optional[str] = ipy if os.path.exists(ipy): try: with open(ipy, "r") as f: old = f.read() except OSError: old = "" module = os.path.splitext(os.path.basename(cfg.versionfile_source))[0] snippet = INIT_PY_SNIPPET.format(module) if OLD_SNIPPET in old: print(" replacing boilerplate in %s" % ipy) with open(ipy, "w") as f: f.write(old.replace(OLD_SNIPPET, snippet)) elif snippet not in old: print(" appending to %s" % ipy) with open(ipy, "a") as f: f.write(snippet) else: print(" %s unmodified" % ipy) else: print(" %s doesn't exist, ok" % ipy) maybe_ipy = None # Make VCS-specific changes. For git, this means creating/changing # .gitattributes to mark _version.py for export-subst keyword # substitution. do_vcs_install(cfg.versionfile_source, maybe_ipy) return 0 def scan_setup_py() -> int: """Validate the contents of setup.py against Versioneer's expectations.""" found = set() setters = False errors = 0 with open("setup.py", "r") as f: for line in f.readlines(): if "import versioneer" in line: found.add("import") if "versioneer.get_cmdclass()" in line: found.add("cmdclass") if "versioneer.get_version()" in line: found.add("get_version") if "versioneer.VCS" in line: setters = True if "versioneer.versionfile_source" in line: setters = True if len(found) != 3: print("") print("Your setup.py appears to be missing some important items") print("(but I might be wrong). Please make sure it has something") print("roughly like the following:") print("") print(" import versioneer") print(" setup( version=versioneer.get_version(),") print(" cmdclass=versioneer.get_cmdclass(), ...)") print("") errors += 1 if setters: print("You should remove lines like 'versioneer.VCS = ' and") print("'versioneer.versionfile_source = ' . This configuration") print("now lives in setup.cfg, and should be removed from setup.py") print("") errors += 1 return errors def setup_command() -> NoReturn: """Set up Versioneer and exit with appropriate error code.""" errors = do_setup() errors += scan_setup_py() sys.exit(1 if errors else 0) if __name__ == "__main__": cmd = sys.argv[1] if cmd == "setup": setup_command()