diff --git a/public/parsing.wasm b/public/parsing.wasm index 83c0240..dedec62 100644 Binary files a/public/parsing.wasm and b/public/parsing.wasm differ diff --git a/src/parsing/embed.go b/src/parsing/embed.go index fd10bf4..d97d7d2 100644 --- a/src/parsing/embed.go +++ b/src/parsing/embed.go @@ -14,55 +14,55 @@ import ( ) var ( - REEmbedTag = regexp.MustCompile(`^!embed\((?P.+?)\)`) - // TODO: Timestamped youtube embeds REYoutubeLong = regexp.MustCompile(`^https://www\.youtube\.com/watch?.*v=(?P[a-zA-Z0-9_-]{11})`) REYoutubeShort = regexp.MustCompile(`^https://youtu\.be/(?P[a-zA-Z0-9_-]{11})`) REVimeo = regexp.MustCompile(`^https://vimeo\.com/(?P\d+)`) + // TODO: Twitch VODs / clips + // TODO: Desmos + // TODO: Tweets ) // ---------------------- // Parser and delimiters // ---------------------- -type embedParser struct{} - -func NewEmbedParser() parser.BlockParser { - return embedParser{} +type embedParser struct { + Preview bool } +var _ parser.BlockParser = embedParser{} + func (s embedParser) Trigger() []byte { - return []byte{'!'} + return nil } func (s embedParser) Open(parent ast.Node, reader text.Reader, pc parser.Context) (ast.Node, parser.State) { restOfLine, _ := reader.PeekLine() - urlMatch := REEmbedTag.FindSubmatch(restOfLine) - if urlMatch == nil { - return nil, parser.NoChildren - } - url := urlMatch[REEmbedTag.SubexpIndex("url")] html := "" - if ytLongMatch := extract(REYoutubeLong, url, "vid"); ytLongMatch != nil { - html = makeYoutubeEmbed(string(ytLongMatch)) - } else if ytShortMatch := extract(REYoutubeShort, url, "vid"); ytShortMatch != nil { - html = makeYoutubeEmbed(string(ytShortMatch)) - } else if vimeoMatch := extract(REVimeo, url, "vid"); vimeoMatch != nil { - html = ` + var match []byte + if ytLongMatch := extract(REYoutubeLong, restOfLine, "vid"); ytLongMatch != nil { + match = ytLongMatch + html = makeYoutubeEmbed(string(ytLongMatch), s.Preview) + } else if ytShortMatch := extract(REYoutubeShort, restOfLine, "vid"); ytShortMatch != nil { + match = ytShortMatch + html = makeYoutubeEmbed(string(ytShortMatch), s.Preview) + } else if vimeoMatch := extract(REVimeo, restOfLine, "vid"); vimeoMatch != nil { + match = vimeoMatch + html = s.previewOrLegitEmbed("Vimeo", `
- +
-
` +`) } if html == "" { return nil, parser.NoChildren } - reader.Advance(len(urlMatch[0])) + reader.Advance(len(match)) return NewEmbed(html), parser.NoChildren } @@ -80,6 +80,22 @@ func (s embedParser) CanAcceptIndentedLine() bool { return false } +func (s embedParser) previewOrLegitEmbed(name string, legitHtml string) string { + if s.Preview { + return ` +
+
+
+ ` + name + ` embed +
+
+
+` + } + + return legitHtml +} + func extract(re *regexp.Regexp, src []byte, subexpName string) []byte { m := re.FindSubmatch(src) if m == nil { @@ -88,13 +104,22 @@ func extract(re *regexp.Regexp, src []byte, subexpName string) []byte { return m[re.SubexpIndex(subexpName)] } -func makeYoutubeEmbed(vid string) string { - return ` +func makeYoutubeEmbed(vid string, preview bool) string { + if preview { + return ` +
+ +
+` + } else { + return `
-
` + +` + } } // ---------------------- @@ -155,11 +180,13 @@ func (r *EmbedHTMLRenderer) renderEmbed(w util.BufWriter, source []byte, n gast. // Extension // ---------------------- -type EmbedExtension struct{} +type EmbedExtension struct { + Preview bool +} func (e EmbedExtension) Extend(m goldmark.Markdown) { m.Parser().AddOptions(parser.WithBlockParsers( - util.Prioritized(NewEmbedParser(), 500), + util.Prioritized(embedParser{Preview: e.Preview}, 500), )) m.Renderer().AddOptions(renderer.WithNodeRenderers( util.Prioritized(NewEmbedHTMLRenderer(), 500), diff --git a/src/parsing/parsing.go b/src/parsing/parsing.go index dcf8cd8..23868a9 100644 --- a/src/parsing/parsing.go +++ b/src/parsing/parsing.go @@ -90,11 +90,31 @@ func tokenizeBBCode(input string) []token { return tokens } -var md = goldmark.New( - goldmark.WithExtensions(extension.GFM, SpoilerExtension{}, EmbedExtension{}, bTag{}), +var previewMarkdown = goldmark.New( + goldmark.WithExtensions( + extension.GFM, + SpoilerExtension{}, + EmbedExtension{ + Preview: true, + }, + bTag{}, + ), +) +var realMarkdown = goldmark.New( + goldmark.WithExtensions( + extension.GFM, + SpoilerExtension{}, + EmbedExtension{}, + bTag{}, + ), ) -func ParsePostInput(source string) string { +func ParsePostInput(source string, preview bool) string { + md := realMarkdown + if preview { + md = previewMarkdown + } + var buf bytes.Buffer if err := md.Convert([]byte(source), &buf); err != nil { panic(err) diff --git a/src/parsing/parsing_test.go b/src/parsing/parsing_test.go index c9d413e..4f4573c 100644 --- a/src/parsing/parsing_test.go +++ b/src/parsing/parsing_test.go @@ -47,7 +47,7 @@ Mix 'em: [u][/i]wow.[/i][/u] // } func TestBBCodeParsing(t *testing.T) { - res := ParsePostInput(`[b]ONE[/b] [i]TWO[/i]`) + res := ParsePostInput(`[b]ONE[/b] [i]TWO[/i]`, false) fmt.Println(res) t.Fail() } diff --git a/src/parsing/wasm/parsingmain.go b/src/parsing/wasm/parsingmain.go index cd40b1a..ffbd689 100644 --- a/src/parsing/wasm/parsingmain.go +++ b/src/parsing/wasm/parsingmain.go @@ -8,7 +8,7 @@ import ( func main() { js.Global().Set("parseMarkdown", js.FuncOf(func(this js.Value, args []js.Value) interface{} { - return parsing.ParsePostInput(args[0].String()) + return parsing.ParsePostInput(args[0].String(), true) })) var done chan bool