Deleted the rest ov the convert submodule
This commit is contained in:
@@ -1,15 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
from nw.convert.file.concat import ConcatFile
|
|
||||||
from nw.convert.file.html import HtmlFile
|
|
||||||
from nw.convert.file.latex import LaTeXFile
|
|
||||||
from nw.convert.file.markdown import MarkdownFile
|
|
||||||
from nw.convert.file.text import TextFile
|
|
||||||
|
|
||||||
__all__ = [
|
|
||||||
"ConcatFile",
|
|
||||||
"HtmlFile",
|
|
||||||
"LaTeXFile",
|
|
||||||
"MarkdownFile",
|
|
||||||
"TextFile",
|
|
||||||
]
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
"""novelWriter Concatenated File
|
|
||||||
|
|
||||||
novelWriter – Concatenated File
|
|
||||||
=================================
|
|
||||||
Concatenate the standard novelWriter files to a single file
|
|
||||||
|
|
||||||
File History:
|
|
||||||
Created: 2019-10-26 [0.3.1]
|
|
||||||
|
|
||||||
This file is a part of novelWriter
|
|
||||||
Copyright 2020, Veronica Berglyd Olsen
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, but
|
|
||||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import logging
|
|
||||||
import nw
|
|
||||||
|
|
||||||
from os import path
|
|
||||||
|
|
||||||
from nw.convert.file.text import TextFile
|
|
||||||
from nw.convert.tokenizer import Tokenizer
|
|
||||||
from nw.constants import nwAlert
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
class ConcatFile(TextFile):
|
|
||||||
|
|
||||||
def __init__(self, theProject, theParent):
|
|
||||||
TextFile.__init__(self, theProject, theParent)
|
|
||||||
self.theConv = Tokenizer(self.theProject, self.theParent)
|
|
||||||
return
|
|
||||||
|
|
||||||
def addText(self, tHandle):
|
|
||||||
|
|
||||||
logger.verbose("Parsing content of item '%s'" % tHandle)
|
|
||||||
|
|
||||||
if not self.checkInclude(tHandle):
|
|
||||||
return False
|
|
||||||
|
|
||||||
self.theConv.setText(tHandle)
|
|
||||||
|
|
||||||
theResult = self.theConv.theText
|
|
||||||
|
|
||||||
if theResult is not None and self.outFile is not None:
|
|
||||||
self.outFile.write(theResult.rstrip())
|
|
||||||
self.outFile.write("\n\n")
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
##
|
|
||||||
# Internal Functions
|
|
||||||
##
|
|
||||||
|
|
||||||
def _doOpenFile(self, filePath):
|
|
||||||
try:
|
|
||||||
self.outFile = open(filePath,mode="wt+",encoding="utf8")
|
|
||||||
except Exception as e:
|
|
||||||
self.makeAlert(["Failed to open file.",str(e)], nwAlert.ERROR)
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
def _doCloseFile(self):
|
|
||||||
if self.outFile is not None:
|
|
||||||
self.outFile.close()
|
|
||||||
return True
|
|
||||||
|
|
||||||
# END Class ConcatFile
|
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
"""novelWriter HTML File
|
|
||||||
|
|
||||||
novelWriter – HTML File
|
|
||||||
=========================
|
|
||||||
Writes the project to a html file
|
|
||||||
|
|
||||||
File History:
|
|
||||||
Created: 2019-10-19 [0.3]
|
|
||||||
|
|
||||||
This file is a part of novelWriter
|
|
||||||
Copyright 2020, Veronica Berglyd Olsen
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, but
|
|
||||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import logging
|
|
||||||
import nw
|
|
||||||
|
|
||||||
from nw.convert.file.text import TextFile
|
|
||||||
from nw.convert.text.tohtml import ToHtml
|
|
||||||
from nw.constants import nwAlert
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
class HtmlFile(TextFile):
|
|
||||||
|
|
||||||
def __init__(self, theProject, theParent):
|
|
||||||
TextFile.__init__(self, theProject, theParent)
|
|
||||||
self.theConv = ToHtml(self.theProject, self.theParent)
|
|
||||||
return
|
|
||||||
|
|
||||||
##
|
|
||||||
# Internal Functions
|
|
||||||
##
|
|
||||||
|
|
||||||
def _doOpenFile(self, filePath):
|
|
||||||
try:
|
|
||||||
self.outFile = open(filePath,mode="wt+",encoding="utf8")
|
|
||||||
self.outFile.write("<!DOCTYPE html>\n")
|
|
||||||
self.outFile.write("<html>\n")
|
|
||||||
self.outFile.write("<head>\n")
|
|
||||||
self.outFile.write(" <meta charset='utf-8'>\n")
|
|
||||||
self.outFile.write(" <style>\n")
|
|
||||||
self.outFile.write(" #page {\n")
|
|
||||||
self.outFile.write(" margin: 40px auto;\n")
|
|
||||||
self.outFile.write(" max-width: 769px;\n")
|
|
||||||
self.outFile.write(" }\n")
|
|
||||||
self.outFile.write(" .comment {\n")
|
|
||||||
self.outFile.write(" background-color: #fbfabd;\n")
|
|
||||||
self.outFile.write(" border: 1px solid #b4b000;\n")
|
|
||||||
self.outFile.write(" margin: 10px 20px;\n")
|
|
||||||
self.outFile.write(" padding: 6px;\n")
|
|
||||||
self.outFile.write(" }\n")
|
|
||||||
self.outFile.write(" </style>\n")
|
|
||||||
self.outFile.write("</head>\n")
|
|
||||||
self.outFile.write("<body>\n")
|
|
||||||
self.outFile.write("<article id='page'>\n")
|
|
||||||
except Exception as e:
|
|
||||||
self.makeAlert(["Failed to open file.",str(e)], nwAlert.ERROR)
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
def _doCloseFile(self):
|
|
||||||
if self.outFile is not None:
|
|
||||||
self.outFile.write("</article>\n")
|
|
||||||
self.outFile.write("</body>\n")
|
|
||||||
self.outFile.write("</html>\n")
|
|
||||||
self.outFile.close()
|
|
||||||
return True
|
|
||||||
|
|
||||||
# END Class HtmlFile
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
"""novelWriter LaTeX File
|
|
||||||
|
|
||||||
novelWriter – LaTeX File
|
|
||||||
==========================
|
|
||||||
Writes the project to a LaTeX file
|
|
||||||
|
|
||||||
File History:
|
|
||||||
Created: 2019-10-24 [0.3.1]
|
|
||||||
|
|
||||||
This file is a part of novelWriter
|
|
||||||
Copyright 2020, Veronica Berglyd Olsen
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, but
|
|
||||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import logging
|
|
||||||
import nw
|
|
||||||
|
|
||||||
from nw.convert.file.text import TextFile
|
|
||||||
from nw.convert.text.tolatex import ToLaTeX
|
|
||||||
from nw.constants import nwAlert
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
class LaTeXFile(TextFile):
|
|
||||||
|
|
||||||
def __init__(self, theProject, theParent):
|
|
||||||
TextFile.__init__(self, theProject, theParent)
|
|
||||||
self.theConv = ToLaTeX(self.theProject, self.theParent)
|
|
||||||
self.texCodecFail = False
|
|
||||||
return
|
|
||||||
|
|
||||||
##
|
|
||||||
# Internal Functions
|
|
||||||
##
|
|
||||||
|
|
||||||
def _doOpenFile(self, filePath):
|
|
||||||
try:
|
|
||||||
self.outFile = open(filePath,mode="wt+",encoding="utf8")
|
|
||||||
self.outFile.write("\\documentclass[12pt]{report}\n")
|
|
||||||
self.outFile.write("\\usepackage[utf8]{inputenc}\n")
|
|
||||||
self.outFile.write("\\usepackage[T1]{fontenc}\n")
|
|
||||||
self.outFile.write("\n")
|
|
||||||
self.outFile.write("\\begin{document}\n")
|
|
||||||
except Exception as e:
|
|
||||||
self.makeAlert(["Failed to open file.",str(e)], nwAlert.ERROR)
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
def _doCloseFile(self):
|
|
||||||
if self.outFile is not None:
|
|
||||||
self.outFile.write("\\end{document}\n")
|
|
||||||
self.outFile.close()
|
|
||||||
self.texCodecFail = self.theConv.texCodecFail
|
|
||||||
return True
|
|
||||||
|
|
||||||
# END Class LaTeXFile
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
"""novelWriter Markdown File
|
|
||||||
|
|
||||||
novelWriter – Markdown File
|
|
||||||
=============================
|
|
||||||
Writes the project to a markdown file
|
|
||||||
|
|
||||||
File History:
|
|
||||||
Created: 2019-10-19 [0.3]
|
|
||||||
|
|
||||||
This file is a part of novelWriter
|
|
||||||
Copyright 2020, Veronica Berglyd Olsen
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, but
|
|
||||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import logging
|
|
||||||
import nw
|
|
||||||
|
|
||||||
from nw.convert.file.text import TextFile
|
|
||||||
from nw.convert.text.tomarkdown import ToMarkdown
|
|
||||||
from nw.constants import nwAlert
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
class MarkdownFile(TextFile):
|
|
||||||
|
|
||||||
def __init__(self, theProject, theParent):
|
|
||||||
TextFile.__init__(self, theProject, theParent)
|
|
||||||
self.theConv = ToMarkdown(self.theProject, self.theParent)
|
|
||||||
return
|
|
||||||
|
|
||||||
##
|
|
||||||
# Internal Functions
|
|
||||||
##
|
|
||||||
|
|
||||||
def _doOpenFile(self, filePath):
|
|
||||||
try:
|
|
||||||
self.outFile = open(filePath,mode="wt+",encoding="utf8")
|
|
||||||
except Exception as e:
|
|
||||||
self.makeAlert(["Failed to open file.",str(e)], nwAlert.ERROR)
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
def _doCloseFile(self):
|
|
||||||
if self.outFile is not None:
|
|
||||||
self.outFile.close()
|
|
||||||
return True
|
|
||||||
|
|
||||||
# END Class MarkdownFile
|
|
||||||
@@ -1,210 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
"""novelWriter Text File
|
|
||||||
|
|
||||||
novelWriter – Text File
|
|
||||||
=========================
|
|
||||||
Writes the project to a plain text file
|
|
||||||
|
|
||||||
File History:
|
|
||||||
Created: 2019-10-18 [0.2.3]
|
|
||||||
|
|
||||||
This file is a part of novelWriter
|
|
||||||
Copyright 2020, Veronica Berglyd Olsen
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, but
|
|
||||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import logging
|
|
||||||
import nw
|
|
||||||
|
|
||||||
from os import path
|
|
||||||
|
|
||||||
from PyQt5.QtWidgets import QMessageBox
|
|
||||||
|
|
||||||
from nw.convert.text.totext import ToText
|
|
||||||
from nw.constants import nwAlert, nwItemType, nwItemLayout, nwItemClass
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
class TextFile():
|
|
||||||
|
|
||||||
def __init__(self, theProject, theParent):
|
|
||||||
|
|
||||||
self.mainConf = nw.CONFIG
|
|
||||||
self.theProject = theProject
|
|
||||||
self.theParent = theParent
|
|
||||||
|
|
||||||
self.outFile = None
|
|
||||||
self.fileName = ""
|
|
||||||
self.theText = ""
|
|
||||||
self.expNovel = True
|
|
||||||
self.expNotes = False
|
|
||||||
|
|
||||||
self.theConv = ToText(self.theProject, self.theParent)
|
|
||||||
self.makeAlert = self.theParent.makeAlert
|
|
||||||
|
|
||||||
self.setComments(False)
|
|
||||||
self.setKeywords(False)
|
|
||||||
self.setWordWrap(80)
|
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
##
|
|
||||||
# Setters
|
|
||||||
##
|
|
||||||
|
|
||||||
def setExportNovel(self, doNovel):
|
|
||||||
self.expNovel = doNovel
|
|
||||||
return
|
|
||||||
|
|
||||||
def setExportNotes(self, doNotes):
|
|
||||||
self.expNotes = doNotes
|
|
||||||
return
|
|
||||||
|
|
||||||
def setComments(self, doComments):
|
|
||||||
self.theConv.setComments(doComments)
|
|
||||||
return
|
|
||||||
|
|
||||||
def setKeywords(self, doKeywords):
|
|
||||||
self.theConv.setKeywords(doKeywords)
|
|
||||||
return
|
|
||||||
|
|
||||||
def setWordWrap(self, wordWrap):
|
|
||||||
if wordWrap >= 0:
|
|
||||||
self.theConv.setWordWrap(wordWrap)
|
|
||||||
else:
|
|
||||||
self.theConv.setWordWrap(0)
|
|
||||||
return
|
|
||||||
|
|
||||||
def setTitleFormat(self, fmtTitle):
|
|
||||||
self.theConv.setTitleFormat(fmtTitle)
|
|
||||||
return
|
|
||||||
|
|
||||||
def setChapterFormat(self, fmtChapter):
|
|
||||||
self.theConv.setChapterFormat(fmtChapter)
|
|
||||||
return
|
|
||||||
|
|
||||||
def setUnNumberedFormat(self, fmtUnNum):
|
|
||||||
self.theConv.setUnNumberedFormat(fmtUnNum)
|
|
||||||
return
|
|
||||||
|
|
||||||
def setSceneFormat(self, fmtScene, hideScene):
|
|
||||||
self.theConv.setSceneFormat(fmtScene, hideScene)
|
|
||||||
return
|
|
||||||
|
|
||||||
def setSectionFormat(self, fmtSection, hideSection):
|
|
||||||
self.theConv.setSectionFormat(fmtSection, hideSection)
|
|
||||||
return
|
|
||||||
|
|
||||||
##
|
|
||||||
# Core Methods
|
|
||||||
##
|
|
||||||
|
|
||||||
def openFile(self, filePath):
|
|
||||||
|
|
||||||
self.fileName = path.basename(filePath)
|
|
||||||
if path.isfile(filePath) and self.mainConf.showGUI:
|
|
||||||
msgBox = QMessageBox()
|
|
||||||
msgRes = msgBox.question(self.theParent, "Overwrite", (
|
|
||||||
"File '%s' already exists.<br>Do you want to overwrite it?" % self.fileName
|
|
||||||
))
|
|
||||||
if msgRes != QMessageBox.Yes:
|
|
||||||
return False
|
|
||||||
|
|
||||||
self._doOpenFile(filePath)
|
|
||||||
|
|
||||||
if self.outFile is None:
|
|
||||||
return False
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
def closeFile(self):
|
|
||||||
self._doCloseFile()
|
|
||||||
return True
|
|
||||||
|
|
||||||
def addText(self, tHandle):
|
|
||||||
|
|
||||||
logger.verbose("Parsing content of item '%s'" % tHandle)
|
|
||||||
|
|
||||||
if not self.checkInclude(tHandle):
|
|
||||||
return False
|
|
||||||
|
|
||||||
self.theConv.setText(tHandle)
|
|
||||||
self.theConv.doAutoReplace()
|
|
||||||
self.theConv.tokenizeText()
|
|
||||||
self.theConv.formatHeaders()
|
|
||||||
self.theConv.doConvert()
|
|
||||||
self.theConv.doPostProcessing()
|
|
||||||
|
|
||||||
if self.theConv.theResult is not None and self.outFile is not None:
|
|
||||||
self.outFile.write(self.theConv.theResult)
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
def checkInclude(self, tHandle):
|
|
||||||
"""This function checks whether a file should be included in the
|
|
||||||
export or not. For standard note and novel files, this is
|
|
||||||
controlled by the options selected by the user. For other files
|
|
||||||
classified as non-exportable, a few checks must be made, and the
|
|
||||||
following are not:
|
|
||||||
* Items that are not actual files.
|
|
||||||
* Items that have been orphaned which are tagged as NO_LAYOUT
|
|
||||||
and NO_CLASS.
|
|
||||||
* Items that appear in the TRASH folder
|
|
||||||
"""
|
|
||||||
|
|
||||||
theItem = self.theProject.projTree[tHandle]
|
|
||||||
isNone = theItem.itemType != nwItemType.FILE
|
|
||||||
isNone |= theItem.itemLayout == nwItemLayout.NO_LAYOUT
|
|
||||||
isNone |= theItem.itemClass == nwItemClass.NO_CLASS
|
|
||||||
isNone |= theItem.itemClass == nwItemClass.TRASH
|
|
||||||
isNone |= theItem.parHandle == self.theProject.projTree.trashRoot()
|
|
||||||
isNote = theItem.itemLayout == nwItemLayout.NOTE
|
|
||||||
isNovel = not isNone and not isNote
|
|
||||||
|
|
||||||
if isNone:
|
|
||||||
return False
|
|
||||||
if isNote and not self.expNotes:
|
|
||||||
return False
|
|
||||||
if isNovel and not self.expNovel:
|
|
||||||
return False
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
##
|
|
||||||
# Internal Functions
|
|
||||||
##
|
|
||||||
|
|
||||||
def _doOpenFile(self, filePath):
|
|
||||||
"""This function does the actual opening of the file, and can be
|
|
||||||
overloaded by a subclass that uses a different file format that
|
|
||||||
requires a different approach.
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
self.outFile = open(filePath,mode="wt+",encoding="utf8")
|
|
||||||
self.outFile.write("\n\n")
|
|
||||||
except Exception as e:
|
|
||||||
self.makeAlert(["Failed to open file.",str(e)], nwAlert.ERROR)
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
def _doCloseFile(self):
|
|
||||||
"""This function closes the file, and is meant to be overloaded
|
|
||||||
by the subclass for other file formats.
|
|
||||||
"""
|
|
||||||
if self.outFile is not None:
|
|
||||||
self.outFile.close()
|
|
||||||
return True
|
|
||||||
|
|
||||||
# END Class OutFile
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
from nw.convert.text.tohtml import ToHtml
|
|
||||||
from nw.convert.text.tolatex import ToLaTeX
|
|
||||||
from nw.convert.text.tomarkdown import ToMarkdown
|
|
||||||
from nw.convert.text.totext import ToText
|
|
||||||
|
|
||||||
__all__ = [
|
|
||||||
"ToHtml",
|
|
||||||
"ToLaTeX",
|
|
||||||
"ToMarkdown",
|
|
||||||
"ToText",
|
|
||||||
]
|
|
||||||
@@ -1,155 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
"""novelWriter LaTeX Converter
|
|
||||||
|
|
||||||
novelWriter – LaTeX Converter
|
|
||||||
===============================
|
|
||||||
Extends the Tokenizer class to write LaTeX
|
|
||||||
|
|
||||||
File History:
|
|
||||||
Created: 2019-10-24 [0.3.1]
|
|
||||||
|
|
||||||
This file is a part of novelWriter
|
|
||||||
Copyright 2020, Veronica Berglyd Olsen
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, but
|
|
||||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import logging
|
|
||||||
import codecs
|
|
||||||
import re
|
|
||||||
import nw
|
|
||||||
|
|
||||||
from nw.convert.tokenizer import Tokenizer
|
|
||||||
from nw.constants import nwUnicode
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
class ToLaTeX(Tokenizer):
|
|
||||||
|
|
||||||
def __init__(self, theProject, theParent):
|
|
||||||
Tokenizer.__init__(self, theProject, theParent)
|
|
||||||
self.texCodecFail = False
|
|
||||||
return
|
|
||||||
|
|
||||||
def doPostProcessing(self):
|
|
||||||
"""The latexcodec misses dashes and non-breaking spaces, so we
|
|
||||||
do those here.
|
|
||||||
"""
|
|
||||||
|
|
||||||
repDict = {
|
|
||||||
nwUnicode.U_ENDASH : "--",
|
|
||||||
nwUnicode.U_EMDASH : "---",
|
|
||||||
nwUnicode.U_NBSP : "~",
|
|
||||||
}
|
|
||||||
xRep = re.compile("|".join([re.escape(k) for k in repDict.keys()]), flags=re.DOTALL)
|
|
||||||
self.theResult = xRep.sub(lambda x: repDict[x.group(0)], self.theResult)
|
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
def doConvert(self):
|
|
||||||
|
|
||||||
texTags = {
|
|
||||||
self.FMT_B_B : r"\textbf{",
|
|
||||||
self.FMT_B_E : r"}",
|
|
||||||
self.FMT_I_B : r"\textit{",
|
|
||||||
self.FMT_I_E : r"}",
|
|
||||||
self.FMT_U_B : r"\underline{",
|
|
||||||
self.FMT_U_E : r"}",
|
|
||||||
}
|
|
||||||
|
|
||||||
self.theResult = ""
|
|
||||||
thisPar = []
|
|
||||||
for tType, tText, tFormat, tAlign in self.theTokens:
|
|
||||||
|
|
||||||
begText = ""
|
|
||||||
endText = "\n"
|
|
||||||
if tAlign == self.A_CENTRE:
|
|
||||||
begText = "\\begin{center}\n"
|
|
||||||
endText = "\\end{center}\n\n"
|
|
||||||
|
|
||||||
# First check if we have a comment or plain text, as they
|
|
||||||
# need some extra replacing before we proceed to wrapping
|
|
||||||
# and final formatting.
|
|
||||||
if tType == self.T_COMMENT:
|
|
||||||
tText = "%% %s" % tText
|
|
||||||
|
|
||||||
elif tType == self.T_TEXT:
|
|
||||||
tTemp = tText
|
|
||||||
for xPos, xLen, xFmt in reversed(tFormat):
|
|
||||||
tTemp = tTemp[:xPos]+texTags[xFmt]+tTemp[xPos+xLen:]
|
|
||||||
tText = tTemp
|
|
||||||
|
|
||||||
tLen = len(tText)
|
|
||||||
|
|
||||||
# Then the text can receive final formatting before we
|
|
||||||
# append it to the results. We also store text lines in a
|
|
||||||
# buffer and merge them only when we find an empty line
|
|
||||||
# indicating a new paragraph.
|
|
||||||
if tType == self.T_EMPTY:
|
|
||||||
if len(thisPar) > 0:
|
|
||||||
self.theResult += begText
|
|
||||||
for tTemp in thisPar:
|
|
||||||
self.theResult += "%s\n" % tTemp
|
|
||||||
self.theResult += endText
|
|
||||||
thisPar = []
|
|
||||||
|
|
||||||
elif tType == self.T_HEAD1:
|
|
||||||
self.theResult += begText
|
|
||||||
self.theResult += "{\\Huge %s}\n" % self._escapeUnicode(tText)
|
|
||||||
self.theResult += endText
|
|
||||||
|
|
||||||
elif tType == self.T_HEAD2:
|
|
||||||
self.theResult += "\\chapter*{%s}\n\n" % self._escapeUnicode(tText)
|
|
||||||
|
|
||||||
elif tType == self.T_HEAD3:
|
|
||||||
self.theResult += "\\section*{%s}\n\n" % self._escapeUnicode(tText)
|
|
||||||
|
|
||||||
elif tType == self.T_HEAD4:
|
|
||||||
self.theResult += "\\subsection*{%s}\n\n" % self._escapeUnicode(tText)
|
|
||||||
|
|
||||||
elif tType == self.T_SEP:
|
|
||||||
self.theResult += begText
|
|
||||||
self.theResult += "%s\n" % self._escapeUnicode(tText)
|
|
||||||
self.theResult += endText
|
|
||||||
|
|
||||||
elif tType == self.T_SKIP:
|
|
||||||
self.theResult += "\\bigskip\n"
|
|
||||||
self.theResult += "\\bigskip\n\n"
|
|
||||||
|
|
||||||
elif tType == self.T_TEXT:
|
|
||||||
if tText.endswith(" "):
|
|
||||||
thisPar.append(self._escapeUnicode(tText.rstrip())+"\\newline")
|
|
||||||
else:
|
|
||||||
thisPar.append(self._escapeUnicode(tText.rstrip()))
|
|
||||||
|
|
||||||
elif tType == self.T_PBREAK:
|
|
||||||
self.theResult += "\\newpage\n\n"
|
|
||||||
|
|
||||||
elif tType == self.T_COMMENT and self.doComments:
|
|
||||||
self.theResult += "%s\n\n" % tText
|
|
||||||
|
|
||||||
elif tType == self.T_KEYWORD and self.doKeywords:
|
|
||||||
self.theResult += "%% @%s\n\n" % tText
|
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
def _escapeUnicode(self, theText):
|
|
||||||
try:
|
|
||||||
import latexcodec
|
|
||||||
return codecs.encode(theText, "ulatex+utf8")
|
|
||||||
except:
|
|
||||||
self.texCodecFail = True
|
|
||||||
return theText
|
|
||||||
|
|
||||||
# END Class ToLaTeX
|
|
||||||
@@ -1,136 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
"""novelWriter Markdown Text Converter
|
|
||||||
|
|
||||||
novelWriter – Markdown Text Converter
|
|
||||||
=======================================
|
|
||||||
Extends the Tokenizer class to write Markdown
|
|
||||||
|
|
||||||
File History:
|
|
||||||
Created: 2019-10-19 [0.3]
|
|
||||||
|
|
||||||
This file is a part of novelWriter
|
|
||||||
Copyright 2020, Veronica Berglyd Olsen
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, but
|
|
||||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import textwrap
|
|
||||||
import logging
|
|
||||||
import re
|
|
||||||
import nw
|
|
||||||
|
|
||||||
from nw.convert.tokenizer import Tokenizer
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
class ToMarkdown(Tokenizer):
|
|
||||||
|
|
||||||
def __init__(self, theProject, theParent):
|
|
||||||
Tokenizer.__init__(self, theProject, theParent)
|
|
||||||
return
|
|
||||||
|
|
||||||
def doConvert(self):
|
|
||||||
|
|
||||||
mdTags = {
|
|
||||||
self.FMT_B_B : "**",
|
|
||||||
self.FMT_B_E : "**",
|
|
||||||
self.FMT_I_B : "_",
|
|
||||||
self.FMT_I_E : "_",
|
|
||||||
self.FMT_U_B : "__",
|
|
||||||
self.FMT_U_E : "__",
|
|
||||||
}
|
|
||||||
|
|
||||||
if self.wordWrap > 0:
|
|
||||||
tWrap = textwrap.TextWrapper(
|
|
||||||
width = self.wordWrap,
|
|
||||||
initial_indent = "",
|
|
||||||
subsequent_indent = "",
|
|
||||||
expand_tabs = True,
|
|
||||||
replace_whitespace = True,
|
|
||||||
fix_sentence_endings = False,
|
|
||||||
break_long_words = True,
|
|
||||||
drop_whitespace = True,
|
|
||||||
break_on_hyphens = True,
|
|
||||||
tabsize = 8,
|
|
||||||
max_lines = None
|
|
||||||
)
|
|
||||||
|
|
||||||
self.theResult = ""
|
|
||||||
thisPar = []
|
|
||||||
for tType, tText, tFormat, tAlign in self.theTokens:
|
|
||||||
|
|
||||||
# First check if we have a comment or plain text, as they
|
|
||||||
# need some extra replacing before we proceed to wrapping
|
|
||||||
# and final formatting.
|
|
||||||
if tType == self.T_COMMENT:
|
|
||||||
tText = " %s" % tText
|
|
||||||
|
|
||||||
elif tType == self.T_TEXT:
|
|
||||||
tTemp = tText
|
|
||||||
for xPos, xLen, xFmt in reversed(tFormat):
|
|
||||||
tTemp = tTemp[:xPos]+mdTags[xFmt]+tTemp[xPos+xLen:]
|
|
||||||
tText = tTemp
|
|
||||||
|
|
||||||
tLen = len(tText)
|
|
||||||
|
|
||||||
# The text can now be word wrapped, if we have requested
|
|
||||||
# this and it's needed.
|
|
||||||
if self.wordWrap > 0 and tLen > self.wordWrap:
|
|
||||||
if tType == self.T_COMMENT:
|
|
||||||
tText = textwrap.fill(
|
|
||||||
tText.strip(),initial_indent=" ",subsequent_indent=" "
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
tText = tWrap.fill(tText)
|
|
||||||
|
|
||||||
# Then the text can receive final formatting before we
|
|
||||||
# append it to the results. We also store text lines in a
|
|
||||||
# buffer and merge them only when we find an empty line,
|
|
||||||
# indicating a new paragraph.
|
|
||||||
if tType == self.T_EMPTY:
|
|
||||||
if len(thisPar) > 0:
|
|
||||||
tTemp = "\n".join(thisPar)
|
|
||||||
self.theResult += "%s\n\n" % tTemp.rstrip()
|
|
||||||
thisPar = []
|
|
||||||
|
|
||||||
elif tType == self.T_HEAD1:
|
|
||||||
self.theResult += "# %s\n\n" % tText
|
|
||||||
|
|
||||||
elif tType == self.T_HEAD2:
|
|
||||||
self.theResult += "## %s\n\n" % tText
|
|
||||||
|
|
||||||
elif tType == self.T_HEAD3:
|
|
||||||
self.theResult += "### %s\n\n" % tText
|
|
||||||
|
|
||||||
elif tType == self.T_HEAD4:
|
|
||||||
self.theResult += "#### %s\n\n" % tText
|
|
||||||
|
|
||||||
elif tType == self.T_SEP:
|
|
||||||
self.theResult += "%s\n\n" % tText
|
|
||||||
|
|
||||||
elif tType == self.T_SKIP:
|
|
||||||
self.theResult += "\n\n\n"
|
|
||||||
|
|
||||||
elif tType == self.T_TEXT:
|
|
||||||
thisPar.append(tText)
|
|
||||||
|
|
||||||
elif tType == self.T_COMMENT and self.doComments:
|
|
||||||
self.theResult += "%s\n\n" % tText
|
|
||||||
|
|
||||||
elif tType == self.T_KEYWORD and self.doKeywords:
|
|
||||||
self.theResult += "%s\n\n" % tText
|
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
# END Class ToMarkdown
|
|
||||||
@@ -1,154 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
"""novelWriter Plain Text Converter
|
|
||||||
|
|
||||||
novelWriter – Plain Text Converter
|
|
||||||
====================================
|
|
||||||
Extends the Tokenizer class to convert to plain text
|
|
||||||
|
|
||||||
File History:
|
|
||||||
Created: 2019-10-26 [0.3.1]
|
|
||||||
|
|
||||||
This file is a part of novelWriter
|
|
||||||
Copyright 2020, Veronica Berglyd Olsen
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, but
|
|
||||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import textwrap
|
|
||||||
import logging
|
|
||||||
import re
|
|
||||||
import nw
|
|
||||||
|
|
||||||
from nw.convert.tokenizer import Tokenizer
|
|
||||||
from nw.constants import nwUnicode
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
class ToText(Tokenizer):
|
|
||||||
|
|
||||||
def __init__(self, theProject, theParent):
|
|
||||||
Tokenizer.__init__(self, theProject, theParent)
|
|
||||||
return
|
|
||||||
|
|
||||||
def doAutoReplace(self):
|
|
||||||
Tokenizer.doAutoReplace(self)
|
|
||||||
|
|
||||||
repDict = {
|
|
||||||
"\t" : " ",
|
|
||||||
nwUnicode.U_NBSP : " ",
|
|
||||||
}
|
|
||||||
xRep = re.compile("|".join([re.escape(k) for k in repDict.keys()]), flags=re.DOTALL)
|
|
||||||
self.theText = xRep.sub(lambda x: repDict[x.group(0)], self.theText)
|
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
def doConvert(self):
|
|
||||||
"""Converts the tokenized text into plain text.
|
|
||||||
"""
|
|
||||||
|
|
||||||
if self.wordWrap > 0:
|
|
||||||
tWrap = textwrap.TextWrapper(
|
|
||||||
width = self.wordWrap,
|
|
||||||
initial_indent = "",
|
|
||||||
subsequent_indent = "",
|
|
||||||
expand_tabs = True,
|
|
||||||
replace_whitespace = True,
|
|
||||||
fix_sentence_endings = False,
|
|
||||||
break_long_words = True,
|
|
||||||
drop_whitespace = True,
|
|
||||||
break_on_hyphens = True,
|
|
||||||
tabsize = 8,
|
|
||||||
max_lines = None
|
|
||||||
)
|
|
||||||
|
|
||||||
self.theResult = ""
|
|
||||||
thisPar = []
|
|
||||||
for tType, tText, tFormat, tAlign in self.theTokens:
|
|
||||||
|
|
||||||
# First check if we have a comment or plain text, as they
|
|
||||||
# need some extra replacing before we proceed to wrapping
|
|
||||||
# and final formatting.
|
|
||||||
if tType == self.T_COMMENT:
|
|
||||||
tText = "[%s]" % tText
|
|
||||||
|
|
||||||
elif tType == self.T_TEXT:
|
|
||||||
tTemp = tText
|
|
||||||
for xPos, xLen, xFmt in reversed(tFormat):
|
|
||||||
tTemp = tTemp[:xPos]+tTemp[xPos+xLen:]
|
|
||||||
tText = tTemp
|
|
||||||
|
|
||||||
tLen = len(tText)
|
|
||||||
|
|
||||||
# The text can now be word wrapped, if we have requested
|
|
||||||
# this and it's needed.
|
|
||||||
if tAlign == self.A_CENTRE:
|
|
||||||
if self.wordWrap > 0:
|
|
||||||
if tLen > self.wordWrap:
|
|
||||||
aText = tWrap.wrap(tText)
|
|
||||||
for n in range(len(aText)):
|
|
||||||
aText[n] = self._centreText(aText[n],self.wordWrap)
|
|
||||||
tText = "\n".join(aText)
|
|
||||||
else:
|
|
||||||
tText = self._centreText(tText,self.wordWrap)
|
|
||||||
else:
|
|
||||||
if self.wordWrap > 0 and tLen > self.wordWrap:
|
|
||||||
tText = tWrap.fill(tText)
|
|
||||||
|
|
||||||
# Then the text can receive final formatting before we
|
|
||||||
# append it to the results. We also store text lines in a
|
|
||||||
# buffer and merge them only when we find an empty line,
|
|
||||||
# indicating a new paragraph.
|
|
||||||
if tType == self.T_EMPTY:
|
|
||||||
if len(thisPar) > 0:
|
|
||||||
tTemp = "\n".join(thisPar)
|
|
||||||
self.theResult += "%s\n\n" % tTemp.rstrip()
|
|
||||||
thisPar = []
|
|
||||||
|
|
||||||
elif tType == self.T_HEAD1:
|
|
||||||
uLine = "="*min(tLen,self.wordWrap)
|
|
||||||
if tAlign == self.A_CENTRE:
|
|
||||||
uLine = self._centreText(uLine,self.wordWrap)
|
|
||||||
self.theResult += "%s\n%s\n\n" % (tText,uLine)
|
|
||||||
|
|
||||||
elif tType == self.T_HEAD2:
|
|
||||||
uLine = "~"*min(tLen,self.wordWrap)
|
|
||||||
self.theResult += "%s\n%s\n\n" % (tText,uLine)
|
|
||||||
|
|
||||||
elif tType == self.T_HEAD3:
|
|
||||||
uLine = "-"*min(tLen,self.wordWrap)
|
|
||||||
self.theResult += "%s\n%s\n\n" % (tText,uLine)
|
|
||||||
|
|
||||||
elif tType == self.T_HEAD4:
|
|
||||||
self.theResult += "%s\n\n" % tText
|
|
||||||
|
|
||||||
elif tType == self.T_SEP:
|
|
||||||
if self.wordWrap > 0 and tLen < self.wordWrap:
|
|
||||||
tText = self._centreText(tText,self.wordWrap)
|
|
||||||
self.theResult += "%s\n\n" % tText
|
|
||||||
|
|
||||||
elif tType == self.T_SKIP:
|
|
||||||
self.theResult += "\n\n\n"
|
|
||||||
|
|
||||||
elif tType == self.T_TEXT:
|
|
||||||
thisPar.append(tText)
|
|
||||||
|
|
||||||
elif tType == self.T_COMMENT and self.doComments:
|
|
||||||
self.theResult += "%s\n\n" % tText
|
|
||||||
|
|
||||||
elif tType == self.T_KEYWORD and self.doKeywords:
|
|
||||||
self.theResult += "%s\n\n" % tText
|
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
# END Class ToText
|
|
||||||
Reference in New Issue
Block a user