border-top: solid 1px black;
}
- table.blob td.no {
- border-right: solid 1px black;
+ table.blob td.lines {
+ margin: 0; padding: 0;
+ vertical-align: top;
color: black;
+ }
+
+ table.blob td.linenumbers {
+ margin: 0; padding: 0;
+ vertical-align: top;
+ border-right: 1px solid gray;
background-color: #eee;
- text-align: right;
}
- table.blob td.no a {
- color: black;
+ table.blob pre {
+ padding: 0; margin: 0;
}
- table.blob td.no a:hover {
- color: black;
+ table.blob a.no {
+ color: gray;
+ text-align: right;
text-decoration: none;
}
- table.blob td.txt {
- white-space: pre;
- font-family: monospace;
- padding-left: 0.5em;
+ table.blob a.no a:hover {
+ color: black;
}
table.nowrap td {
font-size: 80%;
color: #ccc;
}
+a.branch-deco {
+ margin: 0px 0.5em;
+ padding: 0px 0.25em;
+ background-color: #88ff88;
+ border: solid 1px #007700;
+}
+a.tag-deco {
+ margin: 0px 0.5em;
+ padding: 0px 0.25em;
+ background-color: #ffff88;
+ border: solid 1px #777700;
+}
+a.remote-deco {
+ margin: 0px 0.5em;
+ padding: 0px 0.25em;
+ background-color: #ccccff;
+ border: solid 1px #000077;
+}
+a.deco {
+ margin: 0px 0.5em;
+ padding: 0px 0.25em;
+ background-color: #ff8888;
+ border: solid 1px #770000;
+}
+table.stats {
+ border: solid 1px black;
+ border-collapse: collapse;
+}
+
+table.stats th {
+ text-align: left;
+ padding: 1px 0.5em;
+ background-color: #eee;
+ border: solid 1px black;
+}
+
+table.stats td {
+ text-align: right;
+ padding: 1px 0.5em;
+ border: solid 1px black;
+}
+
+table.stats td.total {
+ font-weight: bold;
+ text-align: left;
+}
+
+table.stats td.sum {
+ color: #c00;
+ font-weight: bold;
+/* background-color: #eee; */
+}
+
+table.stats td.left {
+ text-align: left;
+}
+
+table.vgraph {
+ border-collapse: separate;
+ border: solid 1px black;
+ height: 200px;
+}
+
+table.vgraph th {
+ background-color: #eee;
+ font-weight: bold;
+ border: solid 1px white;
+ padding: 1px 0.5em;
+}
+
+table.vgraph td {
+ vertical-align: bottom;
+ padding: 0px 10px;
+}
+
+table.vgraph div.bar {
+ background-color: #eee;
+}
+
+table.hgraph {
+ border: solid 1px black;
+ width: 800px;
+}
+
+table.hgraph th {
+ background-color: #eee;
+ font-weight: bold;
+ border: solid 1px black;
+ padding: 1px 0.5em;
+}
+
+table.hgraph td {
+ vertical-align: center;
+ padding: 2px 2px;
+}
+
+table.hgraph div.bar {
+ background-color: #eee;
+ height: 1em;
+}
{
enum object_type type;
char *buf;
- unsigned long size, lineno, start, idx;
- const char *linefmt = "<tr><td class='no'><a id='n%1$d' name='n%1$d' href='#n%1$d'>%1$d</a></td><td class='txt'>";
+ unsigned long size, lineno, idx;
+ const char *numberfmt = "<a class='no' id='n%1$d' name='n%1$d' href='#n%1$d'>%1$d</a>\n";
type = sha1_object_info(sha1, &size);
if (type == OBJ_BAD) {
html(" (");
cgit_plain_link("plain", NULL, NULL, ctx.qry.head,
curr_rev, path);
- htmlf(")<br/>blob: %s", sha1_to_hex(sha1));
+ htmlf(")<br/>blob: %s\n", sha1_to_hex(sha1));
html("<table summary='blob content' class='blob'>\n");
+ html("<tr>\n");
+
+ html("<td class='linenumbers'><pre>");
idx = 0;
- start = 0;
lineno = 0;
- while(idx < size) {
+ htmlf(numberfmt, ++lineno);
+ while(idx < size - 1) { // skip absolute last newline
if (buf[idx] == '\n') {
- buf[idx] = '\0';
- htmlf(linefmt, ++lineno);
- html_txt(buf + start);
- html("</td></tr>\n");
- start = idx + 1;
+ htmlf(numberfmt, ++lineno);
}
idx++;
}
- if (start < idx) {
- htmlf(linefmt, ++lineno);
- html_txt(buf + start);
- }
- html("</td></tr>\n");
+ html("</pre></td>\n");
+
+ html("<td class='lines'><pre><code>");
+ html_txt(buf);
+ html("</code></pre></td>\n");
+
+ html("</tr>\n");
html("</table>\n");
}
html("<td>");
cgit_log_link("log", NULL, "button", ctx.qry.head, curr_rev,
fullpath, 0, NULL, NULL, ctx.qry.showmsg);
+ if (ctx.repo->max_stats)
+ cgit_stats_link("stats", NULL, "button", ctx.qry.head,
+ fullpath);
html("</td></tr>\n");
free(name);
return 0;