From 7b73d7cfdd181688c75bb5a87996f0ddb52cb7d5 Mon Sep 17 00:00:00 2001 From: henk717 Date: Sat, 23 Oct 2021 17:30:48 +0200 Subject: [PATCH] Single Line Mode Adds Single Line mode, optimized for things like chatbot testing and other cases where you want to have control over what happens after a paragraph. This can also be used as a foundation for a chatbot optimized interface mode. --- .gitignore | 1 + aiserver.py | 12 +++++++++++- gensettings.py | 5 +++++ static/application.js | 3 +++ utils.py | 15 +++++++++++++++ 5 files changed, 35 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index dd922f16..47d30434 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ settings/* miniconda3/* *.settings __pycache__ +*.log # Ignore PyCharm project files. .idea diff --git a/aiserver.py b/aiserver.py index 3638fec4..b373cc91 100644 --- a/aiserver.py +++ b/aiserver.py @@ -100,7 +100,7 @@ class vars: hascuda = False # Whether torch has detected CUDA on the system usegpu = False # Whether to launch pipeline with GPU support custmodpth = "" # Filesystem location of custom model to run - formatoptns = {'frmttriminc': True, 'frmtrmblln': False, 'frmtrmspch': False, 'frmtadsnsp': False} # Container for state of formatting options + formatoptns = {'frmttriminc': True, 'frmtrmblln': False, 'frmtrmspch': False, 'frmtadsnsp': False, 'singleline': False} # Container for state of formatting options importnum = -1 # Selection on import popup list importjs = {} # Temporary storage for import data loadselect = "" # Temporary storage for filename to load @@ -114,6 +114,7 @@ class vars: smandelete = False # Whether stories can be deleted from inside the browser smanrename = False # Whether stories can be renamed from inside the browser laststory = None # Filename (without extension) of most recent story JSON file we loaded + regex_sl = re.compile(r'\n*(?<=.) *\n(.|\n)*') # Pattern for limiting the output to a single line acregex_ai = re.compile(r'\n* *>(.|\n)*') # Pattern for matching adventure actions from the AI so we can remove them acregex_ui = re.compile(r'^ *(>.*)$', re.MULTILINE) # Pattern for matching actions in the HTML-escaped story so we can apply colouring, etc (make sure to encase part to format in parentheses) actionmode = 1 @@ -773,6 +774,11 @@ def get_message(msg): vars.formatoptns["frmtadsnsp"] = msg['data'] settingschanged() refresh_settings() + elif(msg['cmd'] == 'singleline'): + if('singleline' in vars.formatoptns): + vars.formatoptns["singleline"] = msg['data'] + settingschanged() + refresh_settings() elif(msg['cmd'] == 'importselect'): vars.importnum = int(msg["data"].replace("import", "")) elif(msg['cmd'] == 'importcancel'): @@ -1499,6 +1505,9 @@ def applyoutputformatting(txt): # Remove special characters if(vars.formatoptns["frmtrmspch"]): txt = utils.removespecialchars(txt, vars) + # Single Line Mode + if(vars.formatoptns["singleline"]): + txt = utils.singlelineprocessing(txt, vars) return txt @@ -1581,6 +1590,7 @@ def refresh_settings(): emit('from_server', {'cmd': 'updatefrmtrmblln', 'data': vars.formatoptns["frmtrmblln"]}, broadcast=True) emit('from_server', {'cmd': 'updatefrmtrmspch', 'data': vars.formatoptns["frmtrmspch"]}, broadcast=True) emit('from_server', {'cmd': 'updatefrmtadsnsp', 'data': vars.formatoptns["frmtadsnsp"]}, broadcast=True) + emit('from_server', {'cmd': 'updatesingleline', 'data': vars.formatoptns["singleline"]}, broadcast=True) # Allow toggle events again emit('from_server', {'cmd': 'allowtoggle', 'data': True}, broadcast=True) diff --git a/gensettings.py b/gensettings.py index eb50476e..b35b6a21 100644 --- a/gensettings.py +++ b/gensettings.py @@ -228,4 +228,9 @@ formatcontrols = [{ "label": "Add sentence spacing", "id": "frmtadsnsp", "tooltip": "If the last action ended with punctuation, add a space to the beginning of the next action." + }, + { + "label": "Single Line", + "id": "singleline", + "tooltip": "Only allows the AI to output anything before the enter" }] \ No newline at end of file diff --git a/static/application.js b/static/application.js index 86bee330..61e03eca 100644 --- a/static/application.js +++ b/static/application.js @@ -1435,6 +1435,9 @@ $(document).ready(function(){ } else if(msg.cmd == "updatefrmtadsnsp") { // Update toggle state $("#frmtadsnsp").prop('checked', msg.data).change(); + } else if(msg.cmd == "updatesingleline") { + // Update toggle state + $("#singleline").prop('checked', msg.data).change(); } else if(msg.cmd == "allowtoggle") { // Allow toggle change states to propagate allowtoggle = msg.data; diff --git a/utils.py b/utils.py index e84133d5..95480c96 100644 --- a/utils.py +++ b/utils.py @@ -83,6 +83,21 @@ def addsentencespacing(txt, vars): if(lastchar == "." or lastchar == "!" or lastchar == "?" or lastchar == "," or lastchar == ";" or lastchar == ":"): txt = " " + txt return txt + +def singlelineprocessing(txt, vars): + txt = vars.regex_sl.sub('', txt) + if(len(vars.actions) > 0): + if(len(vars.actions[vars.actions.get_last_key()]) > 0): + lastchar = vars.actions[vars.actions.get_last_key()][-1] + else: + # Last action is blank, this should never happen, but + # since it did let's bail out. + return txt + else: + lastchar = vars.prompt[-1] + if(lastchar != "\n"): + txt = txt + "\n" + return txt #==================================================================# # Cleans string for use in file name