Last active
November 28, 2021 03:25
-
-
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)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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