| // 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 |
| } |