From b3869a783323fc424f8321d1a9a6379ef90b32c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Guillot?= Date: Fri, 29 Nov 2019 10:27:25 -0800 Subject: [PATCH] Show attachment size on entry page --- template/functions.go | 23 +++++++++++++++++++---- template/functions_test.go | 19 +++++++++++++++++++ template/html/entry.html | 4 ++-- template/views.go | 6 +++--- 4 files changed, 43 insertions(+), 9 deletions(-) diff --git a/template/functions.go b/template/functions.go index 0f5b180c..157935d9 100644 --- a/template/functions.go +++ b/template/functions.go @@ -31,10 +31,11 @@ type funcMap struct { // Map returns a map of template functions that are compiled during template parsing. func (f *funcMap) Map() template.FuncMap { return template.FuncMap{ - "dict": dict, - "hasKey": hasKey, - "truncate": truncate, - "isEmail": isEmail, + "formatFileSize": formatFileSize, + "dict": dict, + "hasKey": hasKey, + "truncate": truncate, + "isEmail": isEmail, "baseURL": func() string { return config.Opts.BaseURL() }, @@ -200,3 +201,17 @@ func proxify(router *mux.Router, link string) string { // We use base64 url encoding to avoid slash in the URL. return route.Path(router, "proxy", "encodedURL", base64.URLEncoding.EncodeToString([]byte(link))) } + +func formatFileSize(b int64) string { + const unit = 1024 + if b < unit { + return fmt.Sprintf("%d B", b) + } + div, exp := int64(unit), 0 + for n := b / unit; n >= unit; n /= unit { + div *= unit + exp++ + } + return fmt.Sprintf("%.1f %ciB", + float64(b)/float64(div), "KMGTPE"[exp]) +} diff --git a/template/functions_test.go b/template/functions_test.go index 5e373196..4f1ec083 100644 --- a/template/functions_test.go +++ b/template/functions_test.go @@ -314,3 +314,22 @@ func TestProxyFilterWithHttpsInvalid(t *testing.T) { t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected) } } + +func TestFormatFileSize(t *testing.T) { + scenarios := []struct { + input int64 + expected string + }{ + {500, "500 B"}, + {1024, "1.0 KiB"}, + {43520, "42.5 KiB"}, + {5000 * 1024 * 1024, "4.9 GiB"}, + } + + for _, scenario := range scenarios { + result := formatFileSize(scenario.input) + if result != scenario.expected { + t.Errorf(`Unexpected result, got %q instead of %q for %d`, result, scenario.expected, scenario.input) + } + } +} diff --git a/template/html/entry.html b/template/html/entry.html index 4dcd3ca2..c7eea4a7 100644 --- a/template/html/entry.html +++ b/template/html/entry.html @@ -115,8 +115,8 @@ {{ end }}
- {{ t "action.download" }} - ({{ .URL }}) + {{ .URL }} + {{ if gt .Size 0 }} - {{ formatFileSize .Size }}{{ end }}
{{ end }} diff --git a/template/views.go b/template/views.go index c4fadb44..21b29fb8 100644 --- a/template/views.go +++ b/template/views.go @@ -680,8 +680,8 @@ var templateViewsMap = map[string]string{ {{ end }}
- {{ t "action.download" }} - ({{ .URL }}) + {{ .URL }} + {{ if gt .Size 0 }} - {{ formatFileSize .Size }}{{ end }}
{{ end }} @@ -1354,7 +1354,7 @@ var templateViewsMapChecksums = map[string]string{ "edit_category": "b1c0b38f1b714c5d884edcd61e5b5295a5f1c8b71c469b35391e4dcc97cc6d36", "edit_feed": "34aa0d668b3ea1a1b5fa480c20cebeae729b37010af3bb915d2a9eed73d3b996", "edit_user": "c692db9de1a084c57b93e95a14b041d39bf489846cbb91fc982a62b72b77062a", - "entry": "24aeba26ef9a51ce585ca5c4af090f1de7d7bfd7f1e3ff1b63af520e2afa76bd", + "entry": "36c75170b4831e96ba7d7726f8c80e5401366c626a1283629712a47f5e1e8caf", "feed_entries": "9c70b82f55e4b311eff20be1641733612e3c1b406ce8010861e4c417d97b6dcc", "feeds": "fa06cd1e1e3fec79132386972c640a2fe91237f5dba572389d5f45be74545f25", "history_entries": "87e17d39de70eb3fdbc4000326283be610928758eae7924e4b08dcb446f3b6a9",