#!/usr/bin/env python # --!-- coding: utf8 --!-- import os import shutil import subprocess from PyQt5.QtCore import Qt from PyQt5.QtWidgets import qApp, QMessageBox from PyQt5.QtGui import QCursor from manuskript.converters import abstractConverter from manuskript.functions import mainWindow import logging LOGGER = logging.getLogger(__name__) class pandocConverter(abstractConverter): name = "pandoc" cmd = "pandoc" @classmethod def isValid(self): if self.path() != None: return 2 elif self.customPath() and os.path.exists(self.customPath): return 1 else: return 0 @classmethod def customPath(self): settings = QSettings() return settings.value("Exporters/{}_customPath".format(self.name), "") @classmethod def path(self): return shutil.which(self.cmd) @classmethod def convert(self, src, _from="markdown", to="html", args=None, outputfile=None): if not self.isValid: LOGGER.error("pandocConverter is called but not valid.") return "" cmd = [self.runCmd()] cmd += ["--from={}".format(_from)] cmd += ["--to={}".format(to)] if args: cmd += args if outputfile: cmd.append("--output={}".format(outputfile)) qApp.setOverrideCursor(QCursor(Qt.WaitCursor)) p = subprocess.Popen( cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) if not type(src) == bytes: src = src.encode("utf-8") # assumes utf-8 stdout, stderr = p.communicate(src) qApp.restoreOverrideCursor() if stderr: err = stderr.decode("utf-8") LOGGER.error(err) QMessageBox.critical(mainWindow().dialog, qApp.translate("Export", "Error"), err) return None return stdout.decode("utf-8") @classmethod def runCmd(self): if self.isValid() == 2: return self.cmd elif self.isValid() == 1: return self.customPath