Adds setting to manage word wrap, and enhances UI. #200

This commit is contained in:
Olivier Keshavjee 2017-11-09 11:25:24 +01:00
parent 3cef130bc6
commit 24607bca59
9 changed files with 94 additions and 49 deletions

View file

@ -6,7 +6,7 @@ from manuskript.importer.markdownImporter import markdownImporter
from manuskript.importer.opmlImporter import opmlImporter from manuskript.importer.opmlImporter import opmlImporter
from manuskript.importer.pandocImporters import markdownPandocImporter, \ from manuskript.importer.pandocImporters import markdownPandocImporter, \
odtPandocImporter, ePubPandocImporter, docXPandocImporter, HTMLPandocImporter, \ odtPandocImporter, ePubPandocImporter, docXPandocImporter, HTMLPandocImporter, \
rstPandocImporter, LaTeXPandocImporter rstPandocImporter, LaTeXPandocImporter, OPMLPandocImporter
importers = [ importers = [
# Internal # Internal
@ -22,4 +22,5 @@ importers = [
HTMLPandocImporter, HTMLPandocImporter,
rstPandocImporter, rstPandocImporter,
LaTeXPandocImporter, LaTeXPandocImporter,
OPMLPandocImporter,
] ]

View file

@ -24,6 +24,7 @@ class abstractImporter:
fileFormat = "" # File format accepted. For example: "OPML Files (*.opml)" fileFormat = "" # File format accepted. For example: "OPML Files (*.opml)"
# For folder, use "<<folder>>" # For folder, use "<<folder>>"
icon = "" icon = ""
engine = "Internal"
def __init__(self): def __init__(self):
self.settings = {} self.settings = {}
@ -143,6 +144,8 @@ class abstractImporter:
l.addWidget(label, 6) l.addWidget(label, 6)
self._widget = QComboBox() self._widget = QComboBox()
self._widget.addItems(self.vals) self._widget.addItems(self.vals)
if self.default:
self._widget.setCurrentText(self.default)
l.addWidget(self._widget, 2) l.addWidget(self._widget, 2)
if parent: if parent:
parent.layout().addLayout(l) parent.layout().addLayout(l)

View file

@ -31,12 +31,6 @@ class folderImporter(abstractImporter):
items = [] items = []
stack = {} 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): for dirpath, dirnames, filenames in os.walk(filePath):
if dirpath in stack: if dirpath in stack:
@ -109,10 +103,6 @@ class folderImporter(abstractImporter):
default="*.txt, *.md", default="*.txt, *.md",
tooltip=qApp.translate("Import", "Coma separated values")), tooltip=qApp.translate("Import", "Coma separated values")),
self.addSetting("topLevelFolder", "checkbox",
qApp.translate("Import", "Include top-level folder"),
default=False),
self.addSetting("sortItems", "checkbox", self.addSetting("sortItems", "checkbox",
qApp.translate("Import", "Sort items by name"), qApp.translate("Import", "Sort items by name"),
default=True), default=True),

View file

@ -91,10 +91,6 @@ class markdownImporter(abstractImporter):
setextHeader1 = re.compile(r"(.+)\n===+$", re.MULTILINE) setextHeader1 = re.compile(r"(.+)\n===+$", re.MULTILINE)
setextHeader2 = 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 # We store the level of each item in a temporary var
parent.__miLevel = 0 # markdown importer header level parent.__miLevel = 0 # markdown importer header level
@ -183,10 +179,6 @@ class markdownImporter(abstractImporter):
parser that will go through a markdown document and parser that will go through a markdown document and
create items for each titles.<br/>&nbsp;""")) create items for each titles.<br/>&nbsp;"""))
self.addSetting("topLevelFolder", "checkbox",
qApp.translate("Import", "Import in a top-level folder."),
default=False),
for s in self.settings: for s in self.settings:
self.settings[s].widget(group) self.settings[s].widget(group)

View file

@ -11,6 +11,7 @@ from PyQt5.QtWidgets import qApp
class pandocImporter(abstractImporter): class pandocImporter(abstractImporter):
formatFrom = "" formatFrom = ""
engine = "Pandoc"
@classmethod @classmethod
def isValid(cls): def isValid(cls):
@ -62,16 +63,14 @@ class pandocImporter(abstractImporter):
self.addSetting("wrap", "combo", self.addSetting("wrap", "combo",
qApp.translate("Import", "Wrap lines:"), qApp.translate("Import", "Wrap lines:"),
vals="auto|none|preserve") vals="auto|none|preserve",
default="none",
self.addSetting("infoWrap", "label", tooltip=qApp.translate("Import", """<p>Should pandoc create
qApp.translate("Import", """(<code>auto</code>: wraps at cosmetic / non-semantic line-breaks?</p><p>
72 characters.<br> <b>auto</b>: wraps at 72 characters.<br>
<code>none</code>: no line wrap.<br> <b>none</b>: no line wrap.<br>
<code>preserve</code>: tries to preserves line wrap from <b>preserve</b>: tries to preserves line wrap from the
the original document. original document.</p>"""))
<br/>&nbsp;"""),
default="none")
for s in self.settings: for s in self.settings:
self.settings[s].widget(group) self.settings[s].widget(group)
@ -86,7 +85,7 @@ class pandocImporter(abstractImporter):
class markdownPandocImporter(pandocImporter): class markdownPandocImporter(pandocImporter):
name = "Markdown (pandoc)" name = "Markdown"
description = "Markdown, using pandoc" description = "Markdown, using pandoc"
fileFormat = "Markdown files (*.md *.txt *)" fileFormat = "Markdown files (*.md *.txt *)"
icon = "text-x-markdown" icon = "text-x-markdown"
@ -94,7 +93,7 @@ class markdownPandocImporter(pandocImporter):
class ePubPandocImporter(pandocImporter): class ePubPandocImporter(pandocImporter):
name = "ePub (pandoc)" name = "ePub"
description = "" description = ""
fileFormat = "ePub files (*.epub)" fileFormat = "ePub files (*.epub)"
icon = "application-epub+zip" icon = "application-epub+zip"
@ -102,7 +101,7 @@ class ePubPandocImporter(pandocImporter):
class docXPandocImporter(pandocImporter): class docXPandocImporter(pandocImporter):
name = "DocX (pandoc)" name = "DocX"
description = "" description = ""
fileFormat = "DocX files (*.docx)" fileFormat = "DocX files (*.docx)"
icon = "application-vnd.openxmlformats-officedocument.wordprocessingml.document" icon = "application-vnd.openxmlformats-officedocument.wordprocessingml.document"
@ -110,7 +109,7 @@ class docXPandocImporter(pandocImporter):
class odtPandocImporter(pandocImporter): class odtPandocImporter(pandocImporter):
name = "ODT (pandoc)" name = "ODT"
description = "" description = ""
fileFormat = "Open Document files (*.odt)" fileFormat = "Open Document files (*.odt)"
icon = "application-vnd.oasis.opendocument.text" icon = "application-vnd.oasis.opendocument.text"
@ -118,7 +117,7 @@ class odtPandocImporter(pandocImporter):
class rstPandocImporter(pandocImporter): class rstPandocImporter(pandocImporter):
name = "reStructuredText (pandoc)" name = "reStructuredText"
description = "" description = ""
fileFormat = "reStructuredText files (*.rst)" fileFormat = "reStructuredText files (*.rst)"
icon = "text-plain" icon = "text-plain"
@ -126,7 +125,7 @@ class rstPandocImporter(pandocImporter):
class HTMLPandocImporter(pandocImporter): class HTMLPandocImporter(pandocImporter):
name = "HTML (pandoc)" name = "HTML"
description = "" description = ""
fileFormat = "HTML files (*.htm *.html)" fileFormat = "HTML files (*.htm *.html)"
icon = "text-html" icon = "text-html"
@ -134,12 +133,20 @@ class HTMLPandocImporter(pandocImporter):
class LaTeXPandocImporter(pandocImporter): class LaTeXPandocImporter(pandocImporter):
name = "LaTeX (pandoc)" name = "LaTeX"
description = "" description = ""
fileFormat = "LaTeX files (*.tex)" fileFormat = "LaTeX files (*.tex)"
icon = "text-x-tex" icon = "text-x-tex"
formatFrom = "latex" formatFrom = "latex"
class OPMLPandocImporter(pandocImporter):
name = "OPML"
description = ""
fileFormat = "OPML files (*.opml *.xml)"
icon = "text-x-opml+xml"
formatFrom = "opml"

View file

@ -59,6 +59,13 @@ class generalSettings(QWidget, Ui_generalSettings):
return "0" # 0 is root's ID 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): def trimLongTitles(self):
return self.chkGeneralTrimTitles.isChecked() return self.chkGeneralTrimTitles.isChecked()

View file

@ -39,14 +39,14 @@ class Ui_generalSettings(object):
self.chkGeneralSplitScenes = QtWidgets.QCheckBox(self.general) self.chkGeneralSplitScenes = QtWidgets.QCheckBox(self.general)
self.chkGeneralSplitScenes.setEnabled(False) self.chkGeneralSplitScenes.setEnabled(False)
self.chkGeneralSplitScenes.setObjectName("chkGeneralSplitScenes") 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 = QtWidgets.QLineEdit(self.general)
self.txtGeneralSplitScenes.setEnabled(False) self.txtGeneralSplitScenes.setEnabled(False)
self.txtGeneralSplitScenes.setObjectName("txtGeneralSplitScenes") 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 = QtWidgets.QCheckBox(self.general)
self.chkGeneralTrimTitles.setObjectName("chkGeneralTrimTitles") 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 = QtWidgets.QTreeView(self.general)
self.treeGeneralParent.setHeaderHidden(True) self.treeGeneralParent.setHeaderHidden(True)
self.treeGeneralParent.setObjectName("treeGeneralParent") self.treeGeneralParent.setObjectName("treeGeneralParent")
@ -54,6 +54,9 @@ class Ui_generalSettings(object):
self.chkGeneralParent = QtWidgets.QCheckBox(self.general) self.chkGeneralParent = QtWidgets.QCheckBox(self.general)
self.chkGeneralParent.setObjectName("chkGeneralParent") self.chkGeneralParent.setObjectName("chkGeneralParent")
self.formLayout_4.setWidget(0, QtWidgets.QFormLayout.SpanningRole, self.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.verticalLayout_5.addLayout(self.formLayout_4)
self.toolBox.addItem(self.general, "") self.toolBox.addItem(self.general, "")
self.verticalLayout_2.addWidget(self.toolBox) self.verticalLayout_2.addWidget(self.toolBox)
@ -69,5 +72,6 @@ class Ui_generalSettings(object):
self.chkGeneralSplitScenes.setText(_translate("generalSettings", "Split scenes at:")) self.chkGeneralSplitScenes.setText(_translate("generalSettings", "Split scenes at:"))
self.chkGeneralTrimTitles.setText(_translate("generalSettings", "Trim long titles (> 32 chars)")) self.chkGeneralTrimTitles.setText(_translate("generalSettings", "Trim long titles (> 32 chars)"))
self.chkGeneralParent.setText(_translate("generalSettings", "Import under:")) 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")) self.toolBox.setItemText(self.toolBox.indexOf(self.general), _translate("generalSettings", "General"))

View file

@ -78,7 +78,7 @@ QToolBox::tab:selected, QToolBox::tab:hover{
<property name="rowWrapPolicy"> <property name="rowWrapPolicy">
<enum>QFormLayout::WrapLongRows</enum> <enum>QFormLayout::WrapLongRows</enum>
</property> </property>
<item row="2" column="0"> <item row="3" column="0">
<widget class="QCheckBox" name="chkGeneralSplitScenes"> <widget class="QCheckBox" name="chkGeneralSplitScenes">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
@ -88,14 +88,14 @@ QToolBox::tab:selected, QToolBox::tab:hover{
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="1"> <item row="3" column="1">
<widget class="QLineEdit" name="txtGeneralSplitScenes"> <widget class="QLineEdit" name="txtGeneralSplitScenes">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="0" colspan="2"> <item row="4" column="0" colspan="2">
<widget class="QCheckBox" name="chkGeneralTrimTitles"> <widget class="QCheckBox" name="chkGeneralTrimTitles">
<property name="text"> <property name="text">
<string>Trim long titles (&gt; 32 chars)</string> <string>Trim long titles (&gt; 32 chars)</string>
@ -116,6 +116,13 @@ QToolBox::tab:selected, QToolBox::tab:hover{
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0">
<widget class="QCheckBox" name="chkGeneralTopLevel">
<property name="text">
<string>Import in a top-level folder</string>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
</layout> </layout>

View file

@ -12,7 +12,7 @@ from manuskript.ui.importers.importer_ui import Ui_importer
from manuskript.ui.importers.generalSettings import generalSettings from manuskript.ui.importers.generalSettings import generalSettings
from manuskript.ui import style from manuskript.ui import style
from manuskript import importer from manuskript import importer
from manuskript.models.outlineModel import outlineModel from manuskript.models.outlineModel import outlineModel, outlineItem
from manuskript.enums import Outline from manuskript.enums import Outline
from manuskript.exporter.pandoc import pandocExporter from manuskript.exporter.pandoc import pandocExporter
@ -67,7 +67,21 @@ class importerDialog(QWidget, Ui_importer):
def addFormat(name, icon): def addFormat(name, icon):
self.cmbImporters.addItem(QIcon.fromTheme(icon), name) 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: for f in self.importers:
# Header
if f.engine != lastEngine:
addHeader(f.engine)
lastEngine = f.engine
addFormat(f.name, f.icon) addFormat(f.name, f.icon)
if not f.isValid(): if not f.isValid():
item = self.cmbImporters.model().item(self.cmbImporters.count() - 1) 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", "Install pandoc to import from much more formats",
"::URL::http://pandoc.org/installing.html") "::URL::http://pandoc.org/installing.html")
self.cmbImporters.setCurrentIndex(1)
def currentFormat(self): def currentFormat(self):
formatName = self.cmbImporters.currentText() formatName = self.cmbImporters.currentText()
if self.cmbImporters.currentData() == "header":
return None
F = [F for F in self.importers if F.name == formatName][0] F = [F for F in self.importers if F.name == formatName][0]
# We instantiate the class # We instantiate the class
return F() return F()
@ -162,15 +182,18 @@ class importerDialog(QWidget, Ui_importer):
F = self.currentFormat() F = self.currentFormat()
self._format = F 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() self.settingsWidget = generalSettings()
#TODO: custom format widget #TODO: custom format widget
self.settingsWidget = F.settingsWidget(self.settingsWidget) 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 # Set the settings widget in place
self.setGroupWidget(self.grpSettings, self.settingsWidget) self.setGroupWidget(self.grpSettings, self.settingsWidget)
self.grpSettings.setMinimumWidth(200) self.grpSettings.setMinimumWidth(200)
@ -245,6 +268,8 @@ class importerDialog(QWidget, Ui_importer):
necessary. necessary.
""" """
items = []
# We find the current selected format # We find the current selected format
F = self._format F = self._format
@ -252,11 +277,20 @@ class importerDialog(QWidget, Ui_importer):
ID = self.settingsWidget.importUnderID() ID = self.settingsWidget.importUnderID()
parentItem = outlineModel.getItemByID(ID) 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 # Calling the importer
items = F.startImport(self.fileName, rItems = F.startImport(self.fileName,
parentItem, parentItem,
self.settingsWidget) self.settingsWidget)
items.extend(rItems)
# Do transformations # Do transformations
items = self.doTransformations(items) items = self.doTransformations(items)