diff options
Diffstat (limited to 'lexlua/taskpaper.lua')
-rw-r--r-- | lexlua/taskpaper.lua | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/lexlua/taskpaper.lua b/lexlua/taskpaper.lua new file mode 100644 index 000000000..060e1cbc3 --- /dev/null +++ b/lexlua/taskpaper.lua @@ -0,0 +1,60 @@ +-- Copyright (c) 2016-2018 Larry Hynes. See License.txt. +-- Taskpaper LPeg lexer + +local lexer = require('lexer') +local token = lexer.token +local P, R, S = lpeg.P, lpeg.R, lpeg.S + +local M = {_NAME = 'taskpaper'} + +local delimiter = P(' ') + P('\t') + +-- Whitespace +local ws = token(lexer.WHITESPACE, lexer.space^1) + +-- Tags +local day_tag = token('day_tag', (P('@today') + P('@tomorrow'))) + +local overdue_tag = token('overdue_tag', P('@overdue')) + +local plain_tag = token('plain_tag', P('@') * lexer.word) + +local extended_tag = token('extended_tag', + P('@') * lexer.word * P('(') * + (lexer.word + R('09') + P('-'))^1 * P(')')) + +-- Projects +local project = token('project', + lexer.nested_pair(lexer.starts_line(lexer.alnum), ':') * + lexer.newline) + +-- Notes +local note = token('note', delimiter^1 * lexer.alnum * lexer.nonnewline^0) + +-- Tasks +local task = token('task', delimiter^1 * P('-') + lexer.newline) + +M._rules = { + {'note', note}, + {'task', task}, + {'project', project}, + {'extended_tag', extended_tag}, + {'day_tag', day_tag}, + {'overdue_tag', overdue_tag}, + {'plain_tag', plain_tag}, + {'whitespace', ws}, +} + +M._tokenstyles = { + note = lexer.STYLE_CONSTANT, + task = lexer.STYLE_FUNCTION, + project = lexer.STYLE_TAG, + extended_tag = lexer.STYLE_COMMENT, + day_tag = lexer.STYLE_CLASS, + overdue_tag = lexer.STYLE_PREPROCESSOR, + plain_tag = lexer.STYLE_COMMENT, +} + +M._LEXBYLINE = true + +return M |