From 8ed827cd2d815c22c499722a7e40c627909b6a94 Mon Sep 17 00:00:00 2001 From: Steven Date: Thu, 18 Jan 2024 11:36:13 +0800 Subject: [PATCH] chore: update table node delimiter --- api/v2/markdown_service.go | 12 +++------ plugin/gomark/ast/block.go | 11 +++----- plugin/gomark/parser/table.go | 29 ++++++++++++--------- plugin/gomark/parser/table_test.go | 15 +++++++++-- plugin/gomark/parser/tokenizer/tokenizer.go | 5 +++- proto/api/v2/markdown_service.proto | 2 +- proto/gen/api/v2/README.md | 2 +- proto/gen/api/v2/markdown_service.pb.go | 6 ++--- 8 files changed, 45 insertions(+), 37 deletions(-) diff --git a/api/v2/markdown_service.go b/api/v2/markdown_service.go index 87f3b756..b7fc859d 100644 --- a/api/v2/markdown_service.go +++ b/api/v2/markdown_service.go @@ -172,10 +172,8 @@ func convertToASTNode(node *apiv2pb.Node) ast.Node { func convertTableToASTNode(node *apiv2pb.Node) *ast.Table { table := &ast.Table{ - Header: node.GetTableNode().Header, - } - for _, d := range node.GetTableNode().Delimiter { - table.Delimiter = append(table.Delimiter, int(d)) + Header: node.GetTableNode().Header, + Delimiter: node.GetTableNode().Delimiter, } for _, row := range node.GetTableNode().Rows { table.Rows = append(table.Rows, row.Cells) @@ -185,10 +183,8 @@ func convertTableToASTNode(node *apiv2pb.Node) *ast.Table { func convertTableFromASTNode(node *ast.Table) *apiv2pb.TableNode { table := &apiv2pb.TableNode{ - Header: node.Header, - } - for _, d := range node.Delimiter { - table.Delimiter = append(table.Delimiter, int32(d)) + Header: node.Header, + Delimiter: node.Delimiter, } for _, row := range node.Rows { table.Rows = append(table.Rows, &apiv2pb.TableNode_Row{Cells: row}) diff --git a/plugin/gomark/ast/block.go b/plugin/gomark/ast/block.go index ae04abe7..91165cc0 100644 --- a/plugin/gomark/ast/block.go +++ b/plugin/gomark/ast/block.go @@ -198,9 +198,8 @@ func (n *MathBlock) Restore() string { type Table struct { BaseBlock - Header []string - // Delimiter is the list of delimiter counts. - Delimiter []int + Header []string + Delimiter []string Rows [][]string } @@ -215,11 +214,7 @@ func (n *Table) Restore() string { } result += "|\n" for _, d := range n.Delimiter { - symbol := "" - for i := 0; i < d; i++ { - symbol += "-" - } - result += fmt.Sprintf("| %s ", symbol) + result += fmt.Sprintf("| %s ", d) } result += "|\n" for index, row := range n.Rows { diff --git a/plugin/gomark/parser/table.go b/plugin/gomark/parser/table.go index b4d36130..3740e473 100644 --- a/plugin/gomark/parser/table.go +++ b/plugin/gomark/parser/table.go @@ -26,21 +26,21 @@ func (*TableParser) Match(tokens []*tokenizer.Token) (int, bool) { return 0, false } - alignTokens := []*tokenizer.Token{} + delimiterTokens := []*tokenizer.Token{} for _, token := range tokens[len(headerTokens)+1:] { if token.Type == tokenizer.Newline { break } else { - alignTokens = append(alignTokens, token) + delimiterTokens = append(delimiterTokens, token) } } - if len(alignTokens) < 5 || len(tokens) < len(headerTokens)+len(alignTokens)+3 { + if len(delimiterTokens) < 5 || len(tokens) < len(headerTokens)+len(delimiterTokens)+3 { return 0, false } rowTokens := []*tokenizer.Token{} - for index, token := range tokens[len(headerTokens)+len(alignTokens)+2:] { - temp := len(headerTokens) + len(alignTokens) + 2 + index + for index, token := range tokens[len(headerTokens)+len(delimiterTokens)+2:] { + temp := len(headerTokens) + len(delimiterTokens) + 2 + index if token.Type == tokenizer.Newline && temp != len(tokens)-1 && tokens[temp+1].Type != tokenizer.Pipe { break } else { @@ -60,20 +60,23 @@ func (*TableParser) Match(tokens []*tokenizer.Token) (int, bool) { return 0, false } - // Check align. - if len(alignTokens) < 5 { + // Check delimiter. + if len(delimiterTokens) < 5 { return 0, false } - alignCells, ok := matchTableCellTokens(alignTokens) + alignCells, ok := matchTableCellTokens(delimiterTokens) if alignCells != headerCells || !ok { return 0, false } - for _, t := range tokenizer.Split(alignTokens, tokenizer.Pipe) { + for _, t := range tokenizer.Split(delimiterTokens, tokenizer.Pipe) { delimiterTokens := t[1 : len(t)-1] if len(delimiterTokens) < 3 { return 0, false } - for _, token := range delimiterTokens { + if (delimiterTokens[0].Type != tokenizer.Colon && delimiterTokens[0].Type != tokenizer.Hyphen) || (delimiterTokens[len(delimiterTokens)-1].Type != tokenizer.Colon && delimiterTokens[len(delimiterTokens)-1].Type != tokenizer.Hyphen) { + return 0, false + } + for _, token := range delimiterTokens[1 : len(delimiterTokens)-1] { if token.Type != tokenizer.Hyphen { return 0, false } @@ -95,7 +98,7 @@ func (*TableParser) Match(tokens []*tokenizer.Token) (int, bool) { } } - return len(headerTokens) + len(alignTokens) + len(rowTokens) + 2, true + return len(headerTokens) + len(delimiterTokens) + len(rowTokens) + 2, true } func (p *TableParser) Parse(tokens []*tokenizer.Token) (ast.Node, error) { @@ -109,14 +112,14 @@ func (p *TableParser) Parse(tokens []*tokenizer.Token) (ast.Node, error) { alignTokens := rawRows[1] rowTokens := rawRows[2:] header := make([]string, 0) - delimiter := make([]int, 0) + delimiter := make([]string, 0) rows := make([][]string, 0) for _, t := range tokenizer.Split(headerTokens, tokenizer.Pipe) { header = append(header, tokenizer.Stringify(t[1:len(t)-1])) } for _, t := range tokenizer.Split(alignTokens, tokenizer.Pipe) { - delimiter = append(delimiter, len(t[1:len(t)-1])) + delimiter = append(delimiter, tokenizer.Stringify(t[1:len(t)-1])) } for _, row := range rowTokens { cells := make([]string, 0) diff --git a/plugin/gomark/parser/table_test.go b/plugin/gomark/parser/table_test.go index d40cc9be..0fdc2c8a 100644 --- a/plugin/gomark/parser/table_test.go +++ b/plugin/gomark/parser/table_test.go @@ -18,7 +18,7 @@ func TestTableParser(t *testing.T) { text: "| header |\n| --- |\n| cell |\n", table: &ast.Table{ Header: []string{"header"}, - Delimiter: []int{3}, + Delimiter: []string{"---"}, Rows: [][]string{ {"cell"}, }, @@ -28,7 +28,18 @@ func TestTableParser(t *testing.T) { text: "| header1 | header2 |\n| --- | ---- |\n| cell1 | cell2 |\n| cell3 | cell4 |", table: &ast.Table{ Header: []string{"header1", "header2"}, - Delimiter: []int{3, 4}, + Delimiter: []string{"---", "----"}, + Rows: [][]string{ + {"cell1", "cell2"}, + {"cell3", "cell4"}, + }, + }, + }, + { + text: "| header1 | header2 |\n| :-- | ----: |\n| cell1 | cell2 |\n| cell3 | cell4 |", + table: &ast.Table{ + Header: []string{"header1", "header2"}, + Delimiter: []string{":--", "----:"}, Rows: [][]string{ {"cell1", "cell2"}, {"cell3", "cell4"}, diff --git a/plugin/gomark/parser/tokenizer/tokenizer.go b/plugin/gomark/parser/tokenizer/tokenizer.go index 471e5bc5..f719f6c7 100644 --- a/plugin/gomark/parser/tokenizer/tokenizer.go +++ b/plugin/gomark/parser/tokenizer/tokenizer.go @@ -21,6 +21,7 @@ const ( DollarSign TokenType = "$" EqualSign TokenType = "=" Pipe TokenType = "|" + Colon TokenType = ":" Backslash TokenType = "\\" Newline TokenType = "\n" Space TokenType = " " @@ -83,6 +84,8 @@ func Tokenize(text string) []*Token { tokens = append(tokens, NewToken(EqualSign, "=")) case '|': tokens = append(tokens, NewToken(Pipe, "|")) + case ':': + tokens = append(tokens, NewToken(Colon, ":")) case '\\': tokens = append(tokens, NewToken(Backslash, `\`)) case '\n': @@ -142,4 +145,4 @@ func Split(tokens []*Token, delimiter TokenType) [][]*Token { result = append(result, current) } return result -} \ No newline at end of file +} diff --git a/proto/api/v2/markdown_service.proto b/proto/api/v2/markdown_service.proto index 2441bea8..92e7e7c2 100644 --- a/proto/api/v2/markdown_service.proto +++ b/proto/api/v2/markdown_service.proto @@ -130,7 +130,7 @@ message MathBlockNode { message TableNode { repeated string header = 1; - repeated int32 delimiter = 2; + repeated string delimiter = 2; message Row { repeated string cells = 1; diff --git a/proto/gen/api/v2/README.md b/proto/gen/api/v2/README.md index 2f18e784..ebb5cf5a 100644 --- a/proto/gen/api/v2/README.md +++ b/proto/gen/api/v2/README.md @@ -1330,7 +1330,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | header | [string](#string) | repeated | | -| delimiter | [int32](#int32) | repeated | | +| delimiter | [string](#string) | repeated | | | rows | [TableNode.Row](#memos-api-v2-TableNode-Row) | repeated | | diff --git a/proto/gen/api/v2/markdown_service.pb.go b/proto/gen/api/v2/markdown_service.pb.go index 8cb2e6de..b4907b28 100644 --- a/proto/gen/api/v2/markdown_service.pb.go +++ b/proto/gen/api/v2/markdown_service.pb.go @@ -1166,7 +1166,7 @@ type TableNode struct { unknownFields protoimpl.UnknownFields Header []string `protobuf:"bytes,1,rep,name=header,proto3" json:"header,omitempty"` - Delimiter []int32 `protobuf:"varint,2,rep,packed,name=delimiter,proto3" json:"delimiter,omitempty"` + Delimiter []string `protobuf:"bytes,2,rep,name=delimiter,proto3" json:"delimiter,omitempty"` Rows []*TableNode_Row `protobuf:"bytes,3,rep,name=rows,proto3" json:"rows,omitempty"` } @@ -1209,7 +1209,7 @@ func (x *TableNode) GetHeader() []string { return nil } -func (x *TableNode) GetDelimiter() []int32 { +func (x *TableNode) GetDelimiter() []string { if x != nil { return x.Delimiter } @@ -2101,7 +2101,7 @@ var file_api_v2_markdown_service_proto_rawDesc = []byte{ 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x05, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x04, + 0x09, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x1a, 0x1b, 0x0a,