diff --git a/Cargo.toml b/Cargo.toml index ccd513e..8ca3480 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,11 +1,11 @@ [package] name = "tree-sitter-org" description = "org grammar for the tree-sitter parsing library" -version = "0.0.1" +version = "1.0.0" keywords = ["incremental", "parsing", "org"] categories = ["parsing", "text-editors"] repository = "https://github.com/milisims/tree-sitter-org" -edition = "2021" +edition = "2022" license = "MIT" build = "bindings/rust/build.rs" diff --git a/LICENSE b/LICENSE index 2171f58..abfbc31 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2021 Emilia Simmons +Copyright (c) 2021-2022 Emilia Simmons Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 4a50c41..2cf9a7a 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,9 @@ # tree-sitter-org -**Unstable**: This build will change. - -Org grammar for tree-sitter. It is not meant to implement emacs' orgmode -parser, but to implement a grammar that can usefully parse org files to be used -in neovim and any library that uses tree-sitter parsers. +Org grammar for tree-sitter. Here, the goal is to implement a grammar that can +usefully parse org files to be used in any library that uses tree-sitter +parsers. It is not meant to implement emacs' orgmode parser exactly, which is +inherently more dynamic than tree-sitter easily allows. ## Overview @@ -14,11 +13,11 @@ Refer to the tests in `corpus` for examples. - Top level node: `(document)` - Document contains: `(directive)* (body)? (section)*` - Section contains: `(headline) (plan)? (property_drawer)? (body)?` -- headline contains: (stars, title, tag?+) +- headline contains: `((stars), (item)?, (tag_list)?)` - body contains: `(element)+` -- element contains: `(directive)* choose(paragraph, drawer, comment, footnote def, list, block, dynamic block, table)` -- paragraph contains: (textelement)+ -- text element: choose(unmarked text, markup text, timestamps, footnotes, links, latex fragments) +- element contains: `(directive)* choose(paragraph, drawer, comment, footnote def, list, block, dynamic block, table)` or a bare `(directive)` +- paragraph contains: `(expr)+` +- expr contains: anonymous nodes for 'str', 'num', 'sym', and any ascii symbol that is not letters or numbers. (See top of grammar.js and queries for details) Like in many regex systems, `*/+` is read as "0/1 or more", and `?` is 0 or 1. @@ -46,54 +45,86 @@ Text Parses as: ``` (document [0, 0] - [16, 0] - (directive [0, 0] - [1, 0] - name: (name [0, 2] - [0, 7]) - value: (value [0, 9] - [0, 16])) - (body [2, 0] - [3, 0] + (body [0, 0] - [4, 0] + directive: (directive [0, 0] - [1, 0] + name: (expr [0, 2] - [0, 7]) + value: (value [0, 9] - [0, 16] + (expr [0, 9] - [0, 16]))) (paragraph [2, 0] - [3, 0] - (markup [2, 5] - [2, 16]))) + (expr [2, 0] - [2, 4]) + (expr [2, 5] - [2, 12]) + (expr [2, 13] - [2, 16]) + (expr [2, 17] - [2, 22]))) (section [4, 0] - [16, 0] - (headline [4, 0] - [4, 12] - (stars [4, 0] - [4, 1]) - (item [4, 2] - [4, 12])) + (headline [4, 0] - [5, 0] + stars: (stars [4, 0] - [4, 1]) + item: (item [4, 2] - [4, 12] + (expr [4, 2] - [4, 6]) + (expr [4, 7] - [4, 12]))) (plan [5, 0] - [6, 0] - (timestamp [5, 0] - [5, 16] - (date [5, 1] - [5, 15]))) - (body [7, 0] - [11, 10] - (list [7, 0] - [11, 10] - (listitem [7, 3] - [7, 10]) - (listitem [8, 3] - [10, 16] - (list [9, 0] - [10, 16] - (listitem [9, 5] - [9, 16]) - (listitem [10, 5] - [10, 16]))) - (listitem [11, 3] - [11, 10]))) + (entry [5, 0] - [5, 16] + timestamp: (timestamp [5, 0] - [5, 16] + (date [5, 1] - [5, 11]) + (day [5, 12] - [5, 15])))) + (body [6, 0] - [13, 0] + (list [7, 0] - [12, 0] + (listitem [7, 2] - [8, 0] + bullet: (bullet [7, 2] - [7, 3]) + contents: (paragraph [7, 4] - [8, 0] + (expr [7, 4] - [7, 8]) + (expr [7, 9] - [7, 10]))) + (listitem [8, 2] - [11, 0] + bullet: (bullet [8, 2] - [8, 3]) + contents: (paragraph [8, 4] - [9, 0] + (expr [8, 4] - [8, 5]) + (expr [8, 6] - [8, 7]) + (expr [8, 8] - [8, 12]) + (expr [8, 13] - [8, 14])) + contents: (list [9, 0] - [11, 0] + (listitem [9, 4] - [10, 0] + bullet: (bullet [9, 4] - [9, 5]) + contents: (paragraph [9, 6] - [10, 0] + (expr [9, 6] - [9, 7]) + (expr [9, 8] - [9, 9]) + (expr [9, 10] - [9, 14]) + (expr [9, 15] - [9, 16]))) + (listitem [10, 4] - [11, 0] + bullet: (bullet [10, 4] - [10, 5]) + contents: (paragraph [10, 6] - [11, 0] + (expr [10, 6] - [10, 7]) + (expr [10, 8] - [10, 9]) + (expr [10, 10] - [10, 14]) + (expr [10, 15] - [10, 16]))))) + (listitem [11, 2] - [12, 0] + bullet: (bullet [11, 2] - [11, 3]) + contents: (paragraph [11, 4] - [12, 0] + (expr [11, 4] - [11, 8]) + (expr [11, 9] - [11, 10]))))) (section [13, 0] - [16, 0] - (headline [13, 0] - [13, 19] - (stars [13, 0] - [13, 2]) - (item [13, 3] - [13, 13]) - tags: (tag [13, 15] - [13, 18])) - (body [15, 0] - [16, 0] - (paragraph [15, 0] - [16, 0]))))) + (headline [13, 0] - [14, 0] + stars: (stars [13, 0] - [13, 2]) + item: (item [13, 3] - [13, 13] + (expr [13, 3] - [13, 13])) + tags: (tag_list [13, 14] - [13, 19] + tag: (tag [13, 15] - [13, 18]))) + (body [14, 0] - [16, 0] + (paragraph [15, 0] - [16, 0] + (expr [15, 0] - [15, 4])))))) ``` ## Install -To compile the parser library for use in neovim & others: +For manual install, use `make`. -`gcc -o org.so -I./src src/parser.c src/scanner.cc -shared -Os -lstdc++` - -`cp org.so NEOVIMDIR/parser/` - -For neovim, using `nvim-treesitter/nvim-treesitter`: - -Add to your init.lua (or otherwise source): +For neovim, using `nvim-treesitter/nvim-treesitter`, add to your configuration: ``` lua local parser_config = require "nvim-treesitter.parsers".get_parser_configs() parser_config.org = { install_info = { - url = '/tree-sitter-org', - files = {'src/parser.c', 'src/scanner.cc'}, + url = 'https://github.com/milisims/tree-sitter-org', + revision = 'main', + files = { 'src/parser.c', 'src/scanner.cc' }, }, filetype = 'org', } @@ -105,4 +136,3 @@ To build the parser using npm and run tests: 2. Clone this repository: `git clone https://github.com/milisims/tree-sitter-org` and `cd` into it 3. Install tree-sitter using npm: `npm install` 4. Run tests: `./node_modules/.bin/tree-sitter generate && ./node_modules/.bin/tree-sitter test` - diff --git a/package.json b/package.json index fdda2b3..9ce603a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tree-sitter-org", - "version": "0.0.1", + "version": "1.0.0", "description": "Org grammar for tree-sitter", "main": "bindings/node", "keywords": [