@ -0,0 +1,9 @@ |
|||||
|
package main |
||||
|
|
||||
|
import "github.com/fatih/color" |
||||
|
|
||||
|
func check(err error) { |
||||
|
if err != nil { |
||||
|
color.Red(err.Error()) |
||||
|
} |
||||
|
} |
@ -0,0 +1,20 @@ |
|||||
|
{ |
||||
|
"repoid": "repo01", |
||||
|
"pads": [ |
||||
|
{ |
||||
|
"link": "http://board.net/p/pad1", |
||||
|
"dir": "Group1", |
||||
|
"title": "Pad1" |
||||
|
}, |
||||
|
{ |
||||
|
"link": "http://board.net/p/pad2", |
||||
|
"dir": "Group1", |
||||
|
"title": "Pad2" |
||||
|
}, |
||||
|
{ |
||||
|
"link": "http://board.net/p/pad3", |
||||
|
"dir": "Group2", |
||||
|
"title": "Pad3" |
||||
|
} |
||||
|
] |
||||
|
} |
@ -0,0 +1,66 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"encoding/json" |
||||
|
"fmt" |
||||
|
"io/ioutil" |
||||
|
|
||||
|
padArchiver ".." |
||||
|
"github.com/fatih/color" |
||||
|
) |
||||
|
|
||||
|
type PadModel struct { |
||||
|
Link string `json:"link"` |
||||
|
Dir string `json:"dir"` |
||||
|
Title string `json:"title"` |
||||
|
} |
||||
|
type ListModel struct { |
||||
|
RepoID string `json:"repoid"` |
||||
|
Pads []PadModel `json:"pads"` |
||||
|
} |
||||
|
|
||||
|
func readList(path string) ListModel { |
||||
|
file, err := ioutil.ReadFile(path) |
||||
|
check(err) |
||||
|
content := string(file) |
||||
|
var list ListModel |
||||
|
json.Unmarshal([]byte(content), &list) |
||||
|
return list |
||||
|
} |
||||
|
|
||||
|
func main() { |
||||
|
asciiart := ` |
||||
|
. |
||||
|
. _ _ _ |
||||
|
. | | /\ | | (_) |
||||
|
_ __ __ _ __| | / \ _ __ ___| |__ ___ _____ _ __ |
||||
|
| '_ \ / _ |/ _ | / /\ \ | '__/ __| '_ \| \ \ / / _ \ '__| |
||||
|
| |_) | (_| | (_| |/ ____ \| | | (__| | | | |\ V / __/ | |
||||
|
| .__/ \__,_|\__,_/_/ \_\_| \___|_| |_|_| \_/ \___|_| - listPadsImporter |
||||
|
| | |
||||
|
|_| |
||||
|
|
||||
|
` |
||||
|
color.Blue(asciiart) |
||||
|
fmt.Println(" v0.0.1") |
||||
|
color.Blue("https://github.com/arnaucode/padArchiver") |
||||
|
fmt.Println("") |
||||
|
fmt.Println("") |
||||
|
fmt.Println("") |
||||
|
|
||||
|
list := readList("list.json") |
||||
|
|
||||
|
//open the repo
|
||||
|
repo := padArchiver.OpenRepo(list.RepoID) |
||||
|
fmt.Println("repo opened") |
||||
|
for _, pad := range list.Pads { |
||||
|
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) |
||||
|
check(err) |
||||
|
fmt.Println(" ipfs hash: " + ipfsHash) |
||||
|
} |
||||
|
color.Green("listPadsImporter finished") |
||||
|
} |
@ -0,0 +1,9 @@ |
|||||
|
package main |
||||
|
|
||||
|
import "github.com/fatih/color" |
||||
|
|
||||
|
func check(err error) { |
||||
|
if err != nil { |
||||
|
color.Red(err.Error()) |
||||
|
} |
||||
|
} |
@ -0,0 +1,23 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"io/ioutil" |
||||
|
|
||||
|
"github.com/fatih/color" |
||||
|
blackfriday "gopkg.in/russross/blackfriday.v2" |
||||
|
) |
||||
|
|
||||
|
func readFile(path string) string { |
||||
|
dat, err := ioutil.ReadFile(path) |
||||
|
if err != nil { |
||||
|
color.Red(path) |
||||
|
} |
||||
|
check(err) |
||||
|
return string(dat) |
||||
|
} |
||||
|
|
||||
|
func fileToHTML(path string) (string, error) { |
||||
|
mdcontent := readFile(path) |
||||
|
htmlcontent := string(blackfriday.Run([]byte(mdcontent))) |
||||
|
return htmlcontent, nil |
||||
|
} |
@ -0,0 +1,88 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"html/template" |
||||
|
"log" |
||||
|
"net/http" |
||||
|
"os" |
||||
|
"path/filepath" |
||||
|
"strings" |
||||
|
|
||||
|
padArchiver ".." |
||||
|
"github.com/gorilla/mux" |
||||
|
) |
||||
|
|
||||
|
type ItemModel struct { |
||||
|
Name string |
||||
|
Path string |
||||
|
IsDir bool |
||||
|
Content template.HTML |
||||
|
} |
||||
|
type MenuModel struct { |
||||
|
PageTitle string |
||||
|
Items []ItemModel |
||||
|
} |
||||
|
|
||||
|
func main() { |
||||
|
|
||||
|
router := mux.NewRouter() |
||||
|
router.HandleFunc("/", getDir).Methods("GET") |
||||
|
router.HandleFunc("/dir/{path}", getDir).Methods("GET") |
||||
|
router.HandleFunc("/page/{path}", getPage).Methods("GET") |
||||
|
|
||||
|
log.Println("padArchiver web server running") |
||||
|
log.Print("port: 8080") |
||||
|
log.Fatal(http.ListenAndServe(":8080", router)) |
||||
|
} |
||||
|
|
||||
|
func generateMenu(dirpath string) MenuModel { |
||||
|
var menuPage MenuModel |
||||
|
menuPage.PageTitle = "padArchiver - Menu" |
||||
|
_ = filepath.Walk(padArchiver.Storage+dirpath, func(path string, f os.FileInfo, err error) error { |
||||
|
if path != padArchiver.Storage { |
||||
|
path = strings.Replace(path, padArchiver.Storage, "", -1) |
||||
|
var item ItemModel |
||||
|
item.Name = path |
||||
|
path = strings.Replace(path, "/", "%", -1) |
||||
|
if f.IsDir() { |
||||
|
item.Path = "/dir/" + path |
||||
|
} else { |
||||
|
item.Path = "/page/" + path |
||||
|
} |
||||
|
item.IsDir = f.IsDir() |
||||
|
menuPage.Items = append(menuPage.Items, item) |
||||
|
} |
||||
|
return nil |
||||
|
}) |
||||
|
return menuPage |
||||
|
} |
||||
|
func getDir(w http.ResponseWriter, r *http.Request) { |
||||
|
vars := mux.Vars(r) |
||||
|
var dirpath string |
||||
|
if _, ok := vars["path"]; ok { |
||||
|
dirpath = vars["path"] |
||||
|
dirpath = strings.Replace(dirpath, "%", "/", -1) |
||||
|
} |
||||
|
|
||||
|
menuPage := generateMenu(dirpath) |
||||
|
|
||||
|
tmpl := template.Must(template.ParseFiles("templates/menuTemplate.html")) |
||||
|
tmpl.Execute(w, menuPage) |
||||
|
} |
||||
|
|
||||
|
func getPage(w http.ResponseWriter, r *http.Request) { |
||||
|
vars := mux.Vars(r) |
||||
|
path := vars["path"] |
||||
|
path = strings.Replace(path, "%", "/", -1) |
||||
|
path = padArchiver.Storage + path |
||||
|
|
||||
|
content, err := fileToHTML(path) |
||||
|
check(err) |
||||
|
|
||||
|
var item ItemModel |
||||
|
item.Name = path |
||||
|
item.Content = template.HTML(content) |
||||
|
|
||||
|
tmpl := template.Must(template.ParseFiles("templates/pageTemplate.html")) |
||||
|
tmpl.Execute(w, item) |
||||
|
} |
@ -0,0 +1,91 @@ |
|||||
|
<!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> |
||||
|
</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> |
@ -0,0 +1,74 @@ |
|||||
|
<!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> |
||||
|
</nav> |
||||
|
|
||||
|
<br><br> |
||||
|
<div class="container"> |
||||
|
<div class="row"> |
||||
|
<div class="col-sm-2"></div> |
||||
|
<div class="col-sm-10"> |
||||
|
<h3>{{.Name}}</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> |
||||
|
</body> |
||||
|
|
||||
|
</html> |