Created m2h

TLDR

I created a simple markdown to html parser called m2h. I wanted to implement the basic markdown syntax, I found one from this cheat-sheet. And implemented it over a weekend.

It is a cli tool and can be found in codeberg.

It is used as follows:

      m2h name_of_file.md 
      

It prints to stdout, so I tend to do this.

      m2h name_of_file.md > name_of_file.html
      

Coding

Some interesting things about the code are that it is only a big for loop with a switch statement inside.

      for (size_t i = 0; i < lines.size(); i++) {
	      size_t size_of_line = line.size() - 1;
	      line = lines[i];

	      switch (line[0]) {
		      case '#': {
					// titles
					...
				}
		      case '>': {
					// quotes
					...
				}
		      case '-': {
					// horizontal rule or list        
					...
				}
		      case '`': {
					// codeblocks
					...
				}
		      default: {
				       // numbered list
				       // process default text
				       ...
			       }
	      }
      }

A pattern that came up multiple times was the following:

std::cout << "<blockquote>";
while (line[0] == '>') {
	std::cout << line.substr(2, size_of_line) << " ";
	i++;
	line = lines[i];
}
std::cout << "</blockquote>" << std::endl;

Print the beginning block first, then go ahead multiple lines and finish the block.

And to beautify the text, it is the same idea of going through a line and checking each character in a big switch statement.

for (size_t i = 0; i < line.size(); i++) {
	switch (line[i]) {
		case '*': {
				  ...
			  }
		case '`': {
				  ...
			  }
		case '[': {
				  ...
			  }
		case '!': {
				  ...
			  }
		default: {
				 std::cout << line[i];
			 }
	}
}

All of the code fits in 230 lines. I think it could be even more compact, but for now, it works as I want to.

Conclusion

I really liked programming this project. I am going to use it a lot for my website and I feel like I build something in a weekend. It was a fun experiment to get back into coding personal projects.

Maybe I will use this as a building block for SSG. Creating tools is fun. It can get really out of scope, so that is why I am just sticking with what I actually need.

For now, just a markdown to html translator is fine.

Back to articles