aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Dockerfile4
-rw-r--r--cmd/app/importer/importer.go47
-rw-r--r--cmd/shorg/main.go (renamed from cmd/app/main.go)17
-rw-r--r--cmd/shorg/migrator/migrator.go (renamed from cmd/bun/main.go)90
-rw-r--r--cmd/shorg/serve/serve.go (renamed from cmd/app/serve/serve.go)8
-rw-r--r--migrations/20241005143542_1_init.go (renamed from cmd/bun/migrations/20241005143542_1_init.go)0
-rw-r--r--migrations/main.go (renamed from cmd/bun/migrations/main.go)0
-rw-r--r--pkg/handler/admin.go18
-rw-r--r--pkg/tpl/add.templ21
-rw-r--r--pkg/tpl/add_templ.go19
-rw-r--r--pkg/tpl/quote.templ17
-rw-r--r--pkg/tpl/quote_templ.go55
-rw-r--r--static/css/style.css18
13 files changed, 157 insertions, 157 deletions
diff --git a/Dockerfile b/Dockerfile
index 977c118..fda1d32 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -6,7 +6,7 @@ RUN apk update --no-cache && apk add --no-cache tzdata
COPY go.mod go.sum ./
RUN go mod download && go mod verify
COPY . .
-RUN go build -o shorg ./cmd/app
+RUN go build -o shorg ./cmd/shorg
# Runtime container
FROM alpine:3.20
@@ -20,4 +20,4 @@ ENV TZ=Europe/Moscow
EXPOSE 8000
-CMD ["/app/shorg"] \ No newline at end of file
+ENTRYPOINT ["/app/shorg"] \ No newline at end of file
diff --git a/cmd/app/importer/importer.go b/cmd/app/importer/importer.go
deleted file mode 100644
index 0cc9bb7..0000000
--- a/cmd/app/importer/importer.go
+++ /dev/null
@@ -1,47 +0,0 @@
-package importer
-
-import (
- "encoding/json"
- "os"
-
- "github.com/urfave/cli/v2"
- "sh.org.ru/pkg/config"
- "sh.org.ru/pkg/db"
- "sh.org.ru/pkg/model"
-)
-
-func Run(c *cli.Context) error {
- configFile := c.String("config")
- cfg, err := config.New(configFile)
- if err != nil {
- return err
- }
- db := db.New(cfg.DB)
-
- file := c.Args().First()
-
- quotes := []string{}
-
- fp, err := os.Open(file)
- if err != nil {
- return err
- }
- defer fp.Close()
-
- if err := json.NewDecoder(fp).Decode(&quotes); err != nil {
- return err
- }
-
- for _, text := range quotes {
- q := &model.Quote{
- Quote: text,
- Approved: true,
- Archive: true,
- }
- if _, err := db.NewInsert().Model(q).Exec(c.Context); err != nil {
- return err
- }
- }
-
- return nil
-}
diff --git a/cmd/app/main.go b/cmd/shorg/main.go
index dcd3eb0..df36817 100644
--- a/cmd/app/main.go
+++ b/cmd/shorg/main.go
@@ -5,8 +5,9 @@ import (
"os"
"github.com/urfave/cli/v2"
- "sh.org.ru/cmd/app/importer"
- "sh.org.ru/cmd/app/serve"
+
+ "sh.org.ru/cmd/shorg/migrator"
+ "sh.org.ru/cmd/shorg/serve"
)
func main() {
@@ -24,17 +25,7 @@ func main() {
},
},
},
- {
- Name: "import",
- Action: importer.Run,
- Flags: []cli.Flag{
- &cli.StringFlag{
- Name: "config",
- Value: "./config/dev.yaml",
- Usage: "config",
- },
- },
- },
+ migrator.Migrator(),
},
}
if err := app.Run(os.Args); err != nil {
diff --git a/cmd/bun/main.go b/cmd/shorg/migrator/migrator.go
index 62c9441..01dd819 100644
--- a/cmd/bun/main.go
+++ b/cmd/shorg/migrator/migrator.go
@@ -1,32 +1,21 @@
-package main
+package migrator
import (
+ "encoding/json"
"fmt"
"log"
"os"
"strings"
"github.com/uptrace/bun/migrate"
- "sh.org.ru/cmd/bun/migrations"
+ "github.com/urfave/cli/v2"
+ "sh.org.ru/migrations"
"sh.org.ru/pkg/config"
"sh.org.ru/pkg/db"
-
- "github.com/urfave/cli/v2"
+ "sh.org.ru/pkg/model"
)
-func main() {
- app := &cli.App{
- Name: "bun",
- Commands: []*cli.Command{
- newDBCommand(migrations.Migrations),
- },
- }
- if err := app.Run(os.Args); err != nil {
- log.Fatal(err)
- }
-}
-
-func newDBCommand(migrations *migrate.Migrations) *cli.Command {
+func Migrator() *cli.Command {
return &cli.Command{
Name: "db",
Usage: "manage database migrations",
@@ -37,12 +26,12 @@ func newDBCommand(migrations *migrate.Migrations) *cli.Command {
Flags: []cli.Flag{
&cli.StringFlag{
Name: "config",
- Value: "./config/dev.yaml",
+ Value: "./config/config.yaml",
Usage: "config",
},
},
Action: func(c *cli.Context) error {
- migrator, err := newMigrator(c, migrations)
+ migrator, err := newMigrator(c, migrations.Migrations)
if err != nil {
return err
}
@@ -56,12 +45,12 @@ func newDBCommand(migrations *migrate.Migrations) *cli.Command {
Flags: []cli.Flag{
&cli.StringFlag{
Name: "config",
- Value: "./config/dev.yaml",
+ Value: "./config/config.yaml",
Usage: "config",
},
},
Action: func(c *cli.Context) error {
- migrator, err := newMigrator(c, migrations)
+ migrator, err := newMigrator(c, migrations.Migrations)
if err != nil {
return err
}
@@ -86,12 +75,12 @@ func newDBCommand(migrations *migrate.Migrations) *cli.Command {
Flags: []cli.Flag{
&cli.StringFlag{
Name: "config",
- Value: "./config/dev.yaml",
+ Value: "./config/config.yaml",
Usage: "config",
},
},
Action: func(c *cli.Context) error {
- migrator, err := newMigrator(c, migrations)
+ migrator, err := newMigrator(c, migrations.Migrations)
if err != nil {
return err
}
@@ -116,12 +105,12 @@ func newDBCommand(migrations *migrate.Migrations) *cli.Command {
Flags: []cli.Flag{
&cli.StringFlag{
Name: "config",
- Value: "./config/dev.yaml",
+ Value: "./config/config.yaml",
Usage: "config",
},
},
Action: func(c *cli.Context) error {
- migrator, err := newMigrator(c, migrations)
+ migrator, err := newMigrator(c, migrations.Migrations)
if err != nil {
return err
}
@@ -135,12 +124,12 @@ func newDBCommand(migrations *migrate.Migrations) *cli.Command {
Flags: []cli.Flag{
&cli.StringFlag{
Name: "config",
- Value: "./config/dev.yaml",
+ Value: "./config/config.yaml",
Usage: "config",
},
},
Action: func(c *cli.Context) error {
- migrator, err := newMigrator(c, migrations)
+ migrator, err := newMigrator(c, migrations.Migrations)
if err != nil {
return err
}
@@ -154,12 +143,12 @@ func newDBCommand(migrations *migrate.Migrations) *cli.Command {
Flags: []cli.Flag{
&cli.StringFlag{
Name: "config",
- Value: "./config/dev.yaml",
+ Value: "./config/config.yaml",
Usage: "config",
},
},
Action: func(c *cli.Context) error {
- migrator, err := newMigrator(c, migrations)
+ migrator, err := newMigrator(c, migrations.Migrations)
if err != nil {
return err
}
@@ -174,6 +163,49 @@ func newDBCommand(migrations *migrate.Migrations) *cli.Command {
return nil
},
},
+ {
+ Name: "import",
+ Usage: "import json with quotes",
+ Flags: []cli.Flag{
+ &cli.StringFlag{
+ Name: "config",
+ Value: "./config/config.yaml",
+ Usage: "config",
+ },
+ },
+ Action: func(c *cli.Context) error {
+ configFile := c.String("config")
+ cfg, err := config.New(configFile)
+ if err != nil {
+ return err
+ }
+ db := db.New(cfg.DB)
+ file := c.Args().First()
+ quotes := []string{}
+ fp, err := os.Open(file)
+ if err != nil {
+ return err
+ }
+ defer fp.Close()
+
+ if err := json.NewDecoder(fp).Decode(&quotes); err != nil {
+ return err
+ }
+
+ for _, text := range quotes {
+ q := &model.Quote{
+ Quote: text,
+ Approved: true,
+ Archive: true,
+ }
+ if _, err := db.NewInsert().Model(q).Exec(c.Context); err != nil {
+ return err
+ }
+ }
+
+ return nil
+ },
+ },
},
}
}
diff --git a/cmd/app/serve/serve.go b/cmd/shorg/serve/serve.go
index 0609083..13354b7 100644
--- a/cmd/app/serve/serve.go
+++ b/cmd/shorg/serve/serve.go
@@ -27,8 +27,11 @@ func Run(c *cli.Context) error {
e.HTTPErrorHandler = handler.ErrorHandler
- e.Use(middleware.Recover())
- e.Use(middleware.Logger())
+ e.Use(
+ middleware.Recover(),
+ middleware.Logger(),
+ middleware.RemoveTrailingSlash(),
+ )
e.GET("/", h.Index)
e.GET("/quote/:id", h.Quote)
@@ -41,6 +44,7 @@ func Run(c *cli.Context) error {
func(g *echo.Group) {
g.GET("/", h.Admin)
g.POST("/action", h.AdminAction)
+ g.GET("/export", h.AdminExport)
}(e.Group("/admin", middleware.BasicAuth(func(u, p string, ctx echo.Context) (bool, error) {
return cfg.Admins[u] == p, nil
})))
diff --git a/cmd/bun/migrations/20241005143542_1_init.go b/migrations/20241005143542_1_init.go
index dc92797..dc92797 100644
--- a/cmd/bun/migrations/20241005143542_1_init.go
+++ b/migrations/20241005143542_1_init.go
diff --git a/cmd/bun/migrations/main.go b/migrations/main.go
index f7346fb..f7346fb 100644
--- a/cmd/bun/migrations/main.go
+++ b/migrations/main.go
diff --git a/pkg/handler/admin.go b/pkg/handler/admin.go
index 8531011..75fb650 100644
--- a/pkg/handler/admin.go
+++ b/pkg/handler/admin.go
@@ -55,3 +55,21 @@ func (h *Handler) AdminAction(c echo.Context) error {
return c.Redirect(http.StatusFound, "/admin/")
}
+
+func (h *Handler) AdminExport(c echo.Context) error {
+ quotes := []model.Quote{}
+ err := h.DB.NewSelect().
+ Model((*model.Quote)(nil)).
+ Order("id ASC").
+ Scan(c.Request().Context(), &quotes)
+ if err != nil {
+ return err
+ }
+
+ quotesString := make([]string, 0, len(quotes))
+ for _, q := range quotes {
+ quotesString = append(quotesString, q.Quote)
+ }
+
+ return c.JSON(http.StatusOK, quotesString)
+}
diff --git a/pkg/tpl/add.templ b/pkg/tpl/add.templ
index 0611d1b..14b57eb 100644
--- a/pkg/tpl/add.templ
+++ b/pkg/tpl/add.templ
@@ -14,27 +14,10 @@ templ AddQuotePage(form *AddQuoteForm, err string) {
<form method="post">
<textarea rows="5" name="quote" placeholder="Текст цитаты">{ form.Quote }</textarea>
<input type="hidden" name="captcha_id" value={ form.CaptchaID }/>
- <div role="group">
- <img class="captcha" src={ fmt.Sprintf("/captcha/download/%s.png", form.CaptchaID) }/>
- <audio id="audiocaptcha" src={ fmt.Sprintf("/captcha/download/%s.wav?lang=ru", form.CaptchaID) }></audio>
- <a role="button" onclick="togglePlay()">Прослушать</a>
- <input type="text" name="captcha_value" placeholder="Код с картинки"/>
- </div>
+ <img class="captcha" src={ fmt.Sprintf("/captcha/download/%s.png", form.CaptchaID) }/>
+ <input type="text" name="captcha_value" placeholder="Код с картинки"/>
<input type="submit" value="Отправить на модерацию"/>
</form>
- <script>
- var myAudio = document.getElementById("audiocaptcha");
- var isPlaying = false;
- function togglePlay() {
- isPlaying ? myAudio.pause() : myAudio.play();
- };
- myAudio.onplaying = function() {
- isPlaying = true;
- };
- myAudio.onpause = function() {
- isPlaying = false;
- };
- </script>
}
}
diff --git a/pkg/tpl/add_templ.go b/pkg/tpl/add_templ.go
index 04fb615..d47582b 100644
--- a/pkg/tpl/add_templ.go
+++ b/pkg/tpl/add_templ.go
@@ -92,33 +92,20 @@ func AddQuotePage(form *AddQuoteForm, err string) templ.Component {
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"><div role=\"group\"><img class=\"captcha\" src=\"")
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"> <img class=\"captcha\" src=\"")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var6 string
templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("/captcha/download/%s.png", form.CaptchaID))
if templ_7745c5c3_Err != nil {
- return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/tpl/add.templ`, Line: 18, Col: 86}
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/tpl/add.templ`, Line: 17, Col: 85}
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"> <audio id=\"audiocaptcha\" src=\"")
- if templ_7745c5c3_Err != nil {
- return templ_7745c5c3_Err
- }
- var templ_7745c5c3_Var7 string
- templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("/captcha/download/%s.wav?lang=ru", form.CaptchaID))
- if templ_7745c5c3_Err != nil {
- return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/tpl/add.templ`, Line: 19, Col: 98}
- }
- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
- if templ_7745c5c3_Err != nil {
- return templ_7745c5c3_Err
- }
- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"></audio> <a role=\"button\" onclick=\"togglePlay()\">Прослушать</a> <input type=\"text\" name=\"captcha_value\" placeholder=\"Код с картинки\"></div><input type=\"submit\" value=\"Отправить на модерацию\"></form><script>\n\t\t\tvar myAudio = document.getElementById(\"audiocaptcha\");\n\t\t\tvar isPlaying = false;\n\t\t\tfunction togglePlay() {\n\t\t\t\tisPlaying ? myAudio.pause() : myAudio.play();\n\t\t\t};\n\t\t\tmyAudio.onplaying = function() {\n\t\t\t\tisPlaying = true;\n\t\t\t};\n\t\t\tmyAudio.onpause = function() {\n\t\t\t\tisPlaying = false;\n\t\t\t};\n\t\t</script>")
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"> <input type=\"text\" name=\"captcha_value\" placeholder=\"Код с картинки\"> <input type=\"submit\" value=\"Отправить на модерацию\"></form>")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
diff --git a/pkg/tpl/quote.templ b/pkg/tpl/quote.templ
index 58c0d4f..34429d1 100644
--- a/pkg/tpl/quote.templ
+++ b/pkg/tpl/quote.templ
@@ -8,13 +8,22 @@ import (
templ Quote(quote *model.Quote) {
<article>
- <header><a href={ templ.URL(fmt.Sprintf("/quote/%d", quote.ID)) }>#{ strconv.Itoa(int(quote.ID)) }</a></header>
+ <header>
+ <a href={ templ.URL(fmt.Sprintf("/quote/%d", quote.ID)) }>#{ strconv.Itoa(int(quote.ID)) }</a>
+ <span><abbr title="Добавлено на сайт">{ quote.CreatedAt.Format("02.01.06") }</abbr></span>
+ </header>
@templ.Raw(quote.Text())
<footer>
- Поделиться:&nbsp;
- <a target="_blank" href={ templ.URL(fmt.Sprintf("https://t.me/share/url?url=https://sh.org.ru/quote/%d", quote.ID)) }><i class="fa fa-telegram" aria-hidden="true"></i></a>&nbsp;
- <a target="_blank" href={ templ.URL(fmt.Sprintf("https://vk.com/share.php?url=https://sh.org.ru/quote/%d", quote.ID)) }><i class="fa fa-vk" aria-hidden="true"></i></a>&nbsp;
+ <span>
+ <a target="_blank" href={ templ.URL(fmt.Sprintf("https://t.me/share/url?url=https://sh.org.ru/quote/%d", quote.ID)) }><i class="fa fa-telegram" aria-hidden="true"></i></a>&nbsp;&middot;&nbsp
+ <a target="_blank" href={ templ.URL(fmt.Sprintf("https://vk.com/share.php?url=https://sh.org.ru/quote/%d", quote.ID)) }><i class="fa fa-vk" aria-hidden="true"></i></a>&nbsp;&middot;&nbsp
<a target="_blank" href={ templ.URL(fmt.Sprintf("https://connect.ok.ru/offer?url=https://sh.org.ru/quote/%d", quote.ID)) }><i class="fa fa-odnoklassniki-square" aria-hidden="true"></i></a>
+ </span>
+ <span>
+ if quote.Archive {
+ <abbr title="Цитата из старого цитатника">Архив</abbr>
+ }
+ </span>
</footer>
</article>
}
diff --git a/pkg/tpl/quote_templ.go b/pkg/tpl/quote_templ.go
index 3aa96a1..fa139cd 100644
--- a/pkg/tpl/quote_templ.go
+++ b/pkg/tpl/quote_templ.go
@@ -51,48 +51,71 @@ func Quote(quote *model.Quote) templ.Component {
var templ_7745c5c3_Var3 string
templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(strconv.Itoa(int(quote.ID)))
if templ_7745c5c3_Err != nil {
- return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/tpl/quote.templ`, Line: 11, Col: 98}
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/tpl/quote.templ`, Line: 12, Col: 91}
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</a></header>")
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</a> <span><abbr title=\"Добавлено на сайт\">")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- templ_7745c5c3_Err = templ.Raw(quote.Text()).Render(ctx, templ_7745c5c3_Buffer)
+ var templ_7745c5c3_Var4 string
+ templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(quote.CreatedAt.Format("02.01.06"))
+ if templ_7745c5c3_Err != nil {
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/tpl/quote.templ`, Line: 13, Col: 92}
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<footer>Поделиться:&nbsp; <a target=\"_blank\" href=\"")
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</abbr></span></header>")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- var templ_7745c5c3_Var4 templ.SafeURL = templ.URL(fmt.Sprintf("https://t.me/share/url?url=https://sh.org.ru/quote/%d", quote.ID))
- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var4)))
+ templ_7745c5c3_Err = templ.Raw(quote.Text()).Render(ctx, templ_7745c5c3_Buffer)
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"><i class=\"fa fa-telegram\" aria-hidden=\"true\"></i></a>&nbsp; <a target=\"_blank\" href=\"")
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<footer><span><a target=\"_blank\" href=\"")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- var templ_7745c5c3_Var5 templ.SafeURL = templ.URL(fmt.Sprintf("https://vk.com/share.php?url=https://sh.org.ru/quote/%d", quote.ID))
+ var templ_7745c5c3_Var5 templ.SafeURL = templ.URL(fmt.Sprintf("https://t.me/share/url?url=https://sh.org.ru/quote/%d", quote.ID))
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var5)))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"><i class=\"fa fa-vk\" aria-hidden=\"true\"></i></a>&nbsp; <a target=\"_blank\" href=\"")
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"><i class=\"fa fa-telegram\" aria-hidden=\"true\"></i></a>&nbsp;&middot;&nbsp <a target=\"_blank\" href=\"")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- var templ_7745c5c3_Var6 templ.SafeURL = templ.URL(fmt.Sprintf("https://connect.ok.ru/offer?url=https://sh.org.ru/quote/%d", quote.ID))
+ var templ_7745c5c3_Var6 templ.SafeURL = templ.URL(fmt.Sprintf("https://vk.com/share.php?url=https://sh.org.ru/quote/%d", quote.ID))
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var6)))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"><i class=\"fa fa-odnoklassniki-square\" aria-hidden=\"true\"></i></a></footer></article>")
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"><i class=\"fa fa-vk\" aria-hidden=\"true\"></i></a>&nbsp;&middot;&nbsp <a target=\"_blank\" href=\"")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ var templ_7745c5c3_Var7 templ.SafeURL = templ.URL(fmt.Sprintf("https://connect.ok.ru/offer?url=https://sh.org.ru/quote/%d", quote.ID))
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var7)))
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"><i class=\"fa fa-odnoklassniki-square\" aria-hidden=\"true\"></i></a></span> <span>")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ if quote.Archive {
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<abbr title=\"Цитата из старого цитатника\">Архив</abbr>")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</span></footer></article>")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
@@ -116,12 +139,12 @@ func QuotePage(quote *model.Quote) templ.Component {
}()
}
ctx = templ.InitializeContext(ctx)
- templ_7745c5c3_Var7 := templ.GetChildren(ctx)
- if templ_7745c5c3_Var7 == nil {
- templ_7745c5c3_Var7 = templ.NopComponent
+ templ_7745c5c3_Var8 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var8 == nil {
+ templ_7745c5c3_Var8 = templ.NopComponent
}
ctx = templ.ClearChildren(ctx)
- templ_7745c5c3_Var8 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_Var9 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
if !templ_7745c5c3_IsBuffer {
@@ -143,7 +166,7 @@ func QuotePage(quote *model.Quote) templ.Component {
Title: "Цитата #" + strconv.Itoa(int(quote.ID)),
URL: fmt.Sprintf("https://sh.org.ru/quote/%d", quote.ID),
Description: templ.EscapeString(quote.Quote),
- }).Render(templ.WithChildren(ctx, templ_7745c5c3_Var8), templ_7745c5c3_Buffer)
+ }).Render(templ.WithChildren(ctx, templ_7745c5c3_Var9), templ_7745c5c3_Buffer)
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
diff --git a/static/css/style.css b/static/css/style.css
index ab24ab3..d1b4d40 100644
--- a/static/css/style.css
+++ b/static/css/style.css
@@ -1,14 +1,14 @@
-.row {
+.captcha {
+ height: 65px;
+}
+article header {
display: flex;
flex-direction: row;
- margin-bottom: var(--pico-spacing);
+ justify-content: space-between;
}
-.col {
+
+article footer {
display: flex;
+ flex-direction: row;
+ justify-content: space-between;
}
-.captcha {
- background-color: aliceblue;
- height:65px;
- border-top-left-radius: var(--pico-border-radius);
- border-bottom-left-radius: var(--pico-border-radius);
-} \ No newline at end of file