Используйте lunr.js, чтобы обеспечить простой полнотекстовый поиск с использованием JavaScript в вашем браузере для вашего статического веб-сайта Jekyll.
Вдохновлен плагинами Jekyll + indextank Паскаля Виддершовена и плагинами Sitemap.xml Generator Майкла Левина.
Этот плагин Jekyll обрабатывает создание индексного файла .json
, совместимого с lunr.js. Конфигурация поиска во время выполнения обеспечивается простым плагином jQuery.
Он позволяет осуществлять полнотекстовый поиск по всем вашим страницам и сообщениям Jekyll. Выполняется клиентом без какой-либо обработки на стороне сервера (кроме обслуживания статических файлов).
Выберите установку либо как Ruby Gem, либо путем копирования предварительно созданного файла плагина на свой сайт Jekyll.
Установите Ruby Gem jekyll-lunr-js-search.
gem install jekyll-lunr-js-search
Измените файл Jekyll _config.yml
, включив в него Gem.
gems: ['jekyll-lunr-js-search']
build/jekyll_lunr_js_search.rb
в папку _plugins
в корне вашего сайта Jekyll. Содержимое всех сообщений и страниц Jekyll будет проиндексировано в файл js/index.json
готовый для использования lunr.js. Это происходит каждый раз при создании сайта.
Плагин jQuery предоставляется в js/jquery.lunr.search.js
для обработки конфигурации lunr.js с данными JSON индекса поиска, сгенерированными этим плагином.
Зависимости для плагина jQuery следующие.
Предварительно созданная версия плагина jQuery вместе со всеми вышеперечисленными зависимостями, объединенными и минимизированными, доступна по адресу build/search.min.js.
Плагин автоматически добавит минифицированный файл JavaScript js/search.min.js
на ваш _site
.
Чтобы использовать его, вы должны добавить ссылку на скрипт внизу выбранной вами страницы поиска.
<script src="/js/search.min.js" type="text/javascript" charset="utf-8"></script>
Скопируйте js/jquery.lunr.search.js
в каталог JavaScript вашего сайта Jekyll.
Добавьте ссылку на скрипт в нижнюю часть назначенной страницы поиска для jquery.lunr.search.js
и каждой из зависимостей, описанных выше.
<script src="/js/jquery-1.9.1.min.js" type="text/javascript" charset="utf-8"></script>
<script src="/js/lunr.min.js" type="text/javascript" charset="utf-8"></script>
<script src="/js/mustache.js" type="text/javascript" charset="utf-8"></script>
<script src="/js/date.format.js" type="text/javascript" charset="utf-8"></script>
<script src="/js/URI.min.js" type="text/javascript" charset="utf-8"></script>
<script src="/js/jquery.lunr.search.js" type="text/javascript" charset="utf-8"></script>
Убедитесь, что вы используете ту же версию lunr.js, что и драгоценный камень. Вывод журнала Jekyll включает использованную версию.
В идеале вы должны объединить, минимизировать и оптимизировать эти шесть файлов .js
, используя uglify/Google closure/etc, чтобы создать один файл search.min.js
для ссылки (или использовать предварительно созданный сценарий, как описано в пункте 2a выше).
<script src="/js/search.min.js" type="text/javascript" charset="utf-8"></script>
<form action="/search" method="get">
<input type="text" id="search-query" name="q" placeholder="Search" autocomplete="off">
</form>
Поиск происходит по мере ввода, если введены хотя бы три символа.
Предоставление действия формы и указание метода get позволяет пользователю нажать «Ввод/Ввод», чтобы также отправить поиск. При необходимости измените URL-адрес действия формы для страницы поиска на вашем сайте.
<section id="search-results" style="display: none;"> </section>
Изначально это может быть скрыто, поскольку плагин будет показывать элемент при поиске.
{% raw %}
<script id="search-results-template" type="text/mustache">
{{#entries}}
<article>
<h3>
{{#date}}<small><time datetime="{{pubdate}}" pubdate>{{displaydate}}</time></small>{{/date}}
<a href="{{url}}">{{title}}</a>
</h3>
{{#is_post}}
<ul>
{{#tags}}<li>{{.}} </li>{{/tags}}
</ul>
{{/is_post}}
</article>
{{/entries}}
</script>
{% endraw %}
Обратите внимание на использование {% raw %}
и {% endraw %}
чтобы гарантировать, что теги Mustache не удаляются Jekyll.
Поля, доступные для отображения, следующие.
Список записей результатов поиска (обязательно).
Необработанная дата публикации для сообщений или ноль для страниц. Может использоваться для переключения отображения следующих дат в шаблоне {{#date}}has a date{{/date}} {{#!date}}no date{{/date}}
.
Дата публикации публикации в формате «гггг-мм-дд» для использования в элементе html5 <time datetime="{{pubdate}}">
(только публикации).
Дата публикации публикации в формате «ммм дд, гггг», например 12 октября 2012 г. (только публикации).
Название страницы или сообщения Jekyll.
URL-адрес страницы или публикации Jekyll, который можно использовать для создания гиперссылки <a href="{{url}}">{{title}}</a>
.
Категории (массив) страницы или сообщения Jekyll можно использовать в цикле {{#categories}}{{.}} {{/categories}}
для их перечисления.
Теги (массив) страницы или сообщения Jekyll можно использовать в цикле {{#tags}}{{.}} {{/tags}}
для их перечисления.
Логическое значение, true, если текущий элемент результата является публикацией. Может использоваться для переключения отображения определенных элементов в шаблоне {{#is_post}}is a post{{/is_post}}
<script type="text/javascript">
$(function() {
$('#search-query').lunrSearch({
indexUrl : '/js/index.json', // url for the .json file containing search index data
results : '#search-results', // selector for containing search results element
template : '#search-results-template', // selector for Mustache.js template
titleMsg : '<h1>Search results<h1>', // message attached in front of results (can be empty)
emptyMsg : '<p>Nothing found.</p>' // shown message if search returns no results
});
});
</script>
Добавьте следующий параметр exclude_from_search
в конфигурацию YAML любой страницы.
exclude_from_search: true
Или добавьте массив исключений (в виде отдельных регулярных выражений) в файл _config.yml
сайта.
lunr_search:
excludes: [rss.xml, atom.xml]
Вы также можете настроить файл стоп-слов и минимальную длину слова, которое будет включено в индексный файл. Это можно сделать, добавив блок поиска в _config.yml
. Значения по умолчанию:
lunr_search:
stopwords: "stopwords.txt"
min_length: 3
Файл стоп-слов должен состоять из одного слова в строке, строчных букв, без знаков препинания.
Вы можете сохранить index.json
, search.min.js
и lunr.min.js
в другом каталоге, например:
lunr_search:
js_dir: "javascript"
Плагин поиска развернут на 10consulting.com/search. Некоторые примеры поисковых запросов: /search/?q=git, /search/?q=cqrs.
Он также обеспечивает загрузку плагина поиска .js
по требованию при фокусировке на поле поиска на главной странице. Посмотрите на сетевые запросы браузера, вводящие поисковый запрос.
Чтобы создать один файл плагина jekyll_lunr_js_search.rb
.
Установите Bundler и запустите следующее.
bundle install
Установите Бауэр.
Для сборки плагина.
rake build
Затем скопируйте build/jekyll_lunr_js_search.rb
в папку _plugins
вашего сайта Jekyll, а файлы build/*.min.js
— в папку js
вашего сайта.
Если вы добавите файлы .js
и .js.map
консоль разработчика вашего браузера будет ссылаться на неминифицированный код.