61 lines
1.5 KiB
Lua
Executable File
61 lines
1.5 KiB
Lua
Executable File
-- Copyright (c) 2016-2019 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
|