Thu, 12 Mar 2026 12:08:58 +0100
release version 1.2.0
| 5 | 1 | /* Copyright 2025 Mike Becker. All rights reserved. |
| 2 | * | |
| 3 | * Redistribution and use in source and binary forms, with or without | |
| 4 | * modification, are permitted provided that the following conditions are met: | |
| 5 | * | |
| 6 | * 1. Redistributions of source code must retain the above copyright | |
| 7 | * notice, this list of conditions and the following disclaimer. | |
| 8 | * | |
| 9 | * 2. Redistributions in binary form must reproduce the above copyright | |
| 10 | * notice, this list of conditions and the following disclaimer in the | |
| 11 | * documentation and/or other materials provided with the distribution. | |
| 12 | * | |
| 13 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
| 14 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| 15 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
| 16 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | |
| 17 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
| 18 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
| 19 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
| 20 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
| 21 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| 22 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| 23 | */ | |
| 24 | ||
| 25 | #include "html.h" | |
| 26 | ||
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
27 | #include <ranges> |
| 5 | 28 | #include <cstdio> |
|
52
e9edc3bd0301
add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
29 | #include <cassert> |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
30 | #include <iostream> |
| 5 | 31 | |
| 13 | 32 | using namespace std::chrono; |
|
6
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
33 | |
| 5 | 34 | namespace html { |
| 7 | 35 | static constexpr const char* weekdays[] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}; |
| 36 | ||
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
37 | struct output_reference { |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
38 | FILE *file; |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
39 | explicit output_reference(FILE *f) : file{f} {} |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
40 | output_reference(output_reference const &) = delete; |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
41 | output_reference(output_reference && other) noexcept : file(other.file) { |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
42 | other.file = nullptr; |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
43 | } |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
44 | output_reference &operator=(output_reference const &) = delete; |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
45 | output_reference &operator=(output_reference && other) noexcept { |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
46 | using std::swap; |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
47 | swap(other.file, file); |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
48 | return *this; |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
49 | } |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
50 | ~output_reference() { |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
51 | if (file != nullptr && file != stdout) { |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
52 | fclose(file); |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
53 | file = nullptr; |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
54 | } |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
55 | } |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
56 | }; |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
57 | |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
58 | static output_reference output{stdout}; |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
59 | |
| 5 | 60 | static unsigned indentation; |
|
52
e9edc3bd0301
add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
61 | static const char *tabs = " "; |
| 5 | 62 | static void indent(int change = 0) { |
| 63 | indentation += change; | |
|
52
e9edc3bd0301
add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
64 | assert(indentation <= max_indentation); |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
65 | fwrite(tabs, 4, indentation, output.file); |
| 5 | 66 | } |
| 67 | ||
| 68 | static std::string encode(const std::string &data) { | |
| 69 | std::string buffer; | |
| 70 | buffer.reserve(data.size()+16); | |
| 71 | for (const char &pos: data) { | |
| 72 | switch (pos) { | |
| 73 | case '&': | |
| 74 | buffer.append("&"); | |
| 75 | break; | |
| 76 | case '\"': | |
| 77 | buffer.append("""); | |
| 78 | break; | |
| 79 | case '\'': | |
| 80 | buffer.append("'"); | |
| 81 | break; | |
| 82 | case '<': | |
| 83 | buffer.append("<"); | |
| 84 | break; | |
| 85 | case '>': | |
| 86 | buffer.append(">"); | |
| 87 | break; | |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
88 | case '#': |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
89 | buffer.append("#"); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
90 | break; |
| 5 | 91 | default: |
| 92 | buffer.append(&pos, 1); | |
| 93 | break; | |
| 94 | } | |
| 95 | } | |
| 96 | return buffer; | |
| 97 | } | |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
98 | |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
99 | static std::string escape_json(const std::string &raw) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
100 | using std::string_view_literals::operator ""sv; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
101 | auto replace_all = [](std::string str, char chr, std::string_view repl) static { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
102 | size_t pos = str.find(chr); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
103 | if (pos == std::string::npos) return str; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
104 | std::string result = std::move(str); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
105 | do { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
106 | result.replace(pos, 1, repl); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
107 | pos += repl.length(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
108 | } while ((pos = result.find(chr, pos)) != std::string::npos); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
109 | return result; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
110 | }; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
111 | return replace_all(replace_all(raw, '\\', "\\\\"), '\"', "\\\""sv); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
112 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
113 | |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
114 | static std::string build_tag_list(fm::tag_lists tags, bool hide_repo_names) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
115 | std::string tags_json; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
116 | if (hide_repo_names) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
117 | for (const auto &tags_vector: tags | std::views::values) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
118 | for (const auto &tag: tags_vector) { |
|
76
110a234a3260
add reading commit hashes from the commit log - resolves #807
Mike Becker <universe@uap-core.de>
parents:
75
diff
changeset
|
119 | tags_json += escape_json(tag.message); |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
120 | tags_json += ' '; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
121 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
122 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
123 | if (!tags_json.empty()) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
124 | tags_json.pop_back(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
125 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
126 | } else { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
127 | tags_json += '{'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
128 | for (const auto &[repo, tags_vector] : tags) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
129 | tags_json += "\"" + escape_json(repo) + "\":\""; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
130 | for (const auto &tag: tags_vector) { |
|
76
110a234a3260
add reading commit hashes from the commit log - resolves #807
Mike Becker <universe@uap-core.de>
parents:
75
diff
changeset
|
131 | tags_json += escape_json(tag.message); |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
132 | tags_json += ' '; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
133 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
134 | if (!tags_vector.empty()) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
135 | tags_json.pop_back(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
136 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
137 | tags_json += "\","; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
138 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
139 | tags_json.pop_back(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
140 | if (!tags.empty()) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
141 | tags_json += '}'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
142 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
143 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
144 | return tags_json; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
145 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
146 | |
|
76
110a234a3260
add reading commit hashes from the commit log - resolves #807
Mike Becker <universe@uap-core.de>
parents:
75
diff
changeset
|
147 | static std::string build_tag_summary(fm::tag_summaries tags, bool hide_repo_names) { |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
148 | std::string tags_json; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
149 | if (hide_repo_names) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
150 | tags_json += '['; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
151 | for (const auto &tags_vector: tags | std::views::values) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
152 | for (const auto &tag: tags_vector) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
153 | tags_json += '"'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
154 | tags_json += escape_json(tag); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
155 | tags_json += "\","; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
156 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
157 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
158 | if (!tags.empty()) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
159 | tags_json.pop_back(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
160 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
161 | tags_json += ']'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
162 | } else { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
163 | tags_json += '{'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
164 | for (const auto &[repo, tags_vector] : tags) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
165 | tags_json += "\"" + escape_json(repo) + "\":["; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
166 | for (const auto &tag: tags_vector) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
167 | tags_json += '"'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
168 | tags_json += escape_json(tag); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
169 | tags_json += "\","; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
170 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
171 | if (!tags_vector.empty()) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
172 | tags_json.pop_back(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
173 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
174 | tags_json += "],"; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
175 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
176 | tags_json.pop_back(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
177 | if (!tags.empty()) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
178 | tags_json += '}'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
179 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
180 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
181 | return tags_json; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
182 | } |
| 5 | 183 | } |
| 184 | ||
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
185 | int html::set_output(std::string const &path) { |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
186 | if (path.empty()) { |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
187 | output = output_reference{stdout}; |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
188 | return 0; |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
189 | } |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
190 | FILE * f = fopen(path.c_str(), "w"); |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
191 | if (f == nullptr) { |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
192 | return -1; |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
193 | } |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
194 | output = output_reference{f}; |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
195 | return 0; |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
196 | } |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
197 | |
|
73
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
198 | void html::styles_and_script() { |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
199 | fputs(R"( <style> |
| 5 | 200 | table.heatmap { |
| 201 | table-layout: fixed; | |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
202 | border-collapse: separate; |
|
62
89b12ef5e190
improve visuals of the new design
Mike Becker <universe@uap-core.de>
parents:
61
diff
changeset
|
203 | border-spacing: 2px; |
| 5 | 204 | font-family: sans-serif; |
| 205 | } | |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
206 | |
| 5 | 207 | table.heatmap td, table.heatmap th { |
| 208 | text-align: center; | |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
209 | font-size: 0.75rem; |
|
63
9ed068855450
further improve design by tweaking the borders
Mike Becker <universe@uap-core.de>
parents:
62
diff
changeset
|
210 | border: solid 4px transparent; |
|
9ed068855450
further improve design by tweaking the borders
Mike Becker <universe@uap-core.de>
parents:
62
diff
changeset
|
211 | border-radius: 3px; |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
212 | height: 1rem; |
| 5 | 213 | } |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
214 | |
| 5 | 215 | table.heatmap td { |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
216 | width: 1rem; |
| 5 | 217 | } |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
218 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
219 | table.heatmap td:hover, table.heatmap td.popup-open { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
220 | filter: hue-rotate(90deg); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
221 | } |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
222 | |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
223 | table.heatmap th:hover[data-total], table.heatmap th.popup-open { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
224 | background-color: #B3E7F2; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
225 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
226 | |
| 5 | 227 | table.heatmap td.out-of-range { |
| 228 | background-color: gray; | |
| 229 | } | |
| 7 | 230 | |
| 231 | table.heatmap td.zero-commits { | |
|
62
89b12ef5e190
improve visuals of the new design
Mike Becker <universe@uap-core.de>
parents:
61
diff
changeset
|
232 | background-color: #E3E3E3; |
| 7 | 233 | } |
| 234 | ||
| 235 | table.heatmap td.one-commit { | |
| 236 | background-color: #80E7A0; | |
| 237 | } | |
| 238 | ||
| 239 | table.heatmap td.up-to-5-commits { | |
| 240 | background-color: #30D350; | |
| 241 | } | |
| 242 | ||
| 243 | table.heatmap td.up-to-10-commits { | |
| 244 | background-color: #00BF00; | |
| 245 | } | |
| 246 | ||
| 247 | table.heatmap td.up-to-20-commits { | |
| 248 | background-color: #00A300; | |
| 249 | } | |
| 250 | ||
| 251 | table.heatmap td.commit-spam { | |
| 252 | background-color: #008000; | |
| 253 | } | |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
254 | |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
255 | table.heatmap td[data-tags]:not([data-tags=""]) { |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
256 | border-color: gold; |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
257 | } |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
258 | |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
259 | /* Popup styles */ |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
260 | .commit-popup { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
261 | position: absolute; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
262 | background-color: #fff; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
263 | border: 1px solid #ccc; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
264 | border-radius: 4px; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
265 | box-shadow: 0 2px 10px rgba(0,0,0,0.2); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
266 | padding: .2rem; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
267 | z-index: 1000; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
268 | width: 40ch; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
269 | font-family: sans-serif; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
270 | font-size: smaller; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
271 | display: none; |
|
58
f1093b290fbf
allow long words to break in the commit-popup - fixes #697
Mike Becker <universe@uap-core.de>
parents:
56
diff
changeset
|
272 | word-wrap: break-word; |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
273 | } |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
274 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
275 | .commit-popup h3 { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
276 | margin-top: 0; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
277 | border-bottom: 1px solid #eee; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
278 | padding-bottom: 5px; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
279 | } |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
280 | |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
281 | .commit-popup h4 { |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
282 | margin-top: .5em; |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
283 | margin-bottom: .5em; |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
284 | } |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
285 | |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
286 | .commit-popup h5 { |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
287 | margin-top: 0; |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
288 | } |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
289 | |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
290 | .commit-popup ul { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
291 | margin: 0; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
292 | padding-left: 20px; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
293 | } |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
294 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
295 | .commit-popup li { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
296 | margin-bottom: 5px; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
297 | } |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
298 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
299 | .commit-popup .close-btn { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
300 | position: absolute; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
301 | top: 5px; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
302 | right: 8px; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
303 | cursor: pointer; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
304 | font-weight: bold; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
305 | } |
| 5 | 306 | </style> |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
307 | <script> |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
308 | document.addEventListener('DOMContentLoaded', function() { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
309 | // Create popup element |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
310 | const popup = document.createElement('div'); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
311 | popup.className = 'commit-popup'; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
312 | document.body.appendChild(popup); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
313 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
314 | // Add click event listeners to all commit cells |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
315 | const cells = document.querySelectorAll('table.heatmap td:not(.out-of-range, .zero-commits), table.heatmap th:not(.zero-commits)'); |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
316 | cells.forEach(cell => { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
317 | cell.addEventListener('click', function(e) { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
318 | const date = this.dataset.date; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
319 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
320 | // Create popup content |
|
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
321 | let content = '<span class="close-btn">×</span>'; |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
322 | if (date === undefined) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
323 | // monthly summary |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
324 | const total_commits = this.dataset.total; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
325 | content += `<h3>Total: ${total_commits} commit${total_commits !== 1 ? 's' : ''}</h3>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
326 | if (this.dataset.commits === undefined) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
327 | const tags = this.dataset.tags ? JSON.parse(this.dataset.tags) : []; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
328 | if (tags.length === 0) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
329 | content += 'No tags.'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
330 | } else { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
331 | content += '<ul>'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
332 | tags.forEach(tag => { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
333 | content += `<li>${tag}</li>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
334 | }); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
335 | content += '</ul>'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
336 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
337 | } else { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
338 | content += '<ul>'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
339 | const commits = JSON.parse(this.dataset.commits); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
340 | const repos = Object.keys(commits).sort(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
341 | const tags = this.dataset.tags ? JSON.parse(this.dataset.tags) : {}; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
342 | for (const repo of repos) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
343 | content += `<li>${repo} (${commits[repo]} commit${commits[repo] !== 1 ? 's' : ''})</li>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
344 | if (tags[repo] && tags[repo].length > 0) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
345 | content += '<ul>'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
346 | tags[repo].forEach(tag => { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
347 | content += `<li>${tag}</li>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
348 | }); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
349 | content += '</ul>'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
350 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
351 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
352 | content += '</ul>'; |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
353 | } |
|
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
354 | } else { |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
355 | const summaries = JSON.parse(this.dataset.summaries); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
356 | if (Array.isArray(summaries)) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
357 | const summaries = this.dataset.summaries ? JSON.parse(this.dataset.summaries) : undefined; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
358 | content += `<h3>${date}: ${summaries.length} commit${summaries.length !== 1 ? 's' : ''}</h3>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
359 | if (this.dataset.tags) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
360 | content += `<h5>Tags: ${this.dataset.tags}</h5>`; |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
361 | } |
|
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
362 | content += '<ul>'; |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
363 | summaries.forEach(summary => { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
364 | content += `<li>${summary}</li>`; |
|
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
365 | }); |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
366 | content += '</ul>'; |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
367 | } else { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
368 | const repos = Object.keys(summaries).sort(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
369 | const tags = this.dataset.tags ? JSON.parse(this.dataset.tags) : {}; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
370 | const total_commits = this.dataset.total; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
371 | content += `<h3>${date}: ${total_commits} commit${total_commits !== 1 ? 's' : ''}</h3>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
372 | for (const repo of repos) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
373 | const commits = summaries[repo]; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
374 | if (repos.length > 1) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
375 | content += `<h4>${repo} (${commits.length} commit${commits.length !== 1 ? 's' : ''})</h4>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
376 | } else { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
377 | content += `<h4>${repo}</h4>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
378 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
379 | if (tags[repo]) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
380 | content += `<h5>Tags: ${tags[repo]}</h5>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
381 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
382 | content += '<ul>'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
383 | commits.forEach(commit => { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
384 | content += `<li>${commit}</li>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
385 | }); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
386 | content += '</ul>'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
387 | } |
|
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
388 | } |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
389 | } |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
390 | popup.innerHTML = content; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
391 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
392 | // Position popup near the cell |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
393 | const rect = this.getBoundingClientRect(); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
394 | popup.style.left = rect.left + window.scrollX + 'px'; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
395 | popup.style.top = (rect.bottom + window.scrollY + 5) + 'px'; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
396 | popup.style.display = 'block'; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
397 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
398 | // Highlight the cell to which the popup belongs |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
399 | document.querySelectorAll('table.heatmap .popup-open').forEach(old_cell => { |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
400 | old_cell.classList.toggle("popup-open"); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
401 | }); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
402 | cell.classList.toggle("popup-open"); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
403 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
404 | // Add close button handler |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
405 | const closeBtn = popup.querySelector('.close-btn'); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
406 | if (closeBtn) { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
407 | closeBtn.addEventListener('click', function() { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
408 | popup.style.display = 'none'; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
409 | cell.classList.toggle("popup-open"); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
410 | }); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
411 | } |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
412 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
413 | e.stopPropagation(); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
414 | }); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
415 | }); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
416 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
417 | // Close popup when clicking elsewhere |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
418 | document.addEventListener('click', function(e) { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
419 | if (!popup.contains(e.target)) { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
420 | popup.style.display = 'none'; |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
421 | document.querySelectorAll('table.heatmap .popup-open').forEach(cell => { |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
422 | cell.classList.toggle("popup-open"); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
423 | }); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
424 | } |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
425 | }); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
426 | }); |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
427 | </script> |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
428 | )", output.file); |
|
73
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
429 | } |
|
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
430 | |
|
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
431 | void html::open(bool fragment, unsigned char fragment_indent) { |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
432 | indentation = 0; |
|
73
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
433 | if (fragment) { |
|
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
434 | indent(fragment_indent); |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
435 | fputs("<div class=\"heatmap-content\">\n", output.file); |
|
73
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
436 | indentation++; |
|
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
437 | } else { |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
438 | fputs(R"(<!DOCTYPE html> |
|
73
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
439 | <html> |
|
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
440 | <head> |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
441 | <meta charset="UTF-8"> |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
442 | )", output.file); |
|
73
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
443 | styles_and_script(); |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
444 | fputs(R"( </head> |
|
20
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
445 | <body> |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
446 | <div class="heatmap-content"> |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
447 | )", output.file); |
|
20
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
448 | indentation = 3; |
|
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
449 | } |
| 5 | 450 | } |
| 451 | ||
|
20
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
452 | void html::close(bool fragment) { |
|
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
453 | if (fragment) { |
|
52
e9edc3bd0301
add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
454 | indent(-1); |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
455 | fputs("</div>\n", output.file); |
|
20
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
456 | } else { |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
457 | fputs(" </div>\n </body>\n</html>\n", output.file); |
|
20
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
458 | } |
| 5 | 459 | } |
| 460 | ||
|
46
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
461 | void html::chart_begin(const std::string& repo, const std::string& author) { |
|
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
462 | indent(); |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
463 | fprintf(output.file, |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
464 | "<div class=\"chart\" data-repo=\"%s\" data-author=\"%s\">\n", |
|
46
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
465 | encode(repo).c_str(), encode(author).c_str()); |
|
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
466 | indentation++; |
|
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
467 | } |
|
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
468 | |
|
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
469 | void html::chart_end() { |
|
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
470 | indent(-1); |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
471 | fputs("</div>\n", output.file); |
|
46
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
472 | } |
|
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
473 | |
|
44
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
42
diff
changeset
|
474 | void html::heading_repo(const std::string& repo) { |
| 5 | 475 | indent(); |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
476 | fprintf(output.file, "<h1 data-repo=\"%1$s\">%1$s</h1>\n", encode(repo).c_str()); |
| 5 | 477 | } |
| 478 | ||
|
44
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
42
diff
changeset
|
479 | void html::heading_author(const std::string& author, unsigned int total_commits) { |
| 5 | 480 | indent(); |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
481 | fprintf(output.file, "<h2 title=\"Total commits: %u\">%s</h2>\n", |
|
44
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
42
diff
changeset
|
482 | total_commits, |
|
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
42
diff
changeset
|
483 | encode(author).c_str()); |
| 5 | 484 | } |
| 485 | ||
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
486 | void html::table_begin(year y, bool hide_repo_names, const std::array<fm::commit_summary, 12> &commits_per_month) { |
|
6
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
487 | static constexpr const char* months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
488 | // compute the column spans, first |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
489 | unsigned colspans[12] = {}; |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
490 | { |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
491 | unsigned total_cols = 0; |
| 13 | 492 | sys_days day{year_month_day{y, January, 1d}}; |
|
6
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
493 | for (unsigned col = 0; col < 12; ++col) { |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
494 | while (total_cols < columns && year_month_day{day}.month() <= month{col + 1}) { |
|
6
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
495 | ++total_cols; |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
496 | ++colspans[col]; |
| 13 | 497 | day += days{7}; |
|
6
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
498 | } |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
499 | } |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
500 | } |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
501 | |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
502 | // now render the table heading |
| 5 | 503 | indent(); |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
504 | fputs("<table class=\"heatmap\">\n", output.file); |
| 5 | 505 | indent(1); |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
506 | fputs("<tr>\n", output.file); |
| 5 | 507 | indent(1); |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
508 | fputs("<th></th>\n", output.file); |
| 5 | 509 | for (unsigned i = 0 ; i < 12 ; i++) { |
| 510 | indent(); | |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
511 | const fm::commit_summary &summary = commits_per_month[i]; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
512 | const unsigned total = summary.count(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
513 | if (total > 0) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
514 | std::string commit_summary; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
515 | if (!hide_repo_names) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
516 | std::string commit_summary_json; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
517 | commit_summary_json += '{'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
518 | for (const auto &[repo, count] : summary.commits) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
519 | commit_summary_json += std::format("\"{}\": {},", escape_json(repo), count); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
520 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
521 | if (!summary.commits.empty()) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
522 | commit_summary_json.pop_back(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
523 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
524 | commit_summary_json += '}'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
525 | commit_summary = std::format("data-commits=\"{}\"", encode(commit_summary_json)); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
526 | } |
|
76
110a234a3260
add reading commit hashes from the commit log - resolves #807
Mike Becker <universe@uap-core.de>
parents:
75
diff
changeset
|
527 | std::string tags = build_tag_summary(summary.tags_with_date, hide_repo_names); |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
528 | fprintf(output.file, |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
529 | "<th scope=\"col\" title=\"Total commits: %u\" colspan=\"%d\" data-total=\"%u\" %s data-tags=\"%s\">%s</th>\n", |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
530 | total, colspans[i], total, |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
531 | commit_summary.c_str(), |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
532 | encode(tags).c_str(), months[i]); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
533 | } else { |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
534 | fprintf(output.file, |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
535 | "<th scope=\"col\" class=\"zero-commits\" colspan=\"%d\">%s</th>\n", |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
536 | colspans[i], months[i]); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
537 | } |
| 5 | 538 | } |
| 539 | indent(-1); | |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
540 | fputs("</tr>\n", output.file); |
| 5 | 541 | } |
| 542 | ||
| 543 | void html::table_end() { | |
|
46
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
544 | indent(-1); |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
545 | fputs("</table>\n", output.file); |
| 5 | 546 | } |
| 547 | ||
| 548 | void html::row_begin(unsigned int row) { | |
| 549 | indent(); | |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
550 | fputs("<tr>\n", output.file); |
| 5 | 551 | indent(1); |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
552 | fprintf(output.file, "<th scope=\"row\">%s</th>\n", weekdays[row]); |
| 5 | 553 | } |
| 554 | ||
| 555 | void html::row_end() { | |
| 556 | indent(-1); | |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
557 | fputs("</tr>\n", output.file); |
| 5 | 558 | } |
| 559 | ||
| 560 | void html::cell_out_of_range() { | |
| 561 | indent(); | |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
562 | fputs("<td class=\"out-of-range\"></td>\n", output.file); |
| 5 | 563 | } |
| 564 | ||
|
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
565 | void html::cell(year_month_day ymd, bool hide_repo_names, const fm::commits &commits) { |
| 7 | 566 | const char *color_class; |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
567 | if (commits.count() == 0) { |
| 7 | 568 | color_class = "zero-commits"; |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
569 | } else if (commits.count() == 1) { |
| 7 | 570 | color_class = "one-commit"; |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
571 | } else if (commits.count() <= 5) { |
| 7 | 572 | color_class = "up-to-5-commits"; |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
573 | } else if (commits.count() <= 10) { |
| 7 | 574 | color_class = "up-to-10-commits"; |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
575 | } else if (commits.count() <= 20) { |
| 7 | 576 | color_class = "up-to-20-commits"; |
| 577 | } else { | |
| 578 | color_class = "commit-spam"; | |
| 579 | } | |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
580 | |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
581 | // Build a JSON object of commit summaries |
|
76
110a234a3260
add reading commit hashes from the commit log - resolves #807
Mike Becker <universe@uap-core.de>
parents:
75
diff
changeset
|
582 | auto add_summaries = [](std::string &json, const std::vector<fm::commit_info> &summaries) static { |
|
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
583 | // We have to iterate in reverse order to sort the summaries chronologically |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
584 | for (const auto &summary : summaries | std::views::reverse) { |
|
76
110a234a3260
add reading commit hashes from the commit log - resolves #807
Mike Becker <universe@uap-core.de>
parents:
75
diff
changeset
|
585 | json += "\"" + escape_json(summary.message) + "\","; |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
586 | } |
|
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
587 | json.pop_back(); |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
588 | }; |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
589 | std::string summaries_json; |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
590 | if (hide_repo_names) { |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
591 | summaries_json += '['; |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
592 | for (const auto &summaries: commits.summaries | std::views::values) { |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
593 | add_summaries(summaries_json, summaries); |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
594 | } |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
595 | summaries_json += ']'; |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
596 | } else { |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
597 | summaries_json += '{'; |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
598 | for (const auto &[repo, summaries] : commits.summaries) { |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
599 | summaries_json += "\"" + escape_json(repo) + "\":["; |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
600 | add_summaries(summaries_json, summaries); |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
601 | summaries_json += "],"; |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
602 | } |
|
60
9b1cbc665851
fix malformed JSON on days without commits in the combined view
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
603 | if (!commits.summaries.empty()) { |
|
9b1cbc665851
fix malformed JSON on days without commits in the combined view
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
604 | summaries_json.pop_back(); |
|
9b1cbc665851
fix malformed JSON on days without commits in the combined view
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
605 | } |
|
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
606 | summaries_json += '}'; |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
607 | } |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
608 | |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
609 | // Build a JSON object of tags |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
610 | std::string tags_json = build_tag_list(commits.tags, hide_repo_names); |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
611 | |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
612 | // Output |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
613 | std::string date_str = std::format("{}, {}-{:02d}-{:02d}", |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
614 | weekdays[weekday(ymd).iso_encoding() - 1], |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
615 | static_cast<int>(ymd.year()), |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
616 | static_cast<unsigned>(ymd.month()), |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
617 | static_cast<unsigned>(ymd.day())); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
618 | const unsigned total = commits.count(); |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
619 | indent(); |
|
81
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
620 | fprintf(output.file, |
|
1ff88eb9555c
add options to output aggregated and/or separated heatmaps to files in one go
Mike Becker <universe@uap-core.de>
parents:
76
diff
changeset
|
621 | "<td class=\"%s\" title=\"%s: %u %s\" data-total=\"%u\" data-date=\"%s\" data-summaries=\"%s\" data-tags=\"%s\"></td>\n", |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
622 | color_class, |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
623 | date_str.c_str(), |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
624 | total, |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
625 | total == 1 ? "commit" : "commits", |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
626 | total, |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
627 | date_str.c_str(), |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
628 | encode(summaries_json).c_str(), |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
629 | encode(tags_json).c_str() |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
630 | ); |
| 5 | 631 | } |