forked from revolunet/sublimetext-markdown-preview
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMarkdownPreview.py
98 lines (83 loc) · 3.86 KB
/
MarkdownPreview.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import sublime, sublime_plugin
import desktop
import tempfile
import markdown
import os
import re
def getTempMarkdownPreviewPath(view):
" return a permanent full path of the temp markdown preview file "
tmp_filename = '%s.html' % view.id()
tmp_fullpath = os.path.join(tempfile.gettempdir(), tmp_filename)
return tmp_fullpath
class MarkdownPreviewListener(sublime_plugin.EventListener):
""" update the output html when markdown file has already been converted once """
def on_post_save(self, view):
if view.file_name().endswith(('.md', '.markdown', '.mdown')):
temp_file = getTempMarkdownPreviewPath(view)
if os.path.isfile(temp_file):
# reexec markdown conversion
view.run_command('markdown_preview', {'target': 'disk'})
class MarkdownPreviewCommand(sublime_plugin.TextCommand):
""" preview file contents with python-markdown and your web browser"""
def getCSS(self):
css_filename = 'markdown.css'
# path via package manager
css_path = os.path.join(sublime.packages_path(), 'Markdown Preview', css_filename)
if not os.path.isfile(css_path):
# path via git repo
css_path = os.path.join(sublime.packages_path(), 'sublimetext-markdown-preview', css_filename)
if not os.path.isfile(css_path):
raise Exception("markdown.css file not found!")
return open(css_path, 'r').read().decode('utf-8')
def postprocessor(self, html):
# fix relative images paths
def img_fix(match):
img, src = match.groups()
filename = self.view.file_name()
if filename:
if not src.startswith(('file://', 'https://', 'http://', '/')):
abs_path = u'file://%s/%s' % (os.path.dirname(filename), src)
img = img.replace(src, abs_path)
return img
RE_IMGS = re.compile("""(?P<img><img[^>]+src=["'](?P<src>[^"']+)[^>]*>)""")
html = RE_IMGS.sub(img_fix, html)
return html
def run(self, edit, target='browser'):
region = sublime.Region(0, self.view.size())
encoding = self.view.encoding()
if encoding == 'Undefined':
encoding = 'utf-8'
elif encoding == 'Western (Windows 1252)':
encoding = 'windows-1252'
contents = self.view.substr(region)
# convert the markdown
markdown_html = markdown.markdown(contents)
# postprocess the html
markdown_html = self.postprocessor(markdown_html)
# check if LiveReload ST2 extension installed
livereload_installed = ('LiveReload' in os.listdir(sublime.packages_path()))
# build the html
html_contents = u'<!DOCTYPE html>'
html_contents += '<html><head><meta charset="%s">' % encoding
styles = self.getCSS()
html_contents += '<style>%s</style>' % styles
if livereload_installed:
html_contents += '<script>document.write(\'<script src="http://\' + (location.host || \'localhost\').split(\':\')[0] + \':35729/livereload.js?snipver=1"></\' + \'script>\')</script>'
html_contents += '</head><body>'
html_contents += markdown_html
html_contents += '</body>'
if target in ['disk', 'browser']:
# update output html file
tmp_fullpath = getTempMarkdownPreviewPath(self.view)
tmp_html = open(tmp_fullpath, 'w')
tmp_html.write(html_contents.encode(encoding))
tmp_html.close()
# todo : livereload ?
if target == 'browser':
desktop.open(tmp_fullpath)
elif target == 'sublime':
new_view = self.view.window().new_file()
new_edit = new_view.begin_edit()
new_view.insert(new_edit, 0, html_contents)
new_view.end_edit(new_edit)
print 'markdown converted'