From 1537da9b16dfda1ecb2730b5d1de3b9005397618 Mon Sep 17 00:00:00 2001 From: lost+skunk Date: Tue, 13 Aug 2024 15:59:52 +0300 Subject: темплейты в бинарнике и улучшенная система кеша MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/css/skunky.css | 204 ++++++++++++++++++++++++++++++++++++++++++++ static/html/about.htm | 49 +++++++++++ static/html/daily.htm | 13 +++ static/html/deviantion.htm | 44 ++++++++++ static/html/gruser.htm | 81 ++++++++++++++++++ static/html/head.htm | 24 ++++++ static/html/header.htm | 14 +++ static/html/index.htm | 22 +++++ static/html/search.htm | 16 ++++ static/images/logo.png | Bin 0 -> 408075 bytes static/templates-noembed.go | 148 ++++++++++++++++++++++++++++++++ static/templates.go | 16 ++++ 12 files changed, 631 insertions(+) create mode 100644 static/css/skunky.css create mode 100644 static/html/about.htm create mode 100644 static/html/daily.htm create mode 100644 static/html/deviantion.htm create mode 100644 static/html/gruser.htm create mode 100644 static/html/head.htm create mode 100644 static/html/header.htm create mode 100644 static/html/index.htm create mode 100644 static/html/search.htm create mode 100644 static/images/logo.png create mode 100644 static/templates-noembed.go create mode 100644 static/templates.go (limited to 'static') diff --git a/static/css/skunky.css b/static/css/skunky.css new file mode 100644 index 0000000..bdc894c --- /dev/null +++ b/static/css/skunky.css @@ -0,0 +1,204 @@ +/* TAGS */ +html { + font-family: Ubuntu; + background-color:black; + color: rgb(234, 216, 216); +} +a { + text-decoration: none; + color: cadetblue; +} +a:hover { + color: #d0ff00; + transition: 400ms; +} +header h1 { + padding-right: 0.2%; + padding-left: 0.2%; +} +header form { + align-self: center; +} +header { + display: flex; +} +form { + font-size: 0; + border: solid #164e3e 1px; + max-width: fit-content; +} +form input, button, select { + background-color: #134134; + padding: 5px; + color: whitesmoke; + border: 0; +} +input:focus { + outline: none; +} + +/* BLOCKS */ +.content { + align-items: center; + border-radius: 3px; + display: flex; + flex-wrap: wrap; + justify-content: center; +} +.block { + max-width: 20%; + height: 0%; + padding: 4px; + border-radius: 2px; + border: 3px solid #091f19; + word-break: break-all; + background-color: #091f19; + margin-left: 5px; + margin-top: 5px; + text-align: center; +} +.block:hover { + border: 3px solid #4d27d6; + transition: 400ms; +} +.block img, .plates .user-plate img { + width: 100%; +} +.block p { + word-break: break-all; +} + +/* MESSAGES */ +.msg { + background-color: #091f19; + color: whitesmoke; + width: fit-content; + max-width: 90%; + padding: 4px; + border-radius: 2px; + margin-top: 6px; + text-wrap: pretty; + transition: 350ms; +} +.msg:hover { + background-color: #134134; +} +.reply { + border-radius: 0px 2px 2px 0px; + border-left: #258268 solid; + margin-left: 40px; +} + +/* FOLDER & PLATES */ +.folders, .plates { + display: flex; + flex-wrap: wrap; +} +.folder-item { + background-color: #060820; + border: 3px solid #060820; + width: 10% +} +.admins .user-plate { + width: 5%; + background-color: #011522; +} +.plates .user-plate { + margin-left: 1%; + margin-bottom: 1%; + background-color: #091f19; + padding: 3px; + word-break: break-all; + text-align: center; + max-width: 15%; +} + +/* USER/GROUP BACKGROUNDS */ +.ubg { + display: flex; + flex-wrap: wrap; + justify-content: center; +} +.ubg img { + width: 20%; +} + +/* COLORS */ +.nsfw, .about-false { + color: red; +} +.about-true { + color: green; +} +.author { + color: seagreen; +} +.dd { + color: rgb(160, 0, 147); +} + +/* SCREEN OPTIMISATIONS */ +@media (orientation: portrait) { + * { + font-size: 120% + } + + ul { + font-size: 80% + } + + center form { + font-size: 60% + } + + header form { + font-size: 60%; + max-width: unset; + border: 0; + } + header, center { + text-align: center; + display: block; + clear: both; + font-size: 200%; + } + + .content { + margin: auto; + display: inherit; + scale: 100%; + } + .block { + margin-top: 10%; + max-width: 200%; + } + .folder-item { + width: 25% + } + .folders { + display: flexbox; + justify-content: center + } + figure img { + width: 10% + } + figure a img { + width: 100% + } + .msg { + font-size: 60%; + max-width: 80% + } +} + +@media (max-width: 1462px) and (orientation: landscape) { + .block { + max-width: 30%; + } +} + +@media (min-width: 788px) and (max-width: 884px) { + .block { + max-width: 35%; + } +} \ No newline at end of file diff --git a/static/html/about.htm b/static/html/about.htm new file mode 100644 index 0000000..d2278d6 --- /dev/null +++ b/static/html/about.htm @@ -0,0 +1,49 @@ + + + {{template "head" .}} +
+ {{template "header" .}} +

+ SkunkyArt is an alternative frontend for deviantart.com, written in Go. +

+

Room in Matrix

+ Instance settings: + +
+ Instances: +
    + {{range .Templates.About.Instances}} +
  • {{.Title}}: +
      +
    • Country: {{.Country}}
    • +
    • URLs:
    • +
        + {{if ne .Urls.I2P ""}} +
      • I2P: Yes
      • + {{end}} + {{if ne .Urls.Ygg ""}} +
      • Ygg: Yes
      • + {{end}} + {{if ne .Urls.Tor ""}} +
      • Tor: Yes
      • + {{end}} + {{if ne .Urls.Clearnet ""}} +
      • Clearnet: {{.Urls.Clearnet}}
      • + {{end}} +
      +
    • Settings:
    • +
        +
      • NSFW: {{if .Settings.Nsfw}}YES{{else}}NO{{end}}
      • +
      • Proxyfing: {{if .Settings.Proxy}}YES{{else}}NO{{end}}
      • +
      +
    +
  • + {{end}} +
+
+

Copyright lost+skunk, X11. SkunkyArt v1.3.1

+
+ \ No newline at end of file diff --git a/static/html/daily.htm b/static/html/daily.htm new file mode 100644 index 0000000..b3b6044 --- /dev/null +++ b/static/html/daily.htm @@ -0,0 +1,13 @@ + + + {{template "head" . }} +
+ {{template "header" . }} + {{if ne .Templates.DDStrips ""}} +

# Strips

+ {{.Templates.DDStrips}} + {{end}} +

# Content

+ {{.Templates.SomeList}} +
+ \ No newline at end of file diff --git a/static/html/deviantion.htm b/static/html/deviantion.htm new file mode 100644 index 0000000..f357dd7 --- /dev/null +++ b/static/html/deviantion.htm @@ -0,0 +1,44 @@ + + + {{template "head" . }} +
+ {{template "header" . }} +
+ + {{.Templates.Deviation.Post.Deviation.Author.Username}} — {{if (.Templates.Deviation.Post.Deviation.DD)}} + {{.Templates.Deviation.Post.Deviation.Title}} + {{else}}{{.Templates.Deviation.Post.Deviation.Title}}{{end}} + {{if (ne .Templates.Deviation.Post.Deviation.License "none")}}{{.Templates.Deviation.Post.Deviation.License}}{{end}} {{if (.Templates.Deviation.Post.Deviation.AI)}}[🤖]{{end}} + {{if (.Templates.Deviation.Post.Deviation.NSFW)}}[NSFW]{{end}} + +
+ {{if (ne .Templates.Deviation.Post.IMG "")}} + +
+ {{end}} + {{if (ne .Templates.Deviation.Tags "")}} + {{.Templates.Deviation.Tags}}
+ {{end}} + Published: {{.Templates.Deviation.StringTime}}; Views: {{.Templates.Deviation.Post.Deviation.Stats.Views}}; Favourites: {{.Templates.Deviation.Post.Deviation.Stats.Favourites}}; Downloads: {{.Templates.Deviation.Post.Deviation.Stats.Downloads}} +
Redirect to original +
+ {{if (ne .Templates.Deviation.Post.Description "")}} +
+
+ Description + {{.Templates.Deviation.Post.Description}} +
+
+ {{end}} + {{if ne .Templates.Deviation.Related ""}} +
+ Related content + {{.Templates.Deviation.Related}} +
+ {{end}} + {{if (ne .Templates.Deviation.Comments "")}} + {{.Templates.Deviation.Comments}} + {{end}} +
+
+ \ No newline at end of file diff --git a/static/html/gruser.htm b/static/html/gruser.htm new file mode 100644 index 0000000..c8227ef --- /dev/null +++ b/static/html/gruser.htm @@ -0,0 +1,81 @@ + + + {{template "head" . }} +
+
+

HOME | DD + | Gallery{{else}}about">About{{end}} + | RSS

+
+ + + + +

| {{.Templates.GroupUser.GR.Owner.Username}}

+
+ {{if eq .Type 'a'}} + {{if ne .Templates.GroupUser.About.BG ""}} + + {{end}} + + {{.Templates.GroupUser.GR.Owner.Username}} + {{if (eq .Templates.GroupUser.About.A.Gender "male")}} + ♂️ + {{end}} + {{if (eq .Templates.GroupUser.About.A.Gender "female")}} + ♀️ + {{end}} + [{{.Templates.GroupUser.GR.Gruser.ID}}] + [{{.Templates.GroupUser.CreationDate}}] + {{if ne .Templates.GroupUser.GR.Extra.Tag ""}} + "{{.Templates.GroupUser.GR.Extra.Tag}}"{{end}} {{if ne .Templates.GroupUser.About.A.Country ""}} + ({{.Templates.GroupUser.About.A.Country}}) + {{end}} + + {{if .Templates.GroupUser.Group}} +

# Statistics

+

Watchers: {{.Templates.GroupUser.GR.Extra.Stats.Watchers}}; Pageviews: {{.Templates.GroupUser.GR.Extra.Stats.Pageviews}} + {{else}} +

# Statistics

+

Favourites: {{.Templates.GroupUser.GR.Extra.Stats.Favourites}}; Deviations: {{.Templates.GroupUser.GR.Extra.Stats.Deviations}}; Watchers: {{.Templates.GroupUser.GR.Extra.Stats.Watchers}} +

Watching: {{.Templates.GroupUser.GR.Extra.Stats.Watching}}; Pageviews: {{.Templates.GroupUser.GR.Extra.Stats.Pageviews}}; Comments Made: {{.Templates.GroupUser.GR.Extra.Stats.CommentsMade}}; Friends: {{.Templates.GroupUser.GR.Extra.Stats.Friends}}

+ {{end}} + + {{if ne .Templates.GroupUser.Admins ""}} +

# Group admins

+
+ {{.Templates.GroupUser.Admins}} +
+ {{end}} + + {{if ne .Templates.GroupUser.About.Interests ""}} +

# Interests

+ {{.Templates.GroupUser.About.Interests}} + {{end}} + + {{if ne .Templates.GroupUser.About.Social ""}} +

# Social Links

+ {{.Templates.GroupUser.About.Social}} + {{end}} + + {{if ne .Templates.GroupUser.About.DescriptionFormatted ""}} +

# About me

+ {{.Templates.GroupUser.About.DescriptionFormatted}} + {{end}} + {{if ne .Templates.GroupUser.About.Comments ""}} +
+

# Comments

+ {{.Templates.GroupUser.About.Comments}} + {{end}} + {{else}} + {{.Templates.GroupUser.Gallery.Folders}} + {{.Templates.GroupUser.Gallery.List}} + {{end}} +
+ diff --git a/static/html/head.htm b/static/html/head.htm new file mode 100644 index 0000000..f7f6b91 --- /dev/null +++ b/static/html/head.htm @@ -0,0 +1,24 @@ +{{define "head"}} + + SkunkyArt | + {{if eq .Endpoint "search"}} + "{{.QueryRaw}}" + {{else if eq .Endpoint "post"}} + {{.Templates.Deviation.Post.Deviation.Author.Username}} — {{.Templates.Deviation.Post.Deviation.Title}} + {{else if eq .Type 'a'}} + {{if .Templates.GroupUser.GR.Owner.Username}} + {{.Templates.GroupUser.GR.Owner.Username}} + {{else}} + gallery of {{.Templates.GroupUser.GR.Owner.Username}} + {{end}} + {{else}} + {{.Endpoint}} + {{end}} + + + + + + + +{{end}} \ No newline at end of file diff --git a/static/html/header.htm b/static/html/header.htm new file mode 100644 index 0000000..f8537a3 --- /dev/null +++ b/static/html/header.htm @@ -0,0 +1,14 @@ +{{define "header"}} +
+

HOME | DD {{if eq .Endpoint "dd"}}| RSS{{end}}

+
+ + + +
+
+{{end}} \ No newline at end of file diff --git a/static/html/index.htm b/static/html/index.htm new file mode 100644 index 0000000..78f1d8a --- /dev/null +++ b/static/html/index.htm @@ -0,0 +1,22 @@ + + + + SkunkyArt + + + +
+
+
+ + + +
+

Daily Deviations | About | Source Code

+
+
+ \ No newline at end of file diff --git a/static/html/search.htm b/static/html/search.htm new file mode 100644 index 0000000..74bbd38 --- /dev/null +++ b/static/html/search.htm @@ -0,0 +1,16 @@ + + + {{template "head" . }} +
+ {{template "header" . }} + + {{if ne .Templates.Search.List ""}} + {{if ne .Templates.Search.Content.Total 0}} +

Results by request '{{.QueryRaw}}': {{.Templates.Search.Content.Total}}

+ {{end}} + {{.Templates.Search.List}} + {{else}} +

No results :(

+ {{end}} +
+ \ No newline at end of file diff --git a/static/images/logo.png b/static/images/logo.png new file mode 100644 index 0000000..e895de7 Binary files /dev/null and b/static/images/logo.png differ diff --git a/static/templates-noembed.go b/static/templates-noembed.go new file mode 100644 index 0000000..7a3c541 --- /dev/null +++ b/static/templates-noembed.go @@ -0,0 +1,148 @@ +//go:build !embed +// +build !embed + +package static + +import ( + "bytes" + "io/fs" + "os" + "strings" + "time" +) + +var Templates FS + +type file struct { + path string + name string + content []byte +} + +var templateNames = []string{} +var templates = make(map[string][]file) +var StaticPath string + +func CopyTemplatesToMemory() { + baseDir, err := os.ReadDir(StaticPath) + try(err) + + for _, c := range baseDir { + if c.IsDir() { + templateNames = append(templateNames, c.Name()) + + var filePath strings.Builder + filePath.WriteString(StaticPath) + filePath.WriteString("/") + filePath.WriteString(c.Name()) + + dir, err := os.ReadDir(filePath.String()) + try(err) + + filePath.WriteString("/") + for _, cd := range dir { + f, err := os.ReadFile(filePath.String() + cd.Name()) + try(err) + templates[c.Name()] = append(templates[c.Name()], file{ + content: f, + name: cd.Name(), + path: c.Name() + "/" + cd.Name(), + }) + } + } + } +} + +type FS struct{} + +func (FS) Open(name string) (fs.File, error) { + for i, l := 0, len(templateNames); i < l; i++ { + for _, x := range templates[templateNames[i]] { + if x.content != nil && name == x.path { + return &File{ + name: x.path, + content: bytes.NewBuffer(x.content), + }, nil + } + } + } + return nil, &fs.PathError{} +} + +func (FS) Glob(pattern string) ([]string, error) { + trimmed := strings.Split(pattern, "/") + var matches = []string{} + for x, s := range templates { + for i, l := 0, len(s); i < l && trimmed[0] == x; i++ { + s := s[i] + matches = append(matches, s.path) + } + } + if len(matches) != 0 { + return matches, nil + } + return nil, &fs.PathError{} +} + +func try(err error) { + if err != nil { + println(err.Error()) + os.Exit(1) + } +} + +/* сделано на основе https://github.com/psanford/memfs; требуется для корректной работы templates.ParseFS */ +type fileInfo struct { + name string +} + +func (fi fileInfo) Name() string { + return fi.name +} + +func (fi fileInfo) Size() int64 { + return 4096 +} + +func (fileInfo) Mode() fs.FileMode { + return 0 +} + +func (fileInfo) ModTime() time.Time { + return time.Time{} +} + +func (fileInfo) IsDir() bool { + return false +} + +func (fileInfo) Sys() interface{} { + return nil +} + +type File struct { + name string + content *bytes.Buffer + closed bool +} + +func (f *File) Stat() (fs.FileInfo, error) { + return fileInfo{ + name: f.name, + }, nil +} + +func (f *File) Read(b []byte) (int, error) { + if f.closed { + return 0, fs.ErrClosed + } + return f.content.Read(b) +} + +func (f *File) Close() error { + if f.closed { + return fs.ErrClosed + } + f.closed = true + return nil +} diff --git a/static/templates.go b/static/templates.go new file mode 100644 index 0000000..28a057a --- /dev/null +++ b/static/templates.go @@ -0,0 +1,16 @@ +//go:build embed +// +build embed + +package static + +import "embed" + +//go:embed * +var Templates embed.FS +var Enabled bool = true + +var StaticPath string + +func CopyTemplatesToMemory() { + _ = StaticPath +} -- cgit v1.2.3