Мелкие правки
This commit is contained in:
parent
0617918eb9
commit
420e049415
13 changed files with 162 additions and 162 deletions
|
@ -6,7 +6,7 @@ RUN apk update --no-cache && apk add --no-cache tzdata
|
||||||
COPY go.mod go.sum ./
|
COPY go.mod go.sum ./
|
||||||
RUN go mod download && go mod verify
|
RUN go mod download && go mod verify
|
||||||
COPY . .
|
COPY . .
|
||||||
RUN go build -o shorg ./cmd/app
|
RUN go build -o shorg ./cmd/shorg
|
||||||
|
|
||||||
# Runtime container
|
# Runtime container
|
||||||
FROM alpine:3.20
|
FROM alpine:3.20
|
||||||
|
@ -20,4 +20,4 @@ ENV TZ=Europe/Moscow
|
||||||
|
|
||||||
EXPOSE 8000
|
EXPOSE 8000
|
||||||
|
|
||||||
CMD ["/app/shorg"]
|
ENTRYPOINT ["/app/shorg"]
|
|
@ -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("es); 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
|
|
||||||
}
|
|
|
@ -5,8 +5,9 @@ import (
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/urfave/cli/v2"
|
"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() {
|
func main() {
|
||||||
|
@ -24,17 +25,7 @@ func main() {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
migrator.Migrator(),
|
||||||
Name: "import",
|
|
||||||
Action: importer.Run,
|
|
||||||
Flags: []cli.Flag{
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "config",
|
|
||||||
Value: "./config/dev.yaml",
|
|
||||||
Usage: "config",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
if err := app.Run(os.Args); err != nil {
|
if err := app.Run(os.Args); err != nil {
|
|
@ -1,32 +1,21 @@
|
||||||
package main
|
package migrator
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/uptrace/bun/migrate"
|
"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/config"
|
||||||
"sh.org.ru/pkg/db"
|
"sh.org.ru/pkg/db"
|
||||||
|
"sh.org.ru/pkg/model"
|
||||||
"github.com/urfave/cli/v2"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func Migrator() *cli.Command {
|
||||||
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 {
|
|
||||||
return &cli.Command{
|
return &cli.Command{
|
||||||
Name: "db",
|
Name: "db",
|
||||||
Usage: "manage database migrations",
|
Usage: "manage database migrations",
|
||||||
|
@ -37,12 +26,12 @@ func newDBCommand(migrations *migrate.Migrations) *cli.Command {
|
||||||
Flags: []cli.Flag{
|
Flags: []cli.Flag{
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "config",
|
Name: "config",
|
||||||
Value: "./config/dev.yaml",
|
Value: "./config/config.yaml",
|
||||||
Usage: "config",
|
Usage: "config",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Action: func(c *cli.Context) error {
|
Action: func(c *cli.Context) error {
|
||||||
migrator, err := newMigrator(c, migrations)
|
migrator, err := newMigrator(c, migrations.Migrations)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -56,12 +45,12 @@ func newDBCommand(migrations *migrate.Migrations) *cli.Command {
|
||||||
Flags: []cli.Flag{
|
Flags: []cli.Flag{
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "config",
|
Name: "config",
|
||||||
Value: "./config/dev.yaml",
|
Value: "./config/config.yaml",
|
||||||
Usage: "config",
|
Usage: "config",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Action: func(c *cli.Context) error {
|
Action: func(c *cli.Context) error {
|
||||||
migrator, err := newMigrator(c, migrations)
|
migrator, err := newMigrator(c, migrations.Migrations)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -86,12 +75,12 @@ func newDBCommand(migrations *migrate.Migrations) *cli.Command {
|
||||||
Flags: []cli.Flag{
|
Flags: []cli.Flag{
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "config",
|
Name: "config",
|
||||||
Value: "./config/dev.yaml",
|
Value: "./config/config.yaml",
|
||||||
Usage: "config",
|
Usage: "config",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Action: func(c *cli.Context) error {
|
Action: func(c *cli.Context) error {
|
||||||
migrator, err := newMigrator(c, migrations)
|
migrator, err := newMigrator(c, migrations.Migrations)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -116,12 +105,12 @@ func newDBCommand(migrations *migrate.Migrations) *cli.Command {
|
||||||
Flags: []cli.Flag{
|
Flags: []cli.Flag{
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "config",
|
Name: "config",
|
||||||
Value: "./config/dev.yaml",
|
Value: "./config/config.yaml",
|
||||||
Usage: "config",
|
Usage: "config",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Action: func(c *cli.Context) error {
|
Action: func(c *cli.Context) error {
|
||||||
migrator, err := newMigrator(c, migrations)
|
migrator, err := newMigrator(c, migrations.Migrations)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -135,12 +124,12 @@ func newDBCommand(migrations *migrate.Migrations) *cli.Command {
|
||||||
Flags: []cli.Flag{
|
Flags: []cli.Flag{
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "config",
|
Name: "config",
|
||||||
Value: "./config/dev.yaml",
|
Value: "./config/config.yaml",
|
||||||
Usage: "config",
|
Usage: "config",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Action: func(c *cli.Context) error {
|
Action: func(c *cli.Context) error {
|
||||||
migrator, err := newMigrator(c, migrations)
|
migrator, err := newMigrator(c, migrations.Migrations)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -154,12 +143,12 @@ func newDBCommand(migrations *migrate.Migrations) *cli.Command {
|
||||||
Flags: []cli.Flag{
|
Flags: []cli.Flag{
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "config",
|
Name: "config",
|
||||||
Value: "./config/dev.yaml",
|
Value: "./config/config.yaml",
|
||||||
Usage: "config",
|
Usage: "config",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Action: func(c *cli.Context) error {
|
Action: func(c *cli.Context) error {
|
||||||
migrator, err := newMigrator(c, migrations)
|
migrator, err := newMigrator(c, migrations.Migrations)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -171,6 +160,49 @@ func newDBCommand(migrations *migrate.Migrations) *cli.Command {
|
||||||
}
|
}
|
||||||
fmt.Printf("created migration %s (%s)\n", mf.Name, mf.Path)
|
fmt.Printf("created migration %s (%s)\n", mf.Name, mf.Path)
|
||||||
|
|
||||||
|
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("es); 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
|
return nil
|
||||||
},
|
},
|
||||||
},
|
},
|
|
@ -27,8 +27,11 @@ func Run(c *cli.Context) error {
|
||||||
|
|
||||||
e.HTTPErrorHandler = handler.ErrorHandler
|
e.HTTPErrorHandler = handler.ErrorHandler
|
||||||
|
|
||||||
e.Use(middleware.Recover())
|
e.Use(
|
||||||
e.Use(middleware.Logger())
|
middleware.Recover(),
|
||||||
|
middleware.Logger(),
|
||||||
|
middleware.RemoveTrailingSlash(),
|
||||||
|
)
|
||||||
|
|
||||||
e.GET("/", h.Index)
|
e.GET("/", h.Index)
|
||||||
e.GET("/quote/:id", h.Quote)
|
e.GET("/quote/:id", h.Quote)
|
||||||
|
@ -41,6 +44,7 @@ func Run(c *cli.Context) error {
|
||||||
func(g *echo.Group) {
|
func(g *echo.Group) {
|
||||||
g.GET("/", h.Admin)
|
g.GET("/", h.Admin)
|
||||||
g.POST("/action", h.AdminAction)
|
g.POST("/action", h.AdminAction)
|
||||||
|
g.GET("/export", h.AdminExport)
|
||||||
}(e.Group("/admin", middleware.BasicAuth(func(u, p string, ctx echo.Context) (bool, error) {
|
}(e.Group("/admin", middleware.BasicAuth(func(u, p string, ctx echo.Context) (bool, error) {
|
||||||
return cfg.Admins[u] == p, nil
|
return cfg.Admins[u] == p, nil
|
||||||
})))
|
})))
|
|
@ -55,3 +55,21 @@ func (h *Handler) AdminAction(c echo.Context) error {
|
||||||
|
|
||||||
return c.Redirect(http.StatusFound, "/admin/")
|
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(), "es)
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
|
|
@ -14,27 +14,10 @@ templ AddQuotePage(form *AddQuoteForm, err string) {
|
||||||
<form method="post">
|
<form method="post">
|
||||||
<textarea rows="5" name="quote" placeholder="Текст цитаты">{ form.Quote }</textarea>
|
<textarea rows="5" name="quote" placeholder="Текст цитаты">{ form.Quote }</textarea>
|
||||||
<input type="hidden" name="captcha_id" value={ form.CaptchaID }/>
|
<input type="hidden" name="captcha_id" value={ form.CaptchaID }/>
|
||||||
<div role="group">
|
|
||||||
<img class="captcha" src={ fmt.Sprintf("/captcha/download/%s.png", form.CaptchaID) }/>
|
<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="Код с картинки"/>
|
<input type="text" name="captcha_value" placeholder="Код с картинки"/>
|
||||||
</div>
|
|
||||||
<input type="submit" value="Отправить на модерацию"/>
|
<input type="submit" value="Отправить на модерацию"/>
|
||||||
</form>
|
</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>
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -92,33 +92,20 @@ func AddQuotePage(form *AddQuoteForm, err string) templ.Component {
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
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 {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
var templ_7745c5c3_Var6 string
|
var templ_7745c5c3_Var6 string
|
||||||
templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("/captcha/download/%s.png", form.CaptchaID))
|
templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("/captcha/download/%s.png", form.CaptchaID))
|
||||||
if templ_7745c5c3_Err != nil {
|
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))
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"> <audio id=\"audiocaptcha\" src=\"")
|
_, 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
|
|
||||||
}
|
|
||||||
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>")
|
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,13 +8,22 @@ import (
|
||||||
|
|
||||||
templ Quote(quote *model.Quote) {
|
templ Quote(quote *model.Quote) {
|
||||||
<article>
|
<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())
|
@templ.Raw(quote.Text())
|
||||||
<footer>
|
<footer>
|
||||||
Поделиться:
|
<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>
|
<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> · 
|
||||||
<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>
|
<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> · 
|
||||||
<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>
|
<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>
|
</footer>
|
||||||
</article>
|
</article>
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,13 +51,26 @@ func Quote(quote *model.Quote) templ.Component {
|
||||||
var templ_7745c5c3_Var3 string
|
var templ_7745c5c3_Var3 string
|
||||||
templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(strconv.Itoa(int(quote.ID)))
|
templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(strconv.Itoa(int(quote.ID)))
|
||||||
if templ_7745c5c3_Err != nil {
|
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))
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
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
|
||||||
|
}
|
||||||
|
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("</abbr></span></header>")
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
|
@ -65,34 +78,44 @@ func Quote(quote *model.Quote) templ.Component {
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<footer>Поделиться: <a target=\"_blank\" href=\"")
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<footer><span><a target=\"_blank\" href=\"")
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
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))
|
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_Var4)))
|
|
||||||
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> <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))
|
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var5)))
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var5)))
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"><i class=\"fa fa-vk\" aria-hidden=\"true\"></i></a> <a target=\"_blank\" href=\"")
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"><i class=\"fa fa-telegram\" aria-hidden=\"true\"></i></a> ·  <a target=\"_blank\" href=\"")
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
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)))
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var6)))
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
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> ·  <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 {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
|
@ -116,12 +139,12 @@ func QuotePage(quote *model.Quote) templ.Component {
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
ctx = templ.InitializeContext(ctx)
|
ctx = templ.InitializeContext(ctx)
|
||||||
templ_7745c5c3_Var7 := templ.GetChildren(ctx)
|
templ_7745c5c3_Var8 := templ.GetChildren(ctx)
|
||||||
if templ_7745c5c3_Var7 == nil {
|
if templ_7745c5c3_Var8 == nil {
|
||||||
templ_7745c5c3_Var7 = templ.NopComponent
|
templ_7745c5c3_Var8 = templ.NopComponent
|
||||||
}
|
}
|
||||||
ctx = templ.ClearChildren(ctx)
|
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_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
|
||||||
templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
|
templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
|
||||||
if !templ_7745c5c3_IsBuffer {
|
if !templ_7745c5c3_IsBuffer {
|
||||||
|
@ -143,7 +166,7 @@ func QuotePage(quote *model.Quote) templ.Component {
|
||||||
Title: "Цитата #" + strconv.Itoa(int(quote.ID)),
|
Title: "Цитата #" + strconv.Itoa(int(quote.ID)),
|
||||||
URL: fmt.Sprintf("https://sh.org.ru/quote/%d", quote.ID),
|
URL: fmt.Sprintf("https://sh.org.ru/quote/%d", quote.ID),
|
||||||
Description: templ.EscapeString(quote.Quote),
|
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 {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
.row {
|
.captcha {
|
||||||
|
height: 65px;
|
||||||
|
}
|
||||||
|
article header {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
margin-bottom: var(--pico-spacing);
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
.col {
|
|
||||||
|
article footer {
|
||||||
display: flex;
|
display: flex;
|
||||||
}
|
flex-direction: row;
|
||||||
.captcha {
|
justify-content: space-between;
|
||||||
background-color: aliceblue;
|
|
||||||
height:65px;
|
|
||||||
border-top-left-radius: var(--pico-border-radius);
|
|
||||||
border-bottom-left-radius: var(--pico-border-radius);
|
|
||||||
}
|
}
|
Loading…
Reference in a new issue