diff options
Diffstat (limited to 'internal/processor/image.go')
| -rw-r--r-- | internal/processor/image.go | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/internal/processor/image.go b/internal/processor/image.go index a981e85..f68f533 100644 --- a/internal/processor/image.go +++ b/internal/processor/image.go @@ -8,7 +8,9 @@ import ( "image/png" "os" "path/filepath" + "time" + "codeberg.org/snonux/snonux/internal/post" "golang.org/x/image/draw" ) @@ -17,6 +19,41 @@ const ( jpegQuality = 80 ) +type imageBuilder struct{} + +func (imageBuilder) Plan(srcPath string, ext string) (postPlan, error) { + plan := postPlan{srcPath: srcPath, ext: ext} + img, err := validateImage(srcPath) + if err != nil { + return postPlan{}, err + } + plan.validatedImage = img + return plan, nil +} + +func (imageBuilder) Commit(plan postPlan, postDir string, id string, now time.Time) (*post.Post, []string, error) { + if err := writeImageAsset(plan.validatedImage, postDir); err != nil { + return nil, nil, err + } + src := fmt.Sprintf("posts/%s/image.jpg", id) + html := fmt.Sprintf(`<img src="%s" alt="" class="post-image">`, src) + p := &post.Post{ + ID: id, + Timestamp: now, + PostType: post.TypeImage, + Content: html, + Assets: []string{"image.jpg"}, + } + return p, nil, nil +} + +func init() { + register(".png", imageBuilder{}) + register(".jpg", imageBuilder{}) + register(".jpeg", imageBuilder{}) + register(".gif", imageBuilder{}) +} + // validateImage reads and decodes the source image, resizing if necessary. // It performs only read validation; the caller is responsible for writing assets. func validateImage(srcPath string) (image.Image, error) { |
