manuskript/manuskript/converters/pandocConverter.py

88 lines
2.2 KiB
Python
Raw Normal View History

2017-11-14 10:55:33 +13:00
#!/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, safeTranslate
2017-11-14 10:55:33 +13:00
import logging
LOGGER = logging.getLogger(__name__)
2017-11-14 10:55:33 +13:00
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.")
2017-11-14 10:55:33 +13:00
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)
2017-11-14 10:55:33 +13:00
QMessageBox.critical(mainWindow().dialog,
safeTranslate(qApp, "Export", "Error"), err)
2017-11-14 10:55:33 +13:00
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