73 lines
1.5 KiB
Plaintext
73 lines
1.5 KiB
Plaintext
|
#!/usr/bin/env python
|
||
|
# -*- coding: utf-8 -*-
|
||
|
|
||
|
#
|
||
|
# Markdown to Aegea blog engine converter
|
||
|
# Author: Artem Sapegin (sapegin.me)
|
||
|
#
|
||
|
|
||
|
import sys
|
||
|
import os
|
||
|
import re
|
||
|
import cgi
|
||
|
|
||
|
|
||
|
def main():
|
||
|
filename = sys.argv[1]
|
||
|
if not filename:
|
||
|
sys.exit('Usage: %s <filename>' % os.path.basename(__file__))
|
||
|
|
||
|
try:
|
||
|
file = open(filename, 'r')
|
||
|
except IOError:
|
||
|
return []
|
||
|
|
||
|
print(process(file.read()))
|
||
|
|
||
|
|
||
|
def process(text):
|
||
|
# Preserve code blocks
|
||
|
blocks = {}
|
||
|
|
||
|
def store_code_blocks(m):
|
||
|
key = r'<%s>' % (len(blocks))
|
||
|
value = [m.group(1), m.group(2)]
|
||
|
blocks[key] = value
|
||
|
return key
|
||
|
|
||
|
text = re.sub(r'```(\w+)\n([\w\W]+?)\n```', store_code_blocks, text)
|
||
|
|
||
|
# Process lines
|
||
|
lines = text.split('\n')
|
||
|
new_lines = []
|
||
|
for line in lines:
|
||
|
new_lines.append(process_line(line))
|
||
|
text = '\n'.join(new_lines)
|
||
|
|
||
|
# Restore and convert code blocks
|
||
|
for key, value in blocks.items():
|
||
|
code = value[1]
|
||
|
code = cgi.escape(code)
|
||
|
value = r'<pre><code class="language-%s">%s</code></pre>' % (value[0], code)
|
||
|
text = text.replace(key, value)
|
||
|
|
||
|
return text
|
||
|
|
||
|
|
||
|
def process_line(line):
|
||
|
line = re.sub(r'#(#+) ', r'\1 ', line) # Increase headings level
|
||
|
|
||
|
line = re.sub(r'\*\*([^*]+)\*\*', r'__\1__', line) # Escape bold
|
||
|
line = re.sub(r'\*([^*]+)\*', r'//\1//', line) # Italic
|
||
|
line = re.sub(r'__[^_]__', r'**\1**', line) # Restore bold
|
||
|
|
||
|
line = re.sub(r'\[([^\]]+)\]\(([^\)]+)\)', r'[[\2 \1]]', line) # Link
|
||
|
|
||
|
line = re.sub(r'`([^`]+)`', r'\1', line) # Remove inline code blocks
|
||
|
|
||
|
return line
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main()
|