code refactoring/cleanup
authorJean-Philippe Orsini <jeanfi@gmail.com>
Wed, 7 Sep 2011 20:14:33 +0000 (20:14 +0000)
committerJean-Philippe Orsini <jeanfi@gmail.com>
Wed, 7 Sep 2011 20:14:33 +0000 (20:14 +0000)
src/html.c
src/io.c
src/io.h
www/js/ppastats.js

index c0dd767..4eddeb3 100644 (file)
     </div>\n\
 %s"
 
-#define HTML_INDEX_TEMPLATE \
+#define HTML_HEADER \
 "<html>\n\
-  <head>\n\
-    <link type=\"text/css\"\n\
-         rel=\"stylesheet\"\n\
-         href=\n\
+       <head>\n\
+               <title>%s</title>\n\
+               <link type=\"text/css\"\n\
+                     rel=\"stylesheet\"\n\
+                     href=\
 \"http://fonts.googleapis.com/css?family=Ubuntu:regular,bold&subset=Latin\">\n\
-    <link type=\"text/css\" href=\"css/ppastats.css\" rel=\"stylesheet\" />\n\
-    <link type=\"text/css\" href=\"css/jquery.jqplot.min.css\"\n\
-         rel=\"stylesheet\" />\n\
-    <script type=\"text/javascript\" src=\"js/jquery.min.js\"></script>\n\
-    <script type=\"text/javascript\"\n\
-           src=\"js/jquery.jqplot.min.js\"></script>\n\
-    <script type=\"text/javascript\"\n\
-           src=\"js/jqplot.dateAxisRenderer.min.js\"></script>\n\
-    <script type=\"text/javascript\" src=\"js/ppastats.js\"></script>\n\
-    <script>var data = %s;\n\
-           ppastats_ppa();\n\
-    </script>\n\
-  </head>\n\
-  <body>\n\
-    <h1><span id=\"ppa_name\">N/A</span></h1>\n\
-    <div id=\"details\">\n\
-      <div class=\"pkgs\">\n\
-       <em>Packages</em>:\n\
-       <ul id=\"pkgs\"></ul>\n\
-      </div>\n\
-    </div>\n\
-    <div  id=\"charts\">\n\
-       <div id=\"chart\"></div>\n\
-    </div>\n\
-%s"
+               <link type=\"text/css\" href=\"css/ppastats.css\"\n\
+                     rel=\"stylesheet\"/>\n\
+               <link type=\"text/css\" href=\"css/jquery.jqplot.min.css\"\n\
+                     rel=\"stylesheet\" />\n\
+               <script type=\"text/javascript\"\n\
+                       src=\"js/jquery.min.js\"></script>\n\
+               <script type=\"text/javascript\"\n\
+                       src=\"js/jquery.jqplot.min.js\"></script>\n\
+               <script type=\"text/javascript\"\n\
+                       src=\"js/jqplot.dateAxisRenderer.min.js\"></script>\n\
+               <script type=\"text/javascript\"\n\
+                       src=\"js/ppastats.js\"></script>\n\
+               <script>%s</script>\n\
+       </head>\n\
+       <body>\n"
+
+#define HTML_INDEX_TEMPLATE \
+"      <h1><span id=\"ppa_name\">N/A</span></h1>\n\
+       <div id=\"details\">\n\
+               <div class=\"pkgs\">\n\
+                       <em>Packages</em>:\n\
+                       <ul id=\"pkgs\"></ul>\n\
+               </div>\n\
+       </div>\n\
+       <div  id=\"charts\">\n\
+               <div id=\"chart\"></div>\n\
+       </div>\n"
 
 static char *path_new(const char *dir, const char *file, const char *suffixe)
 {
@@ -156,7 +159,7 @@ static char *path_new(const char *dir, const char *file, const char *suffixe)
        strcpy(path, dir);
        strcat(path, "/");
        strcat(path, file);
-       strcat(path, ".html");
+       strcat(path, suffixe);
 
        return path;
 }
@@ -332,9 +335,8 @@ static char *version_to_json(struct ppa_stats *ppa,
        return ret;
 }
 
-static char *ppa_to_json(struct ppa_stats *ppa)
+static json_object *ppa_to_json(struct ppa_stats *ppa)
 {
-       char *ret;
        json_object *json, *json_pkgs, *json_pkg;
        struct package_stats **pkgs;
 
@@ -365,11 +367,7 @@ static char *ppa_to_json(struct ppa_stats *ppa)
                pkgs++;
        }
 
-       ret = strdup(json_object_to_json_string(json));
-
-       json_object_put(json);
-
-       return ret;
+       return json;
 }
 
 
@@ -452,12 +450,13 @@ packages_to_html(struct ppa_stats *ppa,
 }
 
 static void
-index_to_html(struct ppa_stats *ppa, const char *dir)
+create_html(const char *path,
+           const char *title,
+           const char *body_template,
+           const char *script)
 {
-       char *path;
        FILE *f;
 
-       path = path_new(dir, "index", ".html");
        f = fopen(path, "w");
 
        if (!f) {
@@ -465,11 +464,49 @@ index_to_html(struct ppa_stats *ppa, const char *dir)
                return ;
        }
 
-       fprintf(f, HTML_INDEX_TEMPLATE, ppa_to_json(ppa), HTML_FOOTER);
+       fprintf(f, HTML_HEADER, title, script);
+       fputs(HTML_INDEX_TEMPLATE, f);
+       fputs(HTML_FOOTER, f);
 
        fclose(f);
+}
+
+static char *ppa_display_name(const struct ppa_stats *ppa)
+{
+       char *ret;
+
+       ret = malloc(4+strlen(ppa->name)+1+strlen(ppa->owner)+1);
+
+       sprintf(ret, "ppa:%s/%s", ppa->owner, ppa->name);
+
+       return ret;
+}
+
+static void
+index_to_html(struct ppa_stats *ppa, const char *dir)
+{
+       char *path, *json_path, *dname;
+       json_object *json;
+
+       json = ppa_to_json(ppa);
+
+       json_path = path_new(dir, "index", ".json");
+
+       if (debug)
+               printf("DEBUG: generating %s\n", json_path);
+
+       json_object_to_file(json_path, json);
+
+       json_object_put(json);
+
+       path = path_new(dir, "index", ".html");
+       dname = ppa_display_name(ppa);
+
+       create_html(path, dname, HTML_INDEX_TEMPLATE, "ppastats_ppa();");
 
        free(path);
+       free(dname);
+       free(json_path);
 }
 
 void
@@ -495,6 +532,8 @@ ppa_to_html(const char *owner,
                    DEFAULT_WWW_DIR"/jquery.jqplot.min.css",
                    "css/jquery.jqplot.min.css" };
 
+       mkdirs(output_dir, 0777);
+
        if (install_static_files) {
                css_dir = path_append(output_dir, "css");
                js_dir = path_append(output_dir, "js");
@@ -504,6 +543,10 @@ ppa_to_html(const char *owner,
 
                for (i = 0; i < 6; i++) {
                        f_dst = path_append(output_dir, www_files[2*i+1]);
+
+                       if (debug)
+                               printf("DEBUG: copying %s %s\n",
+                                      www_files[2*i], f_dst);
                        fcopy(www_files[2*i], f_dst);
 
                        free(f_dst);
index aeeed8c..a7c46af 100644 (file)
--- a/src/io.c
+++ b/src/io.c
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/stat.h>
 
 #include "io.h"
 
+/* Directory separator is \ when cross-compiling for MS Windows
+   systems */
+#if defined(__MINGW32__)
+#define DIRSEP '\\'
+#else
+#define DIRSEP '/'
+#endif
+
 #define FCOPY_BUF_SZ 4096
 
 static int file_copy(FILE *src, FILE *dst)
@@ -88,3 +97,24 @@ char *path_append(const char *odir, const char *name)
        return dir;
 }
 
+void mkdirs(const char *dirs, mode_t mode)
+{
+       char *c = (char *)dirs;
+       char *dir = malloc(strlen(dirs) + 1);
+
+       int i = 0;
+       while (*c) {
+               if ((*c == DIRSEP || *c == '\0') && c != dirs) {
+                       strncpy(dir, dirs, i);
+                       dir[i] = '\0';
+                       mkdir(dir, mode);
+               }
+
+               c++;
+               i++;
+       }
+
+       mkdir(dirs, mode);
+
+       free(dir);
+}
index 60f82b5..259e218 100644 (file)
--- a/src/io.h
+++ b/src/io.h
@@ -43,4 +43,6 @@ int fcopy(const char *src, const char *dst);
 
 char *path_append(const char *odir, const char *name);
 
+void mkdirs(const char *dirs, mode_t mode);
+
 #endif
index 9c7e268..5615480 100644 (file)
@@ -133,16 +133,22 @@ function ppastats_ppa() {
     $(document).ready(function() {
        var max_date = null;
        var min_date = null;
-       var pkg_url = data["pkg_name"]+".html";
-       
-       $("#ppa_name").html(data["ppa_owner"]+"/"+data["ppa_name"]);
+       var pkg_url;
 
-       $.each(data["packages"], function(i, item) {
-           var url = item["name"]+".html";
-           $("#pkgs").append("<li><a href='"+url+"'>"+item["name"]+"</a>: "+item["count"]+"</li>");
-       });
+       $.get("index.json", function(str_json) {
+           data = JSON.parse(str_json);
 
-       ppastats_chart(data["ddts"]);
+           pkg_url = data["pkg_name"]+".html";
+           
+           $("#ppa_name").html(data["ppa_owner"]+"/"+data["ppa_name"]);
+           
+           $.each(data["packages"], function(i, item) {
+               var url = item["name"]+".html";
+               $("#pkgs").append("<li><a href='"+url+"'>"+item["name"]+"</a>: "+item["count"]+"</li>");
+           });
+           
+           ppastats_chart(data["ddts"]);
+       });
     });
 }