Skip to content

Instantly share code, notes, and snippets.

@mint149
Last active November 28, 2021 03:25
Show Gist options
  • Save mint149/1bd9f4fc4305464aa986a67673a455c2 to your computer and use it in GitHub Desktop.
Save mint149/1bd9f4fc4305464aa986a67673a455c2 to your computer and use it in GitHub Desktop.
(Look at the two **TODO** before you use it.) A widget that displays todo from Obsidian's daily notes.(for Scriptable)
const todoText = "#### Todo";
const todoPrefix = "- [ ]";
const todoIcon = "◻";
const fontSize = 15
const iCloud = FileManager.iCloud();
// **TODO** Add the Vault folder to the File Bookmark in Scriptable settings.
const vaultPath = iCloud.bookmarkedPath('[YOUR_BOOKMARK_NAME]');
// **TODO** Edit the following variables before use.
const dailyNoteName = `${formatDate(new Date())}.md`;
const dailyNotePath = `${vaultPath}/[YOUR_DAILY_NOTES_DIRECTORY]${dailyNoteName}`;
const dailyNoteUrl = `obsidian://open?vault=[YOUR_VAULT_NAME]&file=[YOUR_ENCODED_DAIRY_NOTES_DIRECTORY]${dailyNoteName}`;
console.log(`Target:${dailyNoteName}`);
if (!iCloud.fileExists(dailyNotePath)) {
console.log('No daily note.');
const widget = new ListWidget();
widget.addText('No daily note.');
widget.addSpacer(10);
widget.addText('Tap to open Obsidian.');
widget.url = 'obsidian://';
Script.setWidget(widget);
Script.complete();
return;
}
console.log('Daily note exist.');
if (!iCloud.isFileDownloaded(dailyNotePath)) {
console.log('Downloading daily note...');
await iCloud.downloadFileFromiCloud(dailyNotePath)
console.log('Daily note has been downloaded.');
}
const todos = extractTodo(iCloud.readString(dailyNotePath));
Script.setWidget(createWidget(todos));
Script.complete();
function extractTodo(dailyNoteString) {
const dailyNoteArray = dailyNoteString.split('\n');
const todoIndex = dailyNoteArray.indexOf(todoText);
return dailyNoteArray.slice(todoIndex).filter(function (value) {
return value.startsWith(todoPrefix);
});
}
function createWidget(todoArray) {
const replacedTodoArray = todoArray.map(element => element.replace(todoPrefix, todoIcon));
let sliceSize = 0
switch (config.widgetFamily) {
case 'small':
sliceSize = 5;
break;
case 'medium':
sliceSize = 5;
break;
case 'large':
sliceSize = 14;
break;
case 'extraLarge':
sliceSize = 14;
break;
default:
sliceSize = 0;
}
const slicedTodoArray = replacedTodoArray.slice(0, sliceSize);
const widget = new ListWidget();
widget.url = dailyNoteUrl;
widget.spacing = 4;
const header = widget.addStack();
header.url = URLScheme.forRunningScript();
header.addText(todoText).font = Font.regularSystemFont(fontSize);
header.addSpacer();
let reloadIcon = header.addImage(SFSymbol.named("arrow.2.squarepath").image);
reloadIcon.imageSize = new Size(20, 20);
reloadIcon.tintColor = Color.blue();
slicedTodoArray.forEach(element => {
const todoLine = widget.addText(element);
todoLine.font = Font.regularSystemFont(fontSize);
});
return widget;
}
// Quote:https://qiita.com/toshimin/items/5f13c3b4c28825219231
function formatDate(dt) {
var y = dt.getFullYear();
var m = ('00' + (dt.getMonth() + 1)).slice(-2);
var d = ('00' + dt.getDate()).slice(-2);
return (y + '-' + m + '-' + d);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment