Мой первый Pet-проект - Regexoop
Ссылка на проект Regexoop
Немного о себе. Я всегда был противником бесплатного труда, меня так воспитали. Работая только за деньги и только с чужими проектами я погорел. Это ужасное чувство тошноты. Я пробовал делать проекты для себя, но ни с кем не делился. Мне казалось, мою идею украдут, хотя идеи были на уровне игр про караваны. Я пытался делить шкуру неубитого медведя со своим эго. Оно побеждало.
Спустя некоторое время я увидел интересный метод "12 проектов за 12 месяцев". Суть метода состоит в том, что ты каждый месяц делаешь 1 продукт и показываешь его людям. Неважно насколько он готов. Ты можешь эти продукты выпускать как хочешь, хочешь за деньги, хочешь бесплатно. Я выбрал путь для этого проекта - бесплатно.
Суть проекта
Regexoop - переосмысление подхода написания regex. 30 сентября я подумал - "Хм, regex такой сложный. НУ ПОЧЕМУ? Может его можно сделать как-то проще?". Начав ровно 1 октября, я 3 дня писал документацию. Этот объем документации написанной за 3 дня, я разрабатываю уже 3 недели и не дошёл даже до половины. Чего уже говорить о настоящей мощи regex.
Концепт кода:
var rules = new {
pattern = "{second_level}{first_level}",
start = "end",
first_level = new {
pattern = "[a-z]",
minLength = 2,
maxLength = 3,
},
second_level = new {
pattern = "[a-zA-Z0-9-].", //а вот тут ошибка, но это ведь набросок
minLength = 2,
maxLength = 63,
maxRepeat = 5,
minRepeat = 0,
symbolsRules = new {
"-" = new { repeat: 0 }
}
}
};
var er = new Regexoop(rules).Input("https://docs.microsoft.com").Find()
Console.WriteLine(er); //docs.microsoft.com
Настоящий шаблон regex представляет собой мешанину из текста с параметрами и то, что показано в концепте в настоящем regex выглядит примерно так:
^(?!-)[A-Za-z0-9-]+([\\-\\.]{1}[a-z0-9]+)*\\.[A-Za-z]{2,6}$"
Это ещё простой шаблон валидации доменов. Бывают сложнее.
Техническая реализация
Несмотря на долгий опыт в PHP, я выбрал C# как основной язык для этого проекта. В текущем состоянии .net на голову выше экосистемы PHP. Ты просто садишься, открываешь Visual Studio 2019 и всё как по масти работает. Банальный отлов ошибок при компиляции вырезает 90% глупых ошибок.
Библиотека работает на C# под .net 5.
Cценарий работы c библиотекой
Создаёте новый объект правил BasicRule и заполняете публичные свойства правила. Правила можно складывать в друг-друга как матрёшку, но дочерние правила перестают быть самостоятельными и свой результат отдают родительскому правилу;
Создаёте объект Regexoop и помещаете в конструктор свои правила;
Вызываете метод Input() для помещения исходного текста для поиска;
Вызываете один из трех режимов работы методов для поиска текста.
Rule test = new BasicRule()
{
Name = "root",
Pattern = "Hello",
Start = Rule.Direction.start
};
List res = new Regexoop.Regexoop(test).Input("Hello World").Find();
//res: Hello
Да, тут я тоже ловлю некоторый фейспалм из-за "new Regexoop.Regexoop", но в скором времени хочу это исправить. Однако же работает. ?
Принцип разбора текста
Исходный текст обрабатывается посимвольно согласно шаблону правил. Вот кусок кода текущего роутера для метода Find()
while(_input.IsComplete() == false) //тут думаю ясно что это исходный текст
{
_input.MoveCursor(1); //курсор передвинется только в том случае если был запрошен исходный текст
Rule.Status stepResult = _rule.Peek().ParseSymbol(_input);
...
}
Обработка правил является стеком вызовов правил. Вы спросите зачем, вот пример.
Rule test = new BasicRule()
{
Name = "root",
Pattern = "Hello {world} Hello {world}",
Start = Rule.Direction.start,
Variables = new List {
new BasicRule() {
Name = "world",
Pattern = "World"
}
}
};
List res = new Regexoop.Regexoop(test).Input("Hello World Hello World").Find();
//res: Hello World Hello World
Встречая команду {world}
при парсинге шаблона, правило помечает необходимость переадресации на другое правило и помещает в специально отведённое место объект с необходимым правилом, а роутер считывая необходимость переадресации, замораживает текущее исполнение вызова правила и помещает в стек вызовов новое правило. Когда новое правило завершит свою работу со статусом Complete
, результат дочернего правила будет присвоено родительскому правилу и родительское правило продолжит работу с места остановки. В общем простая работа стековой машины вызовов.
Также сейчас реализована рекурсия, но я не добавил ещё добавление дочерних правил при вызове рекурсии. Поэтому в текущем варианте нормальная работает рекурсии гарантирована только для правил без дочерних правил.
Можно много ещё чего написать, т.к. мне это интересно, ведь я автор этой штуки, но мне кажется это будет слишком избыточно для статьи. В документации можно увидеть больше примеров и планы на разработку.
Pet-проект это тоже работа
Несмотря на получаемое удовольствие от проекта. Я не могу сказать что это просто. Если на обычной работе программистом ты делаешь только свою часть и в 18:00 уходишь в закат, то здесь всё не так. Даже не представляю сколько времени данный проект
В данном проекте я директор, pr менеджер, pm, team leader, разработчик, тестировщик, системный администратор и сам себе кофе делаю.
Уже 3 недели я выкладываю исходники на Github и только после оформления как nuget пакет я увидел что кто-то качает библиотеку. Наверное боты. 100%. Поэтому без рекламы ваши проекты никому не интересны, даже бесплатно. Пилите караваны и не бойтесь что их кто-то украдёт.
Жду от сообщества критику и предложения по развитию библиотеки.