arnaucube
arnaucube/padArchiverPublic Self-hosted repository
added build, and added side menu to webserver
arnaucode arnaucode@gmail.com
Sun, 15 Apr 2018 14:20:15 +0200
commit

9bd5a48bccf7e7e2c7fb196a9ba9ebb28fad62f4

parent

3e0ef09e55991c5a5e0e7f094f9c52b3de1a52ca

M README.md → README.md

@@ -1,14 +1,16 @@

# padArchiver Tool to store a pad (from the link) into IPFS and Git. -## webServer +All the necessary files are in the /build directory. + +## 1.- webServer This is a webserver that automatically generates a web from the pads directories and files stored. -To run: +To run, inside 'build' directory: ``` ./webServer ``` -## listPadsImporter +## 2.- listPadsImporter This is to import all pads from the json file 'list.json'. Just need to edit the json file, for example: ```json

@@ -33,12 +35,12 @@ }

] } ``` -And then execute the importer: +To run, inside 'build' directory: ``` ./importFromList ``` -## apiServer +## 3.- apiServer This is an API to run in localhost. #### Run

@@ -56,7 +58,7 @@ "port": "3080"

} ``` -- Execute the API server: +- Execute the API server, inside the directory 'build': ``` > ./padArchiver-APIserver ```

@@ -108,8 +110,8 @@ }

``` The IPFS hash is also added to the first line of the document, before adding the document to Git. -## cli -To run the CLI, just need to run: +## 4.- cli +To run the CLI, just need to run inside the directory 'build': ``` ./padArchiver-cli ```
M apiServer/main.go → apiServer/main.go

@@ -89,7 +89,7 @@ panic(err)

} defer r.Body.Close() - ipfsHash, err := repo.StorePad(pad.Link, pad.Dir, pad.Title) + ipfsHash, err := repo.StorePad(pad.Link, pad.Dir, pad.Title, true) if err != nil { http.Error(w, "error storing pad", http.StatusConflict) }
A build.sh

@@ -0,0 +1,31 @@

+echo "starting build process" +rm -rf build +mkdir build + +cd webServer +echo "building webServer" +go build +cp webServer ../build +cp -r templates ../build +cd .. + +cd listPadsImporter +echo "building listPadsImporter" +go build +cp listPadsImporter ../build +cd .. + +cd apiServer +echo "building apiServer" +go build +cp apiServer ../build +cd .. + + +cd cli +echo "building cli" +go build +cp cli ../build +cd .. + +echo "build process complete, all the necessary files are in the /build directory"
A build/templates/menuTemplate.html

@@ -0,0 +1,18 @@

+<ul class="list-group"> + {{range .Items}} {{if .IsDir}} + <br><br> + <nav aria-label="breadcrumb"> + <ol class="breadcrumb"> + <li class="breadcrumb-item active" aria-current="page"> + <a href="{{.Path}}"> + <i class="fas fa-folder"></i> {{.Name}} + </a> + </li> + </ol> + </nav> + + {{else}} + <a href="{{.Path}}" class="list-group-item"> + <i class="fas fa-file-alt"></i> {{.Name}} + </a> {{end}} {{end}} +</ul>
A build/templates/pageTemplate.html

@@ -0,0 +1,98 @@

+<!doctype html> +<html lang="en"> + +<head> + <!-- Required meta tags --> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + + <!-- Bootstrap CSS --> + <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin="anonymous"> + + <style> + body { + word-wrap: break-word; + } + footer { + width:100%; + background: #38414f; + color: #bec0c4; + margin-top: 80px; + padding: 20px; + } + a:link { + color: #008ae6; + } + a:visited { + color: #008ae6; + } + a:hover { + color: #33adff; + } + </style> + + <title>padArchiver</title> +</head> + +<body> + <nav class="navbar navbar-expand-lg navbar-light bg-light"> + <a class="navbar-brand" href="/"> + <img src="https://seeklogo.com/images/G/go-logo-046185B647-seeklogo.com.png" height="30" class="d-inline-block align-top" alt=""> + padArchiver + </a> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-icon"></span> + </button> + + <div class="collapse navbar-collapse" id="navbarSupportedContent"> + <!--<ul class="navbar-nav mr-auto"> + <li class="nav-item active"> + <a class="nav-link" href="/">Home <span class="sr-only">(current)</span></a> + </li> + </ul>--> + </div> + <form class="form-inline my-2 my-lg-0"> + <input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search"> + <button class="btn btn-outline-info my-2 my-sm-0" type="submit">Search</button> + </form> + </nav> + + <br><br> + <div class="container"> + <div class="row"> + <div class="col-sm-3"> + {{.MenuContent}} + </div> + <div class="col-sm-9"> + <h3>{{.Title}}</h3> + <hr> {{.Content}} + </div> + </div> + + </div> + + <footer class="text-muted"> + <div class="container"> + <p class="float-right"> + <a href="#">Back to top</a> + </p> + <p> + padArchiver - webServer + </p> + <p> + Github: <a href="https://github.com/arnaucode/padArchiver" target="_blank">https://github.com/arnaucode/padArchiver</a> + </p> + </div> + </footer> + + <!-- Optional JavaScript --> + <!-- jQuery first, then Popper.js, then Bootstrap JS --> + <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> + <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js" integrity="sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ" crossorigin="anonymous"></script> + <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js" integrity="sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm" crossorigin="anonymous"></script> + + <!-- font awesome icons --> + <script defer src="https://use.fontawesome.com/releases/v5.0.10/js/all.js" integrity="sha384-slN8GvtUJGnv6ca26v8EzVaR9DC58QEwsIk9q1QXdCU8Yu8ck/tL/5szYlBbqmS+" crossorigin="anonymous"></script> +</body> + +</html>
A build/templates/wellcome.md

@@ -0,0 +1,7 @@

+### Wellcome to the padArchiver. +Select one pad from the side menu to visualize. + +![golang logo](https://seeklogo.com/images/G/go-logo-046185B647-seeklogo.com.png) + + +This is the wellcome message, from the 'templates/wellcome.md' file.
M cli/main.go → cli/main.go

@@ -87,7 +87,7 @@ title = strings.Replace(title, "\n", "", -1)

repo := padArchiver.OpenRepo(repoID) - ipfsHash, err := repo.StorePad(link, subdirectory, title) + ipfsHash, err := repo.StorePad(link, subdirectory, title, true) if err != nil { color.Red(err.Error()) } else {
M listPadsImporter/list.json → listPadsImporter/list.json

@@ -15,6 +15,11 @@ {

"link": "http://board.net/p/pad3", "dir": "Group2", "title": "Pad3" + }, + { + "link": "http://board.net/p/loremipsum", + "dir": "SubArea1", + "title": "loremipsum" } ] }
M listPadsImporter/main.go → listPadsImporter/main.go

@@ -58,7 +58,7 @@ fmt.Println("importing pad:")

fmt.Println(" link: " + pad.Link) fmt.Println(" dir: " + pad.Dir) fmt.Println(" title: " + pad.Title) - ipfsHash, err := repo.StorePad(pad.Link, pad.Dir, pad.Title) + ipfsHash, err := repo.StorePad(pad.Link, pad.Dir, pad.Title, false) check(err) fmt.Println(" ipfs hash: " + ipfsHash) }
M padArchiver.go → padArchiver.go

@@ -23,13 +23,16 @@ _ = os.Mkdir(repo.Dir, os.ModePerm)

return repo } -func (repo *Repo) StorePad(link string, directory string, title string) (string, error) { +func (repo *Repo) StorePad(link string, directory string, title string, ipfsActive bool) (string, error) { path, err := repo.GetPad(link, "md", directory, title) if err != nil { color.Red(err.Error()) return "", err } + if !ipfsActive { + return "", nil + } hash, err := IpfsAdd(path) if err != nil { color.Red(err.Error())
M padArchiver_test.go → padArchiver_test.go

@@ -11,7 +11,7 @@

func TestAddPad(t *testing.T) { color.Blue("TestAddPad") repo := OpenRepo("Repo01") - _, err := repo.StorePad("http://board.net/p/pad1", "Group1", "pad1") + _, err := repo.StorePad("http://board.net/p/pad1", "Group1", "pad1", true) if err == nil { color.Green(checkIcon + "checked AddPad")
M webServer/main.go → webServer/main.go

@@ -1,6 +1,7 @@

package main import ( + "bytes" "html/template" "log" "net/http"

@@ -13,14 +14,18 @@ "github.com/gorilla/mux"

) type ItemModel struct { - Name string - Path string - IsDir bool - Content template.HTML + Name string + Path string + IsDir bool } type MenuModel struct { PageTitle string Items []ItemModel +} +type PageModel struct { + Title string + MenuContent template.HTML + Content template.HTML } func main() {

@@ -35,7 +40,7 @@ log.Print("port: 8080")

log.Fatal(http.ListenAndServe(":8080", router)) } -func generateMenu(dirpath string) MenuModel { +func generateMenuItems(dirpath string) MenuModel { var menuPage MenuModel menuPage.PageTitle = "padArchiver - Menu" _ = filepath.Walk(padArchiver.Storage+dirpath, func(path string, f os.FileInfo, err error) error {

@@ -56,6 +61,14 @@ return nil

}) return menuPage } +func generateMenuHTML(dirpath string) template.HTML { + menuItems := generateMenuItems(dirpath) + tmplMenu := template.Must(template.ParseFiles("templates/menuTemplate.html")) + var tpl bytes.Buffer + err := tmplMenu.Execute(&tpl, menuItems) + check(err) + return template.HTML(tpl.String()) +} func getDir(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) var dirpath string

@@ -63,11 +76,18 @@ if _, ok := vars["path"]; ok {

dirpath = vars["path"] dirpath = strings.Replace(dirpath, "%", "/", -1) } - - menuPage := generateMenu(dirpath) + var page PageModel + page.Title = dirpath + if dirpath == "" { + page.Title = "padArchiver" + } + page.MenuContent = generateMenuHTML(dirpath) + content, err := fileToHTML("templates/wellcome.md") + check(err) + page.Content = template.HTML(content) - tmpl := template.Must(template.ParseFiles("templates/menuTemplate.html")) - tmpl.Execute(w, menuPage) + tmpl := template.Must(template.ParseFiles("templates/pageTemplate.html")) + tmpl.Execute(w, page) } func getPage(w http.ResponseWriter, r *http.Request) {

@@ -79,10 +99,12 @@

content, err := fileToHTML(path) check(err) - var item ItemModel - item.Name = path - item.Content = template.HTML(content) + var page PageModel + page.Title = path + page.Content = template.HTML(content) - tmpl := template.Must(template.ParseFiles("templates/pageTemplate.html")) - tmpl.Execute(w, item) + page.MenuContent = generateMenuHTML("") + + tmplPage := template.Must(template.ParseFiles("templates/pageTemplate.html")) + tmplPage.Execute(w, page) }
M webServer/templates/menuTemplate.html → webServer/templates/menuTemplate.html

@@ -1,91 +1,18 @@

-<!doctype html> -<html lang="en"> - -<head> - <!-- Required meta tags --> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> - - <!-- Bootstrap CSS --> - <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin="anonymous"> - - <style> - footer { - width:100%; - background: #38414f; - color: #bec0c4; - margin-top: 80px; - padding: 20px; - } - </style> - - <title>padArchiver</title> -</head> - -<body> - <nav class="navbar navbar-expand-lg navbar-light bg-light"> - <a class="navbar-brand" href="/">padArchiver</a> - <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> - <span class="navbar-toggler-icon"></span> - </button> - - <div class="collapse navbar-collapse" id="navbarSupportedContent"> - <ul class="navbar-nav mr-auto"> - <li class="nav-item active"> - <a class="nav-link" href="/">Home <span class="sr-only">(current)</span></a> - </li> - </ul> - </div> +<ul class="list-group"> + {{range .Items}} {{if .IsDir}} + <br><br> + <nav aria-label="breadcrumb"> + <ol class="breadcrumb"> + <li class="breadcrumb-item active" aria-current="page"> + <a href="{{.Path}}"> + <i class="fas fa-folder"></i> {{.Name}} + </a> + </li> + </ol> </nav> - <br><br> - - <div class="container"> - <div class="row"> - <div class="col-sm-2"></div> - <div class="col-sm-8"> - <h3>{{.PageTitle}}</h3> - <ul class="list-group"> - {{range .Items}} - {{if .IsDir}} - <br><br> - <nav aria-label="breadcrumb"> - <ol class="breadcrumb"> - <li class="breadcrumb-item active" aria-current="page"> - <a href="{{.Path}}">{{.Name}}</a> - </li> - </ol> - </nav> - - {{else}} - <a href="{{.Path}}" class="list-group-item">{{.Name}}</a> - {{end}} - {{end}} - </ul> - </div> - - </div> - </div> - - <footer> - <div class="container"> - <p class="float-right"> - <a href="#">Back to top</a> - </p> - <p> - padArchiver - webServer - </p> - <p> - Github: <a href="https://github.com/arnaucode/padArchiver" target="_blank">https://github.com/arnaucode/padArchiver</a> - </p> - </div> - </footer> - - <!-- Optional JavaScript --> - <!-- jQuery first, then Popper.js, then Bootstrap JS --> - <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> - <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js" integrity="sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ" crossorigin="anonymous"></script> - <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js" integrity="sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm" crossorigin="anonymous"></script> -</body> - -</html> + {{else}} + <a href="{{.Path}}" class="list-group-item"> + <i class="fas fa-file-alt"></i> {{.Name}} + </a> {{end}} {{end}} +</ul>
M webServer/templates/pageTemplate.html → webServer/templates/pageTemplate.html

@@ -10,6 +10,9 @@ <!-- Bootstrap CSS -->

<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin="anonymous"> <style> + body { + word-wrap: break-word; + } footer { width:100%; background: #38414f;

@@ -17,6 +20,15 @@ color: #bec0c4;

margin-top: 80px; padding: 20px; } + a:link { + color: #008ae6; + } + a:visited { + color: #008ae6; + } + a:hover { + color: #33adff; + } </style> <title>padArchiver</title>

@@ -24,26 +36,35 @@ </head>

<body> <nav class="navbar navbar-expand-lg navbar-light bg-light"> - <a class="navbar-brand" href="/">padArchiver</a> + <a class="navbar-brand" href="/"> + <img src="https://seeklogo.com/images/G/go-logo-046185B647-seeklogo.com.png" height="30" class="d-inline-block align-top" alt=""> + padArchiver + </a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarSupportedContent"> - <ul class="navbar-nav mr-auto"> + <!--<ul class="navbar-nav mr-auto"> <li class="nav-item active"> <a class="nav-link" href="/">Home <span class="sr-only">(current)</span></a> </li> - </ul> + </ul>--> </div> + <form class="form-inline my-2 my-lg-0"> + <input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search"> + <button class="btn btn-outline-info my-2 my-sm-0" type="submit">Search</button> + </form> </nav> <br><br> <div class="container"> <div class="row"> - <div class="col-sm-2"></div> - <div class="col-sm-10"> - <h3>{{.Name}}</h3> + <div class="col-sm-3"> + {{.MenuContent}} + </div> + <div class="col-sm-9"> + <h3>{{.Title}}</h3> <hr> {{.Content}} </div> </div>

@@ -69,6 +90,9 @@ <!-- jQuery first, then Popper.js, then Bootstrap JS -->

<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js" integrity="sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js" integrity="sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm" crossorigin="anonymous"></script> + + <!-- font awesome icons --> + <script defer src="https://use.fontawesome.com/releases/v5.0.10/js/all.js" integrity="sha384-slN8GvtUJGnv6ca26v8EzVaR9DC58QEwsIk9q1QXdCU8Yu8ck/tL/5szYlBbqmS+" crossorigin="anonymous"></script> </body> </html>
A webServer/templates/wellcome.md

@@ -0,0 +1,7 @@

+### Wellcome to the padArchiver. +Select one pad from the side menu to visualize. + +![golang logo](https://seeklogo.com/images/G/go-logo-046185B647-seeklogo.com.png) + + +This is the wellcome message, from the 'templates/wellcome.md' file.