algoliasearch-jekyll 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec +2 -0
- data/.rubocop.yml +25 -0
- data/Gemfile +15 -0
- data/Guardfile +7 -0
- data/LICENSE.txt +20 -0
- data/README.md +148 -0
- data/Rakefile +44 -0
- data/VERSION +1 -0
- data/lib/push.rb +17 -10
- data/lib/record_extractor.rb +40 -46
- data/scripts/git_hooks/pre-commit +10 -0
- data/scripts/git_hooks/pre-push +3 -0
- data/scripts/run_tests +2 -0
- data/scripts/update_gem +10 -0
- data/spec/fixtures/_config.yml +7 -0
- data/spec/fixtures/_my-collection/collection-item.html +6 -0
- data/spec/fixtures/_my-collection/collection-item.md +7 -0
- data/spec/fixtures/_posts/2015-07-02-test-post.md +32 -0
- data/spec/fixtures/about.md +34 -0
- data/spec/fixtures/api_key_dir/_algolia_api_key +1 -0
- data/spec/fixtures/assets/ring.png +0 -0
- data/spec/fixtures/authors.html +5 -0
- data/spec/fixtures/excluded.html +5 -0
- data/spec/fixtures/hierarchy.md +35 -0
- data/spec/fixtures/weight.md +19 -0
- data/spec/push_spec.rb +220 -0
- data/spec/record_extractor_spec.rb +451 -0
- data/spec/spec_helper.rb +33 -0
- data/spec/spec_helper_jekyll.rb +4 -0
- data/spec/spec_helper_simplecov.rb +9 -0
- metadata +99 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cde772c27a05882aba2a47f5c0fa626440ad7755
|
4
|
+
data.tar.gz: d0c6dafb3d6b3ade9a35057f6c91b9c6b3c3bfdc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ad814fa1f1eee3d87a6407740d9aad6501874a86b395bda116c0ddeb82d35dae9ed17c87bbb59d98c11fc32c5c75a52a187838b8a8bf7714ec158c0b9a8137a0
|
7
|
+
data.tar.gz: 43d778da3ad04dec941d1f46e7a1943aeb8e60e771171243f9f502994d52a18325d26a85497f5919ccf2437c57e1c0b5fd1400ddaab0e7b8bf883650628f9b2a
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# Defaults:
|
2
|
+
# https://github.com/bbatsov/rubocop/blob/master/config/default.yml
|
3
|
+
Metrics/AbcSize:
|
4
|
+
Max: 100
|
5
|
+
|
6
|
+
Metrics/ClassLength:
|
7
|
+
Max: 200
|
8
|
+
|
9
|
+
Metrics/ModuleLength:
|
10
|
+
Max: 200
|
11
|
+
|
12
|
+
Metrics/MethodLength:
|
13
|
+
Max: 50
|
14
|
+
|
15
|
+
Metrics/CyclomaticComplexity:
|
16
|
+
Max: 10
|
17
|
+
|
18
|
+
Metrics/PerceivedComplexity:
|
19
|
+
Max: 10
|
20
|
+
|
21
|
+
Style/FileName:
|
22
|
+
Enabled: false
|
23
|
+
|
24
|
+
Style/MultilineOperationIndentation:
|
25
|
+
Enabled: false
|
data/Gemfile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
source 'http://rubygems.org'
|
2
|
+
|
3
|
+
gem 'algoliasearch', '~> 1.4'
|
4
|
+
gem 'awesome_print', '~> 1.6'
|
5
|
+
gem 'json', '~> 1.8'
|
6
|
+
gem 'nokogiri', '~> 1.6'
|
7
|
+
|
8
|
+
group :development do
|
9
|
+
gem 'guard-rspec', '~> 4.6'
|
10
|
+
gem 'jekyll', '~> 2.5'
|
11
|
+
gem 'jeweler', '~> 2.0'
|
12
|
+
gem 'rspec', '~> 3.0'
|
13
|
+
gem 'rubocop', '~> 0.31'
|
14
|
+
gem 'simplecov', '~> 0.10'
|
15
|
+
end
|
data/Guardfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2015 Algolia
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,148 @@
|
|
1
|
+
# Algolia Jekyll Plugin
|
2
|
+
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/algoliasearch-jekyll.svg)](http://badge.fury.io/rb/algoliasearch-jekyll)
|
4
|
+
|
5
|
+
Jekyll plugin to automatically index your Jekyll posts and pages into an
|
6
|
+
Algolia index by simply running `jekyll algolia push`.
|
7
|
+
|
8
|
+
## Usage
|
9
|
+
|
10
|
+
```shell
|
11
|
+
$ jekyll algolia push
|
12
|
+
```
|
13
|
+
|
14
|
+
This will push the content of your jekyll website to your Algolia index.
|
15
|
+
|
16
|
+
You can specify any option you would normally pass to `jekyll build`, like
|
17
|
+
`--config`, `--source`, `--destination`, etc.
|
18
|
+
|
19
|
+
## Installation
|
20
|
+
|
21
|
+
First, add the `algoliasearch-jekyll` gem to your `Gemfile`, in the
|
22
|
+
`:jekyll_plugins` section. If you do not yet have a `Gemfile`, here is the
|
23
|
+
minimum content to get your started.
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
source 'https://rubygems.org'
|
27
|
+
|
28
|
+
gem 'jekyll', '>=2.5.3'
|
29
|
+
|
30
|
+
group :jekyll_plugins do
|
31
|
+
gem 'algoliasearch-jekyll'
|
32
|
+
end
|
33
|
+
```
|
34
|
+
|
35
|
+
Once this is done, download all dependencies with `bundle install`.
|
36
|
+
|
37
|
+
Then, add `algoliasearch-jekyll` to your `_config.yml` file, under the `gems`
|
38
|
+
section, like this:
|
39
|
+
|
40
|
+
```yaml
|
41
|
+
gems:
|
42
|
+
- algoliasearch-jekyll
|
43
|
+
```
|
44
|
+
|
45
|
+
If everything went well, you should be able to execute `jekyll help` and see the
|
46
|
+
`algolia` subcommand listed.
|
47
|
+
|
48
|
+
## Configuration
|
49
|
+
|
50
|
+
Add information about your Algolia configuration into the `_config.yml` file,
|
51
|
+
under the `algolia` section, like this:
|
52
|
+
|
53
|
+
```yaml
|
54
|
+
algolia:
|
55
|
+
application_id: 'your_application_id'
|
56
|
+
index_name: 'your_index_name'
|
57
|
+
```
|
58
|
+
|
59
|
+
You admin api key will be read from the `ALGOLIA_API_KEY` environment variable.
|
60
|
+
You can define it on the same line as your command, allowing you to type
|
61
|
+
`ALGOLIA_API_KEY='your_admin_api_key' jekyll algolia push`.
|
62
|
+
|
63
|
+
### ⚠ Other, unsecure, method ⚠
|
64
|
+
|
65
|
+
You can also store your admin api key in a file named `_algolia_api_key`, in
|
66
|
+
your source directory. If you do this we __very, very, very strongly__ encourage
|
67
|
+
you to make sure the file is not tracked in your versioning system.
|
68
|
+
|
69
|
+
### Options
|
70
|
+
|
71
|
+
The plugin uses sensible defaults, but you may want to override some of its
|
72
|
+
configuration. Here are the various options you can add to your `_config.yml`
|
73
|
+
file, under the `algolia` section:
|
74
|
+
|
75
|
+
#### `excluded_files`
|
76
|
+
|
77
|
+
Defines which files should not be indexed for search.
|
78
|
+
|
79
|
+
```yml
|
80
|
+
algolia:
|
81
|
+
excluded_files:
|
82
|
+
- index.html
|
83
|
+
- 2015-01-01-post.md
|
84
|
+
```
|
85
|
+
|
86
|
+
#### `record_css_selector`
|
87
|
+
|
88
|
+
Defines the css selector inside a page/post used to choose which parts to index.
|
89
|
+
It is set to all paragraphs (`<p>`) by default.
|
90
|
+
|
91
|
+
If you would like to also index lists, you could set it like this:
|
92
|
+
|
93
|
+
```yml
|
94
|
+
algolia:
|
95
|
+
record_css_selector: 'p,ul'
|
96
|
+
```
|
97
|
+
|
98
|
+
#### `settings`
|
99
|
+
|
100
|
+
Here you can pass any custom settings you would like to push to your Algolia
|
101
|
+
index.
|
102
|
+
|
103
|
+
If you want to activate `distinct` and some snippets for example, you would do:
|
104
|
+
|
105
|
+
```yml
|
106
|
+
algolia:
|
107
|
+
settings:
|
108
|
+
attributeForDistinct: 'hierarchy'
|
109
|
+
distinct: true
|
110
|
+
attributesToSnippet: ['text:20']
|
111
|
+
```
|
112
|
+
|
113
|
+
### Hooks
|
114
|
+
|
115
|
+
The `AlgoliaSearchRecordExtractor` contains two methods (`custom_hook_each` and
|
116
|
+
`custom_hook_all`) that are here so you can overwrite them to add your custom
|
117
|
+
logic. They currently simply return the argument they take as input.
|
118
|
+
|
119
|
+
```ruby
|
120
|
+
class AlgoliaSearchRecordExtractor
|
121
|
+
# Hook to modify a record after extracting
|
122
|
+
# `node` refers to the Nokogiri HTML node of the element
|
123
|
+
def custom_hook_each(item, node)
|
124
|
+
item
|
125
|
+
end
|
126
|
+
|
127
|
+
# Hook to modify all records after extracting
|
128
|
+
def custom_hook_all(items)
|
129
|
+
items
|
130
|
+
end
|
131
|
+
end
|
132
|
+
```
|
133
|
+
|
134
|
+
## Searching
|
135
|
+
|
136
|
+
This plugin will only index your data in your Algolia index. Adding search
|
137
|
+
capabilities is quite easy. You can follow [our tutorials][1] or use our forked
|
138
|
+
version of the popular [Hyde theme][2].
|
139
|
+
|
140
|
+
## GitHub Pages
|
141
|
+
|
142
|
+
Unfortunatly, GitHub does not allow custom plugins to be run on GitHub Pages.
|
143
|
+
This mean that you will have to manually run `jekyll algolia push` before
|
144
|
+
pushing your content to GitHub.
|
145
|
+
|
146
|
+
|
147
|
+
[1]: https://www.algolia.com/doc/javascript
|
148
|
+
[2]: https://github.com/algolia/hyde
|
data/Rakefile
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler'
|
5
|
+
begin
|
6
|
+
Bundler.setup(:default, :development)
|
7
|
+
rescue Bundler::BundlerError => e
|
8
|
+
$stderr.puts e.message
|
9
|
+
$stderr.puts 'Run `bundle install` to install missing gems'
|
10
|
+
exit e.status_code
|
11
|
+
end
|
12
|
+
require 'rake'
|
13
|
+
|
14
|
+
require 'jeweler'
|
15
|
+
Jeweler::Tasks.new do |gem|
|
16
|
+
# gem is a Gem::Specification... see
|
17
|
+
# http://guides.rubygems.org/specification-reference/ for more options
|
18
|
+
gem.name = 'algoliasearch-jekyll'
|
19
|
+
gem.homepage = 'https://github.com/algolia/algoliasearch-jekyll'
|
20
|
+
gem.license = 'MIT'
|
21
|
+
gem.summary = 'AlgoliaSearch for Jekyll'
|
22
|
+
gem.description = 'Index all your pages and posts to an Algolia index with ' \
|
23
|
+
'`jekyll algolia push`'
|
24
|
+
gem.email = 'tim@pixelastic.com'
|
25
|
+
gem.authors = ['Tim Carry']
|
26
|
+
# dependencies defined in Gemfile
|
27
|
+
end
|
28
|
+
Jeweler::RubygemsDotOrgTasks.new
|
29
|
+
|
30
|
+
require 'rspec/core'
|
31
|
+
require 'rspec/core/rake_task'
|
32
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
33
|
+
# spec.rspec_opts = '--color --format documentation'
|
34
|
+
spec.pattern = FileList['spec/**/*_spec.rb']
|
35
|
+
end
|
36
|
+
task test: :spec
|
37
|
+
|
38
|
+
desc 'Code coverage detail'
|
39
|
+
task :coverage do
|
40
|
+
ENV['COVERAGE'] = 'true'
|
41
|
+
Rake::Task['spec'].execute
|
42
|
+
end
|
43
|
+
|
44
|
+
task default: :test
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.2.3
|
data/lib/push.rb
CHANGED
@@ -31,17 +31,19 @@ class AlgoliaSearchJekyllPush < Jekyll::Command
|
|
31
31
|
def indexable?(file)
|
32
32
|
return false if file.is_a?(Jekyll::StaticFile)
|
33
33
|
|
34
|
+
basename = File.basename(file.path)
|
35
|
+
extname = File.extname(basename)[1..-1]
|
36
|
+
|
34
37
|
# Keep only markdown and html files
|
35
38
|
allowed_extensions = %w(html)
|
36
39
|
if @config['markdown_ext']
|
37
40
|
allowed_extensions += @config['markdown_ext'].split(',')
|
38
41
|
end
|
39
|
-
|
40
|
-
return false unless allowed_extensions.include?(current_extension)
|
42
|
+
return false unless allowed_extensions.include?(extname)
|
41
43
|
|
42
44
|
# Exclude files manually excluded from config
|
43
45
|
excluded_files = @config['algolia']['excluded_files']
|
44
|
-
return false if excluded_files && excluded_files.include?(
|
46
|
+
return false if excluded_files && excluded_files.include?(basename)
|
45
47
|
|
46
48
|
true
|
47
49
|
end
|
@@ -55,7 +57,6 @@ class AlgoliaSearchJekyllPush < Jekyll::Command
|
|
55
57
|
items = []
|
56
58
|
each_site_file do |file|
|
57
59
|
next unless AlgoliaSearchJekyllPush.indexable?(file)
|
58
|
-
|
59
60
|
new_items = AlgoliaSearchRecordExtractor.new(file).extract
|
60
61
|
next if new_items.nil?
|
61
62
|
|
@@ -162,27 +163,33 @@ class AlgoliaSearchJekyllPush < Jekyll::Command
|
|
162
163
|
|
163
164
|
def push(items)
|
164
165
|
check_credentials
|
165
|
-
|
166
|
-
index_name = @config['algolia']['index_name']
|
167
166
|
Algolia.init(
|
168
167
|
application_id: @config['algolia']['application_id'],
|
169
168
|
api_key: api_key
|
170
169
|
)
|
171
|
-
index = Algolia::Index.new(index_name)
|
172
|
-
configure_index(index)
|
173
|
-
index.clear_index
|
174
170
|
|
171
|
+
# Create a temporary index
|
172
|
+
index_name = @config['algolia']['index_name']
|
173
|
+
index_name_tmp = "#{index_name}_tmp"
|
174
|
+
index_tmp = Algolia::Index.new(index_name_tmp)
|
175
|
+
configure_index(index_tmp)
|
176
|
+
|
177
|
+
# Push to temporary index
|
175
178
|
items.each_slice(1000) do |batch|
|
176
179
|
Jekyll.logger.info "Indexing #{batch.size} items"
|
177
180
|
begin
|
178
|
-
|
181
|
+
index_tmp.add_objects!(batch)
|
179
182
|
rescue StandardError => error
|
180
183
|
Jekyll.logger.error 'Algolia Error: HTTP Error'
|
181
184
|
Jekyll.logger.warn error.message
|
182
185
|
exit 1
|
186
|
+
|
183
187
|
end
|
184
188
|
end
|
185
189
|
|
190
|
+
# Move temporary index to real one
|
191
|
+
Algolia.move_index(index_name_tmp, index_name)
|
192
|
+
|
186
193
|
Jekyll.logger.info "Indexing of #{items.size} items " \
|
187
194
|
"in #{index_name} done."
|
188
195
|
end
|
data/lib/record_extractor.rb
CHANGED
@@ -24,9 +24,24 @@ class AlgoliaSearchRecordExtractor
|
|
24
24
|
|
25
25
|
# Returns metadata from the current file
|
26
26
|
def metadata
|
27
|
-
|
28
|
-
|
29
|
-
|
27
|
+
metadata = {}
|
28
|
+
@file.data.each { |key, value| metadata[key.to_sym] = value }
|
29
|
+
|
30
|
+
metadata[:type] = @file.class.name.split('::')[1].downcase
|
31
|
+
metadata[:url] = @file.url
|
32
|
+
|
33
|
+
if @file.respond_to? :slug
|
34
|
+
metadata[:slug] = @file.slug
|
35
|
+
else
|
36
|
+
basename = File.basename(@file.path)
|
37
|
+
extname = File.extname(basename)
|
38
|
+
metadata[:slug] = File.basename(basename, extname)
|
39
|
+
end
|
40
|
+
|
41
|
+
metadata[:posted_at] = @file.date.to_time.to_i if @file.respond_to? :date
|
42
|
+
metadata[:tags] = tags if @file.respond_to? :tags
|
43
|
+
|
44
|
+
metadata
|
30
45
|
end
|
31
46
|
|
32
47
|
# Extract a list of tags
|
@@ -37,41 +52,21 @@ class AlgoliaSearchRecordExtractor
|
|
37
52
|
@file.tags.map(&:to_s)
|
38
53
|
end
|
39
54
|
|
40
|
-
# Extract metadata from a post
|
41
|
-
def metadata_post
|
42
|
-
{
|
43
|
-
type: 'post',
|
44
|
-
url: @file.url,
|
45
|
-
title: @file.title,
|
46
|
-
slug: @file.slug,
|
47
|
-
posted_at: @file.date.to_time.to_i,
|
48
|
-
tags: tags
|
49
|
-
}
|
50
|
-
end
|
51
|
-
|
52
|
-
# Extract metadata from a page
|
53
|
-
def metadata_page
|
54
|
-
{
|
55
|
-
type: 'page',
|
56
|
-
url: @file.url,
|
57
|
-
title: @file['title'],
|
58
|
-
slug: @file.basename
|
59
|
-
}
|
60
|
-
end
|
61
|
-
|
62
55
|
# Get the list of all HTML nodes to index
|
63
56
|
def html_nodes
|
64
57
|
document = Nokogiri::HTML(@file.content)
|
65
58
|
document.css(@config['record_css_selector'])
|
66
59
|
end
|
67
60
|
|
61
|
+
# Check if node is a heading
|
62
|
+
def node_heading?(node)
|
63
|
+
%w(h1 h2 h3 h4 h5 h6).include?(node.name)
|
64
|
+
end
|
65
|
+
|
68
66
|
# Get the closest heading parent
|
69
67
|
def node_heading_parent(node, level = 'h7')
|
70
|
-
|
71
|
-
|
72
|
-
# If initially called on a heading, we must not accept it but only accept
|
73
|
-
# strong headings
|
74
|
-
level = node.name if level == 'h7' && headings.include?(node.name)
|
68
|
+
# If initially called on a heading, we only accept stronger headings
|
69
|
+
level = node.name if level == 'h7' && node_heading?(node)
|
75
70
|
|
76
71
|
previous = node.previous_element
|
77
72
|
|
@@ -84,32 +79,31 @@ class AlgoliaSearchRecordExtractor
|
|
84
79
|
end
|
85
80
|
|
86
81
|
# This is a heading, we return it
|
87
|
-
return previous if
|
82
|
+
return previous if node_heading?(previous) && previous.name < level
|
88
83
|
|
89
84
|
node_heading_parent(previous, level)
|
90
85
|
end
|
91
86
|
|
92
87
|
# Get all the parent headings of the specified node
|
93
|
-
|
94
|
-
|
88
|
+
# If the node itself is a heading, we include it
|
89
|
+
def node_hierarchy(node, state = { level: 7 })
|
90
|
+
tag_name = node.name
|
91
|
+
level = tag_name.gsub('h', '').to_i
|
95
92
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
return memo
|
93
|
+
if node_heading?(node) && level < state[:level]
|
94
|
+
state[tag_name.to_sym] = node_text(node)
|
95
|
+
state[:level] = level
|
100
96
|
end
|
101
97
|
|
102
|
-
|
103
|
-
level = tag_name.gsub('h', '').to_i
|
104
|
-
content = previous.content
|
98
|
+
heading = node_heading_parent(node)
|
105
99
|
|
106
|
-
#
|
107
|
-
|
108
|
-
|
100
|
+
# No previous heading, we can stop the recursion
|
101
|
+
unless heading
|
102
|
+
state.delete(:level)
|
103
|
+
return state
|
104
|
+
end
|
109
105
|
|
110
|
-
|
111
|
-
memo[tag_name.to_sym] = content
|
112
|
-
node_hierarchy(previous, memo)
|
106
|
+
node_hierarchy(heading, state)
|
113
107
|
end
|
114
108
|
|
115
109
|
# Return the raw HTML of the element to index
|
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
# Do not commit any focused or excluded tests
|
4
|
+
if grep --color -r 'spec' -E -e '^( |\t)*(fit|fdescribe|xit|xdescribe)'; then
|
5
|
+
echo '✘ You have focused and/or skipped tests'
|
6
|
+
exit 1
|
7
|
+
fi
|
8
|
+
|
9
|
+
# Match style guide
|
10
|
+
rubocop './lib/' './spec'
|
data/scripts/run_tests
ADDED
data/scripts/update_gem
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
build_output = `gem build algoliasearch-jekyll.gemspec`.split("\n")
|
4
|
+
puts build_output
|
5
|
+
build_output.select! { |line| line.match(/^ File:/) }
|
6
|
+
|
7
|
+
gem_file = build_output[0].gsub(' File: ', '')
|
8
|
+
puts 'Pushing to rubygems'
|
9
|
+
push_output = `gem push #{gem_file}`
|
10
|
+
puts push_output
|
@@ -0,0 +1,32 @@
|
|
1
|
+
---
|
2
|
+
title: "Test post"
|
3
|
+
tags:
|
4
|
+
- tag
|
5
|
+
- another tag
|
6
|
+
custom: Foo
|
7
|
+
---
|
8
|
+
|
9
|
+
Introduction text that also includes [some link](https://www.algolia.com). To
|
10
|
+
add a bit of fancy, we will also __bold__ and _italicize_ some text.
|
11
|
+
|
12
|
+
# Main title
|
13
|
+
|
14
|
+
We like writing stuff and then indexing it in a very fast engine. Here is why
|
15
|
+
a fast engine is good for you:
|
16
|
+
|
17
|
+
* fast
|
18
|
+
* fast
|
19
|
+
* fast
|
20
|
+
* and fast
|
21
|
+
|
22
|
+
## Built with hands
|
23
|
+
|
24
|
+
All this text was typed with my own hands, on my own keyboard. I also did use
|
25
|
+
a Chair© and a Table™.
|
26
|
+
|
27
|
+
## Features
|
28
|
+
|
29
|
+
The whole plugin is composed of parts of `code`, and sometime even
|
30
|
+
<code><code></code>.
|
31
|
+
|
32
|
+
Code is __✔ checked__ and errors are __✘ deleted__.
|
@@ -0,0 +1,34 @@
|
|
1
|
+
---
|
2
|
+
title: About page
|
3
|
+
custom: Foo
|
4
|
+
---
|
5
|
+
|
6
|
+
# Heading 1
|
7
|
+
|
8
|
+
Text 1
|
9
|
+
|
10
|
+
## Heading 2
|
11
|
+
|
12
|
+
Text 2
|
13
|
+
|
14
|
+
### Heading 3
|
15
|
+
|
16
|
+
Text 3
|
17
|
+
|
18
|
+
- item 1
|
19
|
+
- item 2
|
20
|
+
- item 3
|
21
|
+
|
22
|
+
### Another Heading 3
|
23
|
+
|
24
|
+
<p id="text4">Another text 4</p>
|
25
|
+
|
26
|
+
<h2 id="heading2b">Another Heading 2</h2>
|
27
|
+
|
28
|
+
Another `<text>` 5
|
29
|
+
|
30
|
+
### Last Heading 3
|
31
|
+
|
32
|
+
<div>Just a div</div>
|
33
|
+
|
34
|
+
<div><p>Last text 6 </p></div>
|
@@ -0,0 +1 @@
|
|
1
|
+
APIKEY_FROM_FILE
|
Binary file
|
@@ -0,0 +1,35 @@
|
|
1
|
+
---
|
2
|
+
title: Hierarchy test
|
3
|
+
---
|
4
|
+
|
5
|
+
# H1
|
6
|
+
|
7
|
+
TEXT1-H1
|
8
|
+
|
9
|
+
## H2A
|
10
|
+
|
11
|
+
TEXT2-H2A-H1
|
12
|
+
|
13
|
+
TEXT3-H2A-H1
|
14
|
+
|
15
|
+
## H2B
|
16
|
+
|
17
|
+
TEXT4-H2B-H1
|
18
|
+
|
19
|
+
### H3A
|
20
|
+
|
21
|
+
TEXT5-H3-H2B-H1
|
22
|
+
|
23
|
+
<div>
|
24
|
+
<h4>H4</h4>
|
25
|
+
<p>TEXT7-H4-H3-H2B-H1</p>
|
26
|
+
</div>
|
27
|
+
|
28
|
+
## H2C
|
29
|
+
|
30
|
+
TEXT8-H2C-H1
|
31
|
+
|
32
|
+
### H3B `<code>`
|
33
|
+
|
34
|
+
TEXT9-H3B-H2C-H1
|
35
|
+
|