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)
}