chore: add date formatting
This commit is contained in:
parent
6b8ad143fe
commit
74fa69274d
@ -202,9 +202,8 @@ func addKey(preamble lextwt.Comments, key, value string, v ...any) lextwt.Commen
|
|||||||
return append(preamble, lextwt.NewCommentValue(comment, key, value))
|
return append(preamble, lextwt.NewCommentValue(comment, key, value))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func mkPreamble(hostname, uri, path string, limit int, length, offset, end int64) lextwt.Comments {
|
func mkPreamble(hostname, uri, path string, limit int, length, offset, end int64) lextwt.Comments {
|
||||||
uri += path
|
hostname += path
|
||||||
preamble := addKey(mkPreambleDocs(hostname), "twt range", "1 %d", end)
|
preamble := addKey(mkPreambleDocs(hostname), "twt range", "1 %d", end)
|
||||||
preamble = addKey(preamble, "self", "%s%s", hostname, mkqry(uri, limit, offset))
|
preamble = addKey(preamble, "self", "%s%s", hostname, mkqry(uri, limit, offset))
|
||||||
if next := offset + length; next < end {
|
if next := offset + length; next < end {
|
||||||
|
66
http-html.go
66
http-html.go
@ -56,6 +56,44 @@ func (a *HTML) home(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
preamble := mkPreamble(a.hostname, uri, "", limit, int64(len(twts)), offset, end)
|
preamble := mkPreamble(a.hostname, uri, "", limit, int64(len(twts)), offset, end)
|
||||||
|
|
||||||
|
reg := &HTWriter{
|
||||||
|
lextwt.NewTwtRegistry(preamble, reverse(twts)),
|
||||||
|
}
|
||||||
|
|
||||||
|
reg.WriteTo(w)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *HTML) conv(w http.ResponseWriter, r *http.Request) {
|
||||||
|
ctx, span := otel.Span(r.Context())
|
||||||
|
defer span.End()
|
||||||
|
|
||||||
|
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
||||||
|
|
||||||
|
hash := r.PathValue("hash")
|
||||||
|
if (len(hash) < 6 || len(hash) > 8) && !notAny(hash, "abcdefghijklmnopqrstuvwxyz234567") {
|
||||||
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
limit := 100
|
||||||
|
if v, ok := strconv.Atoi(r.URL.Query().Get("limit")); ok == nil {
|
||||||
|
limit = v
|
||||||
|
}
|
||||||
|
|
||||||
|
var offset int64 = 0
|
||||||
|
if v, ok := strconv.ParseInt(r.URL.Query().Get("offset"), 10, 64); ok == nil {
|
||||||
|
offset = v
|
||||||
|
}
|
||||||
|
|
||||||
|
twts, offset, end, err := fetchConv(ctx, a.db, hash, limit, offset)
|
||||||
|
span.RecordError(err)
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, "ERR", 500)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
preamble := mkPreamble(a.hostname, "", "/conv/"+hash, limit, int64(len(twts)), offset, end)
|
||||||
|
|
||||||
reg := &HTWriter{
|
reg := &HTWriter{
|
||||||
lextwt.NewTwtRegistry(preamble, twts),
|
lextwt.NewTwtRegistry(preamble, twts),
|
||||||
}
|
}
|
||||||
@ -90,9 +128,9 @@ func (r *HTWriter) WriteTo(w io.Writer) (int64, error) {
|
|||||||
.h-card .u-photo { width: 32px; }
|
.h-card .u-photo { width: 32px; }
|
||||||
.h-card .date { text-align: right;}
|
.h-card .date { text-align: right;}
|
||||||
section { overflow: scroll; }
|
section { overflow: scroll; }
|
||||||
</style
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body onload="setTimestamps()">
|
||||||
<pre class='preamble'>
|
<pre class='preamble'>
|
||||||
`)
|
`)
|
||||||
output += int64(i)
|
output += int64(i)
|
||||||
@ -117,7 +155,7 @@ func (r *HTWriter) WriteTo(w io.Writer) (int64, error) {
|
|||||||
i, err = fmt.Fprintln(w, "</pre><main>")
|
i, err = fmt.Fprintln(w, "</pre><main>")
|
||||||
output += int64(i)
|
output += int64(i)
|
||||||
|
|
||||||
for _, twt := range reverse(r.Twts()) {
|
for _, twt := range r.Twts() {
|
||||||
twter := twt.Twter()
|
twter := twt.Twter()
|
||||||
uri, err := url.Parse(twter.URI)
|
uri, err := url.Parse(twter.URI)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -149,7 +187,7 @@ func (r *HTWriter) WriteTo(w io.Writer) (int64, error) {
|
|||||||
|
|
||||||
<div class="date">
|
<div class="date">
|
||||||
<div><a class="u-url" href="%s">%s</a></div>
|
<div><a class="u-url" href="%s">%s</a></div>
|
||||||
<div><small>%s</small></div>
|
<div><small> </small></div>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<section>
|
<section>
|
||||||
@ -160,8 +198,9 @@ func (r *HTWriter) WriteTo(w io.Writer) (int64, error) {
|
|||||||
`, "/?uri="+twter.URI, twter.Avatar,
|
`, "/?uri="+twter.URI, twter.Avatar,
|
||||||
"/?uri="+twter.URI, twter.Nick,
|
"/?uri="+twter.URI, twter.Nick,
|
||||||
twter.URI, uri.Host,
|
twter.URI, uri.Host,
|
||||||
"/conv/"+twt.Hash(), fmt.Sprintf("<time datetime='%s'>%s</time>", twt.Created().Format(time.RFC3339), twt.Created().Format(time.RFC822)),
|
"/conv/"+twt.Subject().Tag().Text(), fmt.Sprintf("<time datetime='%s'>%s</time>", twt.Created().Format(time.RFC3339), twt.Created().Format(time.RFC822)),
|
||||||
time.Since(twt.Created()).Round(time.Second).String(), twt,
|
// time.Since(twt.Created()).Round(time.Minute).String(),
|
||||||
|
twt,
|
||||||
)
|
)
|
||||||
output += int64(i)
|
output += int64(i)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -170,7 +209,20 @@ func (r *HTWriter) WriteTo(w io.Writer) (int64, error) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
i, err = fmt.Fprintln(w, "</main></body>")
|
i, err = fmt.Fprintln(w, `</main>
|
||||||
|
<script>
|
||||||
|
function setTimestamps() {
|
||||||
|
document.querySelectorAll("time").forEach((e) => {
|
||||||
|
const OneDay = new Date(new Date().getTime() - (1 * 24 * 60 * 60 * 1000))
|
||||||
|
const d = new Date(e.hasAttributes() && e.attributes.getNamedItem('datetime'). value);
|
||||||
|
if (d > OneDay)
|
||||||
|
e.innerHTML = d.toLocaleTimeString('en-US',{ hour: '2-digit', minute: '2-digit' });
|
||||||
|
else
|
||||||
|
e.innerHTML = d.toLocaleDateString('en-US',{ hour: '2-digit', minute: '2-digit' });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>`)
|
||||||
output += int64(i)
|
output += int64(i)
|
||||||
|
|
||||||
return output, err
|
return output, err
|
||||||
|
4
http.go
4
http.go
@ -35,9 +35,11 @@ func httpServer(ctx context.Context, app *appState) error {
|
|||||||
hostname: app.args.Hostname,
|
hostname: app.args.Hostname,
|
||||||
}
|
}
|
||||||
|
|
||||||
http.HandleFunc("/", html.home)
|
|
||||||
http.HandleFunc("/health", html.healthcheck)
|
http.HandleFunc("/health", html.healthcheck)
|
||||||
|
|
||||||
|
http.HandleFunc("/", html.home)
|
||||||
|
http.HandleFunc("/conv/{hash}", html.conv)
|
||||||
|
|
||||||
http.HandleFunc("/api/plain", api.plain)
|
http.HandleFunc("/api/plain", api.plain)
|
||||||
http.HandleFunc("/api/plain/conv/{hash}", api.conv)
|
http.HandleFunc("/api/plain/conv/{hash}", api.conv)
|
||||||
http.HandleFunc("/api/plain/mentions", api.mentions)
|
http.HandleFunc("/api/plain/mentions", api.mentions)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user