Не так давно, играя в Skyrim, решил разобраться с календарем и системой летосчисления Тамриэля. Почитал тематические вики, немного изучил тему, и пришла идея создания программы или веб-сайта, который бы просто показывал текущую дату в стиле TES, например "1-ое число месяца Вечерней звезды" (первое Декабря).
От написания программы пришлось отказаться, сделать ее достаточно красивой и полезной, чтобы ее устанавливали и скачивали было-бы очень сложно. Поэтому я решил, что это будет сайт. Т.к. с JavaScript я не очень дружу, было решено писать все на php. Забегая вперед скажу, что сразу я не подумал о том, что функция date() в php берет время и дату установленные на сервере, поэтому мой календарь будет актуален лишь для некоторой части планеты.
С тем, каким образом будет оформлен календарь проблем не было, идея пришла сразу, сделать все как в игре, просто лист бумаги, на котором "рукописным" шрифтом была-бы написана нужная информация. Поиск текстуры листа бумаги не занял много времени, вот что нашлось:
После чего была сверстана простая страница, с блоком содержащим это изображение как фон. Фоном же страницы стал просто затемненный скриншот из игры, в итоге получилось что-то вроде этого:
Теперь, когда основа страницы была готова, нужен php код который бы превращал текущую дату непосредственно в Тамриэльскую.
Реализовано при помощи простых кейсов:
-
switch ($mon) {//кейсы выбора имени месяца
-
case 1:
-
$mon_name = "Утренней звезды";//название на Тамриэльском со склонением
-
$star_keepers = "Ритуала";//созвездие покровитель со склонением
-
$star_keeper = "Ритуал";//созвездие покровитель без склонения
-
$mon_realname = 'Январь';//реальное название (для вывода всплывающей подсказки в теге <abbr>)
-
break;
-
case 2:
-
$mon_name = "Восхода солнца";
-
$star_keepers = "Любовника";
-
$star_keeper = "Любовник";
-
$mon_realname = 'Февраль';
-
break;
-
case 3:
-
$mon_name = "Первого зерна";
-
$star_keepers = "Лорда";
-
$star_keeper = "Лорд";
-
$mon_realname = 'Март';
-
break;
И так далее для 12 месяцев и 7ми дней недели.
Вы могли заметить переменную содержащую простое название месяца - $mon_realname. Она необходима для всплывающего текста подсказки при наведении мыши на название месяца или дня недели.
Теперь, выведя полученный результат на страницу мы видим примерно следующее:
Вполне приемлемо, но, пустовато. В этот момент и пришла идея сделать на странице, помимо календаря, еще и запись о том, какой праздник сегодня празднуется. Благо, тут проблем тоже не возникло, вселенная TES имеет чуть ли не самую богатую мифологию и историю из всех вымышленных вселенных, поэтому обратившись к викия-сайту по серии игр TES я получил список праздников с описаниями и датами. Дело осталось "за малым", заставить эти данные появляться на странице.
Решение пришло быстро, возможно это конечно не самый удачный и красивый способ, но он работает, а остальное не так важно. Смысл был вот в чем, информация о празднике делится на 3 категории: дата (день/месяц), название, описание. Распределив эти данные на 3 строки в текстовом файле, можно было получить отлично машинно-читаемый файл. Правда над датой пришлось немного поработать, ее я решил записывать просто в виде двух цифр с ведущими нолями, например, второе января - 0201. Выглядит примерно так:
-
0101
-
Новый год
-
Описание праздника может быть довольно длинным, несколько предложений
Теперь нужен код, который бы при каждом обращении к сайту, проверял текущую дату, заглядывал в файл с праздниками, и в случае нахождения текущей даты в списке, выводил бы 2 строки - название и описание.
-
$holiday_id = "$day$mon";
-
{
-
$string = $arr[$i];
-
if ($string == $holiday_id){//если строка массива совпала с id праздника
-
$holiday_name=$arr[$i+1];//следующие две строки это название и описание праздника, получаем их и выводим
-
$holiday_descr=$arr[$i+2];
-
}
Как видно из кода, сначала мы получаем дату и месяц, потом приводим их в вид четырехзначного числа. Далее считываем файл в массив, после чего запускаем цикл поиска "id" праздника в массиве. В случае совпадения считываем последующие две строки массива $arr[$i+1] и $arr[$i+2].
Небольшое отступление: Изначально строки никак не хотели совпадать, даже если я был уверен что искомая комбинация цифр точно присутствует в файле. Позже проблема была обнаружена, при сохранении текстового файла в конце каждой строки добавляется символ перевода строки. Этот символ также считывается и в массив, и при сравнении получается что данные не совпадают. При помощи str_replace() это быстро решилось.В итоге, получилось так:
Отдельно следует отметить что на странице использован опенсорсный веб-шрифт Alexander, подключенный в css таким образом:
-
@font-face {
-
font-family: 'Alexander';
-
src: url('http://64424.selcdn.ru/webfont/alexander/alexander.eot');
-
src: local('Alexander'), local('Alexander Regular'), url('http://64424.selcdn.ru/webfont/alexander/alexander.woff') format('woff'),
-
url('http://64424.selcdn.ru/webfont/alexander/alexander.ttf') format('truetype');
-
font-weight: normal;
-
font-style: normal;
-
}
Напоследок в правый нижний угол экрана был прикреплен блок, сообщающий что информация взята с викии The Elder Scrolls, и что эта страница использует лицензию CreativeCommons (чего требует сайт wikia).
На данный момент сайт еще не закончен, все из-за проблемы с датой и часовыми поясами, планирую добавить JavaScript, который бы узнавал дату на компьютере посетителя, и делился этой информацией с php.
Спасибо за внимание, буду рад комментариям и оценкам кода, может где-то есть критические ошибки, я не программист и учусь не по этой специальности :)