Thu, 21 May 2026 12:07:54 +0200
Added tag v1.2.1 for changeset 7c9dfe5b49b5
| 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 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
|
100 | std::string tags_json; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
101 | if (hide_repo_names) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
102 | 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
|
103 | for (const auto &tag: tags_vector) { |
|
84
7c9dfe5b49b5
fix insufficient HTML escaping in the pop-ups
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
104 | tags_json += encode(tag.message); |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
105 | tags_json += ' '; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
106 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
107 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
108 | if (!tags_json.empty()) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
109 | tags_json.pop_back(); |
|
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 | } else { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
112 | tags_json += '{'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
113 | for (const auto &[repo, tags_vector] : tags) { |
|
84
7c9dfe5b49b5
fix insufficient HTML escaping in the pop-ups
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
114 | tags_json += "\"" + encode(repo) + "\":\""; |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
115 | for (const auto &tag: tags_vector) { |
|
84
7c9dfe5b49b5
fix insufficient HTML escaping in the pop-ups
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
116 | tags_json += encode(tag.message); |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
117 | tags_json += ' '; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
118 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
119 | if (!tags_vector.empty()) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
120 | tags_json.pop_back(); |
|
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 | tags_json += "\","; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
123 | } |
|
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 | if (!tags.empty()) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
126 | tags_json += '}'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
127 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
128 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
129 | return tags_json; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
130 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
131 | |
|
76
110a234a3260
add reading commit hashes from the commit log - resolves #807
Mike Becker <universe@uap-core.de>
parents:
75
diff
changeset
|
132 | 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
|
133 | std::string tags_json; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
134 | if (hide_repo_names) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
135 | tags_json += '['; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
136 | 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
|
137 | for (const auto &tag: tags_vector) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
138 | tags_json += '"'; |
|
84
7c9dfe5b49b5
fix insufficient HTML escaping in the pop-ups
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
139 | tags_json += encode(tag); |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
140 | tags_json += "\","; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
141 | } |
|
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 | if (!tags.empty()) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
144 | tags_json.pop_back(); |
|
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 | tags_json += ']'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
147 | } else { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
148 | tags_json += '{'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
149 | for (const auto &[repo, tags_vector] : tags) { |
|
84
7c9dfe5b49b5
fix insufficient HTML escaping in the pop-ups
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
150 | tags_json += "\"" + encode(repo) + "\":["; |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
151 | for (const auto &tag: tags_vector) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
152 | tags_json += '"'; |
|
84
7c9dfe5b49b5
fix insufficient HTML escaping in the pop-ups
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
153 | tags_json += encode(tag); |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
154 | tags_json += "\","; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
155 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
156 | if (!tags_vector.empty()) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
157 | tags_json.pop_back(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
158 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
159 | tags_json += "],"; |
|
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.pop_back(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
162 | if (!tags.empty()) { |
|
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 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
165 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
166 | return tags_json; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
167 | } |
| 5 | 168 | } |
| 169 | ||
|
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
|
170 | 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
|
171 | 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
|
172 | 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
|
173 | 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
|
174 | } |
|
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
|
175 | 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
|
176 | 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
|
177 | 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
|
178 | } |
|
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
|
179 | 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
|
180 | 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
|
181 | } |
|
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
|
182 | |
|
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
|
183 | 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
|
184 | fputs(R"( <style> |
| 5 | 185 | table.heatmap { |
| 186 | table-layout: fixed; | |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
187 | border-collapse: separate; |
|
62
89b12ef5e190
improve visuals of the new design
Mike Becker <universe@uap-core.de>
parents:
61
diff
changeset
|
188 | border-spacing: 2px; |
| 5 | 189 | font-family: sans-serif; |
| 190 | } | |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
191 | |
| 5 | 192 | table.heatmap td, table.heatmap th { |
| 193 | text-align: center; | |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
194 | font-size: 0.75rem; |
|
63
9ed068855450
further improve design by tweaking the borders
Mike Becker <universe@uap-core.de>
parents:
62
diff
changeset
|
195 | border: solid 4px transparent; |
|
9ed068855450
further improve design by tweaking the borders
Mike Becker <universe@uap-core.de>
parents:
62
diff
changeset
|
196 | border-radius: 3px; |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
197 | height: 1rem; |
| 5 | 198 | } |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
199 | |
| 5 | 200 | table.heatmap td { |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
201 | width: 1rem; |
| 5 | 202 | } |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
203 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
204 | 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
|
205 | filter: hue-rotate(90deg); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
206 | } |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
207 | |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
208 | 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
|
209 | background-color: #B3E7F2; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
210 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
211 | |
| 5 | 212 | table.heatmap td.out-of-range { |
| 213 | background-color: gray; | |
| 214 | } | |
| 7 | 215 | |
| 216 | table.heatmap td.zero-commits { | |
|
62
89b12ef5e190
improve visuals of the new design
Mike Becker <universe@uap-core.de>
parents:
61
diff
changeset
|
217 | background-color: #E3E3E3; |
| 7 | 218 | } |
| 219 | ||
| 220 | table.heatmap td.one-commit { | |
| 221 | background-color: #80E7A0; | |
| 222 | } | |
| 223 | ||
| 224 | table.heatmap td.up-to-5-commits { | |
| 225 | background-color: #30D350; | |
| 226 | } | |
| 227 | ||
| 228 | table.heatmap td.up-to-10-commits { | |
| 229 | background-color: #00BF00; | |
| 230 | } | |
| 231 | ||
| 232 | table.heatmap td.up-to-20-commits { | |
| 233 | background-color: #00A300; | |
| 234 | } | |
| 235 | ||
| 236 | table.heatmap td.commit-spam { | |
| 237 | background-color: #008000; | |
| 238 | } | |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
239 | |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
240 | 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
|
241 | border-color: gold; |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
242 | } |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
243 | |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
244 | /* Popup styles */ |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
245 | .commit-popup { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
246 | position: absolute; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
247 | background-color: #fff; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
248 | border: 1px solid #ccc; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
249 | border-radius: 4px; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
250 | 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
|
251 | padding: .2rem; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
252 | z-index: 1000; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
253 | width: 40ch; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
254 | font-family: sans-serif; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
255 | font-size: smaller; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
256 | 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
|
257 | word-wrap: break-word; |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
258 | } |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
259 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
260 | .commit-popup h3 { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
261 | margin-top: 0; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
262 | border-bottom: 1px solid #eee; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
263 | padding-bottom: 5px; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
264 | } |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
265 | |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
266 | .commit-popup h4 { |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
267 | margin-top: .5em; |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
268 | margin-bottom: .5em; |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
269 | } |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
270 | |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
271 | .commit-popup h5 { |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
272 | margin-top: 0; |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
273 | } |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
274 | |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
275 | .commit-popup ul { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
276 | margin: 0; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
277 | padding-left: 20px; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
278 | } |
|
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 | .commit-popup li { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
281 | margin-bottom: 5px; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
282 | } |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
283 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
284 | .commit-popup .close-btn { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
285 | position: absolute; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
286 | top: 5px; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
287 | right: 8px; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
288 | cursor: pointer; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
289 | font-weight: bold; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
290 | } |
| 5 | 291 | </style> |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
292 | <script> |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
293 | document.addEventListener('DOMContentLoaded', function() { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
294 | // Create popup element |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
295 | const popup = document.createElement('div'); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
296 | popup.className = 'commit-popup'; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
297 | document.body.appendChild(popup); |
|
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 | // 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
|
300 | 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
|
301 | cells.forEach(cell => { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
302 | cell.addEventListener('click', function(e) { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
303 | const date = this.dataset.date; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
304 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
305 | // 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
|
306 | let content = '<span class="close-btn">×</span>'; |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
307 | if (date === undefined) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
308 | // monthly summary |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
309 | const total_commits = this.dataset.total; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
310 | 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
|
311 | if (this.dataset.commits === undefined) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
312 | 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
|
313 | if (tags.length === 0) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
314 | content += 'No tags.'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
315 | } else { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
316 | content += '<ul>'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
317 | tags.forEach(tag => { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
318 | content += `<li>${tag}</li>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
319 | }); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
320 | content += '</ul>'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
321 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
322 | } else { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
323 | content += '<ul>'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
324 | const commits = JSON.parse(this.dataset.commits); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
325 | const repos = Object.keys(commits).sort(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
326 | 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
|
327 | for (const repo of repos) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
328 | 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
|
329 | if (tags[repo] && tags[repo].length > 0) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
330 | content += '<ul>'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
331 | tags[repo].forEach(tag => { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
332 | content += `<li>${tag}</li>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
333 | }); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
334 | content += '</ul>'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
335 | } |
|
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 | content += '</ul>'; |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
338 | } |
|
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
339 | } else { |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
340 | const summaries = JSON.parse(this.dataset.summaries); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
341 | if (Array.isArray(summaries)) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
342 | 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
|
343 | 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
|
344 | if (this.dataset.tags) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
345 | 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
|
346 | } |
|
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
347 | content += '<ul>'; |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
348 | summaries.forEach(summary => { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
349 | 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
|
350 | }); |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
351 | content += '</ul>'; |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
352 | } else { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
353 | const repos = Object.keys(summaries).sort(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
354 | 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
|
355 | const total_commits = this.dataset.total; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
356 | 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
|
357 | for (const repo of repos) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
358 | const commits = summaries[repo]; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
359 | if (repos.length > 1) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
360 | 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
|
361 | } else { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
362 | content += `<h4>${repo}</h4>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
363 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
364 | if (tags[repo]) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
365 | content += `<h5>Tags: ${tags[repo]}</h5>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
366 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
367 | content += '<ul>'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
368 | commits.forEach(commit => { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
369 | content += `<li>${commit}</li>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
370 | }); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
371 | content += '</ul>'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
372 | } |
|
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
373 | } |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
374 | } |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
375 | popup.innerHTML = content; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
376 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
377 | // Position popup near the cell |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
378 | const rect = this.getBoundingClientRect(); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
379 | 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
|
380 | 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
|
381 | popup.style.display = 'block'; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
382 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
383 | // 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
|
384 | 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
|
385 | old_cell.classList.toggle("popup-open"); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
386 | }); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
387 | cell.classList.toggle("popup-open"); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
388 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
389 | // Add close button handler |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
390 | const closeBtn = popup.querySelector('.close-btn'); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
391 | if (closeBtn) { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
392 | closeBtn.addEventListener('click', function() { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
393 | popup.style.display = 'none'; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
394 | cell.classList.toggle("popup-open"); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
395 | }); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
396 | } |
|
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 | e.stopPropagation(); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
399 | }); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
400 | }); |
|
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 | // Close popup when clicking elsewhere |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
403 | document.addEventListener('click', function(e) { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
404 | if (!popup.contains(e.target)) { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
405 | popup.style.display = 'none'; |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
406 | 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
|
407 | cell.classList.toggle("popup-open"); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
408 | }); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
409 | } |
|
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 | }); |
|
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
|
412 | </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
|
413 | )", 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
|
414 | } |
|
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
|
415 | |
|
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
|
416 | 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
|
417 | 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
|
418 | 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
|
419 | 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
|
420 | 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
|
421 | 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
|
422 | } 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
|
423 | 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
|
424 | <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
|
425 | <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
|
426 | <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
|
427 | )", 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
|
428 | 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
|
429 | fputs(R"( </head> |
|
20
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
430 | <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
|
431 | <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
|
432 | )", output.file); |
|
20
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
433 | indentation = 3; |
|
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
434 | } |
| 5 | 435 | } |
| 436 | ||
|
20
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
437 | void html::close(bool fragment) { |
|
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
438 | if (fragment) { |
|
52
e9edc3bd0301
add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
439 | 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
|
440 | fputs("</div>\n", output.file); |
|
20
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
441 | } 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
|
442 | fputs(" </div>\n </body>\n</html>\n", output.file); |
|
20
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
443 | } |
| 5 | 444 | } |
| 445 | ||
|
46
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
446 | 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
|
447 | 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
|
448 | 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
|
449 | "<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
|
450 | 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
|
451 | indentation++; |
|
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
452 | } |
|
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
453 | |
|
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
454 | void html::chart_end() { |
|
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
455 | 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
|
456 | 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
|
457 | } |
|
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
458 | |
|
44
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
42
diff
changeset
|
459 | void html::heading_repo(const std::string& repo) { |
| 5 | 460 | 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
|
461 | fprintf(output.file, "<h1 data-repo=\"%1$s\">%1$s</h1>\n", encode(repo).c_str()); |
| 5 | 462 | } |
| 463 | ||
|
44
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
42
diff
changeset
|
464 | void html::heading_author(const std::string& author, unsigned int total_commits) { |
| 5 | 465 | 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
|
466 | 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
|
467 | total_commits, |
|
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
42
diff
changeset
|
468 | encode(author).c_str()); |
| 5 | 469 | } |
| 470 | ||
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
471 | 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
|
472 | 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
|
473 | // compute the column spans, first |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
474 | unsigned colspans[12] = {}; |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
475 | { |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
476 | unsigned total_cols = 0; |
| 13 | 477 | 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
|
478 | for (unsigned col = 0; col < 12; ++col) { |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
479 | 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
|
480 | ++total_cols; |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
481 | ++colspans[col]; |
| 13 | 482 | day += days{7}; |
|
6
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
483 | } |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
484 | } |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
485 | } |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
486 | |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
487 | // now render the table heading |
| 5 | 488 | 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
|
489 | fputs("<table class=\"heatmap\">\n", output.file); |
| 5 | 490 | 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
|
491 | fputs("<tr>\n", output.file); |
| 5 | 492 | 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
|
493 | fputs("<th></th>\n", output.file); |
| 5 | 494 | for (unsigned i = 0 ; i < 12 ; i++) { |
| 495 | indent(); | |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
496 | 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
|
497 | const unsigned total = summary.count(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
498 | if (total > 0) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
499 | std::string commit_summary; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
500 | if (!hide_repo_names) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
501 | std::string commit_summary_json; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
502 | commit_summary_json += '{'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
503 | for (const auto &[repo, count] : summary.commits) { |
|
84
7c9dfe5b49b5
fix insufficient HTML escaping in the pop-ups
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
504 | commit_summary_json += std::format("\"{}\": {},", encode(repo), count); |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
505 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
506 | if (!summary.commits.empty()) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
507 | commit_summary_json.pop_back(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
508 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
509 | commit_summary_json += '}'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
510 | 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
|
511 | } |
|
76
110a234a3260
add reading commit hashes from the commit log - resolves #807
Mike Becker <universe@uap-core.de>
parents:
75
diff
changeset
|
512 | 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
|
513 | 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
|
514 | "<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
|
515 | total, colspans[i], total, |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
516 | commit_summary.c_str(), |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
517 | encode(tags).c_str(), months[i]); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
518 | } 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
|
519 | 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
|
520 | "<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
|
521 | colspans[i], months[i]); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
522 | } |
| 5 | 523 | } |
| 524 | 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
|
525 | fputs("</tr>\n", output.file); |
| 5 | 526 | } |
| 527 | ||
| 528 | void html::table_end() { | |
|
46
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
529 | 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
|
530 | fputs("</table>\n", output.file); |
| 5 | 531 | } |
| 532 | ||
| 533 | void html::row_begin(unsigned int row) { | |
| 534 | 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
|
535 | fputs("<tr>\n", output.file); |
| 5 | 536 | 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
|
537 | fprintf(output.file, "<th scope=\"row\">%s</th>\n", weekdays[row]); |
| 5 | 538 | } |
| 539 | ||
| 540 | void html::row_end() { | |
| 541 | 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
|
542 | fputs("</tr>\n", output.file); |
| 5 | 543 | } |
| 544 | ||
| 545 | void html::cell_out_of_range() { | |
| 546 | 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
|
547 | fputs("<td class=\"out-of-range\"></td>\n", output.file); |
| 5 | 548 | } |
| 549 | ||
|
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
550 | void html::cell(year_month_day ymd, bool hide_repo_names, const fm::commits &commits) { |
| 7 | 551 | const char *color_class; |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
552 | if (commits.count() == 0) { |
| 7 | 553 | color_class = "zero-commits"; |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
554 | } else if (commits.count() == 1) { |
| 7 | 555 | color_class = "one-commit"; |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
556 | } else if (commits.count() <= 5) { |
| 7 | 557 | 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
|
558 | } else if (commits.count() <= 10) { |
| 7 | 559 | 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
|
560 | } else if (commits.count() <= 20) { |
| 7 | 561 | color_class = "up-to-20-commits"; |
| 562 | } else { | |
| 563 | color_class = "commit-spam"; | |
| 564 | } | |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
565 | |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
566 | // 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
|
567 | 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
|
568 | // 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
|
569 | for (const auto &summary : summaries | std::views::reverse) { |
|
84
7c9dfe5b49b5
fix insufficient HTML escaping in the pop-ups
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
570 | json += "\"" + encode(summary.message) + "\","; |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
571 | } |
|
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
572 | 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
|
573 | }; |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
574 | 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
|
575 | 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
|
576 | 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
|
577 | 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
|
578 | 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
|
579 | } |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
580 | 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
|
581 | } else { |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
582 | 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
|
583 | for (const auto &[repo, summaries] : commits.summaries) { |
|
84
7c9dfe5b49b5
fix insufficient HTML escaping in the pop-ups
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
584 | summaries_json += "\"" + encode(repo) + "\":["; |
|
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
585 | 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
|
586 | 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
|
587 | } |
|
60
9b1cbc665851
fix malformed JSON on days without commits in the combined view
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
588 | 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
|
589 | 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
|
590 | } |
|
56
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 += '}'; |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
592 | } |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
593 | |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
594 | // Build a JSON object of tags |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
595 | 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
|
596 | |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
597 | // Output |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
598 | std::string date_str = std::format("{}, {}-{:02d}-{:02d}", |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
599 | weekdays[weekday(ymd).iso_encoding() - 1], |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
600 | static_cast<int>(ymd.year()), |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
601 | static_cast<unsigned>(ymd.month()), |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
602 | static_cast<unsigned>(ymd.day())); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
603 | const unsigned total = commits.count(); |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
604 | 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
|
605 | 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
|
606 | "<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
|
607 | color_class, |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
608 | date_str.c_str(), |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
609 | total, |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
610 | total == 1 ? "commit" : "commits", |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
611 | total, |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
612 | date_str.c_str(), |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
613 | encode(summaries_json).c_str(), |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
614 | encode(tags_json).c_str() |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
615 | ); |
| 5 | 616 | } |