Skip to content

Commit

Permalink
feat!: flatten (expr) in places that make sense
Browse files Browse the repository at this point in the history
Specifically, "hi1! (expr "str" "num" "!") ➜ (str) (num) (sym "!")
This has been applied everywhere, but places that previously were single
(expr) only still wrap an (expr) around the now unhidden nodes.
  • Loading branch information
milisims committed Aug 5, 2022
1 parent a2c1946 commit 9e401aa
Show file tree
Hide file tree
Showing 9 changed files with 194,701 additions and 73,089 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@ build
*.log
/examples/*/
/target/
*.so
*.o
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "tree-sitter-org"
description = "org grammar for the tree-sitter parsing library"
version = "1.0.1"
version = "2.0.0"
keywords = ["incremental", "parsing", "org"]
categories = ["parsing", "text-editors"]
repository = "https://github.com/milisims/tree-sitter-org"
Expand Down
75 changes: 34 additions & 41 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,6 @@ 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

This section is meant to be a quick reference, not a thorough description.
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), (item)?, (tag_list)?)`
- body contains: `(element)+`
- 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.

## Example

``` org
Expand All @@ -47,20 +31,24 @@ Parses as:
(document [0, 0] - [16, 0]
body: (body [0, 0] - [4, 0]
directive: (directive [0, 0] - [1, 0]
name: (expr [0, 2] - [0, 7])
name: (expr [0, 2] - [0, 7]
(str [0, 2] - [0, 7]))
value: (value [0, 9] - [0, 16]
(expr [0, 9] - [0, 16])))
(str [0, 9] - [0, 16])))
(paragraph [2, 0] - [3, 0]
(expr [2, 0] - [2, 4])
(expr [2, 5] - [2, 12])
(expr [2, 13] - [2, 16])
(expr [2, 17] - [2, 22])))
(str [2, 0] - [2, 4])
(sym [2, 5] - [2, 6])
(str [2, 6] - [2, 12])
(str [2, 13] - [2, 15])
(sym [2, 15] - [2, 16])
(str [2, 17] - [2, 22])
(nl [2, 22] - [3, 0])))
subsection: (section [4, 0] - [16, 0]
headline: (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])))
(str [4, 2] - [4, 6])
(str [4, 7] - [4, 12])))
plan: (plan [5, 0] - [6, 0]
(entry [5, 0] - [5, 16]
timestamp: (timestamp [5, 0] - [5, 16]
Expand All @@ -71,50 +59,55 @@ Parses as:
(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])))
(str [7, 4] - [7, 8])
(str [7, 9] - [7, 10])
(nl [7, 10] - [8, 0])))
(listitem [8, 2] - [11, 0]
bullet: (bullet [8, 2] - [8, 3])
checkbox: (checkbox [8, 4] - [8, 7]
status: (expr [8, 5] - [8, 6]))
status: (sym [8, 5] - [8, 6]))
contents: (paragraph [8, 8] - [9, 0]
(expr [8, 8] - [8, 12])
(expr [8, 13] - [8, 14]))
(str [8, 8] - [8, 12])
(str [8, 13] - [8, 14])
(nl [8, 14] - [9, 0]))
contents: (list [9, 0] - [11, 0]
(listitem [9, 4] - [10, 0]
bullet: (bullet [9, 4] - [9, 5])
checkbox: (checkbox [9, 6] - [9, 9])
contents: (paragraph [9, 10] - [10, 0]
(expr [9, 10] - [9, 14])
(expr [9, 15] - [9, 16])))
(str [9, 10] - [9, 14])
(str [9, 15] - [9, 16])
(nl [9, 16] - [10, 0])))
(listitem [10, 4] - [11, 0]
bullet: (bullet [10, 4] - [10, 5])
checkbox: (checkbox [10, 6] - [10, 9]
status: (expr [10, 7] - [10, 8]))
status: (str [10, 7] - [10, 8]))
contents: (paragraph [10, 10] - [11, 0]
(expr [10, 10] - [10, 14])
(expr [10, 15] - [10, 16])))))
(str [10, 10] - [10, 14])
(str [10, 15] - [10, 16])
(nl [10, 16] - [11, 0])))))
(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])))))
(str [11, 4] - [11, 8])
(str [11, 9] - [11, 10])
(nl [11, 10] - [12, 0])))))
subsection: (section [13, 0] - [16, 0]
headline: (headline [13, 0] - [14, 0]
stars: (stars [13, 0] - [13, 2])
item: (item [13, 3] - [13, 13]
(expr [13, 3] - [13, 13]))
(str [13, 3] - [13, 13]))
tags: (tag_list [13, 14] - [13, 19]
tag: (tag [13, 15] - [13, 18])))
tag: (tag [13, 15] - [13, 18]
(str [13, 15] - [13, 18]))))
body: (body [14, 0] - [16, 0]
(paragraph [15, 0] - [16, 0]
(expr [15, 0] - [15, 4]))))))
(str [15, 0] - [15, 4])
(nl [15, 4] - [16, 0]))))))
```

## Install

For manual install, use `make`.

For neovim, using `nvim-treesitter/nvim-treesitter`, add to your configuration:

``` lua
Expand Down
Loading

0 comments on commit 9e401aa

Please sign in to comment.