files.c (2150B)
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 html_page_free(files->page); 40 free(files); 41 } 42 43 void html_files_begin(HtmlFiles* files) { 44 assert(files != NULL); 45 html_page_begin(files->page); 46 fprintf(files->out, 47 "<table id=\"files\"><thead>\n" 48 "<tr>" 49 "<td><b>Mode</b></td>" 50 "<td><b>Name</b></td>" 51 "<td class=\"num\" align=\"right\"><b>Size</b></td>" 52 "</tr>\n" 53 "</thead><tbody>\n"); 54 } 55 56 void html_files_add_file(HtmlFiles* files, const GitFile* file) { 57 assert(files != NULL); 58 assert(file != NULL); 59 FILE* out = files->out; 60 61 fprintf(out, "<tr><td>%s</td>", file->mode); 62 fprintf(out, "<td><a href=\"file/"); 63 print_percent_encoded(out, file->repo_path); 64 fprintf(out, ".html\">"); 65 print_xml_encoded(out, file->display_path); 66 fprintf(out, "</a>"); 67 const char* oid = file->commit_oid; 68 if (oid[0] != '\0') { 69 fprintf(out, " @ %s", oid); 70 } 71 fprintf(out, "</td><td class=\"num\" align=\"right\">"); 72 73 ssize_t size_lines = file->size_lines; 74 ssize_t size_bytes = file->size_bytes; 75 if (size_lines >= 0) { 76 fprintf(out, "%zdL", size_lines); 77 } else if (size_bytes >= 0) { 78 fprintf(out, "%zdB", size_bytes); 79 } 80 fprintf(out, "</td></tr>\n"); 81 } 82 83 void html_files_end(HtmlFiles* files) { 84 assert(files != NULL); 85 fprintf(files->out, "</tbody></table>"); 86 html_page_end(files->page); 87 }