mirror of
https://github.com/arnaucube/padArchiver.git
synced 2026-02-07 11:46:53 +01:00
implemented webServer, and implemented listPadsImporter
This commit is contained in:
9
webServer/error.go
Normal file
9
webServer/error.go
Normal file
@@ -0,0 +1,9 @@
|
||||
package main
|
||||
|
||||
import "github.com/fatih/color"
|
||||
|
||||
func check(err error) {
|
||||
if err != nil {
|
||||
color.Red(err.Error())
|
||||
}
|
||||
}
|
||||
23
webServer/files.go
Normal file
23
webServer/files.go
Normal file
@@ -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
|
||||
}
|
||||
88
webServer/main.go
Normal file
88
webServer/main.go
Normal file
@@ -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)
|
||||
}
|
||||
91
webServer/templates/menuTemplate.html
Normal file
91
webServer/templates/menuTemplate.html
Normal file
@@ -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>
|
||||
74
webServer/templates/pageTemplate.html
Normal file
74
webServer/templates/pageTemplate.html
Normal file
@@ -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>
|
||||
BIN
webServer/webServer
Executable file
BIN
webServer/webServer
Executable file
Binary file not shown.
Reference in New Issue
Block a user