{"id":13626189,"url":"https://github.com/org-rs/org-rs","last_synced_at":"2025-04-16T11:31:28.487Z","repository":{"id":41867347,"uuid":"181259715","full_name":"org-rs/org-rs","owner":"org-rs","description":"org-mode parser rewrite in Rust","archived":false,"fork":false,"pushed_at":"2024-04-15T04:00:13.000Z","size":189,"stargazers_count":786,"open_issues_count":17,"forks_count":22,"subscribers_count":26,"default_branch":"master","last_synced_at":"2025-04-06T06:56:18.662Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/org-rs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-04-14T04:21:35.000Z","updated_at":"2025-04-03T23:19:42.000Z","dependencies_parsed_at":"2024-11-08T15:34:56.221Z","dependency_job_id":"07b6dc55-e3c9-43ec-af52-cb91f74e460b","html_url":"https://github.com/org-rs/org-rs","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/org-rs%2Forg-rs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/org-rs%2Forg-rs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/org-rs%2Forg-rs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/org-rs%2Forg-rs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/org-rs","download_url":"https://codeload.github.com/org-rs/org-rs/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249235064,"owners_count":21235140,"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":[],"created_at":"2024-08-01T21:02:12.516Z","updated_at":"2025-04-16T11:31:28.208Z","avatar_url":"https://github.com/org-rs.png","language":"Rust","funding_links":[],"categories":["Rust"],"sub_categories":[],"readme":"[Org Mode](https://orgmode.org/) parser re-write in Rust\n\n\n# Motivation\n\n[Org](https://orgmode.org/) is probably the best and most complete plain text\norganizational system known to mankind.  It has countless applications:\n- authoring,\n- publishing,\n- technical documentation,\n- literate programming,\n- task and time tracking,\n- journalling,\n- blogging,\n- agendas,\n- wikis,\nand many more.\n\nOrg has a limited presence outside of GNU Emacs, and the standard\nimplementation is that of GNU Emacs written in Emacs lisp.  Despite\nthe fact that GNU Emacs is widely available and widely used as a lisp\ninterpreter, there are applications wherein using Emacs to properly\nhandle and parse an Org file would be problematic.  This package is\nintended to replicate the exact behaviour of Org as implemented in\nEmacs lisp, while decoupling the use of Org from Emacs, such that it\ncan be used in a content management system, as a blogging backend, _etc._\n\n## Prior art\n\nMany attempts have been made.  The most faithful not written in a lisp is the implementaiton in [`pandoc`](https://github.com/jgm/pandoc).\n\nThe reason why there have been relatively few attemps is that Org's\nsyntax is not trivial.  Most of Org's syntax is\n[context-sensitive](https://en.wikipedia.org/wiki/Chomsky_hierarchy#Type-1_grammars)\nwith only a few context-free elements.  This results in a higher\ncomplexity and problematic testing of implementations, as unit testing\nof small chunks of Org code does not guarantee correct parsing of the\nOrg file as a whole.\n\nTo this end, Org parsers\n[org-ruby](https://github.com/wallyqs/org-ruby) and\n[pandoc](https://pandoc.org/), have chosen to focus on a restricted\nsubset of Org's syntax.  More ambitious projects try to cover all\nfeatures but since Org does not have a formal\nspecification[^1] they rely on observed Org's behavior in\nEmacs or author's intuition.  As a result they rarely get finished.\n\nThis project aims to be a faithful one-to-one recreation of the Emacs\nlisp code translated into Rust.  As such it eschews many of the\nproblems with writing an ad-hoc parser, and allows for easy adaptation\nin case the official Org specification (that of the reference parser),\nchanges.\n\nCheck out our [FAQ](https://github.com/org-rs/org-rs/wiki/FAQ) for\nmore information.  Also feel free to open an issue and/or discussion.\n\n# Goals\n\n`org-rs` is guided by the following principles:\n- Be a faithful recreation of the original implementation, not a\n  competing standard or implementation.\n- Be standalone, embeddable and reusable.\n- Adapt to the users' needs, rather than impose adherence to specific ecosystems.\n- Be fast.\n\n\n# Design decisions\n\nThese are the choices that were made to achieve the goals:\n\n- Use Rust.  It's fast, memory safe, and has a healthy package\n  ecosystem.  It also can be linked both statically and dynamically\n  against C code.\n- Adhere to the original emacs lisp implementation in terms of\n  structure and organisation.\n- Adhere to idiomatic Rust wherever else possible.\n\nThese decisions result in a clear scope, and completion criteria, as\nwell as easily verifiable replication of the behaviour of the original\nlisp implementation.\n\n\n# Roadmap\n\n[element](rust/element) - parser crate is currently the main and only focus.\nIt should perform just 2 tasks. Generate concrete syntax tree and serialize it\nback to canonical Org representation.\n\nThe rest of the roadmap is not fully flashed out. Feature-complete parser opens\na lot of possibilities, here are just a few of my ideas:\n\n- Parse tree manipulation tools (like exporting to other formats).\n- Language server - [a way to solve \"the matrix\" problem](https://langserver.org/).\n  Enabling other editors to have their own org-mode would be a logical next step.\n\n- CLI tools. I'd love to get integration with\n  [TaskWarrior](https://github.com/GothenburgBitFactory/taskwarrior)\n  and maybe even use Org as TaskWarrior's DOM.\n\n\n# Contribution\n\nAny contributions are welcome:\n- Code\n- Documentation\n- Verification\n- Spreading the word\n- Using in your project in a cool way\n\nIf you want to contribute code, please check out the [contribution\nguide](doc/CONTRIBUTING.org).\n\nGot a question?  Open a discussion.\n\n# Similar projects\n\n- [vim-orgmode](https://github.com/jceb/vim-orgmode)\n- [orgajs](https://github.com/xiaoxinghu/orgajs) nodejs\n- [orgnode](http://members.optusnet.com.au/~charles57/GTD/orgnode.html) python\n- [org-ruby](https://github.com/wallyqs/org-ruby) ruby\n- and [many others](https://orgmode.org/worg/org-tools/index.html)\n\n\n# More about Org Mode\n\n\n- [Org-Mode Is One of the Most Reasonable Markup Languages to Use for Text](https://karl-voit.at/2017/09/23/orgmode-as-markup-only/)\n- [Awesome guide](http://doc.norang.ca/org-mode.html) about org-mode\n- [teaser](https://github.com/novoid/org-mode-workshop/blob/master/featureshow/org-mode-teaser.org)\n\n\n[^1]: Some attempts were made to formalize the syntax. This project uses them as supplementary materials.\nSee [contribution guide](doc/CONTRIBUTING.org) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Forg-rs%2Forg-rs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Forg-rs%2Forg-rs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Forg-rs%2Forg-rs/lists"}