How to convert Markdown into Org-Mode
Published
* 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
sedwas so hard with multiline. - I initially try to find a package that is
cli-ready, I ended withyaml-front-matterwhich 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 thatfrontmatterdoes 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:
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;