sort new to old

ref #163
This commit is contained in:
Dariush Abbasi
2026-02-27 05:23:44 -07:00
parent c92ebe167d
commit cfb82c17a1
72 changed files with 607 additions and 614 deletions
+1 -1
View File
@@ -18,4 +18,4 @@ jobs:
go-version: "1.21" go-version: "1.21"
- name: Run validator - name: Run validator
run: make validate run: make -C gobooks validate
+2 -1
View File
@@ -7,12 +7,13 @@ Add books with this format :
``` ```
### DATE - [BOOK NAME](BOOK URL) ### DATE - [BOOK NAME](BOOK URL)
<img src="BOOK COVER IMAGE ADDRESS" width="120px"/> <img src="gobooks/covers/COVER_FILENAME" width="120px"/>
BOOK DESCRIPTION BOOK DESCRIPTION
``` ```
* Place cover images in `gobooks/covers/` with a slug filename (e.g. `book-name.jpg`).
* If book is free, add it after free books of that category and also add `*Free*` after book url. * If book is free, add it after free books of that category and also add `*Free*` after book url.
* Add other books in ascending date order (newest last). Books without date go at the end of the list in that category. * Add other books in ascending date order (newest last). Books without date go at the end of the list in that category.
* To keep track of the huge table of contents you can use a plugin like [Markdown VSCode plugin](https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one) * To keep track of the huge table of contents you can use a plugin like [Markdown VSCode plugin](https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one)
-3
View File
@@ -1,3 +0,0 @@
.PHONY: validate
validate:
cd validator && go run . ../README.md
+595 -603
View File
File diff suppressed because it is too large Load Diff
View File
+3
View File
@@ -0,0 +1,3 @@
.PHONY: validate
validate:
cd validator && go run . ../../README.md

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 81 KiB

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 99 KiB

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Before

Width:  |  Height:  |  Size: 188 KiB

After

Width:  |  Height:  |  Size: 188 KiB

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Before

Width:  |  Height:  |  Size: 228 KiB

After

Width:  |  Height:  |  Size: 228 KiB

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 78 KiB

Before

Width:  |  Height:  |  Size: 154 KiB

After

Width:  |  Height:  |  Size: 154 KiB

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 85 KiB

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 91 KiB

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Before

Width:  |  Height:  |  Size: 118 KiB

After

Width:  |  Height:  |  Size: 118 KiB

Before

Width:  |  Height:  |  Size: 263 KiB

After

Width:  |  Height:  |  Size: 263 KiB

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Before

Width:  |  Height:  |  Size: 106 KiB

After

Width:  |  Height:  |  Size: 106 KiB

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 63 KiB

Before

Width:  |  Height:  |  Size: 371 KiB

After

Width:  |  Height:  |  Size: 371 KiB

Before

Width:  |  Height:  |  Size: 116 KiB

After

Width:  |  Height:  |  Size: 116 KiB

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 113 KiB

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 92 KiB

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Before

Width:  |  Height:  |  Size: 139 KiB

After

Width:  |  Height:  |  Size: 139 KiB

Before

Width:  |  Height:  |  Size: 136 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Before

Width:  |  Height:  |  Size: 178 KiB

After

Width:  |  Height:  |  Size: 178 KiB

Before

Width:  |  Height:  |  Size: 376 KiB

After

Width:  |  Height:  |  Size: 376 KiB

Before

Width:  |  Height:  |  Size: 309 KiB

After

Width:  |  Height:  |  Size: 309 KiB

Before

Width:  |  Height:  |  Size: 293 KiB

After

Width:  |  Height:  |  Size: 293 KiB

Before

Width:  |  Height:  |  Size: 415 KiB

After

Width:  |  Height:  |  Size: 415 KiB

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Before

Width:  |  Height:  |  Size: 368 KiB

After

Width:  |  Height:  |  Size: 368 KiB

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Before

Width:  |  Height:  |  Size: 394 KiB

After

Width:  |  Height:  |  Size: 394 KiB

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 73 KiB

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 89 KiB

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 1.4 MiB

Before

Width:  |  Height:  |  Size: 381 KiB

After

Width:  |  Height:  |  Size: 381 KiB

Before

Width:  |  Height:  |  Size: 428 KiB

After

Width:  |  Height:  |  Size: 428 KiB

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Before

Width:  |  Height:  |  Size: 136 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Before

Width:  |  Height:  |  Size: 225 KiB

After

Width:  |  Height:  |  Size: 225 KiB

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

@@ -4,7 +4,7 @@
// book metadata (*Last published*, *Authors*), cover images exist, covers linked. // book metadata (*Last published*, *Authors*), cover images exist, covers linked.
// //
// Usage: go run . [path/to/README.md] // Usage: go run . [path/to/README.md]
// go run . # uses README.md in parent dir (../README.md) // go run . # uses README.md at repo root (../../README.md)
package main package main
import ( import (
@@ -16,7 +16,7 @@ import (
) )
func main() { func main() {
readmePath := filepath.Join("..", "README.md") readmePath := filepath.Join("..", "..", "README.md")
if len(os.Args) > 1 { if len(os.Args) > 1 {
readmePath = os.Args[1] readmePath = os.Args[1]
} }
@@ -236,14 +236,14 @@ func extractBookBlocks(lines []string) map[string]string {
func extractCoverRefs(lines []string) []string { func extractCoverRefs(lines []string) []string {
var refs []string var refs []string
r := regexp.MustCompile(`src="(covers/[^"]+)"`) r := regexp.MustCompile(`src="(gobooks/covers/[^"]+)"`)
for _, line := range lines { for _, line := range lines {
if match := r.FindStringSubmatch(line); match != nil { if match := r.FindStringSubmatch(line); match != nil {
refs = append(refs, match[1]) refs = append(refs, match[1])
} }
} }
// Also check cover/ path // Also check gobooks/cover/ path (typo)
r2 := regexp.MustCompile(`src="(cover/[^"]+)"`) r2 := regexp.MustCompile(`src="(gobooks/cover/[^"]+)"`)
for _, line := range lines { for _, line := range lines {
if match := r2.FindStringSubmatch(line); match != nil { if match := r2.FindStringSubmatch(line); match != nil {
refs = append(refs, match[1]) refs = append(refs, match[1])
@@ -254,7 +254,7 @@ func extractCoverRefs(lines []string) []string {
func findUnlinkedCovers(lines []string) []string { func findUnlinkedCovers(lines []string) []string {
var unlinked []string var unlinked []string
r := regexp.MustCompile(`<img\s+src="(covers/[^"]+)"`) r := regexp.MustCompile(`<img\s+src="(gobooks/covers/[^"]+)"`)
for _, line := range lines { for _, line := range lines {
// Skip if img is inside <a href> or markdown link [<img...>](url) // Skip if img is inside <a href> or markdown link [<img...>](url)
if (strings.Contains(line, "<a href=") || strings.Contains(line, "](http")) && strings.Contains(line, "<img") { if (strings.Contains(line, "<a href=") || strings.Contains(line, "](http")) && strings.Contains(line, "<img") {