package noteButtons import ( "bytes" "fmt" "log" "strings" "github.com/yuin/goldmark/ast" "github.com/yuin/goldmark/parser" "github.com/yuin/goldmark/renderer" "github.com/yuin/goldmark/text" "github.com/yuin/goldmark/util" ) type RevealTokenButton struct { ast.BaseBlock SceneId string TokenId string Campaign string Label string } type RevealTokenButtonData struct { SceneId string `json:"sceneId"` TokenId string `json:"tokenId"` Campaign string `json:"campaign"` Label string `json:"label"` } var KindRevealTokenButton = ast.NewNodeKind("RevealTokenButton") func (b *RevealTokenButton) Kind() ast.NodeKind { return KindRevealTokenButton } func (b *RevealTokenButton) Dump(source []byte, level int) { ast.DumpHelper(b, source, level, nil, nil) } type RevealTokenButtonParser struct{} func (p *RevealTokenButtonParser) Trigger() []byte { return []byte{'{'} } func (p *RevealTokenButtonParser) Parse(parent ast.Node, reader text.Reader, pc parser.Context) ast.Node { line, _ := reader.PeekLine() if !bytes.HasPrefix(line, []byte("{{")) { return nil } // Find the closing }} end := bytes.Index(line[2:], []byte("}}")) if end < 0 { return nil } end += 2 contents := strings.TrimSpace(string(line[2:end])) if !strings.HasPrefix(contents, "revealTokenButton") { return nil } contents = strings.TrimSpace(strings.TrimPrefix(contents, "revealTokenButton")) args, err := parseArgs(contents) if err != nil { log.Default().Println(err) return nil } campaign, _ := pc.Get(CampaignContextKey).(string) reader.Advance(end + 2) return &RevealTokenButton{ SceneId: args["sceneId"], TokenId: args["tokenId"], Campaign: campaign, Label: args["label"], } } type RevealTokenButtonRenderer struct{} func (r *RevealTokenButtonRenderer) renderRevealTokenButton(writer util.BufWriter, _ []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { if !entering { return ast.WalkContinue, nil } button := node.(*RevealTokenButton) fmt.Fprintf( writer, ``, button.Campaign, button.SceneId, button.TokenId, button.Label, ) return ast.WalkContinue, nil } func (r *RevealTokenButtonRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) { reg.Register(KindRevealTokenButton, r.renderRevealTokenButton) }