minimaJake 1.0.4
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 +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +41 -0
- data/_includes/custom/anchor_headings.html +164 -0
- data/_includes/custom/contents.html +180 -0
- data/_includes/custom/donatebutton.html +1 -0
- data/_includes/custom/donatefloating.html +9 -0
- data/_includes/custom/paginator.html +145 -0
- data/_includes/custom/read_time.html +5 -0
- data/_includes/custom/search.html +57 -0
- data/_includes/custom/tags.html +6 -0
- data/_includes/footer.html +26 -0
- data/_includes/google-analytics.html +9 -0
- data/_includes/head.html +14 -0
- data/_includes/header.html +39 -0
- data/_includes/social/icons/code.svg +1 -0
- data/_includes/social/icons/devto.svg +1 -0
- data/_includes/social/icons/dribbble.svg +1 -0
- data/_includes/social/icons/email.svg +1 -0
- data/_includes/social/icons/facebook.svg +1 -0
- data/_includes/social/icons/flickr.svg +1 -0
- data/_includes/social/icons/github.svg +1 -0
- data/_includes/social/icons/gitlab.svg +1 -0
- data/_includes/social/icons/google_scholar.svg +1 -0
- data/_includes/social/icons/instagram.svg +1 -0
- data/_includes/social/icons/keybase.svg +4 -0
- data/_includes/social/icons/linkedin.svg +1 -0
- data/_includes/social/icons/mastodon.svg +1 -0
- data/_includes/social/icons/microdotblog.svg +1 -0
- data/_includes/social/icons/pinterest.svg +1 -0
- data/_includes/social/icons/rss.svg +1 -0
- data/_includes/social/icons/stackoverflow.svg +1 -0
- data/_includes/social/icons/substack.svg +1 -0
- data/_includes/social/icons/telegram.svg +1 -0
- data/_includes/social/icons/twitter.svg +1 -0
- data/_includes/social/icons/youtube.svg +1 -0
- data/_includes/social/meta-item.html +8 -0
- data/_includes/social/meta.html +7 -0
- data/_includes/social/social-item.html +7 -0
- data/_includes/social/social.html +7 -0
- data/_includes/social/svg_symbol.html +3 -0
- data/_layouts/default.html +20 -0
- data/_layouts/home.html +59 -0
- data/_layouts/page.html +16 -0
- data/_layouts/post.html +63 -0
- data/_sass/minima/_base.scss +281 -0
- data/_sass/minima/_layout.scss +341 -0
- data/_sass/minima/custom-styles.scss +2 -0
- data/_sass/minima/custom-variables.scss +1 -0
- data/_sass/minima/initialize.scss +50 -0
- data/_sass/minima/skins/auto.scss +361 -0
- data/_sass/minima/skins/classic.scss +5 -0
- data/_sass/minima/skins/dark.scss +5 -0
- data/_sass/minima/skins/solarized-dark.scss +5 -0
- data/_sass/minima/skins/solarized-light.scss +4 -0
- data/_sass/minima/skins/solarized.scss +201 -0
- data/assets/css/style.scss +194 -0
- data/assets/js/posts.json +15 -0
- data/assets/js/search.js +438 -0
- data/assets/minima-social-icons.liquid +15 -0
- metadata +165 -0
@@ -0,0 +1,194 @@
|
|
1
|
+
---
|
2
|
+
# Only the main Sass file needs front matter (the dashes are enough)
|
3
|
+
---
|
4
|
+
|
5
|
+
@import
|
6
|
+
"minima/skins/{{ site.minima.skin | default: 'classic' }}",
|
7
|
+
"minima/initialize";
|
8
|
+
|
9
|
+
/* Misc tidying of overall layout */
|
10
|
+
.content {
|
11
|
+
padding: 15px;
|
12
|
+
}
|
13
|
+
|
14
|
+
.site-header {
|
15
|
+
border-top: 0px;
|
16
|
+
}
|
17
|
+
|
18
|
+
.card {
|
19
|
+
border: 1px solid {{ site.accent_colour }};
|
20
|
+
border-radius: .25rem;
|
21
|
+
}
|
22
|
+
|
23
|
+
.bg-img {
|
24
|
+
background-size: cover;
|
25
|
+
min-height: 180px;
|
26
|
+
background-position: center;
|
27
|
+
background-color: #fff;
|
28
|
+
}
|
29
|
+
|
30
|
+
.post-title {
|
31
|
+
line-height: 1.3;
|
32
|
+
}
|
33
|
+
|
34
|
+
.post-header .bg-img {
|
35
|
+
background-size: cover;
|
36
|
+
min-height: 180px;
|
37
|
+
background-position: center;
|
38
|
+
background-color: #fff;
|
39
|
+
border: 1px solid {{ site.accent_colour }};
|
40
|
+
border-radius: .25rem;
|
41
|
+
}
|
42
|
+
|
43
|
+
.centred-content {
|
44
|
+
margin: auto;
|
45
|
+
text-align: center;
|
46
|
+
}
|
47
|
+
|
48
|
+
/* Makes the meta info pretty */
|
49
|
+
.contact-list li+li {
|
50
|
+
padding-top: 5px;
|
51
|
+
}
|
52
|
+
|
53
|
+
.contact-list .svg-icon {
|
54
|
+
padding-right: 5px;
|
55
|
+
}
|
56
|
+
|
57
|
+
.contact-list a:hover {
|
58
|
+
text-decoration: none;
|
59
|
+
}
|
60
|
+
|
61
|
+
.contact-list a:hover .username {
|
62
|
+
text-decoration: underline;
|
63
|
+
}
|
64
|
+
|
65
|
+
.svg-icon {
|
66
|
+
fill: #828282;
|
67
|
+
}
|
68
|
+
|
69
|
+
a:hover .svg-icon {
|
70
|
+
fill: {{ site.accent_colour }};
|
71
|
+
}
|
72
|
+
|
73
|
+
/* Fixes the in-post indent applying to homepage */
|
74
|
+
.homepage-title {
|
75
|
+
margin-left: 0px;
|
76
|
+
padding-left: 0px;
|
77
|
+
}
|
78
|
+
|
79
|
+
/* Fixes weird table word break behaviour */
|
80
|
+
table {
|
81
|
+
table-layout: fixed;
|
82
|
+
word-break: break-word;
|
83
|
+
}
|
84
|
+
|
85
|
+
/* Fixes "tag" styling */
|
86
|
+
.tag,
|
87
|
+
.tag:visited {
|
88
|
+
color: #828282;
|
89
|
+
}
|
90
|
+
|
91
|
+
/* Fixes icon / username alignment in footer */
|
92
|
+
.username,
|
93
|
+
.svg-icon {
|
94
|
+
vertical-align: middle;
|
95
|
+
}
|
96
|
+
|
97
|
+
/* Styles the pagination & link to other blog */
|
98
|
+
.centred-homepage-content {
|
99
|
+
width: 100%;
|
100
|
+
text-align: center;
|
101
|
+
}
|
102
|
+
|
103
|
+
.highlight {
|
104
|
+
background: {{ site.accent_colour }};
|
105
|
+
}
|
106
|
+
|
107
|
+
/* Adds extra padding to top right links */
|
108
|
+
.page-link {
|
109
|
+
padding: 5px;
|
110
|
+
}
|
111
|
+
|
112
|
+
/* Adds GitHub style links to headers on mouseover */
|
113
|
+
.post-content h2 {
|
114
|
+
text-indent: -10px;
|
115
|
+
overflow-wrap: break-word;
|
116
|
+
}
|
117
|
+
|
118
|
+
.post-content h3 {
|
119
|
+
text-indent: -8px;
|
120
|
+
overflow-wrap: break-word;
|
121
|
+
}
|
122
|
+
|
123
|
+
.post-content h4 {
|
124
|
+
text-indent: -6px;
|
125
|
+
overflow-wrap: break-word;
|
126
|
+
}
|
127
|
+
|
128
|
+
.post-content h5 {
|
129
|
+
text-indent: -4px;
|
130
|
+
overflow-wrap: break-word;
|
131
|
+
}
|
132
|
+
|
133
|
+
.post-content h6 {
|
134
|
+
text-indent: -2px;
|
135
|
+
overflow-wrap: break-word;
|
136
|
+
}
|
137
|
+
|
138
|
+
h1 .octicon, h2 .octicon, h3 .octicon, h4 .octicon, h5 .octicon, h6 .octicon {
|
139
|
+
visibility: hidden;
|
140
|
+
}
|
141
|
+
|
142
|
+
h1:hover .octicon, h2:hover .octicon, h3:hover .octicon, h4:hover .octicon, h5:hover .octicon, h6:hover .octicon {
|
143
|
+
visibility: visible;
|
144
|
+
}
|
145
|
+
|
146
|
+
.octicon {
|
147
|
+
fill: currentColor;
|
148
|
+
padding: 0;
|
149
|
+
margin-left: -16px;
|
150
|
+
vertical-align: middle;
|
151
|
+
}
|
152
|
+
|
153
|
+
/* Table of contents */
|
154
|
+
.toc {
|
155
|
+
float: right;
|
156
|
+
border: 1px solid {{ site.accent_colour }};
|
157
|
+
border-radius: 0.25rem;
|
158
|
+
padding-top: 15px;
|
159
|
+
padding-right: 15px;
|
160
|
+
margin-left: 15px;
|
161
|
+
}
|
162
|
+
|
163
|
+
.toc b {
|
164
|
+
margin-left: 20px;
|
165
|
+
}
|
166
|
+
|
167
|
+
.toc ul {
|
168
|
+
list-style: none;
|
169
|
+
margin-left: 10px;
|
170
|
+
}
|
171
|
+
|
172
|
+
.toc li {
|
173
|
+
margin-left: 10px;
|
174
|
+
}
|
175
|
+
|
176
|
+
/* Search page */
|
177
|
+
#search-input {
|
178
|
+
font-size: 30px;
|
179
|
+
display: block;
|
180
|
+
width: 400px
|
181
|
+
}
|
182
|
+
|
183
|
+
/* Site picker */
|
184
|
+
.site-picker {
|
185
|
+
line-height: 26px;
|
186
|
+
border-bottom: 5px solid {{ site.accent_colour }};
|
187
|
+
text-align: center;
|
188
|
+
}
|
189
|
+
|
190
|
+
.site-tile {
|
191
|
+
padding: 2px 10px 3px 10px;
|
192
|
+
color: #ffffff !important;
|
193
|
+
white-space: nowrap;
|
194
|
+
}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
layout: none
|
3
|
+
---
|
4
|
+
[
|
5
|
+
{% for post in site.posts %}
|
6
|
+
{
|
7
|
+
"tags" : "{{ post.tags | join: ', ' }}",
|
8
|
+
"title" : {{ post.title | jsonify | strip_html }},
|
9
|
+
"excerpt" : {{ post.excerpt | jsonify | strip_html }},
|
10
|
+
"url" : "{{ post.url }}",
|
11
|
+
"date" : "{{ post.date | date: "%b %-d, %Y" }}",
|
12
|
+
"content" : {{ post.content | jsonify | strip_html }}
|
13
|
+
} {% unless forloop.last %},{% endunless %}
|
14
|
+
{% endfor %}
|
15
|
+
]
|
data/assets/js/search.js
ADDED
@@ -0,0 +1,438 @@
|
|
1
|
+
/*!
|
2
|
+
* Simple-Jekyll-Search
|
3
|
+
* Copyright 2015-2020, Christian Fei
|
4
|
+
* Licensed under the MIT License.
|
5
|
+
*/
|
6
|
+
|
7
|
+
(function(){
|
8
|
+
'use strict'
|
9
|
+
|
10
|
+
var _$Templater_7 = {
|
11
|
+
compile: compile,
|
12
|
+
setOptions: setOptions
|
13
|
+
}
|
14
|
+
|
15
|
+
const options = {}
|
16
|
+
options.pattern = /\{(.*?)\}/g
|
17
|
+
options.template = ''
|
18
|
+
options.middleware = function () {}
|
19
|
+
|
20
|
+
function setOptions (_options) {
|
21
|
+
options.pattern = _options.pattern || options.pattern
|
22
|
+
options.template = _options.template || options.template
|
23
|
+
if (typeof _options.middleware === 'function') {
|
24
|
+
options.middleware = _options.middleware
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
function compile (data) {
|
29
|
+
return options.template.replace(options.pattern, function (match, prop) {
|
30
|
+
const value = options.middleware(prop, data[prop], options.template)
|
31
|
+
if (typeof value !== 'undefined') {
|
32
|
+
return value
|
33
|
+
}
|
34
|
+
return data[prop] || match
|
35
|
+
})
|
36
|
+
}
|
37
|
+
|
38
|
+
'use strict';
|
39
|
+
|
40
|
+
function fuzzysearch (needle, haystack) {
|
41
|
+
var tlen = haystack.length;
|
42
|
+
var qlen = needle.length;
|
43
|
+
if (qlen > tlen) {
|
44
|
+
return false;
|
45
|
+
}
|
46
|
+
if (qlen === tlen) {
|
47
|
+
return needle === haystack;
|
48
|
+
}
|
49
|
+
outer: for (var i = 0, j = 0; i < qlen; i++) {
|
50
|
+
var nch = needle.charCodeAt(i);
|
51
|
+
while (j < tlen) {
|
52
|
+
if (haystack.charCodeAt(j++) === nch) {
|
53
|
+
continue outer;
|
54
|
+
}
|
55
|
+
}
|
56
|
+
return false;
|
57
|
+
}
|
58
|
+
return true;
|
59
|
+
}
|
60
|
+
|
61
|
+
var _$fuzzysearch_1 = fuzzysearch;
|
62
|
+
|
63
|
+
'use strict'
|
64
|
+
|
65
|
+
/* removed: const _$fuzzysearch_1 = require('fuzzysearch') */;
|
66
|
+
|
67
|
+
var _$FuzzySearchStrategy_5 = new FuzzySearchStrategy()
|
68
|
+
|
69
|
+
function FuzzySearchStrategy () {
|
70
|
+
this.matches = function (string, crit) {
|
71
|
+
return _$fuzzysearch_1(crit.toLowerCase(), string.toLowerCase())
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
'use strict'
|
76
|
+
|
77
|
+
var _$LiteralSearchStrategy_6 = new LiteralSearchStrategy()
|
78
|
+
|
79
|
+
function LiteralSearchStrategy () {
|
80
|
+
this.matches = function (str, crit) {
|
81
|
+
if (!str) return false
|
82
|
+
|
83
|
+
str = str.trim().toLowerCase()
|
84
|
+
crit = crit.trim().toLowerCase()
|
85
|
+
|
86
|
+
return crit.split(' ').filter(function (word) {
|
87
|
+
return str.indexOf(word) >= 0
|
88
|
+
}).length === crit.split(' ').length
|
89
|
+
}
|
90
|
+
}
|
91
|
+
|
92
|
+
'use strict'
|
93
|
+
|
94
|
+
var _$Repository_4 = {
|
95
|
+
put: put,
|
96
|
+
clear: clear,
|
97
|
+
search: search,
|
98
|
+
setOptions: __setOptions_4
|
99
|
+
}
|
100
|
+
|
101
|
+
/* removed: const _$FuzzySearchStrategy_5 = require('./SearchStrategies/FuzzySearchStrategy') */;
|
102
|
+
/* removed: const _$LiteralSearchStrategy_6 = require('./SearchStrategies/LiteralSearchStrategy') */;
|
103
|
+
|
104
|
+
function NoSort () {
|
105
|
+
return 0
|
106
|
+
}
|
107
|
+
|
108
|
+
const data = []
|
109
|
+
let opt = {}
|
110
|
+
|
111
|
+
opt.fuzzy = false
|
112
|
+
opt.limit = 10
|
113
|
+
opt.searchStrategy = opt.fuzzy ? _$FuzzySearchStrategy_5 : _$LiteralSearchStrategy_6
|
114
|
+
opt.sort = NoSort
|
115
|
+
opt.exclude = []
|
116
|
+
|
117
|
+
function put (data) {
|
118
|
+
if (isObject(data)) {
|
119
|
+
return addObject(data)
|
120
|
+
}
|
121
|
+
if (isArray(data)) {
|
122
|
+
return addArray(data)
|
123
|
+
}
|
124
|
+
return undefined
|
125
|
+
}
|
126
|
+
function clear () {
|
127
|
+
data.length = 0
|
128
|
+
return data
|
129
|
+
}
|
130
|
+
|
131
|
+
function isObject (obj) {
|
132
|
+
return Boolean(obj) && Object.prototype.toString.call(obj) === '[object Object]'
|
133
|
+
}
|
134
|
+
|
135
|
+
function isArray (obj) {
|
136
|
+
return Boolean(obj) && Object.prototype.toString.call(obj) === '[object Array]'
|
137
|
+
}
|
138
|
+
|
139
|
+
function addObject (_data) {
|
140
|
+
data.push(_data)
|
141
|
+
return data
|
142
|
+
}
|
143
|
+
|
144
|
+
function addArray (_data) {
|
145
|
+
const added = []
|
146
|
+
clear()
|
147
|
+
for (let i = 0, len = _data.length; i < len; i++) {
|
148
|
+
if (isObject(_data[i])) {
|
149
|
+
added.push(addObject(_data[i]))
|
150
|
+
}
|
151
|
+
}
|
152
|
+
return added
|
153
|
+
}
|
154
|
+
|
155
|
+
function search (crit) {
|
156
|
+
if (!crit) {
|
157
|
+
return []
|
158
|
+
}
|
159
|
+
return findMatches(data, crit, opt.searchStrategy, opt).sort(opt.sort)
|
160
|
+
}
|
161
|
+
|
162
|
+
function __setOptions_4 (_opt) {
|
163
|
+
opt = _opt || {}
|
164
|
+
|
165
|
+
opt.fuzzy = _opt.fuzzy || false
|
166
|
+
opt.limit = _opt.limit || 10
|
167
|
+
opt.searchStrategy = _opt.fuzzy ? _$FuzzySearchStrategy_5 : _$LiteralSearchStrategy_6
|
168
|
+
opt.sort = _opt.sort || NoSort
|
169
|
+
opt.exclude = _opt.exclude || []
|
170
|
+
}
|
171
|
+
|
172
|
+
function findMatches (data, crit, strategy, opt) {
|
173
|
+
const matches = []
|
174
|
+
for (let i = 0; i < data.length && matches.length < opt.limit; i++) {
|
175
|
+
const match = findMatchesInObject(data[i], crit, strategy, opt)
|
176
|
+
if (match) {
|
177
|
+
matches.push(match)
|
178
|
+
}
|
179
|
+
}
|
180
|
+
return matches
|
181
|
+
}
|
182
|
+
|
183
|
+
function findMatchesInObject (obj, crit, strategy, opt) {
|
184
|
+
for (const key in obj) {
|
185
|
+
if (!isExcluded(obj[key], opt.exclude) && strategy.matches(obj[key], crit)) {
|
186
|
+
obj.matchedField = key
|
187
|
+
return obj
|
188
|
+
}
|
189
|
+
}
|
190
|
+
}
|
191
|
+
|
192
|
+
function isExcluded (term, excludedTerms) {
|
193
|
+
for (let i = 0, len = excludedTerms.length; i < len; i++) {
|
194
|
+
const excludedTerm = excludedTerms[i]
|
195
|
+
if (new RegExp(excludedTerm).test(term)) {
|
196
|
+
return true
|
197
|
+
}
|
198
|
+
}
|
199
|
+
return false
|
200
|
+
}
|
201
|
+
|
202
|
+
/* globals ActiveXObject:false */
|
203
|
+
|
204
|
+
'use strict'
|
205
|
+
|
206
|
+
var _$JSONLoader_2 = {
|
207
|
+
load: load
|
208
|
+
}
|
209
|
+
|
210
|
+
function load (location, callback) {
|
211
|
+
const xhr = getXHR()
|
212
|
+
xhr.open('GET', location, true)
|
213
|
+
xhr.onreadystatechange = createStateChangeListener(xhr, callback)
|
214
|
+
xhr.send()
|
215
|
+
}
|
216
|
+
|
217
|
+
function createStateChangeListener (xhr, callback) {
|
218
|
+
return function () {
|
219
|
+
if (xhr.readyState === 4 && xhr.status === 200) {
|
220
|
+
try {
|
221
|
+
callback(null, JSON.parse(xhr.responseText))
|
222
|
+
} catch (err) {
|
223
|
+
callback(err, null)
|
224
|
+
}
|
225
|
+
}
|
226
|
+
}
|
227
|
+
}
|
228
|
+
|
229
|
+
function getXHR () {
|
230
|
+
return window.XMLHttpRequest ? new window.XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP')
|
231
|
+
}
|
232
|
+
|
233
|
+
'use strict'
|
234
|
+
|
235
|
+
var _$OptionsValidator_3 = function OptionsValidator (params) {
|
236
|
+
if (!validateParams(params)) {
|
237
|
+
throw new Error('-- OptionsValidator: required options missing')
|
238
|
+
}
|
239
|
+
|
240
|
+
if (!(this instanceof OptionsValidator)) {
|
241
|
+
return new OptionsValidator(params)
|
242
|
+
}
|
243
|
+
|
244
|
+
const requiredOptions = params.required
|
245
|
+
|
246
|
+
this.getRequiredOptions = function () {
|
247
|
+
return requiredOptions
|
248
|
+
}
|
249
|
+
|
250
|
+
this.validate = function (parameters) {
|
251
|
+
const errors = []
|
252
|
+
requiredOptions.forEach(function (requiredOptionName) {
|
253
|
+
if (typeof parameters[requiredOptionName] === 'undefined') {
|
254
|
+
errors.push(requiredOptionName)
|
255
|
+
}
|
256
|
+
})
|
257
|
+
return errors
|
258
|
+
}
|
259
|
+
|
260
|
+
function validateParams (params) {
|
261
|
+
if (!params) {
|
262
|
+
return false
|
263
|
+
}
|
264
|
+
return typeof params.required !== 'undefined' && params.required instanceof Array
|
265
|
+
}
|
266
|
+
}
|
267
|
+
|
268
|
+
'use strict'
|
269
|
+
|
270
|
+
var _$utils_9 = {
|
271
|
+
merge: merge,
|
272
|
+
isJSON: isJSON
|
273
|
+
}
|
274
|
+
|
275
|
+
function merge (defaultParams, mergeParams) {
|
276
|
+
const mergedOptions = {}
|
277
|
+
for (const option in defaultParams) {
|
278
|
+
mergedOptions[option] = defaultParams[option]
|
279
|
+
if (typeof mergeParams[option] !== 'undefined') {
|
280
|
+
mergedOptions[option] = mergeParams[option]
|
281
|
+
}
|
282
|
+
}
|
283
|
+
return mergedOptions
|
284
|
+
}
|
285
|
+
|
286
|
+
function isJSON (json) {
|
287
|
+
try {
|
288
|
+
if (json instanceof Object && JSON.parse(JSON.stringify(json))) {
|
289
|
+
return true
|
290
|
+
}
|
291
|
+
return false
|
292
|
+
} catch (err) {
|
293
|
+
return false
|
294
|
+
}
|
295
|
+
}
|
296
|
+
|
297
|
+
var _$src_8 = {};
|
298
|
+
(function (window) {
|
299
|
+
'use strict'
|
300
|
+
|
301
|
+
let options = {
|
302
|
+
searchInput: null,
|
303
|
+
resultsContainer: null,
|
304
|
+
json: [],
|
305
|
+
success: Function.prototype,
|
306
|
+
searchFinished: Function.prototype,
|
307
|
+
searchResultTemplate: '<li><a href="{url}" title="{desc}">{title}</a></li>',
|
308
|
+
templateMiddleware: Function.prototype,
|
309
|
+
sortMiddleware: function () {
|
310
|
+
return 0
|
311
|
+
},
|
312
|
+
noResultsText: 'No results found :(',
|
313
|
+
resultsText: '{#} result(s) found',
|
314
|
+
limit: 10,
|
315
|
+
fuzzy: false,
|
316
|
+
debounceTime: null,
|
317
|
+
exclude: []
|
318
|
+
}
|
319
|
+
|
320
|
+
let debounceTimerHandle
|
321
|
+
const debounce = function (func, delayMillis) {
|
322
|
+
if (delayMillis) {
|
323
|
+
clearTimeout(debounceTimerHandle)
|
324
|
+
debounceTimerHandle = setTimeout(func, delayMillis)
|
325
|
+
} else {
|
326
|
+
func.call()
|
327
|
+
}
|
328
|
+
}
|
329
|
+
|
330
|
+
const requiredOptions = ['searchInput', 'resultsContainer', 'json']
|
331
|
+
|
332
|
+
/* removed: const _$Templater_7 = require('./Templater') */;
|
333
|
+
/* removed: const _$Repository_4 = require('./Repository') */;
|
334
|
+
/* removed: const _$JSONLoader_2 = require('./JSONLoader') */;
|
335
|
+
const optionsValidator = _$OptionsValidator_3({
|
336
|
+
required: requiredOptions
|
337
|
+
})
|
338
|
+
/* removed: const _$utils_9 = require('./utils') */;
|
339
|
+
|
340
|
+
window.SimpleJekyllSearch = function (_options) {
|
341
|
+
const errors = optionsValidator.validate(_options)
|
342
|
+
if (errors.length > 0) {
|
343
|
+
throwError('You must specify the following required options: ' + requiredOptions)
|
344
|
+
}
|
345
|
+
|
346
|
+
options = _$utils_9.merge(options, _options)
|
347
|
+
|
348
|
+
_$Templater_7.setOptions({
|
349
|
+
template: options.searchResultTemplate,
|
350
|
+
middleware: options.templateMiddleware
|
351
|
+
})
|
352
|
+
|
353
|
+
_$Repository_4.setOptions({
|
354
|
+
fuzzy: options.fuzzy,
|
355
|
+
limit: options.limit,
|
356
|
+
sort: options.sortMiddleware,
|
357
|
+
exclude: options.exclude
|
358
|
+
})
|
359
|
+
|
360
|
+
if (_$utils_9.isJSON(options.json)) {
|
361
|
+
initWithJSON(options.json)
|
362
|
+
} else {
|
363
|
+
initWithURL(options.json)
|
364
|
+
}
|
365
|
+
|
366
|
+
const rv = {
|
367
|
+
search: search
|
368
|
+
}
|
369
|
+
|
370
|
+
typeof options.success === 'function' && options.success.call(rv)
|
371
|
+
return rv
|
372
|
+
}
|
373
|
+
|
374
|
+
function initWithJSON (json) {
|
375
|
+
_$Repository_4.put(json)
|
376
|
+
registerInput()
|
377
|
+
}
|
378
|
+
|
379
|
+
function initWithURL (url) {
|
380
|
+
_$JSONLoader_2.load(url, function (err, json) {
|
381
|
+
if (err) {
|
382
|
+
throwError('failed to get JSON (' + url + ')')
|
383
|
+
}
|
384
|
+
initWithJSON(json)
|
385
|
+
})
|
386
|
+
}
|
387
|
+
|
388
|
+
function emptyResultsContainer () {
|
389
|
+
options.resultsContainer.innerHTML = ''
|
390
|
+
}
|
391
|
+
|
392
|
+
function appendToResultsContainer (text) {
|
393
|
+
options.resultsContainer.innerHTML += text
|
394
|
+
}
|
395
|
+
|
396
|
+
function registerInput () {
|
397
|
+
options.searchInput.addEventListener('input', function (e) {
|
398
|
+
if (isWhitelistedKey(e.which)) {
|
399
|
+
emptyResultsContainer()
|
400
|
+
debounce(function () { search(e.target.value) }, options.debounceTime)
|
401
|
+
}
|
402
|
+
})
|
403
|
+
}
|
404
|
+
|
405
|
+
function search (query) {
|
406
|
+
if (isValidQuery(query)) {
|
407
|
+
emptyResultsContainer()
|
408
|
+
render(_$Repository_4.search(query), query)
|
409
|
+
}
|
410
|
+
}
|
411
|
+
|
412
|
+
function render (results, query) {
|
413
|
+
const len = results.length
|
414
|
+
typeof options.searchFinished === 'function' && options.searchFinished(len)
|
415
|
+
if (len === 0) {
|
416
|
+
return appendToResultsContainer(options.noResultsText)
|
417
|
+
}
|
418
|
+
appendToResultsContainer(options.resultsText.replace("{#}", len))
|
419
|
+
for (let i = 0; i < len; i++) {
|
420
|
+
results[i].query = query
|
421
|
+
appendToResultsContainer(_$Templater_7.compile(results[i]))
|
422
|
+
}
|
423
|
+
}
|
424
|
+
|
425
|
+
function isValidQuery (query) {
|
426
|
+
return query && query.length > 1
|
427
|
+
}
|
428
|
+
|
429
|
+
function isWhitelistedKey (key) {
|
430
|
+
return [13, 16, 20, 37, 38, 39, 40, 91].indexOf(key) === -1
|
431
|
+
}
|
432
|
+
|
433
|
+
function throwError (message) {
|
434
|
+
throw new Error('SimpleJekyllSearch --- ' + message)
|
435
|
+
}
|
436
|
+
})(window)
|
437
|
+
|
438
|
+
}());
|
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
permalink: /assets/minima-social-icons.svg
|
3
|
+
---
|
4
|
+
|
5
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
6
|
+
{% comment %}
|
7
|
+
Iterate through {{ site.minima.social_links }} and render platform related SVG-symbol
|
8
|
+
unless the platform is "rss" because we need the "rss" symbol for the `Subscribe` link
|
9
|
+
in the footer and therefore inject the "rss" icon outside the iteration loop.
|
10
|
+
{% endcomment %}
|
11
|
+
{% for entry in site.minima.social_links %}
|
12
|
+
{%- assign symbol_id = entry.platform -%}
|
13
|
+
{%- include social/svg_symbol.html key = symbol_id -%}
|
14
|
+
{%- endfor -%}
|
15
|
+
</svg>
|