diff --git a/boot/boot.js b/boot/boot.js index 11286678d..52b768137 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -96,34 +96,42 @@ Push entries onto an array, removing them first if they already exist in the arr $tw.utils.pushTop = function(array,value) { var t,p; if($tw.utils.isArray(value)) { - // Remove any array entries that are duplicated in the new values - if(value.length !== 0) { - if(array.length !== 0) { - if(value.length < array.length) { - for(t=0; t=0; t--) { - p = value.indexOf(array[t]); - if(p !== -1) { - array.splice(t,1); + } else { + for(t=array.length-1; t>=0; t--) { + p = value.indexOf(array[t]); + if(p !== -1) { + array.splice(t,1); + } } } } - } - // Push the values on top of the main array - array.push.apply(array,value); + // Push the values on top of the main array + Array.prototype.push.apply(array,value); + } } } else { - p = array.indexOf(value); - if(p !== -1) { - array.splice(p,1); + if($tw.config._temp_allowDuplicates) { + array.push(value); + } else { + p = array.indexOf(value); + if(p !== -1) { + array.splice(p,1); + } + array.push(value); } - array.push(value); } return array; }; @@ -423,7 +431,7 @@ $tw.utils.parseStringArray = function(value, allowDuplicate) { match = memberRegExp.exec(value); if(match) { var item = match[1] || match[2]; - if(item !== undefined && (!$tw.utils.hop(names,item) || allowDuplicate)) { + if(item !== undefined && (!$tw.utils.hop(names,item) || allowDuplicate || $tw.config._temp_allowDuplicates)) { results.push(item); names[item] = true; } @@ -2380,14 +2388,25 @@ $tw.loadTiddlersNode = function() { Startup TiddlyWiki */ $tw.boot.initStartup = function(options) { + var _temp_allowDuplicates; + options = options || {}; // Get the URL hash and check for safe mode $tw.locationHash = "#"; if($tw.browser && !$tw.node) { if(location.hash === "#:safe") { $tw.safeMode = true; + } else if(location.hash === "#dupes") { + _temp_allowDuplicates = true; + $tw.locationHash = $tw.utils.getLocationHash(); } else { $tw.locationHash = $tw.utils.getLocationHash(); } + } else { + var p = $tw.boot.argv.indexOf("--dupes"); + if(p !== -1) { + _temp_allowDuplicates = true; + $tw.boot.argv.splice(p,1); + } } // Initialise some more $tw properties $tw.utils.deepDefaults($tw,{ @@ -2396,6 +2415,7 @@ $tw.boot.initStartup = function(options) { types: {} // hashmap by module type of hashmap of exports }, config: { // Configuration overridables + _temp_allowDuplicates: _temp_allowDuplicates, pluginsPath: "../plugins/", themesPath: "../themes/", languagesPath: "../languages/", @@ -2555,6 +2575,14 @@ $tw.boot.execStartup = function(options){ if($tw.crypto) { $tw.crypto.updateCryptoStateTiddler(); } + // Warn if using duplicates mode + console.log("\x1b[0;31m--------=====>>>>>> " + $tw.wiki.getTiddler("$:/core/_temp_allowDuplicates/Heading").fields.text + "\x1b[0m"); + console.log("\x1b[0;34m--------=====>>>>>> " + $tw.wiki.getTiddler("$:/core/_temp_allowDuplicates/Warning").fields.text + "\x1b[0m"); + if($tw.config._temp_allowDuplicates) { + console.log("\x1b[0;31m--------=====>>>>>> " + $tw.wiki.getTiddler("$:/core/_temp_allowDuplicates/StatusOn").fields.text + "\x1b[0m"); + } else { + console.log("\x1b[0;32m--------=====>>>>>> " + $tw.wiki.getTiddler("$:/core/_temp_allowDuplicates/StatusOff").fields.text + "\x1b[0m"); + } // Gather up any startup modules $tw.boot.remainingStartupModules = []; // Array of startup modules $tw.modules.forEachModuleOfType("startup",function(title,module) { diff --git a/core/_temp_allowDuplicates.tid b/core/_temp_allowDuplicates.tid new file mode 100644 index 000000000..27633f3ff --- /dev/null +++ b/core/_temp_allowDuplicates.tid @@ -0,0 +1,92 @@ +title: $:/core/_temp_allowDuplicates +tags: $:/tags/AboveStory + +
+ +<$reveal type="match" state="$:/state/_temp_allowDuplicatesWarning" text="hide" default="show"> + +<$button set="$:/state/_temp_allowDuplicatesWarning" setTo="show" class="tc-btn-invisible" style=" + width: 100%; + text-align: left; + fill: #ff0;"> + +{{$:/core/images/warning}} + + + + + +<$reveal type="nomatch" state="$:/state/_temp_allowDuplicatesWarning" text="hide" default="show"> + +<$button set="$:/state/_temp_allowDuplicatesWarning" setTo="hide" class="tc-btn-invisible" style=" + width: 100%; + text-align: left; + fill: #ff0;"> + +{{$:/core/images/chevron-left}} {{$:/core/images/warning}} + + + +
+ +{{$:/core/_temp_allowDuplicates/Heading}} + +
+ +
+ +{{$:/core/_temp_allowDuplicates/Warning}} + +
+ +<$list filter="1 1 1 1 +[butfirst[]limit[1]]" emptyMessage=""" + +
+ +{{$:/core/_temp_allowDuplicates/StatusOff}} + +//Append `#dupes` to the browser address bar to enable// + +
+"""> + +
+ +{{$:/core/_temp_allowDuplicates/StatusOn}} + +//Remove `#dupes` from the browser address bar to disable// + +
+ + + + + +
+ + diff --git a/core/messages.multids b/core/messages.multids new file mode 100644 index 000000000..5fbe5dafa --- /dev/null +++ b/core/messages.multids @@ -0,0 +1,6 @@ +title: $:/core/_temp_allowDuplicates/ + +Heading: Important Warning +Warning: This is a special prerelease version of TW5 for experimenting with a potentially incompatible change to the core logic of filter processing. It is only intended to be used for evaluation and testing +StatusOff: The allow duplicates setting is currently: OFF +StatusOn: The allow duplicates setting is currently: ON