// Copyright 2018 by David A. Golden. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); you may // not use this file except in compliance with the License. You may obtain // a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 package stringprep var errHasLCat = "BiDi string can't have runes from category L" var errFirstRune = "BiDi string first rune must have category R or AL" var errLastRune = "BiDi string last rune must have category R or AL" // Check for prohibited characters from table C.8 func checkBiDiProhibitedRune(s string) error { for _, r := range s { if TableC8.Contains(r) { return Error{Msg: errProhibited, Rune: r} } } return nil } // Check for LCat characters from table D.2 func checkBiDiLCat(s string) error { for _, r := range s { if TableD2.Contains(r) { return Error{Msg: errHasLCat, Rune: r} } } return nil } // Check first and last characters are in table D.1; requires non-empty string func checkBadFirstAndLastRandALCat(s string) error { rs := []rune(s) if !TableD1.Contains(rs[0]) { return Error{Msg: errFirstRune, Rune: rs[0]} } n := len(rs) - 1 if !TableD1.Contains(rs[n]) { return Error{Msg: errLastRune, Rune: rs[n]} } return nil } // Look for RandALCat characters from table D.1 func hasBiDiRandALCat(s string) bool { for _, r := range s { if TableD1.Contains(r) { return true } } return false } // Check that BiDi rules are satisfied ; let empty string pass this rule func passesBiDiRules(s string) error { if len(s) == 0 { return nil } if err := checkBiDiProhibitedRune(s); err != nil { return err } if hasBiDiRandALCat(s) { if err := checkBiDiLCat(s); err != nil { return err } if err := checkBadFirstAndLastRandALCat(s); err != nil { return err } } return nil }