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 }