СОДЕРЖАНИЕ Введение ................................................................................................................. 3 1. Постановка задачи .......................................................................................... 5 2. Существующие подходы к накоплению научных работ ............................ 6 3. Используемые технологии ............................................................................. 8 3.1 Система управления содержимым Drupal ............................................... 8 3.2 Скриптовый язык программирования PHP ............................................. 9 3.3 Система управления базами данных MySQL .......................................... 9 3.4 Непроцедурный язык программирования SQL..................................... 10 3.5 Язык разметки XML................................................................................. 10 3.6 Язык запросов к элементам XML-документа XPath ............................ 11 4. Реализация электронной научной библиотеки .......................................... 12 4.1 Интерфейс сайта ....................................................................................... 12 4.2 Личный кабинет пользователя, регистрация, личные сообщения ...... 14 4.3 Публикации: импорт, хранение, поиск .................................................. 16 4.4 Словари и многоязычность ..................................................................... 20 Заключение .......................................................................................................... 21 Список использованных источников ................................................................ 22 Приложение А. Изменённый код класса шаблона template.php..................... 24 Приложение Б. Изменённый код класса feedsxpathparser.php ....................... 27 2 ВВЕДЕНИЕ Одной из важнейших задач, практически всегда стоявших перед человечеством, пространстве. является После сохранение возникновения информации книгопечатания во времени основной и/или формой фиксации распространения информации являются печатные издания, а главными средствами хранения и доступа к информации стали библиотеки. Сохранение и использование рукописных и печатных документов достаточно хорошо освоено, здесь имеются богатый опыт и результаты исследовательской и практической работы многих поколений специалистов. Но очевидно, что объёмы информации, хранящейся в традиционной форме, делают всё более затруднительной работу с ней: хранение, распространение, поиск и учет. Развитие вычислительной техники позволило сохранять и распространять информацию в электронной форме, что играет революционную роль в истории человечества, аналогичную изобретению книгопечатания. Электронная форма позволяет на сегодня хранить наиболее надежно и компактно, распространять ее намного оперативнее и шире и, кроме того, предоставляет возможности манипулирования с ней, которых не могло быть при иных формах. В связи с этим за последние годы во всем мире интенсивно увеличивается количество электронных публикаций. Значительное количество различных документов уже сейчас существует только в электронной форме. Существенное развитие работы по электронным библиотекам получили на рубеже 90-х годов, когда появились адекватные средства вычислительной техники и информационные технологии, обеспечивающие надёжное сохранение, оперативную обработку и эффективное использование больших массивов разнородной информации, прежде всего текстовой. Именно в это время в ряде стран стали подготавливаться проекты электронных библиотек. Некоторые из них легли в основы соответствующих национальных и международных программ. 3 Повсеместное распространение сети Интернет существенным образом повлияло также и на доступность результатов научных исследований: технических отчетов, журнальных статей, материалов конференций. Так, многие отечественные и зарубежные конференции публикуют в сети Интернет сборники докладов, в зарубежных учебных заведениях принято размещать на домашних страницах авторов полные тексты публикаций. В результате сеть Интернет становится наиболее социально значимым источником научной литературы: она доступна, охватывает исследования из разных стран, предоставляет современные средства поиска. Доступность зарубежных научных статей существенно выше, чем отечественных. Это связано с отсутствием у отечественных исследователей сложившейся интернет-ориентированной культуры: в США, например, многие публикации можно найти в электронном виде на домашних страницах авторов, в России же редкие исследователи ведут такие домашние страницы. В результате отечественные исследователи предпочитают использовать и развивать более доступные зарубежные исследования, даже при наличии русскоязычных работ в той же области. Это, в свою очередь, приводит к потере наработок отечественных научных школ, снижению цитируемости отечественных работ. Потребность в сохранении, накоплении и распространении результатов научных исследований востребована во многих научных школах. В данной работе рассмотрен зарубежный опыт накопления результатов научной деятельности и описано применение этого опыта на кафедре вычислительных технологий факультета прикладной математики и компьютерных наук. 4 1. ПОСТАНОВКА ЗАДАЧИ Задание состоит в организации электронной научной библиотеки «Моделирование компьютерных систем и сетей» и ее облачной реализации. Электронная научная библиотека должна являться информационной системой для поддержки научных исследований, выполнения дипломных и курсовых работ. В библиотеке должен быть создан специализированный русскоанглийский каталог по узким темам. Каждый пользователь должен иметь личный кабинет, свой профиль. Облачная реализация предполагает два аспекта: удаленные пользователи / читатели / заказчики информации; наполнение библиотеки из большого облака – Интернета – с помощью поисковой системы. Внутри библиотеки также должна быть поисковая система для пользователей. Электронная библиотека должна содержать элементы базы знаний: внутренний анализ и систематизацию публикаций, технический англо-русский и русскоанглийский словари, автоматизированный перевод на русский язык, поиск по запросу на русском языке в английских источниках. 5 2. СУЩЕСТВУЮЩИЕ ПОДХОДЫ К НАКОПЛЕНИЮ НАУЧНЫХ РАБОТ Общий объем информации в Интернет растет столь быстро, что традиционный поиск по ключевым словам не позволяет исследователям эффективно искать научную литературу. Для поиска научных статей в сети Интернет создаются специализированные электронные библиотеки научных статей (далее ЭБ), основанные на более эффективных методах, характерных именно для научной литературы [1], в частности, использующих библиографические ссылки. Рассмотрим основные виды таких библиотек за рубежом на примере области Computer Science. Наиболее широко известна в научных кругах база данных Science Citation Index [2], содержащая библиографические описания научных статей и граф взаимного цитирования статей. SCI ориентирована на предоставление библиографической информации и индекса цитирования, и не содержат сами тексты статей, а доступ к ней предоставляется на коммерческой основе. Другое направление развития – ЭБ профессиональных ассоциаций, например, ACM Digital Library [3] и IEEE Computer Society Digital Library [4]. Под эгидой этих профессиональных ассоциаций проходит большинство зарубежных конференций по Computer Science, а полные тексты докладов распространяются ими на коммерческой основе. Третье направление представлено независимыми электронными архивами, например, CORR [5], NCSTRL [6], которые пополняются самими авторами, учебными организациями и т.п. В таких ЭБ бесплатно предоставляются полные тексты статей, а граф цитирования обычно не строится. Четвертым, стремительно набирающим популярность, направлением являются ЭБ, построенные как вторичные Интернет-ресурсы. Научные статьи в эти ЭБ помещаются в результате поиска в сети Интернет. Основоположником данного направления можно считать проект CiteSeer [7][8]. Данная библиотека содержит полные тексты статей, свободно доступных в сети Интернет, и поддерживает граф взаимного цитирования. Доступ к библиотеке осуществляется на некоммерческой основе. Близкие идеи использует Google Scolar. 6 Важной тенденцией развития ЭБ является декоммерциализация, направленная на повышение доступности статей. Исследования [9] показали, что статьи, бесплатно доступные в сети Интернет, чаще цитируются. По объему бесплатные ЭБ близки к библиотекам ACM и IEEE. Согласно [10], SCI охватывает менее 15% отечественных публикаций. Создание Российского индекса научного тестирования (РИНЦ) планируется в 2007 году. В рамках научной электронной библиотеки (НЭБ) eLibrary.ru учебным и научным организациям предоставляется доступ к публикациям ведущих зарубежных издательств. В рамках РИНЦ разрабатываются методы полуавтоматического цитатного индексирования. В рамках РГБ им. Ленина была создана открытая электронная библиотека OREL и электронная библиотека диссертаций. Также в России очень большое количество некоммерческих электронных библиотек, поддерживаемых в основном учебными организациями. Эти библиотеки содержат очень маленькое количество статей и обеспечивают лишь средства поиска по ключевым словам. Таким образом, развитие электронных библиотек в России во многом схоже с развитием зарубежных электронных библиотек, но существенно отстает от зарубежного опыта. В настоящее время в России накопилось уже достаточно большое количество научных статей, доступных через Интернет, откуда можно сделать предположение о перспективности построения ЭБ, построенной в виде вторичного Интернет-ресурса. Однако стоит заметить, что обычные библиотеки очень консервативны. Предметный каталог в них порой не изменяется годами и отражает устоявшееся разделение науки на области. Каталог ориентирован, прежде всего, на книжные издания, тогда как отдельные статьи зачастую в таких ЭБ не фигурируют совсем. В основу создания НЭБ на кафедре вычислительных технологий положены структура и механизмы обработки статей проекта CiteSeer, созданного в Университете штата Пенсильвания (Penn State University). Основу НЭБ должны составлять журнальные статьи, опубликованные доклады на конференциях и, быть может, даже выдержки из научных статей. 7 3. ИСПОЛЬЗУЕМЫЕ ТЕХНОЛОГИИ 3.1. Система управления содержимым Drupal CMS Drupal — система управления содержимым, используемая также как каркас для веб-приложений (CMF), написанная на языке PHP и использующая в качестве хранилища данных реляционную базу данных (реализована поддержка многих популярных СУБД, в т.ч. MySQL, PostgreSQL и т.д.) [11]. В данной работе используется последняя выпущенная на данный момент версия Drupal 7. Drupal является свободным программным обеспечением, защищённым лицензией GPL, и развивается усилиями энтузиастов со всего мира. Эта система содержит в себе множество полезных функций, обладает отличной масштабируемостью и содержит обширную документацию. Сообщество Drupal включает в себя множество разработчиков, которые постоянно пишут дополнительные модули к системе и продолжают разрабатывать непосредственно саму систему. Благодаря модульной архитектуре Drupal, возможно добавление новых возможностей с помощью подключения нового модуля. Дополнительные модули для системы бесплатны и доступны в открытом виде на официальном сайте. возможности для программирования Система предоставляет широкие средствами Drupal API. Данный фреймворк изначально создан с учетом возможности переопределения функций с помощью внутренней системы хуков. Также Drupal отличается системой локализации и легкостью использования. Немаловажно, что Drupal не требователен к ресурсам и может разместиться практически на любом хостинге [12]. С использованием Drupal создан ряд популярных сайтов, таких как официальный сайт Белого дома или сайт операционной системы Ubuntu [13]. 8 3.2. Скриптовый язык программирования PHP. PHP — скриптовый язык программирования общего назначения, интенсивно применяемый для разработки веб-приложений. В настоящее время поддерживается подавляющим большинством хостинг-провайдеров и является одним из лидеров среди языков программирования, применяющихся для создания динамических веб-сайтов. Язык и его интерпретатор разрабатываются группой энтузиастов в рамках проекта с открытым кодом [11]. CMS Drupal также написана на языке PHP, а в её последней версии задействуются объектные возможности PHP 5. Модули, используемые в Drupal, работают по принципу «хуков» —PHP-функций, которые имеют определенный набор параметров и типов результатов. 3.3. Система управления базами данных MySQL. MySQL — свободная реляционная система управления базами данных. Обычно MySQL используется в качестве сервера, к которому обращаются локальные или удалённые клиенты, однако в дистрибутив входит библиотека внутреннего сервера, позволяющая включать MySQL в автономные программы. Гибкость СУБД MySQL обеспечивается поддержкой большого количества типов таблиц: пользователи могут выбрать как таблицы типа MyISAM, поддерживающие полнотекстовый поиск, так и таблицы InnoDB, поддерживающие транзакции на уровне отдельных записей. В данном проекте используются таблицы InnoDB, так как, в отличие от других подсистем низкого уровня MySQL, в InnoDB присутствует механизм транзакций и внешних ключей. Этот формат обеспечивает надежное хранение данных за счет транзакционности и блокировки данных на уровне строки. 9 Использование MySQL в проекте обусловлено множеством преимуществ MySQL перед большинством проприетарных продуктов [14], среди которых: производительность (Google и Yahoo используют именно MySQL) масштабируемость (в компании Omniture в реальном масштабе времени используется 7000 серверов MySQL) простота использования, простота внедрения 3.4. Непроцедурный язык программирования SQL. SQL — универсальный компьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных. Поскольку SQL не является привычным процедурным языком программирования (то есть не предоставляет средств для построения циклов, ветвлений и т. д.), разными производителями вводятся процедурные расширения [15]. Практически в каждой СУБД применяется свой процедурный язык. В MySQL используется стандарт SQL/PSM, который стандартизирует процедурное расширение для SQL, включая управление потоком выполнения, обработку условий, обработку флагов состояний, курсоры и локальные переменные, а также присваивание выражений переменным и параметрам. Более того, SQL/PSM формализует объявление и поддержку постоянных подпрограмм языков баз данных (например, «хранимых процедур») [14]. 3.5. Язык разметки XML. XML — рекомендованный Консорциумом Всемирной паутины язык разметки. XML разрабатывался как язык с простым формальным синтаксисом, удобный для создания и обработки документов программами и одновременно удобный для чтения и создания документов человеком, с подчёркиванием нацеленности на использование в Интернете [11]. Сочетание простого формального синтаксиса, удобства для человека, расширяемости, а также 10 базирование на кодировках Юникод для представления содержания документов привело к широкому использованию как собственно XML, так и множества производных специализированных языков на базе XML в самых разнообразных программных средствах. 3.6. Язык запросов к элементам XML-документа XPath. XPath — язык запросов к элементам XML-документа. Разработан для организации доступа к частям документа XML в файлах трансформации XSLT и является стандартом консорциума W3C. XPath основан на древовидном представлении XML-документа и предоставляет возможность производить навигацию внутри этой структуры, выбирая записи, удовлетворяющие различным критериям. 11 4. РЕАЛИЗАЦИЯ ЭЛЕКТРОННОЙ НАУЧНОЙ БИБЛИОТЕКИ Модульная структура CMS Drupal позволяет сделать систему гибкой, легко настраиваемой и обратно совместимой. В итоге это даёт пользователю возможность создать сайт в соответствии с его потребностями. Модули Drupal позволяют существенно расширить функционал сайта, в корне поменять его внешний вид. Существует множество готовых решений, большой объём функционала различных сайтов уже реализован при помощи модулей. Именно поэтому в контексте данной работы уместно описать, каким образом были использованы те или иные модули при создании прототипа библиотеки. Далее приведены основные элементы созданного сайта и инструменты, использовавшиеся для реализации того или иного элемента. Здесь и далее «сайт» означает разработанный сайт электронной научной библиотеки кафедры вычислительных технологий. 4.1. Интерфейс сайта. Основной задачей данной работы следует считать создание научной библиотеки. Интерфейс портала такого рода может состоять из множества элементов, в частности: форма регистрации, блок поиска научных статей, блок новостей, главное меню (включающее в себя ссылки на основные страницы портала), блок контактов, предметный указатель и т.д. При создании интерфейса сайта за основу в некоторой степени был взят интерфейс известного ресурса ЭНБ «eLibrary.ru», хорошо знакомого русскоговорящему читателю. Важное отличие между интерфейсами состоит в том, что интерфейс портала «eLibrary.ru» по большей части статичен, тогда как средствами созданного сайта пользователю предлагается возможность настроить интерфейс пользователя по своим потребностям. Так, некоторые блоки можно 12 поменять местами, а другие (например, блок «контакты») и вовсе спрятать (при этом всегда можно вернуть настройки по умолчанию). Внешний вид разработанного сайта представлен на рисунке 1. Рисунок 1 – Главная страница сайта научной библиотеки В шапке главной страницы указано название проекта, чуть ниже расположено главное меню сайта. С его помощью можно перейти на главную страницу, на страницы анонсов публикаций, авторов публикаций, списка тем (так называемых «тегов»), либо к словарю терминов. Для более быстрого перехода к той или иной научной теме справа располагается список тем, публикации по которым уже присутствуют в базе данных. Слева находятся форма для регистрации и входа на сайт, а также блок «контакты». В центре страницы — блок для вывода новостей. Процесс создания интерфейса включает в себя множество действий по созданию, размещению и редактированию блоков страниц, поэтому он не описывается в контексте данной работы. 13 Стили и цветовая схема сайта основаны на стандартной теме ядра Drupal под названием «Bartik». Для корректного расположения блоков создана подтема «SubBartik», а в код CSS и в шаблон template.php для этой темы внесён ряд изменений (см. приложение А). В подтеме сохранены возможности изменения расположения блоков и изменения цветовой схемы сайта. Стандартное оформление сайта представлено в серебристо-сером цвете. 4.2. Личный кабинет пользователя, регистрация, личные сообщения. На сайте, как уже упоминалось выше, присутствует возможность регистрации, которая совершается привычным для интернет-пользователей способом: в специальную форму вводятся данные о пользователе (логин, пароль, адрес электронной почты, настройки), после чего на введённый почтовый адрес отправляется валидационное письмо. После перехода по ссылке из письма регистрация считается завершённой. У каждого пользователя есть личный кабинет, где можно изменить предпочтительные настройки сайта (рис. 2). Рисунок 2 – Личный кабинет. Фрагмент страницы изменения настроек профиля 14 Добавлена возможность коммуникации между пользователями внутри сайта с помощью личных сообщений. Это расширение (модуль Privatemsg [16]) предлагает необходимый функционал для упрощения одновременной работы нескольких человек над одним научным проектом. Возможный вид страницы сообщений представлен на рисунке 3. Рисунок 3 – Фрагмент страницы личной переписки Система разделяет пользователей на несколько типов (ролей): зарегистрированные пользователи, читатели (анонимные пользователи), администраторы. Права доступа позволяют управлять возможностями пользователей на сайте. Каждая роль имеет присущий ей набор прав. Так, например, анонимные читатели лишены возможности отправлять и получать личные сообщения, пользоваться внутренним поиском на сайте. Зарегистрированные пользователи имеют доступ к этому функционалу. Администраторы, в свою очередь, наделены множеством прав: работа со списком пользователей, редактирование контента. Кроме того, администраторам разрешено вручную добавлять на сайт публикации. 15 4.3. Публикации: импорт, хранение, поиск. С целью пополнения библиотеки в смежной работе создана система для поиска подходящих публикаций в сети интернет; данная система располагается на сайте, поиск приводится в действие встроенным в Drupal механизмом Cron. Для хранения публикаций в базе данных был создан специальный тип материала «Publication». Ниже приведён список полей данного типа: Title – заголовок, Body – текст (или, в более общем случае, реферат публикации), Author – имя автора (множественное поле), Tag – тема, ключевая фраза (множественное поле), Date – дата публикации (опциональное поле), Imprint – издательство (опциональное поле), ISSN – идентификатор публикации (опциональное поле), File – поле для хранения файла публикации. Публикации могут быть добавлены в базу данных либо вручную администратором (заполнение всех полей производится самостоятельно), либо с помощью парсера XML (происходит импорт необходимых данных из XMLфайла, находящегося в соответствующей директории сайта). В данном случае парсер также может запуститься либо вручную (для администраторов в главном меню доступна вкладка «Импорт публикации»), либо по истечении определённого времени (по расписанию системы Cron). Процесс ручного импорта публикации из XML изображён на рисунке 4. 16 Рисунок 4 - Импорт публикации в базу данных с использованием XML Реализация возможности импорта публикаций основана на использовании модулей Feeds и Feeds XPath Parser [17], предназначенных для импортирования и агрегирования информации. Для того чтобы модулем Feeds XPath Parser корректно обрабатывались и успешно заполнялись множественные поля, в код одного из ключевых классов внесены изменения. В тексте работы приводится изменённый класс (см. приложение Б). Внутри библиотеки организован поиск по публикациям. Поиск может осуществляться как по ключевому слову, так и по фразе. Содержимое сайта индексируется с использованием системы Cron (вручную или по расписанию). Кроме того, внутренний поиск позволяет вести поиск пользователей сайта по их логину (рис. 5). 17 Рисунок 5 – Процесс поиска на сайте На странице «Публикации» выводится список всех доступных публикаций. Публикации отсортированы по дате добавления. Информация выводится в виде анонсов, здесь же располагаются ссылки на страницы авторов, ключевые фразы, относящиеся теме публикации, а также ссылка на файл, если он хранится в базе данных (рис. 6). Если браузер располагает средствами для отображения файлов данного расширения, то отображается в новом окне браузера. Рисунок 6 – Фрагмент страницы с отображением публикаций 18 файл На страницах «Авторы» и «Темы» (рис. 7-8) содержатся соответствующие списки с возможностью сортировки по алфавиту или количеству связанных статей в базе данных. При нажатии на фамилию автора или на ключевую фразу происходит переход на страницу, содержащую все связанные статьи. Рисунок 7 – Страница «Авторы» Рисунок 8 – Страница «Темы» Отображение всех основных страниц использованием модуля Views [18]. 19 сайта редактировалось с 4.4. Словари и многоязычность. На сайте имеется специализированные русско-английский и англорусский словари по узким темам, так или иначе относящимся к моделированию компьютерных систем и сетей (рис. 9). Каталог легко пополняется и редактируется администраторами сайта. Рисунок 9 – Технический словарь Также на сайте включена поддержка многоязычности. Любой тип материала может быть переведён на английский (или, наоборот, русский язык), а всякий пользователь может выбрать нужный ему язык сайта из списка поддерживаемых (модули Internationalization и Entity Translation [19]). В перспективе такой подход позволит увеличить приток потенциальных посетителей из других стран и поспособствует развитию электронных научных библиотек в России. 20 ЗАКЛЮЧЕНИЕ В курсовой работе дан обзор существующих подходов к накоплению результатов научных исследований, приведены особенности организации и работы некоторых зарубежных и отечественных систем. Были рассмотрены возможности использования системы управления содержимым Drupal. Приведены решения, используемые при создании электронной библиотеки. На основе наработок существующих проектов была построена информационная система, позволяющая хранить научные статьи, доклады, выдержки из статей и учебники, автоматически строить по ним список авторов и тем. Реализована возможность регистрации в системе, при этом всякий пользователь ЭБ имеет свой личный кабинет. В системе создан специализированный русско-английский каталог по узким темам. На основе этой системы построен сайт-прототип электронной библиотеки научных статей по тематике «Моделирование компьютерных систем и сетей». Была предусмотрена возможность наполнения библиотеки статьями из некоторых популярных ресурсов с помощью специально созданной для электронной библиотеки поисковой системы. Внутри библиотеки присутствует поисковая система для пользователей. Также библиотека предусматривает систематизацию публикаций по многим параметрам. В ближайшее время программный комплекс будет интегрирован в более крупную систему: он разместится на хостинге Кубанского государственного университета, ссылка на сайт электронной научной библиотеки опубликуется на сайте кафедры вычислительных технологий. Важно отметить, что при создании электронной научной библиотеки используется только свободное программное обеспечение. Проект будет направлен на поддержку научной деятельности студентов и преподавателей, выполнение дипломных и курсовых работ. В дальнейшем функционал системы можно легко расширить. 21 СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 1. Bates M. The design of browsing and berry picking techniques for the online search interface // Online Review – 1989. С. 177-182. 2. Science Citation Index [Электронный ресурс]. http://scientific.thomson.com/products/sci/ [Дата обращения: 16.04.2014] 3. ACM Digital Library [Электронный ресурс]. http://portal.acm.org/dl.cfm [Дата обращения: 17.04.2014] 4. IEEE Computer Society Digital Library [Электронный ресурс]. http://computer.org [Дата обращения: 17.04.2014] 5. CORR [Электронный ресурс]. http://arxiv.org/corr/home [Дата обращения: 17.04.2014] 6. NCSTRL [Электронный ресурс]. http://ncstrl.org [Дата обращения: 18.04.2014] 7. Lawrence S., Bollaker K., Giles L., Indexing and Retrieval of Scientific Literature [Текст], CIKM, 1999. С. 12-15. 8. CiteSeerX [Электронный ресурс]. http://citeseerx.ist.psu.edu/ [Дата обращения: 18.04.2014] 9. Lawrence S., Giles L., Bollaker K., Digital Libraries and Autonomous Citation Indexing [Текст]. IEEE Computer, номер 6, 1999. 10. Разработка РИНЦ [Электронный ресурс]. Проект. http://elibrary.ru/projects/citation/proposal.doc [Дата обращения: 18.04.2014] 11. Информация из «Свободной энциклопедии» [Электронный ресурс]. Режим доступа http://ru.wikipedia.org свободный. 12. Использование CMS Drupal [Электронный ресурс]. http://www.itassist.net.ua/e-book/ [Дата обращения: 22.04.2014] 13. DoghouseMedia.10 Famous Drupal Websites [Электронный ресурс]. http://www.dhmedia.com.au/article/10-famous-drupal-websites [Дата обращения: 13.04.2014] 22 14. Микос М. Деловая газета — шквал IT-новостей [Электронный ресурс]. http://www.citcity.ru/ [Дата обращения: 22.04.2014] 15. Гэллахер Л. Database Language SQL [Электронный ресурс]. http://www.itl.nist.gov/div897/ctg/dm/sql_info.html [Дата обращения: 22.04.2014] 16. Module Privatemsg [Электронный ресурс]. http://drupal.org/project/privatemsg [Дата обращения: 22.04.2014] 17. Module Feeds [Электронный ресурс]. https://drupal.org/project/feeds [Дата обращения: 28.04.2014] 18. Module Views [Электронный ресурс]. https://drupal.org/project/views [Дата обращения: 22.04.2014] 19. Module I18N [Электронный ресурс]. https://drupal.org/project/i18n [Дата обращения: 24.04.2014] 23 ПРИЛОЖЕНИЕ А Изменённый код класса шаблона template.php <?php function subbartik_preprocess_html(&$variables) { if (!empty($variables['page']['featured'])) { $variables['classes_array'][] = 'featured'; } if (!empty($variables['page']['triptych_first']) || !empty($variables['page']['triptych_middle']) || !empty($variables['page']['triptych_last'])) { $variables['classes_array'][] = 'triptych'; } if (!empty($variables['page']['footer_firstcolumn']) || !empty($variables['page']['footer_secondcolumn']) || !empty($variables['page']['footer_thirdcolumn']) || !empty($variables['page']['footer_fourthcolumn'])) { $variables['classes_array'][] = 'footer-columns'; } drupal_add_css(path_to_theme() . '/css/ie.css', array('group' => CSS_THEME, 'browsers' => array('IE' => 'lte IE 7', '!IE' => FALSE), 'preprocess' => FALSE)); drupal_add_css(path_to_theme() . '/css/ie6.css', array('group' => CSS_THEME, 'browsers' => array('IE' => 'IE 6', '!IE' => FALSE), 'preprocess' => FALSE)); } function subbartik_process_html(&$variables) { if (module_exists('color')) { _color_html_alter($variables); } } function subbartik_process_page(&$variables) { if (module_exists('color')) { _color_page_alter($variables); } $variables['hide_site_name'] = theme_get_setting('toggle_name') ? FALSE : TRUE; 24 $variables['hide_site_slogan'] = theme_get_setting('toggle_slogan') ? FALSE : TRUE; if ($variables['hide_site_name']) { $variables['site_name'] = filter_xss_admin(variable_get('site_name', 'Drupal')); } if ($variables['hide_site_slogan']) { $variables['site_slogan'] = filter_xss_admin(variable_get('site_slogan', '')); } if (!empty($variables['title_suffix']['add_or_remove_shortcut']) && $variables['title']) { $variables['title_prefix']['shortcut_wrapper'] = array( '#markup' => '<div class="shortcut-wrapper clearfix">', '#weight' => 100, ); $variables['title_suffix']['shortcut_wrapper'] = array( '#markup' => '</div>', '#weight' => -99, ); $variables['title_suffix']['add_or_remove_shortcut']['#weight'] = -100; } } function subbartik_preprocess_maintenance_page(&$variables) { if (!$variables['db_is_active']) { $variables['site_name'] = ''; } drupal_add_css(drupal_get_path('theme', 'subbartik') . '/css/maintenance-page.css'); } function subbartik_process_maintenance_page(&$variables) { $variables['hide_site_name'] = theme_get_setting('toggle_name') ? FALSE : TRUE; $variables['hide_site_slogan'] = theme_get_setting('toggle_slogan') ? FALSE : TRUE; if ($variables['hide_site_name']) { $variables['site_name'] = filter_xss_admin(variable_get('site_name', 'Drupal')); } if ($variables['hide_site_slogan']) { $variables['site_slogan'] = filter_xss_admin(variable_get('site_slogan', '')); } } 25 function subbartik_preprocess_node(&$variables) { if ($variables['view_mode'] == 'full' && node_is_page($variables['node'])) { $variables['classes_array'][] = 'node-full'; } } function subbartik_preprocess_block(&$variables) { if ($variables['block']->region == 'header') { $variables['title_attributes_array']['class'][] = 'element-invisible'; } } function subbartik_menu_tree($variables) { return '<ul class="menu clearfix">' . $variables['tree'] . '</ul>'; } function subbartik_field__taxonomy_term_reference($variables) { $output = ''; if (!$variables['label_hidden']) { $output .= '<h3 class="field-label">' . $variables['label'] . ': </h3>'; } $output .= ($variables['element']['#label_display'] == 'inline') ? '<ul class="links inline">' : '<ul class="links">'; foreach ($variables['items'] as $delta => $item) { $output .= '<li class="taxonomy-term-reference-' . $delta . '"' . $variables['item_attributes'][$delta] . '>' . drupal_render($item) . '</li>'; } $output .= '</ul>'; $output = '<div class="' . $variables['classes'] . (!in_array('clearfix', $variables['classes_array']) ? ' clearfix' : '') . '"' . $variables['attributes'] .'>' . $output . '</div>'; return $output; } 26 ПРИЛОЖЕНИЕ Б Изменённый код класса feedsxpathparser.php <?php abstract class FeedsXPathParserBase extends FeedsParser { protected $rawXML = array(); protected $doc = NULL; protected $xpath = NULL; abstract protected function setup($source_config, FeedsFetcherResult $fetcher_result); abstract protected function getRaw(DOMNode $node); public function parse(FeedsSource $source, FeedsFetcherResult $fetcher_result) { $source_config = $source->getConfigFor($this); $state = $source->state(FEEDS_PARSE); if (empty($source_config)) { $source_config = $this->getConfig(); } $this->doc = $this->setup($source_config, $fetcher_result); $parser_result = new FeedsParserResult(); $mappings = $this->getOwnMappings(); $this->rawXML = array_keys(array_filter($source_config['rawXML'])); $fetcher_config = $source->getConfigFor($source->importer->fetcher); $parser_result->link = $fetcher_config['source']; $this->xpath = new FeedsXPathParserDOMXPath($this->doc); $config = array(); $config['debug'] = array_keys(array_filter($source_config['exp']['debug'])); 27 $config['errors'] = $source_config['exp']['errors']; $this->xpath->setConfig($config); $context_query = '(' . $source_config['context'] . ')'; if (empty($state->total)) { $state->total = $this->xpath->namespacedQuery('count(' . $context_query . ')', $this->doc, 'count'); } $start = $state->pointer ? $state->pointer : 0; $limit = $start + $source->importer->getLimit(); $end = ($limit > $state->total) ? $state->total : $limit; $state->pointer = $end; $context_query .= "[position() > $start and position() <= $end]"; $progress = $state->pointer ? $state->pointer : 0; $all_nodes = $this->xpath->namespacedQuery($context_query, NULL, 'context'); foreach ($all_nodes as $node) { if (in_array(TRUE, module_invoke_all('feeds_xpathparser_filter_domnode', $node, $this->doc, $source), TRUE)) { continue; } $parsed_item = $variables = array(); foreach ($source_config['sources'] as $element_key => $query) { $query = strtr($query, $variables); $result = $this->parseSourceElement($query, $node, $element_key); if (isset($result)) { if (!is_array($result)) { $variables['$' . $mappings[$element_key]] = $result; } 28 else { $variables['$' . $mappings[$element_key]] = ''; } $parsed_item[$element_key] = $result; } } if (!empty($parsed_item)) { $parser_result->items[] = $parsed_item; } } $state->progress($state->total, $progress); unset($this->doc); unset($this->xpath); return $parser_result; } protected function parseSourceElement($query, $context, $source) { if (empty($query)) { return; } $node_list = $this->xpath->namespacedQuery($query, $context, $source); if ($node_list instanceof DOMNodeList) { $results = array(); if (in_array($source, $this->rawXML)) { foreach ($node_list as $node) { $results[] = $this->getRaw($node); } } else { foreach ($node_list as $node) { $results[] = $node->nodeValue; 29 } } if (count($results) === 1) { return $results[0]; } elseif (empty($results)) { return; } else { return $results; } } else { return $node_list; } } public function sourceForm($source_config) { $form = array(); $importer = feeds_importer($this->id); $importer_config = $importer->getConfig(); $mappings_ = $importer_config['processor']['config']['mappings']; if (empty($source_config)) { $source_config = $this->getConfig(); } if (isset($source_config['allow_override']) && !$source_config['allow_override'] && empty($source_config['config'])) { return; } $allowed_extensions = isset($importer_config['fetcher']['config']['allowed_extensions']) $importer_config['fetcher']['config']['allowed_extensions'] : FALSE; 30 ? if ($allowed_extensions) { if (strpos($allowed_extensions, 'html') === FALSE) { $importer->fetcher->config['allowed_extensions'] .= ' html htm'; } } $uniques = $mappings = array(); foreach ($mappings_ as $mapping) { if (strpos($mapping['source'], 'xpathparser:') === 0) { $mappings[$mapping['source']] = $mapping['target']; if ($mapping['unique']) { $uniques[] = $mapping['target']; } } } $form['xpath'] = array( '#type' => 'fieldset', '#tree' => TRUE, '#title' => t('XPath Parser Settings'), '#collapsible' => TRUE, '#collapsed' => TRUE, ); if (empty($mappings)) { $feeds_menu = feeds_ui_menu(); if (isset($feeds_menu['admin/structure/feeds/list'])) { $feeds_base = 'admin/structure/feeds/edit/'; } else { $feeds_base = 'admin/structure/feeds/'; } $form['xpath']['error_message']['#markup'] = '<div class="help">' . t('No XPath mappings are defined. Define mappings !link.', array('!link' => l(t('here'), $feeds_base . $this->id . '/mapping'))) . '</div><br />'; return $form; } 31 $form['xpath']['context'] = array( '#type' => 'textfield', '#title' => t('Context'), '#required' => TRUE, '#description' => t('This is the base query, all other queries will run in this context.'), '#default_value' => isset($source_config['context']) ? $source_config['context'] : '', '#maxlength' => 1024, '#size' => 80, ); $form['xpath']['sources'] = array( '#type' => 'fieldset', '#tree' => TRUE, ); if (!empty($uniques)) { $items = array( format_plural(count($uniques), t('Field <strong>!column</strong> is mandatory and considered unique: only one item per !column value will be created.', array('!column' => implode(', ', $uniques))), t('Fields <strong>!columns</strong> are mandatory and values in these columns are considered unique: only one entry per value in one of these columns will be created.', array('!columns' => implode(', ', $uniques)))), ); $form['xpath']['sources']['help']['#markup'] = array('items' => $items)) . '</div>'; } } 32 '<div class="help">' . theme('item_list',