Eval search on server, use hash, and only add once

This commit is contained in:
Jay McCarthy 2013-10-08 06:34:11 -06:00
parent 4cb98ac8df
commit ecfc9dc968
2 changed files with 68 additions and 56 deletions

View File

@ -23,6 +23,8 @@
n]
[#f
#f]
[#t
#t]
[(? symbol? s)
(symbol->string s)]
[(? keyword? s)
@ -49,9 +51,26 @@
(λ () pkg-list)
(λ (pkg-name)
(define ht (file->value (build-path pkgs-path pkg-name)))
(hash-set* ht
'name pkg-name
'tags (hash-ref ht 'tags empty)
'search-terms
(let* ([st (hasheq)]
[st (for/fold ([st st])
([t (in-list (hash-ref ht 'tags empty))])
(hash-set st (string->symbol t) #t))]
[st (hash-set st (string->symbol (format "ring:~a" (hash-ref ht 'ring 2))) #t)]
[st (for/fold ([st st])
([a (in-list (author->list (hash-ref ht 'author "")))])
(hash-set st (string->symbol (format "author:~a" a)) #t))]
[st (if (empty? (hash-ref ht 'tags empty))
(hash-set st ':no-tag: #t)
st)]
[st (if (hash-ref ht 'checksum-error #f)
(hash-set st ':error: #t)
st)])
st)
'authors (author->list (hash-ref ht 'author ""))))))
(define (url->request u)

View File

@ -6,13 +6,13 @@
// xxx manage packages
$( document ).ready(function() {
var search_terms = [ "!main-tests", "!main-distribution" ];
var search_terms = { "!main-tests": true, "!main-distribution": true };
function addfilterlink ( text, term ) {
return [$('<a>', { text: text,
href: "javascript:void(0)",
click: function () {
search_terms.push(term);
search_terms[term] = true;
evaluate_search();
} } ),
" "
@ -22,16 +22,59 @@ $( document ).ready(function() {
return [$('<a>', { text: text,
href: "javascript:void(0)",
click: function () {
search_terms = $.grep( search_terms, function (v) { return v != term } );
delete search_terms[term];
evaluate_search();
} } ),
" "
];
};
$.getJSON( "/pkgs-all.json", function( resp ) {
function evaluate_search () {
$.each( $('#packages_table tr'), function (key, dom) {
var value = $(dom).data("obj");
var show = true;
var vterms = value['search-terms'];
$.each(search_terms,
function ( term, termv ) {
if ( term.charAt(0) == "!" ) {
if ( vterms[term.substring(1)] ) {
show = false;
}
} else {
if ( ! vterms[term] ) {
show = false;
}
}
});
if ( show ) {
$(dom).show();
} else {
$(dom).hide();
}
});
// xxx handle search button
// xxx update menu available
$("#search_menu").html("").append( $.map( search_terms, function ( term, i ) {
return removefilterlink ( i, i );
} ) );
$("#packages_table tr:visible:even").removeClass("even");
$("#packages_table tr:visible:odd").addClass("even");
};
function object_keys ( o ) {
var names = [];
$.each(resp, function(key, value) { names.push(key) });
$.each(o, function(key, value) { names.push(key) });
return names;
}
$.getJSON( "/pkgs-all.json", function( resp ) {
var names = object_keys(resp);
var snames = names.sort(function(a,b) {
return ((a < b) ? -1 : ((a > b) ? 1 : 0));
})
@ -63,54 +106,4 @@ $( document ).ready(function() {
evaluate_search();
});
function evaluate_search_term( value, term ) {
if ( term == ":error:") {
return value['checksum-error'];
} else if ( term == ":no-tag:") {
return value['tags'].length == 0;
} else if ( term.substring(0, 5) == "ring:") {
return value['ring'] == term.substring(5);
} else if ( term.substring(0, 7) == "author:") {
return ($.inArray( term.substring(7), value['authors'] ) != -1);
} else if ( term.charAt(0) == "!" ) {
return ! evaluate_search_term( value, term.substring(1) );
} else if ( $.inArray( term, value['tags']) != -1 ) {
return true;
} else {
return false;
}
}
function evaluate_search () {
$.each( $('#packages_table tr'), function (key, dom) {
var value = $(dom).data("obj");
var show = true;
for (termi in search_terms) {
var term = search_terms[termi];
if ( ! evaluate_search_term( value, term ) ) {
show = false;
}
}
if ( show ) {
$(dom).show();
} else {
$(dom).hide();
}
});
// xxx handle search button
// xxx update menu available
$("#search_menu").html("").append( $.map( search_terms, function ( term, i ) {
return removefilterlink ( term, term );
} ) );
$("#packages_table tr:visible:even").removeClass("even");
$("#packages_table tr:visible:odd").addClass("even");
};
});