How to convert Markdown into Org-Mode
I have migrated this blog multiple times and is hard to describe how many problems I solve hover and hover.
Just to give you some background of these migrations I started from a WordPress that I run in a simple DigitalOcean Droplet. It became too sluggish and somehow didn't feel to leave my editor for writing an Article. So I move everything to files, because in the end who need a database just for few articles.
But here I am with a bunch of Markdown and an Emacs, which I play setup with Nuxt.
But wait for a second, Emacs as Org-mode which already use for a bunch of stuff, and yes why not just move the entire website and note-taking into Org-mode? I could build live demos, components, research papers all from one side and don't leave my editor.
But enough background, let's move into the meet greedy stuff, I'm here with a bunch of markdowns; but I want them to be org-mode now.
So first of all I create use pandoc
to do the conversion for me
pandoc -i ${file_from} -f markdown -t org -o ${file_to}
That would allow us to convert the file from markdown
to org-mode
, but since I've been doing a bit of magic with the help of frontmatter
(eg: render my cv)
I need to have a way that allows bringing that information back to the org-mode file.
For that purpose, I would just use the frontmatter
package in npm
.
In the beginning, I try to use the only cli but I stumble in a couple of issues
- I couldn't imagine that
sed
was so hard with multiline. - I initially try to find a package that is
cli-ready
, I ended withyaml-front-matter
which look ideal to run withnpx
. I finally realize that they provide the content on the root level, with the option to change it I soon realize that this was not suitable for me, I prefer the way thatfrontmatter
does so{ data: TheYaml, content: "The Markdown" }
So I will just continue with frontmatteer
.
npm install -S frontmatter
To give you an idea of the data structure that I want to use the bellow is an example:
{ title: 'Artista e designer', link: 'http://blog.ideabile.com/2012/04/artista-e-designer/', author: 'Ideabile', description: null, post_id: 5, created: '2012/04/15 17:32:41', created_gmt: '2012/04/15 17:32:41', comment_status: 'open', post_name: 'artista-e-designer', status: 'publish', post_type: 'post' }
What I want to do is a script that grabs the stdin
of a markdown
and returns an org
file.
During my migration, I only care about a couple of fields, more specifically the create
, title
. With those fields, I want to add them in my org-mode
file so that I can query my content.
#!/usr/bin/env node const frontmatter = require('frontmatter'); const fs = require('fs'); const { execSync } = require('child_process'); const stdin = fs.readFileSync(0).toString(); const { data } = frontmatter(stdin); if (stdin && data) { org = execSync(`pandoc -f markdown -t org <<< "${stdin.replace(/\x22/g, '\\\x22')}"`).toString(); const day = new Date(data.created); const _date = [ day.getFullYear(), day.getMonth() < 10 ? `0${day.getMonth()}` : day.getMonth(), day.getDate() < 10 ? `0${day.getDate()}` : day.getDate(), ].join('-'); console.log(`#+TITLE: ${data.title} #+DATE: <${_date}> ${org} `); }
Then we need to make the file executable
chmod +x ../../tangled/convert-md-to-org.js
Then we can call it like this
cat ${file_from} | ../../tangled/convert-md-to-org.js
But let's assume we want to convert a full directory.
shopt -s nullglob; cd content/articles; for f in *.md; do cat f | ../../tangled/convert-md-to-org.js > ../articles-org/"${f%.md}.org"; done shopt -u nullglob;