chore: update table node delimiter

pull/2782/head
Steven 1 year ago
parent 05c0aeb789
commit 8ed827cd2d

@ -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})

@ -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 {

@ -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)

@ -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"},

@ -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
}
}

@ -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;

@ -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 | |

@ -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,

Loading…
Cancel
Save