161 lines
4.6 KiB
Python
161 lines
4.6 KiB
Python
# -*- 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
|