|
|
|
package goldmark
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"fmt"
|
|
|
|
// "errors"
|
|
|
|
"regexp"
|
|
|
|
|
|
|
|
"github.com/yuin/goldmark"
|
|
|
|
"github.com/yuin/goldmark/ast"
|
|
|
|
"github.com/yuin/goldmark/parser"
|
|
|
|
"github.com/yuin/goldmark/text"
|
|
|
|
"github.com/yuin/goldmark/util"
|
|
|
|
)
|
|
|
|
|
|
|
|
var contextKeyMeta = parser.NewContextKey()
|
|
|
|
|
|
|
|
func isSeparator(line []byte) bool {
|
|
|
|
r := regexp.MustCompile(`^\s*-{3,}\s*$`)
|
|
|
|
|
|
|
|
return r.Match(line)
|
|
|
|
}
|
|
|
|
|
|
|
|
type obsidianLinkParser struct{}
|
|
|
|
|
|
|
|
var defaultLinkParser = &obsidianLinkParser{}
|
|
|
|
|
|
|
|
func (b *obsidianLinkParser) Trigger() []byte {
|
|
|
|
// return []byte{'!', '[', ']'}
|
|
|
|
fmt.Println("obsidianLinkParser.Trigger()")
|
|
|
|
return []byte{'[', ']'}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (b *obsidianLinkParser) Parse(parent ast.Node, block text.Reader, pc parser.Context) ast.Node {
|
|
|
|
fmt.Println("obsidianLinkParser.Parse()")
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (b *obsidianLinkParser) Open(parent ast.Node, block text.Reader, pc parser.Context) (ast.Node, parser.State) {
|
|
|
|
fmt.Println("obsidianLinkParser.Open()")
|
|
|
|
linenum, _ := block.Position()
|
|
|
|
if linenum != 0 {
|
|
|
|
return nil, parser.NoChildren
|
|
|
|
}
|
|
|
|
|
|
|
|
line, _ := block.PeekLine()
|
|
|
|
|
|
|
|
if isSeparator(line) {
|
|
|
|
return ast.NewTextBlock(), parser.NoChildren
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil, parser.NoChildren
|
|
|
|
}
|
|
|
|
|
|
|
|
func (b *obsidianLinkParser) Continue(node ast.Node, reader text.Reader, pc parser.Context) parser.State {
|
|
|
|
line, segment := reader.PeekLine()
|
|
|
|
|
|
|
|
if isSeparator(line) {
|
|
|
|
reader.Advance(segment.Len())
|
|
|
|
|
|
|
|
return parser.Close
|
|
|
|
}
|
|
|
|
|
|
|
|
node.Lines().Append(segment)
|
|
|
|
|
|
|
|
return parser.Continue | parser.NoChildren
|
|
|
|
}
|
|
|
|
|
|
|
|
func (b *obsidianLinkParser) Close(node ast.Node, reader text.Reader, pc parser.Context) {
|
|
|
|
lines := node.Lines()
|
|
|
|
|
|
|
|
var buf bytes.Buffer
|
|
|
|
|
|
|
|
for i := 0; i < lines.Len(); i++ {
|
|
|
|
segment := lines.At(i)
|
|
|
|
buf.Write(segment.Value(reader.Source()))
|
|
|
|
}
|
|
|
|
pc.Set(contextKeyMeta, buf)
|
|
|
|
node.Parent().RemoveChild(node.Parent(), node)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (b *obsidianLinkParser) CanInterruptParagraph() bool {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (b *obsidianLinkParser) CanAcceptIndentedLine() bool {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
type obsidianLinkExtension struct{}
|
|
|
|
|
|
|
|
func (ole *obsidianLinkExtension) Extend(m goldmark.Markdown) {
|
|
|
|
m.Parser().AddOptions(
|
|
|
|
parser.WithInlineParsers(
|
|
|
|
util.Prioritized(defaultLinkParser, 0),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
var ObsidianLinkExtension = &obsidianLinkExtension{}
|