Блог Людмилы Третьяковой

Книжный предсказатель

2018-05-15 22:43

Что бы мне сегодня почитать? Я довольно часто задаю сама себе этот ворос. Наверное, поэтому появилась идея "Книжного предсказателя", который предлагает 4 случайные книги для прочтения.

Книжный предсказатель Книжный предсказатель

С точки зрения пользователя "Книжный предсказатель" - довольно простой проект. Вы нажимаете шар, выбираете книгу, читаете информацию о ней или об авторе. Для меня этот проект интересен тем, что здесь много вещей, с которыми я никогда не сталкивалась:

Запросы к 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, ';')

Ссылка на репозиторий

Может, немного погадаем?