gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

nickname.go (2055B)


      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 package precis
      6 
      7 import (
      8 	"unicode"
      9 	"unicode/utf8"
     10 
     11 	"golang.org/x/text/transform"
     12 )
     13 
     14 type nickAdditionalMapping struct {
     15 	// TODO: This transformer needs to be stateless somehow…
     16 	notStart  bool
     17 	prevSpace bool
     18 }
     19 
     20 func (t *nickAdditionalMapping) Reset() {
     21 	t.prevSpace = false
     22 	t.notStart = false
     23 }
     24 
     25 func (t *nickAdditionalMapping) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
     26 	// RFC 8266 §2.1.  Rules
     27 	//
     28 	// 2.  Additional Mapping Rule: The additional mapping rule consists of
     29 	//     the following sub-rules.
     30 	//
     31 	//     a.  Map any instances of non-ASCII space to SPACE (U+0020); a
     32 	//         non-ASCII space is any Unicode code point having a general
     33 	//         category of "Zs", naturally with the exception of SPACE
     34 	//         (U+0020).  (The inclusion of only ASCII space prevents
     35 	//         confusion with various non-ASCII space code points, many of
     36 	//         which are difficult to reproduce across different input
     37 	//         methods.)
     38 	//
     39 	//     b.  Remove any instances of the ASCII space character at the
     40 	//         beginning or end of a nickname (e.g., "stpeter " is mapped to
     41 	//         "stpeter").
     42 	//
     43 	//     c.  Map interior sequences of more than one ASCII space character
     44 	//         to a single ASCII space character (e.g., "St  Peter" is
     45 	//         mapped to "St Peter").
     46 	for nSrc < len(src) {
     47 		r, size := utf8.DecodeRune(src[nSrc:])
     48 		if size == 0 { // Incomplete UTF-8 encoding
     49 			if !atEOF {
     50 				return nDst, nSrc, transform.ErrShortSrc
     51 			}
     52 			size = 1
     53 		}
     54 		if unicode.Is(unicode.Zs, r) {
     55 			t.prevSpace = true
     56 		} else {
     57 			if t.prevSpace && t.notStart {
     58 				dst[nDst] = ' '
     59 				nDst += 1
     60 			}
     61 			if size != copy(dst[nDst:], src[nSrc:nSrc+size]) {
     62 				nDst += size
     63 				return nDst, nSrc, transform.ErrShortDst
     64 			}
     65 			nDst += size
     66 			t.prevSpace = false
     67 			t.notStart = true
     68 		}
     69 		nSrc += size
     70 	}
     71 	return nDst, nSrc, nil
     72 }