Exporter can now.. export. Yay!

This commit is contained in:
Olivier Keshavjee 2016-04-08 12:02:50 +02:00
parent ac0667c870
commit 9c2c15e352
8 changed files with 116 additions and 19 deletions

View file

@ -20,8 +20,9 @@ Be sure to have all **dependencies** installed !
## Dependencies
- Python 3
- PyQt5
- libqt5svg5
- lxml
- Qt SVG (`libqt5svg5` on Ubuntu)
- Qt Webkit (`python3-pyqt5.qtwebkit` on Ubuntu)
- lxml (`python3-lxml` on Ubuntu)
Optional:
- pyenchant

View file

@ -84,6 +84,10 @@ class basicFormat:
def preview(cls, settingsWidget, previewWidget):
pass
@classmethod
def export(cls, settingsWidget):
pass
@classmethod
def shortcodes(cls):
return [

View file

@ -17,6 +17,9 @@ class HTML(markdown):
description = qApp.translate("Export", "Basic HTML output using python module 'markdown'.")
InvalidBecause = qApp.translate("Export", "python module 'markdown'.")
exportVarName = "lastManuskriptHTML"
exportFilter = "HTML files (*.html);; Any files (*)"
@classmethod
def isValid(cls):
return MD is not None
@ -34,23 +37,33 @@ class HTML(markdown):
t.setStyleSheet("""
QTabBar::tab{
background-color: #BBB;
padding: 2px;
padding: 3px 25px;
border: none;
width: 100%;
}
QTabBar::tab:selected, QToolBox::tab:hover{
QTabBar::tab:selected, QTabBar::tab:hover{
background-color:skyblue;
}
""")
w0 = QPlainTextEdit()
w0.setFrameShape(QFrame.NoFrame)
w0.setReadOnly(True)
w1 = QPlainTextEdit()
w1.setFrameShape(QFrame.NoFrame)
w1.setReadOnly(True)
w2 = QWebView()
t.addTab(w2, qApp.translate("Export", "HTML"))
t.addTab(w1, qApp.translate("Export", "Source"))
t.addTab(w0, qApp.translate("Export", "Markdown source"))
t.addTab(w1, qApp.translate("Export", "HTML Source"))
t.addTab(w2, qApp.translate("Export", "HTML Output"))
t.setCurrentIndex(2)
return t
@classmethod
def output(cls, settings):
html = MD.markdown(markdown.output(settings))
return html
@classmethod
def preview(cls, settingsWidget, previewWidget):
settings = settingsWidget.getSettings()
@ -58,12 +71,14 @@ class HTML(markdown):
# Save settings
settingsWidget.writeSettings()
src = markdown.output(settings)
html = MD.markdown(src)
md = markdown.output(settings)
html = MD.markdown(md)
cls.preparesTextEditView(previewWidget.widget(0), settings["Preview"]["PreviewFont"])
previewWidget.widget(0).setPlainText(md)
cls.preparesTextEditView(previewWidget.widget(1), settings["Preview"]["PreviewFont"])
previewWidget.widget(1).setPlainText(html)
previewWidget.widget(0).setHtml(html)
previewWidget.widget(2).setHtml(html)

View file

@ -14,6 +14,9 @@ class markdown(plainText):
description = qApp.translate("Export", """Just like plain text, excepts adds markdown titles.
Presupposes that texts are formatted in markdown.""")
exportVarName = "lastManuskriptMarkdown"
exportFilter = "Markdown files (*.md);; Any files (*)"
@classmethod
def settingsWidget(cls):
w = markdownSettings(cls)

View file

@ -2,7 +2,7 @@
# --!-- coding: utf8 --!--
import re
from PyQt5.QtGui import QFont, QTextCharFormat
from PyQt5.QtWidgets import QPlainTextEdit, qApp, QFrame
from PyQt5.QtWidgets import QPlainTextEdit, qApp, QFrame, QFileDialog
from manuskript.exporter.basic import basicFormat
from manuskript.functions import mainWindow
@ -20,6 +20,11 @@ class plainText(basicFormat):
"Preview": True,
}
# Default settings used in cls.getExportFilename. For easy subclassing when exporting plaintext.
exportVarName = "lastPlainText"
exportFilter = "Text files (*.txt);; Any files (*)"
@classmethod
def settingsWidget(cls):
w = exporterSettings(cls)
@ -37,6 +42,61 @@ class plainText(basicFormat):
def output(cls, settings):
return cls.concatenate(mainWindow().mdlOutline.rootItem, settings)
@classmethod
def getExportFilename(cls, settingsWidget, varName=None, filter=None):
if varName is None:
varName = cls.exportVarName
if filter is None:
filter = cls.exportFilter
settings = settingsWidget.getSettings()
s = settings.get("Output", {})
if varName in s:
filename = s[varName]
else:
filename = ""
filename, filter = QFileDialog.getSaveFileName(settingsWidget.parent(),
caption=qApp.translate("Export", "Chose output file..."),
filter=filter,
directory=filename)
if filename:
s[varName] = filename
settingsWidget.settings["Output"] = s
# Auto adds extension if necessary
try:
# Extract the extension from "Some name (*.ext)"
ext = filter.split("(")[1].split(")")[0]
ext = ext.split(".")[1]
if " " in ext: # In case there are multiple extensions: "Images (*.png *.jpg)"
ext = ext.split(" ")[0]
except:
ext = ""
if ext and filename[-len(ext)-1:] != ".{}".format(ext):
filename += "." + ext
# Save settings
settingsWidget.writeSettings()
return filename
@classmethod
def export(cls, settingsWidget):
settings = settingsWidget.getSettings()
settingsWidget.writeSettings()
filename = cls.getExportFilename(settingsWidget)
if filename:
with open(filename, "w") as f:
f.write(cls.output(settingsWidget.settings))
@classmethod
def preview(cls, settingsWidget, previewWidget):
settings = settingsWidget.getSettings()

View file

@ -21,6 +21,8 @@ class exporterDialog(QWidget, Ui_exporter):
# Var
self.mw = mw
self.currentExporter = None
self.settingsWidget = None
self.previewWidget = None
# Populates lite
self.cmbExporters.clear()
@ -49,6 +51,7 @@ class exporterDialog(QWidget, Ui_exporter):
self.cmbExporters.setCurrentIndex(1)
self.btnPreview.clicked.connect(self.preview)
self.btnExport.clicked.connect(self.export)
def updateUi(self, index):
E, F = self.getSelectedExporter()
@ -71,12 +74,21 @@ class exporterDialog(QWidget, Ui_exporter):
self.previewWidget = F.previewWidget()
self.setGroupWidget(self.grpPreview, self.previewWidget)
self.splitter.setStretchFactor(0, 3)
self.splitter.setStretchFactor(1, 6)
def preview(self):
E, F = self.getSelectedExporter()
if not E or not F or not F.implemented:
return
F.preview(self.settingsWidget, self.previewWidget)
def export(self):
E, F = self.getSelectedExporter()
if not E or not F or not F.implemented:
return
F.export(self.settingsWidget)
###################################################################################################################
# UI
###################################################################################################################

View file

@ -2,7 +2,8 @@
# Form implementation generated from reading ui file 'manuskript/ui/exporters/exporter_ui.ui'
#
# Created by: PyQt5 UI code generator 5.4.2
# Created: Thu Apr 7 16:37:00 2016
# by: PyQt5 UI code generator 5.2.1
#
# WARNING! All changes made in this file will be lost!
@ -23,6 +24,7 @@ class Ui_exporter(object):
self.cmbExporters.setObjectName("cmbExporters")
self.horizontalLayout.addWidget(self.cmbExporters)
self.btnManageExporters = QtWidgets.QPushButton(exporter)
self.btnManageExporters.setFlat(True)
self.btnManageExporters.setObjectName("btnManageExporters")
self.horizontalLayout.addWidget(self.btnManageExporters)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
@ -30,9 +32,9 @@ class Ui_exporter(object):
self.btnPreview = QtWidgets.QPushButton(exporter)
self.btnPreview.setObjectName("btnPreview")
self.horizontalLayout.addWidget(self.btnPreview)
self.pushButton_2 = QtWidgets.QPushButton(exporter)
self.pushButton_2.setObjectName("pushButton_2")
self.horizontalLayout.addWidget(self.pushButton_2)
self.btnExport = QtWidgets.QPushButton(exporter)
self.btnExport.setObjectName("btnExport")
self.horizontalLayout.addWidget(self.btnExport)
self.verticalLayout.addLayout(self.horizontalLayout)
self.splitter = QtWidgets.QSplitter(exporter)
self.splitter.setOrientation(QtCore.Qt.Horizontal)
@ -40,14 +42,14 @@ class Ui_exporter(object):
self.grpSettings = QtWidgets.QGroupBox(self.splitter)
self.grpSettings.setObjectName("grpSettings")
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.grpSettings)
self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_3.setSpacing(0)
self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.grpPreview = QtWidgets.QGroupBox(self.splitter)
self.grpPreview.setObjectName("grpPreview")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.grpPreview)
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_2.setSpacing(0)
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.verticalLayout.addWidget(self.splitter)
@ -60,7 +62,7 @@ class Ui_exporter(object):
self.label.setText(_translate("exporter", "Export to:"))
self.btnManageExporters.setText(_translate("exporter", "Manage exporters"))
self.btnPreview.setText(_translate("exporter", "Preview"))
self.pushButton_2.setText(_translate("exporter", "Export"))
self.btnExport.setText(_translate("exporter", "Export"))
self.grpSettings.setTitle(_translate("exporter", "Settings"))
self.grpPreview.setTitle(_translate("exporter", "Preview"))

View file

@ -54,7 +54,7 @@
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_2">
<widget class="QPushButton" name="btnExport">
<property name="text">
<string>Export</string>
</property>