gout

A static git page generator
git clone https://git.bracken.jp/gout.git
Log | Files | Refs | README | LICENSE

files.c (2193B)


      1 #include "writer/html/files.h"
      2 
      3 #include <assert.h>
      4 #include <err.h>
      5 #include <stdio.h>
      6 #include <stdlib.h>
      7 #include <sys/types.h>
      8 
      9 #include "format.h"
     10 #include "utils.h"
     11 #include "writer/html/page.h"
     12 
     13 struct HtmlFiles {
     14   const GitRepo* repo;
     15   const FileSystem* fs;
     16   FILE* out;
     17   HtmlPage* page;
     18 };
     19 
     20 HtmlFiles* html_files_create(const GitRepo* repo, const FileSystem* fs) {
     21   assert(repo != NULL);
     22   assert(fs != NULL);
     23   HtmlFiles* files = ecalloc(1, sizeof(HtmlFiles));
     24   files->repo = repo;
     25   files->fs = fs;
     26   files->out = fs->fopen("files.html", "w");
     27   if (!files->out) {
     28     err(1, "fopen: files.html");
     29   }
     30   files->page = html_page_create(files->out, repo, fs, "Files", "");
     31   return files;
     32 }
     33 
     34 void html_files_free(HtmlFiles* files) {
     35   if (!files) {
     36     return;
     37   }
     38   files->fs->fclose(files->out);
     39   files->out = NULL;
     40   html_page_free(files->page);
     41   files->page = NULL;
     42   free(files);
     43 }
     44 
     45 void html_files_begin(HtmlFiles* files) {
     46   assert(files != NULL);
     47   html_page_begin(files->page);
     48   fprintf(files->out,
     49           "<table id=\"files\"><thead>\n"
     50           "<tr>"
     51           "<td><b>Mode</b></td>"
     52           "<td><b>Name</b></td>"
     53           "<td class=\"num\" align=\"right\"><b>Size</b></td>"
     54           "</tr>\n"
     55           "</thead><tbody>\n");
     56 }
     57 
     58 void html_files_add_file(HtmlFiles* files, const GitFile* file) {
     59   assert(files != NULL);
     60   assert(file != NULL);
     61   FILE* out = files->out;
     62 
     63   fprintf(out, "<tr><td>%s</td>", file->mode);
     64   fprintf(out, "<td><a href=\"file/");
     65   print_percent_encoded(out, file->repo_path);
     66   fprintf(out, ".html\">");
     67   print_xml_encoded(out, file->display_path);
     68   fprintf(out, "</a>");
     69   const char* oid = file->commit_oid;
     70   if (oid[0] != '\0') {
     71     fprintf(out, " @ %s", oid);
     72   }
     73   fprintf(out, "</td><td class=\"num\" align=\"right\">");
     74 
     75   ssize_t size_lines = file->size_lines;
     76   ssize_t size_bytes = file->size_bytes;
     77   if (size_lines >= 0) {
     78     fprintf(out, "%zdL", size_lines);
     79   } else if (size_bytes >= 0) {
     80     fprintf(out, "%zdB", size_bytes);
     81   }
     82   fprintf(out, "</td></tr>\n");
     83 }
     84 
     85 void html_files_end(HtmlFiles* files) {
     86   assert(files != NULL);
     87   fprintf(files->out, "</tbody></table>");
     88   html_page_end(files->page);
     89 }