X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/b1f9b9c1459cb9a30ebf80721aff6ef788d1f891..49ecbbddf0659c6409befcfe8989f92196133cda:/ui-shared.c
diff --git a/ui-shared.c b/ui-shared.c
index 2eff79d..1fc5c09 100644
--- a/ui-shared.c
+++ b/ui-shared.c
@@ -7,6 +7,7 @@
*/
#include "cgit.h"
+#include "cmd.h"
#include "html.h"
const char cgit_doctype[] =
@@ -26,14 +27,6 @@ static char *http_date(time_t t)
tm->tm_hour, tm->tm_min, tm->tm_sec);
}
-static long ttl_seconds(long ttl)
-{
- if (ttl<0)
- return 60 * 60 * 24 * 365;
- else
- return ttl * 60;
-}
-
void cgit_print_error(char *msg)
{
html("
");
@@ -41,6 +34,26 @@ void cgit_print_error(char *msg)
html("
\n");
}
+char *cgit_hosturl()
+{
+ char *host, *port;
+
+ host = getenv("HTTP_HOST");
+ if (host) {
+ host = xstrdup(host);
+ } else {
+ host = getenv("SERVER_NAME");
+ if (!host)
+ return NULL;
+ port = getenv("SERVER_PORT");
+ if (port && atoi(port) != 80)
+ host = xstrdup(fmt("%s:%d", host, atoi(port)));
+ else
+ host = xstrdup(host);
+ }
+ return host;
+}
+
char *cgit_rooturl()
{
if (ctx.cfg.virtual_root)
@@ -121,6 +134,60 @@ char *cgit_currurl()
return fmt("%s/", ctx.cfg.virtual_root);
}
+static void site_url(char *page, char *search, int ofs)
+{
+ char *delim = "?";
+
+ if (ctx.cfg.virtual_root) {
+ html_attr(ctx.cfg.virtual_root);
+ if (ctx.cfg.virtual_root[strlen(ctx.cfg.virtual_root) - 1] != '/')
+ html("/");
+ } else
+ html(ctx.cfg.script_name);
+
+ if (page) {
+ htmlf("?p=%s", page);
+ delim = "&";
+ }
+ if (search) {
+ html(delim);
+ html("q=");
+ html_attr(search);
+ delim = "&";
+ }
+ if (ofs) {
+ html(delim);
+ htmlf("ofs=%d", ofs);
+ }
+}
+
+static void site_link(char *page, char *name, char *title, char *class,
+ char *search, int ofs)
+{
+ html("");
+ html_txt(name);
+ html("");
+}
+
+void cgit_index_link(char *name, char *title, char *class, char *pattern,
+ int ofs)
+{
+ site_link(NULL, name, title, class, pattern, ofs);
+}
+
static char *repolink(char *title, char *class, char *page, char *head,
char *path)
{
@@ -139,36 +206,36 @@ static char *repolink(char *title, char *class, char *page, char *head,
}
html(" href='");
if (ctx.cfg.virtual_root) {
- html_attr(ctx.cfg.virtual_root);
+ html_url_path(ctx.cfg.virtual_root);
if (ctx.cfg.virtual_root[strlen(ctx.cfg.virtual_root) - 1] != '/')
html("/");
- html_attr(ctx.repo->url);
+ html_url_path(ctx.repo->url);
if (ctx.repo->url[strlen(ctx.repo->url) - 1] != '/')
html("/");
if (page) {
- html(page);
+ html_url_path(page);
html("/");
if (path)
- html_attr(path);
+ html_url_path(path);
}
} else {
html(ctx.cfg.script_name);
html("?url=");
- html_attr(ctx.repo->url);
+ html_url_arg(ctx.repo->url);
if (ctx.repo->url[strlen(ctx.repo->url) - 1] != '/')
html("/");
if (page) {
- html(page);
+ html_url_arg(page);
html("/");
if (path)
- html_attr(path);
+ html_url_arg(path);
}
delim = "&";
}
if (head && strcmp(head, ctx.repo->defbranch)) {
html(delim);
html("h=");
- html_attr(head);
+ html_url_arg(head);
delim = "&";
}
return fmt("%s", delim);
@@ -183,19 +250,30 @@ static void reporevlink(char *page, char *name, char *title, char *class,
if (rev && strcmp(rev, ctx.qry.head)) {
html(delim);
html("id=");
- html_attr(rev);
+ html_url_arg(rev);
}
html("'>");
html_txt(name);
html("");
}
+void cgit_summary_link(char *name, char *title, char *class, char *head)
+{
+ reporevlink(NULL, name, title, class, head, NULL, NULL);
+}
+
void cgit_tree_link(char *name, char *title, char *class, char *head,
char *rev, char *path)
{
reporevlink("tree", name, title, class, head, rev, path);
}
+void cgit_plain_link(char *name, char *title, char *class, char *head,
+ char *rev, char *path)
+{
+ reporevlink("plain", name, title, class, head, rev, path);
+}
+
void cgit_log_link(char *name, char *title, char *class, char *head,
char *rev, char *path, int ofs, char *grep, char *pattern)
{
@@ -205,17 +283,17 @@ void cgit_log_link(char *name, char *title, char *class, char *head,
if (rev && strcmp(rev, ctx.qry.head)) {
html(delim);
html("id=");
- html_attr(rev);
+ html_url_arg(rev);
delim = "&";
}
if (grep && pattern) {
html(delim);
html("qt=");
- html_attr(grep);
+ html_url_arg(grep);
delim = "&";
html(delim);
html("q=");
- html_attr(pattern);
+ html_url_arg(pattern);
}
if (ofs > 0) {
html(delim);
@@ -260,13 +338,13 @@ void cgit_diff_link(char *name, char *title, char *class, char *head,
if (new_rev && strcmp(new_rev, ctx.qry.head)) {
html(delim);
html("id=");
- html_attr(new_rev);
+ html_url_arg(new_rev);
delim = "&";
}
if (old_rev) {
html(delim);
html("id2=");
- html_attr(old_rev);
+ html_url_arg(old_rev);
}
html("'>");
html_txt(name);
@@ -306,14 +384,17 @@ void cgit_object_link(struct object *obj)
html_link_close();
}
-void cgit_print_date(time_t secs, char *format)
+void cgit_print_date(time_t secs, char *format, int local_time)
{
char buf[64];
struct tm *time;
if (!secs)
return;
- time = gmtime(&secs);
+ if(local_time)
+ time = localtime(&secs);
+ else
+ time = gmtime(&secs);
strftime(buf, sizeof(buf)-1, format, time);
html_txt(buf);
}
@@ -328,7 +409,7 @@ void cgit_print_age(time_t t, time_t max_relative, char *format)
secs = now - t;
if (secs > max_relative && max_relative >= 0) {
- cgit_print_date(t, format);
+ cgit_print_date(t, format, ctx.cfg.local_time);
return;
}
@@ -361,32 +442,66 @@ void cgit_print_age(time_t t, time_t max_relative, char *format)
secs * 1.0 / TM_YEAR);
}
-void cgit_print_docstart(char *title, struct cacheitem *item)
+void cgit_print_http_headers(struct cgit_context *ctx)
{
- html("Content-Type: text/html; charset=" PAGE_ENCODING "\n");
- 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)));
+ if (ctx->page.mimetype && ctx->page.charset)
+ htmlf("Content-Type: %s; charset=%s\n", ctx->page.mimetype,
+ ctx->page.charset);
+ else if (ctx->page.mimetype)
+ htmlf("Content-Type: %s\n", ctx->page.mimetype);
+ if (ctx->page.size)
+ htmlf("Content-Length: %ld\n", ctx->page.size);
+ if (ctx->page.filename)
+ htmlf("Content-Disposition: inline; filename=\"%s\"\n",
+ ctx->page.filename);
+ htmlf("Last-Modified: %s\n", http_date(ctx->page.modified));
+ htmlf("Expires: %s\n", http_date(ctx->page.expires));
html("\n");
+}
+
+void cgit_print_docstart(struct cgit_context *ctx)
+{
+ char *host = cgit_hosturl();
html(cgit_doctype);
html("\n");
html("\n");
html("");
- html_txt(title);
+ html_txt(ctx->page.title);
html("\n");
htmlf("\n", cgit_version);
- if (ctx.cfg.robots && *ctx.cfg.robots)
- htmlf("\n", ctx.cfg.robots);
+ if (ctx->cfg.robots && *ctx->cfg.robots)
+ htmlf("\n", ctx->cfg.robots);
html("\n");
+ if (ctx->cfg.favicon) {
+ html("\n");
+ }
+ if (host && ctx->repo) {
+ html("");
+ }
html("\n");
html("\n");
}
void cgit_print_docend()
{
- html("\n\n\n\n\n");
+ html("");
+ if (ctx.cfg.footer)
+ html_include(ctx.cfg.footer);
+ else {
+ html("\n");
+ }
+ html("