Markdown to Aegea converter.
This commit is contained in:
		
							
								
								
									
										72
									
								
								bin/mdtoaegea
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										72
									
								
								bin/mdtoaegea
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,72 @@ | ||||
| #!/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() | ||||
		Reference in New Issue
	
	Block a user
	 Artem Sapegin
					Artem Sapegin