Files
obsidian-tasks-reminder/grammar/task.pegjs

147 lines
3.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
start = _ @(task / line) _
/**************************************************************************************************************************************/
line = data:.* {
return {
type: "line",
data: data.join("")
}
}
/**************************************************************************************************************************************/
task = "-" _ "[" status:. "]" _ label:label meta:meta* {
return {
type: "task",
data: {
status,
label,
meta
}
};
}
/**************************************************************************************************************************************/
label = spans:(tag / labelWord / labelWhitespace)* {
return spans;
}
labelWord = word:[^ \t\r🔽🔼🔺🛫📅🔁🏁🆔]+ {
return {
span: "word",
value: word.join("")
}
}
labelWhitespace = whitespace:[ \t\r]+ {
return {
span: "whitespace",
value: whitespace.join("")
}
}
tag = "#" tag:[a-zA-Z0-9-/]+ {
return {
span: "tag",
value: tag.join("")
}
}
/**************************************************************************************************************************************/
meta = _ @(date / recurrence / delete / priority / dependency / reminder) _
/**************************************************************************************************************************************/
priority = priority:priorityIcon {
return {
feature: "priority",
priority
}
}
/**************************************************************************************************************************************/
delete = type:deleteIcon _ action:[a-zA-Z]+ {
return {
feature: "delete",
action: action.join("").trim()
}
}
/**************************************************************************************************************************************/
reminder = reminderIcon _ time:(defaultTime / longTime / shortTime)|..,(_ "," _)| {
return {
feature: "reminder",
time
}
}
defaultTime = "_"
longTime = hour:[0-9]|1..2| ":" minute:[0-9]|1..2| {
return `${hour.join("").padStart(2, '0')}:${minute.join("").padStart(2, '0')}`;
}
shortTime = hour:[0-9]|1..2| {
return `${hour.join("").padStart(2, '0')}:00`;
}
/**************************************************************************************************************************************/
recurrence = type:recurrenceIcon _ rec:[a-zA-Z0-9 ]+ {
return {
feature: "recurrence",
rule: rec.join("").trim()
}
}
/**************************************************************************************************************************************/
date = type:dateIcon _ date:dateLiteral {
return {
feature: "date",
type,
date
};
}
dateLiteral = year:([0-9]|4|) "-" month:([0-9]|1..2|) "-" day:([0-9]|1..2|) {
return `${year.join("")}-${month.join("").padStart(2, '0')}-${day.join("").padStart(2, '0')}`;
}
/**************************************************************************************************************************************/
dependency = type:dependencyIcon _ deps:([a-zA-Z0-9-]+)|..,(_ "," _)| {
return {
feature: "dependency",
type,
deps: deps.map(x => x.join(""))
}
}
/**************************************************************************************************************************************/
allIcons = dependencyIcon / recurrenceIcon / deleteIcon / reminderIcon / dateIcon / priority
dependencyIcon = "🆔" / "⛔"
recurrenceIcon = "🔁"
deleteIcon = "🏁"
reminderIcon = "⏰"
dateIcon = ""
/"⏳"
/"🛫"
/"📅"
/"✅"
/"❌"
priorityIcon = "⏬"
/"🔽"
/"🔼"
/"⏫"
/"🔺"
_ "whitespace"
= [ \t\r]*