Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Rainymood/74154640d48e4e8be92824e58af217bc to your computer and use it in GitHub Desktop.
Save Rainymood/74154640d48e4e8be92824e58af217bc to your computer and use it in GitHub Desktop.
Python script to rename your Roam daily notes to match Noteplan Calendar format.
'''
This is a script that tries to convert Roam Daily Notes to Noteplan Calendar
Notes. All it does is find files in the current directory that have a name
matching the Roam Daily Notes format (e.g. "August 8th, 2020.md"), rename them
to the Noteplan Calendar Notes format (YYYYMMDD, e.g. "20200808.md") and move
them into a subfolder of the current directory: 'renamed_daily_notes'.
I recommend you read this blog post before going any further:
https://axle.design/why-and-how-to-use-obsidian-and-noteplan-together.
It's not specifically about moving from Roam to Noteplan, but it provides a bunch
of helpful info about how Noteplan works with md files and how Noteplan's sync
and stuff works. Definitely read it!
NOTES:
- PLEASE PLEASE MAKE A BACKUP OF YOUR NOTEPLAN NOTES BEFORE YOU DO ANYTHING ELSE.
- THIS IS A FREE AMATEUR-MADE SCRIPT, PLEASE MAKE SURE YOU KNOW WHAT YOU'RE DOING BEFORE
RUNNING IT. I OFFER NO GUARANTEES AABOUT ITS SAFETY OR RELIABILITY WHATSOEVER.
## Steps to use:
1. Download a Markdown export of your Roam database.
a. In Roam, click the three dots on the top right
b. Click "Export All", and a little popup will appear.
c. Choose "Export Format" -> "Markdown", and click "Export All"
2. Unzip the folder. (It will download as a zip file; unzip it.)
3. Copy this script into the unzipped folder.
4. Open your Terminal and navigate to that unzipped Roam export folder. You
will probably do this by typing "cd Downloads/[roam folder name]", but it
depends on your computer.
5. Run the script! Just type: "python ./roam_to_noteplan.py", hit Enter, and
follow the prompts.
6. Now your Noteplan Calendar Notes are in a sub-directory titled
"renamed_daily_notes."
7. Delete the script file, you're all done!
## Importing files into Noteplan:
NOTE:
- IF YOU ARE STARTING FULLY FROM SCRATCH WITH NOTEPLAN, you can just copy the
contents of renamed_daily_notes into your Noteplan/Calendar folder,
and replace any files currently there. Then you can copy the rest of your Roam
export into the Noteplan/Notes folder.
- If you already have some Noteplan Calendar Notes, YOU HAVE TO BE CAREFUL!
You don't want to overwrite your Noteplan stuff with your Roam stuff.
You'll have to manually reconcile things.
With that out of the way, in order to import these into Noteplan, you'll want to check what
sync technique you use...
If you use Cloudkit, your Noteplan notes
will be in `~/Library/Containers/co.noteplan.NotePlan3/Data/Library/Application Support/co.noteplan.NotePlan3/`
and you'll want to copy your converted Calendar Notes into the "Calendar"
subfolder: `~/Library/Containers/co.noteplan.NotePlan3/Data/Library/Application Support/co.noteplan.NotePlan3/Calendar`)
If you use anything else, you should be able to go to Noteplan 3 > Preferences
> Sync > [Sync technique] > Advanced > [Open folder, or something like that].
When you find your Noteplan folder, you can just copy your converted daily
notes into the Calendar subfolder, and the rest of your notes into the Notes
subfolder.
To reiterate the warning above,
IF YOU WROTE IN BOTH ROAM AND NOTEPLAN ON A GIVEN DATE, YOU DONT WANT TO JUST
OVERWRITE YOUR NOTEPLAN FILE WITH YOUR EXPORTED ROAM FILE... THIS SCRIPT
WILL RENAME YOUR ROAM FILE TO MATCH THE NOTEPLAN FILE SO THEY WILL CONFLICT
WITH EACH OTHER... YOU HAVE TO MANUALLY COMBINE THE TWO FILES!
## More Reading
- As I mentioned above, check out this GREAT blog post about using [Obsidian](https://obsidian.md/)
and Noteplan together. https://axle.design/why-and-how-to-use-obsidian-and-noteplan-together
- Noteplan [has a subreddit](https://www.reddit.com/r/noteplanapp/)
- Roam Research [has a subreddit](https://www.reddit.com/r/RoamResearch/), too.
- Here's the [official Noteplan website](https://noteplan.co/).
- Here's the [official Roam Research website](roamresearch.com/).
Copyright Quinn Batten 2021.
'''
from datetime import datetime
import os
import re
import sys
def format_daily_notes_filename(file_name, verbose=False):
"""
Takes in filename, returns tuple of old (Roam Daily Notes) & new
(Noteplan Calendar Notes) filenames.
If filename is NOT a Roam Daily Note, returns None
If filename IS a Roam Daily Note, returns a tuple of the two values in
"Returns.""
Input
-----
fname : str, a filename to try and conver
verbose : bool, whether to announce un-moved files
Returns
-------
(file_name, add_md) : tuple of (original filename, new filename), for those
input notes that matched Roam Daily Notes filename format.
"""
remove_md = file_name.replace('.md', '')
remove_st_th = remove_md.replace('st,', ',')\
.replace('th,', ',')\
.replace('nd,', ',')\
.replace('rd,', ',')
pad_zero = re.sub(r' (\d), ', r' 0\1, ', remove_st_th)
try:
parse_date = datetime.strptime(pad_zero, '%B %d, %Y')
except ValueError:
if verbose:
print('failed to convert: ' + file_name + ' ... ' + remove_md +
' / ' + remove_st_th + ' / ' + pad_zero)
return
new_date_str = parse_date.strftime('%Y%m%d')
add_md = new_date_str + '.md'
return (file_name, add_md)
def move_daily_notes(roam_export_dir='.', output_dir='./renamed_daily_notes/'):
"""
Identifies Roam Daily Notes files baased on filename, moves them into new
directory and renames them to match Noteplan's Calendar Notes file name
format.
Input
-----
roam_export_dir : str, directory full of exported Roam md files
output_dir: str, directory you want the renamed date files to go into
Returns
-------
None
"""
if not os.path.exists(output_dir):
os.mkdir(output_dir)
files_to_move = [name_tuple for name_tuple in
(format_daily_notes_filename(file) for file in os.listdir())
if name_tuple is not None]
print('Moving ' + str(len(files_to_move)) + ' files into folder ' + os.path.realpath(output_dir))
[os.rename(original_file, output_dir + new_file)
for (original_file, new_file) in files_to_move]
if __name__ == "__main__":
# execute only if run as a script
first_warn = 'This script could cause data loss. It moves files around and renames them. It is offered as is, with no guarantees whatsoever. Do you accept full responsibility for understanding and auditing this script before running it?\nPlease answer Y/N: '
dir_check_prompt = 'You are currently in the following directory: "' + os.getcwd() + '". Is that your Roam Markdown export directory?\nAnswer Y/N: '
confirmation = input(first_warn)
if confirmation != 'Y':
print('Exiting due to user response')
sys.exit()
dir_check_response = input(dir_check_prompt)
if dir_check_response != 'Y':
print('Exiting... please move this file to your Roam export folder and run it there.')
sys.exit()
move_daily_notes()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment