Mercurial > repos > public > wdown
view wdown.go @ 8:4a25b534c81c javascript-experiment
Add v8 engine and include katex
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Wed, 17 Jun 2020 21:43:52 +0200 |
parents | a5aa39557726 |
children |
line wrap: on
line source
package main import ( "bytes" "flag" "fmt" "io/ioutil" "log" "os" "github.com/cbroglie/mustache" "github.com/yuin/goldmark" highlighting "github.com/yuin/goldmark-highlighting" meta "github.com/yuin/goldmark-meta" "github.com/yuin/goldmark/extension" "github.com/yuin/goldmark/parser" "rogchap.com/v8go" ) func main() { var templateFilename string flag.StringVar(&templateFilename, "tmpl", "", "Template file to render the html inside. The content of the markdown file will replace the placeholder {{content}}.") flag.Parse() if flag.NArg() < 1 { fmt.Println("Please provide a markdown file for parsing.") os.Exit(1) } var useTemplate = false if templateFilename != "" { useTemplate = true } tmpl, err := mustache.ParseFile(templateFilename) if err != nil { log.Fatal(err) } source, err := ioutil.ReadFile(flag.Arg(0)) if err != nil { log.Fatal(err) } md := goldmark.New( goldmark.WithExtensions( extension.GFM, highlighting.Highlighting, meta.Meta, ), goldmark.WithParserOptions( parser.WithAutoHeadingID(), ), ) var htmlContent bytes.Buffer parserContext := parser.NewContext() err = md.Convert(source, &htmlContent, parser.WithContext(parserContext)) if err != nil { log.Fatal(err) } if useTemplate { templateVars := meta.Get(parserContext) templateVars["content"] = htmlContent.String() err := tmpl.FRender(os.Stdout, templateVars) if err != nil { log.Fatal(err) } } else { fmt.Print(htmlContent) } katexFormula := "c = \\pm\\sqrt{a^2 + b^2} = \\pm x^2" katexRenderOptions := `{ throwOnError: false, displayMode: true, } ` ctx, _ := v8go.NewContext(nil) // creates a new V8 context with a new Isolate aka VM ctx.RunScript(katexSrc(), "katex/katex.js") ctx.RunScript("const katexFormula = String.raw`"+katexFormula+"`", "main.js") // executes a script on the global context ctx.RunScript("const mathHtml = katex.renderToString(katexFormula,"+katexRenderOptions+")", "main.js") // any functions previously added to the context can be called mathHtml, _ := ctx.RunScript("mathHtml", "value.js") // return a value in JavaScript back to Go fmt.Println(mathHtml) } func katexSrc() string { katexBytes, err := ioutil.ReadFile("katex/katex.js") if err != nil { log.Fatal(err) } return string(katexBytes) }