214 lines
6.1 KiB
Python
214 lines
6.1 KiB
Python
# -*- coding: utf-8 -*
|
||
"""novelWriter Init
|
||
|
||
novelWriter – Init File
|
||
=========================
|
||
Application initialisation
|
||
|
||
File History:
|
||
Created: 2018-09-22 [0.1.0]
|
||
|
||
"""
|
||
|
||
import logging
|
||
import getopt
|
||
|
||
from os import path, remove, rename
|
||
from PyQt5.QtWidgets import QApplication
|
||
from nw.main import NovelWriter
|
||
from nw.config import Config
|
||
|
||
__package__ = "novelWriter"
|
||
__author__ = "Veronica Berglyd Olsen"
|
||
__copyright__ = "Copyright 2016-2018, Veronica Berglyd Olsen"
|
||
__credits__ = ["Veronica Berglyd Olsen"]
|
||
__license__ = "GPLv3"
|
||
__version__ = "0.1.0"
|
||
__date__ = "2018"
|
||
__maintainer__ = "Veronica Berglyd Olsen"
|
||
__email__ = "code@vkbo.net"
|
||
__status__ = "Development"
|
||
__url__ = "https://github.com/vkbo/novelWriter"
|
||
|
||
#
|
||
# Logging
|
||
# =========
|
||
# Standard used for logging levels in novelWriter:
|
||
# CRITICAL Use for errors that result in termination of the program
|
||
# ERROR Use when an action fails, but execution continues
|
||
# WARNING When something unexpected, but non-critical happens
|
||
# INFO Any useful user information like open, save, exit initiated
|
||
# ----------- SPAM Threshold : Output above should be minimal -----------------
|
||
# DEBUG Use for descriptions of main program flow
|
||
# VERBOSE Use for outputting values and program flow details
|
||
# VVERBOSE Use for describing what the user does, like clicks and entries
|
||
#
|
||
|
||
# Adding verbose and vverbose logging levels
|
||
|
||
VERBOSE = 9
|
||
VVERBOSE = 8
|
||
logging.addLevelName(VERBOSE, "DEBUGV")
|
||
logging.addLevelName(VVERBOSE,"DEBUGVV")
|
||
|
||
def logVerbose(self, message, *args, **kws):
|
||
if self.isEnabledFor(VERBOSE):
|
||
self._log(VERBOSE, message, args, **kws)
|
||
def logVVerbose(self, message, *args, **kws):
|
||
if self.isEnabledFor(VVERBOSE):
|
||
self._log(VVERBOSE, message, args, **kws)
|
||
|
||
logging.Logger.verbose = logVerbose
|
||
logging.Logger.vverbose = logVVerbose
|
||
|
||
# Initiating logging
|
||
logger = logging.getLogger(__name__)
|
||
|
||
#
|
||
# Main Program
|
||
# ==============
|
||
#
|
||
|
||
# Load the main config as a global object
|
||
CONFIG = Config()
|
||
|
||
# Constants
|
||
DOCTYPE_ABOUT = 0
|
||
DOCTYPE_DOC = 1
|
||
DOCTYPE_PROJECT = 2
|
||
|
||
def main(sysArgs):
|
||
"""
|
||
Parses command line, sets up logging, and launches main GUI.
|
||
"""
|
||
|
||
# Valid Input Options
|
||
shortOpt = "hd:Dqtl:v"
|
||
longOpt = [
|
||
"help",
|
||
"debug=",
|
||
"verbose",
|
||
"vverbose",
|
||
"debuggui",
|
||
"quiet",
|
||
"time",
|
||
"logfile=",
|
||
"version",
|
||
"config=",
|
||
"headless",
|
||
]
|
||
|
||
helpMsg = (
|
||
"novelWriter {version} ({status})\n"
|
||
"{copyright}\n"
|
||
"\n"
|
||
"Usage:\n"
|
||
" -h, --help Print this message.\n"
|
||
" -v, --version Print program version and exit.\n"
|
||
" -d, --debug Debug level. Valid options are DEBUG, INFO, WARN or ERROR.\n"
|
||
" --verbose Increase verbosity of debug.\n"
|
||
" --vverbose Increase verbosity of debug even more.\n"
|
||
" -D, --debuggui Shows additional debug GUI elements.\n"
|
||
" -q, --quiet Disable output to command line. Does not affect log file.\n"
|
||
" -t, --time Shows time stamp in logging output. Adds milliseconds for verbose.\n"
|
||
" -l, --logfile Specify log file.\n"
|
||
" --config Alternative config file.\n"
|
||
" --headless Do not display GUI. Useful for testing scripts.\n"
|
||
).format(
|
||
version = __version__,
|
||
status = __status__,
|
||
copyright = __copyright__
|
||
)
|
||
|
||
# Defaults
|
||
debugLevel = logging.WARN
|
||
debugStr = "{levelname:8} {message:}"
|
||
timeStr = "[{asctime:}] "
|
||
logFile = ""
|
||
toFile = False
|
||
toStd = True
|
||
showTime = False
|
||
confPath = None
|
||
showGUI = True
|
||
debugGUI = False
|
||
|
||
# Parse Options
|
||
try:
|
||
inOpts, inArgs = getopt.getopt(sysArgs,shortOpt,longOpt)
|
||
except getopt.GetoptError:
|
||
print(helpMsg)
|
||
exit(2)
|
||
|
||
for inOpt, inArg in inOpts:
|
||
if inOpt in ("-h","--help"):
|
||
print(helpMsg)
|
||
exit()
|
||
elif inOpt in ("-v", "--version"):
|
||
print("makeNovel %s Version %s" % (__status__,__version__))
|
||
exit()
|
||
elif inOpt in ("-d", "--debug"):
|
||
if inArg == "ERROR":
|
||
debugLevel = logging.ERROR
|
||
elif inArg == "WARN":
|
||
debugLevel = logging.WARNING
|
||
elif inArg == "INFO":
|
||
debugLevel = logging.INFO
|
||
elif inArg == "DEBUG":
|
||
debugLevel = logging.DEBUG
|
||
debugStr = "{name:>22}:{lineno:<4d} {levelname:8} {message:}"
|
||
else:
|
||
print("Invalid debug level")
|
||
exit(2)
|
||
elif inOpt in ("-l","--logfile"):
|
||
logFile = inArg
|
||
toFile = True
|
||
elif inOpt in ("-q","--quiet"):
|
||
toStd = False
|
||
elif inOpt in ("--verbose"):
|
||
debugLevel = VERBOSE
|
||
timeStr = "[{asctime:}.{msecs:03.0f}] "
|
||
elif inOpt in ("--vverbose"):
|
||
debugLevel = VVERBOSE
|
||
timeStr = "[{asctime:}.{msecs:03.0f}] "
|
||
elif inOpt in ("-t","--time"):
|
||
showTime = True
|
||
elif inOpt in ("--config"):
|
||
confPath = inArg
|
||
elif inOpt in ("--headless"):
|
||
showGUI = False
|
||
elif inOpt in ("-D","--debuggui"):
|
||
debugGUI = True
|
||
|
||
# Set GUI options
|
||
CONFIG.showGUI = showGUI
|
||
CONFIG.debugGUI = debugGUI
|
||
|
||
# Set Logging
|
||
if showTime: debugStr = timeStr+debugStr
|
||
logFmt = logging.Formatter(fmt=debugStr,datefmt="%Y-%m-%d %H:%M:%S",style="{")
|
||
|
||
if not logFile == "" and toFile:
|
||
if path.isfile(logFile+".bak"):
|
||
remove(logFile+".bak")
|
||
if path.isfile(logFile):
|
||
rename(logFile,logFile+".bak")
|
||
|
||
fHandle = logging.FileHandler(logFile)
|
||
fHandle.setLevel(debugLevel)
|
||
fHandle.setFormatter(logFmt)
|
||
logger.addHandler(fHandle)
|
||
|
||
if toStd:
|
||
cHandle = logging.StreamHandler()
|
||
cHandle.setLevel(debugLevel)
|
||
cHandle.setFormatter(logFmt)
|
||
logger.addHandler(cHandle)
|
||
|
||
logger.setLevel(debugLevel)
|
||
|
||
nwApp = QApplication([])
|
||
nwGUI = NovelWriter()
|
||
exit(nwApp.exec_())
|
||
|
||
return
|