83 lines
1.7 KiB
Go
83 lines
1.7 KiB
Go
/*
|
|
Copyright © 2023 Seednode <seednode@seedno.de>
|
|
*/
|
|
|
|
package types
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
"unicode/utf8"
|
|
)
|
|
|
|
type Text struct{}
|
|
|
|
func (t Text) Css() string {
|
|
var css strings.Builder
|
|
|
|
css.WriteString(`html,body{margin:0;padding:0;height:100%;}`)
|
|
css.WriteString(`a{color:inherit;display:block;height:100%;width:100%;text-decoration:none;overflow:hidden;}`)
|
|
css.WriteString(`textarea{border:none;caret-color:transparent;outline:none;margin:.5rem;`)
|
|
css.WriteString(`height:99%;width:99%;white-space:pre;overflow:auto;}`)
|
|
|
|
return css.String()
|
|
}
|
|
|
|
func (t Text) Title(queryParams, fileUri, filePath, fileName, mime string) string {
|
|
return fmt.Sprintf(`<title>%s</title>`, fileName)
|
|
}
|
|
|
|
func (t Text) Body(queryParams, fileUri, filePath, fileName, mime string) string {
|
|
body, err := os.ReadFile(filePath)
|
|
if err != nil {
|
|
body = []byte{}
|
|
}
|
|
|
|
return fmt.Sprintf(`<a href="/%s"><textarea autofocus readonly>%s</textarea></a>`,
|
|
queryParams,
|
|
body)
|
|
}
|
|
|
|
func (t Text) Extensions() map[string]string {
|
|
return map[string]string{
|
|
`.css`: `text/css`,
|
|
`.csv`: `text/csv`,
|
|
`.html`: `text/html`,
|
|
`.js`: `text/javascript`,
|
|
`.json`: `application/json`,
|
|
`.md`: `text/markdown`,
|
|
`.txt`: `text/plain`,
|
|
`.xml`: `application/xml`,
|
|
}
|
|
}
|
|
|
|
func (t Text) MimeTypes() []string {
|
|
return []string{
|
|
`application/json`,
|
|
`application/xml`,
|
|
`text/css`,
|
|
`text/csv`,
|
|
`text/javascript`,
|
|
`text/plain`,
|
|
`text/plain; charset=utf-8`,
|
|
}
|
|
}
|
|
|
|
func (t Text) Validate(filePath string) bool {
|
|
file, err := os.Open(filePath)
|
|
switch {
|
|
case errors.Is(err, os.ErrNotExist):
|
|
return false
|
|
case err != nil:
|
|
return false
|
|
}
|
|
defer file.Close()
|
|
|
|
head := make([]byte, 512)
|
|
file.Read(head)
|
|
|
|
return utf8.Valid(head)
|
|
}
|