aboutsummaryrefslogtreecommitdiffhomepage
path: root/lexlua/taskpaper.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lexlua/taskpaper.lua')
-rw-r--r--lexlua/taskpaper.lua60
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