Files
novelWriter/nw/project/project.py
T
2018-10-27 15:52:25 +02:00

161 lines
4.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*
"""novelWriter Project Wrapper
novelWriter Project Wrapper
===============================
Class holding a project
File History:
Created: 2018-09-29 [0.1.0]
"""
import logging
import nw
from os import path, mkdir
from lxml import etree
from datetime import datetime
logger = logging.getLogger(__name__)
class NWProject():
def __init__(self):
self.mainConf = nw.CONFIG
self.projTree = []
# Project Settings
self.projPath = None
self.projFile = "nwProject.nwx"
self.projName = ""
self.bookTitle = ""
self.bookAuthors = []
return
def buildProjectTree(self):
return True
def openProject(self, fileName):
if not path.isfile(fileName):
fileName = path.join(fileName, "nwProject.nwx")
if not path.isfile(fileName):
logger.error("File not found: %s" % fileName)
return False
self.projPath = path.dirname(fileName)
nwXML = etree.parse(fileName)
xRoot = nwXML.getroot()
nwxRoot = xRoot.tag
appVersion = xRoot.attrib["appVersion"]
fileVersion = xRoot.attrib["fileVersion"]
logger.verbose("XML root is %s" % nwxRoot)
logger.verbose("File version is %s" % fileVersion)
if not nwxRoot == "novelWriterXML" or not fileVersion == "1.0":
logger.error("Project file does not appear to be a novelWriterXML file version 1.0")
return False
for xChild in xRoot:
if xChild.tag == "project":
logger.debug("Found book data")
for xItem in xChild:
if xItem.text is None: continue
if xItem.tag == "name":
logger.verbose("Working Title: '%s'" % xItem.text)
self.projName = xItem.text
elif xItem.tag == "title":
logger.verbose("Title is '%s'" % xItem.text)
self.bookTitle = xItem.text
elif xItem.tag == "author":
logger.verbose("Author: '%s'" % xItem.text)
self.bookAuthors.append(xItem.text)
self.mainConf.setRecent(self.projPath)
return True
def saveProject(self):
if self.projPath is None:
logger.error("Project path not set, cannot save.")
return False
if not path.isdir(self.projPath):
logger.info("Created folder %s" % self.projPath)
mkdir(self.projPath)
# Root element and book details
nwXML = etree.Element("novelWriterXML",attrib={
"fileVersion" : "1.0",
"appVersion" : str(nw.__version__),
"timeStamp" : datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
})
xProject = etree.SubElement(nwXML,"project")
xProjName = etree.SubElement(xProject,"name")
xProjName.text = self.projName
xBookTitle = etree.SubElement(xProject,"title")
xBookTitle.text = self.bookTitle
for bookAuthor in self.bookAuthors:
if bookAuthor == "": continue
xBookAuthor = etree.SubElement(xProject,"author")
xBookAuthor.text = bookAuthor
# Write the xml tree to file
with open(path.join(self.projPath,self.projFile),"wb") as outFile:
outFile.write(etree.tostring(
nwXML,
pretty_print = True,
encoding = "utf-8",
xml_declaration = True
))
self.mainConf.setRecent(self.projPath)
return True
#
# Set Functions
#
def setProjectPath(self, projPath):
self.projPath = projPath
return True
def setProjectName(self, projName):
self.projName = projName.strip()
return True
def setBookTitle(self, bookTitle):
self.bookTitle = bookTitle.strip()
return True
def setBookAuthors(self, bookAuthors):
self.bookAuthors = []
for bookAuthor in bookAuthors.split("\n"):
bookAuthor = bookAuthor.strip()
if bookAuthor == "":
continue
self.bookAuthors.append(bookAuthor)
return True
#
# Internal Functions
#
def _makeHandle(self,seed=""):
itemHandle = sha256((str(time())+seed).encode()).hexdigest()[0:13]
# if itemHandle in self.treeLookup.keys():
# logger.warning("BookTree: Duplicate handle encountered! Retrying ...")
# itemHandle = self.makeHandle(seed+"!")
return itemHandle
# END Class NWProject