package main import ( "errors" "fmt" "io/ioutil" "log" "os" "path/filepath" "strings" "github.com/bouncepaw/mycorrhiza/gemtext" "github.com/bouncepaw/mycorrhiza/history" ) func init() { gemtext.HyphaExists = func(hyphaName string) bool { _, hyphaExists := HyphaStorage[hyphaName] return hyphaExists } gemtext.HyphaAccess = func(hyphaName string) (rawText, binaryBlock string, err error) { if hyphaData, ok := HyphaStorage[hyphaName]; ok { rawText, err = FetchTextPart(hyphaData) if hyphaData.binaryPath != "" { binaryBlock = binaryHtmlBlock(hyphaName, hyphaData) } } else { err = errors.New("Hypha " + hyphaName + " does not exist") } return } } // HyphaData represents a hypha's meta information: binary and text parts rooted paths and content types. type HyphaData struct { textPath string textType TextType binaryPath string binaryType BinaryType } // DeleteHypha deletes hypha and makes a history record about that. func (hd *HyphaData) DeleteHypha(hyphaName string) *history.HistoryOp { hop := history.Operation(history.TypeDeleteHypha). WithFilesRemoved(hd.textPath, hd.binaryPath). WithMsg(fmt.Sprintf("Delete ‘%s’", hyphaName)). WithSignature("anon"). Apply() if len(hop.Errs) == 0 { delete(HyphaStorage, hyphaName) } return hop } // RenameHypha renames hypha from old name `hyphaName` to `newName` and makes a history record about that. func (hd *HyphaData) RenameHypha(hyphaName, newName string) *history.HistoryOp { var ( newTextPath = strings.Replace(hd.textPath, hyphaName, newName, 1) newBinaryPath = strings.Replace(hd.binaryPath, hyphaName, newName, 1) hop = history.Operation(history.TypeRenameHypha). WithFilesRenamed(map[string]string{ hd.textPath: newTextPath, hd.binaryPath: newBinaryPath, }). WithMsg(fmt.Sprintf("Rename ‘%s’ to ‘%s’", hyphaName, newName)). WithSignature("anon"). Apply() ) if len(hop.Errs) == 0 { hd.textPath = newTextPath hd.binaryPath = newBinaryPath HyphaStorage[newName] = hd delete(HyphaStorage, hyphaName) } return hop } // binaryHtmlBlock creates an html block for binary part of the hypha. func binaryHtmlBlock(hyphaName string, d *HyphaData) string { switch d.binaryType { case BinaryJpeg, BinaryGif, BinaryPng, BinaryWebp, BinarySvg, BinaryIco: return fmt.Sprintf(`
This hypha's media cannot be rendered. Access it directly