jekyll-algolia 1.1.2 → 1.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 51f8221d0fd59da5c41a3a9dd8496dffd6562989
4
- data.tar.gz: 56523270302c22f93d2537cfb8a614bf7c263cca
3
+ metadata.gz: a394d33bddf856fafbb84d345f2a87987583757b
4
+ data.tar.gz: eaeaa8ff67fdfda25d94e312cdcc18d21510c9a5
5
5
  SHA512:
6
- metadata.gz: 731e81066460aed7b1459a821f05ef7c4124a2b5cf0ae831bc3bc7cde7c29f9ede433e619a67e8dda111d7008b1bf0268af087cf57476ee2ab23d0e5c8c4c186
7
- data.tar.gz: 15d46a745850b81fa7340fd319bd5eb31530457d890a616f8090da9c3fa0e60fccaa913246c6331ecbf00cdcf8c0482f4511cba425d05fbbc3282eba07e9effc
6
+ metadata.gz: db3edbb0a108e58ceddc7c9c1b6aaafe9747d968b007e4b9a25c58ee7a878035282e8452ee826b57d26a503c247667fccdae991222ffc7d4aa28aa055876bb37
7
+ data.tar.gz: 24f04bf128f70fe949f8bc27f59e3ac39cb172771dab6365205c0716cc92434e5e4d6d62f46b0c25368031db28d11944f9c065377ef1e92c6af11cf90e84e9c2
@@ -10,7 +10,7 @@ I: `files_to_exclude` option. You are currently excluding the following files:
10
10
  I: {files_to_exclude}
11
11
  I:
12
12
  I: Also double check that your current value for `nodes_to_index` can actually
13
- I: match something in the page. You are current indexing the following nodes:
13
+ I: match something in the pages. You are current indexing the following nodes:
14
14
  I: {nodes_to_index}
15
15
  I:
16
16
  I: Note that all the markup that is defined in the layouts won't be available
@@ -17,8 +17,6 @@ module Jekyll
17
17
  require 'jekyll/algolia/extractor'
18
18
  require 'jekyll/algolia/indexer'
19
19
 
20
- @config = {}
21
-
22
20
  # Public: Init the Algolia module
23
21
  #
24
22
  # config - A hash of Jekyll config option (merge of _config.yml options and
@@ -27,9 +25,9 @@ module Jekyll
27
25
  # The gist of the plugin works by instanciating a Jekyll site,
28
26
  # monkey-patching its `write` method and building it.
29
27
  def self.init(config = {})
30
- @config = config
31
28
  @start_time = Time.now
32
- @site = Jekyll::Algolia::Site.new(@config)
29
+ config = Configurator.init(config).config
30
+ @site = Jekyll::Algolia::Site.new(config)
33
31
 
34
32
  exit 1 unless Configurator.assert_valid_credentials
35
33
 
@@ -57,14 +55,6 @@ module Jekyll
57
55
  @site.process
58
56
  end
59
57
 
60
- # Public: Get access to the Jekyll config
61
- #
62
- # All other classes will need access to this config, so we make it publicly
63
- # accessible
64
- def self.config
65
- @config
66
- end
67
-
68
58
  # Public: Get access to the Jekyll site
69
59
  #
70
60
  # Tests will need access to the inner Jekyll website so we expose it here
@@ -6,6 +6,8 @@ module Jekyll
6
6
  module Configurator
7
7
  include Jekyll::Algolia
8
8
 
9
+ @config = {}
10
+
9
11
  # Algolia default values
10
12
  ALGOLIA_DEFAULTS = {
11
13
  'extensions_to_index' => nil,
@@ -56,13 +58,37 @@ module Jekyll
56
58
  }
57
59
  }.freeze
58
60
 
61
+ # Public: Init the configurator with the Jekyll config
62
+ #
63
+ # config - The config passed by the `jekyll algolia` command. Default to
64
+ # the default Jekyll config
65
+ def self.init(config = nil)
66
+ # Use the default Jekyll configuration if none specified. Silence the
67
+ # warning about no config set
68
+ Logger.silent { config = Jekyll.configuration } if config.nil?
69
+
70
+ @config = config
71
+ @config['exclude'] = files_excluded_from_render
72
+
73
+ @config = disable_other_plugins(@config)
74
+
75
+ self
76
+ end
77
+
78
+ # Public: Access to the global configuration object
79
+ #
80
+ # This is a method around @config so we can mock it in the tests
81
+ def self.config
82
+ @config
83
+ end
84
+
59
85
  # Public: Get the value of a specific Jekyll configuration option
60
86
  #
61
87
  # key - Key to read
62
88
  #
63
89
  # Returns the value of this configuration option, nil otherwise
64
90
  def self.get(key)
65
- Jekyll::Algolia.config[key]
91
+ config[key]
66
92
  end
67
93
 
68
94
  # Public: Get the value of a specific Algolia configuration option, or
@@ -149,7 +175,8 @@ module Jekyll
149
175
  # Markdown files can have many different extensions. We keep the one
150
176
  # defined in the Jekyll config
151
177
  def self.default_extensions_to_index
152
- ['html'] + get('markdown_ext').split(',')
178
+ markdown_ext = get('markdown_ext') || ''
179
+ ['html'] + markdown_ext.split(',')
153
180
  end
154
181
 
155
182
  # Public: Setting a default value to ignore index.html/index.md files in
@@ -185,6 +212,37 @@ module Jekyll
185
212
  false
186
213
  end
187
214
 
215
+ # Public: List of files to exclude from the Jekyll build
216
+ #
217
+ # We skip all files usually ignored by Jekyll, plus any file that should
218
+ # not be indexed.
219
+ def self.files_excluded_from_render
220
+ site_exclude = get('exclude') || []
221
+ algolia_exclude = algolia('files_to_exclude') || []
222
+
223
+ excluded_files = site_exclude + algolia_exclude
224
+
225
+ # 404 pages are not Jekyll defaults but a convention adopted by GitHub
226
+ # pages. We don't want to index those.
227
+ # https://help.github.com/articles/creating-a-custom-404-page-for-your-github-pages-site/
228
+ excluded_files << '404.html'
229
+ excluded_files << '404.md'
230
+
231
+ excluded_files
232
+ end
233
+
234
+ # Public: Disable features from other Jekyll plugins that might interfere
235
+ # with the indexing
236
+ def self.disable_other_plugins(config)
237
+ # Disable pagination from jekyll-paginate
238
+ # It creates a lot of /page2/index.html files that are not relevant to
239
+ # indexing
240
+ # https://github.com/jekyll/jekyll-paginate/blob/master/lib/jekyll-paginate/pager.rb#L23
241
+ config['paginate'] = nil
242
+
243
+ config
244
+ end
245
+
188
246
  # Public: Check for any deprecated config option and warn the user
189
247
  def self.warn_of_deprecated_options
190
248
  # indexing_mode is no longer used
@@ -34,7 +34,7 @@ module Jekyll
34
34
  pathname = Pathname.new(file.path)
35
35
  return pathname.cleanpath.to_s if pathname.absolute?
36
36
 
37
- File.join(Configurator.get('source'), file.path)
37
+ File.expand_path(File.join(Configurator.get('source'), file.path))
38
38
  end
39
39
 
40
40
  # Public: Return the path of a Jekyll file relative to the Jekyll source
@@ -48,45 +48,12 @@ module Jekyll
48
48
  pathname = Pathname.new(file.path)
49
49
  return file.path if pathname.relative?
50
50
 
51
- jekyll_source = Pathname.new(Configurator.get('source'))
51
+ jekyll_source = Pathname.new(
52
+ File.expand_path(Configurator.get('source'))
53
+ )
52
54
  pathname.relative_path_from(jekyll_source).cleanpath.to_s
53
55
  end
54
56
 
55
- # Public: Check if the file is a 404 error page
56
- #
57
- # file - The Jekyll file
58
- #
59
- # 404 pages are not Jekyll defaults but a convention adopted by GitHub
60
- # pages. We don't want to index those.
61
- # Source: https://help.github.com/articles/creating-a-custom-404-page-for-your-github-pages-site/
62
- #
63
- # rubocop:disable Naming/PredicateName
64
- def self.is_404?(file)
65
- File.basename(file.path, File.extname(file.path)) == '404'
66
- end
67
- # rubocop:enable Naming/PredicateName
68
-
69
- # Public: Check if the page is a pagination page
70
- #
71
- # file - The Jekyll file
72
- #
73
- # `jekyll-paginate` automatically creates pages to paginate through posts.
74
- # We don't want to index those
75
- def self.pagination_page?(file)
76
- # paginate_path contains a special `:num` part that is the page number
77
- # We convert that to a regexp
78
- paginate_path = Configurator.get('paginate_path')
79
- paginate_path_as_regexp = paginate_path.gsub(':num', '([0-9]*)')
80
-
81
- regexp = %r{#{paginate_path_as_regexp}/index\.html$}
82
-
83
- # Make sure all file paths start with a / for comparison
84
- filepath = file.path
85
- filepath = "/#{filepath}" unless filepath[0] == '/'
86
-
87
- Utils.match?(filepath, regexp)
88
- end
89
-
90
57
  # Public: Check if the file has one of the allowed extensions
91
58
  #
92
59
  # file - The Jekyll file
@@ -101,16 +68,6 @@ module Jekyll
101
68
  extensions.include?(extname)
102
69
  end
103
70
 
104
- # Public: Check if the file has been excluded by the user
105
- #
106
- # file - The Jekyll file
107
- #
108
- # Files can be excluded either by setting the `files_to_exclude` option,
109
- # or by defining a custom hook
110
- def self.excluded_by_user?(file)
111
- excluded_from_config?(file) || excluded_from_hook?(file)
112
- end
113
-
114
71
  # Public: Check if the file has been excluded by `files_to_exclude`
115
72
  #
116
73
  # file - The Jekyll file
@@ -147,10 +104,8 @@ module Jekyll
147
104
  # all the static assets, only keep the actual content.
148
105
  def self.indexable?(file)
149
106
  return false if static_file?(file)
150
- return false if is_404?(file)
151
- return false if pagination_page?(file)
152
107
  return false unless allowed_extension?(file)
153
- return false if excluded_by_user?(file)
108
+ return false if excluded_from_hook?(file)
154
109
 
155
110
  true
156
111
  end
@@ -196,17 +151,10 @@ module Jekyll
196
151
  data.each_key do |key|
197
152
  data.delete(key) if respond_to?(key)
198
153
  end
199
-
200
- # Excerpt needs a special handling
201
154
  data.delete('excerpt')
202
155
 
203
- # jekyll-asciidoc adds a document key to each page. Once converted to
204
- # a string representation, it contains a random number, causing the
205
- # object hash to change on each run. This causes the diff method to
206
- # fail, so we discard this key.
207
- if Utils.instance_of?(data['document'], 'Asciidoctor::Document')
208
- data.delete('document')
209
- end
156
+ # Convert all values to a version that can be serialized to JSON
157
+ data = Utils.jsonify(data)
210
158
 
211
159
  # Convert all keys to symbols
212
160
  data = Utils.keys_to_symbols(data)
@@ -88,6 +88,39 @@ module Jekyll
88
88
  item[key] == value
89
89
  end
90
90
  end
91
+
92
+ # Public: Convert an object into an object that can easily be converted to
93
+ # JSON, to be stored as a record
94
+ #
95
+ # item - The object to convert
96
+ #
97
+ # It will keep any string, number, boolean,boolean,array or nested object,
98
+ # but will try to stringify other objects, excluding the one that contain
99
+ # a unique identifier once serialized.
100
+ def self.jsonify(item)
101
+ simple_types = [
102
+ NilClass,
103
+ TrueClass, FalseClass,
104
+ Integer, Float,
105
+ String
106
+ ]
107
+ return item if simple_types.member?(item.class)
108
+
109
+ # Recursive types
110
+ return item.map { |value| jsonify(value) } if item.is_a?(Array)
111
+ if item.is_a?(Hash)
112
+ return item.map { |key, value| [key, jsonify(value)] }.to_h
113
+ end
114
+
115
+ # Can't be stringified, discard it
116
+ return nil unless item.respond_to?(:to_s)
117
+
118
+ # Discard also if is a serialized version with unique identifier
119
+ stringified = item.to_s
120
+ return nil if match?(stringified, /#<[^ ].*@[0-9]* .*>/)
121
+
122
+ stringified
123
+ end
91
124
  end
92
125
  end
93
126
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Jekyll
4
4
  module Algolia
5
- VERSION = '1.1.2'
5
+ VERSION = '1.1.3'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-algolia
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Carry
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-15 00:00:00.000000000 Z
11
+ date: 2018-02-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: algolia_html_extractor
@@ -150,6 +150,20 @@ dependencies:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
152
  version: '4.3'
153
+ - !ruby/object:Gem::Dependency
154
+ name: guard
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '2.14'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '2.14'
153
167
  - !ruby/object:Gem::Dependency
154
168
  name: guard-rspec
155
169
  requirement: !ruby/object:Gem::Requirement