gopkg.in/alecthomas/gometalinter.v3@v3.0.0/_linters/src/golang.org/x/text/width/gen_common.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  // This code is shared between the main code generator and the test code.
    10  
    11  import (
    12  	"flag"
    13  	"log"
    14  	"strconv"
    15  	"strings"
    16  
    17  	"golang.org/x/text/internal/gen"
    18  	"golang.org/x/text/internal/ucd"
    19  )
    20  
    21  var (
    22  	outputFile = flag.String("out", "tables.go", "output file")
    23  )
    24  
    25  var typeMap = map[string]elem{
    26  	"A":  tagAmbiguous,
    27  	"N":  tagNeutral,
    28  	"Na": tagNarrow,
    29  	"W":  tagWide,
    30  	"F":  tagFullwidth,
    31  	"H":  tagHalfwidth,
    32  }
    33  
    34  // getWidthData calls f for every entry for which it is defined.
    35  //
    36  // f may be called multiple times for the same rune. The last call to f is the
    37  // correct value. f is not called for all runes. The default tag type is
    38  // Neutral.
    39  func getWidthData(f func(r rune, tag elem, alt rune)) {
    40  	// Set the default values for Unified Ideographs. In line with Annex 11,
    41  	// we encode full ranges instead of the defined runes in Unified_Ideograph.
    42  	for _, b := range []struct{ lo, hi rune }{
    43  		{0x4E00, 0x9FFF},   // the CJK Unified Ideographs block,
    44  		{0x3400, 0x4DBF},   // the CJK Unified Ideographs Externsion A block,
    45  		{0xF900, 0xFAFF},   // the CJK Compatibility Ideographs block,
    46  		{0x20000, 0x2FFFF}, // the Supplementary Ideographic Plane,
    47  		{0x30000, 0x3FFFF}, // the Tertiary Ideographic Plane,
    48  	} {
    49  		for r := b.lo; r <= b.hi; r++ {
    50  			f(r, tagWide, 0)
    51  		}
    52  	}
    53  
    54  	inverse := map[rune]rune{}
    55  	maps := map[string]bool{
    56  		"<wide>":   true,
    57  		"<narrow>": true,
    58  	}
    59  
    60  	// We cannot reuse package norm's decomposition, as we need an unexpanded
    61  	// decomposition. We make use of the opportunity to verify that the
    62  	// decomposition type is as expected.
    63  	ucd.Parse(gen.OpenUCDFile("UnicodeData.txt"), func(p *ucd.Parser) {
    64  		r := p.Rune(0)
    65  		s := strings.SplitN(p.String(ucd.DecompMapping), " ", 2)
    66  		if !maps[s[0]] {
    67  			return
    68  		}
    69  		x, err := strconv.ParseUint(s[1], 16, 32)
    70  		if err != nil {
    71  			log.Fatalf("Error parsing rune %q", s[1])
    72  		}
    73  		if inverse[r] != 0 || inverse[rune(x)] != 0 {
    74  			log.Fatalf("Circular dependency in mapping between %U and %U", r, x)
    75  		}
    76  		inverse[r] = rune(x)
    77  		inverse[rune(x)] = r
    78  	})
    79  
    80  	// <rune range>;<type>
    81  	ucd.Parse(gen.OpenUCDFile("EastAsianWidth.txt"), func(p *ucd.Parser) {
    82  		tag, ok := typeMap[p.String(1)]
    83  		if !ok {
    84  			log.Fatalf("Unknown width type %q", p.String(1))
    85  		}
    86  		r := p.Rune(0)
    87  		alt, ok := inverse[r]
    88  		if tag == tagFullwidth || tag == tagHalfwidth && r != wonSign {
    89  			tag |= tagNeedsFold
    90  			if !ok {
    91  				log.Fatalf("Narrow or wide rune %U has no decomposition", r)
    92  			}
    93  		}
    94  		f(r, tag, alt)
    95  	})
    96  }