package precis
import "errors"
type catBitmap uint16
const (
bJapanese catBitmap = 1 << iota
bArabicIndicDigit
bExtendedArabicIndicDigit
bJoinStart
bJoinMid
bJoinEnd
bVirama
bLatinSmallL
bGreek
bHebrew
bMustHaveJapn
permanent = bJapanese | bArabicIndicDigit | bExtendedArabicIndicDigit | bMustHaveJapn
)
const finalShift = 10
var errContext = errors .New ("precis: contextual rule violated" )
func init() {
for i , ct := range categoryTransitions {
categoryTransitions [i ].keep |= permanent
categoryTransitions [i ].accept |= ct .term
}
}
var categoryTransitions = []struct {
keep catBitmap
set catBitmap
term catBitmap
accept catBitmap
rule func (beforeBits catBitmap ) (doLookahead bool , err error )
}{
joiningL : {set : bJoinStart },
joiningD : {set : bJoinStart | bJoinEnd },
joiningT : {keep : bJoinStart , set : bJoinMid },
joiningR : {set : bJoinEnd },
viramaModifier : {set : bVirama },
viramaJoinT : {set : bVirama | bJoinMid },
latinSmallL : {set : bLatinSmallL },
greek : {set : bGreek },
greekJoinT : {set : bGreek | bJoinMid },
hebrew : {set : bHebrew },
hebrewJoinT : {set : bHebrew | bJoinMid },
japanese : {set : bJapanese },
katakanaMiddleDot : {set : bMustHaveJapn },
zeroWidthNonJoiner : {
term : bJoinEnd ,
accept : bJoinMid ,
rule : func (before catBitmap ) (doLookAhead bool , err error ) {
if before &bVirama != 0 {
return false , nil
}
if before &bJoinStart == 0 {
return false , errContext
}
return true , nil
},
},
zeroWidthJoiner : {
rule : func (before catBitmap ) (doLookAhead bool , err error ) {
if before &bVirama == 0 {
err = errContext
}
return false , err
},
},
middleDot : {
term : bLatinSmallL ,
rule : func (before catBitmap ) (doLookAhead bool , err error ) {
if before &bLatinSmallL == 0 {
return false , errContext
}
return true , nil
},
},
greekLowerNumeralSign : {
set : bGreek ,
term : bGreek ,
rule : func (before catBitmap ) (doLookAhead bool , err error ) {
return true , nil
},
},
hebrewPreceding : {
set : bHebrew ,
rule : func (before catBitmap ) (doLookAhead bool , err error ) {
if before &bHebrew == 0 {
err = errContext
}
return false , err
},
},
arabicIndicDigit : {
set : bArabicIndicDigit ,
rule : func (before catBitmap ) (doLookAhead bool , err error ) {
if before &bExtendedArabicIndicDigit != 0 {
err = errContext
}
return false , err
},
},
extendedArabicIndicDigit : {
set : bExtendedArabicIndicDigit ,
rule : func (before catBitmap ) (doLookAhead bool , err error ) {
if before &bArabicIndicDigit != 0 {
err = errContext
}
return false , err
},
},
}
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 .