X-Git-Url: https://git.wpitchoune.net/gitweb/?a=blobdiff_plain;f=src%2Fhtml.c;h=6cca3446325df9adbbd7091f87febe61da38fb24;hb=474ab6fa492a8b1dde963fdecb1edebc111c5fb2;hp=379a9c15e742ca6bd48095d3abf410ab76d1048c;hpb=9a8af404ffbfb331575dc4b37b044d49d728be8b;p=ppastats.git diff --git a/src/html.c b/src/html.c index 379a9c1..6cca344 100644 --- a/src/html.c +++ b/src/html.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2014 jeanfi@gmail.com + * Copyright (C) 2011-2015 jeanfi@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -30,19 +30,30 @@ #include #include "html.h" -#include "log.h" #include "lp.h" #include #include "lp_ws.h" #include "ppastats.h" #include +#include #include -static const char *footer; -static const char *ppa_body; -static const char *pkg_body; -static const char *pkg_version_body; -static const char *header; +static char *css_dir; +static char *js_dir; +static char *tpl_dir; + +static char *footer; +static char *ppa_body; +static char *pkg_body; +static char *pkg_version_body; +static char *header; + +void html_set_theme_dir(const char *theme_dir) +{ + css_dir = path_append(theme_dir, "css"); + js_dir = path_append(theme_dir, "js"); + tpl_dir = path_append(theme_dir, "templates"); +} static char *path_new(const char *dir, const char *file, const char *suffixe) { @@ -64,45 +75,49 @@ static char *path_new(const char *dir, const char *file, const char *suffixe) static char *get_header(const char *title, const char *script) { - const char *path; - char *res, *tmp; + char *res, *tmp, *path; if (!header) { - path = DEFAULT_WWW_DIR"/header.tpl"; + path = path_append(tpl_dir, "header.tpl"); header = file_get_content(path); - - if (!header) { - log_err("Failed to read header template: %s", path); - - return NULL; - } + } else { + path = NULL; } - tmp = strdup(header); - res = strrep(tmp, "@SCRIPT@", script); + if (header) { + tmp = strdup(header); + res = strrep(tmp, "@SCRIPT@", script); - if (res != tmp) - free(tmp); + if (res != tmp) + free(tmp); - tmp = res; - res = strrep(tmp, "@TITLE@", title); + tmp = res; + res = strrep(tmp, "@TITLE@", title); - if (res != tmp) - free(tmp); + if (res != tmp) + free(tmp); + } else { + log_err("Failed to read header template: %s", path); + res = NULL; + } + + free(path); return res; } static const char *get_footer() { - const char *path; + char *path; if (!footer) { - path = DEFAULT_WWW_DIR"/footer.tpl"; + path = path_append(tpl_dir, "footer.tpl"); footer = file_get_content(path); if (!footer) log_err("Failed to read footer template: %s", path); + + free(path); } return footer; @@ -110,29 +125,33 @@ static const char *get_footer() static const char *get_pkg_version_body() { - const char *path; + char *path; if (!pkg_version_body) { - path = DEFAULT_WWW_DIR"/pkg_version.tpl"; + path = path_append(tpl_dir, "pkg_version.tpl"); pkg_version_body = file_get_content(path); if (!pkg_version_body) log_err("Failed to read package version template: %s", path); + + free(path); } return pkg_version_body; } static const char *get_ppa_body() { - const char *path; + char *path; if (!ppa_body) { - path = DEFAULT_WWW_DIR"/ppa.tpl"; + path = path_append(tpl_dir, "ppa.tpl"); ppa_body = file_get_content(path); if (!ppa_body) log_err("Failed to read PPA template: %s", path); + + free(path); } return ppa_body; @@ -140,14 +159,16 @@ static const char *get_ppa_body() static const char *get_pkg_body() { - const char *path; + char *path; if (!pkg_body) { - path = DEFAULT_WWW_DIR"/pkg.tpl"; + path = path_append(tpl_dir, "pkg.tpl"); pkg_body = file_get_content(path); if (!pkg_body) log_err("Failed to read package template: %s", path); + + free(path); } return pkg_body; @@ -178,11 +199,42 @@ static json_object *distro_to_json(struct distro_stats *d) return json; } +static int version_cmp(const void *o1, const void *o2) +{ + struct version_stats **v1, **v2; + + v1 = (struct version_stats **)o1; + v2 = (struct version_stats **)o2; + + return (*v1)->date_created <= (*v2)->date_created; +} + +static struct version_stats **sort_versions(struct version_stats **vers) +{ + size_t n; + struct version_stats **tmp, **result; + + tmp = vers; + n = 0; + while (*tmp) { + n++; + tmp++; + } + + result = malloc((n + 1) * sizeof(struct version_stats *)); + memcpy(result, vers, n * sizeof(struct version_stats *)); + result[n] = NULL; + + qsort(result, n, sizeof(struct version_stats *), version_cmp); + + return result; +} + static json_object * pkg_to_json(struct ppa_stats *ppa, struct package_stats *pkg) { json_object *json, *json_versions, *json_distros, *json_distro; - struct version_stats **versions; + struct version_stats **versions, **tmp; struct distro_stats **distros, *d; json = json_object_new_object(); @@ -198,14 +250,16 @@ pkg_to_json(struct ppa_stats *ppa, struct package_stats *pkg) json_versions = json_object_new_array(); json_object_object_add(json, "versions", json_versions); - versions = pkg->versions; - while (*versions) { + versions = sort_versions(pkg->versions); + tmp = versions; + while (*tmp) { json_object_array_add (json_versions, - json_object_new_string((*versions)->version)); + json_object_new_string((*tmp)->version)); - versions++; + tmp++; } + free(versions); distros = pkg->distros; if (distros) { @@ -254,6 +308,9 @@ static char *version_to_json(struct ppa_stats *ppa, json_object_object_add(json, "name", json_object_new_string(ver->version)); + json_object_object_add(json, + "date_created", time_to_json(ver->date_created)); + json_add_ddts(json, ver->daily_download_totals); distros = ver->distros; @@ -447,6 +504,7 @@ version_to_html(struct ppa_stats *ppa, create_html(path, f_name, body, script); + free(script); free(json); free(path); free(f_name); @@ -517,41 +575,20 @@ ppa_to_html(const char *owner, int ws_size) { struct ppa_stats *ppastats; - char *path, *f_dst; - char *css_dir, *js_dir; - int i; - static char *www_files[] - = { DEFAULT_WWW_DIR"/jquery.min.js", "js/jquery.min.js", - DEFAULT_WWW_DIR"/ppastats.js", "js/ppastats.js", - DEFAULT_WWW_DIR"/jqplot.dateAxisRenderer.min.js", - "js/jqplot.dateAxisRenderer.min.js", - DEFAULT_WWW_DIR"/jquery.jqplot.min.js", - "js/jquery.jqplot.min.js", - DEFAULT_WWW_DIR"/excanvas.js", "js/excanvas.js", - DEFAULT_WWW_DIR"/ppastats.css", "css/ppastats.css", - DEFAULT_WWW_DIR"/wpitchoune.css", "css/wpitchoune.css", - DEFAULT_WWW_DIR"/jquery.jqplot.min.css", - "css/jquery.jqplot.min.css" }; + char *path; + char *css_odir, *js_odir; mkdirs(output_dir, 0777); if (install_static_files) { - css_dir = path_append(output_dir, "css"); - js_dir = path_append(output_dir, "js"); - - mkdir(css_dir, 0777); - mkdir(js_dir, 0777); + css_odir = path_append(output_dir, "css"); + js_odir = path_append(output_dir, "js"); - for (i = 0; i < 8; i++) { - f_dst = path_append(output_dir, www_files[2*i+1]); + dir_rcopy(css_dir, css_odir); + dir_rcopy(js_dir, js_odir); - log_debug(_("Copying %s %s"), www_files[2*i], f_dst); - file_copy(www_files[2*i], f_dst); - - free(f_dst); - } - free(css_dir); - free(js_dir); + free(css_odir); + free(js_odir); } ppastats = create_ppa_stats(owner, ppa, package_status, ws_size); @@ -566,3 +603,15 @@ ppa_to_html(const char *owner, free(path); } + +void html_cleanup() +{ + free(header); + free(footer); + free(ppa_body); + free(pkg_body); + free(pkg_version_body); + free(js_dir); + free(css_dir); + free(tpl_dir); +}