Использование CORE Recommender в DSpace

CORE Recommender, это плагин, который может использоваться совместно с репозиториями, журнальными платформами, агрегаторами и иными сервисами, которые предоставляют доступ к научным публикациям. Основная задача плагина — расширить возможности сервиса, за счет рекомендаций статей, похожих на просматриваемую. В качестве источника данных и метаданных используется база CORE, которая на момент написания данного текста содержит информацию более чем о ста тридцати пяти миллионах документах на уровне метаданных, а так же содержит более тринадцати миллионов полных текстов. Общую информацию (от 2016-го года и на английском языке) можно найти здесь. Мы же рассмотрим процесс интеграции CORE Recommender в репозиторий на базе DSpace/JSPUI на примере репозитория Российского государственного профессионально-педагогического университета. Данный репозиторий основан на DSpace версии 5.10 (JSPUI).

 


 
Следуя описанию на странице плагина, необходимо зарегистрироваться. Это можно сделать как в ручном режиме, так и через CORE Dashboard. Как и прежде, я рекомендую зарегистрироваться в Dashboard, чтобы не только без проблем получать доступ к имеющимся и новым сервисам CORE, но и контролировать процесс харвеста.
 
Непосредственно в Dashboard нас интересует вкладка «Get the Recommender» и аккордеон (ага, именно так в приличном обществе, называют этот разъезжающийся спойлер) «Everyone else (non-Eprints)».
 

 
В аккордеоне будет два фрагмента когда. Первый — непосредственно javascript плагина с уникальным идентификатором репозитория:
 

<script>
(function (d, s, idScript, idRec, userInput) {
    var coreAddress = 'https://core.ac.uk/';
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(idScript))
        return;
    js = d.createElement(s);
    js.id = idScript;
    js.src = coreAddress + 'recommender/embed.js';
    fjs.parentNode.insertBefore(js, fjs);
   
    localStorage.setItem('idRecommender', idRec);
    localStorage.setItem('userInput', JSON.stringify(userInput));

    var link = d.createElement('link');
    link.setAttribute('rel', 'stylesheet');
    link.setAttribute('type', 'text/css');
    link.setAttribute('href', coreAddress + 'recommender/embed-default-style.css');
    d.getElementsByTagName('head')[0].appendChild(link);
}(document, 'script', 'recommender-embed', 'XXXXXX', {}));
</script>

 
Второй — место вывода результатов работы плагина:
 

<div id="coreRecommenderOutput"></div>

 


 
Первый фрагмент кода должен располагаться в заголовке страницы, на которой должна обеспечиваться работа плагина. В нашем случае, необходимо изменить файл header-default.jsp так, как показано на рисунке ниже. Т.е. добавить код со своим ID перед закрывающим элементом тега head. Обычно, файл заголовка находится по пути /tomcat/webapps/jspui/layout/header-default.jsp
 

 
Забегая вперед сразу скажу что мне не понравилось, как CORE Recommender выглядит из коробки. Это блок шириной 500px с текстом 10pt. Встраивать, да и читать его именно в таком виде не очень удобно, поэтому я предлагаю некоторые модификации, которые отражены ниже:
 

 
Согласно упомянутому выше руководству было решено немного изменить файл таблицы стилей. А именно, ширина была установлена 100% и шрифт 14pt. Пример файла таблицы стилей доступен здесь. Код я позволю себе не приводить, т.к. он не особо читаем.
 
А хотя….

@import url("https://fonts.googleapis.com/css?family=Roboto:300,400,400i,500");#coreRecommenderOutput ul.tabs{border-bottom:1px solid #ddd;margin-bottom:0;padding-left:0;list-style:none}#coreRecommenderOutput .tabs>li{margin-bottom:-1px;float:left;padding-bottom:0}#coreRecommenderOutput ul.tabs.clearfix{display:inline-flex}#coreRecommenderOutput .tabs>li.active>a,#coreRecommenderOutput .tabs>li.active>a:hover,#coreRecommenderOutput .tabs>li.active>a:focus{color:#999;background-color:white;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;z-index:2}#coreRecommenderOutput .tabs>li>a:focus,#coreRecommenderOutput .tabs>li>a:hover{text-decoration:none;background-color:#eee;color:#9f410c;outline:0}#coreRecommenderOutput .tabs>li>a{position:relative;display:inline-block;padding:10px 15px;margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0;color:#e65e11;text-decoration:none}#coreRecommenderOutput .clearfix:before,.clearfix:after{content:"";display:block}#coreRecommenderOutput .clearfix:after{clear:both}#coreRecommenderOutput .clearfix{zoom:1}#coreRecommenderOutput{width:100%;background:#fff;font-family:Roboto,-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-weight:400px;line-height:normal;font-size:14px}#coreRecommenderOutput ul{list-style-type:none;padding:0}.ep_summary_box_body{background-color:#fff;border:0}.ep_summary_box_title{display:none}.coreRecommender .documentTpl .thumb{margin-right:4px;float:left;height:75px;width:60px;overflow:hidden;padding:1px}.coreRecommender .documentTpl .thumb img{max-height:75px;max-width:60px;-moz-box-shadow:2px 2px 5px #888;-webkit-box-shadow:2px 2px 5px #888;box-shadow:2px 2px 5px #888}.coreRecommender .documentTpl{display:inline-block;margin-bottom:10px;padding-left:5px;overflow:hidden}.coreRecommender .title{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.coreRecommender #authors{padding-right:20px;display:inline;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden}.coreRecommender .label{padding:0;overflow:hidden;display:inline}.coreRecommender .addinfo{float:left;display:none;text-align:justify;margin-top:5px}.coreRecommender .detail-info{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.coreRecommender .information{margin-right:10px;position:relative;overflow:hidden}.coreRecommender .information>div{margin-bottom:10px}.coreRecommender li{border-right:3px solid white;position:relative;overflow:hidden;padding-top:10px;border-bottom:1px solid #ddd}.coreRecommender li:hover{background-color:#eee;padding-right:0;cursor:pointer}.coreRecommender a{text-decoration:none}.coreRecommender .remove-article{margin-bottom:5px;position:absolute;right:0;bottom:0;max-height:11px;max-width:11px;float:right}.coreRecommender .dropdown{right:3px;bottom:0;position:absolute;display:inline-block}.coreRecommender .dropdown-content{display:none;position:relative;margin-right:20px;background-color:white;min-width:160px;border:1px solid #ddd}.coreRecommender .dropdown-content a{font-weight:inherit;padding:8px 12px;text-decoration:none;display:block}.coreRecommender .dropdown-content a:hover{background-color:#eee}.coreRecommender .dropdown:hover .dropdown-content{display:block}.coreRecommender .dropdown:hover .dropbtn{background-color:#eee}#coreRecommenderOutput .error,#coreRecommenderOutput .loading{text-align:center;vertical-align:center;padding:15px;color:#999;border-bottom:1px solid #ddd}#coreRecommenderOutput .error-image,#coreRecommenderOutput .loading-gif{margin-top:5px}.coreRecommender .footer img{height:24px;display:block;float:right;padding-left:4px;border:0}.coreRecommender .footer a{margin-top:5px;float:right;text-decoration:none;font-size:.7em;font-weight:bold;color:gray;line-height:30px}.coreRecommender .title{font-weight:bold;font-size:14px}.coreRecommender .label{color:#b75400;font-family:Roboto,-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-weight:600}.coreRecommender li:hover{border-right:3px solid #b75400}.coreRecommender .dropdown-content a{color:#b75400}

 
Соответственно, первый фрагмент кода, встраиваемый в заголовок страницы, приобретает вид:

<script>
(function (d, s, idScript, idRec, userInput) {
    var coreAddress = 'https://core.ac.uk/';
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(idScript))
        return;
    js = d.createElement(s);
    js.id = idScript;
    js.src = coreAddress + 'recommender/embed.js';
    fjs.parentNode.insertBefore(js, fjs);
   
    localStorage.setItem('idRecommender', idRec);
    localStorage.setItem('userInput', JSON.stringify(userInput));

    var link = d.createElement('link');
    link.setAttribute('rel', 'stylesheet');
    link.setAttribute('type', 'text/css');
    link.setAttribute('href','http://YYYYYY/core.css');
    d.getElementsByTagName('head')[0].appendChild(link);
}(document, 'script', 'recommender-embed', 'XXXXXX', {}));
</script>

 
где YYYYYY и XXXXXX соответственно путь до CSS файла и ID репозитория.
 


 
С отображением результатов работы плагина я тоже решил проявить оригинальность. Достаточно крупный блок CORE Recommender, который в случае нашего контента срабатывает не всегда, а если срабатывает, то не всегда достоверно, можно показывать не явно. Для показа в любом случае необходимо модифицировать страницу отображения записи — display-item.jsp, которая обычно расположена по пути /tomcat/webapps/jspui/display-item.jsp, так, как это показано на рисунке ниже.
 

 
И мы получим плагин в поле между кнопкой статистики и полем копирайта:
 

 
Но мы ведь теперь знаем про кнопку-аккордеон! Соответственно, изменяем код:

<p><a class="btn btn-primary" data-toggle="collapse" href="#collapseExample" aria-expanded="false" aria-controls="collapseExample">CORE Recommender</a></p>
<div class="collapse" id="collapseExample">
  <div class="card card-block">
<div id="coreRecommenderOutput"></div>
  </div>
</div>

 
В интерьере это выглядит так:

 
А результат начинает выглядеть так:
 

 
Отдельно хотелось бы напомнить о том, что теги <br /> забывать нельзя.
 
В данном посте я не рассматриваю точность и достоверность работы CORE Recommender, качество харвеста CORE (в случае кириллицы очень много необъяснимых проблем с кодировкой) и пр. технические моменты работы сервиса. Только процесс интеграции в DSpace JSPUI.
 
[UPD]
 
Как оказалось, 100% ширина блока ломает вёрстку при логине администратора — панель администрирования уходит вниз. В свете открывшихся обстоятельств я предлагаю такой вариант «второго фрагмета» кода, который не срабатывает, если пользователь залогинен как администратор:
 

<%
        if (!admin_button)
        { %>
<p><a class="btn btn-primary" data-toggle="collapse" href="#collapseExample" aria-expanded="false" aria-controls="collapseExample">CORE Recommender</a></p>
<div class="collapse" id="collapseExample">
  <div class="card card-block">
<div id="coreRecommenderOutput"></div>
  </div>
</div>
<%      } %>

 
Думаю, в пояснениях код не нуждается.

Запись опубликована в рубрике Работа с метками , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *