From 24607bca59f1174b797b51f67f5228ca79b6b921 Mon Sep 17 00:00:00 2001 From: Olivier Keshavjee Date: Thu, 9 Nov 2017 11:25:24 +0100 Subject: [PATCH] Adds setting to manage word wrap, and enhances UI. #200 --- manuskript/importer/__init__.py | 3 +- manuskript/importer/abstractImporter.py | 3 ++ manuskript/importer/folderImporter.py | 10 ---- manuskript/importer/markdownImporter.py | 8 ---- manuskript/importer/pandocImporters.py | 41 +++++++++------- manuskript/ui/importers/generalSettings.py | 7 +++ manuskript/ui/importers/generalSettings_ui.py | 10 ++-- manuskript/ui/importers/generalSettings_ui.ui | 13 +++-- manuskript/ui/importers/importer.py | 48 ++++++++++++++++--- 9 files changed, 94 insertions(+), 49 deletions(-) diff --git a/manuskript/importer/__init__.py b/manuskript/importer/__init__.py index 3edfeba9..196784ca 100644 --- a/manuskript/importer/__init__.py +++ b/manuskript/importer/__init__.py @@ -6,7 +6,7 @@ from manuskript.importer.markdownImporter import markdownImporter from manuskript.importer.opmlImporter import opmlImporter from manuskript.importer.pandocImporters import markdownPandocImporter, \ odtPandocImporter, ePubPandocImporter, docXPandocImporter, HTMLPandocImporter, \ - rstPandocImporter, LaTeXPandocImporter + rstPandocImporter, LaTeXPandocImporter, OPMLPandocImporter importers = [ # Internal @@ -22,4 +22,5 @@ importers = [ HTMLPandocImporter, rstPandocImporter, LaTeXPandocImporter, + OPMLPandocImporter, ] diff --git a/manuskript/importer/abstractImporter.py b/manuskript/importer/abstractImporter.py index 0e315f74..440068b7 100644 --- a/manuskript/importer/abstractImporter.py +++ b/manuskript/importer/abstractImporter.py @@ -24,6 +24,7 @@ class abstractImporter: fileFormat = "" # File format accepted. For example: "OPML Files (*.opml)" # For folder, use "<>" icon = "" + engine = "Internal" def __init__(self): self.settings = {} @@ -143,6 +144,8 @@ class abstractImporter: l.addWidget(label, 6) self._widget = QComboBox() self._widget.addItems(self.vals) + if self.default: + self._widget.setCurrentText(self.default) l.addWidget(self._widget, 2) if parent: parent.layout().addLayout(l) diff --git a/manuskript/importer/folderImporter.py b/manuskript/importer/folderImporter.py index a8e3f25f..4a3929cc 100644 --- a/manuskript/importer/folderImporter.py +++ b/manuskript/importer/folderImporter.py @@ -31,12 +31,6 @@ class folderImporter(abstractImporter): items = [] stack = {} - if self.getSetting("topLevelFolder").value(): - parent = outlineItem(title=os.path.basename(filePath), - parent=parentItem) - items.append(parent) - stack[filePath] = parent - for dirpath, dirnames, filenames in os.walk(filePath): if dirpath in stack: @@ -109,10 +103,6 @@ class folderImporter(abstractImporter): default="*.txt, *.md", tooltip=qApp.translate("Import", "Coma separated values")), - self.addSetting("topLevelFolder", "checkbox", - qApp.translate("Import", "Include top-level folder"), - default=False), - self.addSetting("sortItems", "checkbox", qApp.translate("Import", "Sort items by name"), default=True), diff --git a/manuskript/importer/markdownImporter.py b/manuskript/importer/markdownImporter.py index 089aec06..2e60f859 100644 --- a/manuskript/importer/markdownImporter.py +++ b/manuskript/importer/markdownImporter.py @@ -91,10 +91,6 @@ class markdownImporter(abstractImporter): setextHeader1 = re.compile(r"(.+)\n===+$", re.MULTILINE) setextHeader2 = re.compile(r"(.+)\n---+$", re.MULTILINE) - # Import in top level folder? - if self.getSetting("topLevelFolder").value(): - parent = addTitle(os.path.basename(filePath), parentItem, 0) - # We store the level of each item in a temporary var parent.__miLevel = 0 # markdown importer header level @@ -183,10 +179,6 @@ class markdownImporter(abstractImporter): parser that will go through a markdown document and create items for each titles.
 """)) - self.addSetting("topLevelFolder", "checkbox", - qApp.translate("Import", "Import in a top-level folder."), - default=False), - for s in self.settings: self.settings[s].widget(group) diff --git a/manuskript/importer/pandocImporters.py b/manuskript/importer/pandocImporters.py index 89548dc5..bbdfa9c9 100644 --- a/manuskript/importer/pandocImporters.py +++ b/manuskript/importer/pandocImporters.py @@ -11,6 +11,7 @@ from PyQt5.QtWidgets import qApp class pandocImporter(abstractImporter): formatFrom = "" + engine = "Pandoc" @classmethod def isValid(cls): @@ -62,16 +63,14 @@ class pandocImporter(abstractImporter): self.addSetting("wrap", "combo", qApp.translate("Import", "Wrap lines:"), - vals="auto|none|preserve") - - self.addSetting("infoWrap", "label", - qApp.translate("Import", """(auto: wraps at - 72 characters.
- none: no line wrap.
- preserve: tries to preserves line wrap from - the original document. -
 """), - default="none") + vals="auto|none|preserve", + default="none", + tooltip=qApp.translate("Import", """

Should pandoc create + cosmetic / non-semantic line-breaks?

+ auto: wraps at 72 characters.
+ none: no line wrap.
+ preserve: tries to preserves line wrap from the + original document.

""")) for s in self.settings: self.settings[s].widget(group) @@ -86,7 +85,7 @@ class pandocImporter(abstractImporter): class markdownPandocImporter(pandocImporter): - name = "Markdown (pandoc)" + name = "Markdown" description = "Markdown, using pandoc" fileFormat = "Markdown files (*.md *.txt *)" icon = "text-x-markdown" @@ -94,7 +93,7 @@ class markdownPandocImporter(pandocImporter): class ePubPandocImporter(pandocImporter): - name = "ePub (pandoc)" + name = "ePub" description = "" fileFormat = "ePub files (*.epub)" icon = "application-epub+zip" @@ -102,7 +101,7 @@ class ePubPandocImporter(pandocImporter): class docXPandocImporter(pandocImporter): - name = "DocX (pandoc)" + name = "DocX" description = "" fileFormat = "DocX files (*.docx)" icon = "application-vnd.openxmlformats-officedocument.wordprocessingml.document" @@ -110,7 +109,7 @@ class docXPandocImporter(pandocImporter): class odtPandocImporter(pandocImporter): - name = "ODT (pandoc)" + name = "ODT" description = "" fileFormat = "Open Document files (*.odt)" icon = "application-vnd.oasis.opendocument.text" @@ -118,7 +117,7 @@ class odtPandocImporter(pandocImporter): class rstPandocImporter(pandocImporter): - name = "reStructuredText (pandoc)" + name = "reStructuredText" description = "" fileFormat = "reStructuredText files (*.rst)" icon = "text-plain" @@ -126,7 +125,7 @@ class rstPandocImporter(pandocImporter): class HTMLPandocImporter(pandocImporter): - name = "HTML (pandoc)" + name = "HTML" description = "" fileFormat = "HTML files (*.htm *.html)" icon = "text-html" @@ -134,12 +133,20 @@ class HTMLPandocImporter(pandocImporter): class LaTeXPandocImporter(pandocImporter): - name = "LaTeX (pandoc)" + name = "LaTeX" description = "" fileFormat = "LaTeX files (*.tex)" icon = "text-x-tex" formatFrom = "latex" +class OPMLPandocImporter(pandocImporter): + + name = "OPML" + description = "" + fileFormat = "OPML files (*.opml *.xml)" + icon = "text-x-opml+xml" + formatFrom = "opml" + diff --git a/manuskript/ui/importers/generalSettings.py b/manuskript/ui/importers/generalSettings.py index e7dc43e5..874a3fc9 100644 --- a/manuskript/ui/importers/generalSettings.py +++ b/manuskript/ui/importers/generalSettings.py @@ -59,6 +59,13 @@ class generalSettings(QWidget, Ui_generalSettings): return "0" # 0 is root's ID + def importInTopLevelFolder(self): + """ + Should the import be flat in the parent folder, or create a top-level + folder? + """ + return self.chkGeneralTopLevel.isChecked() + def trimLongTitles(self): return self.chkGeneralTrimTitles.isChecked() diff --git a/manuskript/ui/importers/generalSettings_ui.py b/manuskript/ui/importers/generalSettings_ui.py index 1843ee0e..0c4d36b7 100644 --- a/manuskript/ui/importers/generalSettings_ui.py +++ b/manuskript/ui/importers/generalSettings_ui.py @@ -39,14 +39,14 @@ class Ui_generalSettings(object): self.chkGeneralSplitScenes = QtWidgets.QCheckBox(self.general) self.chkGeneralSplitScenes.setEnabled(False) self.chkGeneralSplitScenes.setObjectName("chkGeneralSplitScenes") - self.formLayout_4.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.chkGeneralSplitScenes) + self.formLayout_4.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.chkGeneralSplitScenes) self.txtGeneralSplitScenes = QtWidgets.QLineEdit(self.general) self.txtGeneralSplitScenes.setEnabled(False) self.txtGeneralSplitScenes.setObjectName("txtGeneralSplitScenes") - self.formLayout_4.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.txtGeneralSplitScenes) + self.formLayout_4.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.txtGeneralSplitScenes) self.chkGeneralTrimTitles = QtWidgets.QCheckBox(self.general) self.chkGeneralTrimTitles.setObjectName("chkGeneralTrimTitles") - self.formLayout_4.setWidget(3, QtWidgets.QFormLayout.SpanningRole, self.chkGeneralTrimTitles) + self.formLayout_4.setWidget(4, QtWidgets.QFormLayout.SpanningRole, self.chkGeneralTrimTitles) self.treeGeneralParent = QtWidgets.QTreeView(self.general) self.treeGeneralParent.setHeaderHidden(True) self.treeGeneralParent.setObjectName("treeGeneralParent") @@ -54,6 +54,9 @@ class Ui_generalSettings(object): self.chkGeneralParent = QtWidgets.QCheckBox(self.general) self.chkGeneralParent.setObjectName("chkGeneralParent") self.formLayout_4.setWidget(0, QtWidgets.QFormLayout.SpanningRole, self.chkGeneralParent) + self.chkGeneralTopLevel = QtWidgets.QCheckBox(self.general) + self.chkGeneralTopLevel.setObjectName("chkGeneralTopLevel") + self.formLayout_4.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.chkGeneralTopLevel) self.verticalLayout_5.addLayout(self.formLayout_4) self.toolBox.addItem(self.general, "") self.verticalLayout_2.addWidget(self.toolBox) @@ -69,5 +72,6 @@ class Ui_generalSettings(object): self.chkGeneralSplitScenes.setText(_translate("generalSettings", "Split scenes at:")) self.chkGeneralTrimTitles.setText(_translate("generalSettings", "Trim long titles (> 32 chars)")) self.chkGeneralParent.setText(_translate("generalSettings", "Import under:")) + self.chkGeneralTopLevel.setText(_translate("generalSettings", "Import in a top-level folder")) self.toolBox.setItemText(self.toolBox.indexOf(self.general), _translate("generalSettings", "General")) diff --git a/manuskript/ui/importers/generalSettings_ui.ui b/manuskript/ui/importers/generalSettings_ui.ui index 21c4f95e..a1ea203e 100644 --- a/manuskript/ui/importers/generalSettings_ui.ui +++ b/manuskript/ui/importers/generalSettings_ui.ui @@ -78,7 +78,7 @@ QToolBox::tab:selected, QToolBox::tab:hover{ QFormLayout::WrapLongRows - + false @@ -88,14 +88,14 @@ QToolBox::tab:selected, QToolBox::tab:hover{ - + false - + Trim long titles (> 32 chars) @@ -116,6 +116,13 @@ QToolBox::tab:selected, QToolBox::tab:hover{ + + + + Import in a top-level folder + + + diff --git a/manuskript/ui/importers/importer.py b/manuskript/ui/importers/importer.py index 6314ac66..fff1b6fe 100644 --- a/manuskript/ui/importers/importer.py +++ b/manuskript/ui/importers/importer.py @@ -12,7 +12,7 @@ from manuskript.ui.importers.importer_ui import Ui_importer from manuskript.ui.importers.generalSettings import generalSettings from manuskript.ui import style from manuskript import importer -from manuskript.models.outlineModel import outlineModel +from manuskript.models.outlineModel import outlineModel, outlineItem from manuskript.enums import Outline from manuskript.exporter.pandoc import pandocExporter @@ -67,7 +67,21 @@ class importerDialog(QWidget, Ui_importer): def addFormat(name, icon): self.cmbImporters.addItem(QIcon.fromTheme(icon), name) + def addHeader(name): + self.cmbImporters.addItem(name, "header") + self.cmbImporters.setItemData(self.cmbImporters.count() - 1, QBrush(QColor(Qt.darkBlue)), Qt.ForegroundRole) + self.cmbImporters.setItemData(self.cmbImporters.count() - 1, QBrush(lightBlue()), Qt.BackgroundRole) + item = self.cmbImporters.model().item(self.cmbImporters.count() - 1) + item.setFlags(Qt.ItemIsEnabled) + + lastEngine = "" + for f in self.importers: + # Header + if f.engine != lastEngine: + addHeader(f.engine) + lastEngine = f.engine + addFormat(f.name, f.icon) if not f.isValid(): item = self.cmbImporters.model().item(self.cmbImporters.count() - 1) @@ -79,8 +93,14 @@ class importerDialog(QWidget, Ui_importer): "Install pandoc to import from much more formats", "::URL::http://pandoc.org/installing.html") + self.cmbImporters.setCurrentIndex(1) + def currentFormat(self): formatName = self.cmbImporters.currentText() + + if self.cmbImporters.currentData() == "header": + return None + F = [F for F in self.importers if F.name == formatName][0] # We instantiate the class return F() @@ -162,15 +182,18 @@ class importerDialog(QWidget, Ui_importer): F = self.currentFormat() self._format = F + # Checking if we have a valid importer (otherwise a header) + if not F: + self.grpSettings.setEnabled(False) + self.grpPreview.setEnabled(False) + return + self.grpSettings.setEnabled(True) + self.grpPreview.setEnabled(True) + self.settingsWidget = generalSettings() #TODO: custom format widget self.settingsWidget = F.settingsWidget(self.settingsWidget) - #toolBox = self.settingsWidget.toolBox - #w = QWidget() - #toolBox.insertItem(toolBox.count(), w, "Pandoc") - #See pandoc's abstractPlainText - # Set the settings widget in place self.setGroupWidget(self.grpSettings, self.settingsWidget) self.grpSettings.setMinimumWidth(200) @@ -245,6 +268,8 @@ class importerDialog(QWidget, Ui_importer): necessary. """ + items = [] + # We find the current selected format F = self._format @@ -252,11 +277,20 @@ class importerDialog(QWidget, Ui_importer): ID = self.settingsWidget.importUnderID() parentItem = outlineModel.getItemByID(ID) + # Import in top-level folder? + if self.settingsWidget.importInTopLevelFolder(): + parent = outlineItem(title=os.path.basename(self.fileName), + parent=parentItem) + parentItem = parent + items.append(parent) + # Calling the importer - items = F.startImport(self.fileName, + rItems = F.startImport(self.fileName, parentItem, self.settingsWidget) + items.extend(rItems) + # Do transformations items = self.doTransformations(items)