TITextProcessing #1
No reviewers
Labels
No Label
No Milestone
No project
No Assignees
3 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: TouchInstinct/LeadKit#1
Loading…
Reference in New Issue
No description provided.
Delete Branch "feature/TITextProcessing"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
TITextProcessingБиблиотека для работы с регулярными выражениями
-
TextFormatterКласс
TextFormatterпредставляет из себя сервис, принимающий регулярное выражение на вход и предоставляющий возможность генерации следующих объектов:-
Replacement templateизgetRegexReplacement();-
PlaceholderизgetRegexPlaceholder();-
Formatter textизgetFormattedText(_ text: String)func getRegexReplacement()Метод, преобразующий входящее регулярное выражение в шаблон подстановки, например:
Input:
(\\d{4}) ?(\\d{4}) ?(\\d{4}) ?(\\d{4})Output:
$1 $2 $3 $4func getRegexPlaceholder()Метод, преобразующий входящее регулярное выражение в текст-заполнитесь a.k.a placeholder, например:
Input:
(\\d{4}) ?(\\d{4}) ?(\\d{4}) ?(\\d{4})Output:
1234 5678 9012 3456func getFormattedText(_ text: String) -> StringМетод, преобразующий входящий текст к нужному формату, заранее определенному посредством указания регулярного выражения, например:
Input:
2200111555550080Output:
2200 1115 5555 0080-
RegexReplaceGeneratorКласс, отвечающий за генерацию
PCREGeneratorItemиз входящего регулярного выражения. Использует библиотекуAntlr4иPCREдля работы.static func generateReplacement(for regex: String) -> PCREGeneratorItemФункция, преобразующий входящее регулярное выражение в структуру, содержащую шаблон подстановки и матрицу символов, например:
Итоговый
PCREGeneratorItemсодержит следующие данные:regexReplaceString- итоговый шаблон подстановки для изначального регулярного выражения;matrixOfSymbols- матрица символов, содержащая все возможные символы для каждого элемента в изначальном регулярном выражении-
RegexPlaceholderGeneratorКласс, отвечающий за генерацию текста-заполнителя a.k.a placeholder.
static func generatePlaceholder(matrixOfSymbols: [[Character]]) -> StringФункция, преобразующая входящую матрицу символов в текст-заполнитель, например:
e0e47b4023toc75e28b57fc75e28b57fto3e13729d083e13729d08toaccdd8e28caccdd8e28cto93a8ee68f3@ -0,0 +22,4 @@import Foundationpublic final class RegexPlaceholderGenerator {Я бы назвал его
DefaultRegexPlaceholderGeneratorи, в будущем, создал интерфейс и оставил открытые методы для тюнинга на проектах.@ -0,0 +12,4 @@s.source_files = s.name + '/Sources/**/*'s.static_framework = trueа это зачем?
@ -0,0 +13,4 @@s.source_files = s.name + '/Sources/**/*'s.static_framework = trues.user_target_xcconfig = { 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' }и это?
@ -0,0 +69,4 @@public override func enterShared_atom(_ ctx: PCREParser.Shared_atomContext) {super.enterShared_atom(ctx)listOfSymbols = "1234567890".map { Character(String($0)) }проще это вынести в константу
@ -0,0 +115,4 @@/*If there is a {1,2} duplication then take the last one to maximize the output placeholder*/if let quantifierString = ctx.getText().components(separatedBy: CharacterSet.decimalDigits.inverted).filter({ !$0.isEmpty }).last,а нельзя из QuantifierContext это получить?
Да вот как будто бы нельзя, прошелся по всем основным методам, корректные данные возвращает только
getText()@ -0,0 +124,4 @@If there is an infinite duplication option through "+" sign then duplicate it 5 times*/if ctx.getText() == "+" {count = 5в константу
@ -0,0 +164,4 @@private func getAvailableSymbols(for ctxText: String) -> [Character] {let startAtomStr = ctxText[ctxText.index(after: ctxText.startIndex)]let endAtomStr = ctxText[ctxText.index(ctxText.endIndex, offsetBy: -2)]а если пустой или только один символ в строке? такого не может быть?
Даже если один символ в диапазоне, то в
ctxTextбудет приходить[A](например), соответственно, сoffsetвсе отработает корректно@ -0,0 +25,4 @@public final class RegexReplaceGenerator {public static func generateReplacement(for regex: String) -> PCREGeneratorItem {нейминг класса и метода кажется неудачным
также listerner надо прокидывать в init с дефолтным значением
Хм, а какое лучше название тогда указать? Что-то связанное с
PCREItemили что-то другое?сам не могу придумать
@ -0,0 +23,4 @@import Foundationimport Antlr4public final class PCREGeneratorListener: PCREBaseListener {я бы назвал Default*** и оставил open
@ -0,0 +42,4 @@public func getFormattedText(_ text: String) -> String {guard let expression = try? NSRegularExpression(pattern: regex, options: .caseInsensitive) else {fatalError("Cannot create NSRegularExpression from input regex")А тут точно безопасно
fatalErrorделать?В данном случае мы явно показываем пользователю, что переданное им регулярное выражение - некорректно, в связи с чем не очень правильно выдавать ему отформатированный текст, основываясь непонятно на какие правила. Как мне кажется, уж лучше выкинуть
fatalErrorв таком случае@ -0,0 +172,4 @@listOfSymbols.removeAll()}// MARK: - Private methodsтеперь это видимо
Public methods))