X-Git-Url: https://git.wpitchoune.net/gitweb/?p=ppastats.git;a=blobdiff_plain;f=src%2Fhtml.c;h=83c6fb639a936f203d3c45730965fb003d645c3d;hp=b2e9e340e7e9cebbf9030eefb47aeafe05d4105c;hb=677d2bfc3beae998b73f48a4be3036f09d6848ff;hpb=0ebeecd01227fce93c66d0cd07e7a1efd5565632 diff --git a/src/html.c b/src/html.c index b2e9e34..83c6fb6 100644 --- a/src/html.c +++ b/src/html.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2012 jeanfi@gmail.com + * Copyright (C) 2011-2014 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 @@ -27,87 +27,33 @@ #include #include -#include +#include #include "html.h" -#include "io.h" -#include "log.h" #include "lp.h" +#include #include "lp_ws.h" #include "ppastats.h" +#include +#include +#include + +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; -#define HTML_VERSION_TEMPLATE \ -"\n\ - \n\ - \n\ - \n\ - \n\ -\n\ - \n\ - \n\ - \n\ - \n\ - \n\ - \n\ - \n\ -

N/A

\n\ -
Version:
\n\ -

PPA: \n\ - \n\ - N/A/N/A\n\ -

\n\ -
\n\ -
\n\ -
\n\ -
\n\ -
\n\ - Distros:\n\ -
    \n\ -
    \n\ -
    \n" - -#define HTML_HEADER \ -"\n\ - \n\ - %s\n\ - \n\ - \n\ - \n\ -\n\ - \n\ - \n\ - \n\ - \n\ - \n\ - \n\ - \n" +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) { @@ -127,31 +73,85 @@ static char *path_new(const char *dir, const char *file, const char *suffixe) return path; } +static char *get_header(const char *title, const char *script) +{ + char *res, *tmp, *path; + + if (!header) { + path = path_append(tpl_dir, "header.tpl"); + header = file_get_content(path); + } else { + path = NULL; + } + + if (header) { + tmp = strdup(header); + res = strrep(tmp, "@SCRIPT@", script); + + if (res != tmp) + free(tmp); + + tmp = res; + res = strrep(tmp, "@TITLE@", title); + + 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; } +static const char *get_pkg_version_body() +{ + char *path; + + if (!pkg_version_body) { + 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; @@ -159,58 +159,25 @@ 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; } -static struct json_object *date_to_json(struct tm *tm) -{ - json_object *json; - - json = json_object_new_array(); - json_object_array_add(json, json_object_new_int(tm->tm_year+1900)); - json_object_array_add(json, json_object_new_int(tm->tm_mon+1)); - json_object_array_add(json, json_object_new_int(tm->tm_mday)); - - return json; -} - static void json_add_ddts(json_object *json, struct daily_download_total **ddts) { - json_object *json_ddt, *json_ddts; - struct daily_download_total *ddt; - - json_ddts = json_object_new_array(); - json_object_object_add(json, "ddts", json_ddts); - - if (!ddts) - return ; - - while (*ddts) { - ddt = *ddts; - - json_ddt = json_object_new_object(); - json_object_object_add(json_ddt, - "value", - json_object_new_int(ddt->count)); - json_object_object_add(json_ddt, - "time", - date_to_json(&ddt->date)); - - json_object_array_add(json_ddts, json_ddt); - - ddts++; - } + json_object_object_add(json, "ddts", ddts_to_json(ddts)); } static json_object *distro_to_json(struct distro_stats *d) @@ -308,6 +275,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; @@ -389,40 +359,6 @@ static json_object *ppa_to_json(struct ppa_stats *ppa) } static void -version_to_html(struct ppa_stats *ppa, - struct package_stats *pkg, - struct version_stats *version, - const char *dir) -{ - char *f_name, *path; - FILE *f; - const char *footer; - - f_name = malloc(strlen(pkg->name)+1+strlen(version->version)+1); - sprintf(f_name, "%s_%s", pkg->name, version->version); - - path = path_new(dir, f_name, ".html"); - f = fopen(path, "w"); - - if (!f) { - log_err(_("failed to open: %s"), path); - return ; - } - - fprintf(f, HTML_VERSION_TEMPLATE, - version_to_json(ppa, pkg, version)); - - footer = get_footer(); - if (footer) - fputs(footer, f); - - fclose(f); - - free(path); - free(f_name); -} - -static void create_html(const char *path, const char *title, const char *body_template, @@ -430,22 +366,36 @@ create_html(const char *path, { FILE *f; const char *footer; + char *header; + + f = NULL; + + header = get_header(title, script); + if (!header) { + log_err(_("Failed to get the header template")); + goto on_error; + } f = fopen(path, "w"); if (!f) { - log_err(_("failed to open: %s"), path); - return ; + log_err(_("Failed to open: %s"), path); + goto on_error; } - fprintf(f, HTML_HEADER, title, script); + fputs(header, f); fputs(body_template, f); footer = get_footer(); if (footer) fputs(footer, f); - fclose(f); + on_error: + if (header) + free(header); + + if (f) + fclose(f); } static char *ppa_display_name(const struct ppa_stats *ppa) @@ -488,6 +438,46 @@ index_to_html(struct ppa_stats *ppa, const char *dir) } static void +version_to_html(struct ppa_stats *ppa, + struct package_stats *pkg, + struct version_stats *version, + const char *dir) +{ + char *f_name, *path; + const char *body; + const char *script_tpl; + char *script, *json; + + body = get_pkg_version_body(); + if (!body) { + log_err("Failed to create package version page"); + return ; + } + + json = version_to_json(ppa, pkg, version); + if (!json) { + log_err("Failed to create package version page"); + return ; + } + + f_name = malloc(strlen(pkg->name)+1+strlen(version->version)+1); + sprintf(f_name, "%s_%s", pkg->name, version->version); + + path = path_new(dir, f_name, ".html"); + + script_tpl = "var data = %s;\n ppastats_ver();"; + script = malloc(strlen(script_tpl) - 2 + strlen(json) + 1); + sprintf(script, script_tpl, json); + + create_html(path, f_name, body, script); + + free(script); + free(json); + free(path); + free(f_name); +} + +static void pkg_to_html(struct ppa_stats *ppa, struct package_stats *pkg, const char *dir) { char *path, *json_path, *script; @@ -502,7 +492,7 @@ pkg_to_html(struct ppa_stats *ppa, struct package_stats *pkg, const char *dir) json_path = path_new(dir, pkg->name, ".json"); json = pkg_to_json(ppa, pkg); - log_debug(_("generating %s"), json_path); + log_debug(_("Generating %s"), json_path); json_object_to_file(json_path, json); json_object_put(json); @@ -515,7 +505,7 @@ pkg_to_html(struct ppa_stats *ppa, struct package_stats *pkg, const char *dir) 1); sprintf(script, "ppastats_pkg(\"%s%s\");", pkg->name, ".json"); - log_debug(_("generating %s"), path); + log_debug(_("Generating %s"), path); create_html(path, pkg->name, body, script); free(path); @@ -548,46 +538,27 @@ ppa_to_html(const char *owner, const char *ppa, const char *package_status, const char *output_dir, - const int install_static_files) + const int install_static_files, + 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"/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 < 7; 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); - fcopy(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); + ppastats = create_ppa_stats(owner, ppa, package_status, ws_size); path = path_new(output_dir, "ppa", ".html"); @@ -599,3 +570,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); +}