diff --git a/pkgs/plt-services/meta/pkg-index/official/static.rkt b/pkgs/plt-services/meta/pkg-index/official/static.rkt index 0e70592971..1206ae918a 100644 --- a/pkgs/plt-services/meta/pkg-index/official/static.rkt +++ b/pkgs/plt-services/meta/pkg-index/official/static.rkt @@ -23,6 +23,8 @@ n] [#f #f] + [#t + #t] [(? symbol? s) (symbol->string s)] [(? keyword? s) @@ -48,10 +50,27 @@ (pkg-index/basic (λ () pkg-list) (λ (pkg-name) - (define ht (file->value (build-path pkgs-path 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) diff --git a/pkgs/plt-services/meta/pkg-index/official/static/index.js b/pkgs/plt-services/meta/pkg-index/official/static/index.js index cbaca5f0f0..8d5c11084f 100644 --- a/pkgs/plt-services/meta/pkg-index/official/static/index.js +++ b/pkgs/plt-services/meta/pkg-index/official/static/index.js @@ -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 [$('', { 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 [$('', { 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"); - }; - });