// This file was generated by go generate; DO NOT EDIT package width // This code is shared between the main code generator and the test code. import ( "flag" "log" "strconv" "strings" "gx/QmVgdgtv5rUcWWcHvHN1vdGkXi8UNztJ7JuT72YUJgG2ic/go-text/internal/gen" "gx/QmVgdgtv5rUcWWcHvHN1vdGkXi8UNztJ7JuT72YUJgG2ic/go-text/internal/ucd" ) var ( outputFile = flag.String("out", "tables.go", "output file") ) var typeMap = map[string]elem{ "A": tagAmbiguous, "N": tagNeutral, "Na": tagNarrow, "W": tagWide, "F": tagFullwidth, "H": tagHalfwidth, } // getWidthData calls f for every entry for which it is defined. // // f may be called multiple times for the same rune. The last call to f is the // correct value. f is not called for all runes. The default tag type is // Neutral. func getWidthData(f func(r rune, tag elem, alt rune)) { // Set the default values for Unified Ideographs. In line with Annex 11, // we encode full ranges instead of the defined runes in Unified_Ideograph. for _, b := range []struct{ lo, hi rune }{ {0x4E00, 0x9FFF}, // the CJK Unified Ideographs block, {0x3400, 0x4DBF}, // the CJK Unified Ideographs Externsion A block, {0xF900, 0xFAFF}, // the CJK Compatibility Ideographs block, {0x20000, 0x2FFFF}, // the Supplementary Ideographic Plane, {0x30000, 0x3FFFF}, // the Tertiary Ideographic Plane, } { for r := b.lo; r <= b.hi; r++ { f(r, tagWide, 0) } } inverse := map[rune]rune{} maps := map[string]bool{ "": true, "": true, } // We cannot reuse package norm's decomposition, as we need an unexpanded // decomposition. We make use of the opportunity to verify that the // decomposition type is as expected. parse("UnicodeData.txt", func(p *ucd.Parser) { r := p.Rune(0) s := strings.SplitN(p.String(ucd.DecompMapping), " ", 2) if !maps[s[0]] { return } x, err := strconv.ParseUint(s[1], 16, 32) if err != nil { log.Fatalf("Error parsing rune %q", s[1]) } if inverse[r] != 0 || inverse[rune(x)] != 0 { log.Fatalf("Circular dependency in mapping between %U and %U", r, x) } inverse[r] = rune(x) inverse[rune(x)] = r }) // ; parse("EastAsianWidth.txt", func(p *ucd.Parser) { tag, ok := typeMap[p.String(1)] if !ok { log.Fatalf("Unknown width type %q", p.String(1)) } r := p.Rune(0) alt, ok := inverse[r] if tag == tagFullwidth || tag == tagHalfwidth && r != wonSign { tag |= tagNeedsFold if !ok { log.Fatalf("Narrow or wide rune %U has no decomposition", r) } } f(r, tag, alt) }) } // parse calls f for each entry in the given UCD file. func parse(filename string, f func(p *ucd.Parser)) { r := gen.OpenUCDFile(filename) defer r.Close() p := ucd.New(r) for p.Next() { f(p) } if err := p.Err(); err != nil { log.Fatal(err) } }