Exporter, everything ugly

This commit is contained in:
Olivier Keshavjee 2015-07-01 13:14:03 +02:00
parent 23b762c482
commit 5ed300929f
16 changed files with 6641 additions and 13 deletions

3
.gitignore vendored
View file

@ -5,4 +5,5 @@ snowflake*
*.msk
Notes.t2t
*.nja
src/pycallgraph.txt
src/pycallgraph.txt
ExportTest

View file

@ -3,6 +3,7 @@ FORMS += ../src/ui/settings.ui
FORMS += ../src/ui/welcome_ui.ui
FORMS += ../src/ui/sldImportance_ui.ui
FORMS += ../src/ui/cheatSheet_ui.ui
FORMS += ../src/ui/compileDialog_ui.ui
FORMS += ../src/ui/editors/editorWidget_ui.ui
@ -21,10 +22,13 @@ SOURCES += ../src/models/plotModel.py
SOURCES += ../src/models/persosModel.py
SOURCES += ../src/models/references.py
SOURCES += ../src/exporter/__init__.py
SOURCES += ../src/ui/helpLabel.py
SOURCES += ../src/ui/sldImportance.py
SOURCES += ../src/ui/welcome.py
SOURCES += ../src/ui/cheatSheet.py
SOURCES += ../src/ui/compileDialog.py
SOURCES += ../src/ui/editors/editorWidget.py
SOURCES += ../src/ui/editors/fullScreenEditor.py

5987
libs/txt2tags Normal file

File diff suppressed because it is too large Load diff

31
src/exporter/__init__.py Normal file
View file

@ -0,0 +1,31 @@
#!/usr/bin/env python
#--!-- coding: utf8 --!--
import collections
from qt import *
from .html import htmlExporter
from .arbo import arboExporter
from .odt import odtExporter
formats = collections.OrderedDict([
#Format
# Readable name
# Class
# QFileDialog filter
('html', (
qApp.translate("exporter", "HTML"),
htmlExporter,
qApp.translate("exporter", "HTML Document (*.html)"))),
('arbo', (
qApp.translate("exporter", "Arborescence"),
arboExporter,
None)),
('odt', (
qApp.translate("exporter", "OpenDocument (LibreOffice)"),
odtExporter,
qApp.translate("exporter", "OpenDocument (*.odt)"))),
('epub', (
"ePub (not yet)",
None,
None)),
])

53
src/exporter/arbo.py Normal file
View file

@ -0,0 +1,53 @@
#!/usr/bin/env python
#--!-- coding: utf8 --!--
from qt import *
from enums import *
from functions import *
class arboExporter():
requires = ["path"]
def __init__(self):
pass
def doCompile(self, path):
#FIXME: overwrites when items have identical names
mw = mainWindow()
root = mw.mdlOutline.rootItem
def writeItem(item, path):
if item.isFolder():
path2 = os.path.join(path, item.title())
try:
os.mkdir(path2)
except FileExistsError:
pass
for c in item.children():
writeItem(c, path2)
else:
ext = ".t2t" if item.isT2T() else \
".html" if item.isHTML() else \
".txt"
path2 = os.path.join(path, item.title() + ext)
f = open(path2, "w")
text = self.formatText(item.text(), item.type())
f.write(text)
for c in root.children():
writeItem(c, path)
def formatText(self, text, _type):
if _type == "t2t":
# Empty lines for headers
text = "\n\n\n" + text
return text

26
src/exporter/basic.py Normal file
View file

@ -0,0 +1,26 @@
#!/usr/bin/env python
#--!-- coding: utf8 --!--
from qt import *
from enums import *
from functions import *
import subprocess
class basicExporter():
def __init__(self):
pass
def runT2T(self, text, target="html"):
cmdl = ['txt2tags', '-t', target, '--enc=utf-8', '--no-headers', '-o', '-', '-']
cmd = subprocess.Popen(('echo', text), stdout=subprocess.PIPE)
try:
output = subprocess.check_output(cmdl, stdin=cmd.stdout, stderr=subprocess.STDOUT) # , cwd="/tmp"
except subprocess.CalledProcessError as e:
print("Error!")
return text
cmd.wait()
return output.decode("utf-8")

86
src/exporter/html.py Normal file
View file

@ -0,0 +1,86 @@
#!/usr/bin/env python
#--!-- coding: utf8 --!--
from qt import *
from enums import *
from functions import *
from exporter.basic import basicExporter
import subprocess
class htmlExporter(basicExporter):
requires = ["filename"]
def __init__(self):
pass
def doCompile(self, filename):
mw = mainWindow()
root = mw.mdlOutline.rootItem
html = ""
def appendItem(item):
if item.isFolder():
html = ""
title = "<h{l}>{t}</h{l}>\n".format(
l = str(item.level() + 1),
t = item.title())
html += title
for c in item.children():
html += appendItem(c)
return html
else:
text = self.formatText(item.text(), item.type())
return text
for c in root.children():
html += appendItem(c)
template = """<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>{TITLE}</title>
</head>
<body>
{BODY}
</body>
</html>"""
f = open(filename, "w")
f.write(template.format(
TITLE="FIXME",
BODY=html))
def formatText(self, text, _type):
if not text:
return text
if _type == "t2t":
text = self.runT2T(text)
elif _type == "txt":
text = text.replace("\n", "<br>")
return text + "<br>"
def runT2T(self, text, target="html"):
cmdl = ['txt2tags', '-t', target, '--enc=utf-8', '--no-headers', '-o', '-', '-']
cmd = subprocess.Popen(('echo', text), stdout=subprocess.PIPE)
try:
output = subprocess.check_output(cmdl, stdin=cmd.stdout, stderr=subprocess.STDOUT) # , cwd="/tmp"
except subprocess.CalledProcessError as e:
print("Error!")
return text
cmd.wait()
return output.decode("utf-8")

58
src/exporter/odt.py Normal file
View file

@ -0,0 +1,58 @@
#!/usr/bin/env python
#--!-- coding: utf8 --!--
from qt import *
from enums import *
from functions import *
from exporter.basic import basicExporter
class odtExporter(basicExporter):
requires = ["filename"]
def __init__(self):
pass
def doCompile(self, filename):
mw = mainWindow()
root = mw.mdlOutline.rootItem
doc = QTextDocument()
cursor = QTextCursor(doc)
def appendItem(item):
if item.isFolder():
cursor.setPosition(doc.characterCount() - 1)
title = "<h{l}>{t}</h{l}><br>\n".format(
l = str(item.level() + 1),
t = item.title())
cursor.insertHtml(title)
for c in item.children():
appendItem(c)
else:
text = self.formatText(item.text(), item.type())
cursor.setPosition(doc.characterCount() - 1)
cursor.insertHtml(text)
for c in root.children():
appendItem(c)
dw = QTextDocumentWriter(filename, "odt")
dw.write(doc)
def formatText(self, text, _type):
if not text:
return text
if _type == "t2t":
text = self.runT2T(text)
elif _type == "txt":
text = text.replace("\n", "<br>")
return text + "<br>"

View file

@ -5,6 +5,7 @@ from qt import *
from ui.mainWindow import *
from ui.helpLabel import helpLabel
from ui.compileDialog import compileDialog
from loadSave import *
from enums import *
from models.outlineModel import *
@ -82,6 +83,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.actOpen.triggered.connect(self.welcome.openFile)
self.actSave.triggered.connect(self.saveDatas)
self.actSaveAs.triggered.connect(self.welcome.saveAsFile)
self.actCompile.triggered.connect(self.doCompile)
self.actLabels.triggered.connect(self.settingsLabel)
self.actStatus.triggered.connect(self.settingsStatus)
self.actSettings.triggered.connect(self.settingsWindow)
@ -1070,4 +1072,13 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.mainEditor.updateTreeView()
self.treePlanOutline.viewport().update()
if item == "Tree":
self.treeRedacOutline.viewport().update()
self.treeRedacOutline.viewport().update()
###############################################################################
# COMPILE
###############################################################################
def doCompile(self):
self.compileDialog = compileDialog()
self.compileDialog.show()

View file

@ -619,6 +619,9 @@ class outlineItem():
def isText(self):
return self._data[Outline.type] == "txt"
def text(self):
return self.data(Outline.text.value)
def compile(self):
if self._data[Outline.compile] in ["0", 0]:
return False

107
src/ui/compileDialog.py Normal file
View file

@ -0,0 +1,107 @@
#!/usr/bin/env python
#--!-- coding: utf8 --!--
from qt import *
from enums import *
from models.outlineModel import *
from ui.compileDialog_ui import *
from functions import *
import os
import exporter
class compileDialog(QDialog, Ui_compileDialog):
def __init__(self, parent=None):
QDialog.__init__(self, parent)
self.setupUi(self)
self.btnPath.clicked.connect(self.getPath)
self.btnFilename.clicked.connect(self.getFilename)
self.btnCompile.clicked.connect(self.doCompile)
self.cmbTargets.activated.connect(self.updateUI)
self.txtPath.setText("/home/olivier/Documents/Travail/Geekeries/Python/manuskript/ExportTest")
self.txtFilename.setText("/home/olivier/Documents/Travail/Geekeries/Python/manuskript/ExportTest/test.html")
self.populatesTarget()
self.updateUI()
###############################################################################
# UI
###############################################################################
def populatesTarget(self):
for code in exporter.formats:
self.cmbTargets.addItem(exporter.formats[code][0], code)
def updateUI(self):
target = self.cmbTargets.currentData()
if not exporter.formats[target][1]:
self.btnCompile.setEnabled(False)
requires = []
else:
self.btnCompile.setEnabled(True)
requires = exporter.formats[target][1].requires
self.wPath.setVisible("path" in requires)
self.wFilename.setVisible("filename" in requires)
def startWorking(self):
# Setting override cursor
qApp.setOverrideCursor(Qt.WaitCursor)
# Button
self.btnCompile.setEnabled(False)
self.txtBtn = self.btnCompile.text()
self.btnCompile.setText(self.tr("Working..."))
def stopWorking(self):
# Removing override cursor
qApp.restoreOverrideCursor()
# Button
self.btnCompile.setEnabled(True)
self.btnCompile.setText(self.txtBtn)
###############################################################################
# USER INPUTS
###############################################################################
def getPath(self):
path = self.txtPath.text()
path = QFileDialog.getExistingDirectory(self, self.tr("Chose export folder"), path)
if path:
self.txtPath.setText(path)
def getFilename(self):
fn = self.txtFilename.text()
target = self.cmbTargets.currentData()
fltr = exporter.formats[target][2]
fn = QFileDialog.getSaveFileName(self, self.tr("Chose export target"), fn, fltr)
if fn[0]:
self.txtFilename.setText(fn[0])
###############################################################################
# COMPILE
###############################################################################
def doCompile(self):
target = self.cmbTargets.currentData()
self.startWorking()
if target == "arbo":
compiler = exporter.formats[target][1]()
compiler.doCompile(self.txtPath.text())
elif target in ["html", "odt"]:
compiler = exporter.formats[target][1]()
compiler.doCompile(self.txtFilename.text())
self.stopWorking()

View file

@ -0,0 +1,88 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'src/ui/compileDialog_ui.ui'
#
# Created by: PyQt5 UI code generator 5.4.1
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_compileDialog(object):
def setupUi(self, compileDialog):
compileDialog.setObjectName("compileDialog")
compileDialog.resize(627, 343)
compileDialog.setModal(True)
self.verticalLayout = QtWidgets.QVBoxLayout(compileDialog)
self.verticalLayout.setObjectName("verticalLayout")
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem)
self.label = QtWidgets.QLabel(compileDialog)
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
self.cmbTargets = QtWidgets.QComboBox(compileDialog)
self.cmbTargets.setObjectName("cmbTargets")
self.horizontalLayout.addWidget(self.cmbTargets)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem1)
self.verticalLayout.addLayout(self.horizontalLayout)
self.wPath = QtWidgets.QWidget(compileDialog)
self.wPath.setObjectName("wPath")
self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.wPath)
self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.label_2 = QtWidgets.QLabel(self.wPath)
self.label_2.setObjectName("label_2")
self.horizontalLayout_3.addWidget(self.label_2)
self.txtPath = QtWidgets.QLineEdit(self.wPath)
self.txtPath.setObjectName("txtPath")
self.horizontalLayout_3.addWidget(self.txtPath)
self.btnPath = QtWidgets.QPushButton(self.wPath)
self.btnPath.setObjectName("btnPath")
self.horizontalLayout_3.addWidget(self.btnPath)
self.verticalLayout.addWidget(self.wPath)
self.wFilename = QtWidgets.QWidget(compileDialog)
self.wFilename.setObjectName("wFilename")
self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.wFilename)
self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_4.setObjectName("horizontalLayout_4")
self.label_3 = QtWidgets.QLabel(self.wFilename)
self.label_3.setObjectName("label_3")
self.horizontalLayout_4.addWidget(self.label_3)
self.txtFilename = QtWidgets.QLineEdit(self.wFilename)
self.txtFilename.setObjectName("txtFilename")
self.horizontalLayout_4.addWidget(self.txtFilename)
self.btnFilename = QtWidgets.QPushButton(self.wFilename)
self.btnFilename.setObjectName("btnFilename")
self.horizontalLayout_4.addWidget(self.btnFilename)
self.verticalLayout.addWidget(self.wFilename)
spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout.addItem(spacerItem2)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout_2.addItem(spacerItem3)
self.btnCompile = QtWidgets.QPushButton(compileDialog)
self.btnCompile.setObjectName("btnCompile")
self.horizontalLayout_2.addWidget(self.btnCompile)
self.btnCancel = QtWidgets.QPushButton(compileDialog)
self.btnCancel.setObjectName("btnCancel")
self.horizontalLayout_2.addWidget(self.btnCancel)
self.verticalLayout.addLayout(self.horizontalLayout_2)
self.retranslateUi(compileDialog)
QtCore.QMetaObject.connectSlotsByName(compileDialog)
def retranslateUi(self, compileDialog):
_translate = QtCore.QCoreApplication.translate
compileDialog.setWindowTitle(_translate("compileDialog", "Dialog"))
self.label.setText(_translate("compileDialog", "Compile as:"))
self.label_2.setText(_translate("compileDialog", "Folder:"))
self.btnPath.setText(_translate("compileDialog", "..."))
self.label_3.setText(_translate("compileDialog", "File name:"))
self.btnFilename.setText(_translate("compileDialog", "..."))
self.btnCompile.setText(_translate("compileDialog", "Compile"))
self.btnCancel.setText(_translate("compileDialog", "Cancel"))

154
src/ui/compileDialog_ui.ui Normal file
View file

@ -0,0 +1,154 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>compileDialog</class>
<widget class="QDialog" name="compileDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>627</width>
<height>343</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<property name="modal">
<bool>true</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Compile as:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="cmbTargets"/>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QWidget" name="wPath" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Folder:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="txtPath"/>
</item>
<item>
<widget class="QPushButton" name="btnPath">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="wFilename" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>File name:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="txtFilename"/>
</item>
<item>
<widget class="QPushButton" name="btnFilename">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="btnCompile">
<property name="text">
<string>Compile</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnCancel">
<property name="text">
<string>Cancel</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View file

@ -1019,12 +1019,16 @@ class Ui_MainWindow(object):
icon = QtGui.QIcon.fromTheme("window-close")
self.actCloseProject.setIcon(icon)
self.actCloseProject.setObjectName("actCloseProject")
self.actCompile = QtWidgets.QAction(MainWindow)
self.actCompile.setObjectName("actCompile")
self.menuFile.addAction(self.actOpen)
self.menuFile.addAction(self.menuRecents.menuAction())
self.menuFile.addAction(self.actSave)
self.menuFile.addAction(self.actSaveAs)
self.menuFile.addAction(self.actCloseProject)
self.menuFile.addSeparator()
self.menuFile.addAction(self.actCompile)
self.menuFile.addSeparator()
self.menuFile.addAction(self.actQuit)
self.menuMode.addAction(self.actModeNorma)
self.menuMode.addAction(self.actModeSimple)
@ -1168,18 +1172,20 @@ class Ui_MainWindow(object):
self.actSettings.setText(_translate("MainWindow", "Settings"))
self.actSettings.setShortcut(_translate("MainWindow", "F8"))
self.actCloseProject.setText(_translate("MainWindow", "Close project"))
self.actCompile.setText(_translate("MainWindow", "Compile"))
self.actCompile.setShortcut(_translate("MainWindow", "F6"))
from ui.editors.mainEditor import mainEditor
from ui.views.metadataView import metadataView
from ui.views.persoTreeView import persoTreeView
from ui.cheatSheet import cheatSheet
from ui.search import search
from ui.views.outlineView import outlineView
from ui.collapsibleGroupBox2 import collapsibleGroupBox2
from ui.views.persoTreeView import persoTreeView
from ui.sldImportance import sldImportance
from ui.views.basicItemView import basicItemView
from ui.views.treeView import treeView
from ui.cheatSheet import cheatSheet
from ui.views.plotTreeView import plotTreeView
from ui.welcome import welcome
from ui.views.textEditView import textEditView
from ui.views.lineEditView import lineEditView
from ui.sldImportance import sldImportance
from ui.views.plotTreeView import plotTreeView
from ui.editors.mainEditor import mainEditor
from ui.collapsibleGroupBox2 import collapsibleGroupBox2
from ui.welcome import welcome
from ui.views.basicItemView import basicItemView
from ui.views.metadataView import metadataView
from ui.views.treeView import treeView
from ui.views.textEditView import textEditView

View file

@ -1795,6 +1795,8 @@
<addaction name="actSaveAs"/>
<addaction name="actCloseProject"/>
<addaction name="separator"/>
<addaction name="actCompile"/>
<addaction name="separator"/>
<addaction name="actQuit"/>
</widget>
<widget class="QMenu" name="menuMode">
@ -1996,6 +1998,14 @@
<string>Close project</string>
</property>
</action>
<action name="actCompile">
<property name="text">
<string>Compile</string>
</property>
<property name="shortcut">
<string>F6</string>
</property>
</action>
</widget>
<customwidgets>
<customwidget>

View file

@ -56,6 +56,9 @@ class plotTreeView(QTreeWidget):
if parent == QModelIndex():
self.updateItems()
elif self._showSubPlot:
self.updateItems()
def updateNames(self):
for i in range(self.topLevelItemCount()):
item = self.topLevelItem(i)