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.pandocImporters import markdownPandocImporter, \
odtPandocImporter, ePubPandocImporter, docXPandocImporter, HTMLPandocImporter, \
rstPandocImporter, LaTeXPandocImporter
rstPandocImporter, LaTeXPandocImporter, OPMLPandocImporter
importers = [
# Internal
@ -22,4 +22,5 @@ importers = [
HTMLPandocImporter,
rstPandocImporter,
LaTeXPandocImporter,
OPMLPandocImporter,
]

View file

@ -24,6 +24,7 @@ class abstractImporter:
fileFormat = "" # File format accepted. For example: "OPML Files (*.opml)"
# For folder, use "<<folder>>"
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)

View file

@ -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),

View file

@ -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.<br/>&nbsp;"""))
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)

View file

@ -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", """(<code>auto</code>: wraps at
72 characters.<br>
<code>none</code>: no line wrap.<br>
<code>preserve</code>: tries to preserves line wrap from
the original document.
<br/>&nbsp;"""),
default="none")
vals="auto|none|preserve",
default="none",
tooltip=qApp.translate("Import", """<p>Should pandoc create
cosmetic / non-semantic line-breaks?</p><p>
<b>auto</b>: wraps at 72 characters.<br>
<b>none</b>: no line wrap.<br>
<b>preserve</b>: tries to preserves line wrap from the
original document.</p>"""))
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"

View file

@ -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()

View file

@ -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"))

View file

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