Skip to content
This repository was archived by the owner on Apr 15, 2021. It is now read-only.

Commit 2c976fa

Browse files
committed
Initial release!
0 parents  commit 2c976fa

15 files changed

+939
-0
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.vscode

LICENSE

+231
Large diffs are not rendered by default.

Procfile

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
web: bin/cran

README.md

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
Compte Rendu de l'Assemblée Nationale ✨
2+
===
3+
4+
Récemment, je me suis retrouvé à lire un compte rendu sur le site de l'assemblée nationale. J'ai trouvé la mise en page peu adaptée au contenu et le manque d'informations sur les participants fort dommage.
5+
6+
Comme ça faisait un moment que je voulais testé le langage **Go** et la librairie [iris](https://github.com/kataras/iris), je me suis dis que ça ferait un bon petit TP !
7+
8+
Et voici le résultat avec à gauche la version originale et à droite la version sortie par cet outil :
9+
10+
<div align="center">
11+
<img src="source.png" width="280px"></img>
12+
<img src="pretty.png" width="280px"></img>
13+
</div>
14+
15+
*Une démo est hébergée sur [heroku](https://powerful-scrubland-26285.herokuapp.com/), c'est un peu lent étant donné qu'il s'agit d'un compte gratuit mais il suffit d'être patient.*
16+
17+
## Récupération et lancement
18+
19+
Il vous faudra une version de **Go** d'installée sur votre machine (1.11 ou ultérieur).
20+
21+
La commande `go run` ci-dessous ira chercher les dépendances nécessaires au projet puis lancera le serveur web.
22+
23+
```bash
24+
$ git clone https://github.com/YuukanOO/cran.git
25+
$ cd cran
26+
$ go run main.go
27+
```
28+
29+
## Problèmes connus
30+
31+
Il reste quelques imperfections ici et là selon les comptes rendus, n'hésitez pas à contribuer si le coeur vous en dit !

cran/assemblee_nationale_provider.go

+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package cran
2+
3+
import (
4+
"strings"
5+
6+
"github.com/PuerkitoBio/goquery"
7+
"github.com/gocolly/colly"
8+
)
9+
10+
type assembleeNationale struct{}
11+
12+
func (p *assembleeNationale) Accept(URL string) bool {
13+
return strings.Contains(URL, "assemblee-nationale.fr")
14+
}
15+
16+
func (p *assembleeNationale) Name() string {
17+
return "Assemblée Nationale"
18+
}
19+
20+
func (p *assembleeNationale) Fetch(URL string, callback ProviderCallback) {
21+
report := newReport(URL)
22+
23+
c := colly.NewCollector()
24+
25+
c.OnHTML("h1", func(e *colly.HTMLElement) {
26+
report.Title = e.Text
27+
})
28+
29+
c.OnHTML(".Point", func(ele *colly.HTMLElement) {
30+
sectionTitle := ele.DOM.Find("h2").First().Text()
31+
32+
// Some sections appears to be empty and it mess everything
33+
if sectionTitle == "" {
34+
return
35+
}
36+
37+
section := report.addSection(sectionTitle)
38+
39+
ele.DOM.Find("p").Each(func(i int, e *goquery.Selection) {
40+
d := c.Clone()
41+
42+
// Find the author
43+
author := e.Find("a[href]")
44+
45+
// And remove the node so it doesn't appear in the final sentence
46+
author.Remove()
47+
48+
authorName := author.Text()
49+
50+
// Append the intervention
51+
sentence, _ := e.Html()
52+
53+
// Remove noisy stuff which is anything before the first period
54+
if idx := strings.Index(sentence, "."); idx > -1 && authorName != "" {
55+
sentence = strings.TrimLeft(sentence[idx+1:], " ")
56+
}
57+
58+
section.addIntervention(authorName, sentence)
59+
60+
// Upon profile visit success, keep some information on it
61+
d.OnHTML("html", func(profileEle *colly.HTMLElement) {
62+
title := profileEle.DOM.Find("h1")
63+
img := profileEle.DOM.Find(".deputes-image img")
64+
65+
report.addSpeaker(authorName,
66+
title.Text(),
67+
profileEle.Request.URL.String(),
68+
profileEle.Request.AbsoluteURL(img.AttrOr("src", "")),
69+
title.Next().Text(),
70+
img.Parent().Parent().Last().Text())
71+
})
72+
73+
// And visits its profile
74+
if authorLink, exists := author.Attr("href"); exists {
75+
d.Visit(authorLink)
76+
}
77+
})
78+
})
79+
80+
c.OnScraped(func(r *colly.Response) {
81+
callback(report, nil)
82+
})
83+
84+
c.Visit(URL)
85+
}

cran/model.go

+84
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package cran
2+
3+
import "fmt"
4+
5+
// Report is the main structure representing what have been parsed by a provider.
6+
type Report struct {
7+
Title string
8+
Source string
9+
Speakers map[string]*Speaker
10+
Sections []*Section
11+
}
12+
13+
// Section represents a specific section of the report.
14+
type Section struct {
15+
ID string
16+
Title string
17+
Interventions []*Intervention
18+
}
19+
20+
// Intervention is a specific speech intervention made by a speaker.
21+
type Intervention struct {
22+
ID string
23+
SpeakerID string
24+
Sentence string
25+
}
26+
27+
// Speaker represents well... a speaker!
28+
type Speaker struct {
29+
ID string
30+
Name string
31+
URL string
32+
PictureURL string
33+
Location string
34+
Side string
35+
}
36+
37+
func newReport(source string) *Report {
38+
return &Report{
39+
Source: source,
40+
Speakers: make(map[string]*Speaker),
41+
Sections: make([]*Section, 0),
42+
}
43+
}
44+
45+
func (r *Report) addSpeaker(ID, name, URL, pictureURL, location, side string) {
46+
r.Speakers[ID] = &Speaker{
47+
ID: ID,
48+
Name: name,
49+
URL: URL,
50+
PictureURL: pictureURL,
51+
Location: location,
52+
Side: side,
53+
}
54+
}
55+
56+
func (r *Report) addSection(title string) *Section {
57+
section := &Section{
58+
ID: fmt.Sprintf("section-%d", len(r.Sections)),
59+
Title: title,
60+
Interventions: make([]*Intervention, 0),
61+
}
62+
63+
r.Sections = append(r.Sections, section)
64+
65+
return section
66+
}
67+
68+
func (s *Section) addIntervention(speaker, sentence string) {
69+
s.Interventions = append(s.Interventions, &Intervention{
70+
ID: fmt.Sprintf("%s--intervention-%d", s.ID, len(s.Interventions)),
71+
SpeakerID: speaker,
72+
Sentence: sentence,
73+
})
74+
}
75+
76+
// Speaker retrieves a speaker by its ID.
77+
func (r *Report) Speaker(ID string) *Speaker {
78+
return r.Speakers[ID]
79+
}
80+
81+
// Meta retrieves some meta information about the speaker.
82+
func (s *Speaker) Meta() string {
83+
return fmt.Sprintf("%s · %s", s.Side, s.Location)
84+
}

cran/provider.go

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package cran
2+
3+
import "errors"
4+
5+
// ProviderCallback represents the callback being called when a parsing has ended.
6+
type ProviderCallback func(report *Report, err error)
7+
8+
// ReportProvider defines an interface to fetch report from an URL.
9+
type ReportProvider interface {
10+
Accept(URL string) bool
11+
Name() string
12+
Fetch(URL string, callback ProviderCallback)
13+
}
14+
15+
var providers = []ReportProvider{
16+
&assembleeNationale{},
17+
}
18+
19+
// ErrProviderNotFound is thrown when a provider for the given name can not be found
20+
var ErrProviderNotFound = errors.New("Provider not found")
21+
22+
// GuessProvider tries to find a report provider for the given URL.
23+
func GuessProvider(URL string) (ReportProvider, error) {
24+
for _, p := range providers {
25+
if p.Accept(URL) {
26+
return p, nil
27+
}
28+
}
29+
30+
return nil, ErrProviderNotFound
31+
}
32+
33+
// Provider retrieve a provider by its name.
34+
func Provider(name string) (ReportProvider, error) {
35+
for _, p := range providers {
36+
if p.Name() == name {
37+
return p, nil
38+
}
39+
}
40+
41+
return nil, ErrProviderNotFound
42+
}

go.mod

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
module cran
2+
3+
go 1.12
4+
5+
require (
6+
github.com/BurntSushi/toml v0.3.1 // indirect
7+
github.com/Joker/jade v1.0.0 // indirect
8+
github.com/PuerkitoBio/goquery v1.5.0
9+
github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398 // indirect
10+
github.com/antchfx/htmlquery v1.0.0 // indirect
11+
github.com/antchfx/xmlquery v1.0.0 // indirect
12+
github.com/antchfx/xpath v0.0.0-20190319080838-ce1d48779e67 // indirect
13+
github.com/aymerick/raymond v2.0.2+incompatible // indirect
14+
github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 // indirect
15+
github.com/fatih/structs v1.1.0 // indirect
16+
github.com/flosch/pongo2 v0.0.0-20190505152737-8914e1cf9164 // indirect
17+
github.com/gobwas/glob v0.2.3 // indirect
18+
github.com/gocolly/colly v1.2.0
19+
github.com/golang/protobuf v1.3.1 // indirect
20+
github.com/iris-contrib/blackfriday v2.0.0+incompatible // indirect
21+
github.com/iris-contrib/formBinder v0.0.0-20190104093907-fbd5963f41e1 // indirect
22+
github.com/iris-contrib/go.uuid v2.0.0+incompatible // indirect
23+
github.com/json-iterator/go v1.1.6 // indirect
24+
github.com/kataras/golog v0.0.0-20180321173939-03be10146386 // indirect
25+
github.com/kataras/iris v11.1.1+incompatible
26+
github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d // indirect
27+
github.com/kennygrant/sanitize v1.2.4 // indirect
28+
github.com/klauspost/compress v1.5.0 // indirect
29+
github.com/klauspost/cpuid v1.2.1 // indirect
30+
github.com/microcosm-cc/bluemonday v1.0.2 // indirect
31+
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
32+
github.com/modern-go/reflect2 v1.0.1 // indirect
33+
github.com/ryanuber/columnize v2.1.0+incompatible // indirect
34+
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca // indirect
35+
github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect
36+
github.com/temoto/robotstxt v0.0.0-20180810133444-97ee4a9ee6ea // indirect
37+
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c // indirect
38+
golang.org/x/text v0.3.2 // indirect
39+
google.golang.org/appengine v1.5.0 // indirect
40+
)

go.sum

+99
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
2+
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
3+
github.com/Joker/hpp v0.0.0-20180418125244-6893e659854a/go.mod h1:MzD2WMdSxvbHw5fM/OXOFily/lipJWRc9C1px0Mt0ZE=
4+
github.com/Joker/jade v1.0.0 h1:lOCEPvTAtWfLpSZYMOv/g44MGQFAolbKh2khHHGu0Kc=
5+
github.com/Joker/jade v1.0.0/go.mod h1:efZIdO0py/LtcJRSa/j2WEklMSAw84WV0zZVMxNToB8=
6+
github.com/PuerkitoBio/goquery v1.5.0 h1:uGvmFXOA73IKluu/F84Xd1tt/z07GYm8X49XKHP7EJk=
7+
github.com/PuerkitoBio/goquery v1.5.0/go.mod h1:qD2PgZ9lccMbQlc7eEOjaeRlFQON7xY8kdmcsrnKqMg=
8+
github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398 h1:WDC6ySpJzbxGWFh4aMxFFC28wwGp5pEuoTtvA4q/qQ4=
9+
github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0=
10+
github.com/andybalholm/cascadia v1.0.0 h1:hOCXnnZ5A+3eVDX8pvgl4kofXv2ELss0bKcqRySc45o=
11+
github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
12+
github.com/antchfx/htmlquery v1.0.0 h1:O5IXz8fZF3B3MW+B33MZWbTHBlYmcfw0BAxgErHuaMA=
13+
github.com/antchfx/htmlquery v1.0.0/go.mod h1:MS9yksVSQXls00iXkiMqXr0J+umL/AmxXKuP28SUJM8=
14+
github.com/antchfx/xmlquery v1.0.0 h1:YuEPqexGG2opZKNc9JU3Zw6zFXwC47wNcy6/F8oKsrM=
15+
github.com/antchfx/xmlquery v1.0.0/go.mod h1:/+CnyD/DzHRnv2eRxrVbieRU/FIF6N0C+7oTtyUtCKk=
16+
github.com/antchfx/xpath v0.0.0-20190319080838-ce1d48779e67 h1:uj4UuiIs53RhHSySIupR1TEIouckjSfnljF3QbN1yh0=
17+
github.com/antchfx/xpath v0.0.0-20190319080838-ce1d48779e67/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk=
18+
github.com/aymerick/raymond v2.0.2+incompatible h1:VEp3GpgdAnv9B2GFyTvqgcKvY+mfKMjPOA3SbKLtnU0=
19+
github.com/aymerick/raymond v2.0.2+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g=
20+
github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o=
21+
github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM=
22+
github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
23+
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
24+
github.com/flosch/pongo2 v0.0.0-20190505152737-8914e1cf9164 h1:/HMcOGZC5Bi8JPgfbwz13ELWn/91+vY59HXS3z0qY5w=
25+
github.com/flosch/pongo2 v0.0.0-20190505152737-8914e1cf9164/go.mod h1:tbAXHifHQWNSpWbiJHpJTZH5fi3XHhDMdP//vuz9WS4=
26+
github.com/go-check/check v1.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98=
27+
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
28+
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
29+
github.com/gocolly/colly v1.2.0 h1:qRz9YAn8FIH0qzgNUw+HT9UN7wm1oF9OBAilwEWpyrI=
30+
github.com/gocolly/colly v1.2.0/go.mod h1:Hof5T3ZswNVsOHYmba1u03W65HDWgpV5HifSuueE0EA=
31+
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
32+
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
33+
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
34+
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
35+
github.com/iris-contrib/blackfriday v2.0.0+incompatible h1:o5sHQHHm0ToHUlAJSTjW9UWicjJSDDauOOQ2AHuIVp4=
36+
github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI=
37+
github.com/iris-contrib/formBinder v0.0.0-20190104093907-fbd5963f41e1 h1:7GsNnSLoVceNylMpwcfy5aFNz/S5/TV25crb34I5PEo=
38+
github.com/iris-contrib/formBinder v0.0.0-20190104093907-fbd5963f41e1/go.mod h1:i8kTYUOEstd/S8TG0ChTXQdf4ermA/e8vJX0+QruD9w=
39+
github.com/iris-contrib/go.uuid v2.0.0+incompatible h1:XZubAYg61/JwnJNbZilGjf3b3pB80+OQg2qf6c8BfWE=
40+
github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0=
41+
github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs=
42+
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
43+
github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5 h1:rhqTjzJlm7EbkELJDKMTU7udov+Se0xZkWmugr6zGok=
44+
github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q=
45+
github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U=
46+
github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA=
47+
github.com/kataras/golog v0.0.0-20180321173939-03be10146386 h1:VT6AeCHO/mc+VedKBMhoqb5eAK8B1i9F6nZl7EGlHvA=
48+
github.com/kataras/golog v0.0.0-20180321173939-03be10146386/go.mod h1:PcaEvfvhGsqwXZ6S3CgCbmjcp+4UDUh2MIfF2ZEul8M=
49+
github.com/kataras/iris v11.1.1+incompatible h1:c2iRKvKLpTYMXKdVB8YP/+A67NtZFt9kFFy+ZwBhWD0=
50+
github.com/kataras/iris v11.1.1+incompatible/go.mod h1:ki9XPua5SyAJbIxDdsssxevgGrbpBmmvoQmo/A0IodY=
51+
github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d h1:V5Rs9ztEWdp58oayPq/ulmlqJJZeJP6pP79uP3qjcao=
52+
github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0=
53+
github.com/kennygrant/sanitize v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8NzpJ3o=
54+
github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak=
55+
github.com/klauspost/compress v1.5.0 h1:iDac0ZKbmSA4PRrRuXXjZL8C7UoJan8oBYxXkMzEQrI=
56+
github.com/klauspost/compress v1.5.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
57+
github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w=
58+
github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
59+
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
60+
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
61+
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
62+
github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
63+
github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s=
64+
github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc=
65+
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
66+
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
67+
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
68+
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
69+
github.com/ryanuber/columnize v2.1.0+incompatible h1:j1Wcmh8OrK4Q7GXY+V7SVSY8nUWQxHW5TkBe7YUl+2s=
70+
github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
71+
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca h1:NugYot0LIVPxTvN8n+Kvkn6TrbMyxQiuvKdEwFdR9vI=
72+
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU=
73+
github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
74+
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
75+
github.com/temoto/robotstxt v0.0.0-20180810133444-97ee4a9ee6ea h1:hH8P1IiDpzRU6ZDbDh/RDnVuezi2oOXJpApa06M0zyI=
76+
github.com/temoto/robotstxt v0.0.0-20180810133444-97ee4a9ee6ea/go.mod h1:aOux3gHPCftJ3KHq6Pz/AlDjYJ7Y+yKfm1gU/3B0u04=
77+
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
78+
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
79+
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
80+
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
81+
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
82+
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a h1:gOpx8G595UYyvj8UK4+OFyY4rx037g3fmfhe5SasG3U=
83+
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
84+
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
85+
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c h1:uOCk1iQW6Vc18bnC13MfzScl+wdKBmM9Y9kU7Z83/lw=
86+
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
87+
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
88+
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
89+
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
90+
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
91+
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
92+
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
93+
golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
94+
google.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c=
95+
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
96+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
97+
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
98+
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
99+
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

0 commit comments

Comments
 (0)