1
0
mirror of https://github.com/osmarks/mycorrhiza.git synced 2024-10-30 11:46:16 +00:00
mycorrhiza/web/readers.go

218 lines
7.0 KiB
Go
Raw Normal View History

package web
import (
"fmt"
"github.com/bouncepaw/mycomarkup/v5"
2022-05-31 10:29:13 +00:00
"github.com/bouncepaw/mycorrhiza/files"
2022-06-10 15:45:27 +00:00
"github.com/bouncepaw/mycorrhiza/mycoopts"
2022-03-29 20:59:36 +00:00
"github.com/bouncepaw/mycorrhiza/viewutil"
2021-09-23 09:36:54 +00:00
"io"
"log"
"net/http"
"os"
"path/filepath"
"strings"
"github.com/gorilla/mux"
2020-08-19 18:54:23 +00:00
"github.com/bouncepaw/mycorrhiza/history"
2021-02-17 18:41:35 +00:00
"github.com/bouncepaw/mycorrhiza/hyphae"
2021-09-06 17:46:34 +00:00
"github.com/bouncepaw/mycorrhiza/l18n"
"github.com/bouncepaw/mycorrhiza/mimetype"
2021-01-24 07:30:14 +00:00
"github.com/bouncepaw/mycorrhiza/user"
2020-08-31 17:52:26 +00:00
"github.com/bouncepaw/mycorrhiza/util"
"github.com/bouncepaw/mycorrhiza/views"
2021-05-25 07:11:16 +00:00
"github.com/bouncepaw/mycomarkup/v5/mycocontext"
"github.com/bouncepaw/mycomarkup/v5/tools"
)
func initReaders(r *mux.Router) {
r.PathPrefix("/page/").HandlerFunc(handlerHypha)
r.PathPrefix("/hypha/").HandlerFunc(handlerHypha)
r.PathPrefix("/text/").HandlerFunc(handlerText)
r.PathPrefix("/binary/").HandlerFunc(handlerBinary)
r.PathPrefix("/rev/").HandlerFunc(handlerRevision)
2021-09-23 09:36:54 +00:00
r.PathPrefix("/rev-text/").HandlerFunc(handlerRevisionText)
2022-02-26 07:33:09 +00:00
r.PathPrefix("/media/").HandlerFunc(handlerMedia)
2021-02-24 17:34:42 +00:00
}
2022-02-26 07:33:09 +00:00
func handlerMedia(w http.ResponseWriter, rq *http.Request) {
util.PrepareRq(rq)
2021-02-24 17:34:42 +00:00
var (
2022-02-26 07:33:09 +00:00
hyphaName = util.HyphaNameFromRq(rq, "media")
2021-02-24 17:34:42 +00:00
h = hyphae.ByName(hyphaName)
u = user.FromRequest(rq)
2021-09-06 17:46:34 +00:00
lc = l18n.FromRequest(rq)
2021-02-24 17:34:42 +00:00
)
util.HTTP200Page(w,
2022-03-20 21:24:40 +00:00
views.Base(
2022-04-01 19:51:15 +00:00
viewutil.MetaFrom(w, rq),
2022-02-26 07:33:09 +00:00
lc.Get("ui.media_title", &l18n.Replacements{"name": util.BeautifulName(hyphaName)}),
2022-04-01 19:51:15 +00:00
views.MediaMenu(rq, h, u)))
}
2021-09-23 09:36:54 +00:00
// handlerRevisionText sends Mycomarkup text of the hypha at the given revision. See also: handlerRevision, handlerText.
//
// /rev-text/<revHash>/<hyphaName>
func handlerRevisionText(w http.ResponseWriter, rq *http.Request) {
util.PrepareRq(rq)
var (
2022-02-19 08:26:38 +00:00
shorterURL = strings.TrimPrefix(rq.URL.Path, "/rev-text/")
firstSlashIndex = strings.IndexRune(shorterURL, '/')
revHash = shorterURL[:firstSlashIndex]
hyphaName = util.CanonicalName(shorterURL[firstSlashIndex+1:])
h = hyphae.ByName(hyphaName)
2021-09-23 09:36:54 +00:00
)
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
2022-02-19 08:26:38 +00:00
switch h := h.(type) {
case *hyphae.EmptyHypha:
var mycoFilePath = filepath.Join(files.HyphaeDir(), h.CanonicalName()+".myco")
var textContents, err = history.FileAtRevision(mycoFilePath, revHash)
if err != nil {
w.WriteHeader(http.StatusNotFound)
log.Printf("While serving text of %s at revision %s: %s\n", hyphaName, revHash, err.Error())
_, _ = io.WriteString(w, "Error: "+err.Error())
return
}
log.Printf("Serving text of %s from %s at revision %s\n", hyphaName, mycoFilePath, revHash)
w.WriteHeader(http.StatusOK)
_, _ = io.WriteString(w, textContents)
2022-02-19 08:26:38 +00:00
case hyphae.ExistingHypha:
if !h.HasTextFile() {
log.Printf(`Media hypha %s has no text`)
w.WriteHeader(http.StatusNotFound)
}
var textContents, err = history.FileAtRevision(h.TextFilePath(), revHash)
if err != nil {
w.WriteHeader(http.StatusNotFound)
log.Printf("While serving text of %s at revision %s: %s\n", hyphaName, revHash, err.Error())
_, _ = io.WriteString(w, "Error: "+err.Error())
return
}
log.Printf("Serving text of %s from %s at revision %s\n", hyphaName, h.TextFilePath(), revHash)
w.WriteHeader(http.StatusOK)
_, _ = io.WriteString(w, textContents)
2021-09-23 09:36:54 +00:00
}
}
// handlerRevision displays a specific revision of the text part the hypha
func handlerRevision(w http.ResponseWriter, rq *http.Request) {
util.PrepareRq(rq)
var (
2022-02-19 08:26:38 +00:00
lc = l18n.FromRequest(rq)
shorterURL = strings.TrimPrefix(rq.URL.Path, "/rev/")
firstSlashIndex = strings.IndexRune(shorterURL, '/')
revHash = shorterURL[:firstSlashIndex]
hyphaName = util.CanonicalName(shorterURL[firstSlashIndex+1:])
h = hyphae.ByName(hyphaName)
contents = fmt.Sprintf(`<p>%s</p>`, lc.Get("ui.revision_no_text"))
)
2022-05-31 10:29:13 +00:00
var (
textContents string
err error
2022-05-31 10:33:25 +00:00
mycoFilePath string
2022-05-31 10:29:13 +00:00
)
2022-02-19 08:26:38 +00:00
switch h := h.(type) {
2022-02-19 08:29:14 +00:00
case hyphae.ExistingHypha:
2022-05-31 10:33:25 +00:00
mycoFilePath = h.TextFilePath()
2022-05-31 10:29:13 +00:00
case *hyphae.EmptyHypha:
2022-05-31 10:33:25 +00:00
mycoFilePath = filepath.Join(files.HyphaeDir(), h.CanonicalName()+".myco")
}
2022-05-31 10:33:25 +00:00
textContents, err = history.FileAtRevision(mycoFilePath, revHash)
2022-05-31 10:29:13 +00:00
if err == nil {
2022-06-10 15:45:27 +00:00
ctx, _ := mycocontext.ContextFromStringInput(textContents, mycoopts.MarkupOptions(hyphaName))
2022-05-31 10:29:13 +00:00
contents = mycomarkup.BlocksToHTML(ctx, mycomarkup.BlockTree(ctx))
}
2022-03-20 21:24:40 +00:00
page := views.Revision(
viewutil.MetaFrom(w, rq),
h,
contents,
2020-08-31 17:52:26 +00:00
revHash,
)
w.Header().Set("Content-Type", "text/html;charset=utf-8")
w.WriteHeader(http.StatusOK)
2021-08-12 12:12:53 +00:00
_, _ = fmt.Fprint(
w,
2022-03-20 21:24:40 +00:00
views.Base(
2022-04-01 19:51:15 +00:00
viewutil.MetaFrom(w, rq),
2021-09-06 17:46:34 +00:00
lc.Get("ui.revision_title", &l18n.Replacements{"name": util.BeautifulName(hyphaName), "rev": revHash}),
2021-08-12 12:12:53 +00:00
page,
),
)
2020-08-19 18:54:23 +00:00
}
// handlerText serves raw source text of the hypha.
func handlerText(w http.ResponseWriter, rq *http.Request) {
util.PrepareRq(rq)
hyphaName := util.HyphaNameFromRq(rq, "text")
switch h := hyphae.ByName(hyphaName).(type) {
2022-02-19 08:26:38 +00:00
case *hyphae.TextualHypha:
log.Println("Serving", h.TextFilePath())
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
http.ServeFile(w, rq, h.TextFilePath())
}
}
// handlerBinary serves attachment of the hypha.
func handlerBinary(w http.ResponseWriter, rq *http.Request) {
util.PrepareRq(rq)
hyphaName := util.HyphaNameFromRq(rq, "binary")
switch h := hyphae.ByName(hyphaName).(type) {
case *hyphae.EmptyHypha:
2022-02-19 08:26:38 +00:00
case *hyphae.TextualHypha:
w.WriteHeader(http.StatusNotFound)
log.Printf("Textual hypha %s has no media, cannot serve\n", h.CanonicalName())
case *hyphae.MediaHypha:
log.Println("Serving", h.MediaFilePath())
w.Header().Set("Content-Type", mimetype.FromExtension(filepath.Ext(h.MediaFilePath())))
http.ServeFile(w, rq, h.MediaFilePath())
}
}
2021-01-30 18:29:56 +00:00
// handlerHypha is the main hypha action that displays the hypha and the binary upload form along with some navigation.
func handlerHypha(w http.ResponseWriter, rq *http.Request) {
util.PrepareRq(rq)
var (
hyphaName = util.HyphaNameFromRq(rq, "page", "hypha")
2021-02-17 18:41:35 +00:00
h = hyphae.ByName(hyphaName)
contents string
openGraph string
2021-09-06 17:46:34 +00:00
lc = l18n.FromRequest(rq)
)
switch h := h.(type) {
case *hyphae.EmptyHypha:
util.HTTP404Page(w,
2022-03-20 21:24:40 +00:00
views.Base(
2022-04-01 19:51:15 +00:00
viewutil.MetaFrom(w, rq),
util.BeautifulName(hyphaName),
2022-03-29 20:59:36 +00:00
views.Hypha(viewutil.MetaFrom(w, rq), h, contents),
openGraph))
2022-02-19 08:26:38 +00:00
case hyphae.ExistingHypha:
fileContentsT, errT := os.ReadFile(h.TextFilePath())
if errT == nil {
2022-06-10 15:45:27 +00:00
ctx, _ := mycocontext.ContextFromStringInput(string(fileContentsT), mycoopts.MarkupOptions(hyphaName))
getOpenGraph, descVisitor, imgVisitor := tools.OpenGraphVisitors(ctx)
ast := mycomarkup.BlockTree(ctx, descVisitor, imgVisitor)
2021-05-25 07:11:16 +00:00
contents = mycomarkup.BlocksToHTML(ctx, ast)
openGraph = getOpenGraph()
}
2022-02-19 08:26:38 +00:00
switch h := h.(type) {
case *hyphae.MediaHypha:
2022-06-10 15:45:27 +00:00
contents = mycoopts.Media(h, lc) + contents
}
util.HTTP200Page(w,
2022-03-20 21:24:40 +00:00
views.Base(
2022-04-01 19:51:15 +00:00
viewutil.MetaFrom(w, rq),
util.BeautifulName(hyphaName),
2022-03-29 20:59:36 +00:00
views.Hypha(viewutil.MetaFrom(w, rq), h, contents),
openGraph))
}
}