138 lines
3.9 KiB
Go
138 lines
3.9 KiB
Go
package main
|
|
|
|
import (
|
|
"compress/gzip"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"log"
|
|
"net/http"
|
|
"net/url"
|
|
"os"
|
|
"path"
|
|
"regexp"
|
|
"strings"
|
|
|
|
"github.com/gorilla/mux"
|
|
"github.com/jbowtie/gokogiri/xml"
|
|
"github.com/jbowtie/ratago/xslt"
|
|
)
|
|
|
|
type TOCNode struct {
|
|
Name string `json:"name"`
|
|
File string `json:"file,omitempty"`
|
|
Key string `json:"id"`
|
|
Children []TOCNode `json:"children,omitempty"`
|
|
}
|
|
|
|
type CarInfo struct {
|
|
SoftLink url.Values `json:"softlink"`
|
|
ToC []TOCNode `json:"toc"`
|
|
Values map[string]url.Values `json:"tocpath"`
|
|
}
|
|
|
|
var indexList CarInfo
|
|
|
|
func main() {
|
|
r := mux.NewRouter()
|
|
r.PathPrefix("/static/").Handler(http.StripPrefix("/static", http.FileServer(http.Dir("html/static"))))
|
|
r.HandleFunc("/cars", HomeHandler)
|
|
r.HandleFunc("/{car}", CarHandler)
|
|
r.HandleFunc("/file/{page}", PageHandler)
|
|
r.HandleFunc("/img/{file}", ImgHandler)
|
|
r.PathPrefix("/").Handler(http.FileServer(http.Dir("html")))
|
|
err := http.ListenAndServe(":8080", r)
|
|
if err != nil {
|
|
log.Fatal("ListenAndServe: ", err)
|
|
}
|
|
}
|
|
|
|
func HomeHandler(w http.ResponseWriter, r *http.Request) {
|
|
body, _ := ioutil.ReadFile("Manuals/vehicles.json")
|
|
w.Header().Set("Content-Type", "application/json")
|
|
w.Write(body)
|
|
|
|
}
|
|
|
|
func CarHandler(w http.ResponseWriter, r *http.Request) {
|
|
vars := mux.Vars(r)
|
|
folder := vars["car"]
|
|
indexList = CarInfo{}
|
|
file, err := os.Open(path.Join("Manuals", folder+".toc"))
|
|
if err != nil {
|
|
w.Header().Set("Content-Type", "application/json")
|
|
empty := []TOCNode{TOCNode{Name: "Not Available", Key: "1"}}
|
|
json.NewEncoder(w).Encode(empty)
|
|
return
|
|
}
|
|
json.NewDecoder(file).Decode(&indexList)
|
|
w.Header().Set("Content-Encoding", "gzip")
|
|
w.Header().Set("Content-Type", "application/json")
|
|
writer := gzip.NewWriter(w)
|
|
json.NewEncoder(writer).Encode(indexList.ToC)
|
|
writer.Close()
|
|
|
|
}
|
|
|
|
func PageHandler(w http.ResponseWriter, r *http.Request) {
|
|
vars := mux.Vars(r)
|
|
img := vars["page"]
|
|
style, _ := xml.ReadFile(path.Join("Manuals", "techauth.xsl"), xml.StrictParseOption)
|
|
stylesheet, _ := xslt.ParseStylesheet(style, path.Join("Manuals", "techauth.xsl"))
|
|
|
|
input, err := xml.ReadFile(path.Join("Manuals", "files", img), xml.StrictParseOption)
|
|
if err != nil {
|
|
http.NotFound(w, r)
|
|
return
|
|
}
|
|
params := make(map[string]interface{})
|
|
params["TOCPath"] = indexList.Values[img]["TOCPath"][0]
|
|
params["modelyear"] = indexList.Values[img]["year"][0]
|
|
params["modelname"] = indexList.Values[img]["platform"][0]
|
|
params["ENG"] = indexList.Values[img]["ENG"][0]
|
|
params["locale"] = indexList.Values[img]["lang"][0]
|
|
params["vid"] = indexList.Values[img]["VID"][0]
|
|
params["contentPath"] = "img/"
|
|
output, err := stylesheet.Process(input, xslt.StylesheetOptions{false, params})
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
if strings.Contains(output, "REPLACEME") {
|
|
reg := regexp.MustCompile(`REPLACEME="(\d+?)"`)
|
|
matches := reg.FindAllStringSubmatch(output, -1)
|
|
for _, item := range matches {
|
|
location := indexList.SoftLink[item[1]]
|
|
if len(location) > 1 {
|
|
string2 := FindToc(indexList.ToC, location[0])
|
|
place, _ := json.Marshal(string2)
|
|
output = strings.Replace(output, item[0], fmt.Sprintf(`v-on:click="app.switchToc('%s')"`, strings.Replace(string(place), `"`, `"`, -1)), -1)
|
|
} else {
|
|
output = strings.Replace(output, item[0], fmt.Sprintf(`v-on:click="app.index('%s')"`, location[0]), -1)
|
|
}
|
|
}
|
|
}
|
|
w.Write([]byte(output))
|
|
}
|
|
|
|
func ImgHandler(w http.ResponseWriter, r *http.Request) {
|
|
vars := mux.Vars(r)
|
|
img := vars["file"]
|
|
img = strings.Replace(img, ".tif", ".jpg", -1)
|
|
http.ServeFile(w, r, path.Join("Manuals", "files", "img", img))
|
|
}
|
|
|
|
func FindToc(toc []TOCNode, file string) []string {
|
|
var list []string
|
|
for _, item := range toc {
|
|
if item.File == file {
|
|
list = append([]string{item.Key}, list...)
|
|
}
|
|
list2 := FindToc(item.Children, file)
|
|
if len(list2) > 0 {
|
|
list = append([]string{item.Key}, list2...)
|
|
}
|
|
|
|
}
|
|
return list
|
|
}
|