# -*- 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