X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/74620f12e4f7e91cb0a0b4ca731e07272d1b65f6..1a63cfcc3d83919e790e7e279eb35fc75adb0e3c:/ui-shared.c diff --git a/ui-shared.c b/ui-shared.c index cb8a8df..aba93e8 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -14,9 +14,9 @@ const char cgit_doctype[] = static char *http_date(time_t t) { - static char day[][4] = + static char day[][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; - static char month[][4] = + static char month[][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Now", "Dec"}; struct tm *tm = gmtime(&t); @@ -25,7 +25,7 @@ static char *http_date(time_t t) tm->tm_hour, tm->tm_min, tm->tm_sec); } -static int ttl_seconds(int ttl) +static long ttl_seconds(long ttl) { if (ttl<0) return 60 * 60 * 24 * 365; @@ -40,6 +40,14 @@ void cgit_print_error(char *msg) html("\n"); } +char *cgit_rooturl() +{ + if (cgit_virtual_root) + return fmt("%s/", cgit_virtual_root); + else + return cgit_script_name; +} + char *cgit_repourl(const char *reponame) { if (cgit_virtual_root) { @@ -49,17 +57,88 @@ char *cgit_repourl(const char *reponame) } } -char *cgit_pageurl(const char *reponame, const char *pagename, +char *cgit_pageurl(const char *reponame, const char *pagename, const char *query) { if (cgit_virtual_root) { - return fmt("%s/%s/%s/?%s", cgit_virtual_root, reponame, - pagename, query); + if (query) + return fmt("%s/%s/%s/?%s", cgit_virtual_root, reponame, + pagename, query); + else + return fmt("%s/%s/%s/", cgit_virtual_root, reponame, + pagename); } else { - return fmt("?r=%s&p=%s&%s", reponame, pagename, query); + if (query) + return fmt("?r=%s&p=%s&%s", reponame, pagename, query); + else + return fmt("?r=%s&p=%s", reponame, pagename); } } +char *cgit_currurl() +{ + if (!cgit_virtual_root) + return cgit_script_name; + else if (cgit_query_page) + return fmt("%s/%s/%s/", cgit_virtual_root, cgit_query_repo, cgit_query_page); + else if (cgit_query_repo) + return fmt("%s/%s/", cgit_virtual_root, cgit_query_repo); + else + return fmt("%s/", cgit_virtual_root); +} + + +void cgit_print_date(time_t secs, char *format) +{ + char buf[64]; + struct tm *time; + + time = gmtime(&secs); + strftime(buf, sizeof(buf)-1, format, time); + html_txt(buf); +} + +void cgit_print_age(time_t t, time_t max_relative, char *format) +{ + time_t now, secs; + + time(&now); + secs = now - t; + + if (secs > max_relative && max_relative >= 0) { + cgit_print_date(t, format); + return; + } + + if (secs < TM_HOUR * 2) { + htmlf("%.0f min.", + secs * 1.0 / TM_MIN); + return; + } + if (secs < TM_DAY * 2) { + htmlf("%.0f hours", + secs * 1.0 / TM_HOUR); + return; + } + if (secs < TM_WEEK * 2) { + htmlf("%.0f days", + secs * 1.0 / TM_DAY); + return; + } + if (secs < TM_MONTH * 2) { + htmlf("%.0f weeks", + secs * 1.0 / TM_WEEK); + return; + } + if (secs < TM_YEAR * 2) { + htmlf("%.0f months", + secs * 1.0 / TM_MONTH); + return; + } + htmlf("%.0f years", + secs * 1.0 / TM_YEAR); +} + void cgit_print_docstart(char *title, struct cacheitem *item) { html("Content-Type: text/html; charset=utf-8\n"); @@ -83,15 +162,60 @@ void cgit_print_docstart(char *title, struct cacheitem *item) void cgit_print_docend() { + html(""); html("\n\n"); } -void cgit_print_pageheader(char *title) +void cgit_print_pageheader(char *title, int show_search) { - html(""); + html(""); + html(""); + html(""); + html(""); + html("
"); + htmlf("root", cgit_rooturl()); + if (cgit_query_repo) { + htmlf(" : ", cgit_repourl(cgit_repo->url)); + html_txt(cgit_repo->name); + htmlf(" : %s", title); + } + html("
"); +} + +void cgit_print_snapshot_start(const char *mimetype, const char *filename, + struct cacheitem *item) +{ + htmlf("Content-Type: %s\n", mimetype); + htmlf("Content-Disposition: inline; filename=\"%s\"\n", filename); + htmlf("Last-Modified: %s\n", http_date(item->st.st_mtime)); + htmlf("Expires: %s\n", http_date(item->st.st_mtime + + ttl_seconds(item->ttl))); + html("\n"); }