Compare commits
5 Commits
610fe53787
...
a11318072f
| Author | SHA1 | Date | |
|---|---|---|---|
| a11318072f | |||
| 4f8b167e7d | |||
| e6c4095e78 | |||
| 0be444aa29 | |||
| 9dd00d29fd |
91
main.go
91
main.go
|
|
@ -1,11 +1,16 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
"html/template"
|
"html/template"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
|
"regexp"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/jinzhu/now"
|
"github.com/jinzhu/now"
|
||||||
|
|
@ -15,36 +20,104 @@ import (
|
||||||
"p83.nl/go/ekster/pkg/jf2"
|
"p83.nl/go/ekster/pkg/jf2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
log.SetFlags(log.LstdFlags | log.Lshortfile)
|
||||||
|
}
|
||||||
func main() {
|
func main() {
|
||||||
u, err := url.Parse(os.Args[1])
|
u, err := url.Parse(os.Args[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
filename := os.Args[2]
|
||||||
|
|
||||||
resp, err := http.Get(u.String())
|
re, err := regexp.Compile(`<span class="next-entry"></span>`)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
if resp.StatusCode != 200 {
|
f, err := openAndCreate(filename)
|
||||||
log.Fatalf("Status is not 200, but %d", resp.StatusCode)
|
|
||||||
|
data, err := ioutil.ReadAll(f)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
md := microformats.Parse(resp.Body, u)
|
f.Close()
|
||||||
items := jf2.SimplifyMicroformatDataItems(md)
|
|
||||||
|
var buf bytes.Buffer
|
||||||
|
items, err := getEntriesForFeed(u)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
items = filterEntriesAfter(items, now.With(time.Now()).Monday())
|
items = filterEntriesAfter(items, now.With(time.Now()).Monday())
|
||||||
|
|
||||||
|
err = outputEntries(items, &buf)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
output := re.ReplaceAll(data, buf.Bytes())
|
||||||
|
err = ioutil.WriteFile(filename, output, 0666)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func openAndCreate(filename string) (io.ReadCloser, error) {
|
||||||
|
f, err := os.Open(filename)
|
||||||
|
if err != nil && !os.IsExist(err) {
|
||||||
|
t, err := template.ParseFiles("templates/full.html")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
f, err = os.Create(filename)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
err = t.Execute(f, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
err = f.Close()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
f, err = os.Open(filename)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
} else if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return f, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func outputEntries(items []microsub.Item, w io.Writer) error {
|
||||||
t, err := template.ParseFiles("templates/weekly.html")
|
t, err := template.ParseFiles("templates/weekly.html")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
err = t.Execute(w, items)
|
||||||
err = t.Execute(os.Stdout, items)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
return err
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getEntriesForFeed(u *url.URL) ([]microsub.Item, error) {
|
||||||
|
resp, err := http.Get(u.String())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
if resp.StatusCode != 200 {
|
||||||
|
return nil, fmt.Errorf("status is not 200, but %d", resp.StatusCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
md := microformats.Parse(resp.Body, u)
|
||||||
|
items := jf2.SimplifyMicroformatDataItems(md)
|
||||||
|
return items, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func filterEntriesAfter(items []microsub.Item, from time.Time) []microsub.Item {
|
func filterEntriesAfter(items []microsub.Item, from time.Time) []microsub.Item {
|
||||||
|
|
|
||||||
11
templates/full.html
Normal file
11
templates/full.html
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<title>Weekly summaries</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="h-feed">
|
||||||
|
<h1 class="p-name">Weekly</h1>
|
||||||
|
<span class="next-entry"></span>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -1,25 +1,14 @@
|
||||||
<html lang="en">
|
<span class="next-entry"></span>
|
||||||
<head>
|
<div class="h-entry">
|
||||||
<title>Weekly summaries</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="h-feed">
|
|
||||||
<h1 class="p-name">Weekly</h1>
|
|
||||||
|
|
||||||
{{ range . }}
|
{{ range . }}
|
||||||
<div class="h-entry">
|
<h2 class="p-name">{{ .Name }}</h2>
|
||||||
<h2 class="p-name">{{ .Name }}</h2>
|
{{ if .Content }}
|
||||||
{{ if .Content }}
|
{{ if .Content.HTML }}
|
||||||
{{ if .Content.HTML }}
|
<div class="e-content">{{ .Content.HTML }}</div>
|
||||||
<div class="e-content">{{ .Content.HTML }}</div>
|
{{ else }}
|
||||||
{{ else }}
|
<div class="p-content">{{ .Content.Text }}</div>
|
||||||
<div class="p-content">{{ .Content.Text }}</div>
|
|
||||||
{{ end }}
|
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
<time datetime="{{ .Published }}">{{ .Published }}</time>
|
<time datetime="{{ .Published }}">{{ .Published }}</time>
|
||||||
</div>
|
|
||||||
{{ end }}
|
{{ end }}
|
||||||
</div>
|
</div>
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user