Mercurial > repos > public > wdown
annotate 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 |
rev | line source |
---|---|
0 | 1 package main |
2 | |
3 import ( | |
6
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
4 "bytes" |
5
534fa4c6668e
Add command line argument parsing
Jonatan Werpers <jonatan@werpers.com>
parents:
4
diff
changeset
|
5 "flag" |
534fa4c6668e
Add command line argument parsing
Jonatan Werpers <jonatan@werpers.com>
parents:
4
diff
changeset
|
6 "fmt" |
0 | 7 "io/ioutil" |
8 "log" | |
9 "os" | |
10 | |
6
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
11 "github.com/cbroglie/mustache" |
0 | 12 "github.com/yuin/goldmark" |
4
0b747e2d51c9
Add syntax highlighting support
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
13 highlighting "github.com/yuin/goldmark-highlighting" |
7
a5aa39557726
Add parsing of YAML frontmatter
Jonatan Werpers <jonatan@werpers.com>
parents:
6
diff
changeset
|
14 meta "github.com/yuin/goldmark-meta" |
1
adf9c2b90279
Enable the gfm extension
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
15 "github.com/yuin/goldmark/extension" |
adf9c2b90279
Enable the gfm extension
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
16 "github.com/yuin/goldmark/parser" |
8
4a25b534c81c
Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
7
diff
changeset
|
17 "rogchap.com/v8go" |
0 | 18 ) |
19 | |
20 func main() { | |
6
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
21 var templateFilename string |
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
22 |
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
23 flag.StringVar(&templateFilename, "tmpl", "", "Template file to render the html inside. The content of the markdown file will replace the placeholder {{content}}.") |
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
24 |
5
534fa4c6668e
Add command line argument parsing
Jonatan Werpers <jonatan@werpers.com>
parents:
4
diff
changeset
|
25 flag.Parse() |
534fa4c6668e
Add command line argument parsing
Jonatan Werpers <jonatan@werpers.com>
parents:
4
diff
changeset
|
26 |
534fa4c6668e
Add command line argument parsing
Jonatan Werpers <jonatan@werpers.com>
parents:
4
diff
changeset
|
27 if flag.NArg() < 1 { |
534fa4c6668e
Add command line argument parsing
Jonatan Werpers <jonatan@werpers.com>
parents:
4
diff
changeset
|
28 fmt.Println("Please provide a markdown file for parsing.") |
534fa4c6668e
Add command line argument parsing
Jonatan Werpers <jonatan@werpers.com>
parents:
4
diff
changeset
|
29 os.Exit(1) |
534fa4c6668e
Add command line argument parsing
Jonatan Werpers <jonatan@werpers.com>
parents:
4
diff
changeset
|
30 } |
534fa4c6668e
Add command line argument parsing
Jonatan Werpers <jonatan@werpers.com>
parents:
4
diff
changeset
|
31 |
6
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
32 var useTemplate = false |
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
33 if templateFilename != "" { |
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
34 useTemplate = true |
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
35 } |
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
36 |
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
37 tmpl, err := mustache.ParseFile(templateFilename) |
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
38 if err != nil { |
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
39 log.Fatal(err) |
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
40 } |
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
41 |
5
534fa4c6668e
Add command line argument parsing
Jonatan Werpers <jonatan@werpers.com>
parents:
4
diff
changeset
|
42 source, err := ioutil.ReadFile(flag.Arg(0)) |
0 | 43 |
44 if err != nil { | |
45 log.Fatal(err) | |
46 } | |
47 | |
1
adf9c2b90279
Enable the gfm extension
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
48 md := goldmark.New( |
4
0b747e2d51c9
Add syntax highlighting support
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
49 goldmark.WithExtensions( |
0b747e2d51c9
Add syntax highlighting support
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
50 extension.GFM, |
0b747e2d51c9
Add syntax highlighting support
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
51 highlighting.Highlighting, |
7
a5aa39557726
Add parsing of YAML frontmatter
Jonatan Werpers <jonatan@werpers.com>
parents:
6
diff
changeset
|
52 meta.Meta, |
4
0b747e2d51c9
Add syntax highlighting support
Jonatan Werpers <jonatan@werpers.com>
parents:
1
diff
changeset
|
53 ), |
1
adf9c2b90279
Enable the gfm extension
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
54 goldmark.WithParserOptions( |
adf9c2b90279
Enable the gfm extension
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
55 parser.WithAutoHeadingID(), |
adf9c2b90279
Enable the gfm extension
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
56 ), |
adf9c2b90279
Enable the gfm extension
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
57 ) |
adf9c2b90279
Enable the gfm extension
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
58 |
6
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
59 var htmlContent bytes.Buffer |
7
a5aa39557726
Add parsing of YAML frontmatter
Jonatan Werpers <jonatan@werpers.com>
parents:
6
diff
changeset
|
60 parserContext := parser.NewContext() |
a5aa39557726
Add parsing of YAML frontmatter
Jonatan Werpers <jonatan@werpers.com>
parents:
6
diff
changeset
|
61 err = md.Convert(source, &htmlContent, parser.WithContext(parserContext)) |
0 | 62 if err != nil { |
63 log.Fatal(err) | |
64 } | |
6
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
65 |
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
66 if useTemplate { |
7
a5aa39557726
Add parsing of YAML frontmatter
Jonatan Werpers <jonatan@werpers.com>
parents:
6
diff
changeset
|
67 templateVars := meta.Get(parserContext) |
a5aa39557726
Add parsing of YAML frontmatter
Jonatan Werpers <jonatan@werpers.com>
parents:
6
diff
changeset
|
68 templateVars["content"] = htmlContent.String() |
a5aa39557726
Add parsing of YAML frontmatter
Jonatan Werpers <jonatan@werpers.com>
parents:
6
diff
changeset
|
69 |
a5aa39557726
Add parsing of YAML frontmatter
Jonatan Werpers <jonatan@werpers.com>
parents:
6
diff
changeset
|
70 err := tmpl.FRender(os.Stdout, templateVars) |
6
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
71 if err != nil { |
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
72 log.Fatal(err) |
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
73 } |
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
74 } else { |
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
75 fmt.Print(htmlContent) |
a5f397e25cb7
Add ability to render the markdown inside a template
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
76 } |
8
4a25b534c81c
Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
7
diff
changeset
|
77 |
4a25b534c81c
Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
7
diff
changeset
|
78 katexFormula := "c = \\pm\\sqrt{a^2 + b^2} = \\pm x^2" |
4a25b534c81c
Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
7
diff
changeset
|
79 katexRenderOptions := `{ |
4a25b534c81c
Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
7
diff
changeset
|
80 throwOnError: false, |
4a25b534c81c
Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
7
diff
changeset
|
81 displayMode: true, |
4a25b534c81c
Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
7
diff
changeset
|
82 } |
4a25b534c81c
Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
7
diff
changeset
|
83 ` |
4a25b534c81c
Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
7
diff
changeset
|
84 ctx, _ := v8go.NewContext(nil) // creates a new V8 context with a new Isolate aka VM |
4a25b534c81c
Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
7
diff
changeset
|
85 ctx.RunScript(katexSrc(), "katex/katex.js") |
4a25b534c81c
Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
7
diff
changeset
|
86 ctx.RunScript("const katexFormula = String.raw`"+katexFormula+"`", "main.js") // executes a script on the global context |
4a25b534c81c
Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
7
diff
changeset
|
87 ctx.RunScript("const mathHtml = katex.renderToString(katexFormula,"+katexRenderOptions+")", "main.js") // any functions previously added to the context can be called |
4a25b534c81c
Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
7
diff
changeset
|
88 mathHtml, _ := ctx.RunScript("mathHtml", "value.js") // return a value in JavaScript back to Go |
4a25b534c81c
Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
7
diff
changeset
|
89 fmt.Println(mathHtml) |
0 | 90 } |
8
4a25b534c81c
Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
7
diff
changeset
|
91 |
4a25b534c81c
Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
7
diff
changeset
|
92 func katexSrc() string { |
4a25b534c81c
Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
7
diff
changeset
|
93 katexBytes, err := ioutil.ReadFile("katex/katex.js") |
4a25b534c81c
Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
7
diff
changeset
|
94 if err != nil { |
4a25b534c81c
Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
7
diff
changeset
|
95 log.Fatal(err) |
4a25b534c81c
Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
7
diff
changeset
|
96 } |
4a25b534c81c
Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
7
diff
changeset
|
97 |
4a25b534c81c
Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
7
diff
changeset
|
98 return string(katexBytes) |
4a25b534c81c
Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
7
diff
changeset
|
99 } |