mirror of
https://github.com/olivierkes/manuskript.git
synced 2024-05-17 11:22:28 +12:00
Adds setting to manage word wrap, and enhances UI. #200
This commit is contained in:
parent
3cef130bc6
commit
24607bca59
|
@ -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,
|
||||
]
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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/> """))
|
||||
|
||||
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)
|
||||
|
||||
|
|
|
@ -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/> """),
|
||||
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"
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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"))
|
||||
|
||||
|
|
|
@ -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 (> 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>
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Reference in a new issue