From 121473969ede0ee28bdef84040bb5f36dc3e231c Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" Date: Sun, 9 Jun 2019 09:36:37 +0200 Subject: [PATCH 1/7] Some reshuffling of loading into document viewer --- nw/gui/docviewer.py | 55 +++++++++++++++++++++++++++++++++++++++------ nw/gui/winmain.py | 20 ++--------------- 2 files changed, 50 insertions(+), 25 deletions(-) diff --git a/nw/gui/docviewer.py b/nw/gui/docviewer.py index 4f4aaa3d..966d213a 100644 --- a/nw/gui/docviewer.py +++ b/nw/gui/docviewer.py @@ -13,32 +13,40 @@ import logging import nw +from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QTextBrowser +from PyQt5.QtGui import QTextOption + +from nw.convert.tokenizer import Tokenizer +from nw.convert.tohtml import ToHtml +from nw.enum import nwItemType logger = logging.getLogger(__name__) class GuiDocViewer(QTextBrowser): - def __init__(self, theParent): + def __init__(self, theParent, theProject): QTextBrowser.__init__(self) logger.debug("Initialising DocViewer ...") # Class Variables - self.mainConf = nw.CONFIG - self.theParent = theParent - self.theTheme = theParent.theTheme + self.mainConf = nw.CONFIG + self.theProject = theProject + self.theParent = theParent + self.theTheme = theParent.theTheme + self.theHandle = None - self.theDoc = self.document() - self.theDoc.setDefaultStyleSheet(( + self.theQDoc = self.document() + self.theQDoc.setDefaultStyleSheet(( "h1, h2, h3, h4 {{" " color: rgb({0},{1},{2});" "}}" ).format( *self.theTheme.colHead )) - self.theDoc.setDocumentMargin(self.mainConf.textMargin[0]) self.setMinimumWidth(300) + self.initEditor() logger.debug("DocViewer initialisation complete") @@ -48,4 +56,37 @@ class GuiDocViewer(QTextBrowser): self.clear() return True + def initEditor(self): + """Set editor settings from mani config. + """ + self.theQDoc.setDocumentMargin(self.mainConf.textMargin[0]) + theOpt = QTextOption() + if self.mainConf.doJustify: + theOpt.setAlignment(Qt.AlignJustify) + self.theQDoc.setDefaultTextOption(theOpt) + + return True + + def loadText(self, tHandle): + + tItem = self.theProject.getItem(tHandle) + if tItem is None: + logger.warning("Item not found") + return False + + if tItem.itemType != nwItemType.FILE: + return False + + logger.debug("Generating preview for item %s" % tHandle) + aDoc = ToHtml(self.theProject, self.theParent) + aDoc.setText(tHandle) + aDoc.doAutoReplace() + aDoc.tokenizeText() + aDoc.doConvert() + self.setHtml(aDoc.theResult) + self.theHandle = tHandle + self.theProject.setLastViewed(tHandle) + + return True + # END Class GuiDocViewer diff --git a/nw/gui/winmain.py b/nw/gui/winmain.py index c13d2d01..ee3e870e 100644 --- a/nw/gui/winmain.py +++ b/nw/gui/winmain.py @@ -35,8 +35,6 @@ from nw.project.project import NWProject from nw.project.document import NWDoc from nw.project.item import NWItem from nw.project.index import NWIndex -from nw.convert.tokenizer import Tokenizer -from nw.convert.tohtml import ToHtml from nw.tools.wordcount import countWords from nw.theme import Theme from nw.enum import nwItemType, nwAlert @@ -64,7 +62,7 @@ class GuiMain(QMainWindow): # Main GUI Elements self.docEditor = GuiDocEditor(self) - self.docViewer = GuiDocViewer(self) + self.docViewer = GuiDocViewer(self, self.theProject) self.docDetails = GuiDocDetails(self, self.theProject) self.treeView = GuiDocTree(self, self.theProject) self.mainMenu = GuiMainMenu(self, self.theProject) @@ -319,21 +317,7 @@ class GuiMain(QMainWindow): logger.warning("No document selected") return False - tItem = self.theProject.getItem(tHandle) - if tItem is None: - logger.warning("Item not found") - return False - - if tItem.itemType == nwItemType.FILE: - logger.debug("Generating preview for item %s" % tHandle) - aDoc = ToHtml(self.theProject, self) - aDoc.setText(tHandle) - aDoc.doAutoReplace() - aDoc.tokenizeText() - aDoc.doConvert() - self.docViewer.setHtml(aDoc.theResult) - self.theProject.setLastViewed(tHandle) - + if self.docViewer.loadText(tHandle): bPos = self.splitMain.sizes() self.docViewer.setVisible(True) vPos = [0,0] From 3793d03e4efb50c675a907a73ca7061664d22771 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" Date: Sun, 9 Jun 2019 10:16:40 +0200 Subject: [PATCH 2/7] Moved the NWDoc instance from main GUI to the docEditor as it is not really needed in the main view. --- nw/gui/doceditor.py | 56 +++++++++++++++++++++++++++++++++++++-------- nw/gui/winmain.py | 24 +++++-------------- 2 files changed, 53 insertions(+), 27 deletions(-) diff --git a/nw/gui/doceditor.py b/nw/gui/doceditor.py index 870947d9..b955acb1 100644 --- a/nw/gui/doceditor.py +++ b/nw/gui/doceditor.py @@ -20,6 +20,7 @@ from PyQt5.QtCore import Qt, QTimer from PyQt5.QtWidgets import QTextEdit, QAction, QMenu, QShortcut from PyQt5.QtGui import QTextCursor, QTextOption, QIcon, QKeySequence +from nw.project.document import NWDoc from nw.gui.dochighlight import GuiDocHighlighter from nw.gui.wordcounter import WordCounter from nw.enum import nwDocAction, nwAlert @@ -28,7 +29,7 @@ logger = logging.getLogger(__name__) class GuiDocEditor(QTextEdit): - def __init__(self, theParent): + def __init__(self, theParent, theProject): QTextEdit.__init__(self) logger.debug("Initialising DocEditor ...") @@ -36,10 +37,12 @@ class GuiDocEditor(QTextEdit): # Class Variables self.mainConf = nw.CONFIG self.theParent = theParent + self.theProject = theProject self.docChanged = False self.pwlFile = None self.spellCheck = False - self.theDocument = theParent.theDocument + self.theDocument = NWDoc(self.theProject, self.theParent) + self.theHandle = None # Document Variables self.charCount = 0 @@ -69,9 +72,6 @@ class GuiDocEditor(QTextEdit): self.setMinimumWidth(300) self.setAcceptRichText(False) - self.clearEditor() - self.initEditor() - self.theQDoc.setDocumentMargin(0) self.theQDoc.contentsChange.connect(self._docChange) @@ -87,13 +87,29 @@ class GuiDocEditor(QTextEdit): self.wCounter = WordCounter(self) self.wCounter.finished.connect(self._updateCounts) + self.clearEditor() + self.initEditor() + logger.debug("DocEditor initialisation complete") return def clearEditor(self): + + self.theDocument.clearDocument() self.setReadOnly(True) self.clear() + self.wcTimer.stop() + + self.theHandle = None + self.charCount = 0 + self.wordCount = 0 + self.paraCount = 0 + self.lastEdit = 0 + self.hasSelection = False + + self.setDocumentChanged(False) + return True def initEditor(self): @@ -114,6 +130,7 @@ class GuiDocEditor(QTextEdit): return True def loadText(self, tHandle): + self.hLight.setHandle(tHandle) self.setPlainText(self.theDocument.openDocument(tHandle)) self.setCursorPosition(self.theDocument.theItem.cursorPos) @@ -122,6 +139,27 @@ class GuiDocEditor(QTextEdit): self.wcTimer.start() self.setDocumentChanged(False) self.setReadOnly(False) + self.theHandle = tHandle + + return True + + def saveText(self): + + if self.theDocument.theItem is None: + return False + + docText = self.getText() + cursPos = self.getCursorPosition() + theItem = self.theDocument.theItem + theItem.setCharCount(self.charCount) + theItem.setWordCount(self.wordCount) + theItem.setParaCount(self.paraCount) + theItem.setCursorPos(cursPos) + self.theDocument.saveDocument(docText) + self.setDocumentChanged(False) + + self.theParent.theIndex.scanText(theItem.itemHandle, docText) + return True ## @@ -381,7 +419,7 @@ class GuiDocEditor(QTextEdit): """ logger.verbose("Updating word count") - tHandle = self.theParent.theDocument.docHandle + tHandle = self.theDocument.docHandle self.charCount = self.wCounter.charCount self.wordCount = self.wCounter.wordCount self.paraCount = self.wCounter.paraCount @@ -392,9 +430,9 @@ class GuiDocEditor(QTextEdit): return def _wrapSelection(self, tBefore, tAfter): - """Wraps the selected text in whatever is in tBefore and tAfter. If there is no selection, the autoSelect setting decides - the action. AutoSelect will select the word under the cursor before wrapping it. If this feature is disabled, nothing is - done. + """Wraps the selected text in whatever is in tBefore and tAfter. If there is no selection, + the autoSelect setting decides the action. AutoSelect will select the word under the cursor + before wrapping it. If this feature is disabled, nothing is done. """ theCursor = self.textCursor() if self.mainConf.autoSelect and not theCursor.hasSelection(): diff --git a/nw/gui/winmain.py b/nw/gui/winmain.py index 012a328b..9c45af07 100644 --- a/nw/gui/winmain.py +++ b/nw/gui/winmain.py @@ -32,7 +32,6 @@ from nw.gui.itemeditor import GuiItemEditor from nw.gui.statusbar import GuiMainStatus from nw.gui.timelineview import GuiTimeLineView from nw.project.project import NWProject -from nw.project.document import NWDoc from nw.project.item import NWItem from nw.project.index import NWIndex from nw.tools.wordcount import countWords @@ -51,7 +50,6 @@ class GuiMain(QMainWindow): self.mainConf = nw.CONFIG self.theTheme = Theme() self.theProject = NWProject(self) - self.theDocument = NWDoc(self.theProject, self) self.theIndex = NWIndex(self.theProject, self) self.hasProject = False @@ -61,12 +59,12 @@ class GuiMain(QMainWindow): self.theTheme.loadTheme() # Main GUI Elements - self.docEditor = GuiDocEditor(self) + self.statusBar = GuiMainStatus(self) + self.docEditor = GuiDocEditor(self, self.theProject) self.docViewer = GuiDocViewer(self, self.theProject) self.docDetails = GuiDocDetails(self, self.theProject) self.treeView = GuiDocTree(self, self.theProject) self.mainMenu = GuiMainMenu(self, self.theProject) - self.statusBar = GuiMainStatus(self) # Minor Gui Elements self.statusIcons = [] @@ -282,7 +280,6 @@ class GuiMain(QMainWindow): if self.hasProject: if self.docEditor.docChanged: self.saveDocument() - self.theDocument.clearDocument() self.docEditor.clearEditor() return True @@ -296,17 +293,8 @@ class GuiMain(QMainWindow): return True def saveDocument(self): - if self.theDocument.theItem is not None and self.hasProject: - docText = self.docEditor.getText() - cursPos = self.docEditor.getCursorPosition() - theItem = self.theDocument.theItem - theItem.setCharCount(self.docEditor.charCount) - theItem.setWordCount(self.docEditor.wordCount) - theItem.setParaCount(self.docEditor.paraCount) - theItem.setCursorPos(cursPos) - self.theDocument.saveDocument(docText) - self.docEditor.setDocumentChanged(False) - self.theIndex.scanText(theItem.itemHandle, docText) + if self.hasProject: + self.docEditor.saveText() return True def viewDocument(self, tHandle=None): @@ -318,7 +306,7 @@ class GuiMain(QMainWindow): tHandle = self.theProject.lastViewed if tHandle is None: logger.debug("No document selected, trying editor document") - tHandle = self.theDocument.docHandle + tHandle = self.docEditor.theHandle if tHandle is None: logger.debug("No document selected, giving up") return False @@ -580,7 +568,7 @@ class GuiMain(QMainWindow): return def _autoSaveDocument(self): - if self.hasProject and self.docEditor.docChanged and self.theDocument.theItem is not None: + if self.hasProject and self.docEditor.docChanged: logger.debug("Autosaving document") self.saveDocument() return From c8888e753692da7e62037669943492e72de64cc3 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" Date: Sun, 9 Jun 2019 10:19:18 +0200 Subject: [PATCH 3/7] NWDoc still needed in main gui class --- nw/gui/winmain.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nw/gui/winmain.py b/nw/gui/winmain.py index 9c45af07..2613de22 100644 --- a/nw/gui/winmain.py +++ b/nw/gui/winmain.py @@ -32,6 +32,7 @@ from nw.gui.itemeditor import GuiItemEditor from nw.gui.statusbar import GuiMainStatus from nw.gui.timelineview import GuiTimeLineView from nw.project.project import NWProject +from nw.project.document import NWDoc from nw.project.item import NWItem from nw.project.index import NWIndex from nw.tools.wordcount import countWords From b3df4ee0f2bb9721e2005b8882e138884df0386f Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" Date: Sun, 9 Jun 2019 10:35:12 +0200 Subject: [PATCH 4/7] Added the code needed for opening documentation in the viewer --- help/en_GB/index.html | 8 ++++++++ nw/config.py | 1 + nw/gui/docviewer.py | 15 ++++++++++++++- nw/gui/mainmenu.py | 10 ++++++++++ 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 help/en_GB/index.html diff --git a/help/en_GB/index.html b/help/en_GB/index.html new file mode 100644 index 00000000..3fa9f0a0 --- /dev/null +++ b/help/en_GB/index.html @@ -0,0 +1,8 @@ + + + novelWriter Help + + +

novelWriter Help

+ + \ No newline at end of file diff --git a/nw/config.py b/nw/config.py index cdf07697..f65f9554 100644 --- a/nw/config.py +++ b/nw/config.py @@ -104,6 +104,7 @@ class Config: self.homePath = path.expanduser("~") self.appPath = path.dirname(__file__) self.appRoot = path.join(self.appPath,path.pardir) + self.helpPath = path.join(self.appRoot,"help","en_GB") self.guiPath = path.join(self.appPath,"gui") self.themePath = path.join(self.appPath,"themes") diff --git a/nw/gui/docviewer.py b/nw/gui/docviewer.py index a45718ea..38ae0893 100644 --- a/nw/gui/docviewer.py +++ b/nw/gui/docviewer.py @@ -13,7 +13,7 @@ import logging import nw -from PyQt5.QtCore import Qt +from PyQt5.QtCore import Qt, QUrl from PyQt5.QtWidgets import QTextBrowser from PyQt5.QtGui import QTextOption @@ -59,6 +59,7 @@ class GuiDocViewer(QTextBrowser): def clearViewer(self): self.clear() + self.setSearchPaths([""]) return True def initEditor(self): @@ -74,6 +75,10 @@ class GuiDocViewer(QTextBrowser): def loadText(self, tHandle): + if tHandle == "Help": + self.loadHelp() + return True + tItem = self.theProject.getItem(tHandle) if tItem is None: logger.warning("Item not found") @@ -94,4 +99,12 @@ class GuiDocViewer(QTextBrowser): return True + def loadHelp(self): + + self.clearViewer() + self.setSearchPaths([self.mainConf.helpPath]) + self.setSource(QUrl("index.html")) + + return True + # END Class GuiDocViewer diff --git a/nw/gui/mainmenu.py b/nw/gui/mainmenu.py index 9360f4d6..e170b408 100644 --- a/nw/gui/mainmenu.py +++ b/nw/gui/mainmenu.py @@ -516,6 +516,16 @@ class GuiMainMenu(QMenuBar): menuItem.triggered.connect(self._showAboutQt) self.helpMenu.addAction(menuItem) + # Help > Separator + self.helpMenu.addSeparator() + + # Document > Preview + menuItem = QAction(QIcon.fromTheme("text-html"), "Documentation", self) + menuItem.setStatusTip("View documentation") + menuItem.setShortcut("F1") + menuItem.triggered.connect(lambda : self.theParent.viewDocument("Help")) + self.helpMenu.addAction(menuItem) + return # END Class GuiMainMenu From 46887fed1d130c76d276c91cbc83fea28a5efbd8 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" Date: Sun, 9 Jun 2019 12:45:32 +0200 Subject: [PATCH 5/7] Some more theme tweaking for better viewing of files --- nw/gui/docviewer.py | 42 +++++++++++++++++++++++++++++++++--- nw/theme.py | 2 ++ nw/themes/default/styles.css | 1 - nw/themes/default/theme.conf | 2 ++ 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/nw/gui/docviewer.py b/nw/gui/docviewer.py index 38ae0893..8173ecba 100644 --- a/nw/gui/docviewer.py +++ b/nw/gui/docviewer.py @@ -39,11 +39,47 @@ class GuiDocViewer(QTextBrowser): self.theQDoc = self.document() self.theQDoc.setDefaultStyleSheet(( + "body {{" + " font-size: {textSize}pt;" + " color: rgb({tColR},{tColG},{tColB});" + "}}\n" "h1, h2, h3, h4 {{" - " color: rgb({0},{1},{2});" - "}}" + " color: rgb({hColR},{hColG},{hColB});" + "}}\n" + "a {{" + " color: rgb({aColR},{aColG},{aColB});" + "}}\n" + "pre {{" + " color: rgb({cColR},{cColG},{cColB});" + " font-size: {preSize}pt;" + "}}\n" + "mark {{" + " color: rgb({eColR},{eColG},{eColB});" + "}}\n" + "table {{" + " margin: 10px 0px;" + "}}\n" + "td {{" + " padding: 0px 4px;" + "}}\n" ).format( - *self.theTheme.colHead + textSize = self.mainConf.textSize, + preSize = self.mainConf.textSize*0.9, + tColR = self.theTheme.colText[0], + tColG = self.theTheme.colText[1], + tColB = self.theTheme.colText[2], + hColR = self.theTheme.colHead[0], + hColG = self.theTheme.colHead[1], + hColB = self.theTheme.colHead[2], + cColR = self.theTheme.colComm[0], + cColG = self.theTheme.colComm[1], + cColB = self.theTheme.colComm[2], + eColR = self.theTheme.colEmph[0], + eColG = self.theTheme.colEmph[1], + eColB = self.theTheme.colEmph[2], + aColR = self.theTheme.colLink[0], + aColG = self.theTheme.colLink[1], + aColB = self.theTheme.colLink[2], )) self.setMinimumWidth(300) self.initEditor() diff --git a/nw/theme.py b/nw/theme.py index 88fe121d..806e7b46 100644 --- a/nw/theme.py +++ b/nw/theme.py @@ -86,6 +86,8 @@ class Theme: ## Syntax cnfSec = "Syntax" if confParser.has_section(cnfSec): + self.colText = self._loadColour(confParser,cnfSec,"text") + self.colLink = self._loadColour(confParser,cnfSec,"link") self.colHead = self._loadColour(confParser,cnfSec,"headertext") self.colHeadH = self._loadColour(confParser,cnfSec,"headertag") self.colEmph = self._loadColour(confParser,cnfSec,"emphasis") diff --git a/nw/themes/default/styles.css b/nw/themes/default/styles.css index 1d78fe66..ddf008ae 100644 --- a/nw/themes/default/styles.css +++ b/nw/themes/default/styles.css @@ -10,7 +10,6 @@ QTextEdit { QTextBrowser { background-color: #141414; color: #c7cfd0; - /* padding: 40px; */ } QTreeView, QHeaderView { diff --git a/nw/themes/default/theme.conf b/nw/themes/default/theme.conf index b230f3a5..7f4729e8 100644 --- a/nw/themes/default/theme.conf +++ b/nw/themes/default/theme.conf @@ -1,4 +1,6 @@ [Syntax] +text = 199, 207, 208 +link = 184, 200, 0 headertext = 0, 155, 200 headertag = 0, 105, 135 emphasis = 200, 120, 0 From f944a1733c9c2f4a4c31ecd169ab6c1f1e8f9f19 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" Date: Sun, 9 Jun 2019 12:45:59 +0200 Subject: [PATCH 6/7] Added a good chunk of text to documentation --- help/en_GB/index.html | 271 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 271 insertions(+) diff --git a/help/en_GB/index.html b/help/en_GB/index.html index 3fa9f0a0..34f70531 100644 --- a/help/en_GB/index.html +++ b/help/en_GB/index.html @@ -4,5 +4,276 @@

novelWriter Help

+ + +

Content:

+ + + +

1. Novel Projects

+

Back to top

+ +

A novelWriter project requires a dedicated folder for storing its files. See the + Technical Information section for further details.

+

A new project can be created from the Project menu by selecting Project > New + Project. A list of recently opened projects is also maintained and can be selected + from the menu.

+

The project specific settings are available in Project > Project Settings. See + further details below.

+ + +

1.1 Project Structure

+

Back to top

+ +

Projects are structured into a set of root folders in the left side tree view panel.

+

The core novel files go into a root folder of type NOVEL. Other supporting files + go into root folders of types PLOT, CHARACTER, WORLD, + TIMELINE, OBJECT or CUSTOM. These other root folder + types are intended for your notes on the various elements of your story. Using these are of + course entirely optional.

+

Deleted files will be moved into a special TRASH root folder. Currently, these + files cannot be permanently deleted from the project.

+ +

Orphaned Documents

+

In the event the editor crashes or otherwise exits without saving the project state, files + that have been added to the project tree and are saved to disk will appear in a special + "Orphaned Items" root folder next time the application is started. These orphaned files will + not have any meta data associated with them, so the title and other information has to be + set again, and the files moved back to the correct location in the project.

+ +

Using Project Folders

+

Folders, aside from root folders, have no structural significance to the project. They are + there purely as a way for the user to organise the files in meaningful sections and to be + able to close them in the tree view. When processing the files in the novel, the folders are + ignored.

+ + +

1.2 Project Settings

+

Back to top

+ +

The project settings can be accessed from the Project > Project Settings menu + entry. This will open a dialog box.

+ +

Settings Tab

+

The Settings tab holds the project title and author settings. Working Title can be + set to a different title than the Book Title. The difference between them is simply + that the Working Title is used for the GUI (main window title) and when the export features + are added can optionally be printed to the cover sheet. The Book Title, on the other hand, + will only be printed to the title page on export.

+

The Book Authors text box takes one author per line. The line breaks matter in that + this is converted to a list for later correct formatting.

+ +

Status Tab

+

Each file of type NOVEL can be given a status level, signified by a coloured + icon. These are purely there for the user's convenience, and you are not required to use + them for any other feature to work. The intention is to use this list to set what stage of + writing you are on, although you can in principle make them whatever you want.

+

Note that status levels currently in use by a file cannot be deleted.

+ +

Importance Tab

+

Each file of types PLOT, CHARACTER, WORLD, + TIMELINE, OBJECT or CUSTOM can be given an importance + level, signified by a coloured icon like for status level. These are also purely there for + the user's convenience, and you are not required to use them for any other feature to work. + The intention is to use this list to set how important the character, plot element, or + otherwise, is for the story. Again, these can in principle be used for whatever you want. +

Note that importance levels currently in use by a file cannot be deleted.

+ +

Auto-Replace Tab

+

A set of automatically replaced keywords can be added in this tab. The keywords in the left + column wile be replaced by the text in the right column when documents are opened in the + viewer. This will also be applied to exports when the feature is added.

+

Note that a keyword cannot contain any spaces. The angle brackets are dded by default, and + when used in the text are a part of the keyword to be replaced. This is to ensure that parts + of the text isn't unintentionally replaced by the content of the list.

+ + +

1.3 Writing Files

+

Back to top

+ +

New document files can be created from the Document menu, or by pressing Ctrl+N + while in the tree view pane. This will create a new, empty file, and open the item settings + dialog where the filename and various other settings can be set. This dialog can also be + opened again later from either the menu, Project > Edit item, or by pressing + Ctrl+E or F2 with the item selected.

+

The different classes of documents have some restrictions.

+ + +

2. Novel Structure

+

Back to top

+ + +

2.1 Importance of Headings

+

Back to top

+ + +

2.2 Novel File Layout

+

Back to top

+ +

Files that exist under the NOVEL type root folder can have a number of layouts + set. See overview below. These layouts are currently not used for any internal feature, but + when the export feature is added they will be important in determining how the different + sections of the novel is formatted.

+ + + + + + + + + + + + + + + + + +
Title PageThe title page layout. The title should be formatted as a heading of level 1, that + is one hash: # Book Title
BookIn principle, the entire novel can be contained in a single file. In that case, use + the Book layout on this file. The internal structure is then controlled by the + heading levels.
Plain PageA plain page is just that, It is not included into content and the heading levels + are ignored.
PartitionA partition can be used to split a the novel into parts. Use a level one heading for + this.
+ + +

3. User Interface

+

Back to top

+ + +

3.1 Keyboard Shortcuts

+

Back to top

+ +

All features are available as keyboard shortcuts. These are as following:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ctrl+1Switch focus to tree view pane.
Ctrl+2Switch focus to document editor pane.
Ctrl+3Switch focus to document viewer pane.
ReturnIf in tree view, open a document for editing.
Ctrl+RIf in tree view, open a document for viewing. If in editor pane, open current document for viewing.
Ctrl+EIf in tree view, edit a document or folder settings.
Ctrl+DelIf in tree view, move a document to trash, or delete a folder.
Ctrl+SSave the current document in the editor.
Ctrl+Shift+SSave the current project.
Ctrl+ASelect all text in document.
Ctrl+Shift+ASelect all text in current paragraph.
Ctrl+BFormat selected text, or word under cursor, as bold.
Ctrl+IFormat selected text, or word under cursor, as italic.
Ctrl+UFormat selected text, or word under cursor, as underline.
Ctrl+DWrap selected text, or word under cursor, in double quotes.
Ctrl+Shift+DWrap selected text, or word under cursor, in single quotes.
Ctrl+F7Toggle spell checking.
F7Re-run spell checker.
Ctrl+.Correct word under cursor.
+ + +

4. Technical Information

+

Back to top

+ +

This section contains details of how novelWriter stores and handles the project data.

+ + +

4.1 How Data is Stored

+

Back to top

+ +

Main Project File

+

The project itself requires a dedicated folder for storing its files. The main project file + is stored as an XML file with the name nwProject.nwx. This file contains all + the meta data unique for the project. That includes project settings.

+

If this file is lost or corrupted, the structure of the project is lost. It is important to + keep this file backed up.

+

The project XML file is suitable for diff tools and version control, although a timesetamp is + set in the meta section on line 2 each time the file is saved.

+ +

Project Documents

+

The project documents are saved in folders staring with data_. Each document has + a file handle taken from the first 13 characters of a SHA256 hash of the system time. the + documents are saved with a folder and filename derived from this hash.

+

The reason for this is to avoid issues with file naming conventions and restrictions. The + file name set in the tree view is only saved in the project XML file.

+

Each document file contains a plain text version of the text from the editor. The file can in + principle be edited in any text editor, and is suitable for diffing and version control if + so desired.

+ \ No newline at end of file From f67c178fa7762e3b5ce5394e7d4c9d45d7f54142 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" Date: Sun, 9 Jun 2019 14:12:04 +0200 Subject: [PATCH 7/7] Filled out a lot more in the documentation --- help/en_GB/index.html | 441 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 380 insertions(+), 61 deletions(-) diff --git a/help/en_GB/index.html b/help/en_GB/index.html index 34f70531..8761ad47 100644 --- a/help/en_GB/index.html +++ b/help/en_GB/index.html @@ -8,29 +8,40 @@

Content:

+ +

1. Introduction

+

Back to top

+ -

1. Novel Projects

+

2. Novel Projects

Back to top

A novelWriter project requires a dedicated folder for storing its files. See the @@ -42,15 +53,54 @@ further details below.

-

1.1 Project Structure

+

2.1 Project Structure

Back to top

Projects are structured into a set of root folders in the left side tree view panel.

-

The core novel files go into a root folder of type NOVEL. Other supporting files - go into root folders of types PLOT, CHARACTER, WORLD, - TIMELINE, OBJECT or CUSTOM. These other root folder - types are intended for your notes on the various elements of your story. Using these are of - course entirely optional.

+

The core novel files go into a root folder of type Novel. Other supporting files + go into root folders of types Plot, Characters, + Locations, Timeline, Objects or Custom. + These other root folder types are intended for your notes on the various elements of your + story. Using these are of course entirely optional.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NovelThe root folder of all text that goes into the final novel. This class of files have + other rules and features than other files in the project. See the + Novel Structure section for more details.
PlotThis is the root folder where main plots can be outlined. It is optional, but adding + at least dummy files can be useful in order to generate the timeline view.
CharactersCharacter files go in this root folder. These are especially important if one wants + to use the timeline view to see which character appears where and which part of the + story is told from a specific character's point-of-view.
LocationsLocation is for various scene locations that one wants to track in the timeline + view if that applies to the story.
TimelineIf the story jumps in time within the same plot, this class of files can be used to + track this.
ObjectsImportant objects in the story can be tracked here, and connected to the timeline as + well.
Customthe custom root folder can be used for tracking anything else not covered by the + above options.

Deleted files will be moved into a special TRASH root folder. Currently, these files cannot be permanently deleted from the project.

@@ -68,7 +118,7 @@ ignored.

-

1.2 Project Settings

+

2.2 Project Settings

Back to top

The project settings can be accessed from the Project > Project Settings menu @@ -91,7 +141,7 @@

Note that status levels currently in use by a file cannot be deleted.

Importance Tab

-

Each file of types PLOT, CHARACTER, WORLD, +

Each file of types PLOT, CHARACTER, WORLD, TIMELINE, OBJECT or CUSTOM can be given an importance level, signified by a coloured icon like for status level. These are also purely there for the user's convenience, and you are not required to use them for any other feature to work. @@ -108,7 +158,7 @@ of the text isn't unintentionally replaced by the content of the list.

-

1.3 Writing Files

+

2.3 Writing Files

Back to top

New document files can be created from the Document menu, or by pressing Ctrl+N @@ -119,15 +169,102 @@

The different classes of documents have some restrictions.

-

2. Novel Structure

+

3. Novel Structure

Back to top

+

This section concerns files under the Novel type root folder. There are some + restrictions and features that only applies to these type of files.

+ -

2.1 Importance of Headings

+

3.1 Importance of Headings

Back to top

+

Subfolders under root folders have no impact on the structure of the novel itself. The + structure is instead dictated by the heading level. Four levels of headings are supported, + signified by the number of hashes preceding the title. See the + Markdown section.

+

The header levels are not only important when generating the exported novel file, but is also + used by the indexer and timeline view. Each heading starts a new region where new References + to tags can be set, and will show up as a new row in the timeline view.

+

The different header levels are interpreted as specific section types of the novel.

+ + + + + + + + + + + + + + + + + +
# Header1Header level 1 signifies that the text refers to either the novel title or the + name of a top level partition.
## Header2Header level 2 signifies a chapter level partition.
### Header3Header level 3 signifies a scene level partition.
#### Header4Header level 4 signifies a sub-scene level partition.
+ + +

3.2 Tag References

+

Back to top

+ +

Each section started by a heading can contain references to tags set in the supporting files + of the project. See the File Tags section.

+

The references are gathered by the indexer and used to generate the timeline view of how the + different parts of the novel are connected.

+

References are set as keyword and a list of corresponding tags. The valid keywords are listed + below. The format of such a line is @keyword: value1, [value2] ... [valueN]. + Note that not all keywords allow multiple values.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
@povThe point-of-view character for the current section. The target must be a note tag + in the character root folder. Only one value is accepted. further values are + ignored.
@charOther characters in the current section. The target must be a note tag in the + character root folder. Multiple values are allowed. This should not include the + point-of-view character.
@plotThe plot timelines touched by the current section. The target must be a note tag in + the plot root folder. Multiple values are allowed.
@timeThe timelines touched by the current section. The target must be a note tag in the + timeline root folder. Multiple values are allowed.
@locationThe location the current section takes place in. The target must be a note tag in + the locations root folder. Multiple values are allowed.
@objectObjects present in the current section. The target must be a note tag in the object + root folder. Multiple values are allowed.
@customCustom references in the current section. The target must be a note tag in the + custom root folder. Multiple values are allowed.
+

the syntax highlighter will alert the user that only the correct keywords are used, and that + the tags referenced exist. If the index of defined tags is out of date, press + F9 to regenerate it, or select Tools > Rebuild Indices from the + menu. In general, the index for a file is regenerated when a file is saved, so this + shouldn't normally be necessary.

+ -

2.2 Novel File Layout

+

3.3 Novel File Layout

Back to top

Files that exist under the NOVEL type root folder can have a number of layouts @@ -137,8 +274,7 @@ - + @@ -156,18 +292,213 @@ + + + + + + + + + + + + + + + +
Title PageThe title page layout. The title should be formatted as a heading of level 1, that - is one hash: # Book TitleThe title page layout. The title should be formatted as a heading level one.
BookA partition can be used to split a the novel into parts. Use a level one heading for this.
ChapterSignifies the start of a new chapter. If the text itself is contained in scene + files, these files should only contain the title and tag references for characters, + plot, etc. The heading for chapters should be level two.
Un-NumberedSame as Chapter, but when exporting the files and automatic chapter numbering is + enabled, this file will not receive a number.
SceneA scene file. This file should have a header of level three. Further sections can + have headers of level four. These will not impact the overall structure, but will + allow for setting new characters and plot references in parts of a scene if such + granularity is needed.
NoteA generic file that is ignored when the novel is exported. These layout is allowed + within the Novel root folder, and is the only layout allowed for a file outside the + Novel root folder.
- -

3. User Interface

+ +

4. Supporting Files (Notes)

Back to top

+

Supporting files, or notes, are any files stored in root folders that are not the Novel root + folder. These files are intended for summaries and outlines of the various plot elements, + characters, locations, and so on, of the novel. These are no required, but making at least + minimal files for each such element makes it possible to use the timeline view feature to + see how each element intersects with each section of the novel itself.

+ + +

4.1 File Tags

+

Back to top

+ +

Each note file can have a tag associated with it, The format of a tag is + @tag: tagname, where tagname is a unique identifier. tags can then be + referenced in the novel files and will then show up as dots in the timeline view.

+

The syntax highlighter will alert the user that the keyword is correctly used and that the + tag is allowed. Duplicate tags should be detected as long as the index is up to date.

+

The tag is the only part of these files that the application used. The rest of the file is + there for the writer to use in whatever way they wish.

+ + +

5. User Interface

+

Back to top

+ +

The user interface is kept as simple as possible to avoid distractions. The main window + contains a tree vew pane with the entire structure of the project, and a small details panel + below it to display additional information.

+

Editing a document can be done by either double-clicking on it, or hitting the return key + when the item is selected. This will open the source editor which uses a simplified markdown + format described in the section below.

+

The document can also be viewed as html with all the comments and commands stripped out. To + view a document, simply press Ctrl+R or select a file and go to Document + > View Document in the menu. The document viewed does not need to be the same + document currently being edited.

+ + +

5.1 Markdown Format

+

Back to top

+ +

the document editor uses a simplified markdown format. That is, it supports basic formatting + like bold, italics and underline, as well as four levels of headings. The formats are listed + below.

+

In addition to these standard markdown features, the editor also allows for comments, that is + text that is ignored by the word counter and not exported or seen in the document viewer. + The editor also has a minimal set of commands used for setting tags and references between + files.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
# TitleHeading level one. The space after the # is mandatory.
## TitleHeading level two. The space after the # is mandatory.
### TitleHeading level three. The space after the # is mandatory.
#### TitleHeading level four. The space after the # is mandatory.
**text**The text is renderred as bold text.
_text_The text is renderred as italics text.
__text__The text is renderred as underlined text.
% text...A comment. The text is not exported, seen in viewer, or counted towards word counts.
@command: valueA command followed by a value, or a comma separated list of values.
+ -

3.1 Keyboard Shortcuts

+

5.2 Keyboard Shortcuts

Back to top

All features are available as keyboard shortcuts. These are as following:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -181,36 +512,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -232,6 +535,14 @@ + + + + + + + + @@ -244,16 +555,24 @@ + + + + + + + +
Ctrl+Shift+OOpen a project.
Ctrl+Shift+SSave the current project.
Ctrl+Shift+WClose the current project.
Ctrl+Shift+,Change project settings.
Ctrl+Shift+NCreate new folder.
Ctrl+E, F2If in tree view, edit a document or folder settings.
Ctrl+DelIf in tree view, move a document to trash, or delete a folder.
Ctrl+QExit novelWriter.
Ctrl+NCreate new document.
Ctrl+OOpen selected document.
ReturnIf in tree view, open a document for editing.
Ctrl+SSave the current document in the editor.
Ctrl+WClose the current document in the editor.
Ctrl+RIf in tree view, open a document for viewing. If in editor pane, open current document for viewing.
Ctrl+Shift+RClose the document view pane.
Ctrl+ZUndo latest changes.
Ctrl+YRedo latest undo.
Ctrl+CCopy selected text to clipboard.
Ctrl+XCut selected text to clipboard.
Ctrl+VPaste text from clipboard to cursor position.
Ctrl+ASelect all text in document.
Ctrl+Shift+ASelect all text in current paragraph.
Ctrl+1 Switch focus to tree view pane.Switch focus to document viewer pane.
ReturnIf in tree view, open a document for editing.
Ctrl+RIf in tree view, open a document for viewing. If in editor pane, open current document for viewing.
Ctrl+EIf in tree view, edit a document or folder settings.
Ctrl+DelIf in tree view, move a document to trash, or delete a folder.
Ctrl+SSave the current document in the editor.
Ctrl+Shift+SSave the current project.
Ctrl+ASelect all text in document.
Ctrl+Shift+ASelect all text in current paragraph.Ctrl+TShow project timeline.
Ctrl+BCtrl+Shift+D Wrap selected text, or word under cursor, in single quotes.
Ctrl+Shift+UpMove item one step up in the tree view.
Ctrl+Shift+DownMove item one step down in the tree view.
Ctrl+F7 Toggle spell checking.Ctrl+. Correct word under cursor.
F9Re-build project indices.
F1Open documentation.
-

4. Technical Information

+

6. Technical Information

Back to top

This section contains details of how novelWriter stores and handles the project data.

-

4.1 How Data is Stored

+

6.1 How Data is Stored

Back to top

Main Project File