Skip to content

Commit

Permalink
修复在复杂repeated导出时lua和json出现的格式错误
Browse files Browse the repository at this point in the history
  • Loading branch information
davyxu committed Aug 11, 2016
1 parent 1da69d9 commit 54cf7fb
Show file tree
Hide file tree
Showing 11 changed files with 114 additions and 97 deletions.
2 changes: 1 addition & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ func main() {

// 版本
if *paramVersion {
fmt.Println("tabtoy 1.1.0")
fmt.Println("tabtoy 1.1.1")
return
}

Expand Down
8 changes: 6 additions & 2 deletions printer/json.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,11 @@ type jsonWriter struct {

func (self *jsonWriter) RepeatedMessageBegin(fd *pbmeta.FieldDescriptor, msg *data.DynamicMessage, msgCount int, indent int) {

self.printer.WriteString(fmt.Sprintf("\"%s\" : [\n", fd.Name()))
if indent == 1 {
self.printer.WriteString(fmt.Sprintf("\"%s\" : [\n", fd.Name()))
} else {
self.printer.WriteString(fmt.Sprintf("\"%s\" : [", fd.Name()))
}

}

Expand All @@ -25,7 +29,7 @@ func (self *jsonWriter) WriteMessage(fd *pbmeta.FieldDescriptor, msg *data.Dynam

pos := self.printer.Len()

if indent == 1 {
if indent == 1 || fd.IsRepeated() {
self.printer.WriteString("{")

} else {
Expand Down
8 changes: 6 additions & 2 deletions printer/lua.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,17 @@ type luaWriter struct {

func (self *luaWriter) RepeatedMessageBegin(fd *pbmeta.FieldDescriptor, msg *data.DynamicMessage, msgCount int, indent int) {

self.printer.WriteString(fmt.Sprintf("%s = {\n", fd.Name()))
if indent == 1 {
self.printer.WriteString(fmt.Sprintf("%s = {\n", fd.Name()))
} else {
self.printer.WriteString(fmt.Sprintf("%s = {", fd.Name()))
}
}

// Value是消息的字段
func (self *luaWriter) WriteMessage(fd *pbmeta.FieldDescriptor, msg *data.DynamicMessage, indent int) {

if indent == 1 {
if indent == 1 || fd.IsRepeated() {
self.printer.WriteString("{")

} else {
Expand Down
59 changes: 2 additions & 57 deletions printer/shared.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package printer

import (
"bytes"
"fmt"

"github.com/davyxu/pbmeta"
pbprotos "github.com/davyxu/pbmeta/proto"
Expand Down Expand Up @@ -38,7 +37,7 @@ func rawWriteMessage(printer *bytes.Buffer, writer dataWriter, msg *data.Dynamic

pos := printer.Len()

if i > 0 {
if i > 0 && valueWrite > 0 {
writer.WriteFieldSpliter()
}

Expand Down Expand Up @@ -127,6 +126,7 @@ func rawWriteMessage(printer *bytes.Buffer, writer dataWriter, msg *data.Dynamic

// 单值
if value, ok := msg.GetValue(fd); ok {

writer.WriteValue(fd, value, indent)
valueWrite++

Expand All @@ -147,58 +147,3 @@ func rawWriteMessage(printer *bytes.Buffer, writer dataWriter, msg *data.Dynamic
return

}

func getDefaultValueCount(msg *data.DynamicMessage) int {

var valueCount int

for i := 0; i < msg.Desc.FieldCount(); i++ {
fd := msg.Desc.Field(i)
if fd.DefaultValue() != "" {
valueCount++
}
}

return valueCount
}

func valueWrapper(fd *pbmeta.FieldDescriptor, value string) string {
switch fd.Type() {
case pbprotos.FieldDescriptorProto_TYPE_STRING:
return strEscape(value)
}

return value
}

func strEscape(s string) string {

b := make([]byte, 0)

var index int

// 表中直接使用换行会干扰最终合并文件格式, 所以转成\n,由pbt文本解析层转回去
for index < len(s) {
c := s[index]

switch c {
case '"':
b = append(b, '\\')
b = append(b, '"')
case '\x0A':
b = append(b, '\\')
b = append(b, 'n')
case '\x0D':
b = append(b, '\\')
b = append(b, 'r')
default:
b = append(b, c)
}

index++

}

return fmt.Sprintf("\"%s\"", string(b))

}
64 changes: 64 additions & 0 deletions printer/util.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package printer

import (
"fmt"

"github.com/davyxu/pbmeta"
pbprotos "github.com/davyxu/pbmeta/proto"
"github.com/davyxu/tabtoy/data"
)

func getDefaultValueCount(msg *data.DynamicMessage) int {

var valueCount int

for i := 0; i < msg.Desc.FieldCount(); i++ {
fd := msg.Desc.Field(i)
if fd.DefaultValue() != "" {
valueCount++
}
}

return valueCount
}

func valueWrapper(fd *pbmeta.FieldDescriptor, value string) string {
switch fd.Type() {
case pbprotos.FieldDescriptorProto_TYPE_STRING:
return strEscape(value)
}

return value
}

func strEscape(s string) string {

b := make([]byte, 0)

var index int

// 表中直接使用换行会干扰最终合并文件格式, 所以转成\n,由pbt文本解析层转回去
for index < len(s) {
c := s[index]

switch c {
case '"':
b = append(b, '\\')
b = append(b, '"')
case '\x0A':
b = append(b, '\\')
b = append(b, 'n')
case '\x0D':
b = append(b, '\\')
b = append(b, 'r')
default:
b = append(b, c)
}

index++

}

return fmt.Sprintf("\"%s\"", string(b))

}
10 changes: 5 additions & 5 deletions test/Actor.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
{

"Actor" : [
{"ID": 100, "Name": "黑猫警长", "Struct" : {"HP": 100, "AttackRate": 0.6}, "BuffID" : [0, 0], "SkillID" : [4, 6, 7]},
{"ID": 101, "Name": "葫芦\n", "Struct" : {"HP": 10, "AttackRate": 0.8}, "BuffID" : [3, 1], "Type": 21, "SkillID" : [1]},
{"ID": 102, "Name": "\"\"", "Struct" : {"HP": 10, "AttackRate": 0.7}, "BuffID" : [0, 0], "SkillID" : [0], "StrStruct" : {"HP": 2, "AttackRate": 0.5}},
{"ID": 103, "Name": "\n", "Struct" : {"HP": 205}, "BuffID" : [0, 0], "SkillID" : [0]},
{"ID": 104, "Name": "邋遢大王", "Struct" : {"HP": 10, "AttackRate": 1}, "BuffID" : [0, 0], "SkillID" : [0]}
{"ID": 100, "Name": "黑猫警长", "Struct" : {"HP": 100, "AttackRate": 0.6}, "BuffID" : [0, 0], "SkillID" : [4, 6, 7], "StrStruct" : []},
{"ID": 101, "Name": "葫芦\n", "Struct" : {"HP": 10, "AttackRate": 0.8}, "BuffID" : [3, 1], "Type": 21, "SkillID" : [1], "StrStruct" : []},
{"ID": 102, "Name": "\"\"", "Struct" : {"HP": 10, "AttackRate": 0.7}, "BuffID" : [0, 0], "SkillID" : [0], "StrStruct" : [{"HP": 2}, {"AttackRate": 0.5}, {"HP": 3, "AttackRate": 1}]},
{"ID": 103, "Name": "\n", "Struct" : {"HP": 205}, "BuffID" : [0, 0], "SkillID" : [0], "StrStruct" : []},
{"ID": 104, "Name": "邋遢大王", "Struct" : {"HP": 10, "AttackRate": 1}, "BuffID" : [0, 0], "SkillID" : [0], "StrStruct" : []}
]

}
10 changes: 5 additions & 5 deletions test/Actor.lua
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
return {

Actor = {
{ID = "100", Name = "黑猫警长", Struct = {HP = 100, AttackRate = 0.6}, BuffID = 0, BuffID = 0, SkillID = 4, SkillID = 6, SkillID = 7, StrStruct = {}},
{ID = "101", Name = "葫芦\n", Struct = {HP = 10, AttackRate = 0.8}, BuffID = 3, BuffID = 1, Type = "Power", SkillID = 1, StrStruct = {}},
{ID = "102", Name = "\"\"", Struct = {HP = 10, AttackRate = 0.7}, BuffID = 0, BuffID = 0, SkillID = 0, StrStruct = {HP = 2, AttackRate = 0.5}},
{ID = "103", Name = "\n", Struct = {HP = 205}, BuffID = 0, BuffID = 0, SkillID = 0, StrStruct = {}},
{ID = "104", Name = "邋遢大王", Struct = {HP = 10, AttackRate = 1}, BuffID = 0, BuffID = 0, SkillID = 0, StrStruct = {}}
{ID = "100", Name = "黑猫警长", Struct = {HP = 100, AttackRate = 0.6}, BuffID = 0, BuffID = 0, SkillID = 4, SkillID = 6, SkillID = 7, StrStruct = {{}, {}, {}}},
{ID = "101", Name = "葫芦\n", Struct = {HP = 10, AttackRate = 0.8}, BuffID = 3, BuffID = 1, Type = "Power", SkillID = 1, StrStruct = {{}, {}, {}}},
{ID = "102", Name = "\"\"", Struct = {HP = 10, AttackRate = 0.7}, BuffID = 0, BuffID = 0, SkillID = 0, StrStruct = {{HP = 2}, {AttackRate = 0.5}, {HP = 3, AttackRate = 1}}},
{ID = "103", Name = "\n", Struct = {HP = 205}, BuffID = 0, BuffID = 0, SkillID = 0, StrStruct = {{}, {}, {}}},
{ID = "104", Name = "邋遢大王", Struct = {HP = 10, AttackRate = 1}, BuffID = 0, BuffID = 0, SkillID = 0, StrStruct = {{}, {}, {}}}
}

}
10 changes: 5 additions & 5 deletions test/Actor.pbt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Generated by github.com/davyxu/tabtoy
Actor {ID: 100 Name: "黑猫警长" Struct {HP: 100 AttackRate: 0.6} BuffID: 0 BuffID: 0 SkillID: 4 SkillID: 6 SkillID: 7}
Actor {ID: 101 Name: "葫芦\n" Struct {HP: 10 AttackRate: 0.8} BuffID: 3 BuffID: 1 Type: Power SkillID: 1}
Actor {ID: 102 Name: "\"\"" Struct {HP: 10 AttackRate: 0.7} BuffID: 0 BuffID: 0 SkillID: 0 StrStruct {HP: 2 AttackRate: 0.5}}
Actor {ID: 103 Name: "\n" Struct {HP: 205} BuffID: 0 BuffID: 0 SkillID: 0}
Actor {ID: 104 Name: "邋遢大王" Struct {HP: 10 AttackRate: 1} BuffID: 0 BuffID: 0 SkillID: 0}
Actor {ID: 100 Name: "黑猫警长" Struct {HP: 100 AttackRate: 0.6} BuffID: 0 BuffID: 0 SkillID: 4 SkillID: 6 SkillID: 7 }
Actor {ID: 101 Name: "葫芦\n" Struct {HP: 10 AttackRate: 0.8} BuffID: 3 BuffID: 1 Type: Power SkillID: 1 }
Actor {ID: 102 Name: "\"\"" Struct {HP: 10 AttackRate: 0.7} BuffID: 0 BuffID: 0 SkillID: 0 StrStruct {HP: 2} StrStruct {AttackRate: 0.5} StrStruct {HP: 3 AttackRate: 1}}
Actor {ID: 103 Name: "\n" Struct {HP: 205} BuffID: 0 BuffID: 0 SkillID: 0 }
Actor {ID: 104 Name: "邋遢大王" Struct {HP: 10 AttackRate: 1} BuffID: 0 BuffID: 0 SkillID: 0 }
Binary file modified test/Actor.xlsx
Binary file not shown.
2 changes: 1 addition & 1 deletion test/test.proto
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ message ActorDefine

repeated int32 SkillID = 40; // [tabtoy] String2ListSpliter: "," #使用,切割字符串

Prop StrStruct = 50; // [tabtoy] String2Struct: true
repeated Prop StrStruct = 50; // [tabtoy] String2Struct: true

}

Expand Down
38 changes: 19 additions & 19 deletions test/test/test.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 54cf7fb

Please sign in to comment.