"""This file is initially forked from [SublimePandoc](https://github.com/jclement/SublimePandoc) by [DanielMe](https://github.com/DanielMe/) @todo naming convention should be foo_bar rather than fooBar. @bug PDF export doesn't work in my Mac, gonna check it later. 2012-07-02: Muchenxuan Tong changed some stylical errors (with SublimeLinter) """ import sublime import sublime_plugin import webbrowser import tempfile import os import os.path import sys import subprocess from subprocess import PIPE class PandocRenderCommand(sublime_plugin.TextCommand): def is_enabled(self): return self.view.score_selector(0, "text.html.markdown") > 0 def is_visible(self): return True def run(self, edit, target="pdf", open_after=True, save_result=False): if target not in ["html", "docx", "pdf"]: raise Exception("Format %s currently unsopported" % target) self.setting = sublime.load_settings("SmartMarkdown.sublime-settings") encoding = self.view.encoding() if encoding == 'Undefined': encoding = 'UTF-8' elif encoding == 'Western (Windows 1252)': encoding = 'windows-1252' contents = self.view.substr(sublime.Region(0, self.view.size())) contents = contents.encode(encoding) file_name = self.view.file_name() if file_name: os.chdir(os.path.dirname(file_name)) # write buffer to temporary file # This is useful because it means we don't need to save the buffer tmp_md = tempfile.NamedTemporaryFile(delete=False, suffix=".md") tmp_md.write(contents) tmp_md.close() # output file... suffix = "." + target if save_result: output_name = os.path.splitext(self.view.file_name())[0] + suffix if not self.view.file_name(): raise Exception("Please safe the buffer before trying to export with pandoc.") else: output = tempfile.NamedTemporaryFile(delete=False, suffix=suffix) output.close() output_name = output.name args = self.pandoc_args(target) self.run_pandoc(tmp_md.name, output_name, args) if open_after: self.open_result(output_name, target) #os.unlink(tmp_md.name) def run_pandoc(self, infile, outfile, args): cmd = ['pandoc'] + args cmd += [infile, "-o", outfile] # Merge the path in settings setting_path = self.setting.get("tex_path", []) for p in setting_path: if p not in os.environ["PATH"]: os.environ["PATH"] += ":" + p try: # Use the current directory as working dir whenever possible file_name = self.view.file_name() if file_name: working_dir = os.path.dirname(file_name) p = subprocess.Popen(cmd, stdout=PIPE, stderr=PIPE, cwd=working_dir) else: p = subprocess.Popen(cmd, stdout=PIPE, stderr=PIPE) p.wait() out, err = p.communicate() if err: raise Exception("Command: %s\n" % " ".join(cmd) + "\nErrors: " + err) except Exception as e: sublime.error_message("Fail to generate output.\n{0}".format(e)) def pandoc_args(self, target): """ Create a list of arguments for the pandoc command depending on the target. TODO: Actually do something sensible here """ # Merge the args in settings args = self.setting.get("pandoc_args", []) if target == "pdf": args += self.setting.get("pandoc_args_pdf", []) if target == "html": args += self.setting.get("pandoc_args_html", []) + ['-t', 'html5'] if target == "docx": args += self.setting.get("pandoc_args_docx", []) + ['-t', 'docx'] return args def open_result(self, outfile, target): if target == "html": webbrowser.open_new_tab(outfile) elif sys.platform == "win32": os.startfile(outfile) elif "mac" in sys.platform or "darwin" in sys.platform: os.system("open %s" % outfile) print(outfile) elif "posix" in sys.platform or "linux" in sys.platform: os.system("xdg-open %s" % outfile)