vis
a vi-like editor based on Plan 9's structural regular expressions
git clone https://9o.is/git/vis.git
taskpaper.lua
(898B)
1 -- Copyright (c) 2016-2025 Larry Hynes. See LICENSE.
2 -- Taskpaper LPeg lexer
3
4 local lexer = lexer
5 local P, S = lpeg.P, lpeg.S
6
7 local lex = lexer.new(..., {lex_by_line = true})
8
9 -- Notes.
10 local delimiter = lpeg.B(' ') + lpeg.B('\t')
11 lex:add_rule('note', delimiter * lex:tag('note', lexer.to_eol(lexer.alnum)))
12
13 -- Tasks.
14 lex:add_rule('task', delimiter * lex:tag(lexer.LIST, '-'))
15
16 -- Projects.
17 lex:add_rule('project', lex:tag(lexer.HEADING,
18 lexer.range(lexer.starts_line(lexer.alnum), ':') * lexer.newline))
19
20 -- Tags.
21 lex:add_rule('extended_tag', lex:tag(lexer.TAG .. '.extended', '@' * lexer.word * '(' *
22 (lexer.word + lexer.digit + '-')^1 * ')'))
23 lex:add_rule('day_tag', lex:tag(lexer.TAG .. '.day', (P('@today') + '@tomorrow')))
24 lex:add_rule('overdue_tag', lex:tag(lexer.TAG .. '.overdue', '@overdue'))
25 lex:add_rule('plain_tag', lex:tag(lexer.TAG .. '.plain', '@' * lexer.word))
26
27 return lex