mirror of
https://github.com/usememos/memos.git
synced 2024-12-20 17:51:50 +03:00
dbc85fe7e4
* feat: image and link parser * chore: update
56 lines
1.1 KiB
Go
56 lines
1.1 KiB
Go
package parser
|
|
|
|
import "github.com/usememos/memos/plugin/gomark/parser/tokenizer"
|
|
|
|
type ImageParser struct {
|
|
AltText string
|
|
URL string
|
|
}
|
|
|
|
func NewImageParser() *ImageParser {
|
|
return &ImageParser{}
|
|
}
|
|
|
|
func (*ImageParser) Match(tokens []*tokenizer.Token) *ImageParser {
|
|
if len(tokens) < 5 {
|
|
return nil
|
|
}
|
|
if tokens[0].Type != tokenizer.ExclamationMark {
|
|
return nil
|
|
}
|
|
if tokens[1].Type != tokenizer.LeftSquareBracket {
|
|
return nil
|
|
}
|
|
cursor, altText := 2, ""
|
|
for ; cursor < len(tokens)-2; cursor++ {
|
|
if tokens[cursor].Type == tokenizer.Newline {
|
|
return nil
|
|
}
|
|
if tokens[cursor].Type == tokenizer.RightSquareBracket {
|
|
break
|
|
}
|
|
altText += tokens[cursor].Value
|
|
}
|
|
if tokens[cursor+1].Type != tokenizer.LeftParenthesis {
|
|
return nil
|
|
}
|
|
matched, url := false, ""
|
|
for _, token := range tokens[cursor+2:] {
|
|
if token.Type == tokenizer.Newline || token.Type == tokenizer.Space {
|
|
return nil
|
|
}
|
|
if token.Type == tokenizer.RightParenthesis {
|
|
matched = true
|
|
break
|
|
}
|
|
url += token.Value
|
|
}
|
|
if !matched || url == "" {
|
|
return nil
|
|
}
|
|
return &ImageParser{
|
|
AltText: altText,
|
|
URL: url,
|
|
}
|
|
}
|