Make HTML template more flexible.
authorMalte S. Stretz <mss@apache.org>
Wed, 1 Sep 2010 11:19:05 +0000 (13:19 +0200)
committerEmil Mikulic <emikulic@gmail.com>
Sat, 28 May 2011 10:10:53 +0000 (20:10 +1000)
Preparation for URI base feature.  It is a little bit more overhead than
just appending constant strings, but I doubt it is measurable.  Also, it
unifies the appearance a bit more since the <title> etc. is now also
generated by html_open() instead differently in each page generator.

Makefile.in
graph_db.c
hosts_db.c
html.c [new file with mode: 0644]
html.h
http.c
http.h
release.sh

index 362e7e0..ba333bf 100644 (file)
@@ -38,6 +38,7 @@ err.c         \
 graph_db.c     \
 hosts_db.c     \
 hosts_sort.c   \
 graph_db.c     \
 hosts_db.c     \
 hosts_sort.c   \
+html.c         \
 http.c         \
 localip.c      \
 ncache.c       \
 http.c         \
 localip.c      \
 ncache.c       \
@@ -105,10 +106,11 @@ dns.o: dns.c darkstat.h config.h conv.h decode.h dns.h err.h hosts_db.h \
   str.h queue.h tree.h
 err.o: err.c darkstat.h config.h conv.h err.h pidfile.h
 graph_db.o: graph_db.c cap.h conv.h darkstat.h config.h db.h acct.h \
   str.h queue.h tree.h
 err.o: err.c darkstat.h config.h conv.h err.h pidfile.h
 graph_db.o: graph_db.c cap.h conv.h darkstat.h config.h db.h acct.h \
-  decode.h err.h str.h html.h graph_db.h now.h
+  decode.h err.h str.h html.h http.h graph_db.h now.h
 hosts_db.o: hosts_db.c darkstat.h config.h conv.h decode.h dns.h err.h \
   hosts_db.h str.h db.h html.h ncache.h now.h
 hosts_sort.o: hosts_sort.c darkstat.h config.h hosts_db.h str.h err.h
 hosts_db.o: hosts_db.c darkstat.h config.h conv.h decode.h dns.h err.h \
   hosts_db.h str.h db.h html.h ncache.h now.h
 hosts_sort.o: hosts_sort.c darkstat.h config.h hosts_db.h str.h err.h
+html.o: html.c darkstat.h config.h str.h http.h
 http.o: http.c darkstat.h config.h http.h conv.h hosts_db.h str.h \
   graph_db.h err.h queue.h now.h stylecss.h graphjs.h
 localip.o: localip.c darkstat.h config.h conv.h decode.h err.h localip.h
 http.o: http.c darkstat.h config.h http.h conv.h hosts_db.h str.h \
   graph_db.h err.h queue.h now.h stylecss.h graphjs.h
 localip.o: localip.c darkstat.h config.h conv.h decode.h err.h localip.h
index ea5a403..63ecc9d 100644 (file)
@@ -16,7 +16,8 @@
 #include "acct.h"
 #include "err.h"
 #include "str.h"
 #include "acct.h"
 #include "err.h"
 #include "str.h"
-#include "html.h" /* FIXME: should be pushed into a .c file? */
+#include "html.h"
+#include "http.h"
 #include "graph_db.h"
 #include "now.h"
 
 #include "graph_db.h"
 #include "now.h"
 
@@ -301,6 +302,12 @@ graph_export(const int fd)
    return 1;
 }
 
    return 1;
 }
 
+static void cb_headers(struct str *buf)
+{
+   str_appendf(buf, "<script src=\"%s%s\" type=\"text/javascript\">"
+      "</script>\n", base_url, "graph.js");
+}
+
 /* ---------------------------------------------------------------------------
  * Web interface: front page!
  */
 /* ---------------------------------------------------------------------------
  * Web interface: front page!
  */
@@ -312,16 +319,9 @@ html_front_page(void)
    char start_when[100];
 
    buf = str_make();
    char start_when[100];
 
    buf = str_make();
-   str_append(buf, html_header_1);
-   str_appendf(buf, "<title>" PACKAGE_STRING " : graphs (%s)</title>\n",
-               interface);
-   str_append(buf, "<script src=\"graph.js\" type=\"text/javascript\">"
-                   "</script>\n");
-   str_append(buf, html_header_2);
-   str_appendf(buf, "<h2 class=\"pageheader\">Graphs (%s)</h2>\n", interface);
+   html_open(buf, "Graphs", interface, cb_headers);
 
    str_append(buf, "<p>\n");
 
    str_append(buf, "<p>\n");
-
    str_append(buf, "<b>Running for</b> <span id=\"rf\">");
    rf = length_of_time(now - start_time);
    /* FIXME: use a more monotonic clock perhaps? */
    str_append(buf, "<b>Running for</b> <span id=\"rf\">");
    rf = length_of_time(now - start_time);
    /* FIXME: use a more monotonic clock perhaps? */
@@ -374,7 +374,7 @@ html_front_page(void)
       "</div>\n"
    );
 
       "</div>\n"
    );
 
-   str_append(buf, html_footer);
+   html_close(buf);
    return (buf);
 }
 
    return (buf);
 }
 
index 3f57672..b08b886 100644 (file)
@@ -974,10 +974,7 @@ html_hosts_main(const char *qs)
 #define NEXT "next page &gt;&gt;&gt;"
 #define FULL "full table"
 
 #define NEXT "next page &gt;&gt;&gt;"
 #define FULL "full table"
 
-   str_append(buf, html_header_1);
-   str_appendf(buf, " <title>darkstat3: Hosts (%s)</title>\n", interface);
-   str_append(buf, html_header_2);
-   str_appendf(buf, "<h2 class=\"pageheader\">Hosts (%s)</h2>\n", interface);
+   html_open(buf, "Hosts", interface, NULL);
    format_table(buf, hosts_db, start, sort, full);
 
    /* <prev | full | stats | next> */
    format_table(buf, hosts_db, start, sort, full);
 
    /* <prev | full | stats | next> */
@@ -1003,7 +1000,8 @@ html_hosts_main(const char *qs)
       str_append(buf, " | " NEXT);
 
    str_append(buf, "<br/>\n");
       str_append(buf, " | " NEXT);
 
    str_append(buf, "<br/>\n");
-   str_append(buf, html_footer);
+
+   html_close(buf);
 done:
    if (qs_start != NULL) free(qs_start);
    if (qs_sort != NULL) free(qs_sort);
 done:
    if (qs_start != NULL) free(qs_start);
    if (qs_sort != NULL) free(qs_sort);
@@ -1033,10 +1031,7 @@ html_hosts_detail(const char *ip)
 
    /* Overview. */
    buf = str_make();
 
    /* Overview. */
    buf = str_make();
-   str_append(buf, html_header_1);
-   str_appendf(buf, " <title>%s</title>\n", ip);
-   str_append(buf, html_header_2);
-   str_appendf(buf, "<h2>%s</h2>\n", ip);
+   html_open(buf, ip, interface, NULL);
    if (strcmp(ip, canonical) != 0)
       str_appendf(buf, "(canonically <b>%s</b>)\n", canonical);
    str_appendf(buf,
    if (strcmp(ip, canonical) != 0)
       str_appendf(buf, "(canonically <b>%s</b>)\n", canonical);
    str_appendf(buf,
@@ -1097,7 +1092,7 @@ html_hosts_detail(const char *ip)
    str_append(buf, "<h3>IP protocols</h3>\n");
    format_table(buf, h->u.host.ip_protos, 0,TOTAL,0);
 
    str_append(buf, "<h3>IP protocols</h3>\n");
    format_table(buf, h->u.host.ip_protos, 0,TOTAL,0);
 
-   str_append(buf, html_footer);
+   html_close(buf);
    return (buf);
 }
 
    return (buf);
 }
 
diff --git a/html.c b/html.c
new file mode 100644 (file)
index 0000000..94631e1
--- /dev/null
+++ b/html.c
@@ -0,0 +1,56 @@
+/* darkstat 3
+ *
+ * html.c: HTML header/footer templating for web interface.
+ * copyright (c) 2006 Ben Stewart.
+ * copyright (c) 2010 Malte S. Stretz.
+ *
+ * You may use, modify and redistribute this file under the terms of the
+ * GNU General Public License version 2. (see COPYING.GPL)
+ */
+
+#include "darkstat.h"
+#include "str.h"
+#include "http.h"
+
+
+void html_open(struct str *buf, const char *title, const char *interface,
+    void (*header_callback)(struct str *buf))
+{
+    str_append(buf, "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n"
+        "  \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"
+        "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n"
+        "<head>\n");
+    str_appendf(buf, "<title>%s (darkstat3 : %s)</title>\n"
+        "<meta name=\"generator\" content=\"%s\" />\n", title, interface,
+        PACKAGE_STRING);
+    str_appendf(buf, "<link rel=\"stylesheet\" href=\"%s%s\" type=\"text/css\"/>\n",
+        base_url, "style.css");
+    if (header_callback != NULL)
+        header_callback(buf);
+            
+    str_append(buf, "</head>\n"
+        "<body>\n"
+        "<div class=\"menu\">\n"
+        "<ul class=\"menu\">\n");
+    str_appendf(buf, "<li class=\"label\">%s</li>\n"
+        "<li><a href=\"%s\">graphs</a></li>\n"
+        "<li><a href=\"%shosts/\">hosts</a></li>\n"
+        "<li><a href=\"http://dmr.ath.cx/net/darkstat/\">homepage</a></li>\n",
+        PACKAGE_STRING, base_url, base_url);
+    str_append(buf, "</ul>\n"
+        "</div>\n"
+        "<div class=\"content\">\n");
+    str_appendf(buf, "<h2 class=\"pageheader\">%s</h2>\n", title);
+}
+
+void html_close(struct str *buf)
+{
+    str_append(buf, 
+        "</div>\n"
+        "</body>\n"
+        "</html>\n"
+    );
+}
+
+
+/* vim:set ts=4 sw=4 tw=78 expandtab: */
diff --git a/html.h b/html.h
index 4311f05..296e022 100644 (file)
--- a/html.h
+++ b/html.h
@@ -1,40 +1,17 @@
 /* darkstat 3
  *
 /* darkstat 3
  *
- * html.h: HTML header/footer for web interface.
+ * html.h: HTML header/footer templating for web interface.
  * copyright (c) 2006 Ben Stewart.
  * copyright (c) 2006 Ben Stewart.
- *
- * You may use, modify and redistribute this file under the terms of the
- * GNU General Public License version 2. (see COPYING.GPL)
+ * copyright (c) 2010 Malte S. Stretz.
  */
 #ifndef __DARKSTAT_HTML_H
 #define __DARKSTAT_HTML_H
 
 #include "config.h" /* for PACKAGE_STRING */
 
  */
 #ifndef __DARKSTAT_HTML_H
 #define __DARKSTAT_HTML_H
 
 #include "config.h" /* for PACKAGE_STRING */
 
-static const char html_header_1[] =
-"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n"
-"  \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"
-"<html xmlns=\"http://www.w3.org/1999/xhtml\">\n"
-"<head>\n"
-" <link rel=\"stylesheet\" href=\"/style.css\" type=\"text/css\"/>\n";
-
-static const char html_header_2[] =
-"</head>\n"
-"<body>\n"
-"<div class=\"menu\">\n"
- "<ul class=\"menu\">\n"
-  "<li class=\"label\">" PACKAGE_STRING "</li>"
-  "<li><a href=\"/\">graphs</a></li>"
-  "<li><a href=\"/hosts/\">hosts</a></li>"
-  "<li><a href=\"http://dmr.ath.cx/net/darkstat/\">homepage</a></li>"
- "</ul>\n"
-"</div>\n"
-"<div class=\"content\">\n";
-
-static const char html_footer[] =
-"</div>\n"
-"</body>\n"
-"</html>\n";
+void html_open(struct str *buf, const char *title, const char *interface,
+    void (*header_callback)(struct str *buf));
+void html_close(struct str *buf);
 
 #endif
 /* vim:set ts=3 sw=3 tw=78 expandtab: */
 
 #endif
 /* vim:set ts=3 sw=3 tw=78 expandtab: */
diff --git a/http.c b/http.c
index 71ea528..b513ce2 100644 (file)
--- a/http.c
+++ b/http.c
@@ -34,6 +34,8 @@
 #include <unistd.h>
 #include <zlib.h>
 
 #include <unistd.h>
 #include <zlib.h>
 
+const char *base_url = "/";
+
 static const char mime_type_xml[] = "text/xml";
 static const char mime_type_html[] = "text/html; charset=us-ascii";
 static const char mime_type_css[] = "text/css";
 static const char mime_type_xml[] = "text/xml";
 static const char mime_type_html[] = "text/html; charset=us-ascii";
 static const char mime_type_css[] = "text/css";
diff --git a/http.h b/http.h
index f366d5b..ab45f8a 100644 (file)
--- a/http.h
+++ b/http.h
@@ -8,6 +8,9 @@
 #include <sys/select.h>
 #include <netinet/in.h>
 
 #include <sys/select.h>
 #include <netinet/in.h>
 
+extern const char *base_url;
+
+void http_init_base(const char *path);
 void http_init(const char * bindaddr, const unsigned short bindport,
    const int max_conn);
 void http_fd_set(fd_set *recv_set, fd_set *send_set, int *max_fd,
 void http_init(const char * bindaddr, const unsigned short bindport,
    const int max_conn);
 void http_fd_set(fd_set *recv_set, fd_set *send_set, int *max_fd,
index 03ce007..bfce96a 100755 (executable)
@@ -53,6 +53,7 @@ graph_db.h \
 hosts_db.c \
 hosts_db.h \
 hosts_sort.c \
 hosts_db.c \
 hosts_db.h \
 hosts_sort.c \
+html.c \
 html.h \
 http.c \
 http.h \
 html.h \
 http.c \
 http.h \