mirror of
https://github.com/nkanaev/yarr.git
synced 2025-05-25 13:39:22 +00:00
Compare commits
No commits in common. "5254df53dc6d6e69b4f043e8d232d05b16ceb548" and "b09c95d7eab9b93a98f63bec61b54d929f2db47f" have entirely different histories.
5254df53dc
...
b09c95d7ea
@ -15,7 +15,6 @@
|
|||||||
- (fix) error caused by missing config dir (thanks to @timster)
|
- (fix) error caused by missing config dir (thanks to @timster)
|
||||||
- (etc) load external images with no-referrer policy (thanks to @tillcash for the report)
|
- (etc) load external images with no-referrer policy (thanks to @tillcash for the report)
|
||||||
- (etc) open external links with no-referrer policy (thanks to @donovanglover)
|
- (etc) open external links with no-referrer policy (thanks to @donovanglover)
|
||||||
- (etc) show article content in the list if title is missing (thanks to @asimpson for suggestion)
|
|
||||||
|
|
||||||
# v2.4 (2023-08-15)
|
# v2.4 (2023-08-15)
|
||||||
|
|
||||||
|
@ -62,7 +62,3 @@
|
|||||||
- site: https://juliepowell.blogspot.com/
|
- site: https://juliepowell.blogspot.com/
|
||||||
feed: https://juliepowell.blogspot.com/feeds/posts/default
|
feed: https://juliepowell.blogspot.com/feeds/posts/default
|
||||||
tags: [blogger, text]
|
tags: [blogger, text]
|
||||||
|
|
||||||
- site: https://micro.blog/val
|
|
||||||
feed: https://micro.blog/posts/val
|
|
||||||
tags: [json, microblog]
|
|
||||||
|
@ -330,10 +330,10 @@
|
|||||||
<span class="icon">{% inline "external-link.svg" %}</span>
|
<span class="icon">{% inline "external-link.svg" %}</span>
|
||||||
</a>
|
</a>
|
||||||
<div class="flex-grow-1"></div>
|
<div class="flex-grow-1"></div>
|
||||||
<button class="toolbar-item" @click="navigateToItem(-1)" title="Previous Article" :disabled="itemSelected == items[0].id">
|
<button class="toolbar-item" @click="navigateToItem(-1)" title="Previous Article">
|
||||||
<span class="icon">{% inline "chevron-left.svg" %}</span>
|
<span class="icon">{% inline "chevron-left.svg" %}</span>
|
||||||
</button>
|
</button>
|
||||||
<button class="toolbar-item" @click="navigateToItem(+1)" title="Next Article" :disabled="itemSelected == items[items.length - 1].id">
|
<button class="toolbar-item" @click="navigateToItem(+1)" title="Next Article">
|
||||||
<span class="icon">{% inline "chevron-right.svg" %}</span>
|
<span class="icon">{% inline "chevron-right.svg" %}</span>
|
||||||
</button>
|
</button>
|
||||||
<button class="toolbar-item" @click="itemSelected=null" title="Close Article">
|
<button class="toolbar-item" @click="itemSelected=null" title="Close Article">
|
||||||
|
@ -4,7 +4,6 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
"unicode"
|
|
||||||
|
|
||||||
"golang.org/x/net/html"
|
"golang.org/x/net/html"
|
||||||
)
|
)
|
||||||
@ -62,16 +61,3 @@ func ExtractText(content string) string {
|
|||||||
text = whitespaceRegex.ReplaceAllLiteralString(text, " ")
|
text = whitespaceRegex.ReplaceAllLiteralString(text, " ")
|
||||||
return text
|
return text
|
||||||
}
|
}
|
||||||
|
|
||||||
func TruncateText(input string, size int) string {
|
|
||||||
runes := []rune(input)
|
|
||||||
if len(runes) <= size {
|
|
||||||
return input
|
|
||||||
}
|
|
||||||
for i := size - 1; i > 0; i-- {
|
|
||||||
if unicode.IsSpace(runes[i]) {
|
|
||||||
return string(runes[:i]) + " ..."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return input
|
|
||||||
}
|
|
||||||
|
@ -24,21 +24,3 @@ func TestExtractText(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestTruncateText(t *testing.T) {
|
|
||||||
input := "Lorem ipsum — классический текст-«рыба»"
|
|
||||||
|
|
||||||
size := 30
|
|
||||||
want := "Lorem ipsum — классический ..."
|
|
||||||
have := TruncateText(input, size)
|
|
||||||
if want != have {
|
|
||||||
t.Errorf("\nsize: %d\nwant: %#v\nhave: %#v", size, want, have)
|
|
||||||
}
|
|
||||||
|
|
||||||
size = 1000
|
|
||||||
want = input
|
|
||||||
have = TruncateText(input, size)
|
|
||||||
if want != have {
|
|
||||||
t.Errorf("\nsize: %d\nwant: %#v\nhave: %#v", size, want, have)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -371,19 +371,12 @@ func (s *Server) handleItemList(c *router.Context) {
|
|||||||
}
|
}
|
||||||
newestFirst := query.Get("oldest_first") != "true"
|
newestFirst := query.Get("oldest_first") != "true"
|
||||||
|
|
||||||
items := s.db.ListItems(filter, perPage+1, newestFirst, true)
|
items := s.db.ListItems(filter, perPage+1, newestFirst, false)
|
||||||
hasMore := false
|
hasMore := false
|
||||||
if len(items) == perPage+1 {
|
if len(items) == perPage+1 {
|
||||||
hasMore = true
|
hasMore = true
|
||||||
items = items[:perPage]
|
items = items[:perPage]
|
||||||
}
|
}
|
||||||
|
|
||||||
for i, item := range items {
|
|
||||||
if item.Title == "" {
|
|
||||||
text := htmlutil.ExtractText(item.Content)
|
|
||||||
items[i].Title = htmlutil.TruncateText(text, 140)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
c.JSON(http.StatusOK, map[string]interface{}{
|
c.JSON(http.StatusOK, map[string]interface{}{
|
||||||
"list": items,
|
"list": items,
|
||||||
"has_more": hasMore,
|
"has_more": hasMore,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user