Initial pass at S3 version
This commit is contained in:
parent
0371ade45e
commit
4cb98ac8df
|
@ -1 +1,5 @@
|
||||||
/root
|
/root
|
||||||
|
/static/pkgs
|
||||||
|
/static/pkg
|
||||||
|
/static/pkgs-all
|
||||||
|
*json
|
||||||
|
|
31
pkgs/plt-services/meta/pkg-index/official/common.rkt
Normal file
31
pkgs/plt-services/meta/pkg-index/official/common.rkt
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
#lang racket/base
|
||||||
|
(require racket/file
|
||||||
|
racket/runtime-path
|
||||||
|
pkg/util
|
||||||
|
racket/string
|
||||||
|
web-server/http/id-cookie)
|
||||||
|
|
||||||
|
(define-runtime-path src ".")
|
||||||
|
|
||||||
|
(define-runtime-path root "root")
|
||||||
|
(make-directory* root)
|
||||||
|
(define secret-key
|
||||||
|
(make-secret-salt/file
|
||||||
|
(build-path root "secret.key")))
|
||||||
|
(define users-path (build-path root "users"))
|
||||||
|
(make-directory* users-path)
|
||||||
|
(define users.new-path (build-path root "users.new"))
|
||||||
|
(make-directory* users.new-path)
|
||||||
|
|
||||||
|
(github-client_id (file->string (build-path root "client_id")))
|
||||||
|
(github-client_secret (file->string (build-path root "client_secret")))
|
||||||
|
|
||||||
|
(define pkgs-path (build-path root "pkgs"))
|
||||||
|
(make-directory* pkgs-path)
|
||||||
|
|
||||||
|
(define static-path (build-path src "static"))
|
||||||
|
|
||||||
|
(define (author->list as)
|
||||||
|
(string-split as))
|
||||||
|
|
||||||
|
(provide (all-defined-out))
|
|
@ -2,6 +2,7 @@
|
||||||
(module+ test
|
(module+ test
|
||||||
(require rackunit))
|
(require rackunit))
|
||||||
(require web-server/http
|
(require web-server/http
|
||||||
|
"common.rkt"
|
||||||
web-server/servlet-env
|
web-server/servlet-env
|
||||||
racket/file
|
racket/file
|
||||||
xml
|
xml
|
||||||
|
@ -38,24 +39,6 @@
|
||||||
(define (salty str)
|
(define (salty str)
|
||||||
(sha1 (open-input-string str)))
|
(sha1 (open-input-string str)))
|
||||||
|
|
||||||
(define-runtime-path src ".")
|
|
||||||
|
|
||||||
(define-runtime-path root "root")
|
|
||||||
(make-directory* root)
|
|
||||||
(define secret-key
|
|
||||||
(make-secret-salt/file
|
|
||||||
(build-path root "secret.key")))
|
|
||||||
(define users-path (build-path root "users"))
|
|
||||||
(make-directory* users-path)
|
|
||||||
(define users.new-path (build-path root "users.new"))
|
|
||||||
(make-directory* users.new-path)
|
|
||||||
|
|
||||||
(github-client_id (file->string (build-path root "client_id")))
|
|
||||||
(github-client_secret (file->string (build-path root "client_secret")))
|
|
||||||
|
|
||||||
(define pkgs-path (build-path root "pkgs"))
|
|
||||||
(make-directory* pkgs-path)
|
|
||||||
|
|
||||||
(define id-cookie-name "pnrid")
|
(define id-cookie-name "pnrid")
|
||||||
|
|
||||||
;; XXX Add a caching system
|
;; XXX Add a caching system
|
||||||
|
@ -159,9 +142,6 @@
|
||||||
new-v]))
|
new-v]))
|
||||||
#f)))
|
#f)))
|
||||||
|
|
||||||
(define (author->list as)
|
|
||||||
(string-split as))
|
|
||||||
|
|
||||||
(define (page/rss req)
|
(define (page/rss req)
|
||||||
(define ps
|
(define ps
|
||||||
(sort (map package-info (package-list))
|
(sort (map package-info (package-list))
|
||||||
|
@ -1132,7 +1112,7 @@
|
||||||
#:ssl-cert (build-path root "server-cert.pem")
|
#:ssl-cert (build-path root "server-cert.pem")
|
||||||
#:ssl-key (build-path root "private-key.pem")
|
#:ssl-key (build-path root "private-key.pem")
|
||||||
#:extra-files-paths
|
#:extra-files-paths
|
||||||
(list (build-path src "static"))
|
(list static-path)
|
||||||
#:servlet-regexp #rx""
|
#:servlet-regexp #rx""
|
||||||
#:port port))
|
#:port port))
|
||||||
|
|
||||||
|
|
75
pkgs/plt-services/meta/pkg-index/official/static.rkt
Normal file
75
pkgs/plt-services/meta/pkg-index/official/static.rkt
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
#lang racket/base
|
||||||
|
(require web-server/http
|
||||||
|
racket/file
|
||||||
|
racket/match
|
||||||
|
json
|
||||||
|
net/url
|
||||||
|
racket/list
|
||||||
|
racket/path
|
||||||
|
racket/promise
|
||||||
|
meta/pkg-index/basic/main)
|
||||||
|
|
||||||
|
(define convert-to-json
|
||||||
|
(match-lambda
|
||||||
|
[(? list? l)
|
||||||
|
(map convert-to-json l)]
|
||||||
|
[(? string? s)
|
||||||
|
s]
|
||||||
|
[(? hash? ht)
|
||||||
|
(for/hash ([(k v) (in-hash ht)])
|
||||||
|
(values (convert-to-json-key k)
|
||||||
|
(convert-to-json v)))]
|
||||||
|
[(? number? n)
|
||||||
|
n]
|
||||||
|
[#f
|
||||||
|
#f]
|
||||||
|
[(? symbol? s)
|
||||||
|
(symbol->string s)]
|
||||||
|
[(? keyword? s)
|
||||||
|
(hasheq 'kw (keyword->string s))]
|
||||||
|
[x
|
||||||
|
(error 'convert-to-json "~e" x)]))
|
||||||
|
(define convert-to-json-key
|
||||||
|
(match-lambda
|
||||||
|
[(? string? s)
|
||||||
|
(string->symbol s)]
|
||||||
|
[(? symbol? s)
|
||||||
|
s]
|
||||||
|
[x
|
||||||
|
(error 'convert-to-json-key "~e" x)]))
|
||||||
|
|
||||||
|
(module+ main
|
||||||
|
(require "common.rkt")
|
||||||
|
|
||||||
|
(define pkg-list
|
||||||
|
(map path->string (directory-list pkgs-path)))
|
||||||
|
|
||||||
|
(define dispatch
|
||||||
|
(pkg-index/basic
|
||||||
|
(λ () 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)
|
||||||
|
'authors (author->list (hash-ref ht 'author ""))))))
|
||||||
|
|
||||||
|
(define (url->request u)
|
||||||
|
(make-request #"GET" (string->url u) empty
|
||||||
|
(delay empty) #f "1.2.3.4" 80 "4.3.2.1"))
|
||||||
|
|
||||||
|
(define (cache url file)
|
||||||
|
(define p (build-path static-path file))
|
||||||
|
(make-directory* (path-only p))
|
||||||
|
(with-output-to-file p
|
||||||
|
#:exists 'replace
|
||||||
|
(λ () ((response-output (dispatch (url->request url))) (current-output-port))))
|
||||||
|
(with-output-to-file (path-add-suffix p #".json")
|
||||||
|
#:exists 'replace
|
||||||
|
(λ () (write-json (convert-to-json (file->value p)))))
|
||||||
|
(void))
|
||||||
|
|
||||||
|
(cache "/pkgs" "pkgs")
|
||||||
|
(cache "/pkgs-all" "pkgs-all")
|
||||||
|
(for ([p (in-list pkg-list)])
|
||||||
|
(cache (format "/pkg/~a" p) (format "pkg/~a" p))))
|
39
pkgs/plt-services/meta/pkg-index/official/static/index.html
Normal file
39
pkgs/plt-services/meta/pkg-index/official/static/index.html
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Packages > Search > !main-distribution > !main-tests</title>
|
||||||
|
<script src="/sorttable.js"></script>
|
||||||
|
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
|
||||||
|
<script src="/index.js"></script>
|
||||||
|
<link rel="stylesheet" type="text/css" href="/style.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="breadcrumb">
|
||||||
|
<span><a href="/">Packages</a></span> >
|
||||||
|
<span>Search</span>
|
||||||
|
|
||||||
|
<span id="logout">jay.mccarthy@gmail.com | <a href="/curate">curate</a> | <a href="/rss">rss</a> | <a href="/account/login">re-login</a> | <a href="/account/logout">logout</a></span>
|
||||||
|
</div>
|
||||||
|
<div id="menu"><form action="/query/search/!main-distribution/!main-tests">
|
||||||
|
<span class="menu_option"><input name="input_0" type="text"><input type="submit" value="Search"></span><span class="menu_option"><a href="/manage">Manage
|
||||||
|
Your Packages</a></span>
|
||||||
|
</form></div>
|
||||||
|
<p id="search_menu"></p>
|
||||||
|
<table class="packages sortable">
|
||||||
|
<thead><tr>
|
||||||
|
<th>Package</th>
|
||||||
|
<th>Authors</th>
|
||||||
|
<th>Description</th>
|
||||||
|
<th>Tags</th>
|
||||||
|
</tr></thead>
|
||||||
|
<tbody id="packages_table">
|
||||||
|
</tbody>
|
||||||
|
<tfoot></tfoot>
|
||||||
|
</table>
|
||||||
|
<div id="footer">
|
||||||
|
Powered by <a href="http://racket-lang.org">Racket</a> and a
|
||||||
|
mess of ugly JS. Written
|
||||||
|
by <a href="http://faculty.cs.byu.edu/~jay">Jay McCarthy</a>.
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
116
pkgs/plt-services/meta/pkg-index/official/static/index.js
Normal file
116
pkgs/plt-services/meta/pkg-index/official/static/index.js
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
// xxx curate
|
||||||
|
// xxx rss
|
||||||
|
// xxx re-login
|
||||||
|
// xxx logout
|
||||||
|
// xxx what user am i
|
||||||
|
// xxx manage packages
|
||||||
|
|
||||||
|
$( document ).ready(function() {
|
||||||
|
var search_terms = [ "!main-tests", "!main-distribution" ];
|
||||||
|
|
||||||
|
function addfilterlink ( text, term ) {
|
||||||
|
return [$('<a>', { text: text,
|
||||||
|
href: "javascript:void(0)",
|
||||||
|
click: function () {
|
||||||
|
search_terms.push(term);
|
||||||
|
evaluate_search();
|
||||||
|
} } ),
|
||||||
|
" "
|
||||||
|
];
|
||||||
|
};
|
||||||
|
function removefilterlink ( text, term ) {
|
||||||
|
return [$('<a>', { text: text,
|
||||||
|
href: "javascript:void(0)",
|
||||||
|
click: function () {
|
||||||
|
search_terms = $.grep( search_terms, function (v) { return v != term } );
|
||||||
|
evaluate_search();
|
||||||
|
} } ),
|
||||||
|
" "
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
$.getJSON( "/pkgs-all.json", function( resp ) {
|
||||||
|
var names = [];
|
||||||
|
$.each(resp, function(key, value) { names.push(key) });
|
||||||
|
var snames = names.sort(function(a,b) {
|
||||||
|
return ((a < b) ? -1 : ((a > b) ? 1 : 0));
|
||||||
|
})
|
||||||
|
|
||||||
|
var now = new Date().getTime() / 1000;
|
||||||
|
|
||||||
|
$.each( snames,
|
||||||
|
function (name_i) {
|
||||||
|
var name = snames[name_i];
|
||||||
|
var value = resp[name];
|
||||||
|
|
||||||
|
$('<tr>',
|
||||||
|
{ class: ((now - (60*60*24*2)) < value['last-updated'] ? "recent" : "old") }).
|
||||||
|
data( "obj", value).append(
|
||||||
|
$('<td>').html( $('<a>', { text: value['name'],
|
||||||
|
href: "javascript:void(0)",
|
||||||
|
click: function () {
|
||||||
|
// XXX open up a subwindow
|
||||||
|
console.log(value);
|
||||||
|
} } ) ),
|
||||||
|
$('<td>').append( $.map( value['authors'], function ( author, i ) {
|
||||||
|
return addfilterlink ( author, "author:" + author );
|
||||||
|
} ) ),
|
||||||
|
$('<td>').text( value['description'] ),
|
||||||
|
$('<td>').append( $.map( value['tags'], function ( tag, i ) {
|
||||||
|
return addfilterlink ( tag, tag );
|
||||||
|
} ) )).appendTo('#packages_table');
|
||||||
|
});
|
||||||
|
|
||||||
|
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");
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
|
@ -1,24 +1,3 @@
|
||||||
function TocviewToggle(glyphid, id) {
|
|
||||||
var glyph = document.getElementById(glyphid);
|
|
||||||
var s = document.getElementById(id).style;
|
|
||||||
var expand = s.display == "none";
|
|
||||||
s.display = expand ? "block" : "none";
|
|
||||||
glyph.innerHTML = expand ? "▼" : "►";
|
|
||||||
}
|
|
||||||
|
|
||||||
function ToggleOn(id) {
|
|
||||||
var s = document.getElementById(id).style;
|
|
||||||
var li = document.getElementById("li" + id);
|
|
||||||
s.display = "block";
|
|
||||||
li.setAttribute("class", "tab-selected");
|
|
||||||
}
|
|
||||||
function ToggleOff(id) {
|
|
||||||
var s = document.getElementById(id).style;
|
|
||||||
var li = document.getElementById("li" + id);
|
|
||||||
s.display = "none";
|
|
||||||
li.setAttribute("class", "");
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
SortTable
|
SortTable
|
||||||
version 2
|
version 2
|
||||||
|
@ -110,7 +89,7 @@ sorttable = {
|
||||||
// make it clickable to sort
|
// make it clickable to sort
|
||||||
headrow[i].sorttable_columnindex = i;
|
headrow[i].sorttable_columnindex = i;
|
||||||
headrow[i].sorttable_tbody = table.tBodies[0];
|
headrow[i].sorttable_tbody = table.tBodies[0];
|
||||||
dean_addEvent(headrow[i],"click", function(e) {
|
dean_addEvent(headrow[i],"click", sorttable.innerSortFunction = function(e) {
|
||||||
|
|
||||||
if (this.className.search(/\bsorttable_sorted\b/) != -1) {
|
if (this.className.search(/\bsorttable_sorted\b/) != -1) {
|
||||||
// if we're already sorted by this column, just
|
// if we're already sorted by this column, just
|
||||||
|
@ -225,6 +204,8 @@ sorttable = {
|
||||||
// for example, you can override the cell text with a customkey attribute.
|
// for example, you can override the cell text with a customkey attribute.
|
||||||
// it also gets .value for <input> fields.
|
// it also gets .value for <input> fields.
|
||||||
|
|
||||||
|
if (!node) return "";
|
||||||
|
|
||||||
hasInputs = (typeof node.getElementsByTagName == 'function') &&
|
hasInputs = (typeof node.getElementsByTagName == 'function') &&
|
||||||
node.getElementsByTagName('input').length;
|
node.getElementsByTagName('input').length;
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,7 @@ table.packages thead tr {
|
||||||
background: #FFCC66;
|
background: #FFCC66;
|
||||||
}
|
}
|
||||||
|
|
||||||
table.packages tbody tr:nth-child(2n) {
|
table.packages tbody tr.even {
|
||||||
background: #F5F5DC;
|
background: #F5F5DC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user