added build, and added side menu to webserver
jump to
@@ -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 ```
@@ -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) }
@@ -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"
@@ -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>
@@ -0,0 +1,7 @@
+### Wellcome to the padArchiver. +Select one pad from the side menu to visualize. + + + + +This is the wellcome message, from the 'templates/wellcome.md' file.
@@ -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 {
@@ -15,6 +15,11 @@ {
"link": "http://board.net/p/pad3", "dir": "Group2", "title": "Pad3" + }, + { + "link": "http://board.net/p/loremipsum", + "dir": "SubArea1", + "title": "loremipsum" } ] }
@@ -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) }
@@ -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())
@@ -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")
@@ -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) }
@@ -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>
@@ -0,0 +1,7 @@
+### Wellcome to the padArchiver. +Select one pad from the side menu to visualize. + + + + +This is the wellcome message, from the 'templates/wellcome.md' file.