Книжный предсказатель
Что бы мне сегодня почитать? Я довольно часто задаю сама себе этот ворос. Наверное, поэтому появилась идея "Книжного предсказателя", который предлагает 4 случайные книги для прочтения.
С точки зрения пользователя "Книжный предсказатель" - довольно простой проект. Вы нажимаете шар, выбираете книгу, читаете информацию о ней или об авторе. Для меня этот проект интересен тем, что здесь много вещей, с которыми я никогда не сталкивалась:
- работа с внешним API(MediaWiki action API / Wikipedia);
- формирование асинхронных запросов к внешним источникам для получения данных;
- разработка парсера сырых данных (из Wikipedia);
- написание регулярных выражений в парсерах для обработки полученной информации.
Запросы к MediaWiki action API сформировать оказалось довольно просто. Для проекта потребовалось 2 вида запросов. Один для получения данных, второй - для получения картинки, находящейся в правом верхнем углу страницы. Сложность заключалась в том, что при обращении к странице часто в качестве ответа приходило сообщение на redirect к новой странице.
Например, для получения данных о писателе Терри Пратчетте в качестве title-параметра строки запроса можно указать <Терри Пратчетт> или <Пратчетт, Терри>. Только в первом случае в качестве ответа придет строка вида
#перенаправление [[Пратчетт, Терри]]
Таким образом, приходилось формировать новый запрос с другими данными и отправлять его.
Для получения нового title-параметра я написала регулярное выражение:
const redirectReg = /#(?:перенаправление|ПЕРЕНАПРАВЛЕНИЕ|REDIRECT|redirect)\s*\[\[(.*)\]\]/g;
Вообще, в этом проекте очень много регулярных выражений, т.к. нет единого стандарта данных. Например, дата рождения автора может быть указана как Дата Рождения, date, ДР, д и др. Вот пример информации об авторе, которую возвращает сервер.
Сэр '''Те́ренс Дэ́вид Джон Пра́тчетт''' ({{lang-en|Sir Terence David John Pratchett}}), более известный как '''Те́рри Пра́тчетт''' ({{lang-en2|Terry Pratchett}}; {{д|28|04|1948|1}}, {{нп5|Беконсфилд|||Beaconsfield}}, [[Бакингемшир]], [[Великобритания]] — {{д|12|03|2015|1}}, Брод Чалк, графство [[Уилтшир]], Южная Англия, [[Великобритания]]) — [[Англичане|английский]] [[писатель]]. Наибольшую популярность ему принёс цикл [[Сатира|сатирического]] [[фэнтези]] про [[Плоский мир]] ({{lang-en|Discworld}}). Суммарный тираж его книг составил около 50 миллионов экземпляров. В феврале [[2009 год]]а Пратчетт был посвящён английской королевой [[Елизавета II|Елизаветой II]] в [[Рыцарь-бакалавр|рыцари-бакалавры]]<ref>[http://www.direct.gov.uk/en/Governmentcitizensandrights/UKgovernment/Honoursawardsandmedals/DG_067977?IdcService=GET_FILE&dID=180323&Rendition=Web New Year Honours list 2009.]{{ref-en}}</ref>, оставаясь при этом офицером [[Орден Британской империи|ордена Британской империи]].
Чтобы привести эту информацию к нормальному виду:
Сэр Те́ренс Дэ́вид Джон Пра́тчетт, более известный как Те́рри Пра́тчетт (28|04|1948, Беконсфилд, Бакингемшир, Великобритания — 12|03|2015, Брод Чалк, графство Уилтшир, Южная Англия, Великобритания) — английский писатель. Наибольшую популярность ему принёс цикл сатирического фэнтези про Плоский мир. Суммарный тираж его книг составил около 50 миллионов экземпляров. В феврале 2009 года Пратчетт был посвящён английской королевой Елизаветой II в рыцари-бакалавры, оставаясь при этом офицером ордена Британской империи.
потребовалось добавить регулярные выражения.
about = info.substring(info.search(startAboutSectionReg)).split(splitChar)[0]
.replace(/(<!--.*-->)/g, '')
.replace(/(<[^>]*>)/g, '')
.replace(/{{нп[0-9]\|([^|]*)\|(?:[^}]*)}}/g,'$1')
.replace(/\{\{[^|]*\|([0-9]*\|[0-9А-Яа-я]*\|[0-9]*)(?:\|[^}]*)?\}\}/g, '$1')
.replace(/\|К\|[^|]*\|К/g, '')
.replace(/\{\{[^}]*}}/g, '')
.replace(/{{[^|]*\|/g, '')
.replace(/\[\[([^|[\]]*)\|/g, '')
.replace(/\[\[|\]\]/g, '')
.replace(/\[http[^\]]*\]/g, '')
.replace(/'''/g, '')
.replace(/(''}})|}}/g, '')
.replace(/\([;,.\s]*/g, '(')
.replace(/\s*\(\)\s*/g, '')
.replace(/\s*;\s*;/g, ';')