internal/catmsg: support Affix message type Change-Id: Iabf2ef415f3610598607a44d8f2c35a70743da3e Reviewed-on: https://go-review.googlesource.com/83815 Run-TryBot: Marcel van Lohuizen <mpvl@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Nigel Tao <nigeltao@golang.org>
diff --git a/cmd/gotext/examples/extract/catalog.go b/cmd/gotext/examples/extract/catalog.go index 4c2303f..c9e8495 100644 --- a/cmd/gotext/examples/extract/catalog.go +++ b/cmd/gotext/examples/extract/catalog.go
@@ -62,7 +62,7 @@ const en_USData string = "" + // Size: 201 bytes "\x02Hello world!\x0a\x02Hello %[1]s!\x0a\x02%[1]s is visiting %[2]s!\x0a" + - "\x02%[1]s is visiting %[3]s!\x0a\x04\x01\x81\x01\x00\x02\x14\x02One file" + + "\x02%[1]s is visiting %[3]s!\x0a\x14\x01\x81\x01\x00\x02\x14\x02One file" + " remaining!\x00&\x02There are %[1]d more files remaining!\x02%[1]s is ou" + "t of order!\x02%.2[1]f miles traveled (%[1]f)" @@ -73,4 +73,4 @@ const zhData string = "" -// Total table size 471 bytes (0KiB); checksum: 7746955 +// Total table size 471 bytes (0KiB); checksum: 2452D1C5
diff --git a/internal/catmsg/catmsg.go b/internal/catmsg/catmsg.go index 32d6c20..c0bf86f 100644 --- a/internal/catmsg/catmsg.go +++ b/internal/catmsg/catmsg.go
@@ -104,20 +104,24 @@ msgFirst msgRaw msgString - numFixed + msgAffix + // Leave some arbitrary room for future expansion: 20 should suffice. + numInternal = 20 ) const prefix = "golang.org/x/text/internal/catmsg." var ( + // TODO: find a more stable way to link handles to message types. mutex sync.Mutex names = map[string]Handle{ prefix + "Vars": msgVars, prefix + "First": msgFirst, prefix + "Raw": msgRaw, prefix + "String": msgString, + prefix + "Affix": msgAffix, } - handlers = make([]Handler, numFixed) + handlers = make([]Handler, numInternal) ) func init() { @@ -161,6 +165,20 @@ } return true } + + handlers[msgAffix] = func(d *Decoder) bool { + // TODO: use an alternative method for common cases. + prefix := d.DecodeString() + suffix := d.DecodeString() + if prefix != "" { + d.Render(prefix) + } + ret := d.ExecuteMessage() + if suffix != "" { + d.Render(suffix) + } + return ret + } } var ( @@ -374,3 +392,24 @@ } return err } + +// Affix is a message that adds a prefix and suffix to another message. +// This is mostly used add back whitespace to a translation that was stripped +// before sending it out. +type Affix struct { + Message Message + Prefix string + Suffix string +} + +// Compile implements Message. +func (a Affix) Compile(e *Encoder) (err error) { + // TODO: consider adding a special message type that just adds a single + // return. This is probably common enough to handle the majority of cases. + // Get some stats first, though. + e.EncodeMessageType(msgAffix) + e.EncodeString(a.Prefix) + e.EncodeString(a.Suffix) + e.EncodeMessage(a.Message) + return nil +}
diff --git a/internal/catmsg/catmsg_test.go b/internal/catmsg/catmsg_test.go index 485d19c..b2a7a9e 100644 --- a/internal/catmsg/catmsg_test.go +++ b/internal/catmsg/catmsg_test.go
@@ -71,6 +71,10 @@ m: String("foo"), tests: single("foo", ""), }, { + desc: "affix", + m: &Affix{String("foo"), "\t", "\n"}, + tests: single("\t|foo|\n", ""), + }, { desc: "missing var", m: String("foo${bar}"), enc: "\x03\x03foo\x02\x03bar", @@ -101,6 +105,13 @@ }, tests: single("foo|baz", ""), }, { + desc: "affix with substitution", + m: &Affix{seq{ + &Var{"bar", String("baz")}, + String("foo${bar}"), + }, "\t", "\n"}, + tests: single("\t|foo|baz|\n", ""), + }, { desc: "shadowed variable", m: seq{ &Var{"bar", String("baz")}, @@ -140,7 +151,7 @@ &Var{"bar", incomplete{}}, String("${bar}"), }, - enc: "\x00\t\b\x01\x01\x04\x04\x02bar\x03\x00\x00\x00", + enc: "\x00\t\b\x01\x01\x14\x04\x02bar\x03\x00\x00\x00", // TODO: recognize that it is cheaper to substitute bar. tests: single("bar", ""), }, {
diff --git a/message/pipeline/testdata/test1/catalog_gen.go b/message/pipeline/testdata/test1/catalog_gen.go index 76b0bf0..62f8686 100644 --- a/message/pipeline/testdata/test1/catalog_gen.go +++ b/message/pipeline/testdata/test1/catalog_gen.go
@@ -66,7 +66,7 @@ const en_USData string = "" + // Size: 201 bytes "\x02Hello world!\x0a\x02Hello %[1]s!\x0a\x02%[1]s is visiting %[2]s!\x0a" + - "\x02%[1]s is visiting %[3]s!\x0a\x04\x01\x81\x01\x00\x02\x14\x02One file" + + "\x02%[1]s is visiting %[3]s!\x0a\x14\x01\x81\x01\x00\x02\x14\x02One file" + " remaining!\x00&\x02There are %[1]d more files remaining!\x02%[1]s is ou" + "t of order!\x02%.2[1]f miles traveled (%[1]f)" @@ -78,4 +78,4 @@ const zhData string = "" -// Total table size 513 bytes (0KiB); checksum: B21180E3 +// Total table size 513 bytes (0KiB); checksum: 41415C53