package  uniseg 
 
import  "unicode/utf8"  
 
 
const  ( 
	sbAny = iota  
	sbCR 
	sbParaSep 
	sbATerm 
	sbUpper 
	sbLower 
	sbSB7 
	sbSB8Close 
	sbSB8Sp 
	sbSTerm 
	sbSB8aClose 
	sbSB8aSp 
) 
 
 
const  ( 
	sbDontBreak = iota  
	sbBreak 
) 
 
 
 
var  sbTransitions = map [[2 ]int ][3 ]int { 
	 
	{sbAny , prCR }: {sbCR , sbDontBreak , 9990 }, 
	{sbCR , prLF }:  {sbParaSep , sbDontBreak , 30 }, 
 
	 
	{sbAny , prSep }:     {sbParaSep , sbDontBreak , 9990 }, 
	{sbAny , prLF }:      {sbParaSep , sbDontBreak , 9990 }, 
	{sbParaSep , prAny }: {sbAny , sbBreak , 40 }, 
	{sbCR , prAny }:      {sbAny , sbBreak , 40 }, 
 
	 
	{sbAny , prATerm }:     {sbATerm , sbDontBreak , 9990 }, 
	{sbATerm , prNumeric }: {sbAny , sbDontBreak , 60 }, 
	{sbSB7 , prNumeric }:   {sbAny , sbDontBreak , 60 },  
 
	 
	{sbAny , prUpper }:   {sbUpper , sbDontBreak , 9990 }, 
	{sbAny , prLower }:   {sbLower , sbDontBreak , 9990 }, 
	{sbUpper , prATerm }: {sbSB7 , sbDontBreak , 70 }, 
	{sbLower , prATerm }: {sbSB7 , sbDontBreak , 70 }, 
	{sbSB7 , prUpper }:   {sbUpper , sbDontBreak , 70 }, 
 
	 
	{sbAny , prSTerm }:           {sbSTerm , sbDontBreak , 9990 }, 
	{sbATerm , prSContinue }:     {sbAny , sbDontBreak , 81 }, 
	{sbATerm , prATerm }:         {sbATerm , sbDontBreak , 81 }, 
	{sbATerm , prSTerm }:         {sbSTerm , sbDontBreak , 81 }, 
	{sbSB7 , prSContinue }:       {sbAny , sbDontBreak , 81 }, 
	{sbSB7 , prATerm }:           {sbATerm , sbDontBreak , 81 }, 
	{sbSB7 , prSTerm }:           {sbSTerm , sbDontBreak , 81 }, 
	{sbSB8Close , prSContinue }:  {sbAny , sbDontBreak , 81 }, 
	{sbSB8Close , prATerm }:      {sbATerm , sbDontBreak , 81 }, 
	{sbSB8Close , prSTerm }:      {sbSTerm , sbDontBreak , 81 }, 
	{sbSB8Sp , prSContinue }:     {sbAny , sbDontBreak , 81 }, 
	{sbSB8Sp , prATerm }:         {sbATerm , sbDontBreak , 81 }, 
	{sbSB8Sp , prSTerm }:         {sbSTerm , sbDontBreak , 81 }, 
	{sbSTerm , prSContinue }:     {sbAny , sbDontBreak , 81 }, 
	{sbSTerm , prATerm }:         {sbATerm , sbDontBreak , 81 }, 
	{sbSTerm , prSTerm }:         {sbSTerm , sbDontBreak , 81 }, 
	{sbSB8aClose , prSContinue }: {sbAny , sbDontBreak , 81 }, 
	{sbSB8aClose , prATerm }:     {sbATerm , sbDontBreak , 81 }, 
	{sbSB8aClose , prSTerm }:     {sbSTerm , sbDontBreak , 81 }, 
	{sbSB8aSp , prSContinue }:    {sbAny , sbDontBreak , 81 }, 
	{sbSB8aSp , prATerm }:        {sbATerm , sbDontBreak , 81 }, 
	{sbSB8aSp , prSTerm }:        {sbSTerm , sbDontBreak , 81 }, 
 
	 
	{sbATerm , prClose }:     {sbSB8Close , sbDontBreak , 90 }, 
	{sbSB7 , prClose }:       {sbSB8Close , sbDontBreak , 90 }, 
	{sbSB8Close , prClose }:  {sbSB8Close , sbDontBreak , 90 }, 
	{sbATerm , prSp }:        {sbSB8Sp , sbDontBreak , 90 }, 
	{sbSB7 , prSp }:          {sbSB8Sp , sbDontBreak , 90 }, 
	{sbSB8Close , prSp }:     {sbSB8Sp , sbDontBreak , 90 }, 
	{sbSTerm , prClose }:     {sbSB8aClose , sbDontBreak , 90 }, 
	{sbSB8aClose , prClose }: {sbSB8aClose , sbDontBreak , 90 }, 
	{sbSTerm , prSp }:        {sbSB8aSp , sbDontBreak , 90 }, 
	{sbSB8aClose , prSp }:    {sbSB8aSp , sbDontBreak , 90 }, 
	{sbATerm , prSep }:       {sbParaSep , sbDontBreak , 90 }, 
	{sbATerm , prCR }:        {sbParaSep , sbDontBreak , 90 }, 
	{sbATerm , prLF }:        {sbParaSep , sbDontBreak , 90 }, 
	{sbSB7 , prSep }:         {sbParaSep , sbDontBreak , 90 }, 
	{sbSB7 , prCR }:          {sbParaSep , sbDontBreak , 90 }, 
	{sbSB7 , prLF }:          {sbParaSep , sbDontBreak , 90 }, 
	{sbSB8Close , prSep }:    {sbParaSep , sbDontBreak , 90 }, 
	{sbSB8Close , prCR }:     {sbParaSep , sbDontBreak , 90 }, 
	{sbSB8Close , prLF }:     {sbParaSep , sbDontBreak , 90 }, 
	{sbSTerm , prSep }:       {sbParaSep , sbDontBreak , 90 }, 
	{sbSTerm , prCR }:        {sbParaSep , sbDontBreak , 90 }, 
	{sbSTerm , prLF }:        {sbParaSep , sbDontBreak , 90 }, 
	{sbSB8aClose , prSep }:   {sbParaSep , sbDontBreak , 90 }, 
	{sbSB8aClose , prCR }:    {sbParaSep , sbDontBreak , 90 }, 
	{sbSB8aClose , prLF }:    {sbParaSep , sbDontBreak , 90 }, 
 
	 
	{sbSB8Sp , prSp }:  {sbSB8Sp , sbDontBreak , 100 }, 
	{sbSB8aSp , prSp }: {sbSB8aSp , sbDontBreak , 100 }, 
	{sbSB8Sp , prSep }: {sbParaSep , sbDontBreak , 100 }, 
	{sbSB8Sp , prCR }:  {sbParaSep , sbDontBreak , 100 }, 
	{sbSB8Sp , prLF }:  {sbParaSep , sbDontBreak , 100 }, 
 
	 
	{sbATerm , prAny }:     {sbAny , sbBreak , 110 }, 
	{sbSB7 , prAny }:       {sbAny , sbBreak , 110 }, 
	{sbSB8Close , prAny }:  {sbAny , sbBreak , 110 }, 
	{sbSB8Sp , prAny }:     {sbAny , sbBreak , 110 }, 
	{sbSTerm , prAny }:     {sbAny , sbBreak , 110 }, 
	{sbSB8aClose , prAny }: {sbAny , sbBreak , 110 }, 
	{sbSB8aSp , prAny }:    {sbAny , sbBreak , 110 }, 
	 
} 
 
 
 
 
 
 
 
func  transitionSentenceBreakState(state  int , r  rune , b  []byte , str  string ) (newState  int , sentenceBreak  bool ) { 
	 
	nextProperty  := property (sentenceBreakCodePoints , r ) 
 
	 
	if  nextProperty  == prExtend  || nextProperty  == prFormat  { 
		if  state  == sbParaSep  || state  == sbCR  { 
			return  sbAny , true   
		} 
		if  state  < 0  { 
			return  sbAny , true   
		} 
		return  state , false  
	} 
 
	 
	var  rule  int  
	transition , ok  := sbTransitions [[2 ]int {state , nextProperty }] 
	if  ok  { 
		 
		newState , sentenceBreak , rule  = transition [0 ], transition [1 ] == sbBreak , transition [2 ] 
	} else  { 
		 
		transAnyProp , okAnyProp  := sbTransitions [[2 ]int {state , prAny }] 
		transAnyState , okAnyState  := sbTransitions [[2 ]int {sbAny , nextProperty }] 
		if  okAnyProp  && okAnyState  { 
			 
			newState , sentenceBreak , rule  = transAnyState [0 ], transAnyState [1 ] == sbBreak , transAnyState [2 ] 
			if  transAnyProp [2 ] < transAnyState [2 ] { 
				sentenceBreak , rule  = transAnyProp [1 ] == sbBreak , transAnyProp [2 ] 
			} 
		} else  if  okAnyProp  { 
			 
			newState , sentenceBreak , rule  = transAnyProp [0 ], transAnyProp [1 ] == sbBreak , transAnyProp [2 ] 
			 
 
 
 
		} else  if  okAnyState  { 
			 
			newState , sentenceBreak , rule  = transAnyState [0 ], transAnyState [1 ] == sbBreak , transAnyState [2 ] 
		} else  { 
			 
			newState , sentenceBreak , rule  = sbAny , false , 9990  
		} 
	} 
 
	 
	if  rule  > 80  && (state  == sbATerm  || state  == sbSB8Close  || state  == sbSB8Sp  || state  == sbSB7 ) { 
		 
		var  length  int  
		for  nextProperty  != prOLetter  && 
			nextProperty  != prUpper  && 
			nextProperty  != prLower  && 
			nextProperty  != prSep  && 
			nextProperty  != prCR  && 
			nextProperty  != prLF  && 
			nextProperty  != prATerm  && 
			nextProperty  != prSTerm  { 
			 
			if  b  != nil  {  
				r , length  = utf8 .DecodeRune (b ) 
				b  = b [length :] 
			} else  {  
				r , length  = utf8 .DecodeRuneInString (str ) 
				str  = str [length :] 
			} 
			if  r  == utf8 .RuneError  { 
				break  
			} 
			nextProperty  = property (sentenceBreakCodePoints , r ) 
		} 
		if  nextProperty  == prLower  { 
			return  sbLower , false  
		} 
	} 
 
	return  
} 
  
The pages are generated with Golds   v0.6.7 . (GOOS=linux GOARCH=amd64)
Golds  is a Go 101  project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @Go100and1  (reachable from the left QR code) to get the latest news of Golds .