chore: style updates to kepler
8297b5d8
5 file(s) · +76 −9
| 54 | 54 | if c, err := resolveRef(repo, summary.DefaultRef); err == nil { |
|
| 55 | 55 | if tree, err := c.Tree(); err == nil { |
|
| 56 | 56 | if src, ok := findReadme(tree); ok { |
|
| 57 | - | if html, err := renderMarkdown(src); err == nil { |
|
| 57 | + | rawBase := "/r/" + summary.Name + "/raw/" + summary.DefaultRef + "/" |
|
| 58 | + | if html, err := renderMarkdown(src, rawBase); err == nil { |
|
| 58 | 59 | data.ReadmeHTML = html |
|
| 59 | 60 | data.HasReadme = true |
|
| 60 | 61 | } |
Binary file — no preview.
| 7 | 7 | "io/fs" |
|
| 8 | 8 | "net/http" |
|
| 9 | 9 | "path" |
|
| 10 | + | "regexp" |
|
| 10 | 11 | "strings" |
|
| 11 | 12 | "time" |
|
| 12 | 13 | ||
| 65 | 66 | web.Render(tmpl, w, name, data, a.Log) |
|
| 66 | 67 | } |
|
| 67 | 68 | ||
| 68 | - | func renderMarkdown(source string) (template.HTML, error) { |
|
| 69 | + | func renderMarkdown(source, rawBase string) (template.HTML, error) { |
|
| 69 | 70 | var buf bytes.Buffer |
|
| 70 | 71 | if err := md.Convert([]byte(source), &buf); err != nil { |
|
| 71 | 72 | return "", err |
|
| 72 | 73 | } |
|
| 73 | - | return template.HTML(buf.String()), nil |
|
| 74 | + | out := buf.String() |
|
| 75 | + | if rawBase != "" { |
|
| 76 | + | out = rewriteRelativeImages(out, rawBase) |
|
| 77 | + | } |
|
| 78 | + | return template.HTML(out), nil |
|
| 79 | + | } |
|
| 80 | + | ||
| 81 | + | var imgSrcRe = regexp.MustCompile(`(<img\b[^>]*?\bsrc=")([^"]+)(")`) |
|
| 82 | + | ||
| 83 | + | func rewriteRelativeImages(html, base string) string { |
|
| 84 | + | return imgSrcRe.ReplaceAllStringFunc(html, func(m string) string { |
|
| 85 | + | sub := imgSrcRe.FindStringSubmatch(m) |
|
| 86 | + | src := sub[2] |
|
| 87 | + | if isAbsoluteRef(src) { |
|
| 88 | + | return m |
|
| 89 | + | } |
|
| 90 | + | src = strings.TrimPrefix(src, "./") |
|
| 91 | + | return sub[1] + base + src + sub[3] |
|
| 92 | + | }) |
|
| 93 | + | } |
|
| 94 | + | ||
| 95 | + | func isAbsoluteRef(s string) bool { |
|
| 96 | + | if s == "" { |
|
| 97 | + | return true |
|
| 98 | + | } |
|
| 99 | + | if strings.HasPrefix(s, "/") || strings.HasPrefix(s, "#") { |
|
| 100 | + | return true |
|
| 101 | + | } |
|
| 102 | + | if strings.HasPrefix(s, "data:") || strings.HasPrefix(s, "//") { |
|
| 103 | + | return true |
|
| 104 | + | } |
|
| 105 | + | return strings.Contains(s, "://") |
|
| 74 | 106 | } |
|
| 75 | 107 | ||
| 76 | 108 | func renderBlobLines(source string) template.HTML { |
|
| 133 | 133 | ||
| 134 | 134 | @media (max-width: 720px) { .desktop { display: none; } } |
|
| 135 | 135 | ||
| 136 | + | @media (max-width: 720px) { |
|
| 137 | + | .container { padding: 0 0.75rem 3rem; } |
|
| 138 | + | ||
| 139 | + | .repo-nav { flex-wrap: wrap; gap: 0.25rem; } |
|
| 140 | + | .repo-name { flex: 1 1 100%; font-size: 15px; padding: 0.25rem 0; gap: 0.5rem; } |
|
| 141 | + | .repo-nav .tab:first-of-type { margin-left: 0; } |
|
| 142 | + | .tab { padding: 0.4rem 0.6rem; } |
|
| 143 | + | ||
| 144 | + | .last-commit { flex-wrap: wrap; gap: 0.25rem 0.75rem; padding: 0.5rem 0.75rem; } |
|
| 145 | + | .last-commit .subject { |
|
| 146 | + | flex: 1 1 100%; |
|
| 147 | + | min-width: 0; |
|
| 148 | + | white-space: nowrap; |
|
| 149 | + | overflow: hidden; |
|
| 150 | + | text-overflow: ellipsis; |
|
| 151 | + | } |
|
| 152 | + | ||
| 153 | + | .commit-title { flex-wrap: wrap; gap: 0.25rem 0.75rem; } |
|
| 154 | + | .commit-title .subject { flex: 1 1 100%; font-size: 15px; } |
|
| 155 | + | .commit-subtitle { flex-direction: column; align-items: flex-start; gap: 0.25rem; } |
|
| 156 | + | ||
| 157 | + | .file-header { flex-wrap: wrap; gap: 0.25rem 0.75rem; } |
|
| 158 | + | ||
| 159 | + | .diff-header { flex-wrap: wrap; gap: 0.25rem 0.5rem; } |
|
| 160 | + | .diff-header .name { word-break: break-all; } |
|
| 161 | + | ||
| 162 | + | .blob-code .line-num { min-width: 2.5rem; padding: 0 0.4rem 0 0.25rem; } |
|
| 163 | + | .blob-code .line-code { padding-left: 0.75rem; } |
|
| 164 | + | .diff-hunk td.diff-num { min-width: 1.75rem; padding: 0 0.2rem 0 0.25rem; } |
|
| 165 | + | td.diff-marker { padding: 0 0.2rem 0 0.4rem; } |
|
| 166 | + | .diff-hunk pre, .blob-code pre { font-size: 12px; } |
|
| 167 | + | ||
| 168 | + | h1 { font-size: 16px; } |
|
| 169 | + | } |
|
| 170 | + | ||
| 136 | 171 | /* --- Breadcrumbs --- */ |
|
| 137 | 172 | ||
| 138 | 173 | .breadcrumbs { font-size: 13px; margin-bottom: 1rem; color: var(--fg-dim); } |
|
| 335 | 370 | .readme pre { |
|
| 336 | 371 | background: var(--bg-alt); |
|
| 337 | 372 | padding: 0.75rem; |
|
| 373 | + | margin: 0.75rem 0; |
|
| 338 | 374 | overflow-x: auto; |
|
| 339 | 375 | font-size: 13px; |
|
| 340 | 376 | border-radius: 4px; |
|
| 341 | 377 | } |
|
| 378 | + | .readme p { margin: 0.5rem 0; } |
|
| 342 | 379 | .readme code { background: var(--bg-alt); padding: 1px 4px; font-size: 13px; border-radius: 3px; } |
|
| 343 | 380 | .readme pre code { background: transparent; padding: 0; } |
|
| 344 | 381 | .readme blockquote { border-left: 2px solid var(--border); margin: 0.75rem 0; padding-left: 0.75rem; color: var(--fg-dim); } |
|
| 345 | 382 | .readme table { border-collapse: collapse; margin: 0.75rem 0; } |
|
| 346 | 383 | .readme th, .readme td { border: 1px solid var(--border); padding: 0.25rem 0.5rem; } |
|
| 347 | 384 | .readme a { color: var(--fg); text-decoration: underline; } |
|
| 385 | + | .readme ul, .readme ol { padding-left: 1.5rem; margin: 0.5rem 0; } |
|
| 386 | + | .readme li { margin: 0.25rem 0; } |
|
| 387 | + | .readme li > ul, .readme li > ol { margin: 0.25rem 0; } |
|
| 348 | 388 | ||
| 349 | 389 | /* --- Error page --- */ |
|
| 350 | 390 | ||
| 1 | 1 | {{define "index.html"}}{{template "base.html" .}}{{end}} |
|
| 2 | 2 | {{define "title"}}{{.SiteName}}{{end}} |
|
| 3 | - | {{define "tabs"}}<a href="/" class="tab active">repositories</a>{{end}} |
|
| 4 | 3 | {{define "content"}} |
|
| 5 | 4 | {{if .Repos}} |
|
| 6 | 5 | <table class="repo-list"> |
|
| 7 | - | <thead> |
|
| 8 | - | <tr> |
|
| 9 | - | <th>Repository</th> |
|
| 10 | - | </tr> |
|
| 11 | - | </thead> |
|
| 12 | 6 | <tbody> |
|
| 13 | 7 | {{range .Repos}} |
|
| 14 | 8 | <tr> |