diff --git a/.gitignore b/.gitignore index 2905634a..c87816d0 100644 --- a/.gitignore +++ b/.gitignore @@ -14,12 +14,10 @@ docs/source/_* __pycache__ # Sample Project -sample/**/cache -sample/**/wordlist.txt -sample/**/sessionInfo.log -sample/**/*.bak -sample/**/*.json -sample/**/*.lock +sample/cache +sample/meta +sample/*.bak +sample/*.lock # PyTest tests/temp diff --git a/nw/core/document.py b/nw/core/document.py index 7ce4de4e..6ab4d500 100644 --- a/nw/core/document.py +++ b/nw/core/document.py @@ -91,18 +91,17 @@ class NWDoc(): if self.theItem.parHandle == self.theProject.projTree.trashRoot(): self.docEditable = False - docDir = "content" docFile = self.docHandle+".nwd" - self.fileLoc = path.join(docDir, docFile) - logger.debug("Opening document %s" % self.fileLoc) - dataDir = path.join(self.theProject.projPath, docDir) - docPath = path.join(dataDir, docFile) + logger.debug("Opening document %s" % docFile) + + docPath = path.join(self.theProject.projContent, docFile) + self.fileLoc = docPath theText = "" self.docMeta = "" if path.isfile(docPath): try: - with open(docPath,mode="r",encoding="utf8") as inFile: + with open(docPath, mode="r", encoding="utf8") as inFile: fstLine = inFile.readline() if fstLine.startswith("%%~ "): # This is the meta line @@ -112,7 +111,7 @@ class NWDoc(): theText += inFile.read() except Exception as e: - self.makeAlert(["Failed to open document file.",str(e)], nwAlert.ERROR) + self.makeAlert(["Failed to open document file.", str(e)], nwAlert.ERROR) # Note: Document must be cleared in case of an io error, # or else the auto-save or save will try to overwrite it # with an empty file. Return None to alert the caller. @@ -138,25 +137,23 @@ class NWDoc(): if self.docHandle is None or not self.docEditable: return False - docDir = "content" + self.theProject.ensureFolderStructure() + docFile = self.docHandle+".nwd" - logger.debug("Saving document %s" % path.join(docDir, docFile)) - dataPath = path.join(self.theProject.projPath, docDir) - docPath = path.join(dataPath, docFile) - if not path.isdir(dataPath): - mkdir(dataPath) - logger.debug("Created folder %s" % dataPath) + logger.debug("Saving document %s" % docFile) + + docPath = path.join(self.theProject.projContent, docFile) + docTemp = path.join(self.theProject.projContent, docFile+"~") itemPath = self.theProject.projTree.getItemPath(self.docHandle) docMeta = "%%~ "+":".join(itemPath)+":"+self.theItem.itemName+"\n" - docTemp = path.join(dataPath, docFile+"~") try: - with open(docTemp,mode="w",encoding="utf8") as outFile: + with open(docTemp, mode="w", encoding="utf8") as outFile: outFile.write(docMeta) outFile.write(docText) except Exception as e: - self.makeAlert(["Could not save document.",str(e)], nwAlert.ERROR) + self.makeAlert(["Could not save document.", str(e)], nwAlert.ERROR) return False # If we're here, the file was successfully saved, so we can @@ -173,13 +170,12 @@ class NWDoc(): """Permanently delete a document source file and its backups from the project data folder. """ - docDir = "content" docFile = self.docHandle+".nwd" - dataPath = path.join(self.theProject.projPath, docDir) + chkList = [] - chkList.append(path.join(dataPath, docFile)) - chkList.append(path.join(dataPath, docFile+"~")) - chkList.append(path.join(dataPath, docFile[:-3]+"bak")) + chkList.append(path.join(self.theProject.projContent, docFile)) + chkList.append(path.join(self.theProject.projContent, docFile+"~")) + for chkFile in chkList: if path.isfile(chkFile): try: @@ -188,6 +184,7 @@ class NWDoc(): except Exception as e: self.makeAlert(["Could not delete document file.",str(e)], nwAlert.ERROR) return False + return True ## diff --git a/nw/core/project.py b/nw/core/project.py index abaed265..d7ab3c2d 100644 --- a/nw/core/project.py +++ b/nw/core/project.py @@ -252,17 +252,10 @@ class NWProject(): # Standard Folders and Files # ========================== - self.projMeta = path.join(self.projPath, "meta") - self.projCache = path.join(self.projPath, "cache") - self.projContent = path.join(self.projPath, "content") - self.projDict = path.join(self.projMeta, nwFiles.PROJ_DICT) + if not self.ensureFolderStructure(): + return False - if not self._checkFolder(self.projMeta): - return False - if not self._checkFolder(self.projCache): - return False - if not self._checkFolder(self.projContent): - return False + self.projDict = path.join(self.projMeta, nwFiles.PROJ_DICT) # Check for Old Legacy Data # ========================= @@ -473,15 +466,8 @@ class NWProject(): ) return False - self.projMeta = path.join(self.projPath, "meta") - self.projContent = path.join(self.projPath, "content") saveTime = time() - - if not self._checkFolder(self.projPath): - return False - if not self._checkFolder(self.projMeta): - return False - if not self._checkFolder(self.projContent): + if not self.ensureFolderStructure(): return False logger.debug("Saving project: %s" % self.projPath) @@ -582,6 +568,26 @@ class NWProject(): self.lockedBy = None return True + def ensureFolderStructure(self): + """Ensure that all necessary folders exist in the project + folder. + """ + if self.projPath is None or self.projPath == "": + return False + + self.projMeta = path.join(self.projPath, "meta") + self.projCache = path.join(self.projPath, "cache") + self.projContent = path.join(self.projPath, "content") + + if not self._checkFolder(self.projMeta): + return False + if not self._checkFolder(self.projCache): + return False + if not self._checkFolder(self.projContent): + return False + + return True + ## # Backup Project ## @@ -1058,7 +1064,7 @@ class NWProject(): def _appendSessionStats(self): """Append session statistics to the sessions log file. """ - if self.projMeta is None: + if not self.ensureFolderStructure(): return False sessionFile = path.join(self.projMeta, nwFiles.SESS_INFO) diff --git a/sample/nwProject.nwx b/sample/nwProject.nwx index 60752873..a0d7f3ce 100644 --- a/sample/nwProject.nwx +++ b/sample/nwProject.nwx @@ -1,5 +1,5 @@ - + Sample Project Sample Project @@ -11,7 +11,7 @@ True True 636b6aa9b697b - ba8a28a246524 + b3e74dbc1f584 914 B @@ -71,7 +71,7 @@ New True PAGE - 208 + 210 40 2 213