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("") for _, row := range table.Content { buf.WriteString("") for _, col := range row { buf.WriteString("") } buf.WriteString("") } buf.WriteString("
") buf.WriteString(col) buf.WriteString("
") break case "link": // TODO(peter): improve link rendering var link Link err = json.Unmarshal(block.Data, &link) if err != nil { return "", fmt.Errorf("error while parsing %s: %s", block.Type, err.Error()) } fmt.Fprintf(&buf, `%s`, link.Link, link.Meta.Title) case "list": var list List err = json.Unmarshal(block.Data, &list) if err != nil { return "", fmt.Errorf("error while parsing %s: %s", block.Type, err.Error()) } var tag string if list.Style == "ordered" { tag = "ol" } else { tag = "ul" } buf.WriteString("<") buf.WriteString(tag) buf.WriteString(">") for _, item := range list.Items { buf.WriteString("
  • ") buf.WriteString(item) buf.WriteString("
  • ") } buf.WriteString("") case "header": var header Header err = json.Unmarshal(block.Data, &header) if err != nil { return "", fmt.Errorf("error while parsing %s: %s", block.Type, err.Error()) } fmt.Fprintf(&buf, "%s", header.Level, header.Text, header.Level) case "paragraph": var para Paragraph err = json.Unmarshal(block.Data, ¶) if err != nil { return "", fmt.Errorf("error while parsing %s: %s", block.Type, err.Error()) } 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 }