2018-12-16 11:19:16 +00:00
|
|
|
// Copyright 2015 The Go Authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
// +build ignore
|
|
|
|
|
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"flag"
|
|
|
|
"log"
|
|
|
|
|
|
|
|
"golang.org/x/text/internal/gen"
|
|
|
|
"golang.org/x/text/internal/triegen"
|
|
|
|
"golang.org/x/text/internal/ucd"
|
|
|
|
)
|
|
|
|
|
|
|
|
var outputFile = flag.String("out", "tables.go", "output file")
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
gen.Init()
|
|
|
|
gen.Repackage("gen_trieval.go", "trieval.go", "bidi")
|
|
|
|
gen.Repackage("gen_ranges.go", "ranges_test.go", "bidi")
|
|
|
|
|
|
|
|
genTables()
|
|
|
|
}
|
|
|
|
|
|
|
|
// bidiClass names and codes taken from class "bc" in
|
2019-06-09 00:01:48 +00:00
|
|
|
// https://www.unicode.org/Public/8.0.0/ucd/PropertyValueAliases.txt
|
2018-12-16 11:19:16 +00:00
|
|
|
var bidiClass = map[string]Class{
|
|
|
|
"AL": AL, // ArabicLetter
|
|
|
|
"AN": AN, // ArabicNumber
|
|
|
|
"B": B, // ParagraphSeparator
|
|
|
|
"BN": BN, // BoundaryNeutral
|
|
|
|
"CS": CS, // CommonSeparator
|
|
|
|
"EN": EN, // EuropeanNumber
|
|
|
|
"ES": ES, // EuropeanSeparator
|
|
|
|
"ET": ET, // EuropeanTerminator
|
|
|
|
"L": L, // LeftToRight
|
|
|
|
"NSM": NSM, // NonspacingMark
|
|
|
|
"ON": ON, // OtherNeutral
|
|
|
|
"R": R, // RightToLeft
|
|
|
|
"S": S, // SegmentSeparator
|
|
|
|
"WS": WS, // WhiteSpace
|
|
|
|
|
|
|
|
"FSI": Control,
|
|
|
|
"PDF": Control,
|
|
|
|
"PDI": Control,
|
|
|
|
"LRE": Control,
|
|
|
|
"LRI": Control,
|
|
|
|
"LRO": Control,
|
|
|
|
"RLE": Control,
|
|
|
|
"RLI": Control,
|
|
|
|
"RLO": Control,
|
|
|
|
}
|
|
|
|
|
|
|
|
func genTables() {
|
|
|
|
if numClass > 0x0F {
|
|
|
|
log.Fatalf("Too many Class constants (%#x > 0x0F).", numClass)
|
|
|
|
}
|
|
|
|
w := gen.NewCodeWriter()
|
|
|
|
defer w.WriteVersionedGoFile(*outputFile, "bidi")
|
|
|
|
|
|
|
|
gen.WriteUnicodeVersion(w)
|
|
|
|
|
|
|
|
t := triegen.NewTrie("bidi")
|
|
|
|
|
|
|
|
// Build data about bracket mapping. These bits need to be or-ed with
|
|
|
|
// any other bits.
|
|
|
|
orMask := map[rune]uint64{}
|
|
|
|
|
|
|
|
xorMap := map[rune]int{}
|
|
|
|
xorMasks := []rune{0} // First value is no-op.
|
|
|
|
|
|
|
|
ucd.Parse(gen.OpenUCDFile("BidiBrackets.txt"), func(p *ucd.Parser) {
|
|
|
|
r1 := p.Rune(0)
|
|
|
|
r2 := p.Rune(1)
|
|
|
|
xor := r1 ^ r2
|
|
|
|
if _, ok := xorMap[xor]; !ok {
|
|
|
|
xorMap[xor] = len(xorMasks)
|
|
|
|
xorMasks = append(xorMasks, xor)
|
|
|
|
}
|
|
|
|
entry := uint64(xorMap[xor]) << xorMaskShift
|
|
|
|
switch p.String(2) {
|
|
|
|
case "o":
|
|
|
|
entry |= openMask
|
|
|
|
case "c", "n":
|
|
|
|
default:
|
|
|
|
log.Fatalf("Unknown bracket class %q.", p.String(2))
|
|
|
|
}
|
|
|
|
orMask[r1] = entry
|
|
|
|
})
|
|
|
|
|
|
|
|
w.WriteComment(`
|
|
|
|
xorMasks contains masks to be xor-ed with brackets to get the reverse
|
|
|
|
version.`)
|
|
|
|
w.WriteVar("xorMasks", xorMasks)
|
|
|
|
|
|
|
|
done := map[rune]bool{}
|
|
|
|
|
|
|
|
insert := func(r rune, c Class) {
|
|
|
|
if !done[r] {
|
|
|
|
t.Insert(r, orMask[r]|uint64(c))
|
|
|
|
done[r] = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Insert the derived BiDi properties.
|
|
|
|
ucd.Parse(gen.OpenUCDFile("extracted/DerivedBidiClass.txt"), func(p *ucd.Parser) {
|
|
|
|
r := p.Rune(0)
|
|
|
|
class, ok := bidiClass[p.String(1)]
|
|
|
|
if !ok {
|
|
|
|
log.Fatalf("%U: Unknown BiDi class %q", r, p.String(1))
|
|
|
|
}
|
|
|
|
insert(r, class)
|
|
|
|
})
|
|
|
|
visitDefaults(insert)
|
|
|
|
|
|
|
|
// TODO: use sparse blocks. This would reduce table size considerably
|
|
|
|
// from the looks of it.
|
|
|
|
|
|
|
|
sz, err := t.Gen(w)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
w.Size += sz
|
|
|
|
}
|
|
|
|
|
|
|
|
// dummy values to make methods in gen_common compile. The real versions
|
|
|
|
// will be generated by this file to tables.go.
|
|
|
|
var (
|
|
|
|
xorMasks []rune
|
|
|
|
)
|