diff --git a/docz/docs/03-demos/31-engines/05_goja.md b/docz/docs/03-demos/31-engines/05_goja.md new file mode 100644 index 0000000..a4544e3 --- /dev/null +++ b/docz/docs/03-demos/31-engines/05_goja.md @@ -0,0 +1,136 @@ +--- +title: Go + Goja +pagination_prev: demos/cli +pagination_next: demos/clipboard +--- + +Goja is a pure Go implementation of ECMAScript 5. + +The [Standalone scripts](/docs/getting-started/installation/standalone) can be +parsed and evaluated in a Goja context. + +## Integration Details + +_Initialize Goja_ + +Goja does not provide a `global` variable. It can be created in one line: + +```go +/* initialize */ +vm := goja.New() + +/* goja does not expose a standard "global" by default */ +// highlight-next-line +v, err := vm.RunString("var global = (function(){ return this; }).call(null);") +``` + +_Load SheetJS Scripts_ + +The shim and main libraries can be loaded by reading the scripts from the file +system and evaluating in the Goja context: + +```go +func safe_run_file(vm *goja.Runtime, file string) { + data, err := ioutil.ReadFile(file) + if err != nil { panic(err) } + src := string(data) + _, err = vm.RunString(src) + if err != nil { panic(err) } +} + +// ... + safe_run_file(vm, "shim.min.js") + safe_run_file(vm, "xlsx.full.min.js") +``` + +To confirm the library is loaded, `XLSX.version` can be inspected: + +```go + /* get version string */ + v, err := vm.RunString("XLSX.version") + fmt.Printf("SheetJS library version %s\n", v) +``` + +### Reading Files + +Files can be read into `[]byte`: + +```go +/* read file */ +data, _ := ioutil.ReadFile("sheetjs.xlsx") +``` + +`[]byte` should be converted to an `ArrayBuffer` from Go: + +```go +/* load into engine */ +vm.Set("buf", vm.ToValue(vm.NewArrayBuffer(data))) + +/* parse */ +wb, _ = vm.RunString("wb = XLSX.read(buf, {type:'buffer'});") +``` + +### Writing Files + +`"base64"` strings can be passed from the JS context to Go code: + +```go +/* write to Base64 string */ +b64str, _ := vm.RunString("XLSX.write(wb, {type:'base64', bookType:'xlsx'})") + +/* pull data back into Go and write to file */ +buf, _ := base64.StdEncoding.DecodeString(b64str.String()) +_ = ioutil.WriteFile("sheetjs.xlsx", buf, 0644) +``` + +## Complete Example + +:::note + +This demo was tested on 2023 February 14. + +::: + +0) Create a module and install dependencies: + +```bash +mkdir SheetGoja +cd SheetGoja +go mod init SheetGoja +go get github.com/dop251/goja +``` + +1) Download the standalone script, shim and test file: + +
+ +```bash +curl -LO https://cdn.sheetjs.com/xlsx-latest/package/dist/shim.min.js +curl -LO https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js +curl -LO https://sheetjs.com/pres.numbers +``` + +2) Download [`SheetGoja.go`](pathname:///goja/SheetGoja.go): + +```bash +curl -LO https://docs.sheetjs.com/goja/SheetGoja.go +``` + +3) Build standalone `SheetGoja` binary: + +```bash +go build SheetGoja.go +``` + +4) Run the demo: + +```bash +./SheetGoja pres.numbers +``` + +If the program succeeded, the CSV contents will be printed to console and the +file `sheetjsw.xlsb` will be created. That file can be opened with Excel. diff --git a/docz/docs/03-demos/31-engines/index.md b/docz/docs/03-demos/31-engines/index.md index a0a1268..73d93c2 100644 --- a/docz/docs/03-demos/31-engines/index.md +++ b/docz/docs/03-demos/31-engines/index.md @@ -67,145 +67,9 @@ The demo includes examples in C and Perl. ### Goja -Goja is a pure Go implementation of ECMAScript 5. It supports the standalone -scripts out of the box. - -**Reading data** - -Files can be read into `[]byte`: - -```go -/* read file */ -data, _ := ioutil.ReadFile("sheetjs.xlsx") -``` - -`[]byte` should be converted to an `ArrayBuffer` from Go: - -```go -/* load into engine */ -vm.Set("buf", vm.ToValue(vm.NewArrayBuffer(data))) - -/* parse */ -wb, _ = vm.RunString("wb = XLSX.read(buf, {type:'buffer'});") -``` - -**Writing data** - -`"base64"` strings can be decoded in Go: - -```go -/* write to Base64 string */ -b64str, _ := vm.RunString("XLSX.write(wb, {type:'base64', bookType:'xlsx'})") - -/* pull data back into Go and write to file */ -buf, _ := base64.StdEncoding.DecodeString(b64str.String()) -_ = ioutil.WriteFile("sheetjs.xlsx", buf, 0644) -``` - -