diff options
author | Frédéric Guillot <fred@miniflux.net> | 2017-11-19 21:10:04 -0800 |
---|---|---|
committer | Frédéric Guillot <fred@miniflux.net> | 2017-11-19 22:01:46 -0800 |
commit | 8ffb773f43c8dc54801ca1d111854e7e881c93c9 (patch) | |
tree | 38133a2fc612597a75fed1d13e5b4042f58a2b7e /reader/rewrite |
First commit
Diffstat (limited to 'reader/rewrite')
-rw-r--r-- | reader/rewrite/rewriter.go | 47 | ||||
-rw-r--r-- | reader/rewrite/rewriter_test.go | 34 |
2 files changed, 81 insertions, 0 deletions
diff --git a/reader/rewrite/rewriter.go b/reader/rewrite/rewriter.go new file mode 100644 index 0000000..f23c0af --- /dev/null +++ b/reader/rewrite/rewriter.go @@ -0,0 +1,47 @@ +// Copyright 2017 Frédéric Guillot. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package rewrite + +import ( + "regexp" + "strings" + + "github.com/PuerkitoBio/goquery" +) + +var rewriteRules = []func(string, string) string{ + func(url, content string) string { + re := regexp.MustCompile(`youtube\.com/watch\?v=(.*)`) + matches := re.FindStringSubmatch(url) + + if len(matches) == 2 { + video := `<iframe width="650" height="350" frameborder="0" src="https://www.youtube-nocookie.com/embed/` + matches[1] + `" allowfullscreen></iframe>` + return video + "<p>" + content + "</p>" + } + return content + }, + func(url, content string) string { + if strings.HasPrefix(url, "https://xkcd.com") { + doc, err := goquery.NewDocumentFromReader(strings.NewReader(content)) + if err != nil { + return content + } + + imgTag := doc.Find("img").First() + if titleAttr, found := imgTag.Attr("title"); found { + return content + `<blockquote cite="` + url + `">` + titleAttr + "</blockquote>" + } + } + return content + }, +} + +func Rewriter(url, content string) string { + for _, rewriteRule := range rewriteRules { + content = rewriteRule(url, content) + } + + return content +} diff --git a/reader/rewrite/rewriter_test.go b/reader/rewrite/rewriter_test.go new file mode 100644 index 0000000..a666406 --- /dev/null +++ b/reader/rewrite/rewriter_test.go @@ -0,0 +1,34 @@ +// Copyright 2017 Frédéric Guillot. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package rewrite + +import "testing" + +func TestRewriteWithNoMatchingRule(t *testing.T) { + output := Rewriter("https://example.org/article", `Some text.`) + expected := `Some text.` + + if expected != output { + t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected) + } +} + +func TestRewriteWithYoutubeLink(t *testing.T) { + output := Rewriter("https://www.youtube.com/watch?v=1234", `Video Description`) + expected := `<iframe width="650" height="350" frameborder="0" src="https://www.youtube-nocookie.com/embed/1234" allowfullscreen></iframe><p>Video Description</p>` + + if expected != output { + t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected) + } +} + +func TestRewriteWithXkcdLink(t *testing.T) { + description := `<img src="https://imgs.xkcd.com/comics/thermostat.png" title="Your problem is so terrible, I worry that, if I help you, I risk drawing the attention of whatever god of technology inflicted it on you." alt="Your problem is so terrible, I worry that, if I help you, I risk drawing the attention of whatever god of technology inflicted it on you." />` + output := Rewriter("https://xkcd.com/1912/", description) + expected := description + `<blockquote cite="https://xkcd.com/1912/">Your problem is so terrible, I worry that, if I help you, I risk drawing the attention of whatever god of technology inflicted it on you.</blockquote>` + if expected != output { + t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected) + } +} |