From 16fa0305bdd222f1ccb36a7ee1bc320df073e85b Mon Sep 17 00:00:00 2001 From: Arya Kiran Date: Tue, 25 Apr 2023 23:20:12 +0530 Subject: [PATCH] add initial wiki support in backend and a test sample for frontend --- pages/wiki.go | 81 +++++++++++++++++++++++++++++++++++++++++++++++++ serve/serve.go | 5 +++ views/wiki.html | 17 +++++++++++ 3 files changed, 103 insertions(+) create mode 100644 pages/wiki.go create mode 100644 views/wiki.html diff --git a/pages/wiki.go b/pages/wiki.go new file mode 100644 index 0000000..623794f --- /dev/null +++ b/pages/wiki.go @@ -0,0 +1,81 @@ +package pages + +import ( + "github.com/gocolly/colly" + "github.com/gofiber/fiber/v2" + "log" + "net/http" + "os" + "regexp" + "strings" +) + +type Wiki struct { + RepoUser string + RepoName string + Title string + LastEdit string + LastEditor string + RevisionNum string + PageNum string + PageContent string + Sidebar []Sidebar +} +type Sidebar struct { + Name string + Link string +} + +func WikiView(c *fiber.Ctx) error { + var wikiArray []Wiki + + resp, statusErr := http.Get("https://github.com/" + c.Params("user") + "/" + c.Params("repo") + "/wiki/" + c.Params("page")) + if statusErr != nil { + log.Println(statusErr) + } + if resp.StatusCode == 404 { + // I need a better way to do this + return c.Status(404).Render("error", fiber.Map{ + "title": "Error", + "error": "Wiki" + c.Params("page") + "not found", + }) + } + + // Scraping + Scrape := Wiki{} + + UserAgent, ok := os.LookupEnv("GOTHUB_USER_AGENT") + if !ok { + UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36" + } + + sc := colly.NewCollector(colly.AllowedDomains("github.com"), colly.UserAgent(UserAgent)) + sc.OnHTML("div#repository-container-header", func(e *colly.HTMLElement) { + Scrape.RepoUser = e.ChildText("span.author a") + Scrape.RepoName = e.ChildText("strong a") + }) + sc.OnHTML("div#wiki-wrapper", func(e *colly.HTMLElement) { + Scrape.Title = e.ChildText("div.d-flex h1") + Scrape.LastEdit = e.ChildText("div.gh-header-meta relative-time") + re := regexp.MustCompile(`\ edited.*`) + Scrape.LastEditor = re.ReplaceAllString(strings.Replace(e.ChildText("div.gh-header-meta"), "\n", "", -1), "${1}") + Scrape.RevisionNum = strings.TrimSuffix(e.ChildText("a.Link--muted"), " revisions") + }) + sc.OnHTML("div.Box--condensed", func(e *colly.HTMLElement) { + Scrape.PageNum = e.ChildText("span.Counter--primary") + e.ForEach("ul.list-style-none li.Box-row", func(i int, el *colly.HTMLElement) { + Scrape.Sidebar = append(Scrape.Sidebar, Sidebar{ + Name: el.ChildText("summary span a.Truncate-text"), + Link: el.ChildAttr("summary span a.Truncate-text", "href"), + }) + }) + }) + sc.Visit("https://github.com/" + c.Params("user") + "/" + c.Params("repo") + "/wiki/" + c.Params("page")) + // Add scrape-based info to wikiArray + wikiArray = append(wikiArray, Scrape) + + return c.Render("wiki", fiber.Map{ + "title": "Wiki page " + c.Params("page") + " | " + c.Params("user") + "/" + c.Params("repo"), + "wiki": wikiArray, + }) +} diff --git a/serve/serve.go b/serve/serve.go index 6ee4a3c..fa6fda3 100644 --- a/serve/serve.go +++ b/serve/serve.go @@ -111,6 +111,11 @@ func Serve(port string) { app.Get("/:user/:repo", pages.HandleRepo) app.Get("/:user/:repo/blob/:branch/+", pages.FileView) app.Get("/:user/:repo/tree/:branch/+", pages.DirView) + app.Get("/:user/:repo/wiki", func(c *fiber.Ctx) error { + c.Redirect("/" + c.Params("user") + "/" + c.Params("repo") + "/wiki/Home") + return nil + }) + app.Get("/:user/:repo/wiki/:page", pages.WikiView) app.Get("/:user/:repo/tree/:branch", pages.HandleRepo) app.Get("/download/:user/:repo/:branch", func(c *fiber.Ctx) error { utils.ProxyRequest(c, "https://github.com/"+c.Params("user")+"/"+c.Params("repo")+"/archive/"+c.Params("branch")+".zip") diff --git a/views/wiki.html b/views/wiki.html new file mode 100644 index 0000000..4a6a8a8 --- /dev/null +++ b/views/wiki.html @@ -0,0 +1,17 @@ +{{ template "header" .}} + +
+ {{ if .wiki }} {{ range $key, $value := .wiki}} +

RepoUser: {{.RepoUser}}

+

RepoName: {{.RepoName}}

+

Title: {{.Title}}

+

LastEdit: {{.LastEdit}}

+

LastEditor: {{.LastEditor}}

+

RevisionNum: {{.RevisionNum}}

+

Sidebar: {{.Sidebar}}

+ {{ end }} {{ else }} +

Wiki not found

+

That wiki doesn't exist.

+ {{ end }} +
+{{ template "footer" .}}