Source file src/go/doc/synopsis.go

     1  // Copyright 2012 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 doc
     6  
     7  import (
     8  	"strings"
     9  	"unicode"
    10  )
    11  
    12  // firstSentenceLen returns the length of the first sentence in s.
    13  // The sentence ends after the first period followed by space and
    14  // not preceded by exactly one uppercase letter.
    15  //
    16  func firstSentenceLen(s string) int {
    17  	var ppp, pp, p rune
    18  	for i, q := range s {
    19  		if q == '\n' || q == '\r' || q == '\t' {
    20  			q = ' '
    21  		}
    22  		if q == ' ' && p == '.' && (!unicode.IsUpper(pp) || unicode.IsUpper(ppp)) {
    23  			return i
    24  		}
    25  		if p == '。' || p == '.' {
    26  			return i
    27  		}
    28  		ppp, pp, p = pp, p, q
    29  	}
    30  	return len(s)
    31  }
    32  
    33  const (
    34  	keepNL = 1 << iota
    35  )
    36  
    37  // clean replaces each sequence of space, \n, \r, or \t characters
    38  // with a single space and removes any trailing and leading spaces.
    39  // If the keepNL flag is set, newline characters are passed through
    40  // instead of being change to spaces.
    41  func clean(s string, flags int) string {
    42  	var b []byte
    43  	p := byte(' ')
    44  	for i := 0; i < len(s); i++ {
    45  		q := s[i]
    46  		if (flags&keepNL) == 0 && q == '\n' || q == '\r' || q == '\t' {
    47  			q = ' '
    48  		}
    49  		if q != ' ' || p != ' ' {
    50  			b = append(b, q)
    51  			p = q
    52  		}
    53  	}
    54  	// remove trailing blank, if any
    55  	if n := len(b); n > 0 && p == ' ' {
    56  		b = b[0 : n-1]
    57  	}
    58  	return string(b)
    59  }
    60  
    61  // Synopsis returns a cleaned version of the first sentence in s.
    62  // That sentence ends after the first period followed by space and
    63  // not preceded by exactly one uppercase letter. The result string
    64  // has no \n, \r, or \t characters and uses only single spaces between
    65  // words. If s starts with any of the IllegalPrefixes, the result
    66  // is the empty string.
    67  //
    68  func Synopsis(s string) string {
    69  	s = clean(s[0:firstSentenceLen(s)], 0)
    70  	for _, prefix := range IllegalPrefixes {
    71  		if strings.HasPrefix(strings.ToLower(s), prefix) {
    72  			return ""
    73  		}
    74  	}
    75  	s = convertQuotes(s)
    76  	return s
    77  }
    78  
    79  var IllegalPrefixes = []string{
    80  	"copyright",
    81  	"all rights",
    82  	"author",
    83  }
    84  

View as plain text