add skin handling
authorChristian Thaeter <ct@pipapo.org>
Tue, 22 Jan 2008 20:47:59 +0000 (21:47 +0100)
committerChristian Thaeter <ct@pipapo.org>
Tue, 22 Jan 2008 20:47:59 +0000 (21:47 +0100)
remove stylesheet config option

add functions:
 webgit_buffer_provide() - 32 cycling buffers
 webgit_webskinpath() - construct path string
 webgit_skinpath() - constuct path string

add defines to be configured later:
 WEBGIT_SKINDIR_DEFAULT
 WEBGIT_WEBSKINDIR_DEFAULT
 WEBGIT_DEFAULT_SKIN

options for webgit and repo config:
 skindir - set the dir where the skins are installed
 webskindir - set the dir from webroot to access the skins
 skin - set default skin name

cgi query parameter:
 skin - choose custom skin

src/options.c
src/options.h
src/query.c
src/query.h
src/repo.c
src/repo.h
src/webgit.c
src/webgit.h

index 407920f..8b3d64c 100644 (file)
@@ -55,13 +55,6 @@ conf_repo_opt (struct webgit_query* query, char* arg)
   return 0;
 }
 
-static int
-conf_stylesheet_opt (struct webgit_query* query, char* arg)
-{
-  query->stylesheet = cwa_strndup (arg, SIZE_MAX);
-  return 0;
-}
-
 static int
 conf_conf_opt (struct webgit_query* query, char* arg)
 {
@@ -94,6 +87,34 @@ conf_rxpd_opt (struct webgit_query* query, char* arg)
   return 0;
 }
 
+
+static int
+conf_skindir_opt (struct webgit_query* query, char* arg)
+{
+  free (query->skindir);
+  query->skindir = cwa_strndup (arg, SIZE_MAX);
+  return 0;
+}
+
+
+static int
+conf_webskindir_opt (struct webgit_query* query, char* arg)
+{
+  free (query->webskindir);
+  query->webskindir = cwa_strndup (arg, SIZE_MAX);
+  return 0;
+}
+
+
+static int
+conf_skin_opt (struct webgit_query* query, char* arg)
+{
+  free (query->skin);
+  query->skin = cwa_strndup (arg, SIZE_MAX);
+  return 0;
+}
+
+
 static int
 conf_count_opt (struct webgit_query* query, char* arg)
 {
index 9b7bece..ed7ae4b 100644 (file)
 #define CONF_OPTS                                               \
  CONF_OPT(query, "Set the QUERY_STRING [diag]")                 \
  CONF_OPT(method, "Set REQUEST_METHOD [diag]")                  \
- CONF_OPT(stylesheet, "Set default stylesheet")                 \
  CONF_OPT(conf, "Set config file, may be empty")                \
  CONF_OPT(repo, "Add a repository")                             \
  CONF_OPT(rxpd, "Set host:port or /path/to/socket for rxpd")    \
+ CONF_OPT(skindir, "Set dir to the skins")                      \
+ CONF_OPT(webskindir, "Set dir to skins from webroot")          \
+ CONF_OPT(skin, "Set default skin")                             \
  CONF_OPT(count, "Set default for 'items per page'")
 
 // CONF_OPT(conffile) CONF_OPT(include)
index b9a509b..4662b8d 100644 (file)
@@ -37,10 +37,11 @@ webgit_query_init (struct webgit_query* q)
   q->deref_to_tree = 0;
   q->content_type = cwa_strndup ("text/html", SIZE_MAX);
 
-  q->stylesheet = NULL;
   q->count_def = 100;
   q->rxpd_name = NULL;
   q->rxpd_port = 0;
+  q->skindir = cwa_strndup (WEBGIT_SKINDIR_DEFAULT, SIZE_MAX);
+  q->webskindir = cwa_strndup (WEBGIT_WEBSKINDIR_DEFAULT, SIZE_MAX);
 
   q->repo = NULL;
   q->action = NULL;
@@ -49,6 +50,7 @@ webgit_query_init (struct webgit_query* q)
   q->path = NULL;
   q->blob = NULL;
   q->blob_size = 0;
+  q->skin = cwa_strndup (WEBGIT_DEFAULT_SKIN, SIZE_MAX);
   q->count = -1;
 
   llist_init (&q->repos);
@@ -60,14 +62,16 @@ webgit_query_destroy (struct webgit_query* q)
   cgi_free (q->request);
 
   free (q->content_type);
-  free (q->stylesheet);
   free (q->rxpd_name);
+  free (q->skindir);
+  free (q->webskindir);
 
   free (q->repo);
   free (q->action);
   free (q->object);
   free (q->head);
   free (q->path);
+  free (q->skin);
   free (q->blob);
 
   LLIST_WHILE_HEAD (&q->repos, head)
@@ -200,6 +204,21 @@ webgit_blob_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
 }
 
 
+static void
+webgit_skin_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
+{
+  (void) self;
+  struct webgit_query* q = (struct webgit_query*) u_dat;
+
+  /* TODO validate that v is a probably legal reference (alnum() || one of '_/.') */
+  if (webgit_validate_string (v, v_sz))
+    {
+      free (q->skin);
+      q->skin = cwa_strndup (v, v_sz);
+    }
+}
+
+
 static void
 webgit_count_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
 {
index 23104de..01224c6 100644 (file)
@@ -36,6 +36,7 @@
  WEBGIT_PARAM(path, "Path and filename for the queried object") \
  WEBGIT_PARAM(object, "Object to perform on")                   \
  WEBGIT_PARAM(blob, "Data recieved from an edit")               \
+ WEBGIT_PARAM(skin, "Set skin")                                 \
  WEBGIT_PARAM(count, "How many things to display")
 
 
index 188eef0..4b58aa1 100644 (file)
@@ -96,17 +96,33 @@ webgit_readme_conf (struct webgit_repo_info* self, const char *value)
 
 
 static void
-webgit_stylesheet_conf (struct webgit_repo_info* self, const char *value)
+webgit_owner_conf (struct webgit_repo_info* self, const char *value)
 {
-  free (self->query->stylesheet);
-  self->query->stylesheet = cwa_strndup (value, SIZE_MAX);
+  self->owner = cwa_strndup (value, SIZE_MAX);
 }
 
 
 static void
-webgit_owner_conf (struct webgit_repo_info* self, const char *value)
+webgit_skindir_conf (struct webgit_repo_info* self, const char *value)
 {
-  self->owner = cwa_strndup (value, SIZE_MAX);
+  free (self->query->skindir);
+  self->query->skindir = cwa_strndup (value, SIZE_MAX);
+}
+
+
+static void
+webgit_webskindir_conf (struct webgit_repo_info* self, const char *value)
+{
+  free (self->query->webskindir);
+  self->query->webskindir = cwa_strndup (value, SIZE_MAX);
+}
+
+
+static void
+webgit_skin_conf (struct webgit_repo_info* self, const char *value)
+{
+  free (self->query->skin);
+  self->query->skin = cwa_strndup (value, SIZE_MAX);
 }
 
 
index 4a0e702..b1771b5 100644 (file)
@@ -31,7 +31,9 @@
  WEBGIT_CONF(description, "Set the short description for the repository")       \
  WEBGIT_CONF(url, "Set public access url")                                      \
  WEBGIT_CONF(owner, "Set owner name of the repository")                         \
- WEBGIT_CONF(stylesheet, "Set repository specific stylesheet")                  \
+ WEBGIT_CONF(skindir, "Set dir to the skins")                                   \
+ WEBGIT_CONF(webskindir, "Set dir to skins from webroot")                       \
+ WEBGIT_CONF(skin, "Set default skin")                                          \
  WEBGIT_CONF(readme, "Set a readme.html file to display")
 
 #define WEBGIT_CONF_PREFIX "web."
index 81d4a7a..9a18ab3 100644 (file)
@@ -89,6 +89,43 @@ webgit_setup (void)
 }
 
 
+char*
+webgit_buffer_provide (size_t size)
+{
+  static char* buffers[32];
+  static size_t sizes[32];
+  static unsigned idx;
+
+  idx = (idx + 1) & ~0x1f;
+
+  if (sizes[idx] < size)
+    {
+      free (buffers[idx]);
+      sizes[idx] = (size+32) & ~0x1f;
+      buffers[idx] = cwa_malloc (sizes[idx]);
+    }
+  return buffers[idx];
+}
+
+
+char*
+webgit_webskinpath (struct webgit_query* query, const char* element)
+{
+  char* buffer = webgit_buffer_provide (strlen (query->webskindir) + strlen (query->skin) + strlen (element) + 3);
+  sprintf (buffer, "%s/%s/%s", query->webskindir, query->skin, element);
+  return buffer;
+}
+
+
+char*
+webgit_skinpath (struct webgit_query* query, const char* element)
+{
+  char* buffer = webgit_buffer_provide (strlen (query->skindir) + strlen (query->skin) + strlen (element) + 3);
+  sprintf (buffer, "%s/%s/%s", query->skindir, query->skin, element);
+  return buffer;
+}
+
+
 Html
 webgit_email_link (Html name, Html email)
 {
@@ -215,8 +252,12 @@ main (int argc, char**argv)
                                                   html(html_tag("title"), "webgit"),
                                                   html_nl(),
                                                   html_meta("generator", "webgit"),
-                                                  html_link_rel("stylesheet", "text/css", query.stylesheet),
-                                                  html_link_rel("icon", "image/png", "/skins/default/icons/favicon.png")
+                                                  html_link_rel("stylesheet", "text/css",
+                                                                webgit_webskinpath (&query, "css/webgit.css")
+                                                                ),
+                                                  html_link_rel("icon", "image/png",
+                                                                webgit_webskinpath (&query, "icons/favicon.png")
+                                                                )
                                                   ),
                                              /*body*/
                                              html (
@@ -234,7 +275,7 @@ main (int argc, char**argv)
                                                          html (
                                                                html_tag("div",
                                                                         html_attr("id", "header")),
-                                                               html_include ("/home/cillian/webgit/skins/default/inc/header.inc")
+                                                               html_include (webgit_skinpath (&query, "inc/header.inc"))
                                                                ),
                                                          content,
                                                          html(
@@ -247,14 +288,14 @@ main (int argc, char**argv)
                                                          html (
                                                                html_tag("div",
                                                                         html_attr("id", "footer")),
-                                                               html_include ("/home/cillian/webgit/skins/default/inc/footer.inc")
+                                                               html_include (webgit_skinpath (&query, "inc/footer.inc"))
                                                                )
 
                                                          )
                                                    ),
-                                             html_attr("xmlns", "http://www.w3.org/1999/xhtml"),
-                                             html_attr("xml:lang", "en"),
-                                             html_attr("lang", "en")
+                                             html_attr ("xmlns", "http://www.w3.org/1999/xhtml"),
+                                             html_attr ("xml:lang", "en"),
+                                             html_attr ("lang", "en")
                                              )
                                 )
                   );
index 61bcb2f..625f2c0 100644 (file)
 
 #include "llist.h"
 
+#ifndef WEBGIT_SKINDIR_DEFAULT
+#define WEBGIT_SKINDIR_DEFAULT "/usr/share/webgit/skins"
+#endif
+
+#ifndef WEBGIT_WEBSKINDIR_DEFAULT
+#define WEBGIT_WEBSKINDIR_DEFAULT "/webgit_skins"
+#endif
+
+#ifndef WEBGIT_DEFAULT_SKIN
+#define WEBGIT_DEFAULT_SKIN "default"
+#endif
+
 extern Html error_log;
 
 struct webgit_query
@@ -41,6 +53,8 @@ struct webgit_query
   int count_def;
   char* rxpd_name;
   unsigned rxpd_port;
+  char* skindir;
+  char* webskindir;
   //int cache_read;
   //int cache_write;
   //int cache_expire;
@@ -53,6 +67,7 @@ struct webgit_query
   char* path;
   char* blob;
   size_t blob_size;
+  char* skin;
   int count;
 
   /* list of repositories */