https://github.com/surfstudio/maskinterpreter
https://github.com/surfstudio/maskinterpreter
Last synced: 4 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/surfstudio/maskinterpreter
- Owner: surfstudio
- License: mit
- Created: 2019-08-29T05:04:08.000Z (almost 7 years ago)
- Default Branch: master
- Last Pushed: 2020-07-31T09:24:42.000Z (almost 6 years ago)
- Last Synced: 2025-04-13T07:15:10.396Z (about 1 year ago)
- Language: Swift
- Size: 81.1 KB
- Stars: 5
- Watchers: 25
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
[](https://codecov.io/gh/LastSprint/MaskInterpreter)
[](https://github.com/LastSprint/MaskInterpreter/actions)
# MaskInterpreter
Интерпритататор масок ввода из кастомного формата в формат [InputMask](https://github.com/RedMadRobot/input-mask-ios)
Эта библиотека позволяет сделать две вещи:
1. Транслировать одну грамматику в другую
2. Проводить простой анализ грамматики и понимать:
- Минимальное и максимальное кол-во символов для ввода
- Тип клавиатуры для ввода (телефон, e-mail, просто цифры и т.д.)
## Грамматика
Интерпритатор позволяет сконвертировать одну грамматику в другую.
Рассмотрим грамматику, которую интерпритатор ожидает на вход:
### Легенда
Все что внутри `""` - константный символ.
Зарезервированные символы:
- `.` - Любой символ
- `|` - Логическое ИЛИ
- `(...)` - группа выражений
- `+` - повторить предыдущее выражение 1 или более раз
- `.` - любой символ
### Токены
```
CONSTANT_SYMBOL = .
SPECIAL_SYMBOL = "\\d" | "\\w" | "\\s" | "\\D" | "\\W" | "\\S"
ANY_SYMBOL = "."
REPEATER_SYMBOL = "+" | "*"
REGEXP_START_SYMBOL = ""
SLICE_SYMBOL = "-"
ONE_OF_START_SYMBOL = "["
ONE_OF_END_SYMBOL = "]"
RANGE_START_SYMBOL = "{"
RANGE_END_SYMBOL = "}"
RANGE_DELIMETER_SYMBOL = ","
REGEXP_META_START_SYMBOL = "$"
```
### Правила
```
regexpSymbolRule = SPECIAL_SYMBOL | CONSTANT_SYMBOL
regexpSliceRule = CONSTANT_SYMBOL SLICE_SYMBOL CONSTANT_SYMBOL
regexpOneOfRule = ONE_OF_START_SYMBOL regexpSliceRule | regexpSymbolRule ONE_OF_END_SYMBOL
regexpRepeatSymbolRule = (ANY_SYMBOL | regexpSymbolRule | regexpOneOfRule) REPEATER_SYMBOL
regexpBodyRule = regexpRepeatSymbolRule | regexpOneOfRule | regexpSymbolRule
regexpRangeRule = RANGE_START_SYMBOL CONSTANT_SYMBOL (RANGE_DELIMETER_SYMBOL CONSTANT_SYMBOL)? RANGE_END_SYMBOL where CONSTANT_SYMBOL is NUMBER
regexpMetaRule = REGEXP_META_START_SYMBOL regexpRangeRule
regexpExpression = REGEXP_START_SYMBOL regexpBodyRule+ regexpMetaRule REGEXP_END_SYMBOL
maskExpression = (ConstantSymbol | regexpExpression)+
```
### Примеры
`+7 ()--` - маска для номера телефона.
Все что находится снаружи `` это константы (автоматически подставляются), остальное - динамическая часть, которую должен вводить пользователь.
`${x,y}` описывает кол-во символов для повтора (`\\d+${3}` означает повторить `\\d` ровно 3 раза)
`` - маска для обычного пользовательского ввода.
**ВАЖНО**
Одно динамическое выражение может содержать только 1 токен повторения.
## Как использовать
```Swift
let rawMask = "/"
guard let mask = MaskInterpreter().interpret(rawMask: rawMask) else { return }
let maskNotations = mask.generated.notations.map { generated in
return Notation(character: generated.nameSymbol, characterSet: generated.set, isOptional: generated.isOptional)
}
self.maskInputLisnter.customNotations = maskNotations
self.maskInputLisnter.primaryMaskFormat = mask.generated.mask
```
## Как установить
CocoaPods:
```
pod 'MaskInterpreter', :git => 'https://github.com/surfstudio/MaskInterpreter', :tag => '1.0.0'