package main import ( "bytes" "encoding/json" "fmt" ) type Block struct { Type string Data json.RawMessage } type Paragraph struct { Text string } type Code struct { Code string } type List struct { Style string Items []string } type Header struct { Level int Text string } type ChecklistItem struct { Text string Checked bool } type Checklist struct { Style string Items []ChecklistItem } type Link struct { Link string Meta LinkResponseMeta } type Table struct { Content [][]string } type Document struct { Time int64 Version string Blocks []Block } func renderJSON(text string) (string, error) { var data Document err := json.Unmarshal([]byte(text), &data) if err != nil { return "", err } var buf bytes.Buffer for _, block := range data.Blocks { switch block.Type { case "table": var table Table err = json.Unmarshal(block.Data, &table) if err != nil { return "", fmt.Errorf("error while parsing %s: %s", block.Type, err.Error()) } buf.WriteString("
") buf.WriteString(col) buf.WriteString(" | ") } buf.WriteString("
") buf.WriteString(para.Text) buf.WriteString("
") case "code": var code Code err = json.Unmarshal(block.Data, &code) if err != nil { return "", fmt.Errorf("error while parsing %s: %s", block.Type, err.Error()) } buf.WriteString("") buf.WriteString(code.Code) buf.WriteString("") case "checklist": var checklist Checklist err = json.Unmarshal(block.Data, &checklist) if err != nil { return "", fmt.Errorf("error while parsing %s: %s", block.Type, err.Error()) } for _, item := range checklist.Items { buf.WriteString("
") buf.WriteString(``) if item.Checked { buf.WriteString(` `) buf.WriteString(` `) buf.WriteString(` `) buf.WriteString(` `) } buf.WriteString(``) buf.WriteString(item.Text) buf.WriteString("
") } default: return "", fmt.Errorf("unknown type: %s", block.Type) } fmt.Fprintln(&buf) } return buf.String(), nil }