{"id":21070418,"url":"https://github.com/stencila/encoda","last_synced_at":"2025-04-06T12:08:10.788Z","repository":{"id":26859808,"uuid":"110495578","full_name":"stencila/encoda","owner":"stencila","description":"↔️ A format converter for Stencila documents","archived":false,"fork":false,"pushed_at":"2025-03-30T06:13:26.000Z","size":98213,"stargazers_count":35,"open_issues_count":93,"forks_count":10,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-03-30T07:20:02.148Z","etag":null,"topics":["converter","document","nodejs","pandoc","remark","semantic"],"latest_commit_sha":null,"homepage":"https://stencila.github.io/encoda/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stencila.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":"codemeta.json"}},"created_at":"2017-11-13T03:27:47.000Z","updated_at":"2025-03-19T08:36:23.000Z","dependencies_parsed_at":"2022-09-18T10:41:35.989Z","dependency_job_id":"4a8facce-c747-4d87-95ef-5b7f97624755","html_url":"https://github.com/stencila/encoda","commit_stats":{"total_commits":2726,"total_committers":23,"mean_commits":"118.52173913043478","dds":"0.37674247982391784","last_synced_commit":"202d8da5e5c3381b318910df1fd8878df4b1456d"},"previous_names":["stencila/convert"],"tags_count":276,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stencila%2Fencoda","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stencila%2Fencoda/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stencila%2Fencoda/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stencila%2Fencoda/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stencila","download_url":"https://codeload.github.com/stencila/encoda/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247478320,"owners_count":20945266,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["converter","document","nodejs","pandoc","remark","semantic"],"created_at":"2024-11-19T18:46:55.082Z","updated_at":"2025-04-06T12:08:10.766Z","avatar_url":"https://github.com/stencila.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Encoda\n\n## Announcement\n\nFor some time our main focus has been a rewrite of [our Stencila platform](https://github.com/stencila/stencila) (`v2`). We are porting over codecs and other functionality from this repo to the `v2` of our Stencila platform.\n\nThis means that we are unable to be so active with contributions to this project. eLife have volunteered to continue development on this repository until such a time as the `v2` of Stencila can meet their needs. They only have need of the codecs to convert from JATS to JSON.\n\nFrom `v2.0.0` of this project we will only continue to support the conversion from JATS to JSON. If you want to use any other formats then please see if they are available in Stencila or use the [v1.0.3](https://github.com/stencila/encoda/releases/tag/v1.0.3) release.\n\nWe have chosen at this time to leave the rest of the README.md as it was before the removal of much of the code. This does mean that the README.md is out of date. We may prioritise updating it in future.\n\n##### Codecs for structured, semantic, composable, and executable documents\n\n[![Build status](https://dev.azure.com/stencila/stencila/_apis/build/status/stencila.encoda?branchName=master)](https://dev.azure.com/stencila/stencila/_build/latest?definitionId=1\u0026branchName=master)\n[![Code coverage](https://codecov.io/gh/stencila/encoda/branch/master/graph/badge.svg)](https://codecov.io/gh/stencila/encoda)\n[![NPM](https://img.shields.io/npm/v/@stencila/encoda.svg?style=flat)](https://www.npmjs.com/package/@stencila/encoda)\n[![Docs](https://img.shields.io/badge/docs-latest-blue.svg)](https://stencila.github.io/encoda/)\n\n## Introduction\n\n\u003e \"A codec is a device or computer program for encoding or decoding a digital data stream or signal. Codec is a portmanteau of coder-decoder. - [Wikipedia](https://en.wikipedia.org/wiki/Codec)\n\nEncoda provides a collection of codecs for converting between, and composing together, documents in various formats. The aim is not to achieve perfect lossless conversion between alternative document formats; there are already several tools for that. Instead the focus of Encoda is to use existing tools to encode and compose semantic documents in alternative formats.\n\n## Formats\n\nAs far as possible, Encoda piggybacks on top of existing tools for parsing and serializing documents in various formats. It uses [extensions to schema.org](https://github.com/stencila/schema) as the central data model for all documents and for many formats, it simply transforms the data model of the external tool (e.g. [Pandoc types](https://hackage.haskell.org/package/pandoc-types), [SheetJS spreadsheet model](https://github.com/SheetJS/sheetjs/blob/master/types/index.d.ts)) to that schema (\"decoding\") and back again (\"encoding\"). In this sense, you can think of Encoda as a [Rosetta Stone](https://en.wikipedia.org/wiki/Rosetta_Stone) with schema.org at it's centre.\n\n\u003e ⚡ Tip: If a codec for your favorite format is missing below, see if there is already an [issue](https://github.com/stencila/encoda/issues) for it and 👍 or comment. If there is no issue regarding the converter you need, feel free to [create one](https://github.com/stencila/encoda/issues/new).\n\n| Format                       | Codec         | Powered by             | Status |\n| ---------------------------- | ------------- | ---------------------- | ------ |\n| **Text**                     |\n| Plain text                   | [txt]         | [`toString`][tostring] | ✔      |\n| Markdown                     | [md]          | [Remark]               | ✔      |\n| LaTex                        | [latex]       | [Pandoc][pandoc-org]   | α      |\n| Microsoft Word               | [docx]        | [Pandoc][pandoc-org]   | β      |\n| Google Docs                  | [gdoc]        | [`JSON`][json-api]     | β      |\n| Open Document Text           | [odt]         | [Pandoc][pandoc-org]   | α      |\n| HTML                         | [html]        | [jsdom], [hyperscript] | ✔      |\n| JATS XML                     | [jats]        | [xml-js]               | ✔      |\n|                              | [jats-pandoc] | [Pandoc][pandoc-org]   | β      |\n| Portable Document Format     | [pdf]         | [pdf-lib], [Puppeteer] | β      |\n| **Math**                     |\n| TeX                          | [tex]         | [mathconverter]        | ✔      |\n| MathML                       | [mathml]      | [MathJax]              | ✔      |\n| **Visualization**            |\n| Plotly                       | [plotly]      | [Plotly.js]            | ✔      |\n| Vega / Vega-Lite             | [vega]        | [Vega][vega-io]        | ✔      |\n| **Bibliographic**            |\n| Citation Style Language JSON | [csl]         | [Citation.js]          | ✔      |\n| BibTeX                       | [bib]         | [Citation.js]          | ✔      |\n| **Notebooks**                |\n| Jupyter                      | [ipynb]       | [`JSON`][json-api]     | ✔      |\n| RMarkdown                    | [xmd]         | [Remark]               | ✔      |\n| **Spreadsheets**             |\n| Microsoft Excel              | [xlsx]        | [SheetJS]              | β      |\n| Open Document Spreadsheet    | [ods]         | [SheetJS]              | β      |\n| **Tabular data**             |\n| CSV                          | [csv]         | [SheetJS]              | β      |\n| Tabular Data Package         | [tdp]         | [datapackage-js]       | α      |\n| **Collections**              |\n| Filesystem Directory         | [dir]         | [`fs`][fs]             | β      |\n| **Data interchange, other**  |\n| JSON                         | [json]        | [`JSON`][json-api]     | ✔      |\n| JSON-LD                      | [jsonld]      | [jsonld.js]            | ✔      |\n| JSON5                        | [json5]       | [json5][json5-org]     | ✔      |\n| YAML                         | [yaml]        | [js-yaml]              | ✔      |\n| Pandoc                       | [pandoc]      | [Pandoc][pandoc-org]   | ✔      |\n| Reproducible PNG             | [rpng]        | [Puppeteer]            | ✔      |\n| XML                          | [xml]         | [xml-js]               | ✔      |\n\n\u003c!-- Codecs --\u003e\n\n[bib]: src/codecs/bib\n[crossref]: src/codecs/crossref\n[csl]: src/codecs/csl\n[csv]: src/codecs/csv\n[dar]: src/codecs/dar\n[dir]: src/codecs/dir\n[dmagic]: src/codecs/dmagic\n[docx]: src/codecs/docx\n[doi]: src/codecs/doi\n[elife]: src/codecs/elife\n[gdoc]: src/codecs/gdoc\n[html]: src/codecs/html\n[http]: src/codecs/http\n[ipynb]: src/codecs/ipynb\n[jats-pandoc]: src/codecs/jats-pandoc\n[jats]: src/codecs/jats\n[json]: src/codecs/json\n[json5]: src/codecs/json5\n[jsonld]: src/codecs/jsonld\n[latex]: src/codecs/latex\n[mathml]: src/codecs/mathml\n[md]: src/codecs/md\n[ods]: src/codecs/ods\n[odt]: src/codecs/odt\n[orcid]: src/codecs/orcid\n[pandoc]: src/codecs/pandoc\n[pdf]: src/codecs/pdf\n[plos]: src/codecs/plos\n[plotly]: src/codecs/plotly\n[rpng]: src/codecs/rpng\n[tdp]: src/codecs/tdp\n[tex]: src/codecs/tex\n[txt]: src/codecs/txt\n[vega]: src/codecs/vega\n[xlsx]: src/codecs/xlsx\n[xmd]: src/codecs/xmd\n[xml]: src/codecs/xml\n[yaml]: src/codecs/yaml\n\n\u003c!-- Dependencies --\u003e\n\n[citation.js]: https://citation.js.org/\n[datapackage-js]: https://github.com/frictionlessdata/datapackage-js\n[fs]: https://nodejs.org/api/fs.html\n[hyperscript]: https://github.com/hyperhype/hyperscript\n[js-yaml]: https://github.com/nodeca/js-yaml#readme\n[jsdom]: https://github.com/jsdom/jsdom\n[json-api]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON\n[json5-org]: https://json5.org/\n[jsonld.js]: https://github.com/digitalbazaar/jsonld.js\n[mathconverter]: https://github.com/oerpub/mathconverter\n[mathjax]: https://www.mathjax.org/\n[pandoc-org]: https://pandoc.org/\n[pdf-lib]: https://pdf-lib.js.org/\n[plotly.js]: https://plotly.com/javascript/\n[puppeteer]: https://pptr.dev/\n[remark]: https://remark.js.org/\n[sheetjs]: https://sheetjs.com\n[tostring]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString\n[vega-io]: https://vega.github.io/vega/\n[xml-js]: https://github.com/nashwaan/xml-js#readme\n\n**Key**\n\n- ✗: Not yet implemented\n- α: Alpha, initial implementation\n- β: Beta, ready for user testing\n- ✔: Ready for production use\n\n## Publishers\n\nSeveral of the codecs in Encoda, deal with fetching content from a particular publisher. For example, to get an eLife article and read it in Markdown:\n\n```bash\nstencila convert https://elifesciences.org/articles/45187v2 ye-et-al-2019.md\n```\n\nSome of these publisher codecs deal with meta data. e.g.\n\n```bash\nstencila convert \"Watson and Crick 1953\" - --from crossref --to yaml\n```\n\n```yaml\ntype: Article\ntitle: Genetical Implications of the Structure of Deoxyribonucleic Acid\nauthors:\n  - familyNames:\n      - WATSON\n    givenNames:\n      - J. D.\n    type: Person\n  - familyNames:\n      - CRICK\n    givenNames:\n      - F. H. C.\n    type: Person\ndatePublished: '1953,5'\nisPartOf:\n  issueNumber: '4361'\n  isPartOf:\n    volumeNumber: '171'\n    isPartOf:\n      title: Nature\n      type: Periodical\n    type: PublicationVolume\n  type: PublicationIssue\n```\n\n| Source                 | Codec      | Base codec/s                         | Status | Coverage          |\n| ---------------------- | ---------- | ------------------------------------ | ------ | ----------------- |\n| **General**            |\n| HTTP                   | [http]     | Based on `Content-Type` or extension | β      | ![][http-cov]     |\n| **`Person`**           |\n| ORCID                  | [orcid]    | `jsonld`                             | β      | ![][orcid-cov]    |\n| **`Article` metadata** |\n| DOI                    | [doi]      | `csl`                                | β      | ![][doi-cov]      |\n| Crossref               | [crossref] | `jsonld`                             | β      | ![][crossref-cov] |\n| **`Article` content**  |\n| eLife                  | [elife]    | `jats`                               | β      | ![][elife-cov]    |\n| PLoS                   | [plos]     | `jats`                               | β      | ![][plos-cov]     |\n\n## Install\n\nThe easiest way to use Encoda is to install the [`stencila` command line tool](https://github.com/stencila/stencila). Encoda powers `stencila convert`, and other commands, in that CLI. However, the version of Encoda in `stencila`, can lag behind the version in this repo. So if you want the latest functionality, install Encoda as a Node.js package:\n\n```bash\nnpm install @stencila/encoda --global\n```\n\n## Use\n\nEncoda is intended to be used primarily as a library for other applications. However, it comes with a simple command line script which allows you to use the `convert` function directly.\n\n### Converting files\n\n```bash\nencoda convert notebook.ipynb notebook.docx\n```\n\nEncoda will determine the input and output formats based on the file extensions. You can override these using the `--from` and `--to` options. e.g.\n\n```bash\nencoda convert notebook.ipynb notebook.xml --to jats\n```\n\nYou can also convert to more than one file / format (in this case the `--to` argument only applies to the first output file) e.g.\n\n```bash\nencoda convert report.docx report.Rmd report.html report.jats\n```\n\n### Converting folders\n\nYou can decode an entire directory into a `Collection`. Encoda will traverse the directory, including subdirectories, decoding each file matching your glob pattern. You can then encode the `Collection` using the `dir` codec into a tree of HTML files e.g.\n\n```bash\nencoda convert myproject myproject-published --to dir --pattern '**/*.{rmd, csv}'\n```\n\n### Converting command line input\n\nYou can also read content from the first argument. In that case, you'll need to specifying the `--from` format e.g.\n\n```bash\nencoda convert \"{type: 'Paragraph', content: ['Hello world!']}\" --from json5 paragraph.md\n```\n\nYou can send output to the console by using `-` as the second argument and specifying the `--to` format e.g.\n\n```bash\nencoda convert paragraph.md - --to yaml\n```\n\n| Option         | Description                                                                                                                                                                                                                                              |\n| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `--from`       | The format of the input content e.g. `--from md`                                                                                                                                                                                                         |\n| `--to`         | The format for the output content e.g. `--to html`                                                                                                                                                                                                       |\n| `--theme`      | The theme for the output (only applies to HTML, PDF and RPNG output) e.g. `--theme eLife`. Either a [Thema theme name](https://github.com/stencila/thema#available-themes) or a path/URL to a directory containing a `styles.css` and a `index.js` file. |\n| `--standalone` | Generate a standalone document, not a fragment (default `true`)                                                                                                                                                                                          |\n| `--bundle`     | Bundle all assets (e.g images, CSS and JS) into the document (default `false`)                                                                                                                                                                           |\n| `--debug`      | Print debugging information                                                                                                                                                                                                                              |\n\n### Using with Executa\n\nEncoda exposes the `decode` and `encode` methods of the [Executa](https://github.com/stencila/executa) API. Register Encoda so that it can be discovered by other executors on your machine,\n\n```bash\nnpm run register\n```\n\nYou can then use Encoda as a plugin for Executa that provides additional format conversion capabilities. For example, you can use the `query` REPL on a Markdown document:\n\n```bash\nnpx executa query CHANGELOG.md --repl\n```\n\nYou can then use the REPL to explore the structure of the document and do things like create summary documents from it. For example, lets say from some reason we wanted to create a short JATS XML file with the five most recent releases of this package:\n\n```\njmp \u003e %format jats\njmp \u003e %dest latest-releases.jats.xml\njmp \u003e {type: 'Article', content: content[? type==`Heading` \u0026\u0026 depth==`1`] | [1:5]}\n```\n\nWhich creates the `latest-major-releases.jats.xml` file:\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\n\u003c!DOCTYPE article PUBLIC \"-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.1 20151215//EN\" \"JATS-archivearticle1.dtd\"\u003e\n\u003carticle xmlns:xlink=\"http://www.w3.org/1999/xlink\" article-type=\"research-article\"\u003e\n    \u003cfront\u003e\n        \u003ctitle-group\u003e\n            \u003carticle-title/\u003e\n        \u003c/title-group\u003e\n        \u003ccontrib-group/\u003e\n    \u003c/front\u003e\n    \u003cbody\u003e\n        \u003csec\u003e\n            \u003ctitle\u003e\n                \u003cext-link ext-link-type=\"uri\" xlink:href=\"https://github.com/stencila/encoda/compare/v0.79.0...v0.80.0\"\u003e0.80.0\u003c/ext-link\u003e (2019-09-30)\n            \u003c/title\u003e\n        \u003c/sec\u003e\n...\n```\n\nYou can query a document in any format supported by Encoda. As another example, lets' fetch a CSV file from Github and get the names of it's columns:\n\n```bash\nnpx executa query https://gist.githubusercontent.com/jncraton/68beb88e6027d9321373/raw/381dcf8c0d4534d420d2488b9c60b1204c9f4363/starwars.csv --repl\n🛈 INFO  encoda:http Fetching \"https://gist.githubusercontent.com/jncraton/68beb88e6027d9321373/raw/381dcf8c0d4534d420d2488b9c60b1204c9f4363/starwars.csv\"\njmp \u003e columns[].name\n[\n  'SetID',\n  'Number',\n  'Variant',\n  'Theme',\n  'Subtheme',\n  'Year',\n  'Name',\n  'Minifigs',\n  'Pieces',\n  'UKPrice',\n  'USPrice',\n  'CAPrice',\n  'EUPrice',\n  'ImageURL',\n  'Owned',\n  'Wanted',\n  'QtyOwned',\n]\njmp \u003e\n```\n\nSee the `%help` REPL command for more examples.\n\nNote: If you have [`executa`](https://github.com/stencila/executa) installed globally, then the `npx` prefix above is not necessary.\n\n## Documentation\n\nSelf-hoisted (documentation converted from various formats to html) and API documentation (generated from source code) is available at: https://stencila.github.io/encoda.\n\n## Develop\n\nCheck how to [contribute back to the project](https://github.com/stencila/encoda/blob/master/CONTRIBUTING.md). All PRs are most welcome! Thank you!\n\nClone the repository and install a development environment:\n\n```bash\ngit clone https://github.com/stencila/encoda.git\ncd encoda\nnpm install\n```\n\nYou can manually test conversion using current TypeScript `src` using:\n\n```bash\nnpm start -- convert simple.md simple.html\n```\n\nThat can be slow because the TypeScript has to be compiled on the fly (using `ts-node`). Alternatively, compile the TypeScript to JavaScript first, and then run `node` on the `dist` folder:\n\n```bash\nnpm run build:dist\nnode dist convert simple.md simple.html\n```\n\nIf you are using VSCode, you can use the [Auto Attach feature](https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_auto-attach-feature) to attach to the CLI when running the `debug` NPM script:\n\n```bash\nnpm run debug -- convert simple.gdoc simple.ipynb\n```\n\nA simple script to convert JATS to JSON:\n\n```bash\ncat simple-jats.xml | npm run convert-jats --silent \u003e simple.json\n```\n\n## Testing\n\n### Running tests locally\n\nRun the test suite using:\n\n```bash\nnpm test\n```\n\nOr, run a single test file e.g.\n\n```bash\nnpx jest tests/xlsx.test.ts --watch\n```\n\nTo display debug logs during testing set the environment variable `DEBUG=1`, e.g.\n\n```bash\nDEBUG=1 npm test\n```\n\nTo get coverage statistics:\n\n```bash\nnpm run cover\n```\n\nThere's also a `Makefile` if you prefer to run tasks that way e.g.\n\n```bash\nmake lint cover\n```\n\n### Running test in Docker\n\nYou can also test this package using with a Docker container:\n\n```bash\nnpm run test:docker\n```\n\n## Writing tests\n\n#### Recording and using network fixtures\n\nAs far as possible, tests should be able to run with no network access. We use [Nock Back](https://github.com/nock/nock#nock-back) to record and play back network requests and responses. Use the `nockRecord` helper function for this with the convention of starting the fixture file with `nock-record-` e.g.\n\n```ts\nconst stopRecording = await nockRecord('nock-record-\u003cname-of-test\u003e.json')\n// Do some things that connect to the interwebs\nstopRecording()\n```\n\nNote that the HTTP fetcher implements caching so that you may need to remove the cache for the recording of fixtures to work e.g. `rm -rf /tmp/stencila/encoda/cache/`.\n\nIf there are changes in the URLs that your test fetches, or you want to check that your test is still works against an external API that may have changed, remove the Nock recording and rerun the test e.g.,\n\n```sh\nrm src/codecs/elife/__fixtures__/nock-record-*.json\nnpx jest src/codecs/elife/ --testTimeout 30000\n```\n\n## Contribute\n\nWe 💕 contributions! All contributions: ideas 🤔, examples 💡, bug reports 🐛, documentation 📖, code 💻, questions 💬. See [CONTRIBUTING.md](CONTRIBUTING.md) for more on where to start. You can also provide your feedback on the [Community Forum](https://community.stenci.la)\nand [Gitter channel](https://gitter.im/stencila/stencila).\n\n## Contributors\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://stenci.la\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/2358535?v=4\" width=\"50px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAleksandra Pawlik\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stencila/encoda/commits?author=apawlik\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/stencila/encoda/commits?author=apawlik\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"https://github.com/stencila/encoda/issues?q=author%3Aapawlik\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/nokome\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/1152336?v=4\" width=\"50px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eNokome Bentley\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stencila/encoda/commits?author=nokome\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/stencila/encoda/commits?author=nokome\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"https://github.com/stencila/encoda/issues?q=author%3Anokome\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://toki.io\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/10161095?v=4\" width=\"50px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJacqueline\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stencila/encoda/commits?author=jwijay\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#design-jwijay\" title=\"Design\"\u003e🎨\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/hamishmack\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/620450?v=4\" width=\"50px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eHamish Mackenzie\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stencila/encoda/commits?author=hamishmack\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/stencila/encoda/commits?author=hamishmack\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://ketch.me\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/1646307?v=4\" width=\"50px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAlex Ketch\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stencila/encoda/commits?author=alex-ketch\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/stencila/encoda/commits?author=alex-ketch\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#design-alex-ketch\" title=\"Design\"\u003e🎨\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/beneboy\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/292725?v=4\" width=\"50px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eBen Shaw\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stencila/encoda/commits?author=beneboy\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/stencila/encoda/issues?q=author%3Abeneboy\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://humanrights.washington.edu\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/16355618?v=4\" width=\"50px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ePhil Neff\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stencila/encoda/issues?q=author%3Aphilneff\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://rgaiacs.com\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/1506457?v=4\" width=\"50px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eRaniere Silva\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stencila/encoda/commits?author=rgaiacs\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://people.unipi.it/lorenzo_cangiano/\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/11914162?v=4\" width=\"50px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eLorenzo Cangiano\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stencila/encoda/issues?q=author%3Alollopus\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/FAtherden-eLife\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/43879983?v=4\" width=\"50px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eFAtherden-eLife\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stencila/encoda/issues?q=author%3AFAtherden-eLife\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e \u003ca href=\"#design-FAtherden-eLife\" title=\"Design\"\u003e🎨\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://giorgiosironi.com\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/160299?v=4\" width=\"50px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eGiorgio Sironi\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stencila/encoda/pulls?q=is%3Apr+reviewed-by%3Agiorgiosironi\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003c!-- markdownlint-enable --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb id=\"format-approach\"\u003eAdd a contributor\u003c/b\u003e...\u003c/summary\u003e\n\nTo add youself, or someone else, to the above list, either,\n\n1. Ask the [@all-contributors bot](https://allcontributors.org/docs/en/bot/overview) to do it for you by commenting on an issue or PR like this:\n\n   \u003e @all-contributors please add @octocat for bugs, tests and code\n\n2. Use the [`all-contributors` CLI](https://allcontributors.org/docs/en/cli/overview) to do it yourself:\n\n   ```bash\n   npx all-contributors add octocat bugs, tests, code\n   ```\n\nSee the list of [contribution types](https://allcontributors.org/docs/en/emoji-key).\n\n\u003c/details\u003e\n\n## Acknowledgments\n\nEncoda relies on many awesome opens source tools (see `package.json` for the complete list). We are grateful ❤ to their developers and contributors for all their time and energy. In particular, these tools do a lot of the heavy lifting 💪 under the hood.\n\n| Tool                                                                                                               | Use                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n| ------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| ![Ajv](https://ajv.js.org/images/ajv_logo.png)                                                                     | [Ajv](https://ajv.js.org/) is \"the fastest JSON Schema validator for Node.js and browser\". Ajv is not only fast, it also has an impressive breadth of functionality. We use Ajv for the `validate()` and `coerce()` functions to ensure that ingested data is valid against the Stencila [schema](https://github.com/stencila/schema).                                                                                                                                                                                                                                                    |\n| ![Citation.js](https://avatars0.githubusercontent.com/u/41587916?s=200\u0026v=4)                                        | [Citation.js] converts bibliographic formats like BibTeX, BibJSON, DOI, and Wikidata to CSL-JSON. We use it to power the codecs for those formats and APIs.                                                                                                                                                                                                                                                                                                                                                                                                                               |\n| ![Frictionless Data](https://avatars0.githubusercontent.com/u/5912125?s=200\u0026v=4)                                   | [`datapackage-js`](https://github.com/frictionlessdata/datapackage-js) from the team at [Frictionless Data](https://frictionlessdata.io/) is a Javascript library for working with [Data Packages](https://frictionlessdata.io/specs/data-package/). It does a lot of the work in converting between Tabular Data Packages and Stencila Datatables.                                                                                                                                                                                                                                       |\n| ![Glitch Digital](https://avatars1.githubusercontent.com/u/16604593?s=200\u0026v=4)                                     | Glitch Digital's [`structured-data-testing-tool`](https://github.com/glitchdigital/structured-data-testing-tool) is a library and command line tool to help inspect and test for Structured Data. We use it to check that the HTML generated by Encoda can be read by bots 🤖                                                                                                                                                                                                                                                                                                             |\n| ![Pa11y](https://pa11y.org/resources/brand/logo.svg)                                                               | [Pa11y](https://pa11y.org/) provides a range of free and open source tools to help designers and developers make their web pages more accessible. We use [`pa11y`](https://github.com/pa11y/pa11y) to test that HTML generated produced by Encoda meets the [Web Content Accessibility Guidelines (WCAG)](https://www.w3.org/TR/WCAG20/) and [Axe](https://dequeuniversity.com/rules/axe/3.5) rule set.                                                                                                                                                                                   |\n| **Pandoc**                                                                                                         | [Pandoc] is a \"universal document converter\". It's able to convert between an impressive number of formats for textual documents. Our [Typescript definitions for Pandoc's AST](https://github.com/stencila/encoda/blob/c400d798e6b54ea9f88972b038489df79e38895b/src/pandoc-types.ts) allow us to leverage this functionality from within Node.js while maintaining type safety. Pandoc powers our converters for Word, JATS and Latex. We have contributed to Pandoc, including developing its [JATS reader](https://github.com/jgm/pandoc/blob/master/src/Text/Pandoc/Readers/JATS.hs). |\n| ![Puppeteer](https://user-images.githubusercontent.com/10379601/29446482-04f7036a-841f-11e7-9872-91d1fc2ea683.png) | [Puppeteer] is a Node library which provides a high-level API to control Chrome. We use it to take screenshots of HTML snippets as part of generating rPNGs and we plan to use it for [generating PDFs](https://github.com/stencila/encoda/issues/53).                                                                                                                                                                                                                                                                                                                                    |\n| ![Remark](https://avatars2.githubusercontent.com/u/16309564?s=200\u0026v=4)                                             | [Remark] is an ecosystem of plugins for processing Markdown. It's part of the [unified](https://unifiedjs.github.io/) framework for processing text with syntax trees - a similar approach to Pandoc but in Javascript. We use Remark as our Markdown parser because of it's extensibility.                                                                                                                                                                                                                                                                                               |\n| ![SheetJs](https://sheetjs.com/sketch128.png)                                                                      | [SheetJs] is a Javascript library for parsing and writing various spreadsheet formats. We use their [community edition](https://github.com/sheetjs/js-xlsx) to power converters for CSV, Excel, and Open Document Spreadsheet formats. They also have a [pro version](https://sheetjs.com/pro) if you need extra support and functionality.                                                                                                                                                                                                                                               |\n\nMany thanks ❤ to the [Alfred P. Sloan Foundation](https://sloan.org) and [eLife](https://elifesciences.org) for funding development of this tool.\n\n\u003cp align=\"left\"\u003e\n  \u003cimg width=\"250\" src=\"https://sloan.org/storage/app/media/Logos/Sloan-Logo-stacked-black-web.png\"\u003e\n  \u003cimg width=\"250\" src=\"https://www.force11.org/sites/default/files/elife-full-color-horizontal.png\"\u003e\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstencila%2Fencoda","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstencila%2Fencoda","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstencila%2Fencoda/lists"}