From 80a117e7b5be669a864a37dd92039c37ca5889ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 7 Aug 2024 10:40:54 +0200 Subject: [PATCH] Add build time math rendering See #11927 --- cache/filecache/filecache_config.go | 12 +- deps/deps.go | 8 + hugolib/site_new.go | 11 + internal/ext/js/greet.bundle.js | 2 - internal/ext/js/greet.js | 9 - internal/ext/js/renderkatex.js | 15 - internal/ext/warpc.go | 401 ------------- internal/ext/warpc_test.go | 364 ------------ internal/ext/wasm/greet.wasm | Bin 1864 -> 0 bytes internal/{ext => warpc}/.DS_Store | Bin internal/{ext => warpc}/build.sh | 0 internal/{ext => warpc}/gen/main.go | 0 internal/{ext => warpc}/js/.gitignore | 0 internal/{ext => warpc}/js/common.js | 0 internal/warpc/js/greet.bundle.js | 2 + internal/warpc/js/greet.js | 9 + internal/{ext => warpc}/js/package.json | 0 .../{ext => warpc}/js/renderkatex.bundle.js | 2 +- internal/warpc/js/renderkatex.js | 12 + internal/{ext => warpc}/katex.go | 25 +- internal/warpc/warpc.go | 552 ++++++++++++++++++ internal/warpc/warpc_test.go | 443 ++++++++++++++ internal/warpc/wasm/greet.wasm | Bin 0 -> 1979 bytes internal/{ext => warpc}/wasm/quickjs.wasm | Bin internal/{ext => warpc}/wasm/renderkatex.wasm | Bin 472172 -> 472269 bytes internal/{ext => warpc}/watchtestscripts.sh | 0 tpl/transform/transform.go | 98 +++- tpl/transform/transform_integration_test.go | 18 + tpl/transform/unmarshal.go | 4 +- 29 files changed, 1146 insertions(+), 841 deletions(-) delete mode 100644 internal/ext/js/greet.bundle.js delete mode 100644 internal/ext/js/greet.js delete mode 100644 internal/ext/js/renderkatex.js delete mode 100644 internal/ext/warpc.go delete mode 100644 internal/ext/warpc_test.go delete mode 100644 internal/ext/wasm/greet.wasm rename internal/{ext => warpc}/.DS_Store (100%) rename internal/{ext => warpc}/build.sh (100%) rename internal/{ext => warpc}/gen/main.go (100%) rename internal/{ext => warpc}/js/.gitignore (100%) rename internal/{ext => warpc}/js/common.js (100%) create mode 100644 internal/warpc/js/greet.bundle.js create mode 100644 internal/warpc/js/greet.js rename internal/{ext => warpc}/js/package.json (100%) rename internal/{ext => warpc}/js/renderkatex.bundle.js (99%) create mode 100644 internal/warpc/js/renderkatex.js rename internal/{ext => warpc}/katex.go (53%) create mode 100644 internal/warpc/warpc.go create mode 100644 internal/warpc/warpc_test.go create mode 100644 internal/warpc/wasm/greet.wasm rename internal/{ext => warpc}/wasm/quickjs.wasm (100%) rename internal/{ext => warpc}/wasm/renderkatex.wasm (86%) rename internal/{ext => warpc}/watchtestscripts.sh (100%) diff --git a/cache/filecache/filecache_config.go b/cache/filecache/filecache_config.go index 6a2b5f3e30a..360c8ac079c 100644 --- a/cache/filecache/filecache_config.go +++ b/cache/filecache/filecache_config.go @@ -46,6 +46,7 @@ const ( CacheKeyAssets = "assets" CacheKeyModules = "modules" CacheKeyGetResource = "getresource" + CacheKeyMisc = "misc" ) type Configs map[string]FileCacheConfig @@ -70,10 +71,14 @@ var defaultCacheConfigs = Configs{ MaxAge: -1, Dir: resourcesGenDir, }, - CacheKeyGetResource: FileCacheConfig{ + CacheKeyGetResource: { MaxAge: -1, // Never expire Dir: cacheDirProject, }, + CacheKeyMisc: { + MaxAge: -1, + Dir: ":cacheDir/misc", + }, } type FileCacheConfig struct { @@ -120,6 +125,11 @@ func (f Caches) AssetsCache() *Cache { return f[CacheKeyAssets] } +// MiscCache gets the file cache for miscellaneous stuff. +func (f Caches) MiscCache() *Cache { + return f[CacheKeyMisc] +} + // GetResourceCache gets the file cache for remote resources. func (f Caches) GetResourceCache() *Cache { return f[CacheKeyGetResource] diff --git a/deps/deps.go b/deps/deps.go index 0d0f283c26a..e137aed7b10 100644 --- a/deps/deps.go +++ b/deps/deps.go @@ -23,6 +23,7 @@ import ( "github.com/gohugoio/hugo/helpers" "github.com/gohugoio/hugo/hugofs" "github.com/gohugoio/hugo/identity" + "github.com/gohugoio/hugo/internal/warpc" "github.com/gohugoio/hugo/media" "github.com/gohugoio/hugo/resources/page" "github.com/gohugoio/hugo/resources/postpub" @@ -93,6 +94,10 @@ type Deps struct { // This is common/global for all sites. BuildState *BuildState + // Holds RPC dispatchers for Katex etc. + // TODO(bep) rethink this re. a plugin setup, but this will have to do for now. + WasmDispatchers *warpc.Dispatchers + *globalErrHandler } @@ -343,6 +348,9 @@ func (d *Deps) Close() error { if d.MemCache != nil { d.MemCache.Stop() } + if d.WasmDispatchers != nil { + d.WasmDispatchers.Close() + } return d.BuildClosers.Close() } diff --git a/hugolib/site_new.go b/hugolib/site_new.go index cb6630cb34a..19a7e42d755 100644 --- a/hugolib/site_new.go +++ b/hugolib/site_new.go @@ -19,6 +19,7 @@ import ( "fmt" "html/template" "os" + "path/filepath" "sort" "time" @@ -34,6 +35,7 @@ import ( "github.com/gohugoio/hugo/hugolib/doctree" "github.com/gohugoio/hugo/hugolib/pagesfromdata" "github.com/gohugoio/hugo/identity" + "github.com/gohugoio/hugo/internal/warpc" "github.com/gohugoio/hugo/langs" "github.com/gohugoio/hugo/langs/i18n" "github.com/gohugoio/hugo/lazy" @@ -157,6 +159,15 @@ func NewHugoSites(cfg deps.DepsCfg) (*HugoSites, error) { MemCache: memCache, TemplateProvider: tplimpl.DefaultTemplateProvider, TranslationProvider: i18n.NewTranslationProvider(), + WasmDispatchers: warpc.AllDispatchers( + warpc.Options{ + CompilationCacheDir: filepath.Join(conf.Dirs().CacheDir, "_warpc"), + + // Katex is relatively slow. + PoolSize: 8, + Infof: logger.InfoCommand("wasm").Logf, + }, + ), } if err := firstSiteDeps.Init(); err != nil { diff --git a/internal/ext/js/greet.bundle.js b/internal/ext/js/greet.bundle.js deleted file mode 100644 index 0237823edcf..00000000000 --- a/internal/ext/js/greet.bundle.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{function f(r){let e=[],i=new Uint8Array(1024);for(;;){let n=0;try{n=Javy.IO.readSync(0,i)}catch(o){if(o.message.includes("os error 29"))break;throw new Error("Error reading from stdin")}if(n<0)throw new Error("Error reading from stdin");if(n===0)break;e=[...e,...i.subarray(0,n)];let t=0;for(let o=0;t { - readInput(greet); -})(); diff --git a/internal/ext/js/renderkatex.js b/internal/ext/js/renderkatex.js deleted file mode 100644 index 206dae8517f..00000000000 --- a/internal/ext/js/renderkatex.js +++ /dev/null @@ -1,15 +0,0 @@ -import { readInput, writeOutput } from './common'; -import katex from 'katex'; - -const render = function (input) { - const expression = input.expression; - const id = input.id; - delete input.expression; - delete input.id; - input.throwOnError = false; - writeOutput({ id: id, output: katex.renderToString(expression, input) }); -}; - -(() => { - readInput(render); -})(); diff --git a/internal/ext/warpc.go b/internal/ext/warpc.go deleted file mode 100644 index ef4c6bd60f6..00000000000 --- a/internal/ext/warpc.go +++ /dev/null @@ -1,401 +0,0 @@ -package ext - -import ( - "context" - _ "embed" - "encoding/json" - "errors" - "fmt" - "io" - "os" - "runtime" - "strings" - "sync" - "sync/atomic" - "time" - - "github.com/gohugoio/hugo/common/hugio" - - "github.com/tetratelabs/wazero" - "github.com/tetratelabs/wazero/api" - "github.com/tetratelabs/wazero/experimental" - "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1" -) - -//go:embed wasm/quickjs.wasm -var quickjsWasm []byte - -type IDGetter interface { - GetID() uint32 -} - -type Dispatcher[Q, R IDGetter] interface { - Execute(ctx context.Context, q Q) (R, error) - Close() error -} - -func (p *dispatcherPool[Q, R]) getDispatcher() *dispatcher[Q, R] { - i := int(p.counter.Add(1)) % len(p.dispatchers) - return p.dispatchers[i] -} - -func (p *dispatcherPool[Q, R]) Close() error { - return p.close() -} - -type dispatcher[Q, R IDGetter] struct { - zero R - counter atomic.Uint32 - - mu sync.RWMutex - encMu sync.Mutex - - pending map[uint32]*call[Q, R] - - inOut *inOut - - shutdown bool - closing bool - - close func() error -} - -type inOut struct { - sync.Mutex - stdin hugio.ReadWriteCloser - stdout hugio.ReadWriteCloser - dec *json.Decoder - enc *json.Encoder -} - -var ErrShutdown = fmt.Errorf("dispatcher is shutting down") - -var timerPool = sync.Pool{} - -func getTimer(d time.Duration) *time.Timer { - if v := timerPool.Get(); v != nil { - timer := v.(*time.Timer) - timer.Reset(d) - return timer - } - return time.NewTimer(d) -} - -func putTimer(t *time.Timer) { - if !t.Stop() { - select { - case <-t.C: - default: - } - } - timerPool.Put(t) -} - -// Execute sends a request to the dispatcher and waits for the response. -func (p *dispatcherPool[Q, R]) Execute(ctx context.Context, q Q) (R, error) { - d := p.getDispatcher() - if q.GetID() == 0 { - return d.zero, errors.New("ID must not be 0 (note that this must be unique within the current request set time window)") - } - - call, err := d.newCall(q) - if err != nil { - return d.zero, err - } - - if err := d.send(call); err != nil { - return d.zero, err - } - - timer := getTimer(30 * time.Second) - defer putTimer(timer) - - select { - case call = <-call.Done: - case <-timer.C: - return d.zero, errors.New("timeout") - } - - if call.Error != nil { - return d.zero, call.Error - } - - return call.Response, nil -} - -func (d *dispatcher[Q, R]) newCall(q Q) (*call[Q, R], error) { - call := &call[Q, R]{ - Done: make(chan *call[Q, R], 1), - Request: q, - } - - if d.shutdown || d.closing { - call.Error = ErrShutdown - call.done() - return call, nil - } - - d.mu.Lock() - d.pending[q.GetID()] = call - d.mu.Unlock() - - return call, nil -} - -func (d *dispatcher[Q, R]) send(call *call[Q, R]) error { - d.mu.RLock() - if d.closing || d.shutdown { - d.mu.RUnlock() - return ErrShutdown - } - d.mu.RUnlock() - - d.encMu.Lock() - defer d.encMu.Unlock() - err := d.inOut.enc.Encode(call.Request) - if err != nil { - return err - } - return nil -} - -func (d *dispatcher[Q, R]) input() { - var inputErr error - - for d.inOut.dec.More() { - var r R - if err := d.inOut.dec.Decode(&r); err != nil { - inputErr = err - break - } - - d.mu.Lock() - call, found := d.pending[r.GetID()] - if !found { - d.mu.Unlock() - panic(fmt.Errorf("call with ID %d not found", r.GetID())) - } - delete(d.pending, r.GetID()) - d.mu.Unlock() - call.Response = r - call.done() - } - - // Terminate pending calls. - d.shutdown = true - if inputErr != nil { - isEOF := inputErr == io.EOF || strings.Contains(inputErr.Error(), "already closed") - if isEOF { - if d.closing { - inputErr = ErrShutdown - } else { - inputErr = io.ErrUnexpectedEOF - } - } - } - - d.mu.Lock() - defer d.mu.Unlock() - for _, call := range d.pending { - call.Error = inputErr - call.done() - } -} - -type call[Q, R any] struct { - Request Q - Response R - Error error - Done chan *call[Q, R] -} - -func (call *call[Q, R]) done() { - select { - case call.Done <- call: - default: - } -} - -type Options struct { - Ctx context.Context - - CompileModule func(ctx context.Context, r wazero.Runtime, io []*inOut) (func() error, error) - CompilationCacheDir string - PoolSize int -} - -func Start[Q, R IDGetter](opts Options) (Dispatcher[Q, R], error) { - if opts.PoolSize == 0 { - opts.PoolSize = 1 - } - - return newDispatcher[Q, R](opts) -} - -type dispatcherPool[Q, R IDGetter] struct { - counter atomic.Uint32 - dispatchers []*dispatcher[Q, R] - close func() error -} - -func newDispatcher[Q, R IDGetter](opts Options) (*dispatcherPool[Q, R], error) { - if opts.Ctx == nil { - opts.Ctx = context.Background() - } - if opts.CompileModule == nil { - return nil, errors.New("InstansiateModule is required") - } - ctx := opts.Ctx - - runtimeConfig := wazero.NewRuntimeConfig() - - if opts.CompilationCacheDir != "" { - compilationCache, err := wazero.NewCompilationCacheWithDir(opts.CompilationCacheDir) - if err != nil { - return nil, err - } - runtimeConfig = runtimeConfig.WithCompilationCache(compilationCache) - } - - // Create a new WebAssembly Runtime. - r := wazero.NewRuntimeWithConfig(opts.Ctx, runtimeConfig) - - // Instantiate WASI, which implements system I/O such as console output. - if _, err := wasi_snapshot_preview1.Instantiate(ctx, r); err != nil { - return nil, err - } - - inOuts := make([]*inOut, opts.PoolSize) - for i := 0; i < opts.PoolSize; i++ { - var stdin, stdout hugio.ReadWriteCloser - - stdin = hugio.NewPipeReadWriteCloser() - stdout = hugio.NewPipeReadWriteCloser() - - inOuts[i] = &inOut{ - stdin: stdin, - stdout: stdout, - dec: json.NewDecoder(stdout), - enc: json.NewEncoder(stdin), - } - } - - run, err := opts.CompileModule(ctx, r, inOuts) - if err != nil { - return nil, err - } - - done := make(chan struct{}) - go func() { - // This will block until stdin is closed. - err := run() - if err != nil { - panic(err) - } - close(done) - }() - - dispatchers := make([]*dispatcher[Q, R], len(inOuts)) - for i := 0; i < len(inOuts); i++ { - d := &dispatcher[Q, R]{ - pending: make(map[uint32]*call[Q, R]), - inOut: inOuts[i], - } - go d.input() - dispatchers[i] = d - } - - close := func() error { - for _, d := range dispatchers { - d.closing = true - if err := d.inOut.stdin.Close(); err != nil { - return err - } - if err := d.inOut.stdout.Close(); err != nil { - return err - } - } - - // We need to wait for the WebAssembly instances to finish executing before we can close the runtime. - <-done - - return r.Close(ctx) - } - - dp := &dispatcherPool[Q, R]{ - dispatchers: dispatchers, - close: close, - } - - return dp, nil -} - -func printStackTrace(w io.Writer) { - buf := make([]byte, 1<<16) - runtime.Stack(buf, true) - fmt.Fprintf(w, "%s", buf) -} - -func compileFunc(name string, wasm []byte, needsQuickJSProvider bool) func(ctx context.Context, r wazero.Runtime, inouts []*inOut) (func() error, error) { - return func(ctx context.Context, r wazero.Runtime, inouts []*inOut) (func() error, error) { - compiledModule, err := r.CompileModule(ctx, wasm) - if err != nil { - return nil, err - } - - var compiledQuickJS wazero.CompiledModule - if needsQuickJSProvider { - compiledQuickJS, err = r.CompileModule(ctx, quickjsWasm) - if err != nil { - return nil, err - } - } - - return func() error { - var wg sync.WaitGroup - for i, c := range inouts { - name := fmt.Sprintf("%s_%d", name, i) - c := c - - wg.Add(1) - go func() { - defer wg.Done() - configBase := wazero.NewModuleConfig().WithStderr(os.Stderr).WithStartFunctions() - config := configBase.WithName(name) - if needsQuickJSProvider { - // TODO1 else, configure with stdout etc. - qmod, err := r.InstantiateModule(ctx, compiledQuickJS, configBase.WithName("").WithStdout(c.stdout).WithStdin(c.stdin)) - if err != nil { - panic(err) - } - ctx = experimental.WithImportResolver(ctx, - func(name string) api.Module { - if name == "javy_quickjs_provider_v2" { - return qmod - } - return nil - }) - - } - - mod, err := r.InstantiateModule(ctx, compiledModule, config) - if err != nil { - panic(err) - } - if _, err := mod.ExportedFunction("_start").Call(ctx); err != nil { - panic(err) - } - }() - } - wg.Wait() - return nil - }, nil - } -} - -// TODO1 notes -/* - -QuickJS native JSON intrinsic https://github.com/bytecodealliance/javy/blob/main/crates/javy/src/config.rs -Whether to override the implementation of JSON.parse and JSON.stringify -*/ diff --git a/internal/ext/warpc_test.go b/internal/ext/warpc_test.go deleted file mode 100644 index 5ce28706de2..00000000000 --- a/internal/ext/warpc_test.go +++ /dev/null @@ -1,364 +0,0 @@ -package ext - -import ( - "context" - _ "embed" - "fmt" - "sync" - "sync/atomic" - "testing" -) - -//go:embed wasm/greet.wasm -var greetWasm []byte - -type person struct { - ID uint32 `json:"id"` - Name string `json:"name"` -} - -func (p person) GetID() uint32 { - return p.ID -} - -func TestKatex(t *testing.T) { - opts := Options{ - CompileModule: compileFunc("renderkatex", katexWasm, true), - } - - d, err := Start[KatexInput, KatexOutput](opts) - if err != nil { - t.Fatal(err) - } - defer d.Close() - - ctx := context.Background() - - input := KatexInput{ - ID: uint32(32), - Expression: "c = \\pm\\sqrt{a^2 + b^2}", - DisplayMode: true, - } - - result, err := d.Execute(ctx, input) - if err != nil { - t.Fatal(err) - } - - if result.ID != input.ID { - t.Fatalf("%d vs %d", result.ID, input.ID) - } -} - -func TestGreet(t *testing.T) { - opts := Options{ - CompileModule: compileFunc("greet", greetWasm, true), - PoolSize: 2, - } - - d, err := Start[person, greeting](opts) - if err != nil { - t.Fatal(err) - } - defer d.Close() - - ctx := context.Background() - - inputPerson := person{ - Name: "Person", - } - - for i := 0; i < 20; i++ { - inputPerson.ID = uint32(i + 1) - g, err := d.Execute(ctx, inputPerson) - if err != nil { - t.Fatal(err) - } - if g.Greeting != "Hello Person!" { - t.Fatalf("got: %v", g) - } - if g.ID != inputPerson.ID { - t.Fatalf("%d vs %d", g.ID, inputPerson.ID) - } - - } -} - -func TestGreetParallel(t *testing.T) { - opts := Options{ - CompileModule: compileFunc("greet", greetWasm, true), - PoolSize: 4, - } - d, err := Start[*person, greeting](opts) - if err != nil { - t.Fatal(err) - } - defer d.Close() - - var wg sync.WaitGroup - - for i := 1; i <= 10; i++ { - wg.Add(1) - go func(i int) { - defer wg.Done() - - ctx := context.Background() - - for j := 0; j < 5; j++ { - base := i * 100 - id := uint32(base + j) - - inputPerson := &person{ - Name: fmt.Sprintf("Person %d", id), - ID: id, - } - g, err := d.Execute(ctx, inputPerson) - if err != nil { - t.Error(err) - return - } - if g.Greeting != fmt.Sprintf("Hello Person %d!", id) { - t.Errorf("got: %v", g) - return - } - if g.ID != inputPerson.ID { - t.Errorf("%d vs %d", g.ID, inputPerson.ID) - return - } - } - }(i) - - } - - wg.Wait() -} - -func TestKatexParallel(t *testing.T) { - opts := Options{ - CompileModule: compileFunc("katex", katexWasm, true), - PoolSize: 6, - } - d, err := Start[KatexInput, KatexOutput](opts) - if err != nil { - t.Fatal(err) - } - defer d.Close() - - var wg sync.WaitGroup - - for i := 1; i <= 10; i++ { - wg.Add(1) - go func(i int) { - defer wg.Done() - - ctx := context.Background() - - for j := 0; j < 1; j++ { - base := i * 100 - id := uint32(base + j) - - input := katexInputTemplate - input.ID = id - - result, err := d.Execute(ctx, input) - if err != nil { - t.Error(err) - return - } - - if result.ID != input.ID { - t.Errorf("%d vs %d", result.ID, input.ID) - return - } - } - }(i) - - } - - wg.Wait() -} - -func BenchmarkExecuteKatex(b *testing.B) { - opts := Options{ - CompileModule: compileFunc("katex", katexWasm, true), - } - d, err := Start[*KatexInput, KatexOutput](opts) - if err != nil { - b.Fatal(err) - } - defer d.Close() - - ctx := context.Background() - - input := &katexInputTemplate - - b.ResetTimer() - for i := 0; i < b.N; i++ { - input.ID = uint32(i + 1) - result, err := d.Execute(ctx, input) - if err != nil { - b.Fatal(err) - } - - if result.ID != input.ID { - b.Fatalf("%d vs %d", result.ID, input.ID) - } - - } -} - -func BenchmarkKatexStartStop(b *testing.B) { - optsTemplate := Options{ - CompileModule: compileFunc("katex", katexWasm, true), - CompilationCacheDir: b.TempDir(), - } - - runBench := func(b *testing.B, opts Options) { - for i := 0; i < b.N; i++ { - d, err := Start[KatexInput, KatexOutput](opts) - if err != nil { - b.Fatal(err) - } - if err := d.Close(); err != nil { - b.Fatal(err) - } - } - } - - for _, poolSize := range []int{1, 8, 16} { - - name := fmt.Sprintf("PoolSize%d", poolSize) - - b.Run(name, func(b *testing.B) { - opts := optsTemplate - opts.PoolSize = poolSize - runBench(b, opts) - }) - - } -} - -var katexInputTemplate = KatexInput{ - Expression: "c = \\pm\\sqrt{a^2 + b^2}", - DisplayMode: true, - Output: "html", -} - -func BenchmarkExecuteKatexPara(b *testing.B) { - optsTemplate := Options{ - CompileModule: compileFunc("katex", katexWasm, true), - } - - runBench := func(b *testing.B, opts Options) { - d, err := Start[KatexInput, KatexOutput](opts) - if err != nil { - b.Fatal(err) - } - defer d.Close() - - ctx := context.Background() - - b.ResetTimer() - - var id atomic.Uint32 - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - input := katexInputTemplate - input.ID = id.Add(1) - result, err := d.Execute(ctx, input) - if err != nil { - b.Fatal(err) - } - if result.ID != input.ID { - b.Fatalf("%d vs %d", result.ID, input.ID) - } - } - }) - } - - for _, poolSize := range []int{1, 8, 16} { - name := fmt.Sprintf("PoolSize%d", poolSize) - - b.Run(name, func(b *testing.B) { - opts := optsTemplate - opts.PoolSize = poolSize - runBench(b, opts) - }) - } -} - -func BenchmarkExecuteGreet(b *testing.B) { - opts := Options{ - CompileModule: compileFunc("greet", greetWasm, true), - } - d, err := Start[*person, greeting](opts) - if err != nil { - b.Fatal(err) - } - defer d.Close() - - ctx := context.Background() - - input := &person{ - Name: "Person", - } - - b.ResetTimer() - for i := 0; i < b.N; i++ { - input.ID = uint32(i + 1) - result, err := d.Execute(ctx, input) - if err != nil { - b.Fatal(err) - } - - if result.ID != input.ID { - b.Fatalf("%d vs %d", result.ID, input.ID) - } - - } -} - -func BenchmarkExecuteGreetPara(b *testing.B) { - opts := Options{ - CompileModule: compileFunc("greet", greetWasm, true), - PoolSize: 8, - } - - d, err := Start[person, greeting](opts) - if err != nil { - b.Fatal(err) - } - defer d.Close() - - ctx := context.Background() - - inputTemplate := person{ - Name: "Person", - } - - b.ResetTimer() - - var id atomic.Uint32 - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - input := inputTemplate - input.ID = id.Add(1) - result, err := d.Execute(ctx, input) - if err != nil { - b.Fatal(err) - } - if result.ID != input.ID { - b.Fatalf("%d vs %d", result.ID, input.ID) - } - } - }) -} - -type greeting struct { - ID uint32 `json:"id"` - Greeting string `json:"greeting"` -} - -func (g greeting) GetID() uint32 { - return g.ID -} diff --git a/internal/ext/wasm/greet.wasm b/internal/ext/wasm/greet.wasm deleted file mode 100644 index 77cf5906a8abb0ae6d9f385e76ddafebb5c14cb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1864 zcmZ`(X>e0j6h8Of_g<2hG$h?9ix>(rmZb}e24RpE5WzAm1%`FnmzS54(j@p^(pnHY z0uF;9jt=__Wo!9?jG`>9h_Yx0=q6GIvB=V@qobu*c8~$jO<_=H$a3zvXZ_B(=Uz~Z z0098vWO)F2w6qlRgi`#FQo4jC6(~g|xo<}N>ihyDcYz)%@_RKsw`gF3ssuwpzp51G zDjt8Xt|^6uArs>ur!-Ov)JYHx){M@!Xh-smbDTus%eYD|!KLAPnqHP#60 z7}f79p>k}o?hk7mhv4_xUe~a#F51(PuWMQuZDLL`JS+g4OCsgba|0rSxs|3IhrjGn z>Pbc@Ndns0YNHbB8Bk!ctcH8lF(4xwxa2t09w&9j>4e`pT-h*2EY?&MLZoVlk5I5{ogpuCN%h zOCg{D^Z}@Ke~gKoM?vUGpiU7$p-@>LNJgQ%9ZBYOBw06*RC);Xrr=a5*zIkp4S~KW ztjQeA^*50Sw~+KE(8}y7?#;+Mh1*CmY+9NJgO;~C{wLAXU?`h3b%%GS+k+?4FE_!=JuB4$haAYHYy>xjcCgR5&5!gek=KXqcAuDAPFy;*#dG>wAGRf*0C_sf)A}XqH4N9&4o%ZKceJo zM8txarWMO(U|;9Qz?9WBRU}LpGeMkXOW4{d}u>K-sP%Tkr2Xnx4G3U|-*JTdw)G z=3lRCD45i(i*jmb)z}aFLHP;mg(8zBt+aoa#<%^$#U7uhJ^#yyRDJh`ueU`q-Z^mi zk+geHdE*PGPaJ$T;o6v%tIap!Z%^v-!PqOazg<=Au+AIQ(q+?opQhZYUzWA@#P)U9 z;#b%%EpBTVIb>P?Gn2>l+duq|oxw|)8>ek_4vU@q?)mikRpUK5t&6`e8fJAbuMy@n z&CS|zbyh|5jM~+YTJELH+F5+mm>D~H?#hZ+9G6FT(!X=O|9jW^>Fd8_o7e1_WBq1D z&5k8y>qdO$yKUL)o^)ARH7_naFL~uBq2XVx_Z_=1!5BTe&HqyK(7oLUkG|OH=)&Tq z%NGv%aa;4R(-!S-I$Jomc1mEzt<}0K??B=F=9W&4Q|~St+Q--4?4CAp+^~uqWy_WQ QhjLy%Jk!LQ-slhi0B`>1KL7v# diff --git a/internal/ext/.DS_Store b/internal/warpc/.DS_Store similarity index 100% rename from internal/ext/.DS_Store rename to internal/warpc/.DS_Store diff --git a/internal/ext/build.sh b/internal/warpc/build.sh similarity index 100% rename from internal/ext/build.sh rename to internal/warpc/build.sh diff --git a/internal/ext/gen/main.go b/internal/warpc/gen/main.go similarity index 100% rename from internal/ext/gen/main.go rename to internal/warpc/gen/main.go diff --git a/internal/ext/js/.gitignore b/internal/warpc/js/.gitignore similarity index 100% rename from internal/ext/js/.gitignore rename to internal/warpc/js/.gitignore diff --git a/internal/ext/js/common.js b/internal/warpc/js/common.js similarity index 100% rename from internal/ext/js/common.js rename to internal/warpc/js/common.js diff --git a/internal/warpc/js/greet.bundle.js b/internal/warpc/js/greet.bundle.js new file mode 100644 index 00000000000..c1b9c5264b0 --- /dev/null +++ b/internal/warpc/js/greet.bundle.js @@ -0,0 +1,2 @@ +(()=>{function i(r){let e=[],a=new Uint8Array(1024);for(;;){let n=0;try{n=Javy.IO.readSync(0,a)}catch(o){if(o.message.includes("os error 29"))break;throw new Error("Error reading from stdin")}if(n<0)throw new Error("Error reading from stdin");if(n===0)break;e=[...e,...a.subarray(0,n)];let t=0;for(let o=0;t0;)this.endGroup()}has(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)}get(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]}set(e,t,a){if(a===void 0&&(a=!1),a){for(var n=0;n0&&(this.undefStack[this.undefStack.length-1][e]=t)}else{var s=this.undefStack[this.undefStack.length-1];s&&!s.hasOwnProperty(e)&&(s[e]=this.current[e])}t==null?delete this.current[e]:this.current[e]=t}},u4=_r;m("\\noexpand",function(r){var e=r.popToken();return r.isExpandable(e.text)&&(e.noexpand=!0,e.treatAsRelax=!0),{tokens:[e],numArgs:0}});m("\\expandafter",function(r){var e=r.popToken();return r.expandOnce(!0),{tokens:[e],numArgs:0}});m("\\@firstoftwo",function(r){var e=r.consumeArgs(2);return{tokens:e[0],numArgs:0}});m("\\@secondoftwo",function(r){var e=r.consumeArgs(2);return{tokens:e[1],numArgs:0}});m("\\@ifnextchar",function(r){var e=r.consumeArgs(3);r.consumeSpaces();var t=r.future();return e[0].length===1&&e[0][0].text===t.text?{tokens:e[1],numArgs:0}:{tokens:e[2],numArgs:0}});m("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}");m("\\TextOrMath",function(r){var e=r.consumeArgs(2);return r.mode==="text"?{tokens:e[0],numArgs:0}:{tokens:e[1],numArgs:0}});var gr={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};m("\\char",function(r){var e=r.popToken(),t,a="";if(e.text==="'")t=8,e=r.popToken();else if(e.text==='"')t=16,e=r.popToken();else if(e.text==="`")if(e=r.popToken(),e.text[0]==="\\")a=e.text.charCodeAt(1);else{if(e.text==="EOF")throw new M("\\char` missing argument");a=e.text.charCodeAt(0)}else t=10;if(t){if(a=gr[e.text],a==null||a>=t)throw new M("Invalid base-"+t+" digit "+e.text);for(var n;(n=gr[r.future().text])!=null&&n{var a=r.consumeArg().tokens;if(a.length!==1)throw new M("\\newcommand's first argument must be a macro name");var n=a[0].text,s=r.isDefined(n);if(s&&!e)throw new M("\\newcommand{"+n+"} attempting to redefine "+(n+"; use \\renewcommand"));if(!s&&!t)throw new M("\\renewcommand{"+n+"} when command "+n+" does not yet exist; use \\newcommand");var o=0;if(a=r.consumeArg().tokens,a.length===1&&a[0].text==="["){for(var h="",c=r.expandNextToken();c.text!=="]"&&c.text!=="EOF";)h+=c.text,c=r.expandNextToken();if(!h.match(/^\s*[0-9]+\s*$/))throw new M("Invalid number of arguments: "+h);o=parseInt(h),a=r.consumeArg().tokens}return r.macros.set(n,{tokens:a,numArgs:o}),""};m("\\newcommand",r=>It(r,!1,!0));m("\\renewcommand",r=>It(r,!0,!1));m("\\providecommand",r=>It(r,!0,!0));m("\\message",r=>{var e=r.consumeArgs(1)[0];return console.log(e.reverse().map(t=>t.text).join("")),""});m("\\errmessage",r=>{var e=r.consumeArgs(1)[0];return console.error(e.reverse().map(t=>t.text).join("")),""});m("\\show",r=>{var e=r.popToken(),t=e.text;return console.log(e,r.macros.get(t),L0[t],$.math[t],$.text[t]),""});m("\\bgroup","{");m("\\egroup","}");m("~","\\nobreakspace");m("\\lq","`");m("\\rq","'");m("\\aa","\\r a");m("\\AA","\\r A");m("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`\xA9}");m("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}");m("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xAE}");m("\u212C","\\mathscr{B}");m("\u2130","\\mathscr{E}");m("\u2131","\\mathscr{F}");m("\u210B","\\mathscr{H}");m("\u2110","\\mathscr{I}");m("\u2112","\\mathscr{L}");m("\u2133","\\mathscr{M}");m("\u211B","\\mathscr{R}");m("\u212D","\\mathfrak{C}");m("\u210C","\\mathfrak{H}");m("\u2128","\\mathfrak{Z}");m("\\Bbbk","\\Bbb{k}");m("\xB7","\\cdotp");m("\\llap","\\mathllap{\\textrm{#1}}");m("\\rlap","\\mathrlap{\\textrm{#1}}");m("\\clap","\\mathclap{\\textrm{#1}}");m("\\mathstrut","\\vphantom{(}");m("\\underbar","\\underline{\\text{#1}}");m("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}');m("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`\u2260}}");m("\\ne","\\neq");m("\u2260","\\neq");m("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`\u2209}}");m("\u2209","\\notin");m("\u2258","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`\u2258}}");m("\u2259","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}");m("\u225A","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225A}}");m("\u225B","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`\u225B}}");m("\u225D","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`\u225D}}");m("\u225E","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`\u225E}}");m("\u225F","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225F}}");m("\u27C2","\\perp");m("\u203C","\\mathclose{!\\mkern-0.8mu!}");m("\u220C","\\notni");m("\u231C","\\ulcorner");m("\u231D","\\urcorner");m("\u231E","\\llcorner");m("\u231F","\\lrcorner");m("\xA9","\\copyright");m("\xAE","\\textregistered");m("\uFE0F","\\textregistered");m("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}');m("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}');m("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}');m("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}');m("\\vdots","\\mathord{\\varvdots\\rule{0pt}{15pt}}");m("\u22EE","\\vdots");m("\\varGamma","\\mathit{\\Gamma}");m("\\varDelta","\\mathit{\\Delta}");m("\\varTheta","\\mathit{\\Theta}");m("\\varLambda","\\mathit{\\Lambda}");m("\\varXi","\\mathit{\\Xi}");m("\\varPi","\\mathit{\\Pi}");m("\\varSigma","\\mathit{\\Sigma}");m("\\varUpsilon","\\mathit{\\Upsilon}");m("\\varPhi","\\mathit{\\Phi}");m("\\varPsi","\\mathit{\\Psi}");m("\\varOmega","\\mathit{\\Omega}");m("\\substack","\\begin{subarray}{c}#1\\end{subarray}");m("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax");m("\\boxed","\\fbox{$\\displaystyle{#1}$}");m("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;");m("\\implies","\\DOTSB\\;\\Longrightarrow\\;");m("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;");var br={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};m("\\dots",function(r){var e="\\dotso",t=r.expandAfterFuture().text;return t in br?e=br[t]:(t.slice(0,4)==="\\not"||t in $.math&&N.contains(["bin","rel"],$.math[t].group))&&(e="\\dotsb"),e});var Ot={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};m("\\dotso",function(r){var e=r.future().text;return e in Ot?"\\ldots\\,":"\\ldots"});m("\\dotsc",function(r){var e=r.future().text;return e in Ot&&e!==","?"\\ldots\\,":"\\ldots"});m("\\cdots",function(r){var e=r.future().text;return e in Ot?"\\@cdots\\,":"\\@cdots"});m("\\dotsb","\\cdots");m("\\dotsm","\\cdots");m("\\dotsi","\\!\\cdots");m("\\dotsx","\\ldots\\,");m("\\DOTSI","\\relax");m("\\DOTSB","\\relax");m("\\DOTSX","\\relax");m("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax");m("\\,","\\tmspace+{3mu}{.1667em}");m("\\thinspace","\\,");m("\\>","\\mskip{4mu}");m("\\:","\\tmspace+{4mu}{.2222em}");m("\\medspace","\\:");m("\\;","\\tmspace+{5mu}{.2777em}");m("\\thickspace","\\;");m("\\!","\\tmspace-{3mu}{.1667em}");m("\\negthinspace","\\!");m("\\negmedspace","\\tmspace-{4mu}{.2222em}");m("\\negthickspace","\\tmspace-{5mu}{.277em}");m("\\enspace","\\kern.5em ");m("\\enskip","\\hskip.5em\\relax");m("\\quad","\\hskip1em\\relax");m("\\qquad","\\hskip2em\\relax");m("\\tag","\\@ifstar\\tag@literal\\tag@paren");m("\\tag@paren","\\tag@literal{({#1})}");m("\\tag@literal",r=>{if(r.macros.get("\\df@tag"))throw new M("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"});m("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}");m("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)");m("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}");m("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1");m("\\newline","\\\\\\relax");m("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");var ma=A(k0["Main-Regular"][84][1]-.7*k0["Main-Regular"][65][1]);m("\\LaTeX","\\textrm{\\html@mathml{"+("L\\kern-.36em\\raisebox{"+ma+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{LaTeX}}");m("\\KaTeX","\\textrm{\\html@mathml{"+("K\\kern-.17em\\raisebox{"+ma+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{KaTeX}}");m("\\hspace","\\@ifstar\\@hspacer\\@hspace");m("\\@hspace","\\hskip #1\\relax");m("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax");m("\\ordinarycolon",":");m("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}");m("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}');m("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}');m("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}');m("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}');m("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}');m("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}');m("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}');m("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}');m("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}');m("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}');m("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}');m("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}');m("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}');m("\u2237","\\dblcolon");m("\u2239","\\eqcolon");m("\u2254","\\coloneqq");m("\u2255","\\eqqcolon");m("\u2A74","\\Coloneqq");m("\\ratio","\\vcentcolon");m("\\coloncolon","\\dblcolon");m("\\colonequals","\\coloneqq");m("\\coloncolonequals","\\Coloneqq");m("\\equalscolon","\\eqqcolon");m("\\equalscoloncolon","\\Eqqcolon");m("\\colonminus","\\coloneq");m("\\coloncolonminus","\\Coloneq");m("\\minuscolon","\\eqcolon");m("\\minuscoloncolon","\\Eqcolon");m("\\coloncolonapprox","\\Colonapprox");m("\\coloncolonsim","\\Colonsim");m("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}");m("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}");m("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}");m("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}");m("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220C}}");m("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}");m("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}");m("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}");m("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}");m("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}");m("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}");m("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}");m("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}");m("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}");m("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}");m("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}");m("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}");m("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}");m("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}");m("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}");m("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}");m("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}");m("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}");m("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228A}");m("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2ACB}");m("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228B}");m("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2ACC}");m("\\imath","\\html@mathml{\\@imath}{\u0131}");m("\\jmath","\\html@mathml{\\@jmath}{\u0237}");m("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27E6}}");m("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27E7}}");m("\u27E6","\\llbracket");m("\u27E7","\\rrbracket");m("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}");m("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}");m("\u2983","\\lBrace");m("\u2984","\\rBrace");m("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29B5}}");m("\u29B5","\\minuso");m("\\darr","\\downarrow");m("\\dArr","\\Downarrow");m("\\Darr","\\Downarrow");m("\\lang","\\langle");m("\\rang","\\rangle");m("\\uarr","\\uparrow");m("\\uArr","\\Uparrow");m("\\Uarr","\\Uparrow");m("\\N","\\mathbb{N}");m("\\R","\\mathbb{R}");m("\\Z","\\mathbb{Z}");m("\\alef","\\aleph");m("\\alefsym","\\aleph");m("\\Alpha","\\mathrm{A}");m("\\Beta","\\mathrm{B}");m("\\bull","\\bullet");m("\\Chi","\\mathrm{X}");m("\\clubs","\\clubsuit");m("\\cnums","\\mathbb{C}");m("\\Complex","\\mathbb{C}");m("\\Dagger","\\ddagger");m("\\diamonds","\\diamondsuit");m("\\empty","\\emptyset");m("\\Epsilon","\\mathrm{E}");m("\\Eta","\\mathrm{H}");m("\\exist","\\exists");m("\\harr","\\leftrightarrow");m("\\hArr","\\Leftrightarrow");m("\\Harr","\\Leftrightarrow");m("\\hearts","\\heartsuit");m("\\image","\\Im");m("\\infin","\\infty");m("\\Iota","\\mathrm{I}");m("\\isin","\\in");m("\\Kappa","\\mathrm{K}");m("\\larr","\\leftarrow");m("\\lArr","\\Leftarrow");m("\\Larr","\\Leftarrow");m("\\lrarr","\\leftrightarrow");m("\\lrArr","\\Leftrightarrow");m("\\Lrarr","\\Leftrightarrow");m("\\Mu","\\mathrm{M}");m("\\natnums","\\mathbb{N}");m("\\Nu","\\mathrm{N}");m("\\Omicron","\\mathrm{O}");m("\\plusmn","\\pm");m("\\rarr","\\rightarrow");m("\\rArr","\\Rightarrow");m("\\Rarr","\\Rightarrow");m("\\real","\\Re");m("\\reals","\\mathbb{R}");m("\\Reals","\\mathbb{R}");m("\\Rho","\\mathrm{P}");m("\\sdot","\\cdot");m("\\sect","\\S");m("\\spades","\\spadesuit");m("\\sub","\\subset");m("\\sube","\\subseteq");m("\\supe","\\supseteq");m("\\Tau","\\mathrm{T}");m("\\thetasym","\\vartheta");m("\\weierp","\\wp");m("\\Zeta","\\mathrm{Z}");m("\\argmin","\\DOTSB\\operatorname*{arg\\,min}");m("\\argmax","\\DOTSB\\operatorname*{arg\\,max}");m("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits");m("\\bra","\\mathinner{\\langle{#1}|}");m("\\ket","\\mathinner{|{#1}\\rangle}");m("\\braket","\\mathinner{\\langle{#1}\\rangle}");m("\\Bra","\\left\\langle#1\\right|");m("\\Ket","\\left|#1\\right\\rangle");var ca=r=>e=>{var t=e.consumeArg().tokens,a=e.consumeArg().tokens,n=e.consumeArg().tokens,s=e.consumeArg().tokens,o=e.macros.get("|"),h=e.macros.get("\\|");e.macros.beginGroup();var c=y=>w=>{r&&(w.macros.set("|",o),n.length&&w.macros.set("\\|",h));var x=y;if(!y&&n.length){var z=w.future();z.text==="|"&&(w.popToken(),x=!0)}return{tokens:x?n:a,numArgs:0}};e.macros.set("|",c(!1)),n.length&&e.macros.set("\\|",c(!0));var p=e.consumeArg().tokens,g=e.expandTokens([...s,...p,...t]);return e.macros.endGroup(),{tokens:g.reverse(),numArgs:0}};m("\\bra@ket",ca(!1));m("\\bra@set",ca(!0));m("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}");m("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}");m("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}");m("\\angln","{\\angl n}");m("\\blue","\\textcolor{##6495ed}{#1}");m("\\orange","\\textcolor{##ffa500}{#1}");m("\\pink","\\textcolor{##ff00af}{#1}");m("\\red","\\textcolor{##df0030}{#1}");m("\\green","\\textcolor{##28ae7b}{#1}");m("\\gray","\\textcolor{gray}{#1}");m("\\purple","\\textcolor{##9d38bd}{#1}");m("\\blueA","\\textcolor{##ccfaff}{#1}");m("\\blueB","\\textcolor{##80f6ff}{#1}");m("\\blueC","\\textcolor{##63d9ea}{#1}");m("\\blueD","\\textcolor{##11accd}{#1}");m("\\blueE","\\textcolor{##0c7f99}{#1}");m("\\tealA","\\textcolor{##94fff5}{#1}");m("\\tealB","\\textcolor{##26edd5}{#1}");m("\\tealC","\\textcolor{##01d1c1}{#1}");m("\\tealD","\\textcolor{##01a995}{#1}");m("\\tealE","\\textcolor{##208170}{#1}");m("\\greenA","\\textcolor{##b6ffb0}{#1}");m("\\greenB","\\textcolor{##8af281}{#1}");m("\\greenC","\\textcolor{##74cf70}{#1}");m("\\greenD","\\textcolor{##1fab54}{#1}");m("\\greenE","\\textcolor{##0d923f}{#1}");m("\\goldA","\\textcolor{##ffd0a9}{#1}");m("\\goldB","\\textcolor{##ffbb71}{#1}");m("\\goldC","\\textcolor{##ff9c39}{#1}");m("\\goldD","\\textcolor{##e07d10}{#1}");m("\\goldE","\\textcolor{##a75a05}{#1}");m("\\redA","\\textcolor{##fca9a9}{#1}");m("\\redB","\\textcolor{##ff8482}{#1}");m("\\redC","\\textcolor{##f9685d}{#1}");m("\\redD","\\textcolor{##e84d39}{#1}");m("\\redE","\\textcolor{##bc2612}{#1}");m("\\maroonA","\\textcolor{##ffbde0}{#1}");m("\\maroonB","\\textcolor{##ff92c6}{#1}");m("\\maroonC","\\textcolor{##ed5fa6}{#1}");m("\\maroonD","\\textcolor{##ca337c}{#1}");m("\\maroonE","\\textcolor{##9e034e}{#1}");m("\\purpleA","\\textcolor{##ddd7ff}{#1}");m("\\purpleB","\\textcolor{##c6b9fc}{#1}");m("\\purpleC","\\textcolor{##aa87ff}{#1}");m("\\purpleD","\\textcolor{##7854ab}{#1}");m("\\purpleE","\\textcolor{##543b78}{#1}");m("\\mintA","\\textcolor{##f5f9e8}{#1}");m("\\mintB","\\textcolor{##edf2df}{#1}");m("\\mintC","\\textcolor{##e0e5cc}{#1}");m("\\grayA","\\textcolor{##f6f7f7}{#1}");m("\\grayB","\\textcolor{##f0f1f2}{#1}");m("\\grayC","\\textcolor{##e3e5e6}{#1}");m("\\grayD","\\textcolor{##d6d8da}{#1}");m("\\grayE","\\textcolor{##babec2}{#1}");m("\\grayF","\\textcolor{##888d93}{#1}");m("\\grayG","\\textcolor{##626569}{#1}");m("\\grayH","\\textcolor{##3b3e40}{#1}");m("\\grayI","\\textcolor{##21242c}{#1}");m("\\kaBlue","\\textcolor{##314453}{#1}");m("\\kaGreen","\\textcolor{##71B307}{#1}");var da={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},xt=class{constructor(e,t,a){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=t,this.expansionCount=0,this.feed(e),this.macros=new yt(u4,t.macros),this.mode=a,this.stack=[]}feed(e){this.lexer=new Le(e,this.settings)}switchMode(e){this.mode=e}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}endGroups(){this.macros.endGroups()}future(){return this.stack.length===0&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(e){this.stack.push(e)}pushTokens(e){this.stack.push(...e)}scanArgument(e){var t,a,n;if(e){if(this.consumeSpaces(),this.future().text!=="[")return null;t=this.popToken(),{tokens:n,end:a}=this.consumeArg(["]"])}else({tokens:n,start:t,end:a}=this.consumeArg());return this.pushToken(new p0("EOF",a.loc)),this.pushTokens(n),t.range(a,"")}consumeSpaces(){for(;;){var e=this.future();if(e.text===" ")this.stack.pop();else break}}consumeArg(e){var t=[],a=e&&e.length>0;a||this.consumeSpaces();var n=this.future(),s,o=0,h=0;do{if(s=this.popToken(),t.push(s),s.text==="{")++o;else if(s.text==="}"){if(--o,o===-1)throw new M("Extra }",s)}else if(s.text==="EOF")throw new M("Unexpected end of input in a macro argument, expected '"+(e&&a?e[h]:"}")+"'",s);if(e&&a)if((o===0||o===1&&e[h]==="{")&&s.text===e[h]){if(++h,h===e.length){t.splice(-h,h);break}}else h=0}while(o!==0||a);return n.text==="{"&&t[t.length-1].text==="}"&&(t.pop(),t.shift()),t.reverse(),{tokens:t,start:n,end:s}}consumeArgs(e,t){if(t){if(t.length!==e+1)throw new M("The length of delimiters doesn't match the number of args!");for(var a=t[0],n=0;nthis.settings.maxExpand)throw new M("Too many expansions: infinite loop or need to increase maxExpand setting")}expandOnce(e){var t=this.popToken(),a=t.text,n=t.noexpand?null:this._getExpansion(a);if(n==null||e&&n.unexpandable){if(e&&n==null&&a[0]==="\\"&&!this.isDefined(a))throw new M("Undefined control sequence: "+a);return this.pushToken(t),!1}this.countExpansion(1);var s=n.tokens,o=this.consumeArgs(n.numArgs,n.delimiters);if(n.numArgs){s=s.slice();for(var h=s.length-1;h>=0;--h){var c=s[h];if(c.text==="#"){if(h===0)throw new M("Incomplete placeholder at end of macro body",c);if(c=s[--h],c.text==="#")s.splice(h+1,1);else if(/^[1-9]$/.test(c.text))s.splice(h,2,...o[+c.text-1]);else throw new M("Not a valid argument number",c)}}}return this.pushTokens(s),s.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;)if(this.expandOnce()===!1){var e=this.stack.pop();return e.treatAsRelax&&(e.text="\\relax"),e}throw new Error}expandMacro(e){return this.macros.has(e)?this.expandTokens([new p0(e)]):void 0}expandTokens(e){var t=[],a=this.stack.length;for(this.pushTokens(e);this.stack.length>a;)if(this.expandOnce(!0)===!1){var n=this.stack.pop();n.treatAsRelax&&(n.noexpand=!1,n.treatAsRelax=!1),t.push(n)}return this.countExpansion(t.length),t}expandMacroAsText(e){var t=this.expandMacro(e);return t&&t.map(a=>a.text).join("")}_getExpansion(e){var t=this.macros.get(e);if(t==null)return t;if(e.length===1){var a=this.lexer.catcodes[e];if(a!=null&&a!==13)return}var n=typeof t=="function"?t(this):t;if(typeof n=="string"){var s=0;if(n.indexOf("#")!==-1)for(var o=n.replace(/##/g,"");o.indexOf("#"+(s+1))!==-1;)++s;for(var h=new Le(n,this.settings),c=[],p=h.lex();p.text!=="EOF";)c.push(p),p=h.lex();c.reverse();var g={tokens:c,numArgs:s};return g}return n}isDefined(e){return this.macros.has(e)||L0.hasOwnProperty(e)||$.math.hasOwnProperty(e)||$.text.hasOwnProperty(e)||da.hasOwnProperty(e)}isExpandable(e){var t=this.macros.get(e);return t!=null?typeof t=="string"||typeof t=="function"||!t.unexpandable:L0.hasOwnProperty(e)&&!L0[e].primitive}},yr=/^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/,Ce=Object.freeze({"\u208A":"+","\u208B":"-","\u208C":"=","\u208D":"(","\u208E":")","\u2080":"0","\u2081":"1","\u2082":"2","\u2083":"3","\u2084":"4","\u2085":"5","\u2086":"6","\u2087":"7","\u2088":"8","\u2089":"9","\u2090":"a","\u2091":"e","\u2095":"h","\u1D62":"i","\u2C7C":"j","\u2096":"k","\u2097":"l","\u2098":"m","\u2099":"n","\u2092":"o","\u209A":"p","\u1D63":"r","\u209B":"s","\u209C":"t","\u1D64":"u","\u1D65":"v","\u2093":"x","\u1D66":"\u03B2","\u1D67":"\u03B3","\u1D68":"\u03C1","\u1D69":"\u03D5","\u1D6A":"\u03C7","\u207A":"+","\u207B":"-","\u207C":"=","\u207D":"(","\u207E":")","\u2070":"0","\xB9":"1","\xB2":"2","\xB3":"3","\u2074":"4","\u2075":"5","\u2076":"6","\u2077":"7","\u2078":"8","\u2079":"9","\u1D2C":"A","\u1D2E":"B","\u1D30":"D","\u1D31":"E","\u1D33":"G","\u1D34":"H","\u1D35":"I","\u1D36":"J","\u1D37":"K","\u1D38":"L","\u1D39":"M","\u1D3A":"N","\u1D3C":"O","\u1D3E":"P","\u1D3F":"R","\u1D40":"T","\u1D41":"U","\u2C7D":"V","\u1D42":"W","\u1D43":"a","\u1D47":"b","\u1D9C":"c","\u1D48":"d","\u1D49":"e","\u1DA0":"f","\u1D4D":"g",\u02B0:"h","\u2071":"i",\u02B2:"j","\u1D4F":"k",\u02E1:"l","\u1D50":"m",\u207F:"n","\u1D52":"o","\u1D56":"p",\u02B3:"r",\u02E2:"s","\u1D57":"t","\u1D58":"u","\u1D5B":"v",\u02B7:"w",\u02E3:"x",\u02B8:"y","\u1DBB":"z","\u1D5D":"\u03B2","\u1D5E":"\u03B3","\u1D5F":"\u03B4","\u1D60":"\u03D5","\u1D61":"\u03C7","\u1DBF":"\u03B8"}),ot={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030C":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030A":{text:"\\r",math:"\\mathring"},"\u030B":{text:"\\H"},"\u0327":{text:"\\c"}},xr={\u00E1:"a\u0301",\u00E0:"a\u0300",\u00E4:"a\u0308",\u01DF:"a\u0308\u0304",\u00E3:"a\u0303",\u0101:"a\u0304",\u0103:"a\u0306",\u1EAF:"a\u0306\u0301",\u1EB1:"a\u0306\u0300",\u1EB5:"a\u0306\u0303",\u01CE:"a\u030C",\u00E2:"a\u0302",\u1EA5:"a\u0302\u0301",\u1EA7:"a\u0302\u0300",\u1EAB:"a\u0302\u0303",\u0227:"a\u0307",\u01E1:"a\u0307\u0304",\u00E5:"a\u030A",\u01FB:"a\u030A\u0301",\u1E03:"b\u0307",\u0107:"c\u0301",\u1E09:"c\u0327\u0301",\u010D:"c\u030C",\u0109:"c\u0302",\u010B:"c\u0307",\u00E7:"c\u0327",\u010F:"d\u030C",\u1E0B:"d\u0307",\u1E11:"d\u0327",\u00E9:"e\u0301",\u00E8:"e\u0300",\u00EB:"e\u0308",\u1EBD:"e\u0303",\u0113:"e\u0304",\u1E17:"e\u0304\u0301",\u1E15:"e\u0304\u0300",\u0115:"e\u0306",\u1E1D:"e\u0327\u0306",\u011B:"e\u030C",\u00EA:"e\u0302",\u1EBF:"e\u0302\u0301",\u1EC1:"e\u0302\u0300",\u1EC5:"e\u0302\u0303",\u0117:"e\u0307",\u0229:"e\u0327",\u1E1F:"f\u0307",\u01F5:"g\u0301",\u1E21:"g\u0304",\u011F:"g\u0306",\u01E7:"g\u030C",\u011D:"g\u0302",\u0121:"g\u0307",\u0123:"g\u0327",\u1E27:"h\u0308",\u021F:"h\u030C",\u0125:"h\u0302",\u1E23:"h\u0307",\u1E29:"h\u0327",\u00ED:"i\u0301",\u00EC:"i\u0300",\u00EF:"i\u0308",\u1E2F:"i\u0308\u0301",\u0129:"i\u0303",\u012B:"i\u0304",\u012D:"i\u0306",\u01D0:"i\u030C",\u00EE:"i\u0302",\u01F0:"j\u030C",\u0135:"j\u0302",\u1E31:"k\u0301",\u01E9:"k\u030C",\u0137:"k\u0327",\u013A:"l\u0301",\u013E:"l\u030C",\u013C:"l\u0327",\u1E3F:"m\u0301",\u1E41:"m\u0307",\u0144:"n\u0301",\u01F9:"n\u0300",\u00F1:"n\u0303",\u0148:"n\u030C",\u1E45:"n\u0307",\u0146:"n\u0327",\u00F3:"o\u0301",\u00F2:"o\u0300",\u00F6:"o\u0308",\u022B:"o\u0308\u0304",\u00F5:"o\u0303",\u1E4D:"o\u0303\u0301",\u1E4F:"o\u0303\u0308",\u022D:"o\u0303\u0304",\u014D:"o\u0304",\u1E53:"o\u0304\u0301",\u1E51:"o\u0304\u0300",\u014F:"o\u0306",\u01D2:"o\u030C",\u00F4:"o\u0302",\u1ED1:"o\u0302\u0301",\u1ED3:"o\u0302\u0300",\u1ED7:"o\u0302\u0303",\u022F:"o\u0307",\u0231:"o\u0307\u0304",\u0151:"o\u030B",\u1E55:"p\u0301",\u1E57:"p\u0307",\u0155:"r\u0301",\u0159:"r\u030C",\u1E59:"r\u0307",\u0157:"r\u0327",\u015B:"s\u0301",\u1E65:"s\u0301\u0307",\u0161:"s\u030C",\u1E67:"s\u030C\u0307",\u015D:"s\u0302",\u1E61:"s\u0307",\u015F:"s\u0327",\u1E97:"t\u0308",\u0165:"t\u030C",\u1E6B:"t\u0307",\u0163:"t\u0327",\u00FA:"u\u0301",\u00F9:"u\u0300",\u00FC:"u\u0308",\u01D8:"u\u0308\u0301",\u01DC:"u\u0308\u0300",\u01D6:"u\u0308\u0304",\u01DA:"u\u0308\u030C",\u0169:"u\u0303",\u1E79:"u\u0303\u0301",\u016B:"u\u0304",\u1E7B:"u\u0304\u0308",\u016D:"u\u0306",\u01D4:"u\u030C",\u00FB:"u\u0302",\u016F:"u\u030A",\u0171:"u\u030B",\u1E7D:"v\u0303",\u1E83:"w\u0301",\u1E81:"w\u0300",\u1E85:"w\u0308",\u0175:"w\u0302",\u1E87:"w\u0307",\u1E98:"w\u030A",\u1E8D:"x\u0308",\u1E8B:"x\u0307",\u00FD:"y\u0301",\u1EF3:"y\u0300",\u00FF:"y\u0308",\u1EF9:"y\u0303",\u0233:"y\u0304",\u0177:"y\u0302",\u1E8F:"y\u0307",\u1E99:"y\u030A",\u017A:"z\u0301",\u017E:"z\u030C",\u1E91:"z\u0302",\u017C:"z\u0307",\u00C1:"A\u0301",\u00C0:"A\u0300",\u00C4:"A\u0308",\u01DE:"A\u0308\u0304",\u00C3:"A\u0303",\u0100:"A\u0304",\u0102:"A\u0306",\u1EAE:"A\u0306\u0301",\u1EB0:"A\u0306\u0300",\u1EB4:"A\u0306\u0303",\u01CD:"A\u030C",\u00C2:"A\u0302",\u1EA4:"A\u0302\u0301",\u1EA6:"A\u0302\u0300",\u1EAA:"A\u0302\u0303",\u0226:"A\u0307",\u01E0:"A\u0307\u0304",\u00C5:"A\u030A",\u01FA:"A\u030A\u0301",\u1E02:"B\u0307",\u0106:"C\u0301",\u1E08:"C\u0327\u0301",\u010C:"C\u030C",\u0108:"C\u0302",\u010A:"C\u0307",\u00C7:"C\u0327",\u010E:"D\u030C",\u1E0A:"D\u0307",\u1E10:"D\u0327",\u00C9:"E\u0301",\u00C8:"E\u0300",\u00CB:"E\u0308",\u1EBC:"E\u0303",\u0112:"E\u0304",\u1E16:"E\u0304\u0301",\u1E14:"E\u0304\u0300",\u0114:"E\u0306",\u1E1C:"E\u0327\u0306",\u011A:"E\u030C",\u00CA:"E\u0302",\u1EBE:"E\u0302\u0301",\u1EC0:"E\u0302\u0300",\u1EC4:"E\u0302\u0303",\u0116:"E\u0307",\u0228:"E\u0327",\u1E1E:"F\u0307",\u01F4:"G\u0301",\u1E20:"G\u0304",\u011E:"G\u0306",\u01E6:"G\u030C",\u011C:"G\u0302",\u0120:"G\u0307",\u0122:"G\u0327",\u1E26:"H\u0308",\u021E:"H\u030C",\u0124:"H\u0302",\u1E22:"H\u0307",\u1E28:"H\u0327",\u00CD:"I\u0301",\u00CC:"I\u0300",\u00CF:"I\u0308",\u1E2E:"I\u0308\u0301",\u0128:"I\u0303",\u012A:"I\u0304",\u012C:"I\u0306",\u01CF:"I\u030C",\u00CE:"I\u0302",\u0130:"I\u0307",\u0134:"J\u0302",\u1E30:"K\u0301",\u01E8:"K\u030C",\u0136:"K\u0327",\u0139:"L\u0301",\u013D:"L\u030C",\u013B:"L\u0327",\u1E3E:"M\u0301",\u1E40:"M\u0307",\u0143:"N\u0301",\u01F8:"N\u0300",\u00D1:"N\u0303",\u0147:"N\u030C",\u1E44:"N\u0307",\u0145:"N\u0327",\u00D3:"O\u0301",\u00D2:"O\u0300",\u00D6:"O\u0308",\u022A:"O\u0308\u0304",\u00D5:"O\u0303",\u1E4C:"O\u0303\u0301",\u1E4E:"O\u0303\u0308",\u022C:"O\u0303\u0304",\u014C:"O\u0304",\u1E52:"O\u0304\u0301",\u1E50:"O\u0304\u0300",\u014E:"O\u0306",\u01D1:"O\u030C",\u00D4:"O\u0302",\u1ED0:"O\u0302\u0301",\u1ED2:"O\u0302\u0300",\u1ED6:"O\u0302\u0303",\u022E:"O\u0307",\u0230:"O\u0307\u0304",\u0150:"O\u030B",\u1E54:"P\u0301",\u1E56:"P\u0307",\u0154:"R\u0301",\u0158:"R\u030C",\u1E58:"R\u0307",\u0156:"R\u0327",\u015A:"S\u0301",\u1E64:"S\u0301\u0307",\u0160:"S\u030C",\u1E66:"S\u030C\u0307",\u015C:"S\u0302",\u1E60:"S\u0307",\u015E:"S\u0327",\u0164:"T\u030C",\u1E6A:"T\u0307",\u0162:"T\u0327",\u00DA:"U\u0301",\u00D9:"U\u0300",\u00DC:"U\u0308",\u01D7:"U\u0308\u0301",\u01DB:"U\u0308\u0300",\u01D5:"U\u0308\u0304",\u01D9:"U\u0308\u030C",\u0168:"U\u0303",\u1E78:"U\u0303\u0301",\u016A:"U\u0304",\u1E7A:"U\u0304\u0308",\u016C:"U\u0306",\u01D3:"U\u030C",\u00DB:"U\u0302",\u016E:"U\u030A",\u0170:"U\u030B",\u1E7C:"V\u0303",\u1E82:"W\u0301",\u1E80:"W\u0300",\u1E84:"W\u0308",\u0174:"W\u0302",\u1E86:"W\u0307",\u1E8C:"X\u0308",\u1E8A:"X\u0307",\u00DD:"Y\u0301",\u1EF2:"Y\u0300",\u0178:"Y\u0308",\u1EF8:"Y\u0303",\u0232:"Y\u0304",\u0176:"Y\u0302",\u1E8E:"Y\u0307",\u0179:"Z\u0301",\u017D:"Z\u030C",\u1E90:"Z\u0302",\u017B:"Z\u0307",\u03AC:"\u03B1\u0301",\u1F70:"\u03B1\u0300",\u1FB1:"\u03B1\u0304",\u1FB0:"\u03B1\u0306",\u03AD:"\u03B5\u0301",\u1F72:"\u03B5\u0300",\u03AE:"\u03B7\u0301",\u1F74:"\u03B7\u0300",\u03AF:"\u03B9\u0301",\u1F76:"\u03B9\u0300",\u03CA:"\u03B9\u0308",\u0390:"\u03B9\u0308\u0301",\u1FD2:"\u03B9\u0308\u0300",\u1FD1:"\u03B9\u0304",\u1FD0:"\u03B9\u0306",\u03CC:"\u03BF\u0301",\u1F78:"\u03BF\u0300",\u03CD:"\u03C5\u0301",\u1F7A:"\u03C5\u0300",\u03CB:"\u03C5\u0308",\u03B0:"\u03C5\u0308\u0301",\u1FE2:"\u03C5\u0308\u0300",\u1FE1:"\u03C5\u0304",\u1FE0:"\u03C5\u0306",\u03CE:"\u03C9\u0301",\u1F7C:"\u03C9\u0300",\u038E:"\u03A5\u0301",\u1FEA:"\u03A5\u0300",\u03AB:"\u03A5\u0308",\u1FE9:"\u03A5\u0304",\u1FE8:"\u03A5\u0306",\u038F:"\u03A9\u0301",\u1FFA:"\u03A9\u0300"},Pe=class r{constructor(e,t){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new xt(e,t,this.mode),this.settings=t,this.leftrightDepth=0}expect(e,t){if(t===void 0&&(t=!0),this.fetch().text!==e)throw new M("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());t&&this.consume()}consume(){this.nextToken=null}fetch(){return this.nextToken==null&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(e){this.mode=e,this.gullet.switchMode(e)}parse(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}}subparse(e){var t=this.nextToken;this.consume(),this.gullet.pushToken(new p0("}")),this.gullet.pushTokens(e);var a=this.parseExpression(!1);return this.expect("}"),this.nextToken=t,a}parseExpression(e,t){for(var a=[];;){this.mode==="math"&&this.consumeSpaces();var n=this.fetch();if(r.endOfExpression.indexOf(n.text)!==-1||t&&n.text===t||e&&L0[n.text]&&L0[n.text].infix)break;var s=this.parseAtom(t);if(s){if(s.type==="internal")continue}else break;a.push(s)}return this.mode==="text"&&this.formLigatures(a),this.handleInfixNodes(a)}handleInfixNodes(e){for(var t=-1,a,n=0;n=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+t[0]+'" used in math mode',e);var h=$[this.mode][t].group,c=m0.range(e),p;if(e1.hasOwnProperty(h)){var g=h;p={type:"atom",mode:this.mode,family:g,loc:c,text:t}}else p={type:h,mode:this.mode,loc:c,text:t};o=p}else if(t.charCodeAt(0)>=128)this.settings.strict&&(kr(t.charCodeAt(0))?this.mode==="math"&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+t[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+t[0]+'"'+(" ("+t.charCodeAt(0)+")"),e)),o={type:"textord",mode:"text",loc:m0.range(e),text:t};else return null;if(this.consume(),s)for(var y=0;y=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+t[0]+'" used in math mode',e);var h=$[this.mode][t].group,c=m0.range(e),p;if(e1.hasOwnProperty(h)){var g=h;p={type:"atom",mode:this.mode,family:g,loc:c,text:t}}else p={type:h,mode:this.mode,loc:c,text:t};o=p}else if(t.charCodeAt(0)>=128)this.settings.strict&&(kr(t.charCodeAt(0))?this.mode==="math"&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+t[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+t[0]+'"'+(" ("+t.charCodeAt(0)+")"),e)),o={type:"textord",mode:"text",loc:m0.range(e),text:t};else return null;if(this.consume(),s)for(var y=0;y 0 { + opts.Infof("%s", errBuff.String()) + } + + return nil + }) + } + return g.Wait() + } + + dp := &dispatcherPool[Q, R]{ + dispatchers: make([]*dispatcher[Q, R], len(inOuts)), + + errc: make(chan error, 10), + donec: make(chan struct{}), + } + + go func() { + // This will block until stdin is closed or it encounters an error. + err := run() + dp.SendIfErr(err) + close(dp.donec) + }() + + for i := 0; i < len(inOuts); i++ { + d := &dispatcher[Q, R]{ + pending: make(map[uint32]*call[Q, R]), + inOut: inOuts[i], + } + go d.input() + dp.dispatchers[i] = d + } + + dp.close = func() error { + for _, d := range dp.dispatchers { + d.closing = true + if err := d.inOut.stdin.Close(); err != nil { + return err + } + if err := d.inOut.stdout.Close(); err != nil { + return err + } + } + + // We need to wait for the WebAssembly instances to finish executing before we can close the runtime. + <-dp.donec + + if err := r.Close(ctx); err != nil { + return err + } + + // Return potential late compilation errors. + return dp.Err() + } + + return dp, dp.Err() +} + +type lazyDispatcher[Q, R any] struct { + opts Options + + dispatcher Dispatcher[Q, R] + startOnce sync.Once + started bool + startErr error +} + +func (d *lazyDispatcher[Q, R]) start() (Dispatcher[Q, R], error) { + d.startOnce.Do(func() { + start := time.Now() + d.dispatcher, d.startErr = Start[Q, R](d.opts) + d.started = true + d.opts.Infof("started dispatcher in %s", time.Since(start)) + }) + return d.dispatcher, d.startErr +} + +// Dispatchers holds all the dispatchers for the warpc package. +type Dispatchers struct { + katex *lazyDispatcher[KatexInput, KatexOutput] +} + +func (d *Dispatchers) Katex() (Dispatcher[KatexInput, KatexOutput], error) { + return d.katex.start() +} + +func (d *Dispatchers) Close() error { + var errs []error + if d.katex.started { + if err := d.katex.dispatcher.Close(); err != nil { + errs = append(errs, err) + } + } + if len(errs) == 0 { + return nil + } + return fmt.Errorf("%v", errs) +} + +// AllDispatchers creates all the dispatchers for the warpc package. +// Note that the individual dispatchers are started lazily. +// Remember to call Close on the returned Dispatchers when done. +func AllDispatchers(katexOpts Options) *Dispatchers { + if katexOpts.Runtime.Data == nil { + katexOpts.Runtime = Binary{Name: "javy_quickjs_provider_v2", Data: quickjsWasm} + } + if katexOpts.Main.Data == nil { + katexOpts.Main = Binary{Name: "renderkatex", Data: katexWasm} + } + + if katexOpts.Infof == nil { + katexOpts.Infof = func(format string, v ...any) { + // noop + } + } + + return &Dispatchers{ + katex: &lazyDispatcher[KatexInput, KatexOutput]{opts: katexOpts}, + } +} diff --git a/internal/warpc/warpc_test.go b/internal/warpc/warpc_test.go new file mode 100644 index 00000000000..22b79a47d60 --- /dev/null +++ b/internal/warpc/warpc_test.go @@ -0,0 +1,443 @@ +package warpc + +import ( + "context" + _ "embed" + "fmt" + "sync" + "sync/atomic" + "testing" + + qt "github.com/frankban/quicktest" +) + +//go:embed wasm/greet.wasm +var greetWasm []byte + +type person struct { + Name string `json:"name"` +} + +func TestKatex(t *testing.T) { + c := qt.New(t) + + opts := Options{ + PoolSize: 8, + Runtime: quickjsBinary, + Main: katexBinary, + } + + /*dd := AllDispatchers(opts) + + d, err := dd.Katex() + c.Assert(err, qt.IsNil) + */ + d, err := Start[KatexInput, KatexOutput](opts) + + defer d.Close() + + ctx := context.Background() + + input := KatexInput{ + Expression: "c = \\pm\\sqrt{a^2 + b^2}", + Options: KatexOptions{ + Output: "html", + DisplayMode: true, + }, + } + + message := Message[KatexInput]{ + Header: Header{ + Version: currentVersion, + ID: uint32(32), + }, + Data: input, + } + + result, err := d.Execute(ctx, message) + c.Assert(err, qt.IsNil) + + c.Assert(result.GetID(), qt.Equals, message.GetID()) +} + +func TestGreet(t *testing.T) { + c := qt.New(t) + opts := Options{ + PoolSize: 1, + Runtime: quickjsBinary, + Main: greetBinary, + Infof: t.Logf, + } + + for i := 0; i < 2; i++ { + func() { + d, err := Start[person, greeting](opts) + if err != nil { + t.Fatal(err) + } + + defer func() { + c.Assert(d.Close(), qt.IsNil) + }() + + ctx := context.Background() + + inputMessage := Message[person]{ + Header: Header{ + Version: currentVersion, + }, + Data: person{ + Name: "Person", + }, + } + + for j := 0; j < 20; j++ { + inputMessage.Header.ID = uint32(j + 1) + g, err := d.Execute(ctx, inputMessage) + if err != nil { + t.Fatal(err) + } + if g.Data.Greeting != "Hello Person!" { + t.Fatalf("got: %v", g) + } + if g.GetID() != inputMessage.GetID() { + t.Fatalf("%d vs %d", g.GetID(), inputMessage.GetID()) + } + } + }() + } +} + +func TestGreetParallel(t *testing.T) { + c := qt.New(t) + + opts := Options{ + Runtime: quickjsBinary, + Main: greetBinary, + PoolSize: 4, + } + d, err := Start[person, greeting](opts) + c.Assert(err, qt.IsNil) + defer func() { + c.Assert(d.Close(), qt.IsNil) + }() + + var wg sync.WaitGroup + + for i := 1; i <= 10; i++ { + wg.Add(1) + go func(i int) { + defer wg.Done() + + ctx := context.Background() + + for j := 0; j < 5; j++ { + base := i * 100 + id := uint32(base + j) + + inputPerson := person{ + Name: fmt.Sprintf("Person %d", id), + } + inputMessage := Message[person]{ + Header: Header{ + Version: currentVersion, + ID: id, + }, + Data: inputPerson, + } + g, err := d.Execute(ctx, inputMessage) + if err != nil { + t.Error(err) + return + } + + c.Assert(g.Data.Greeting, qt.Equals, fmt.Sprintf("Hello Person %d!", id)) + c.Assert(g.GetID(), qt.Equals, inputMessage.GetID()) + + } + }(i) + + } + + wg.Wait() +} + +func TestKatexParallel(t *testing.T) { + c := qt.New(t) + + opts := Options{ + Runtime: quickjsBinary, + Main: katexBinary, + PoolSize: 6, + } + d, err := Start[KatexInput, KatexOutput](opts) + c.Assert(err, qt.IsNil) + defer func() { + c.Assert(d.Close(), qt.IsNil) + }() + + var wg sync.WaitGroup + + for i := 1; i <= 10; i++ { + wg.Add(1) + go func(i int) { + defer wg.Done() + + ctx := context.Background() + + for j := 0; j < 1; j++ { + base := i * 100 + id := uint32(base + j) + + input := katexInputTemplate + inputMessage := Message[KatexInput]{ + Header: Header{ + Version: currentVersion, + ID: id, + }, + Data: input, + } + + result, err := d.Execute(ctx, inputMessage) + if err != nil { + t.Error(err) + return + } + + if result.GetID() != inputMessage.GetID() { + t.Errorf("%d vs %d", result.GetID(), inputMessage.GetID()) + return + } + } + }(i) + + } + + wg.Wait() +} + +func BenchmarkExecuteKatex(b *testing.B) { + opts := Options{ + Runtime: quickjsBinary, + Main: katexBinary, + } + d, err := Start[KatexInput, KatexOutput](opts) + if err != nil { + b.Fatal(err) + } + defer d.Close() + + ctx := context.Background() + + input := katexInputTemplate + + b.ResetTimer() + for i := 0; i < b.N; i++ { + message := Message[KatexInput]{ + Header: Header{ + Version: currentVersion, + ID: uint32(i + 1), + }, + Data: input, + } + + result, err := d.Execute(ctx, message) + if err != nil { + b.Fatal(err) + } + + if result.GetID() != message.GetID() { + b.Fatalf("%d vs %d", result.GetID(), message.GetID()) + } + + } +} + +func BenchmarkKatexStartStop(b *testing.B) { + optsTemplate := Options{ + Runtime: quickjsBinary, + Main: katexBinary, + CompilationCacheDir: b.TempDir(), + } + + runBench := func(b *testing.B, opts Options) { + for i := 0; i < b.N; i++ { + d, err := Start[KatexInput, KatexOutput](opts) + if err != nil { + b.Fatal(err) + } + if err := d.Close(); err != nil { + b.Fatal(err) + } + } + } + + for _, poolSize := range []int{1, 8, 16} { + + name := fmt.Sprintf("PoolSize%d", poolSize) + + b.Run(name, func(b *testing.B) { + opts := optsTemplate + opts.PoolSize = poolSize + runBench(b, opts) + }) + + } +} + +var katexInputTemplate = KatexInput{ + Expression: "c = \\pm\\sqrt{a^2 + b^2}", + Options: KatexOptions{Output: "html", DisplayMode: true}, +} + +func BenchmarkExecuteKatexPara(b *testing.B) { + optsTemplate := Options{ + Runtime: quickjsBinary, + Main: katexBinary, + } + + runBench := func(b *testing.B, opts Options) { + d, err := Start[KatexInput, KatexOutput](opts) + if err != nil { + b.Fatal(err) + } + defer d.Close() + + ctx := context.Background() + + b.ResetTimer() + + var id atomic.Uint32 + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + message := Message[KatexInput]{ + Header: Header{ + Version: currentVersion, + ID: id.Add(1), + }, + Data: katexInputTemplate, + } + + result, err := d.Execute(ctx, message) + if err != nil { + b.Fatal(err) + } + if result.GetID() != message.GetID() { + b.Fatalf("%d vs %d", result.GetID(), message.GetID()) + } + } + }) + } + + for _, poolSize := range []int{1, 8, 16} { + name := fmt.Sprintf("PoolSize%d", poolSize) + + b.Run(name, func(b *testing.B) { + opts := optsTemplate + opts.PoolSize = poolSize + runBench(b, opts) + }) + } +} + +func BenchmarkExecuteGreet(b *testing.B) { + opts := Options{ + Runtime: quickjsBinary, + Main: greetBinary, + } + d, err := Start[person, greeting](opts) + if err != nil { + b.Fatal(err) + } + defer d.Close() + + ctx := context.Background() + + input := person{ + Name: "Person", + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + message := Message[person]{ + Header: Header{ + Version: currentVersion, + ID: uint32(i + 1), + }, + Data: input, + } + result, err := d.Execute(ctx, message) + if err != nil { + b.Fatal(err) + } + + if result.GetID() != message.GetID() { + b.Fatalf("%d vs %d", result.GetID(), message.GetID()) + } + + } +} + +func BenchmarkExecuteGreetPara(b *testing.B) { + opts := Options{ + Runtime: quickjsBinary, + Main: greetBinary, + PoolSize: 8, + } + + d, err := Start[person, greeting](opts) + if err != nil { + b.Fatal(err) + } + defer d.Close() + + ctx := context.Background() + + inputTemplate := person{ + Name: "Person", + } + + b.ResetTimer() + + var id atomic.Uint32 + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + message := Message[person]{ + Header: Header{ + Version: currentVersion, + ID: id.Add(1), + }, + Data: inputTemplate, + } + + result, err := d.Execute(ctx, message) + if err != nil { + b.Fatal(err) + } + if result.GetID() != message.GetID() { + b.Fatalf("%d vs %d", result.GetID(), message.GetID()) + } + } + }) +} + +type greeting struct { + Greeting string `json:"greeting"` +} + +var ( + greetBinary = Binary{ + Name: "greet", + Data: greetWasm, + } + + katexBinary = Binary{ + Name: "renderkatex", + Data: katexWasm, + } + + quickjsBinary = Binary{ + Name: "javy_quickjs_provider_v2", + Data: quickjsWasm, + } +) diff --git a/internal/warpc/wasm/greet.wasm b/internal/warpc/wasm/greet.wasm new file mode 100644 index 0000000000000000000000000000000000000000..dbbd0fda0229d043824fab14f6248aa2f116c2b6 GIT binary patch literal 1979 zcmZ`)3s4kw82|qN|L)$hEY}?%l9n!H8kGkk)ipMbpokG>qd8?Z;ojbI9Npd0?j1%i zEV7hL9rBUnFy&Z{qcdihfbbI&hx8M8wecyi% zbSFvxfOy$FfO)i`0py%h_h-j0~W0#zRt5S1E)vE0f1$S0!RbJZ!~$(He(_X^=+Th81(H zh$%&^(C9MTG~-&-3ML|^7P0i88KgEfsZL|mqH$V99h#8K5dz`H86NC0IIBKpc)~Fw zk_ehkmgQ)sZCkchczr=>lHoStSV*g~t*GY2k@q->fNtA*z3S9P!iK5T>b7HM-D=(& zpOS>aR)fjA;&3%JlB&`eN6A*r%EqY#;aPW;xg< zPCy434bbJ^h>5*#f{;U?TNgm5(7r#Ki$ed;NQzG(DftCSdw{?w3SNVP+kM>E6TK3J z`-+RW{#PWzZ%D9%e&){ew;=Boen*O7^Ya53bbY_)KVmN3g!o|@?E!$9n4sh|y0oJL zGtG2+4FGq0hoFnl-XR7AK&v0t_t)VKAIjcPHucZbWzb!qOI%m-2YLrYu6(r>BXmfE z-326GMu*G)9O_HXAn~6?;?2RQbKJ$n3&(GV+#8T#z?}@>HALWCvmt={_#-_2pWImB zmdVmiymt;q1=1n>UBX8tC;&1@S->s@0r7ET2GxzD6F^i(fS8^FYzTOLVoGwN=^%PR zEWm@vow=t9Vg`s6Vn+7ABtnG((G6i{#gnMvTW5J>?~6egwMD?FGm zOxvMyM303MddMUSzTxy)h8?brOQo|43knNVG&4-cF@s|R^+e!rKykdUz&8$>SZeYw z!LbsyVGiFwVabZ)OF!&cv*Z3X6D#J^0keEb{;bo(OnXD;CU+;_sR$A+6F2P9X(L?;LfM}E?;obRqdaWN%!q~`RoYo>r=~~547~`Z^<3GakJ;! zi9Wk|b?b8{^BSF9e@?Ag`_0K~KIlAMyY0laC-3{Ue(Bum?qRFneB#kh4(H6N9(&~C zE#=GdhJMjlvZC|lr%tS0I%LiuF;}hL^Ha{2X`4f(Gd8U$m9|beHeOxi+cRQ%?)%ZNzWTPvdv&SP=llGF z>V9Xvf8U~}k?Qa>7Z)D;sCwaJ*5-rjdS8hAU>}{kr#TdC5UyVNfa|t5-tGJ>ebw); zteyYK#PK&RI(z$%Yqph#KChY6_}YiZZeICF$5^H7m;6)D-nBDt=j^7o^3yw{hQ6NH F;V)&q3qAk< literal 0 HcmV?d00001 diff --git a/internal/ext/wasm/quickjs.wasm b/internal/warpc/wasm/quickjs.wasm similarity index 100% rename from internal/ext/wasm/quickjs.wasm rename to internal/warpc/wasm/quickjs.wasm diff --git a/internal/ext/wasm/renderkatex.wasm b/internal/warpc/wasm/renderkatex.wasm similarity index 86% rename from internal/ext/wasm/renderkatex.wasm rename to internal/warpc/wasm/renderkatex.wasm index 0aa6e84a84572800ad2765aa663e362f4fbdd8a8..46e67984db77e8a487d7799fe0df902929664c89 100644 GIT binary patch delta 64475 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 T7AQ3-wrNU~Nq2 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 QeSRksf0n#N) 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%0A!F&4hhofcu&LB; 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ⅅ6Wq0dQ&Z(5ZzixcnkqY<8;22Q<@||1 z%ga=&C@NljRjaK6&-IFH2y7h97&K;(!Z{-*jxu(#y1rY7BMe(Aghb8>ip6E5d=g9C z_b#Mhntxv8=xDk=H+oky_J%>KvL5^wQuhW6-4fELb>aikRHUlgLnYEOgd0)1nSf}5 z9#}(BByo}gCz|Bwn*2c!iY(Vi)eZsNIED_%sql}lJNJZYd7DXyfn z&-EWSra)S!y4GPVemZf`4x#IY`0&A+)CckEfq#QfX{5N60l8)=&S9uK`$Uixr$-FU zd#HS~C`pg2P$&b6QZHRLbOi>&;-iK${GovUiffdoZTq@!?aT>YD=`3k-P*Z7yvAZb z7TrtO<5F&`-!+mmmSMD%2g4bwDr;~0SFV98q*oxt^)S>i<-RWqY5w{YtPkRr6xUQK z;eVomQ^>#({b_qf8D&`T*&!wROGAu~?3TX7 zB(B)x4HAxqg-hx6gBX`d%G8w;AJwf5NQpi5xE9>*l4f^bC(Et_2skS!<)Fn;YJcD4 zix_&B4e}>L4_WAQ>~GrYkr>8>x#t%DmoM-wiBNMN!j}?~r38x4AB7-WXoE8VFZA*Z zx)?Wt552o*jL0CU=%AOS{m8f%=7q$PqVk(&s7ba5Iyx)6tUQ0AxLL|mY@;fo)#7CC(V3(6_ zzvCx0q-ipVU~~ajp40n{PE}IKnBq~Ui8WO0KA}$nr7!)MHb~86cIJ>sKz{%ly>(b6 zJzT$>pLw(3Mz1+#N_lJix6cw`X?ZsGZDWKccAaWvGTX}2XS$DBX!wi`Xb>C@6s|Mh z(NuPSrNqd>Os9lBrUC(UJVV%~|64iGJ3bdO52B6Q_X-+<3br-_V??*DUS3@#+;k4s zyW3+}8&W#zGNni$sC!AIndNYgZt9W26nS>%kNYk4m|zk-v|B*-B4ush8ZTYGi7(C5 zVF0Min8!<@X_+Xml1HQYa@Zu#Gq#7)vv<25kNYG&^}NClQOSq)?0<DnaAoizz zV!4jqx{x-M>jRTqoJ-kQN_z{Q4vIU4!h!fuH~C!AjK$j#06VgiNN2#r5S$Xi79n@t zPX4rJ3Z0OkjvLwXMENuhC#_yZ2>}KD0Z8~os*XXRVY-C635&Ytd{y90M^Cye0t+b_ zH{Mm7O@9WFw$pP%Gk@ZC_B_|PI8)S;rEqWRep5Ux2DRnAPW2Sf)&pcXp-%?Dwo=rC z-;R34_#uIV+uDeglN(X^}S}RYhwzj;LAq&Xcy28P}QJq%xPf3Nn~0; zi^Z-RkZD~o%_xz|khSGHfW2>)0(~rb`|X^WKayfiu?TLdrGL3nG}u(gw>A-oa5Kmr z?Alv+zRgy&_6|S<(g?zGBDrg1!oenJ3EF^7%*HuTasMEi$CV-f*f6YY83Zjop8k<| zue~FhITk_L=ui?wpMLC!02!ha1vO$i&#;37o zxlP=lRy%;q)PGEucj6K?;Ynr~W39dJAqd8-Y3;V$8pauAuuimvjga<8Nt^c#@G3Zc z0PJ%ghU-oFyu|s8;YsSH`p>!>RrGL$iB)$Dk*;~i_*dW|E_T$&L zv+OcI*iWzVkSqgj^FyGt^vhzA`lAy3-i;%_IP+A@#!PX8?o}@-Ofc9s?%rMbSMmU+ z>zMYi9||Y=6ebQW{${a)pTMor^~Je+oHu({@8Tah={NzI1sG7J6ZbZPJ_J!1nzi)7XJ1#VJmoPbs`y%=2&L6Qx)VjY>Z2(((EJ a#Aap}4tOdHsQ;BoM3N}AcD&tF8J`%JrTcvV diff --git a/internal/ext/watchtestscripts.sh b/internal/warpc/watchtestscripts.sh similarity index 100% rename from internal/ext/watchtestscripts.sh rename to internal/warpc/watchtestscripts.sh diff --git a/tpl/transform/transform.go b/tpl/transform/transform.go index 84fdfcd8fc2..43c2a9fdb17 100644 --- a/tpl/transform/transform.go +++ b/tpl/transform/transform.go @@ -18,18 +18,23 @@ import ( "bytes" "context" "encoding/xml" + "errors" "html" "html/template" + "io" "strings" "sync/atomic" "github.com/gohugoio/hugo/cache/dynacache" - "github.com/gohugoio/hugo/internal/ext" + "github.com/gohugoio/hugo/common/hashing" + "github.com/gohugoio/hugo/common/hugio" + "github.com/gohugoio/hugo/internal/warpc" "github.com/gohugoio/hugo/markup/converter/hooks" "github.com/gohugoio/hugo/markup/highlight" "github.com/gohugoio/hugo/markup/highlight/chromalexers" "github.com/gohugoio/hugo/resources" "github.com/gohugoio/hugo/tpl" + "github.com/mitchellh/mapstructure" "github.com/gohugoio/hugo/deps" "github.com/gohugoio/hugo/helpers" @@ -42,28 +47,28 @@ func New(deps *deps.Deps) *Namespace { panic("must provide MemCache") } - katexDispatcher, err := ext.StartKatex() // TODO1 Close. Also start this on demand. - if err != nil { - panic(err) - } - return &Namespace{ - deps: deps, - katexDispatcher: katexDispatcher, - cache: dynacache.GetOrCreatePartition[string, *resources.StaleValue[any]]( + deps: deps, + cacheUnmarshal: dynacache.GetOrCreatePartition[string, *resources.StaleValue[any]]( deps.MemCache, - "/tmpl/transform", + "/tmpl/transform/unmarshal", dynacache.OptionsPartition{Weight: 30, ClearWhen: dynacache.ClearOnChange}, ), + cacheMath: dynacache.GetOrCreatePartition[string, string]( + deps.MemCache, + "/tmpl/transform/math", + dynacache.OptionsPartition{Weight: 30, ClearWhen: dynacache.ClearNever}, + ), } } // Namespace provides template functions for the "transform" namespace. type Namespace struct { - cache *dynacache.Partition[string, *resources.StaleValue[any]] - id atomic.Uint32 - katexDispatcher ext.Dispatcher[ext.KatexInput, ext.KatexOutput] - deps *deps.Deps + cacheUnmarshal *dynacache.Partition[string, *resources.StaleValue[any]] + cacheMath *dynacache.Partition[string, string] + + id atomic.Uint32 + deps *deps.Deps } // Emojify returns a copy of s with all emoji codes replaced with actual emojis. @@ -192,30 +197,61 @@ func (ns *Namespace) Plainify(s any) (string, error) { return tpl.StripHTML(ss), nil } -// ToMathML converts a LaTeX string to MathML. -func (ns *Namespace) ToMathML(ctx context.Context, s any) (string, error) { - ss, err := cast.ToStringE(s) +// ToMath converts a LaTeX string to math in the given format, default MathML. +// This uses KaTeX to render the math, see https://katex.org/. +func (ns *Namespace) ToMath(ctx context.Context, args ...any) (string, error) { + if len(args) < 1 { + return "", errors.New("ToMath requires at least one argument") + } + expression, err := cast.ToStringE(args[0]) if err != nil { return "", err } - - // TODO1 compiler cache. - // TODO1 cache. - input := ext.KatexInput{ - ID: ns.id.Add(1), - Expression: ss, - Output: "mathml", - DisplayMode: true, + katexInput := warpc.KatexInput{ + Expression: expression, + Options: warpc.KatexOptions{ + Output: "mathml", + }, } - - result, err := ns.katexDispatcher.Execute(ctx, input) - if err != nil { - return "", err + if len(args) > 1 { + if err := mapstructure.WeakDecode(args[1], &katexInput); err != nil { + return "", err + } } - return result.Output, nil + + s := hashing.HashString(args...) + key := "tomath/" + s[:2] + "/" + s[2:] + fileCache := ns.deps.ResourceSpec.FileCaches.MiscCache() + + return ns.cacheMath.GetOrCreate(key, func(string) (string, error) { + _, r, err := fileCache.GetOrCreate(key, func() (io.ReadCloser, error) { + message := warpc.Message[warpc.KatexInput]{ + Header: warpc.Header{ + Version: "v1", + ID: ns.id.Add(1), + }, + Data: katexInput, + } + + k, err := ns.deps.WasmDispatchers.Katex() + if err != nil { + return nil, err + } + result, err := k.Execute(ctx, message) + if err != nil { + return nil, err + } + return hugio.NewReadSeekerNoOpCloserFromString(result.Data.Output), nil + }) + if err != nil { + return "", err + } + + return hugio.ReadString(r) + }) } // For internal use. func (ns *Namespace) Reset() { - ns.cache.Clear() + ns.cacheUnmarshal.Clear() } diff --git a/tpl/transform/transform_integration_test.go b/tpl/transform/transform_integration_test.go index 351420a675d..ed37222beed 100644 --- a/tpl/transform/transform_integration_test.go +++ b/tpl/transform/transform_integration_test.go @@ -133,3 +133,21 @@ Scar,"a "dead cat",11 [[name description age] [Spot a nice dog 3] [Rover a big dog 5] [Felix a "malicious" cat 7] [Bella an "evil" cat 9] [Scar a "dead cat 11]] `) } + +func TestToMathML(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['page','rss','section','sitemap','taxonomy','term'] +-- layouts/index.html -- +{{ $opts := dict "output" "mathml" }} +{{ $result := transform.ToMath "c = \\pm\\sqrt{a^2 + b^2}" }} +{{ printf "%v" $result | safeHTML }} + ` + b := hugolib.Test(t, files) + + b.AssertFileContent("public/index.html", ` +