Skip to content

Commit

Permalink
single vm per build
Browse files Browse the repository at this point in the history
  • Loading branch information
libkush committed Jul 3, 2024
1 parent 5940654 commit 14f2cc8
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 16 deletions.
9 changes: 9 additions & 0 deletions extender.go
Original file line number Diff line number Diff line change
@@ -1,24 +1,33 @@
package katex

import (
_ "embed"

"github.com/bluele/gcache"
"github.com/dop251/goja"
"github.com/yuin/goldmark"
"github.com/yuin/goldmark/parser"
"github.com/yuin/goldmark/renderer"
"github.com/yuin/goldmark/util"
)

//go:embed katex.min.js
var katexjs string

type Extender struct {
}

func (e *Extender) Extend(m goldmark.Markdown) {
vm := goja.New()
vm.RunString(katexjs)
m.Parser().AddOptions(parser.WithInlineParsers(
util.Prioritized(&Parser{}, 0),
))
m.Renderer().AddOptions(renderer.WithNodeRenderers(
util.Prioritized(&HTMLRenderer{
cacheInline: gcache.New(5000).ARC().Build(),
cacheDisplay: gcache.New(5000).ARC().Build(),
gojaVM: vm,
}, 0),
))
}
14 changes: 2 additions & 12 deletions katex.go
Original file line number Diff line number Diff line change
@@ -1,25 +1,15 @@
package katex

import (
_ "embed"
"io"

"github.com/dop251/goja"
)

//go:embed katex.min.js
var katexjs string

func Render(w io.Writer, src []byte, display bool) error {
func Render(w io.Writer, src []byte, display bool, vm *goja.Runtime) error {
var res goja.Value
vm := goja.New()

_, err := vm.RunString(katexjs)
if err != nil {
return err
}

err = vm.Set("expression", string(src))
err := vm.Set("expression", string(src))
if err != nil {
return nil
}
Expand Down
6 changes: 4 additions & 2 deletions katex_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@ import (
"bytes"
"fmt"
"testing"

"github.com/dop251/goja"
)

func ExampleRender() {
b := bytes.Buffer{}
Render(&b, []byte(`Y = A \dot X^2 + B \dot X + C`), false)
Render(&b, []byte(`Y = A \dot X^2 + B \dot X + C`), false, goja.New())
fmt.Println(b.String())

// Output:
Expand All @@ -18,6 +20,6 @@ func ExampleRender() {
func BenchmarkRender(b *testing.B) {
for n := 0; n < b.N; n++ {
b := bytes.Buffer{}
Render(&b, []byte(`Y = A \dot X^2 + B \dot X + C`), false)
Render(&b, []byte(`Y = A \dot X^2 + B \dot X + C`), false, goja.New())
}
}
6 changes: 4 additions & 2 deletions renderer.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"bytes"

"github.com/bluele/gcache"
"github.com/dop251/goja"
"github.com/yuin/goldmark/ast"
"github.com/yuin/goldmark/renderer"
"github.com/yuin/goldmark/renderer/html"
Expand All @@ -15,6 +16,7 @@ type HTMLRenderer struct {

cacheInline gcache.Cache
cacheDisplay gcache.Cache
gojaVM *goja.Runtime
}

func (r *HTMLRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) {
Expand All @@ -35,7 +37,7 @@ func (r *HTMLRenderer) renderInline(w util.BufWriter, source []byte, n ast.Node,

if err == gcache.KeyNotFoundError {
b := bytes.Buffer{}
err = Render(&b, node.Equation, false)
err = Render(&b, node.Equation, false, r.gojaVM)
if err != nil {
return ast.WalkStop, err
}
Expand Down Expand Up @@ -64,7 +66,7 @@ func (r *HTMLRenderer) renderBlock(w util.BufWriter, source []byte, n ast.Node,

if err == gcache.KeyNotFoundError {
b := bytes.Buffer{}
err = Render(&b, node.Equation, true)
err = Render(&b, node.Equation, true, r.gojaVM)
if err != nil {
return ast.WalkStop, err
}
Expand Down

0 comments on commit 14f2cc8

Please sign in to comment.