algoliasearch-jekyll 0.4.3 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +109 -19
- data/algoliasearch-jekyll.gemspec +4 -3
- data/docs/travis-settings.png +0 -0
- data/lib/record_extractor.rb +22 -6
- data/spec/record_extractor_spec.rb +65 -7
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: be7a946ef88f83e9dd443b3bb1cf0192b9809366
|
4
|
+
data.tar.gz: 613b7ae7df5b1ea5d23393225c9bf9953cddcfd7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 94285229cd205e237c10562c8c15060f69d7986d2074e6267192099aba31d033d31459f36a35f1b699d6b2c6504f7be74474af5ed387106975d9ad17fa6d1a9e
|
7
|
+
data.tar.gz: 4aefd0b4d45a2d28b4e7ed4b8f56af28c2296cc3ce423894b854b4f97a1ef05e05db11f951c6e23384eac8e149693d60936ae244fa7bc4f42717a024e4a53e77
|
data/README.md
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# Algolia Jekyll Plugin
|
2
2
|
|
3
|
-
[![Gem Version]
|
4
|
-
[![Build Status]
|
5
|
-
[![Coverage Status]
|
6
|
-
[![Code Climate]
|
3
|
+
[![Gem Version][1]](http://badge.fury.io/rb/algoliasearch-jekyll)
|
4
|
+
[![Build Status][2]](https://travis-ci.org/algolia/algoliasearch-jekyll)
|
5
|
+
[![Coverage Status][3]](https://coveralls.io/github/algolia/algoliasearch-jekyll?branch=master)
|
6
|
+
[![Code Climate][4]](https://codeclimate.com/github/algolia/algoliasearch-jekyll)
|
7
7
|
|
8
8
|
Jekyll plugin to automatically index your Jekyll posts and pages into an
|
9
9
|
Algolia index by simply running `jekyll algolia push`.
|
@@ -28,10 +28,10 @@ minimum content to get your started.
|
|
28
28
|
```ruby
|
29
29
|
source 'https://rubygems.org'
|
30
30
|
|
31
|
-
gem 'jekyll', '
|
31
|
+
gem 'jekyll', '~> 2.5.3'
|
32
32
|
|
33
33
|
group :jekyll_plugins do
|
34
|
-
gem 'algoliasearch-jekyll'
|
34
|
+
gem 'algoliasearch-jekyll', '~> 0.4.3'
|
35
35
|
end
|
36
36
|
```
|
37
37
|
|
@@ -59,13 +59,13 @@ algolia:
|
|
59
59
|
index_name: 'your_index_name'
|
60
60
|
```
|
61
61
|
|
62
|
-
You
|
62
|
+
You write api key will be read from the `ALGOLIA_API_KEY` environment variable.
|
63
63
|
You can define it on the same line as your command, allowing you to type
|
64
|
-
`ALGOLIA_API_KEY='
|
64
|
+
`ALGOLIA_API_KEY='your_write_api_key' jekyll algolia push`.
|
65
65
|
|
66
66
|
### ⚠ Other, unsecure, method ⚠
|
67
67
|
|
68
|
-
You can also store your
|
68
|
+
You can also store your write api key in a file named `_algolia_api_key`, in
|
69
69
|
your source directory. If you do this we __very, very, very strongly__ encourage
|
70
70
|
you to make sure the file is not tracked in your versioning system.
|
71
71
|
|
@@ -100,8 +100,10 @@ algolia:
|
|
100
100
|
|
101
101
|
#### `settings`
|
102
102
|
|
103
|
-
Here you can pass any
|
104
|
-
|
103
|
+
Here you can pass any specific [index settings][5] to your Algolia index. All
|
104
|
+
the settings supported by the API can be passed here.
|
105
|
+
|
106
|
+
##### Examples
|
105
107
|
|
106
108
|
If you want to activate `distinct` and some snippets for example, you would do:
|
107
109
|
|
@@ -113,6 +115,28 @@ algolia:
|
|
113
115
|
attributesToSnippet: ['text:20']
|
114
116
|
```
|
115
117
|
|
118
|
+
If you want to search in other fields than the default ones, you'll have to edit
|
119
|
+
the `attributesToIndex` (default is `%w(title h1 h2 h3 h4 h5 h6 unordered(text)
|
120
|
+
unordered(tags))`
|
121
|
+
|
122
|
+
```yml
|
123
|
+
algolia:
|
124
|
+
settings:
|
125
|
+
attributesToIndex:
|
126
|
+
- title
|
127
|
+
- h1
|
128
|
+
- h2
|
129
|
+
- h3
|
130
|
+
- h4
|
131
|
+
- h5
|
132
|
+
- h6
|
133
|
+
- unordered(text)
|
134
|
+
- unordered(tags)
|
135
|
+
- your_custom_attribute_1
|
136
|
+
- your_custom_attribute_2
|
137
|
+
- ...
|
138
|
+
```
|
139
|
+
|
116
140
|
### Hooks
|
117
141
|
|
118
142
|
The `AlgoliaSearchRecordExtractor` contains two methods (`custom_hook_each` and
|
@@ -169,20 +193,86 @@ push` command:
|
|
169
193
|
|
170
194
|
The `algoliasearch-jekyll` plugin works for versions of Jekyll starting from
|
171
195
|
2.5, with a version of Ruby of at least 2.0. You also need
|
172
|
-
[Bundler]
|
196
|
+
[Bundler][6] to easily add the gem as a dependency to Jekyll.
|
173
197
|
|
174
198
|
## Searching
|
175
199
|
|
176
200
|
This plugin will only index your data in your Algolia index. Adding search
|
177
|
-
capabilities is quite easy. You can follow [our tutorials][
|
178
|
-
version of the popular [Hyde theme][
|
201
|
+
capabilities is quite easy. You can follow [our tutorials][7] or use our forked
|
202
|
+
version of the popular [Hyde theme][8].
|
179
203
|
|
180
204
|
## GitHub Pages
|
181
205
|
|
182
|
-
|
183
|
-
|
184
|
-
|
206
|
+
GitHub does not allow custom plugins to be run on GitHub Pages. This means that
|
207
|
+
you'll either have to run `jekyll algolia push` manually, or configure TravisCI
|
208
|
+
to do it for you.
|
209
|
+
|
210
|
+
[Travis CI][9] is an hosted continuous integration
|
211
|
+
service, and it's free for open-source projects. Properly configured, it can
|
212
|
+
automatically reindex your data whenever you push to `gh-pages`.
|
213
|
+
|
214
|
+
For it to work, you'll have 3 steps to perform.
|
215
|
+
|
216
|
+
### 1. Create a `.travis.yml` file
|
217
|
+
|
218
|
+
Create a file named `.travis.yml` at the root of your project, with the
|
219
|
+
following content:
|
220
|
+
|
221
|
+
```yml
|
222
|
+
language: ruby
|
223
|
+
cache: bundler
|
224
|
+
branches:
|
225
|
+
only:
|
226
|
+
- gh-pages
|
227
|
+
script:
|
228
|
+
- bundle exec jekyll algolia push
|
229
|
+
rvm:
|
230
|
+
- 2.2
|
231
|
+
```
|
232
|
+
|
233
|
+
This file will be read by Travis and instruct it to fetch all dependencies
|
234
|
+
defined in the `Gemfile`, then run `jekyll algolia push`. This will only be
|
235
|
+
triggered when data is pushed to the `gh-pages` branch.
|
236
|
+
|
237
|
+
### 2. Update your `_config.yml` file to exclude `vendor`
|
238
|
+
|
239
|
+
Travis will download all you `Gemfile` dependencies into a directory named
|
240
|
+
`vendor`. You have to tell Jekyll to ignore this directory, otherwise Jekyll
|
241
|
+
will try to parse it (and fail).
|
242
|
+
|
243
|
+
Doing so is easy, just add the following line to your `_config.yml` file:
|
244
|
+
|
245
|
+
```yml
|
246
|
+
exclude: [vendor]
|
247
|
+
```
|
248
|
+
|
249
|
+
### 3. Configure Travis
|
250
|
+
|
251
|
+
In order for Travis to be able to push data to your index on your behalf, you
|
252
|
+
have to give it your write API Key. This is achieved by defining an
|
253
|
+
`ALGOLIA_API_KEY` [environment variable][10] in Travis settings.
|
254
|
+
|
255
|
+
You should also uncheck the "Build pull requests" option, otherwise any pull
|
256
|
+
request targeting `gh-pages` will trigger the reindexing.
|
257
|
+
|
258
|
+
![Travis Configuration][11]
|
259
|
+
|
260
|
+
### Done
|
261
|
+
|
262
|
+
Commit all the changes to the files, and then push to `gh-pages`. Travis will
|
263
|
+
catch the event and trigger your indexing for you. You can follow the Travis job
|
264
|
+
execution directly on [their website][12].
|
185
265
|
|
186
266
|
|
187
|
-
[1]: https://
|
188
|
-
[2]: https://
|
267
|
+
[1]: https://badge.fury.io/rb/algoliasearch-jekyll.svg
|
268
|
+
[2]: https://travis-ci.org/algolia/algoliasearch-jekyll.svg?branch=master
|
269
|
+
[3]: https://coveralls.io/repos/algolia/algoliasearch-jekyll/badge.svg?branch=master&service=github
|
270
|
+
[4]: https://codeclimate.com/github/algolia/algoliasearch-jekyll/badges/gpa.svg
|
271
|
+
[5]: https://www.algolia.com/doc/ruby#indexing-parameters
|
272
|
+
[6]: http://bundler.io/
|
273
|
+
[7]: https://www.algolia.com/doc/javascript
|
274
|
+
[8]: https://github.com/algolia/hyde
|
275
|
+
[9]: https://travis-ci.org/
|
276
|
+
[10]: http://docs.travis-ci.com/user/environment-variables/
|
277
|
+
[11]: /docs/travis-settings.png
|
278
|
+
[12]: https://travis-ci.org
|
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: algoliasearch-jekyll 0.
|
5
|
+
# stub: algoliasearch-jekyll 0.5.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "algoliasearch-jekyll"
|
9
|
-
s.version = "0.
|
9
|
+
s.version = "0.5.0"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Tim Carry"]
|
14
|
-
s.date = "2015-
|
14
|
+
s.date = "2015-11-03"
|
15
15
|
s.description = "Index all your pages and posts to an Algolia index with `jekyll algolia push`"
|
16
16
|
s.email = "tim@pixelastic.com"
|
17
17
|
s.extra_rdoc_files = [
|
@@ -29,6 +29,7 @@ Gem::Specification.new do |s|
|
|
29
29
|
"README.md",
|
30
30
|
"Rakefile",
|
31
31
|
"algoliasearch-jekyll.gemspec",
|
32
|
+
"docs/travis-settings.png",
|
32
33
|
"lib/algoliasearch-jekyll.rb",
|
33
34
|
"lib/credential_checker.rb",
|
34
35
|
"lib/push.rb",
|
Binary file
|
data/lib/record_extractor.rb
CHANGED
@@ -135,10 +135,9 @@ class AlgoliaSearchRecordExtractor
|
|
135
135
|
node.css_path.gsub('html > body > ', '')
|
136
136
|
end
|
137
137
|
|
138
|
-
#
|
139
|
-
#
|
140
|
-
|
141
|
-
def weight(data)
|
138
|
+
# The more words are in common between this node and its parent heading, the
|
139
|
+
# higher the score
|
140
|
+
def weight_heading_relevance(data)
|
142
141
|
# Get list of unique words in headings
|
143
142
|
title_words = %i(title h1 h2 h3 h4 h5 h6)
|
144
143
|
.select { |title| data.key?(title) }
|
@@ -152,13 +151,30 @@ class AlgoliaSearchRecordExtractor
|
|
152
151
|
(title_words & text_words).size
|
153
152
|
end
|
154
153
|
|
154
|
+
# Returns a weight based on the tag_name
|
155
|
+
def weight_tag_name(item)
|
156
|
+
tag_name = item[:tag_name]
|
157
|
+
# No a heading, no weight
|
158
|
+
return 0 unless %w(h1 h2 h3 h4 h5 h6).include?(tag_name)
|
159
|
+
# h1: 100, h2: 90, ..., h6: 50
|
160
|
+
100 - (tag_name.gsub('h', '').to_i - 1) * 10
|
161
|
+
end
|
162
|
+
|
163
|
+
# Returns an object of all weights
|
164
|
+
def weight(item, index)
|
165
|
+
{
|
166
|
+
tag_name: weight_tag_name(item),
|
167
|
+
heading_relevance: weight_heading_relevance(item),
|
168
|
+
position: index
|
169
|
+
}
|
170
|
+
end
|
171
|
+
|
155
172
|
def extract
|
156
173
|
items = []
|
157
174
|
html_nodes.each_with_index do |node, index|
|
158
175
|
next unless node.text.size > 0
|
159
176
|
|
160
177
|
item = metadata.clone
|
161
|
-
item[:objectID] = "#{item[:slug]}_#{index}"
|
162
178
|
item.merge!(node_hierarchy(node))
|
163
179
|
item[:tag_name] = node.name
|
164
180
|
item[:raw_html] = node_raw_html(node)
|
@@ -166,7 +182,7 @@ class AlgoliaSearchRecordExtractor
|
|
166
182
|
item[:unique_hierarchy] = unique_hierarchy(item)
|
167
183
|
item[:css_selector] = node_css_selector(node)
|
168
184
|
item[:css_selector_parent] = node_css_selector(node_heading_parent(node))
|
169
|
-
item[:weight] = weight(item)
|
185
|
+
item[:weight] = weight(item, index)
|
170
186
|
|
171
187
|
# We pass item through the user defined custom hook
|
172
188
|
item = custom_hook_each(item, node)
|
@@ -316,7 +316,7 @@ describe(AlgoliaSearchRecordExtractor) do
|
|
316
316
|
end
|
317
317
|
end
|
318
318
|
|
319
|
-
describe '
|
319
|
+
describe 'weight_heading_relevance' do
|
320
320
|
it 'gets the number of words in text also in the title' do
|
321
321
|
# Given
|
322
322
|
data = {
|
@@ -325,7 +325,7 @@ describe(AlgoliaSearchRecordExtractor) do
|
|
325
325
|
}
|
326
326
|
|
327
327
|
# When
|
328
|
-
actual = page_file.
|
328
|
+
actual = page_file.weight_heading_relevance(data)
|
329
329
|
|
330
330
|
# Then
|
331
331
|
expect(actual).to eq 2
|
@@ -341,7 +341,7 @@ describe(AlgoliaSearchRecordExtractor) do
|
|
341
341
|
}
|
342
342
|
|
343
343
|
# When
|
344
|
-
actual = page_file.
|
344
|
+
actual = page_file.weight_heading_relevance(data)
|
345
345
|
|
346
346
|
# Then
|
347
347
|
expect(actual).to eq 3
|
@@ -357,7 +357,7 @@ describe(AlgoliaSearchRecordExtractor) do
|
|
357
357
|
}
|
358
358
|
|
359
359
|
# When
|
360
|
-
actual = page_file.
|
360
|
+
actual = page_file.weight_heading_relevance(data)
|
361
361
|
|
362
362
|
# Then
|
363
363
|
expect(actual).to eq 2
|
@@ -372,7 +372,7 @@ describe(AlgoliaSearchRecordExtractor) do
|
|
372
372
|
}
|
373
373
|
|
374
374
|
# When
|
375
|
-
actual = page_file.
|
375
|
+
actual = page_file.weight_heading_relevance(data)
|
376
376
|
|
377
377
|
# Then
|
378
378
|
expect(actual).to eq 2
|
@@ -386,7 +386,7 @@ describe(AlgoliaSearchRecordExtractor) do
|
|
386
386
|
}
|
387
387
|
|
388
388
|
# When
|
389
|
-
actual = page_file.
|
389
|
+
actual = page_file.weight_heading_relevance(data)
|
390
390
|
|
391
391
|
# Then
|
392
392
|
expect(actual).to eq 1
|
@@ -407,13 +407,71 @@ describe(AlgoliaSearchRecordExtractor) do
|
|
407
407
|
}
|
408
408
|
|
409
409
|
# When
|
410
|
-
actual = page_file.
|
410
|
+
actual = page_file.weight_heading_relevance(data)
|
411
411
|
|
412
412
|
# Then
|
413
413
|
expect(actual).to eq 2
|
414
414
|
end
|
415
415
|
end
|
416
416
|
|
417
|
+
describe 'weight_tag_name' do
|
418
|
+
it 'gives a score of 0 to non-headings' do
|
419
|
+
# Given
|
420
|
+
data = {
|
421
|
+
tag_name: 'p'
|
422
|
+
}
|
423
|
+
|
424
|
+
# When
|
425
|
+
actual = page_file.weight_tag_name(data)
|
426
|
+
|
427
|
+
# Then
|
428
|
+
expect(actual).to eq 0
|
429
|
+
end
|
430
|
+
it 'gives a score of 100 to h1' do
|
431
|
+
# Given
|
432
|
+
data = {
|
433
|
+
tag_name: 'h1'
|
434
|
+
}
|
435
|
+
|
436
|
+
# When
|
437
|
+
actual = page_file.weight_tag_name(data)
|
438
|
+
|
439
|
+
# Then
|
440
|
+
expect(actual).to eq 100
|
441
|
+
end
|
442
|
+
it 'gives a score of 40 to h6' do
|
443
|
+
# Given
|
444
|
+
data = {
|
445
|
+
tag_name: 'h6'
|
446
|
+
}
|
447
|
+
|
448
|
+
# When
|
449
|
+
actual = page_file.weight_tag_name(data)
|
450
|
+
|
451
|
+
# Then
|
452
|
+
expect(actual).to eq 50
|
453
|
+
end
|
454
|
+
end
|
455
|
+
|
456
|
+
describe 'weight' do
|
457
|
+
it 'returns an object with all weights' do
|
458
|
+
# Given
|
459
|
+
item = {
|
460
|
+
tag_name: 'p'
|
461
|
+
}
|
462
|
+
allow(page_file).to receive(:weight_tag_name) { 10 }
|
463
|
+
allow(page_file).to receive(:weight_heading_relevance) { 20 }
|
464
|
+
|
465
|
+
# When
|
466
|
+
actual = page_file.weight(item, 42)
|
467
|
+
|
468
|
+
# Then
|
469
|
+
expect(actual).to include(tag_name: 10)
|
470
|
+
expect(actual).to include(heading_relevance: 20)
|
471
|
+
expect(actual).to include(position: 42)
|
472
|
+
end
|
473
|
+
end
|
474
|
+
|
417
475
|
describe 'custom_hook_each' do
|
418
476
|
it 'let the user call a custom hook to modify a record' do
|
419
477
|
# Given
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: algoliasearch-jekyll
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Carry
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: algoliasearch
|
@@ -211,6 +211,7 @@ files:
|
|
211
211
|
- README.md
|
212
212
|
- Rakefile
|
213
213
|
- algoliasearch-jekyll.gemspec
|
214
|
+
- docs/travis-settings.png
|
214
215
|
- lib/algoliasearch-jekyll.rb
|
215
216
|
- lib/credential_checker.rb
|
216
217
|
- lib/push.rb
|