algoliasearch-jekyll 0.4.3 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|