added multi-part text filter to browser dialog...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2015-06-21 19:58:12 +03:00
parent cca24fad85
commit 43496dafc8

View File

@ -323,11 +323,21 @@ var BrowserPrototype = {
// elements will be searched too. // elements will be searched too.
// //
// //
// TODO pattern modes: // Extended string patterns:
// - lazy match //
// abc -> *abc* -> ^.*abc.*$ // The pattern string is split by whitespace and each resulting
// ab cd -> *ab*cd* -> ^.*ab.*cd.*$ // substring is searched independently.
// - glob // Order is not considered.
//
// Examples:
// 'aaa' - matches any element containing 'aaa'
// same as: /aaa/
// 'aa bb' - matches any element containing both 'aa'
// AND 'bb' in any order.
// same as: /aa.*bb|bb.*aa/
//
//
//
// TODO need to support glob / nested patterns... // TODO need to support glob / nested patterns...
// ..things like /**/a*/*moo/ // ..things like /**/a*/*moo/
// //
@ -376,17 +386,21 @@ var BrowserPrototype = {
} }
// string... // string...
// NOTE: this supports several space-separated patterns.
// XXX support glob... // XXX support glob...
} else if(typeof(pattern) == typeof('str')){ } else if(typeof(pattern) == typeof('str')){
var pl = pattern.trim().split(/\s+/)
var filter = function(i, e){ var filter = function(i, e){
e = $(e) e = $(e)
var t = e.text() var t = e.text()
var i = t.search(pattern) for(var p=0; p < pl.length; p++){
if(!(i >= 0)){ var i = t.search(pl[p])
if(rejected){ if(!(i >= 0)){
rejected.call(e, i, e) if(rejected){
rejected.call(e, i, e)
}
return false
} }
return false
} }
return true return true
} }
@ -411,7 +425,7 @@ var BrowserPrototype = {
// internal actions... // internal actions...
// NOTE: this uses .filter(..) for actual filtering... // NOTE: this uses .filter(..) for actual filtering...
// XXX revise API... // XXX revise API -- seems a bit overcomplicated...
showFiltered: function(pattern){ showFiltered: function(pattern){
var that = this var that = this
var browser = this.dom var browser = this.dom
@ -426,6 +440,7 @@ var BrowserPrototype = {
// basic filter... // basic filter...
} else { } else {
var p = RegExp('(' + pattern.trim().split(/\s+/).join('|') + ')', 'g')
this.filter(pattern, this.filter(pattern,
// rejected... // rejected...
function(i, e){ function(i, e){
@ -441,10 +456,12 @@ var BrowserPrototype = {
false) false)
// passed... // passed...
.removeClass('filtered-out') .removeClass('filtered-out')
// NOTE: this will mess up (clear) any highlighting that was
// present before...
.each(function(_, e){ .each(function(_, e){
e = $(e) e = $(e)
var t = e.text() var t = e.text()
e.html(t.replace(pattern, pattern.bold())) e.html(t.replace(p, '<b>$1</b>'))
}) })
} }
@ -753,13 +770,15 @@ var BrowserPrototype = {
}, },
// extension methods... // extension methods...
// XXX this is wrong...
// ...need to actually open something... // Open action...
//
open: function(path){ open: function(path){
path = path || this.path path = path || this.path
var m = this.options.open var m = this.options.open
return m ? m.apply(this, arguments) : path return m ? m.apply(this, arguments) : path
}, },
// List the path... // List the path...
// //
// This will get passed a path and an item constructor and should // This will get passed a path and an item constructor and should