diff --git a/i18n/manuskript.pro b/i18n/manuskript.pro index b4fde4ba..5df948de 100644 --- a/i18n/manuskript.pro +++ b/i18n/manuskript.pro @@ -68,6 +68,15 @@ SOURCES += ../manuskript/ui/exporters/exportersManager.py SOURCES += ../manuskript/ui/exporters/manuskript/plainTextSettings.py +SOURCES += ../manuskript/exporter/basic.py +SOURCES += ../manuskript/exporter/mmd.py +SOURCES += ../manuskript/exporter/pandoc.py +SOURCES += ../manuskript/exporter/manuskript/__init__.py +SOURCES += ../manuskript/exporter/manuskript/HTML.py +SOURCES += ../manuskript/exporter/manuskript/markdown.py +SOURCES += ../manuskript/exporter/manuskript/plainText.py + + TRANSLATIONS += manuskript_fr.ts TRANSLATIONS += manuskript_es.ts diff --git a/manuskript/exporter/basic.py b/manuskript/exporter/basic.py index 18946c54..09ab3ff8 100644 --- a/manuskript/exporter/basic.py +++ b/manuskript/exporter/basic.py @@ -62,6 +62,7 @@ class basicExporter: class basicFormat: implemented = False + InvalidBecause = "" requires = { "Settings": False, "Preview": False, @@ -102,3 +103,7 @@ class basicFormat: text = text.replace(B, A) return text + @classmethod + def isValid(cls): + return True + diff --git a/manuskript/exporter/manuskript/HTML.py b/manuskript/exporter/manuskript/HTML.py new file mode 100644 index 00000000..824b9490 --- /dev/null +++ b/manuskript/exporter/manuskript/HTML.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python +# --!-- coding: utf8 --!-- +from PyQt5.QtCore import Qt +from PyQt5.QtWebKitWidgets import QWebView +from PyQt5.QtWidgets import QPlainTextEdit, qApp, QTabWidget, QFrame + +from manuskript.exporter.manuskript.markdown import markdown +from manuskript.ui.exporters.manuskript.plainTextSettings import exporterSettings + +try: + import markdown as MD +except ImportError: + MD = None + +class HTML(markdown): + name = qApp.tr("HTML") + description = qApp.tr("Basic HTML output using python module 'markdown'.") + InvalidBecause = qApp.tr("python module 'markdown'.") + + @classmethod + def isValid(cls): + return MD is not None + + @classmethod + def settingsWidget(cls): + w = exporterSettings(cls) + w.loadSettings() + return w + + @classmethod + def previewWidget(cls): + t = QTabWidget() + t.setDocumentMode(True) + t.setStyleSheet(""" + QTabBar::tab{ + background-color: #BBB; + padding: 2px; + border: none; + width: 100%; + } + + QTabBar::tab:selected, QToolBox::tab:hover{ + background-color:skyblue; + } + """) + w1 = QPlainTextEdit() + w1.setFrameShape(QFrame.NoFrame) + w1.setReadOnly(True) + w2 = QWebView() + t.addTab(w2, qApp.tr("HTML")) + t.addTab(w1, qApp.tr("Source")) + return t + + @classmethod + def preview(cls, settingsWidget, previewWidget): + settings = settingsWidget.getSettings() + + # Save settings + settingsWidget.writeSettings() + + src = markdown.output(settings) + html = MD.markdown(src) + + cls.preparesTextEditView(previewWidget.widget(1), settings["Preview"]["PreviewFont"]) + previewWidget.widget(1).setPlainText(html) + previewWidget.widget(0).setHtml(html) + + + diff --git a/manuskript/exporter/manuskript/__init__.py b/manuskript/exporter/manuskript/__init__.py index 5fce90dd..5cec71e7 100644 --- a/manuskript/exporter/manuskript/__init__.py +++ b/manuskript/exporter/manuskript/__init__.py @@ -3,6 +3,7 @@ from PyQt5.QtWidgets import QTextEdit, qApp from manuskript.exporter.basic import basicExporter, basicFormat +from manuskript.exporter.manuskript.HTML import HTML from manuskript.exporter.manuskript.markdown import markdown from manuskript.exporter.manuskript.plainText import plainText @@ -14,7 +15,7 @@ class manuskriptExporter(basicExporter): exportTo = [ plainText, markdown, - basicFormat("HTML"), + HTML, basicFormat("OPML") ] diff --git a/manuskript/exporter/manuskript/markdown.py b/manuskript/exporter/manuskript/markdown.py index ed512137..a378d3ac 100644 --- a/manuskript/exporter/manuskript/markdown.py +++ b/manuskript/exporter/manuskript/markdown.py @@ -11,8 +11,8 @@ from manuskript.ui.exporters.manuskript.plainTextSettings import exporterSetting class markdown(plainText): name = qApp.tr("Markdown") - description = qApp.tr("Just like plain text, excepts adds markdown titles. \ - Presupposes that texts are formatted in markdown.") + description = qApp.tr("""Just like plain text, excepts adds markdown titles. + Presupposes that texts are formatted in markdown.""") @classmethod def settingsWidget(cls): diff --git a/manuskript/exporter/manuskript/plainText.py b/manuskript/exporter/manuskript/plainText.py index 9292cd40..e30609f4 100644 --- a/manuskript/exporter/manuskript/plainText.py +++ b/manuskript/exporter/manuskript/plainText.py @@ -2,7 +2,7 @@ # --!-- coding: utf8 --!-- import re from PyQt5.QtGui import QFont, QTextCharFormat -from PyQt5.QtWidgets import QPlainTextEdit, qApp +from PyQt5.QtWidgets import QPlainTextEdit, qApp, QFrame from manuskript.exporter.basic import basicFormat from manuskript.functions import mainWindow @@ -12,8 +12,8 @@ from manuskript.ui.exporters.manuskript.plainTextSettings import exporterSetting class plainText(basicFormat): name = qApp.tr("Plain text") - description = qApp.tr("Simplest export to plain text. Allows you to use your own markup not understood " \ - "by manuskript, for example Fountain.") + description = qApp.tr("""Simplest export to plain text. Allows you to use your own markup not understood + by manuskript, for example Fountain.""") implemented = True requires = { "Settings": True, @@ -29,9 +29,14 @@ class plainText(basicFormat): @classmethod def previewWidget(cls): w = QPlainTextEdit() + w.setFrameShape(QFrame.NoFrame) w.setReadOnly(True) return w + @classmethod + def output(cls, settings): + return cls.concatenate(mainWindow().mdlOutline.rootItem, settings) + @classmethod def preview(cls, settingsWidget, previewWidget): settings = settingsWidget.getSettings() @@ -39,17 +44,21 @@ class plainText(basicFormat): # Save settings settingsWidget.writeSettings() - r = cls.concatenate(mainWindow().mdlOutline.rootItem, settings) + r = cls.output(settings) # Set preview font - cf = QTextCharFormat() - f = QFont() - f.fromString(settings["Preview"]["PreviewFont"]) - cf.setFont(f) - previewWidget.setCurrentCharFormat(cf) + cls.preparesTextEditView(previewWidget, settings["Preview"]["PreviewFont"]) previewWidget.setPlainText(r) + @classmethod + def preparesTextEditView(cls, view, textFont): + cf = QTextCharFormat() + f = QFont() + f.fromString(textFont) + cf.setFont(f) + view.setCurrentCharFormat(cf) + @classmethod def concatenate(cls, item: outlineItem, settings) -> str: s = settings diff --git a/manuskript/exporter/mmd.py b/manuskript/exporter/mmd.py index 7c01016e..cd9f6f15 100644 --- a/manuskript/exporter/mmd.py +++ b/manuskript/exporter/mmd.py @@ -1,5 +1,6 @@ #!/usr/bin/env python # --!-- coding: utf8 --!-- +from PyQt5.QtWidgets import qApp from manuskript.exporter.basic import basicExporter, basicFormat @@ -7,9 +8,9 @@ from manuskript.exporter.basic import basicExporter, basicFormat class mmdExporter(basicExporter): name = "MultiMarkdown" - description = """

A superset of markdown.

+ description = qApp.tr("""

A superset of markdown.

Website: http://fletcherpenney.net/multimarkdown/

- """ + """) exportTo = [ basicFormat("HTML", "A little known format modestly used. You know, web sites for example."), basicFormat("latex", ""), diff --git a/manuskript/exporter/pandoc.py b/manuskript/exporter/pandoc.py index 3348f781..9a4d6ee9 100644 --- a/manuskript/exporter/pandoc.py +++ b/manuskript/exporter/pandoc.py @@ -1,11 +1,12 @@ #!/usr/bin/env python # --!-- coding: utf8 --!-- +from PyQt5.QtWidgets import qApp from manuskript.exporter.basic import basicExporter, basicFormat class HTMLFormat(basicFormat): name = "HTML" - description = "A little known format modestly used. You know, web sites for example." + description = qApp.tr("A little known format modestly used. You know, web sites for example.") implemented = False requires = { "Settings": True, @@ -16,10 +17,10 @@ class HTMLFormat(basicFormat): class pandocExporter(basicExporter): name = "Pandoc" - description = """

A universal document convertor. Can be used to convert markdown to a wide range of other + description = qApp.tr("""

A universal document convertor. Can be used to convert markdown to a wide range of other formats.

Website: http://pandoc.org/

- """ + """) exportTo = [ HTMLFormat, basicFormat("ePub", "Books that don't kill trees."), diff --git a/manuskript/ui/exporters/exporter.py b/manuskript/ui/exporters/exporter.py index 0eea7738..7f03fc8c 100644 --- a/manuskript/ui/exporters/exporter.py +++ b/manuskript/ui/exporters/exporter.py @@ -36,6 +36,10 @@ class exporterDialog(QWidget, Ui_exporter): item.setFlags(Qt.ItemIsEnabled) for f in E.exportTo: + + if not f.isValid(): + continue + name = f.name if f.implemented else self.tr("{} (not implemented yet)").format(f.name) self.cmbExporters.addItem(name, E.name) @@ -113,7 +117,9 @@ class exporterDialog(QWidget, Ui_exporter): # Removes every items from given layout. l = group.layout() while l.count(): - l.removeItem(l.itemAt(0)) + item = l.itemAt(0) + l.removeItem(item) + item.widget().deleteLater() l.addWidget(widget) widget.setParent(group) \ No newline at end of file diff --git a/manuskript/ui/exporters/exportersManager.py b/manuskript/ui/exporters/exportersManager.py index 499f92cd..6845d1fc 100644 --- a/manuskript/ui/exporters/exportersManager.py +++ b/manuskript/ui/exporters/exportersManager.py @@ -92,8 +92,15 @@ class exportersManager(QWidget, Ui_ExportersManager): self.lblExportToDescription.setText("") else: - self.lblExportToDescription.setText("{}: {}".format( + + desc = "{}: {}".format( name, - f.description)) + f.description) + if not f.isValid(): + desc += "

" + \ + self.tr("Status: uninstalled.") + \ + "

" + \ + self.tr("Requires: ") + f.InvalidBecause + self.lblExportToDescription.setText(desc) diff --git a/manuskript/ui/exporters/manuskript/plainTextSettings.py b/manuskript/ui/exporters/manuskript/plainTextSettings.py index 7269f3e4..45227e26 100644 --- a/manuskript/ui/exporters/manuskript/plainTextSettings.py +++ b/manuskript/ui/exporters/manuskript/plainTextSettings.py @@ -104,7 +104,7 @@ class exporterSettings(QWidget, Ui_exporterSettings): cmb.currentIndexChanged.connect(self.transCmbChanged) cmb.currentIndexChanged.emit(0) - self.btnTransAdd.clicked.connect(self.transAddTableRow) + self.btnTransAdd.clicked.connect(lambda: self.transAddTableRow(checked=True)) self.btnTransRemove.clicked.connect(self.transRemoveTableRow) self.tableWidgetAdjustToContent(self.tblReplacements) @@ -308,13 +308,13 @@ class exporterSettings(QWidget, Ui_exporterSettings): def contentUpdateTable(self): - def addFolderRow(text="Folder"): + def addFolderRow(text=self.tr("Folder")): self.tableWidgetAddRow(self.tblContent, [ self.tableWidgetMakeItem(text, "folder"), self.tableWidgetMakeItem("", "", True, True), ]) - def addTextRow(text="Text"): + def addTextRow(text=self.tr("Text")): self.tableWidgetAddRow(self.tblContent, [ self.tableWidgetMakeItem(text, "text-x-generic"), self.tableWidgetMakeItem("", "", True, False), @@ -331,10 +331,10 @@ class exporterSettings(QWidget, Ui_exporterSettings): level = self.mw.mdlOutline.maxLevel() for i in range(level): - addFolderRow("{}Level {} folder".format(" " * i, i + 1)) + addFolderRow(self.tr("{}Level {} folder").format(" " * i, i + 1)) for i in range(level): - addTextRow("{}Level {} text".format(" " * i, i + 1)) + addTextRow(self.tr("{}Level {} text").format(" " * i, i + 1)) self.tableWidgetAdjustToContent(self.tblContent)