mirror of https://github.com/usememos/memos
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
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,
|
|
}
|
|
}
|