Compare commits
8 Commits
05ac24254c
...
chore/mini
| Author | SHA1 | Date | |
|---|---|---|---|
| b59c939e3e | |||
| 3a30c7a6f4 | |||
| bdab11b100 | |||
| d3f6f0e946 | |||
| f05c4bbcc7 | |||
| d2ac081d5e | |||
| 39af776d00 | |||
| 15130938ce |
55
.drone.yml
Normal file
55
.drone.yml
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: kubernetes
|
||||||
|
name: build-clis
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: build
|
||||||
|
image: golang:1.17
|
||||||
|
commands:
|
||||||
|
- make build-cross-clis
|
||||||
|
- name: upload
|
||||||
|
image: plugins/s3
|
||||||
|
settings:
|
||||||
|
bucket: covergen
|
||||||
|
source: dist/*
|
||||||
|
target: /dist/
|
||||||
|
strip_prefix: dist/
|
||||||
|
acl: readonly
|
||||||
|
|
||||||
|
path_style: true
|
||||||
|
endpoint: https://s3.blacknova.io
|
||||||
|
access_key:
|
||||||
|
from_secret: minio_access_key_id
|
||||||
|
secret_key:
|
||||||
|
from_secret: minio_secret_access_key
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: kubernetes
|
||||||
|
name: build-wasm
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: build
|
||||||
|
image: golang:1.17
|
||||||
|
environment:
|
||||||
|
GOOS: js
|
||||||
|
GOARCH: wasm
|
||||||
|
commands:
|
||||||
|
- make wasm
|
||||||
|
- name: upload
|
||||||
|
image: plugins/s3
|
||||||
|
settings:
|
||||||
|
bucket: covergen
|
||||||
|
source: assets/**/*
|
||||||
|
target: /
|
||||||
|
strip_prefix: assets/
|
||||||
|
acl: readonly
|
||||||
|
|
||||||
|
path_style: true
|
||||||
|
endpoint: https://s3.blacknova.io
|
||||||
|
access_key:
|
||||||
|
from_secret: minio_access_key_id
|
||||||
|
secret_key:
|
||||||
|
from_secret: minio_secret_access_key
|
||||||
|
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,4 +1,5 @@
|
|||||||
covergen
|
covergen
|
||||||
!covergen/
|
!covergen/
|
||||||
*.pdf
|
*.pdf
|
||||||
assets/*.wasm
|
assets/*.wasm
|
||||||
|
dist/
|
||||||
8
Makefile
8
Makefile
@@ -1,3 +1,9 @@
|
|||||||
|
.PHONY: build-cross-clis
|
||||||
|
build-cross-clis:
|
||||||
|
rm -rf ./dist && mkdir ./dist
|
||||||
|
GOOS=linux GOARCH=amd64 go build -o dist/covergen.linux-amd64 ./cmd/covergen
|
||||||
|
GOOS=darwin GOARCH=amd64 go build -o dist/covergen.darwin-amd64 ./cmd/covergen
|
||||||
|
|
||||||
|
.PHONY: wasm
|
||||||
wasm:
|
wasm:
|
||||||
GOOS=js GOARCH=wasm go build -o assets/covergen.wasm ./cmd/wasm/main.go
|
GOOS=js GOARCH=wasm go build -o assets/covergen.wasm ./cmd/wasm/main.go
|
||||||
.PHONY: wasm
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"syscall/js"
|
"syscall/js"
|
||||||
|
|
||||||
|
"github.com/go-pdf/fpdf"
|
||||||
"github.com/thegrumpylion/jsref"
|
"github.com/thegrumpylion/jsref"
|
||||||
|
|
||||||
"covergen/pkg/covergen"
|
"covergen/pkg/covergen"
|
||||||
@@ -70,6 +71,18 @@ func settingsFromValue(arg js.Value) (*covergen.CoverSettings, error) {
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func pdfToJs(pdf *fpdf.Fpdf) (js.Value, error) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
if err := pdf.Output(&buf); err != nil {
|
||||||
|
return js.Null(), fmt.Errorf("failed to write pdf: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
s := buf.Bytes()
|
||||||
|
ta := js.Global().Get("Uint8Array").New(len(s))
|
||||||
|
js.CopyBytesToJS(ta, s)
|
||||||
|
return ta, nil
|
||||||
|
}
|
||||||
|
|
||||||
func generateCover(this js.Value, args []js.Value) interface{} {
|
func generateCover(this js.Value, args []js.Value) interface{} {
|
||||||
defer func() {
|
defer func() {
|
||||||
if r := recover(); r != nil {
|
if r := recover(); r != nil {
|
||||||
@@ -96,18 +109,61 @@ func generateCover(this js.Value, args []js.Value) interface{} {
|
|||||||
return jsmap{"error": err.Error()}
|
return jsmap{"error": err.Error()}
|
||||||
}
|
}
|
||||||
|
|
||||||
var buf bytes.Buffer
|
jsBytes, err := pdfToJs(pdf)
|
||||||
if err = pdf.Output(&buf); err != nil {
|
if err != nil {
|
||||||
|
return jsmap{"error": err.Error()}
|
||||||
|
}
|
||||||
|
return jsBytes
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateSplitCover(this js.Value, args []js.Value) interface{} {
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
fmt.Println("recovered", r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
if len(args) != 1 {
|
||||||
|
return jsmap{"error": "missing argument"}
|
||||||
|
}
|
||||||
|
|
||||||
|
arg := args[0]
|
||||||
|
if arg.Type() != js.TypeObject {
|
||||||
|
return jsmap{"error": "expected object"}
|
||||||
|
}
|
||||||
|
|
||||||
|
settings, err := settingsFromValue(arg)
|
||||||
|
if err != nil {
|
||||||
return jsmap{"error": err.Error()}
|
return jsmap{"error": err.Error()}
|
||||||
}
|
}
|
||||||
|
|
||||||
s := buf.Bytes()
|
front, err := covergen.GenerateFrontCover(*settings)
|
||||||
ta := js.Global().Get("Uint8Array").New(len(s))
|
if err != nil {
|
||||||
js.CopyBytesToJS(ta, s)
|
return jsmap{"error": fmt.Sprintf("failed to render front: %s", err.Error())}
|
||||||
return ta
|
}
|
||||||
|
|
||||||
|
back, err := covergen.GenerateBackCover(*settings)
|
||||||
|
if err != nil {
|
||||||
|
return jsmap{"error": fmt.Sprintf("failed to render back: %s", err.Error())}
|
||||||
|
}
|
||||||
|
|
||||||
|
frontJSBytes, err := pdfToJs(front)
|
||||||
|
if err != nil {
|
||||||
|
return jsmap{"error": fmt.Sprintf("failed to render front: %s", err.Error())}
|
||||||
|
}
|
||||||
|
backJSBytes, err := pdfToJs(back)
|
||||||
|
if err != nil {
|
||||||
|
return jsmap{"error": fmt.Sprintf("failed to render back: %s", err.Error())}
|
||||||
|
}
|
||||||
|
|
||||||
|
return jsmap{
|
||||||
|
"front": frontJSBytes,
|
||||||
|
"back": backJSBytes,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
js.Global().Set("covergen", js.FuncOf(generateCover))
|
js.Global().Set("generateCover", js.FuncOf(generateCover))
|
||||||
|
js.Global().Set("generateSplitCover", js.FuncOf(generateSplitCover))
|
||||||
<-make(chan bool)
|
<-make(chan bool)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user