package uniseg
import "unicode/utf8"
const (
lbAny = iota
lbBK
lbCR
lbLF
lbNL
lbSP
lbZW
lbWJ
lbGL
lbBA
lbHY
lbCL
lbCP
lbEX
lbIS
lbSY
lbOP
lbQU
lbQUSP
lbNS
lbCLCPSP
lbB2
lbB2SP
lbCB
lbBB
lbLB21a
lbHL
lbAL
lbNU
lbPR
lbEB
lbIDEM
lbNUNU
lbNUSY
lbNUIS
lbNUCL
lbNUCP
lbPO
lbJL
lbJV
lbJT
lbH2
lbH3
lbOddRI
lbEvenRI
lbExtPicCn
lbZWJBit = 64
lbCPeaFWHBit = 128
)
const (
LineDontBreak = iota
LineCanBreak
LineMustBreak
)
var lbTransitions = map [[2 ]int ][3 ]int {
{lbAny , prBK }: {lbBK , LineCanBreak , 310 },
{lbBK , prAny }: {lbAny , LineMustBreak , 40 },
{lbAny , prCR }: {lbCR , LineCanBreak , 310 },
{lbAny , prLF }: {lbLF , LineCanBreak , 310 },
{lbAny , prNL }: {lbNL , LineCanBreak , 310 },
{lbCR , prLF }: {lbLF , LineDontBreak , 50 },
{lbCR , prAny }: {lbAny , LineMustBreak , 50 },
{lbLF , prAny }: {lbAny , LineMustBreak , 50 },
{lbNL , prAny }: {lbAny , LineMustBreak , 50 },
{lbAny , prBK }: {lbBK , LineDontBreak , 60 },
{lbAny , prCR }: {lbCR , LineDontBreak , 60 },
{lbAny , prLF }: {lbLF , LineDontBreak , 60 },
{lbAny , prNL }: {lbNL , LineDontBreak , 60 },
{lbAny , prSP }: {lbSP , LineDontBreak , 70 },
{lbAny , prZW }: {lbZW , LineDontBreak , 70 },
{lbZW , prSP }: {lbZW , LineDontBreak , 70 },
{lbZW , prAny }: {lbAny , LineCanBreak , 80 },
{lbAny , prWJ }: {lbWJ , LineDontBreak , 110 },
{lbWJ , prAny }: {lbAny , LineDontBreak , 110 },
{lbAny , prGL }: {lbGL , LineCanBreak , 310 },
{lbGL , prAny }: {lbAny , LineDontBreak , 120 },
{lbAny , prCL }: {lbCL , LineCanBreak , 310 },
{lbAny , prCP }: {lbCP , LineCanBreak , 310 },
{lbAny , prEX }: {lbEX , LineDontBreak , 130 },
{lbAny , prIS }: {lbIS , LineCanBreak , 310 },
{lbAny , prSY }: {lbSY , LineCanBreak , 310 },
{lbAny , prOP }: {lbOP , LineCanBreak , 310 },
{lbOP , prSP }: {lbOP , LineDontBreak , 70 },
{lbOP , prAny }: {lbAny , LineDontBreak , 140 },
{lbQU , prSP }: {lbQUSP , LineDontBreak , 70 },
{lbQU , prOP }: {lbOP , LineDontBreak , 150 },
{lbQUSP , prOP }: {lbOP , LineDontBreak , 150 },
{lbCL , prSP }: {lbCLCPSP , LineDontBreak , 70 },
{lbNUCL , prSP }: {lbCLCPSP , LineDontBreak , 70 },
{lbCP , prSP }: {lbCLCPSP , LineDontBreak , 70 },
{lbNUCP , prSP }: {lbCLCPSP , LineDontBreak , 70 },
{lbCL , prNS }: {lbNS , LineDontBreak , 160 },
{lbNUCL , prNS }: {lbNS , LineDontBreak , 160 },
{lbCP , prNS }: {lbNS , LineDontBreak , 160 },
{lbNUCP , prNS }: {lbNS , LineDontBreak , 160 },
{lbCLCPSP , prNS }: {lbNS , LineDontBreak , 160 },
{lbAny , prB2 }: {lbB2 , LineCanBreak , 310 },
{lbB2 , prSP }: {lbB2SP , LineDontBreak , 70 },
{lbB2 , prB2 }: {lbB2 , LineDontBreak , 170 },
{lbB2SP , prB2 }: {lbB2 , LineDontBreak , 170 },
{lbSP , prAny }: {lbAny , LineCanBreak , 180 },
{lbQUSP , prAny }: {lbAny , LineCanBreak , 180 },
{lbCLCPSP , prAny }: {lbAny , LineCanBreak , 180 },
{lbB2SP , prAny }: {lbAny , LineCanBreak , 180 },
{lbAny , prQU }: {lbQU , LineDontBreak , 190 },
{lbQU , prAny }: {lbAny , LineDontBreak , 190 },
{lbAny , prCB }: {lbCB , LineCanBreak , 200 },
{lbCB , prAny }: {lbAny , LineCanBreak , 200 },
{lbAny , prBA }: {lbBA , LineDontBreak , 210 },
{lbAny , prHY }: {lbHY , LineDontBreak , 210 },
{lbAny , prNS }: {lbNS , LineDontBreak , 210 },
{lbAny , prBB }: {lbBB , LineCanBreak , 310 },
{lbBB , prAny }: {lbAny , LineDontBreak , 210 },
{lbAny , prHL }: {lbHL , LineCanBreak , 310 },
{lbHL , prHY }: {lbLB21a , LineDontBreak , 210 },
{lbHL , prBA }: {lbLB21a , LineDontBreak , 210 },
{lbLB21a , prAny }: {lbAny , LineDontBreak , 211 },
{lbSY , prHL }: {lbHL , LineDontBreak , 212 },
{lbNUSY , prHL }: {lbHL , LineDontBreak , 212 },
{lbAny , prIN }: {lbAny , LineDontBreak , 220 },
{lbAny , prAL }: {lbAL , LineCanBreak , 310 },
{lbAny , prNU }: {lbNU , LineCanBreak , 310 },
{lbAL , prNU }: {lbNU , LineDontBreak , 230 },
{lbHL , prNU }: {lbNU , LineDontBreak , 230 },
{lbNU , prAL }: {lbAL , LineDontBreak , 230 },
{lbNU , prHL }: {lbHL , LineDontBreak , 230 },
{lbNUNU , prAL }: {lbAL , LineDontBreak , 230 },
{lbNUNU , prHL }: {lbHL , LineDontBreak , 230 },
{lbAny , prPR }: {lbPR , LineCanBreak , 310 },
{lbAny , prID }: {lbIDEM , LineCanBreak , 310 },
{lbAny , prEB }: {lbEB , LineCanBreak , 310 },
{lbAny , prEM }: {lbIDEM , LineCanBreak , 310 },
{lbPR , prID }: {lbIDEM , LineDontBreak , 231 },
{lbPR , prEB }: {lbEB , LineDontBreak , 231 },
{lbPR , prEM }: {lbIDEM , LineDontBreak , 231 },
{lbIDEM , prPO }: {lbPO , LineDontBreak , 231 },
{lbEB , prPO }: {lbPO , LineDontBreak , 231 },
{lbAny , prPO }: {lbPO , LineCanBreak , 310 },
{lbPR , prAL }: {lbAL , LineDontBreak , 240 },
{lbPR , prHL }: {lbHL , LineDontBreak , 240 },
{lbPO , prAL }: {lbAL , LineDontBreak , 240 },
{lbPO , prHL }: {lbHL , LineDontBreak , 240 },
{lbAL , prPR }: {lbPR , LineDontBreak , 240 },
{lbAL , prPO }: {lbPO , LineDontBreak , 240 },
{lbHL , prPR }: {lbPR , LineDontBreak , 240 },
{lbHL , prPO }: {lbPO , LineDontBreak , 240 },
{lbPR , prNU }: {lbNU , LineDontBreak , 250 },
{lbPO , prNU }: {lbNU , LineDontBreak , 250 },
{lbOP , prNU }: {lbNU , LineDontBreak , 250 },
{lbHY , prNU }: {lbNU , LineDontBreak , 250 },
{lbNU , prNU }: {lbNUNU , LineDontBreak , 250 },
{lbNU , prSY }: {lbNUSY , LineDontBreak , 250 },
{lbNU , prIS }: {lbNUIS , LineDontBreak , 250 },
{lbNUNU , prNU }: {lbNUNU , LineDontBreak , 250 },
{lbNUNU , prSY }: {lbNUSY , LineDontBreak , 250 },
{lbNUNU , prIS }: {lbNUIS , LineDontBreak , 250 },
{lbNUSY , prNU }: {lbNUNU , LineDontBreak , 250 },
{lbNUSY , prSY }: {lbNUSY , LineDontBreak , 250 },
{lbNUSY , prIS }: {lbNUIS , LineDontBreak , 250 },
{lbNUIS , prNU }: {lbNUNU , LineDontBreak , 250 },
{lbNUIS , prSY }: {lbNUSY , LineDontBreak , 250 },
{lbNUIS , prIS }: {lbNUIS , LineDontBreak , 250 },
{lbNU , prCL }: {lbNUCL , LineDontBreak , 250 },
{lbNU , prCP }: {lbNUCP , LineDontBreak , 250 },
{lbNUNU , prCL }: {lbNUCL , LineDontBreak , 250 },
{lbNUNU , prCP }: {lbNUCP , LineDontBreak , 250 },
{lbNUSY , prCL }: {lbNUCL , LineDontBreak , 250 },
{lbNUSY , prCP }: {lbNUCP , LineDontBreak , 250 },
{lbNUIS , prCL }: {lbNUCL , LineDontBreak , 250 },
{lbNUIS , prCP }: {lbNUCP , LineDontBreak , 250 },
{lbNU , prPO }: {lbPO , LineDontBreak , 250 },
{lbNUNU , prPO }: {lbPO , LineDontBreak , 250 },
{lbNUSY , prPO }: {lbPO , LineDontBreak , 250 },
{lbNUIS , prPO }: {lbPO , LineDontBreak , 250 },
{lbNUCL , prPO }: {lbPO , LineDontBreak , 250 },
{lbNUCP , prPO }: {lbPO , LineDontBreak , 250 },
{lbNU , prPR }: {lbPR , LineDontBreak , 250 },
{lbNUNU , prPR }: {lbPR , LineDontBreak , 250 },
{lbNUSY , prPR }: {lbPR , LineDontBreak , 250 },
{lbNUIS , prPR }: {lbPR , LineDontBreak , 250 },
{lbNUCL , prPR }: {lbPR , LineDontBreak , 250 },
{lbNUCP , prPR }: {lbPR , LineDontBreak , 250 },
{lbAny , prJL }: {lbJL , LineCanBreak , 310 },
{lbAny , prJV }: {lbJV , LineCanBreak , 310 },
{lbAny , prJT }: {lbJT , LineCanBreak , 310 },
{lbAny , prH2 }: {lbH2 , LineCanBreak , 310 },
{lbAny , prH3 }: {lbH3 , LineCanBreak , 310 },
{lbJL , prJL }: {lbJL , LineDontBreak , 260 },
{lbJL , prJV }: {lbJV , LineDontBreak , 260 },
{lbJL , prH2 }: {lbH2 , LineDontBreak , 260 },
{lbJL , prH3 }: {lbH3 , LineDontBreak , 260 },
{lbJV , prJV }: {lbJV , LineDontBreak , 260 },
{lbJV , prJT }: {lbJT , LineDontBreak , 260 },
{lbH2 , prJV }: {lbJV , LineDontBreak , 260 },
{lbH2 , prJT }: {lbJT , LineDontBreak , 260 },
{lbJT , prJT }: {lbJT , LineDontBreak , 260 },
{lbH3 , prJT }: {lbJT , LineDontBreak , 260 },
{lbJL , prPO }: {lbPO , LineDontBreak , 270 },
{lbJV , prPO }: {lbPO , LineDontBreak , 270 },
{lbJT , prPO }: {lbPO , LineDontBreak , 270 },
{lbH2 , prPO }: {lbPO , LineDontBreak , 270 },
{lbH3 , prPO }: {lbPO , LineDontBreak , 270 },
{lbPR , prJL }: {lbJL , LineDontBreak , 270 },
{lbPR , prJV }: {lbJV , LineDontBreak , 270 },
{lbPR , prJT }: {lbJT , LineDontBreak , 270 },
{lbPR , prH2 }: {lbH2 , LineDontBreak , 270 },
{lbPR , prH3 }: {lbH3 , LineDontBreak , 270 },
{lbAL , prAL }: {lbAL , LineDontBreak , 280 },
{lbAL , prHL }: {lbHL , LineDontBreak , 280 },
{lbHL , prAL }: {lbAL , LineDontBreak , 280 },
{lbHL , prHL }: {lbHL , LineDontBreak , 280 },
{lbIS , prAL }: {lbAL , LineDontBreak , 290 },
{lbIS , prHL }: {lbHL , LineDontBreak , 290 },
{lbNUIS , prAL }: {lbAL , LineDontBreak , 290 },
{lbNUIS , prHL }: {lbHL , LineDontBreak , 290 },
}
func transitionLineBreakState(state int , r rune , b []byte , str string ) (newState int , lineBreak int ) {
nextProperty , generalCategory := propertyWithGenCat (lineBreakCodePoints , r )
var forceNoBreak , isCPeaFWH bool
if state >= 0 && state &lbCPeaFWHBit != 0 {
isCPeaFWH = true
state = state &^ lbCPeaFWHBit
}
if state >= 0 && state &lbZWJBit != 0 {
state = state &^ lbZWJBit
forceNoBreak = true
}
defer func () {
if newState == lbCP || newState == lbNUCP {
ea := property (eastAsianWidth , r )
if ea != prF && ea != prW && ea != prH {
newState |= lbCPeaFWHBit
}
}
if forceNoBreak {
lineBreak = LineDontBreak
}
}()
if nextProperty == prAI || nextProperty == prSG || nextProperty == prXX {
nextProperty = prAL
} else if nextProperty == prSA {
if generalCategory == gcMn || generalCategory == gcMc {
nextProperty = prCM
} else {
nextProperty = prAL
}
} else if nextProperty == prCJ {
nextProperty = prNS
}
if nextProperty == prZWJ || nextProperty == prCM {
var bit int
if nextProperty == prZWJ {
bit = lbZWJBit
}
mustBreakState := state < 0 || state == lbBK || state == lbCR || state == lbLF || state == lbNL
if !mustBreakState && state != lbSP && state != lbZW && state != lbQUSP && state != lbCLCPSP && state != lbB2SP {
return state | bit , LineDontBreak
} else {
if mustBreakState {
return lbAL | bit , LineMustBreak
}
return lbAL | bit , LineCanBreak
}
}
var rule int
transition , ok := lbTransitions [[2 ]int {state , nextProperty }]
if ok {
newState , lineBreak , rule = transition [0 ], transition [1 ], transition [2 ]
} else {
transAnyProp , okAnyProp := lbTransitions [[2 ]int {state , prAny }]
transAnyState , okAnyState := lbTransitions [[2 ]int {lbAny , nextProperty }]
if okAnyProp && okAnyState {
newState , lineBreak , rule = transAnyState [0 ], transAnyState [1 ], transAnyState [2 ]
if transAnyProp [2 ] < transAnyState [2 ] {
lineBreak , rule = transAnyProp [1 ], transAnyProp [2 ]
}
} else if okAnyProp {
newState , lineBreak , rule = transAnyProp [0 ], transAnyProp [1 ], transAnyProp [2 ]
} else if okAnyState {
newState , lineBreak , rule = transAnyState [0 ], transAnyState [1 ], transAnyState [2 ]
} else {
newState , lineBreak , rule = lbAny , LineCanBreak , 310
}
}
if rule > 121 &&
nextProperty == prGL &&
(state != lbSP && state != lbBA && state != lbHY && state != lbLB21a && state != lbQUSP && state != lbCLCPSP && state != lbB2SP ) {
return lbGL , LineDontBreak
}
if rule > 130 && state != lbNU && state != lbNUNU {
switch nextProperty {
case prCL :
return lbCL , LineDontBreak
case prCP :
return lbCP , LineDontBreak
case prIS :
return lbIS , LineDontBreak
case prSY :
return lbSY , LineDontBreak
}
}
if rule > 250 &&
(state == lbPR || state == lbPO ) &&
nextProperty == prOP || nextProperty == prHY {
var r rune
if b != nil {
r , _ = utf8 .DecodeRune (b )
} else {
r , _ = utf8 .DecodeRuneInString (str )
}
if r != utf8 .RuneError {
pr , _ := propertyWithGenCat (lineBreakCodePoints , r )
if pr == prNU {
return lbNU , LineDontBreak
}
}
}
if rule > 300 {
if (state == lbAL || state == lbHL || state == lbNU || state == lbNUNU ) && nextProperty == prOP {
ea := property (eastAsianWidth , r )
if ea != prF && ea != prW && ea != prH {
return lbOP , LineDontBreak
}
} else if isCPeaFWH {
switch nextProperty {
case prAL :
return lbAL , LineDontBreak
case prHL :
return lbHL , LineDontBreak
case prNU :
return lbNU , LineDontBreak
}
}
}
if newState == lbAny && nextProperty == prRI {
if state != lbOddRI && state != lbEvenRI {
return lbOddRI , lineBreak
}
if state == lbOddRI {
return lbEvenRI , LineDontBreak
}
return lbOddRI , lineBreak
}
if rule > 302 {
if nextProperty == prEM {
if state == lbEB || state == lbExtPicCn {
return prAny , LineDontBreak
}
}
graphemeProperty := property (graphemeCodePoints , r )
if graphemeProperty == prExtendedPictographic && generalCategory == gcCn {
return lbExtPicCn , LineCanBreak
}
}
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 .