package precis
import
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 () {
for , := range categoryTransitions {
categoryTransitions[].keep |= permanent
categoryTransitions[].accept |= .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( catBitmap) ( bool, error) {
if &bVirama != 0 {
return false, nil
}
if &bJoinStart == 0 {
return false, errContext
}
return true, nil
},
},
zeroWidthJoiner: {
rule: func( catBitmap) ( bool, error) {
if &bVirama == 0 {
= errContext
}
return false,
},
},
middleDot: {
term: bLatinSmallL,
rule: func( catBitmap) ( bool, error) {
if &bLatinSmallL == 0 {
return false, errContext
}
return true, nil
},
},
greekLowerNumeralSign: {
set: bGreek,
term: bGreek,
rule: func( catBitmap) ( bool, error) {
return true, nil
},
},
hebrewPreceding: {
set: bHebrew,
rule: func( catBitmap) ( bool, error) {
if &bHebrew == 0 {
= errContext
}
return false,
},
},
arabicIndicDigit: {
set: bArabicIndicDigit,
rule: func( catBitmap) ( bool, error) {
if &bExtendedArabicIndicDigit != 0 {
= errContext
}
return false,
},
},
extendedArabicIndicDigit: {
set: bExtendedArabicIndicDigit,
rule: func( catBitmap) ( bool, error) {
if &bArabicIndicDigit != 0 {
= errContext
}
return false,
},
},
}