justyns
February 29, 2024, 11:54pm
1
Here’s a space script using the awesome new attributeExtractor function.
It is based on the example in Space Script :
Convert emojis like 📅 2024-01-01
into attributes like [deadline: 2024-01-01]
Convert different emojis into specific priority attributes like to priority: critical
Adds a default priority of medium to all tasks that don’t have an emoji
Feel free to change it as needed
function processEmojiAttributes(text, attributes) {
// These can be customized if needed
const taskEmojis = {
"➕": "created",
"📅": "deadline",
"✅": "completed",
"⌛": "scheduled"
};
// Strip the checkbox
let taskName = text.replace(/\[[^\]]+\]\s*/, "").trim();
// Loop through the symbols to extract their corresponding dates
Object.entries(taskEmojis).forEach(([symbol, meaning]) => {
const regex = new RegExp(`\\${symbol}\\s*(\\d{4}-\\d{2}-\\d{2})`);
const match = regex.exec(text);
if (match) {
attributes[meaning] = match[1];
taskName = taskName.replace(new RegExp(`\\${symbol}\\s*\\d{4}-\\d{2}-\\d{2}`), "").trim();
}
});
attributes['name'] = taskName;
return attributes;
}
function processEmojiPriorities(text, attributes) {
// These can be changed as needed
const priorityEmojis = {
"❗": "critical",
"🔥": "critical",
"🔼": "high",
"➖": "medium",
"🔽": "low",
};
for (const [emoji, priority] of Object.entries(priorityEmojis)) {
if (text.includes(emoji)) {
attributes['priority'] = priority;
break;
}
}
// Default to medium if there's no match
if (!attributes['priority']) {
attributes['priority'] = "medium";
}
// Update name to remove these emojis too
attributes['name'] = attributes['name'].replace(/(🔥|❗|🔼|➖|🔽)/g, "").trim();
return attributes;
}
silverbullet.registerAttributeExtractor({tags: ["task"]}, (text) => {
let attributes = {}
// Convert task emojis to attributes
attributes = processEmojiAttributes(text, attributes);
// Convert emojis to priority values
attributes = processEmojiPriorities(text, attributes);
return attributes;
});
6 Likes
justyns:
justyns:
Here’s a space script using the awesome new attributeExtractor function.
It is based on the example in Space Script :
Convert emojis like 📅 2024-01-01
into attributes like [deadline: 2024-01-01]
Convert different emojis into specific priority attributes like to priority: critical
Adds a default priority of medium to all tasks that don’t have an emoji
Feel free to change it as needed
Thanks for this script, looks really nice.
I guess I will try to implement it in my workflow, seems super useful.
I need though to work now on the side effects, which is what all these emojis is doing to other templates when filtering/processing the task name.
Below you can see how the tasks are treated in the queries, some emojis and dates disappear, others not.
```query
task where page = @page.name render [[Library/Personal/Query/Task]]
```
Where Library/Personal/Query/Task
* [{{#if done}}x{{else}} {{/if}}] [[{{page}}@{{pos}}]] {{replace(name, /#[^#\d\s\[\]]+\w+/, "")}} {{#if completed}}{{replace(completed, /(.+)/, "✅$1")}}{{/if}} {{#if deadline}}📅 {{deadline}}{{/if}}
As you can see, I am replacing Completed and Deadline. Either i need to do the same for each emoji, or find a generic regex query.
Or maybe not, need to think which dates are useful to show in the task or not
The last table is a template
```template
{{{task where page = @page.name select name, priority, created, scheduled, deadline, completed}}}
```
You can see that i don’t use any template or anything special but certain emojis and dates don’t appear. For example the priority emojis and .
This is an interesting case because I don’t know what could be interfering here.
Will need to debug a bit more
Playing a bit with the new fields
Testing the following:
Add an emoji denoting:
: Task done
: Task not done with a due date further than 10 days from today
: Task not done with a due date in less than 4 days
: Task not done with a past due date
Adding an emoji denoting the priority
Adding dates back (still need to think how i want to represent this, or which dates)
Super “hacky” the template :
* [{{#if done}}x{{else}} {{/if}}] [[{{page}}@{{pos}}]]{{#if completed}} ✔️{{else}}{{#if deadline}}{{#if dateDiff(today(),deadline) < 0}} 🔴{{else}}{{#if dateDiff(today(),deadline) < 4}} 🟡{{else}} 🟢{{/if}}{{/if}}{{else}} {{/if}}{{/if}}{{#if priority = "critical"}} ❗{{/if}}{{#if priority = "high"}} 🔼{{/if}}{{#if priority = "medium"}} {{/if}}{{#if priority = "low"}} 🔽{{/if}} {{replace(name, /#[^#\d\s\[\]]+\w+/, "")}}{{#if created}}➕ {{created}}{{/if}} {{#if scheduled}}⌛ {{scheduled}}{{/if}} {{#if deadline}}📅 {{deadline}}{{/if}} {{#if completed}}{{replace(completed, /(.+)/, "✅$1")}}{{/if}}
5 Likes
Very cool, thanks! Looking forward to seeing what other changes you come up with. I really like the indicators for overdue/almost due.
Did you figure out the task name issue? I tried testing a few of the examples in your screenshot and they seem to work for me
I am trying to build a useful/productive TODO page for my work instance, but it is still Work in Progress:
I am still trying to come up with ways where i can see priorities like this, but also deadlines/due dates easily, without cluttering much the page with multiple tables
Not yet, I realized that:
A task with priority critical (so with in their task name) which is undone appears without the emoji in the name
Once that task is marked as done, the emoji appears back in the name.
So maybe your script is only addressing not-done tasks… or maybe something else in my instance… I haven’t have time to dig into the details so far (busy week with kids).
I did some cleaning with my scripts and some more cache flushing and playing a bit with online/sync mode and now it seems that emojis are not back in the same after completing the tasks
[UPDATE} No, they still seem to appear after marking them done. Needs more debugging
zef
(Zef Hemel)
March 5, 2024, 7:42pm
7
I will also point to this:
I’d been using Obsidian for almost a year and I thought it was great but it has its issues, particularly with portions of it not being open source. I was excited to learn about SilverBullet. What Zef has done largely on his own is incredible, so huge thanks for his amazing work are in order.
For me though there’s still some missing features, particularly around task management. I intend to try to fix that with the following Space Script:
const rrule = import("https://esm.sh/[email protected] ")
cons…
2 Likes