github.com/go-xe2/third@v1.0.3/golang.org/x/text/unicode/bidi/gen.go (about) 1 // Copyright 2015 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // +build ignore 6 7 package main 8 9 import ( 10 "flag" 11 "log" 12 13 "github.com/go-xe2/third/golang.org/x/text/internal/gen" 14 "github.com/go-xe2/third/golang.org/x/text/internal/triegen" 15 "github.com/go-xe2/third/golang.org/x/text/internal/ucd" 16 ) 17 18 var outputFile = flag.String("out", "tables.go", "output file") 19 20 func main() { 21 gen.Init() 22 gen.Repackage("gen_trieval.go", "trieval.go", "bidi") 23 gen.Repackage("gen_ranges.go", "ranges_test.go", "bidi") 24 25 genTables() 26 } 27 28 // bidiClass names and codes taken from class "bc" in 29 // http://www.unicode.org/Public/8.0.0/ucd/PropertyValueAliases.txt 30 var bidiClass = map[string]Class{ 31 "AL": AL, // ArabicLetter 32 "AN": AN, // ArabicNumber 33 "B": B, // ParagraphSeparator 34 "BN": BN, // BoundaryNeutral 35 "CS": CS, // CommonSeparator 36 "EN": EN, // EuropeanNumber 37 "ES": ES, // EuropeanSeparator 38 "ET": ET, // EuropeanTerminator 39 "L": L, // LeftToRight 40 "NSM": NSM, // NonspacingMark 41 "ON": ON, // OtherNeutral 42 "R": R, // RightToLeft 43 "S": S, // SegmentSeparator 44 "WS": WS, // WhiteSpace 45 46 "FSI": Control, 47 "PDF": Control, 48 "PDI": Control, 49 "LRE": Control, 50 "LRI": Control, 51 "LRO": Control, 52 "RLE": Control, 53 "RLI": Control, 54 "RLO": Control, 55 } 56 57 func genTables() { 58 if numClass > 0x0F { 59 log.Fatalf("Too many Class constants (%#x > 0x0F).", numClass) 60 } 61 w := gen.NewCodeWriter() 62 defer w.WriteGoFile(*outputFile, "bidi") 63 64 gen.WriteUnicodeVersion(w) 65 66 t := triegen.NewTrie("bidi") 67 68 // Build data about bracket mapping. These bits need to be or-ed with 69 // any other bits. 70 orMask := map[rune]uint64{} 71 72 xorMap := map[rune]int{} 73 xorMasks := []rune{0} // First value is no-op. 74 75 ucd.Parse(gen.OpenUCDFile("BidiBrackets.txt"), func(p *ucd.Parser) { 76 r1 := p.Rune(0) 77 r2 := p.Rune(1) 78 xor := r1 ^ r2 79 if _, ok := xorMap[xor]; !ok { 80 xorMap[xor] = len(xorMasks) 81 xorMasks = append(xorMasks, xor) 82 } 83 entry := uint64(xorMap[xor]) << xorMaskShift 84 switch p.String(2) { 85 case "o": 86 entry |= openMask 87 case "c", "n": 88 default: 89 log.Fatalf("Unknown bracket class %q.", p.String(2)) 90 } 91 orMask[r1] = entry 92 }) 93 94 w.WriteComment(` 95 xorMasks contains masks to be xor-ed with brackets to get the reverse 96 version.`) 97 w.WriteVar("xorMasks", xorMasks) 98 99 done := map[rune]bool{} 100 101 insert := func(r rune, c Class) { 102 if !done[r] { 103 t.Insert(r, orMask[r]|uint64(c)) 104 done[r] = true 105 } 106 } 107 108 // Insert the derived BiDi properties. 109 ucd.Parse(gen.OpenUCDFile("extracted/DerivedBidiClass.txt"), func(p *ucd.Parser) { 110 r := p.Rune(0) 111 class, ok := bidiClass[p.String(1)] 112 if !ok { 113 log.Fatalf("%U: Unknown BiDi class %q", r, p.String(1)) 114 } 115 insert(r, class) 116 }) 117 visitDefaults(insert) 118 119 // TODO: use sparse blocks. This would reduce table size considerably 120 // from the looks of it. 121 122 sz, err := t.Gen(w) 123 if err != nil { 124 log.Fatal(err) 125 } 126 w.Size += sz 127 } 128 129 // dummy values to make methods in gen_common compile. The real versions 130 // will be generated by this file to tables.go. 131 var ( 132 xorMasks []rune 133 )