generated from makary/foam-template
140 lines
4.8 KiB
Markdown
140 lines
4.8 KiB
Markdown
# Capture Notes With Drafts Pro
|
|
|
|
With this #recipe you can create notes on your iOS device, which will automatically be imported into Foam.
|
|
|
|
## Context
|
|
|
|
* You use [Foam for VSCode](https://marketplace.visualstudio.com/items?itemName=foam.foam-vscode) to manage your notes
|
|
* You wish to adopt a practice such as [A writing inbox for transient and incomplete notes](https://notes.andymatuschak.org/A%20writing%20inbox%20for%20transient%20and%20incomplete%20notes)
|
|
* You wish to use [Drafts Pro](https://docs.getdrafts.com/) to capture quick notes into your Foam notes from your iOS device
|
|
|
|
## Other tools
|
|
|
|
* We assume you are familiar with how to use GitHub (if you are using Foam this is implicit)
|
|
* You have an iOS device with [Drafts](https://getdrafts.com/)
|
|
* You have upgraded to [Drafts Pro](https://docs.getdrafts.com/draftspro) (needed to edit actions).
|
|
|
|
## Instructions
|
|
|
|
1. [Create a new action in Drafts](https://docs.getdrafts.com/docs/actions/editing-actions)
|
|
2. Add a single [step](https://docs.getdrafts.com/actions/steps/) of type Script
|
|
3. Edit the script adding the code from the block below
|
|
4. Edit settings at the top of the script to suit your preferences
|
|
5. Set other Action options in Drafts as you wish
|
|
6. Save the Action
|
|
7. In GitHub [create a Personal Access Token](https://github.com/settings/tokens) and give it `repo` scope - make a note of the token
|
|
8. In Drafts create a note
|
|
9. Select the action you created in steps 1-6
|
|
10. On the first run you will need to add the following information:
|
|
1. your GitHub username
|
|
2. the repository name of your Foam repo
|
|
3. the GitHub access token from step 7
|
|
4. An author name
|
|
11. Check your GitHub repo for a commit
|
|
12. If you are publishing your Foam to the web you may want to edit your publishing configuration to exclude inbox files - as publishing (and method) is a user choice that is beyond the scope of this recipe
|
|
|
|
## Code for Drafts Action
|
|
|
|
```javascript
|
|
// adapted from https://forums.getdrafts.com/t/script-step-post-to-github-without-working-copy/3594
|
|
// post to writing inbox in Foam digital garden
|
|
|
|
/*
|
|
* edit these lines to suit your preferences
|
|
*/
|
|
const inboxFolder = "inbox/"; // the folder in your Foam repo where notes are saved. MUST have trailing slash, except for root of repo use ''
|
|
const requiredTags = ['inbox']; // all documents will have these added in addition to tags from the Drafts app
|
|
const addLinkToInbox = true; // true = created note will have link to [[index]], false = no link
|
|
const addTimeStamp = true; // true = add a note of capture date/time at foot of note
|
|
|
|
/*
|
|
* stop editing
|
|
*/
|
|
|
|
const credential = Credential.create("GitHub garden repo", "The repo name, and its credentials, hosting your Foam notes");
|
|
credential.addTextField("username", "GitHub Username");
|
|
credential.addTextField('repo', 'Repo name');
|
|
credential.addPasswordField("key", "GitHub personal access token");
|
|
credential.addTextField('author', 'Author');
|
|
credential.authorize();
|
|
|
|
const githubKey = credential.getValue('key');
|
|
const githubUser = credential.getValue('username');
|
|
const repo = credential.getValue('repo');
|
|
const author = credential.getValue('author');
|
|
|
|
const http = HTTP.create(); // create HTTP object
|
|
const base = 'https://api.github.com';
|
|
|
|
|
|
const posttime = new Date();
|
|
const title = draft.title;
|
|
const txt = draft.processTemplate("[[line|3..]]");
|
|
const mergedTags = [...draft.tags, ...requiredTags];
|
|
const slugbase = title.toLowerCase().replace(/\s/g, "-");
|
|
|
|
const datestr = `${posttime.getFullYear()}-${pad(posttime.getMonth() + 1)}-${pad(posttime.getDate())}`;
|
|
const timestr = `${pad(posttime.getHours())}:${pad(posttime.getMinutes())}:00`;
|
|
const yr = `${posttime.getFullYear()}`;
|
|
const pdOffset = posttime.getTimezoneOffset();
|
|
const offsetChar = pdOffset >= 0 ? '-' : '+';
|
|
var pdHours = Math.floor(pdOffset/60);
|
|
console.log(pdHours);
|
|
pdHours = pdHours >= 0 ? pdHours : pdHours * -1;
|
|
console.log(pdHours);
|
|
const tzString = `${offsetChar}${pad(pdHours)}:00`;
|
|
const postdate = `${datestr}T${timestr}${tzString}`;
|
|
|
|
|
|
const slug = `${slugbase}`
|
|
const fn = `${slug}.md`;
|
|
let preamble = `# ${title} \n\n`;
|
|
|
|
mergedTags.forEach(function(item,index){
|
|
preamble += `#${item} `;
|
|
}
|
|
);
|
|
|
|
if (addLinkToInbox) {
|
|
preamble += "\n\n[[inbox]]\n";
|
|
}
|
|
|
|
preamble += "\n\n";
|
|
|
|
var doc = `${preamble}${txt}`;
|
|
|
|
if (addTimeStamp){
|
|
|
|
doc += `\n\nCaptured: ${postdate}\n`
|
|
}
|
|
|
|
const options = {
|
|
url: `https://api.github.com/repos/${githubUser}/${repo}/contents/${inboxFolder}${fn}`,
|
|
method: 'PUT',
|
|
data: {
|
|
message: `Inbox from Drafts ${datestr}`,
|
|
content: Base64.encode(doc)
|
|
},
|
|
headers: {
|
|
'Authorization': `token ${githubKey}`
|
|
}
|
|
};
|
|
|
|
var response = http.request(options);
|
|
|
|
if (response.success) {
|
|
// yay
|
|
} else {
|
|
console.log(response.statusCode);
|
|
console.log(response.error);
|
|
}
|
|
|
|
function pad(n) {
|
|
let str = String(n);
|
|
while (str.length < 2) {
|
|
str = `0${str}`;
|
|
}
|
|
return str;
|
|
}
|
|
|
|
```
|