fix blank/changing regex/tag strings causing duplicates and undefined behavior

This commit is contained in:
Brenden Tuck 2020-01-19 18:36:29 -05:00
parent 1f94555c1a
commit e429481f4a

View file

@ -6,39 +6,53 @@ let spawns = (function () {
var ignoreDefaultKeydown = false; var ignoreDefaultKeydown = false;
var spawnmap = {}; // Mapping of regex/tag-pair var spawnmap = {}; // { id1: { r:regex, t:tag } } pseudo-array of regex-tag pairs
//
// changes the spawnmap row's contents to the new regex/tag provided,
// this avoids leaving stale regex/tag definitions in the spawnmap
var onAlterTag = function (evnt) { var onAlterTag = function (evnt) {
var children = $(evnt.target).parent().children(); var adult = $(evnt.target).parent();
var regex = $(children[0]).val(); var children = adult.children();
var myval = $(children[1]).val(); var id = $(adult).data('id');
var regex = $(children[0]).val();// spaces before/after are valid regex syntax, unfortunately
var mytag = $(children[1]).val().trim();
if( myval != "" && regex != "" ) { if( mytag != "" && regex != "" ) {
spawnmap[regex] = myval; if( !(id in spawnmap) ) {
spawnmap[id] = {};
}
spawnmap[id]["r"] = regex;
spawnmap[id]["t"] = mytag;
localStorage.setItem( "evenniaMessageRoutingSavedState", JSON.stringify(spawnmap) ); localStorage.setItem( "evenniaMessageRoutingSavedState", JSON.stringify(spawnmap) );
window.plugins["goldenlayout"].addKnownType( myval ); window.plugins["goldenlayout"].addKnownType( mytag );
} }
} }
//
// deletes the entire regex/tag/delete button row.
var onDeleteTag = function (evnt) { var onDeleteTag = function (evnt) {
var adult = $(evnt.target).parent(); var adult = $(evnt.target).parent();
var children = adult.children(); var children = adult.children();
var regex = $(children[0]).val(); var id = $(adult).data('id');
delete spawnmap[regex]; delete spawnmap[id];
localStorage.setItem( "evenniaMessageRoutingSavedState", JSON.stringify(spawnmap) ); localStorage.setItem( "evenniaMessageRoutingSavedState", JSON.stringify(spawnmap) );
adult.remove(); // remove this set of input boxes/etc from the DOM adult.remove(); // remove this set of input boxes/etc from the DOM
} }
//
var onFocusIn = function (evnt) { var onFocusIn = function (evnt) {
ignoreDefaultKeydown = true; ignoreDefaultKeydown = true;
} }
//
var onFocusOut = function (evnt) { var onFocusOut = function (evnt) {
ignoreDefaultKeydown = false; ignoreDefaultKeydown = false;
} }
var onNewRegexRow = function (formdiv, regexstring, tagstring) { //
var div = $('<div>'); // display a row with proper editting hooks
var displayRow = function (formdiv, div, regexstring, tagstring) {
var regex = $('<input class="regex" type=text value="'+regexstring+'"/>'); var regex = $('<input class="regex" type=text value="'+regexstring+'"/>');
var tag = $('<input class="tag" type=text value="'+tagstring+'"/>'); var tag = $('<input class="tag" type=text value="'+tagstring+'"/>');
var del = $('<input class="delete-regex" type=button value="X"/>'); var del = $('<input class="delete-regex" type=button value="X"/>');
@ -55,25 +69,37 @@ let spawns = (function () {
formdiv.append(div); formdiv.append(div);
} }
//
// generate a whole new regex/tag/delete button row
var onNewRegexRow = function (formdiv) {
var nextid = 1;
while( nextid in spawnmap ) { // pseudo-index spawnmap with id reuse
nextid++;
}
var div = $("<div data-id='"+nextid+"'>");
displayRow(formdiv, div, "", "");
}
// Public // Public
// //
// onOptionsUI -- create an expandable/deletable row of regex/tag mapping pairs // onOptionsUI -- display the existing spawnmap and a button to create more entries.
//
// If there isn't a window with that tag mapped already, open a new one
// //
var onOptionsUI = function (parentdiv) { var onOptionsUI = function (parentdiv) {
var div = $('<div>'); var formdiv = $('<div>');
var button= $('<input type="button" value="New Regex/Tag Pair" />'); var button= $('<input type="button" value="New Regex/Tag Pair" />');
button.on('click', function () { onNewRegexRow(div, '', ''); }); button.on('click', function () { onNewRegexRow(formdiv) });
div.append(button); formdiv.append(button);
for( regex in spawnmap ) { // display the existing spawnmap
onNewRegexRow(div, regex, spawnmap[regex] ); for( var id in spawnmap ) {
var div = $("<div data-id='"+id+"'>");
displayRow(formdiv, div, spawnmap[id]["r"], spawnmap[id]["t"] );
} }
parentdiv.append('<div style="font-weight: bold">Message Routing:</div>'); parentdiv.append('<div style="font-weight: bold">Message Routing:</div>');
parentdiv.append(div); parentdiv.append(formdiv);
} }
// //
@ -83,10 +109,10 @@ let spawns = (function () {
// //
var onText = function (args, kwargs) { var onText = function (args, kwargs) {
var txt = args[0]; var txt = args[0];
for( var id in spawnmap ) {
for( regex in spawnmap ) { var regex = spawnmap[id]["r"];
if ( txt.match(regex) != null ) { if ( txt.match(regex) != null ) {
kwargs['type'] = spawnmap[regex]; kwargs['type'] = spawnmap[id]["t"];
} }
} }
} }
@ -107,8 +133,8 @@ let spawns = (function () {
var ls_spawnmap = localStorage.getItem( "evenniaMessageRoutingSavedState" ); var ls_spawnmap = localStorage.getItem( "evenniaMessageRoutingSavedState" );
if( ls_spawnmap ) { if( ls_spawnmap ) {
spawnmap = JSON.parse(ls_spawnmap); spawnmap = JSON.parse(ls_spawnmap);
for( regex in spawnmap ) { for( var id in spawnmap ) {
window.plugins["goldenlayout"].addKnownType( spawnmap[regex] ); window.plugins["goldenlayout"].addKnownType( spawnmap[id]["t"] );
} }
} }