github.com/cozy/cozy-stack@v0.0.0-20240327093429-939e4a21320e/model/note/text.go (about) 1 package note 2 3 import ( 4 "fmt" 5 "strconv" 6 "time" 7 8 "github.com/cozy/prosemirror-go/markdown" 9 "github.com/cozy/prosemirror-go/model" 10 ) 11 12 func textSerializer() *markdown.Serializer { 13 nodes := map[string]markdown.NodeSerializerFunc{ 14 "paragraph": func(state *markdown.SerializerState, node, _parent *model.Node, _index int) { 15 state.RenderInline(node) 16 state.CloseBlock(node) 17 }, 18 "text": func(state *markdown.SerializerState, node, _parent *model.Node, _index int) { 19 state.Text(*node.Text) 20 }, 21 "bulletList": func(state *markdown.SerializerState, node, _parent *model.Node, _index int) { 22 state.RenderList(node, "", func(_ int) string { return "- " }) 23 }, 24 "orderedList": func(state *markdown.SerializerState, node, _parent *model.Node, _index int) { 25 state.RenderList(node, "", func(i int) string { return fmt.Sprintf("%d.", i+1) }) 26 }, 27 "listItem": func(state *markdown.SerializerState, node, _parent *model.Node, _index int) { 28 state.RenderContent(node) 29 }, 30 "taskList": func(state *markdown.SerializerState, node, _parent *model.Node, _index int) { 31 state.RenderList(node, "", func(_ int) string { return "- " }) 32 }, 33 "taskItem": func(state *markdown.SerializerState, node, _parent *model.Node, _index int) { 34 state.RenderContent(node) 35 }, 36 "decisionList": func(state *markdown.SerializerState, node, _parent *model.Node, _index int) { 37 state.RenderList(node, "", func(_ int) string { return "" }) 38 }, 39 "decisionItem": func(state *markdown.SerializerState, node, _parent *model.Node, _index int) { 40 state.RenderContent(node) 41 }, 42 "heading": func(state *markdown.SerializerState, node, _parent *model.Node, _index int) { 43 state.RenderInline(node) 44 state.CloseBlock(node) 45 }, 46 "blockquote": func(state *markdown.SerializerState, node, _parent *model.Node, _index int) { 47 state.RenderContent(node) 48 }, 49 "rule": func(state *markdown.SerializerState, node, _parent *model.Node, _index int) { 50 state.Write("---") 51 state.CloseBlock(node) 52 }, 53 "hardBreak": func(state *markdown.SerializerState, node, _parent *model.Node, _index int) { 54 state.Write("\n") 55 }, 56 "image": func(state *markdown.SerializerState, node, _parent *model.Node, _index int) { 57 // Nothing 58 }, 59 "codeBlock": func(state *markdown.SerializerState, node, _parent *model.Node, _index int) { 60 state.Text(node.TextContent(), false) 61 state.EnsureNewLine() 62 state.CloseBlock(node) 63 }, 64 "panel": func(state *markdown.SerializerState, node, _parent *model.Node, _index int) { 65 state.RenderContent(node) 66 }, 67 "table": func(state *markdown.SerializerState, node, _parent *model.Node, _index int) { 68 state.RenderContent(node) 69 state.EnsureNewLine() 70 state.CloseBlock(node) 71 }, 72 "tableRow": func(state *markdown.SerializerState, node, _parent *model.Node, _index int) { 73 state.RenderContent(node) 74 state.EnsureNewLine() 75 state.CloseBlock(node) 76 }, 77 "tableHeader": func(state *markdown.SerializerState, node, _parent *model.Node, _index int) { 78 state.RenderContent(node) 79 }, 80 "tableCell": func(state *markdown.SerializerState, node, _parent *model.Node, _index int) { 81 state.RenderContent(node) 82 }, 83 "status": func(state *markdown.SerializerState, node, _parent *model.Node, _index int) { 84 if txt, ok := node.Attrs["text"].(string); ok { 85 state.Text(txt) 86 } 87 }, 88 "date": func(state *markdown.SerializerState, node, _parent *model.Node, _index int) { 89 if ts, ok := node.Attrs["timestamp"].(string); ok { 90 if seconds, err := strconv.ParseInt(ts, 10, 64); err == nil { 91 txt := time.Unix(seconds/1000, 0).Format("2006-01-02") 92 state.Text(txt) 93 } 94 } 95 }, 96 "mediaSingle": func(state *markdown.SerializerState, node, _parent *model.Node, _index int) { 97 state.RenderContent(node) 98 }, 99 "media": func(state *markdown.SerializerState, node, _parent *model.Node, _index int) { 100 // Nothing 101 }, 102 } 103 marks := map[string]markdown.MarkSerializerSpec{ 104 "em": {}, 105 "strong": {}, 106 "link": {}, 107 "code": {}, 108 "strike": {}, 109 "indentation": {}, 110 "breakout": {}, 111 "underline": {}, 112 "subsup": {}, 113 "textColor": {}, 114 } 115 return markdown.NewSerializer(nodes, marks) 116 }