]> git.cameronkatri.com Git - cgit.git/blobdiff - ui-shared.c
ui-shared.c: use html_url_arg()
[cgit.git] / ui-shared.c
index 4408969c4a3a244b98d2d6678fcdff2c93a03a04..a2f636c73d9dfb6da5b3e091ba8acdcbe2d5823a 100644 (file)
@@ -34,6 +34,26 @@ void cgit_print_error(char *msg)
        html("</div>\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)
@@ -201,21 +221,21 @@ static char *repolink(char *title, char *class, char *page, char *head,
        } 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 = "&amp;";
        }
        if (head && strcmp(head, ctx.repo->defbranch)) {
                html(delim);
                html("h=");
-               html_attr(head);
+               html_url_arg(head);
                delim = "&amp;";
        }
        return fmt("%s", delim);
@@ -230,7 +250,7 @@ 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);
@@ -243,6 +263,12 @@ void cgit_tree_link(char *name, char *title, char *class, char *head,
        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)
 {
@@ -252,17 +278,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);
@@ -307,13 +333,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 = "&amp;";
        }
        if (old_rev) {
                html(delim);
                html("id2=");
-               html_attr(old_rev);
+               html_url_arg(old_rev);
        }
        html("'>");
        html_txt(name);
@@ -430,6 +456,7 @@ void cgit_print_http_headers(struct cgit_context *ctx)
 
 void cgit_print_docstart(struct cgit_context *ctx)
 {
+       char *host = cgit_hosturl();
        html(cgit_doctype);
        html("<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>\n");
        html("<head>\n");
@@ -447,6 +474,13 @@ void cgit_print_docstart(struct cgit_context *ctx)
                html_attr(ctx->cfg.favicon);
                html("'/>\n");
        }
+       if (host && ctx->repo) {
+               html("<link rel='alternate' title='Atom feed' href='http://");
+               html_attr(cgit_hosturl());
+               html_attr(cgit_fileurl(ctx->repo->url, "atom", ctx->qry.path,
+                                      fmt("h=%s", ctx->qry.head)));
+               html("' type='application/atom+xml'/>");
+       }
        html("</head>\n");
        html("<body>\n");
 }