Sun, 10 Aug 2025 15:22:25 +0200
highlight days with tags - resolves #672
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> |
5 | 30 | |
13 | 31 | using namespace std::chrono; |
6
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
32 | |
5 | 33 | namespace html { |
7 | 34 | static constexpr const char* weekdays[] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}; |
35 | ||
5 | 36 | static unsigned indentation; |
52
e9edc3bd0301
add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
37 | static const char *tabs = " "; |
5 | 38 | static void indent(int change = 0) { |
39 | indentation += change; | |
52
e9edc3bd0301
add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
40 | assert(indentation <= max_indentation); |
22
a9230f197e61
fix inconsistent use of tabs and spaces in indentation
Mike Becker <universe@uap-core.de>
parents:
20
diff
changeset
|
41 | fwrite(tabs, 4, indentation, stdout); |
5 | 42 | } |
43 | ||
44 | static std::string encode(const std::string &data) { | |
45 | std::string buffer; | |
46 | buffer.reserve(data.size()+16); | |
47 | for (const char &pos: data) { | |
48 | switch (pos) { | |
49 | case '&': | |
50 | buffer.append("&"); | |
51 | break; | |
52 | case '\"': | |
53 | buffer.append("""); | |
54 | break; | |
55 | case '\'': | |
56 | buffer.append("'"); | |
57 | break; | |
58 | case '<': | |
59 | buffer.append("<"); | |
60 | break; | |
61 | case '>': | |
62 | buffer.append(">"); | |
63 | break; | |
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
64 | case '#': |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
65 | buffer.append("#"); |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
66 | break; |
5 | 67 | default: |
68 | buffer.append(&pos, 1); | |
69 | break; | |
70 | } | |
71 | } | |
72 | return buffer; | |
73 | } | |
74 | } | |
75 | ||
52
e9edc3bd0301
add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
76 | void html::open(bool fragment, unsigned char fragment_indent) { |
20
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
77 | if (fragment) { |
52
e9edc3bd0301
add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
78 | indent(fragment_indent); |
20
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
79 | puts("<div class=\"heatmap-content\">"); |
52
e9edc3bd0301
add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
80 | indentation++; |
20
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
81 | } else { |
42 | 82 | puts(R"(<!DOCTYPE html> |
83 | <html> | |
5 | 84 | <head> |
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
85 | <meta charset="UTF-8"> |
5 | 86 | <style> |
87 | table.heatmap { | |
88 | table-layout: fixed; | |
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
89 | border-collapse: separate; |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
90 | border-spacing: 4px; |
5 | 91 | font-family: sans-serif; |
92 | } | |
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
93 | |
5 | 94 | table.heatmap td, table.heatmap th { |
95 | text-align: center; | |
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
96 | font-size: 0.75rem; |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
97 | border: solid 2px transparent; |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
98 | border-radius: 4px; |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
99 | height: 1rem; |
5 | 100 | } |
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
101 | |
5 | 102 | table.heatmap td { |
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
103 | width: 1rem; |
5 | 104 | } |
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
105 | |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
106 | 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
|
107 | filter: hue-rotate(90deg); |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
108 | } |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
109 | |
5 | 110 | table.heatmap td.out-of-range { |
111 | background-color: gray; | |
112 | } | |
7 | 113 | |
114 | table.heatmap td.zero-commits { | |
115 | background-color: white; | |
116 | } | |
117 | ||
118 | table.heatmap td.one-commit { | |
119 | background-color: #80E7A0; | |
120 | } | |
121 | ||
122 | table.heatmap td.up-to-5-commits { | |
123 | background-color: #30D350; | |
124 | } | |
125 | ||
126 | table.heatmap td.up-to-10-commits { | |
127 | background-color: #00BF00; | |
128 | } | |
129 | ||
130 | table.heatmap td.up-to-20-commits { | |
131 | background-color: #00A300; | |
132 | } | |
133 | ||
134 | table.heatmap td.commit-spam { | |
135 | background-color: #008000; | |
136 | } | |
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
137 | |
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
138 | 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
|
139 | border-color: gold; |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
140 | } |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
141 | |
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
142 | /* Popup styles */ |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
143 | .commit-popup { |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
144 | position: absolute; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
145 | background-color: #fff; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
146 | border: 1px solid #ccc; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
147 | border-radius: 4px; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
148 | 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
|
149 | padding: .2rem; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
150 | z-index: 1000; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
151 | width: 40ch; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
152 | font-family: sans-serif; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
153 | font-size: smaller; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
154 | 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
|
155 | word-wrap: break-word; |
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
156 | } |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
157 | |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
158 | .commit-popup h3 { |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
159 | margin-top: 0; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
160 | border-bottom: 1px solid #eee; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
161 | padding-bottom: 5px; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
162 | } |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
163 | |
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
164 | .commit-popup h4 { |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
165 | margin-top: .5em; |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
166 | margin-bottom: .5em; |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
167 | } |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
168 | |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
169 | .commit-popup h5 { |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
170 | margin-top: 0; |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
171 | } |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
172 | |
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
173 | .commit-popup ul { |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
174 | margin: 0; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
175 | padding-left: 20px; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
176 | } |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
177 | |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
178 | .commit-popup li { |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
179 | margin-bottom: 5px; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
180 | } |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
181 | |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
182 | .commit-popup .close-btn { |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
183 | position: absolute; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
184 | top: 5px; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
185 | right: 8px; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
186 | cursor: pointer; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
187 | font-weight: bold; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
188 | } |
5 | 189 | </style> |
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
190 | <script> |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
191 | document.addEventListener('DOMContentLoaded', function() { |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
192 | // Create popup element |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
193 | const popup = document.createElement('div'); |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
194 | popup.className = 'commit-popup'; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
195 | document.body.appendChild(popup); |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
196 | |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
197 | // Add click event listeners to all commit cells |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
198 | const cells = document.querySelectorAll('table.heatmap td:not(.out-of-range, .zero-commits)'); |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
199 | cells.forEach(cell => { |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
200 | cell.addEventListener('click', function(e) { |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
201 | const date = this.dataset.date; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
202 | const summaries = JSON.parse(this.dataset.summaries); |
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 | // 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
|
205 | let content = '<span class="close-btn">×</span>'; |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
206 | if (Array.isArray(summaries)) { |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
207 | content += `<h3>${date}: ${summaries.length} commit${summaries.length !== 1 ? 's' : ''}</h3>`; |
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
208 | if (this.dataset.tags) { |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
209 | content += `<h5>Tags: ${this.dataset.tags}</h5>`; |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
210 | } |
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
211 | content += '<ul>'; |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
212 | summaries.forEach(summary => { |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
213 | content += `<li>${summary}</li>`; |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
214 | }); |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
215 | content += '</ul>'; |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
216 | } else { |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
217 | const repos = Object.keys(summaries).sort(); |
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
218 | const tags = this.dataset.tags ? JSON.parse(this.dataset.tags) : {}; |
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
219 | let total_commits = 0; |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
220 | for (const repo of repos) total_commits += summaries[repo].length; |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
221 | content += `<h3>${date}: ${total_commits} commit${total_commits !== 1 ? 's' : ''}</h3>`; |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
222 | for (const repo of repos) { |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
223 | const commits = summaries[repo]; |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
224 | if (repos.length > 1) { |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
225 | content += `<h4>${repo} (${commits.length} commit${commits.length !== 1 ? 's' : ''})</h4>`; |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
226 | } else { |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
227 | content += `<h4>${repo}</h4>`; |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
228 | } |
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
229 | if (tags[repo]) { |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
230 | content += `<h5>Tags: ${tags[repo]}</h5>`; |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
231 | } |
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
232 | content += '<ul>'; |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
233 | commits.forEach(commit => { |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
234 | content += `<li>${commit}</li>`; |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
235 | }); |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
236 | content += '</ul>'; |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
237 | } |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
238 | } |
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
239 | popup.innerHTML = content; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
240 | |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
241 | // Position popup near the cell |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
242 | const rect = this.getBoundingClientRect(); |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
243 | 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
|
244 | 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
|
245 | popup.style.display = 'block'; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
246 | |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
247 | // Highlight the cell to which the popup belongs |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
248 | document.querySelectorAll('table.heatmap td.popup-open').forEach(old_cell => { |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
249 | old_cell.classList.toggle("popup-open"); |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
250 | }); |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
251 | cell.classList.toggle("popup-open"); |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
252 | |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
253 | // Add close button handler |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
254 | const closeBtn = popup.querySelector('.close-btn'); |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
255 | if (closeBtn) { |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
256 | closeBtn.addEventListener('click', function() { |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
257 | popup.style.display = 'none'; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
258 | cell.classList.toggle("popup-open"); |
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 | } |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
261 | |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
262 | e.stopPropagation(); |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
263 | }); |
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 | |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
266 | // Close popup when clicking elsewhere |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
267 | document.addEventListener('click', function(e) { |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
268 | if (!popup.contains(e.target)) { |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
269 | popup.style.display = 'none'; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
270 | document.querySelectorAll('table.heatmap td.popup-open').forEach(cell => { |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
271 | cell.classList.toggle("popup-open"); |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
272 | }); |
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 | }); |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
276 | </script> |
5 | 277 | </head> |
20
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
278 | <body> |
41
19cc90878968
fix wrong escape in raw string
Mike Becker <universe@uap-core.de>
parents:
35
diff
changeset
|
279 | <div class="heatmap-content">)"); |
20
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
280 | indentation = 3; |
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
281 | } |
5 | 282 | } |
283 | ||
20
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
284 | void html::close(bool fragment) { |
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
285 | if (fragment) { |
52
e9edc3bd0301
add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
286 | indent(-1); |
20
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
287 | puts("</div>"); |
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
288 | } else { |
22
a9230f197e61
fix inconsistent use of tabs and spaces in indentation
Mike Becker <universe@uap-core.de>
parents:
20
diff
changeset
|
289 | puts(" </div>\n </body>\n</html>"); |
20
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
290 | } |
5 | 291 | } |
292 | ||
46
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
293 | 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
|
294 | indent(); |
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
295 | printf("<div class=\"chart\" data-repo=\"%s\" data-author=\"%s\">\n", |
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
296 | 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
|
297 | indentation++; |
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
298 | } |
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
299 | |
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
300 | void html::chart_end() { |
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
301 | indent(-1); |
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
302 | puts("</div>"); |
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
303 | } |
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
304 | |
44
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
42
diff
changeset
|
305 | void html::heading_repo(const std::string& repo) { |
5 | 306 | indent(); |
50
1ebab6df60c2
fix mix of positional and non-positional printf specifiers
Mike Becker <universe@uap-core.de>
parents:
46
diff
changeset
|
307 | printf("<h1 data-repo=\"%1$s\">%1$s</h1>\n", encode(repo).c_str()); |
5 | 308 | } |
309 | ||
44
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
42
diff
changeset
|
310 | void html::heading_author(const std::string& author, unsigned int total_commits) { |
5 | 311 | indent(); |
44
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
42
diff
changeset
|
312 | printf("<h2 title=\"Total commits: %u\">%s</h2>\n", |
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
42
diff
changeset
|
313 | total_commits, |
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
42
diff
changeset
|
314 | encode(author).c_str()); |
5 | 315 | } |
316 | ||
44
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
42
diff
changeset
|
317 | void html::table_begin(year y, const std::array<unsigned int, 12> &commits_per_month) { |
6
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
318 | 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
|
319 | // compute the column spans, first |
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
320 | unsigned colspans[12] = {}; |
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
321 | { |
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
322 | unsigned total_cols = 0; |
13 | 323 | 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
|
324 | for (unsigned col = 0; col < 12; ++col) { |
13 | 325 | while (total_cols < html::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
|
326 | ++total_cols; |
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
327 | ++colspans[col]; |
13 | 328 | day += days{7}; |
6
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
329 | } |
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
330 | } |
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
331 | } |
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
332 | |
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
333 | // now render the table heading |
5 | 334 | indent(); |
335 | puts("<table class=\"heatmap\">"); | |
336 | indent(1); | |
337 | puts("<tr>"); | |
338 | indent(1); | |
339 | puts("<th></th>"); | |
340 | for (unsigned i = 0 ; i < 12 ; i++) { | |
341 | indent(); | |
44
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
42
diff
changeset
|
342 | printf("<th scope=\"col\" title=\"Total commits: %u\" colspan=\"%d\">%s</th>\n", |
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
42
diff
changeset
|
343 | commits_per_month[i], colspans[i], months[i]); |
5 | 344 | } |
345 | indent(-1); | |
346 | puts("</tr>"); | |
347 | } | |
348 | ||
349 | void html::table_end() { | |
46
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
350 | indent(-1); |
5 | 351 | puts("</table>"); |
352 | } | |
353 | ||
354 | void html::row_begin(unsigned int row) { | |
355 | indent(); | |
356 | puts("<tr>"); | |
357 | indent(1); | |
358 | printf("<th scope=\"row\">%s</th>\n", weekdays[row]); | |
359 | } | |
360 | ||
361 | void html::row_end() { | |
362 | indent(-1); | |
363 | puts("</tr>"); | |
364 | } | |
365 | ||
366 | void html::cell_out_of_range() { | |
367 | indent(); | |
368 | puts("<td class=\"out-of-range\"></td>"); | |
369 | } | |
370 | ||
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
371 | void html::cell(year_month_day ymd, bool hide_repo_names, const fm::commits &commits) { |
7 | 372 | const char *color_class; |
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
373 | if (commits.count() == 0) { |
7 | 374 | color_class = "zero-commits"; |
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
375 | } else if (commits.count() == 1) { |
7 | 376 | color_class = "one-commit"; |
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
377 | } else if (commits.count() <= 5) { |
7 | 378 | 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
|
379 | } else if (commits.count() <= 10) { |
7 | 380 | 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
|
381 | } else if (commits.count() <= 20) { |
7 | 382 | color_class = "up-to-20-commits"; |
383 | } else { | |
384 | color_class = "commit-spam"; | |
385 | } | |
54
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 | |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
388 | // Format date for display |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
389 | char date_str[32]; |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
390 | sprintf(date_str, "%s, %d-%02u-%02u", |
13 | 391 | weekdays[weekday(ymd).iso_encoding() - 1], |
7 | 392 | static_cast<int>(ymd.year()), |
393 | static_cast<unsigned>(ymd.month()), | |
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
394 | static_cast<unsigned>(ymd.day())); |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
395 | |
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
396 | // Utility function to escape strings in JSON |
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
397 | auto escape_json = [](std::string str) static { |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
398 | size_t pos = str.find('\"'); |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
399 | if (pos == std::string::npos) return str; |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
400 | std::string escaped = std::move(str); |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
401 | do { |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
402 | escaped.replace(pos, 1, "\\\""); |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
403 | pos += 2; |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
404 | } while ((pos = escaped.find('\"', pos)) != std::string::npos); |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
405 | return escaped; |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
406 | }; |
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
407 | |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
408 | // Build a JSON object of commit summaries |
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
409 | auto add_summaries = [escape_json](std::string &json, const std::vector<std::string> &summaries) { |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
410 | // 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
|
411 | for (const auto &summary : summaries | std::views::reverse) { |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
412 | json += "\"" + escape_json(summary) + "\","; |
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
413 | } |
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
414 | 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
|
415 | }; |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
416 | 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
|
417 | 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
|
418 | 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
|
419 | 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
|
420 | 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
|
421 | } |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
422 | 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
|
423 | } else { |
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
424 | 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
|
425 | 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
|
426 | 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
|
427 | 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
|
428 | 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
|
429 | } |
60
9b1cbc665851
fix malformed JSON on days without commits in the combined view
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
430 | 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
|
431 | 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
|
432 | } |
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
433 | summaries_json += '}'; |
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
434 | } |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
435 | |
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
436 | // Build a JSON object of tags |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
437 | std::string tags_json; |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
438 | if (hide_repo_names) { |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
439 | for (const auto &tags_vector: commits.tags | std::views::values) { |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
440 | for (const auto &tag: tags_vector) { |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
441 | tags_json += escape_json(tag); |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
442 | tags_json += ' '; |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
443 | } |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
444 | } |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
445 | if (!tags_json.empty()) { |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
446 | tags_json.pop_back(); |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
447 | } |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
448 | } else { |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
449 | tags_json += '{'; |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
450 | for (const auto &[repo, tags_vector] : commits.tags) { |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
451 | tags_json += "\"" + escape_json(repo) + "\":\""; |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
452 | for (const auto &tag: tags_vector) { |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
453 | tags_json += escape_json(tag); |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
454 | tags_json += ' '; |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
455 | } |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
456 | if (!tags_vector.empty()) { |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
457 | tags_json.pop_back(); |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
458 | } |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
459 | tags_json += "\","; |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
460 | } |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
461 | // note: in contrast to summaries, we want an empty string here when there's nothing to report |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
462 | tags_json.pop_back(); |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
463 | if (!commits.tags.empty()) { |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
464 | tags_json += '}'; |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
465 | } |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
466 | } |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
467 | |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
468 | // Output |
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
469 | indent(); |
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
470 | printf("<td class=\"%s\" title=\"%s: %u %s\" 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
|
471 | color_class, |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
472 | date_str, |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
473 | commits.count(), |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
474 | commits.count() == 1 ? "commit" : "commits", |
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
475 | date_str, |
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
476 | encode(summaries_json).c_str(), |
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
477 | encode(tags_json).c_str() |
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
478 | ); |
5 | 479 | } |