just-the-docs 0.2.9 → 0.3.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/_includes/nav.html +55 -51
- data/_layouts/default.html +133 -103
- data/_sass/code.scss +2 -3
- data/_sass/color_schemes/dark.scss +1 -0
- data/_sass/content.scss +2 -2
- data/_sass/layout.scss +45 -50
- data/_sass/modules.scss +1 -0
- data/_sass/navigation.scss +129 -53
- data/_sass/print.scss +40 -0
- data/_sass/search.scss +202 -48
- data/_sass/support/_variables.scss +8 -3
- data/assets/js/just-the-docs.js +362 -204
- data/assets/js/zzzz-search-data.json +58 -0
- data/lib/tasks/search.rake +54 -9
- metadata +4 -9
- data/assets/js/search-data.json +0 -12
@@ -57,6 +57,7 @@ $sidebar-color: $grey-lt-000 !default;
|
|
57
57
|
$search-background-color: $white !default;
|
58
58
|
$table-background-color: $white !default;
|
59
59
|
$code-background-color: $grey-lt-000 !default;
|
60
|
+
$feedback-color: darken($sidebar-color, 3%) !default;
|
60
61
|
|
61
62
|
$body-text-color: $grey-dk-100 !default;
|
62
63
|
$body-heading-color: $grey-dk-300 !default;
|
@@ -94,8 +95,8 @@ $sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px
|
|
94
95
|
$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px
|
95
96
|
$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px
|
96
97
|
$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px
|
97
|
-
$sp-9: map-get($spacers, sp-9) !default; //
|
98
|
-
$sp-10: map-get($spacers, sp-10) !default; // 4
|
98
|
+
$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px
|
99
|
+
$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px
|
99
100
|
|
100
101
|
//
|
101
102
|
// Borders
|
@@ -113,9 +114,13 @@ $gutter-spacing: $sp-6 !default;
|
|
113
114
|
$gutter-spacing-sm: $sp-4 !default;
|
114
115
|
$nav-width: 264px !default;
|
115
116
|
$nav-width-md: 248px !default;
|
117
|
+
$nav-list-item-height: $sp-6 !default;
|
118
|
+
$nav-list-item-height-sm: $sp-8 !default;
|
119
|
+
$nav-list-expander-right: true;
|
116
120
|
$content-width: 800px !default;
|
117
121
|
$header-height: 60px !default;
|
118
|
-
$search-results-width:
|
122
|
+
$search-results-width: $content-width - $nav-width !default;
|
123
|
+
$transition-duration: 400ms;
|
119
124
|
|
120
125
|
//
|
121
126
|
// Media queries in pixels
|
data/assets/js/just-the-docs.js
CHANGED
@@ -24,24 +24,47 @@ jtd.onReady = function(ready) {
|
|
24
24
|
// Show/hide mobile menu
|
25
25
|
|
26
26
|
function initNav() {
|
27
|
-
|
28
|
-
|
29
|
-
|
27
|
+
jtd.addEvent(document, 'click', function(e){
|
28
|
+
var target = e.target;
|
29
|
+
while (target && !(target.classList && target.classList.contains('nav-list-expander'))) {
|
30
|
+
target = target.parentNode;
|
31
|
+
}
|
32
|
+
if (target) {
|
33
|
+
e.preventDefault();
|
34
|
+
target.parentNode.classList.toggle('active');
|
35
|
+
}
|
36
|
+
});
|
37
|
+
|
38
|
+
const siteNav = document.getElementById('site-nav');
|
39
|
+
const mainHeader = document.getElementById('main-header');
|
40
|
+
const menuButton = document.getElementById('menu-button');
|
30
41
|
|
31
|
-
jtd.addEvent(
|
42
|
+
jtd.addEvent(menuButton, 'click', function(e){
|
32
43
|
e.preventDefault();
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
44
|
+
|
45
|
+
if (menuButton.classList.toggle('nav-open')) {
|
46
|
+
siteNav.classList.add('nav-open');
|
47
|
+
mainHeader.classList.add('nav-open');
|
48
|
+
} else {
|
49
|
+
siteNav.classList.remove('nav-open');
|
50
|
+
mainHeader.classList.remove('nav-open');
|
51
|
+
}
|
52
|
+
});
|
53
|
+
|
54
|
+
{%- if site.search_enabled != false and site.search.button %}
|
55
|
+
const searchInput = document.getElementById('search-input');
|
56
|
+
const searchButton = document.getElementById('search-button');
|
57
|
+
|
58
|
+
jtd.addEvent(searchButton, 'click', function(e){
|
59
|
+
e.preventDefault();
|
60
|
+
|
61
|
+
mainHeader.classList.add('nav-open');
|
62
|
+
searchInput.focus();
|
63
|
+
});
|
64
|
+
{%- endif %}
|
43
65
|
}
|
44
66
|
|
67
|
+
{%- if site.search_enabled != false %}
|
45
68
|
// Site search
|
46
69
|
|
47
70
|
function initSearch() {
|
@@ -50,241 +73,377 @@ function initSearch() {
|
|
50
73
|
|
51
74
|
request.onload = function(){
|
52
75
|
if (request.status >= 200 && request.status < 400) {
|
53
|
-
|
54
|
-
var data = JSON.parse(request.responseText);
|
76
|
+
var docs = JSON.parse(request.responseText);
|
55
77
|
|
56
|
-
{
|
57
|
-
|
58
|
-
|
59
|
-
lunr.tokenizer.separator = /[\s\-/]+/
|
60
|
-
{% endif %}
|
61
|
-
|
62
|
-
var index = lunr(function () {
|
78
|
+
lunr.tokenizer.separator = {{ site.search.tokenizer_separator | default: site.search_tokenizer_separator | default: "/[\s\-/]+/" }}
|
79
|
+
|
80
|
+
var index = lunr(function(){
|
63
81
|
this.ref('id');
|
64
82
|
this.field('title', { boost: 200 });
|
65
83
|
this.field('content', { boost: 2 });
|
66
|
-
|
84
|
+
{%- if site.search.rel_url != false %}
|
85
|
+
this.field('relUrl');
|
86
|
+
{%- endif %}
|
67
87
|
this.metadataWhitelist = ['position']
|
68
88
|
|
69
|
-
for (var i in
|
89
|
+
for (var i in docs) {
|
70
90
|
this.add({
|
71
91
|
id: i,
|
72
|
-
title:
|
73
|
-
content:
|
74
|
-
|
92
|
+
title: docs[i].title,
|
93
|
+
content: docs[i].content,
|
94
|
+
{%- if site.search.rel_url != false %}
|
95
|
+
relUrl: docs[i].relUrl
|
96
|
+
{%- endif %}
|
75
97
|
});
|
76
98
|
}
|
77
99
|
});
|
78
100
|
|
79
|
-
|
101
|
+
searchLoaded(index, docs);
|
80
102
|
} else {
|
81
|
-
// We reached our target server, but it returned an error
|
82
103
|
console.log('Error loading ajax request. Request status:' + request.status);
|
83
104
|
}
|
84
105
|
};
|
85
106
|
|
86
107
|
request.onerror = function(){
|
87
|
-
// There was a connection error of some sort
|
88
108
|
console.log('There was a connection error');
|
89
109
|
};
|
90
110
|
|
91
111
|
request.send();
|
112
|
+
}
|
113
|
+
|
114
|
+
function searchLoaded(index, docs) {
|
115
|
+
var index = index;
|
116
|
+
var docs = docs;
|
117
|
+
var searchInput = document.getElementById('search-input');
|
118
|
+
var searchResults = document.getElementById('search-results');
|
119
|
+
var mainHeader = document.getElementById('main-header');
|
120
|
+
var currentInput;
|
121
|
+
var currentSearchIndex = 0;
|
122
|
+
|
123
|
+
function showSearch() {
|
124
|
+
document.documentElement.classList.add('search-active');
|
125
|
+
}
|
126
|
+
|
127
|
+
function hideSearch() {
|
128
|
+
document.documentElement.classList.remove('search-active');
|
129
|
+
}
|
92
130
|
|
93
|
-
function
|
94
|
-
|
95
|
-
var docs = data;
|
96
|
-
var searchInput = document.querySelector('.js-search-input');
|
97
|
-
var searchResults = document.querySelector('.js-search-results');
|
131
|
+
function update() {
|
132
|
+
currentSearchIndex++;
|
98
133
|
|
99
|
-
|
100
|
-
|
101
|
-
|
134
|
+
var input = searchInput.value;
|
135
|
+
if (input === '') {
|
136
|
+
hideSearch();
|
137
|
+
} else {
|
138
|
+
showSearch();
|
139
|
+
// scroll search input into view, workaround for iOS Safari
|
140
|
+
window.scroll(0, -1);
|
141
|
+
setTimeout(function(){ window.scroll(0, 0); }, 0);
|
142
|
+
}
|
143
|
+
if (input === currentInput) {
|
144
|
+
return;
|
145
|
+
}
|
146
|
+
currentInput = input;
|
147
|
+
searchResults.innerHTML = '';
|
148
|
+
if (input === '') {
|
149
|
+
return;
|
102
150
|
}
|
103
151
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
var previous = active.parentElement.previousSibling.querySelector('.search-result');
|
113
|
-
previous.classList.add('active');
|
114
|
-
}
|
115
|
-
}
|
116
|
-
return;
|
117
|
-
case 40: // arrow down
|
118
|
-
e.preventDefault();
|
119
|
-
var active = document.querySelector('.search-result.active');
|
120
|
-
if (active) {
|
121
|
-
if (active.parentElement.nextSibling) {
|
122
|
-
var next = active.parentElement.nextSibling.querySelector('.search-result');
|
123
|
-
active.classList.remove('active');
|
124
|
-
next.classList.add('active');
|
125
|
-
}
|
126
|
-
} else {
|
127
|
-
var next = document.querySelector('.search-result');
|
128
|
-
if (next) {
|
129
|
-
next.classList.add('active');
|
130
|
-
}
|
131
|
-
}
|
132
|
-
return;
|
133
|
-
case 13: // enter
|
134
|
-
e.preventDefault();
|
135
|
-
var active = document.querySelector('.search-result.active');
|
136
|
-
if (active) {
|
137
|
-
active.click();
|
138
|
-
} else {
|
139
|
-
var first = document.querySelector('.search-result');
|
140
|
-
if (first) {
|
141
|
-
first.click();
|
142
|
-
}
|
143
|
-
}
|
144
|
-
return;
|
145
|
-
}
|
152
|
+
var results = index.query(function (query) {
|
153
|
+
var tokens = lunr.tokenizer(input)
|
154
|
+
query.term(tokens, {
|
155
|
+
boost: 10
|
156
|
+
});
|
157
|
+
query.term(tokens, {
|
158
|
+
wildcard: lunr.Query.wildcard.TRAILING
|
159
|
+
});
|
146
160
|
});
|
147
161
|
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
return;
|
162
|
+
if ((results.length == 0) && (input.length > 2)) {
|
163
|
+
var tokens = lunr.tokenizer(input).filter(function(token, i) {
|
164
|
+
return token.str.length < 20;
|
165
|
+
})
|
166
|
+
if (tokens.length > 0) {
|
167
|
+
results = index.query(function (query) {
|
168
|
+
query.term(tokens, {
|
169
|
+
editDistance: Math.round(Math.sqrt(input.length / 2 - 1))
|
170
|
+
});
|
171
|
+
});
|
159
172
|
}
|
173
|
+
}
|
174
|
+
|
175
|
+
if (results.length == 0) {
|
176
|
+
var noResultsDiv = document.createElement('div');
|
177
|
+
noResultsDiv.classList.add('search-no-result');
|
178
|
+
noResultsDiv.innerText = 'No results found';
|
179
|
+
searchResults.appendChild(noResultsDiv);
|
160
180
|
|
161
|
-
|
181
|
+
} else {
|
182
|
+
var resultsList = document.createElement('ul');
|
183
|
+
resultsList.classList.add('search-results-list');
|
184
|
+
searchResults.appendChild(resultsList);
|
185
|
+
|
186
|
+
addResults(resultsList, results, 0, 10, 100, currentSearchIndex);
|
187
|
+
}
|
162
188
|
|
163
|
-
|
164
|
-
if (
|
189
|
+
function addResults(resultsList, results, start, batchSize, batchMillis, searchIndex) {
|
190
|
+
if (searchIndex != currentSearchIndex) {
|
165
191
|
return;
|
166
192
|
}
|
193
|
+
for (var i = start; i < (start + batchSize); i++) {
|
194
|
+
if (i == results.length) {
|
195
|
+
return;
|
196
|
+
}
|
197
|
+
addResult(resultsList, results[i]);
|
198
|
+
}
|
199
|
+
setTimeout(function() {
|
200
|
+
addResults(resultsList, results, start + batchSize, batchSize, batchMillis, searchIndex);
|
201
|
+
}, batchMillis);
|
202
|
+
}
|
167
203
|
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
204
|
+
function addResult(resultsList, result) {
|
205
|
+
var doc = docs[result.ref];
|
206
|
+
|
207
|
+
var resultsListItem = document.createElement('li');
|
208
|
+
resultsListItem.classList.add('search-results-list-item');
|
209
|
+
resultsList.appendChild(resultsListItem);
|
210
|
+
|
211
|
+
var resultLink = document.createElement('a');
|
212
|
+
resultLink.classList.add('search-result');
|
213
|
+
resultLink.setAttribute('href', doc.url);
|
214
|
+
resultsListItem.appendChild(resultLink);
|
215
|
+
|
216
|
+
var resultTitle = document.createElement('div');
|
217
|
+
resultTitle.classList.add('search-result-title');
|
218
|
+
resultLink.appendChild(resultTitle);
|
219
|
+
|
220
|
+
var resultDoc = document.createElement('div');
|
221
|
+
resultDoc.classList.add('search-result-doc');
|
222
|
+
resultDoc.innerHTML = '<svg viewBox="0 0 24 24" class="search-result-icon"><use xlink:href="#svg-doc"></use></svg>';
|
223
|
+
resultTitle.appendChild(resultDoc);
|
224
|
+
|
225
|
+
var resultDocTitle = document.createElement('div');
|
226
|
+
resultDocTitle.classList.add('search-result-doc-title');
|
227
|
+
resultDocTitle.innerHTML = doc.doc;
|
228
|
+
resultDoc.appendChild(resultDocTitle);
|
229
|
+
var resultDocOrSection = resultDocTitle;
|
230
|
+
|
231
|
+
if (doc.doc != doc.title) {
|
232
|
+
resultDoc.classList.add('search-result-doc-parent');
|
233
|
+
var resultSection = document.createElement('div');
|
234
|
+
resultSection.classList.add('search-result-section');
|
235
|
+
resultSection.innerHTML = doc.title;
|
236
|
+
resultTitle.appendChild(resultSection);
|
237
|
+
resultDocOrSection = resultSection;
|
238
|
+
}
|
177
239
|
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
var
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
resultRelUrl.innerText = doc.relUrl;
|
205
|
-
resultTitle.appendChild(resultRelUrl);
|
206
|
-
|
207
|
-
var metadata = result.matchData.metadata;
|
208
|
-
var contentFound = false;
|
209
|
-
for (var j in metadata) {
|
210
|
-
if (metadata[j].title) {
|
211
|
-
var position = metadata[j].title.position[0];
|
212
|
-
var start = position[0];
|
213
|
-
var end = position[0] + position[1];
|
214
|
-
resultTitle.innerHTML = doc.title.substring(0, start) + '<span class="search-result-highlight">' + doc.title.substring(start, end) + '</span>' + doc.title.substring(end, doc.title.length)+'<span class="search-result-rel-url">'+doc.relUrl+'</span>';
|
215
|
-
|
216
|
-
} else if (metadata[j].content && !contentFound) {
|
217
|
-
contentFound = true;
|
218
|
-
|
219
|
-
var position = metadata[j].content.position[0];
|
220
|
-
var start = position[0];
|
221
|
-
var end = position[0] + position[1];
|
222
|
-
var previewStart = start;
|
223
|
-
var previewEnd = end;
|
224
|
-
var ellipsesBefore = true;
|
225
|
-
var ellipsesAfter = true;
|
226
|
-
for (var k = 0; k < 3; k++) {
|
227
|
-
var nextSpace = doc.content.lastIndexOf(' ', previewStart - 2);
|
228
|
-
var nextDot = doc.content.lastIndexOf('.', previewStart - 2);
|
229
|
-
if ((nextDot > 0) && (nextDot > nextSpace)) {
|
230
|
-
previewStart = nextDot + 1;
|
231
|
-
ellipsesBefore = false;
|
232
|
-
break;
|
233
|
-
}
|
234
|
-
if (nextSpace < 0) {
|
235
|
-
previewStart = 0;
|
236
|
-
ellipsesBefore = false;
|
237
|
-
break;
|
238
|
-
}
|
239
|
-
previewStart = nextSpace + 1;
|
240
|
+
var metadata = result.matchData.metadata;
|
241
|
+
var titlePositions = [];
|
242
|
+
var contentPositions = [];
|
243
|
+
for (var j in metadata) {
|
244
|
+
var meta = metadata[j];
|
245
|
+
if (meta.title) {
|
246
|
+
var positions = meta.title.position;
|
247
|
+
for (var k in positions) {
|
248
|
+
titlePositions.push(positions[k]);
|
249
|
+
}
|
250
|
+
}
|
251
|
+
if (meta.content) {
|
252
|
+
var positions = meta.content.position;
|
253
|
+
for (var k in positions) {
|
254
|
+
var position = positions[k];
|
255
|
+
var previewStart = position[0];
|
256
|
+
var previewEnd = position[0] + position[1];
|
257
|
+
var ellipsesBefore = true;
|
258
|
+
var ellipsesAfter = true;
|
259
|
+
for (var k = 0; k < {{ site.search.preview_words_before | default: 5 }}; k++) {
|
260
|
+
var nextSpace = doc.content.lastIndexOf(' ', previewStart - 2);
|
261
|
+
var nextDot = doc.content.lastIndexOf('. ', previewStart - 2);
|
262
|
+
if ((nextDot >= 0) && (nextDot > nextSpace)) {
|
263
|
+
previewStart = nextDot + 1;
|
264
|
+
ellipsesBefore = false;
|
265
|
+
break;
|
240
266
|
}
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
previewEnd = nextDot;
|
246
|
-
ellipsesAfter = false;
|
247
|
-
break;
|
248
|
-
}
|
249
|
-
if (nextSpace < 0) {
|
250
|
-
previewEnd = doc.content.length;
|
251
|
-
ellipsesAfter = false;
|
252
|
-
break;
|
253
|
-
}
|
254
|
-
previewEnd = nextSpace;
|
267
|
+
if (nextSpace < 0) {
|
268
|
+
previewStart = 0;
|
269
|
+
ellipsesBefore = false;
|
270
|
+
break;
|
255
271
|
}
|
256
|
-
|
257
|
-
|
258
|
-
|
272
|
+
previewStart = nextSpace + 1;
|
273
|
+
}
|
274
|
+
for (var k = 0; k < {{ site.search.preview_words_after | default: 10 }}; k++) {
|
275
|
+
var nextSpace = doc.content.indexOf(' ', previewEnd + 1);
|
276
|
+
var nextDot = doc.content.indexOf('. ', previewEnd + 1);
|
277
|
+
if ((nextDot >= 0) && (nextDot < nextSpace)) {
|
278
|
+
previewEnd = nextDot;
|
279
|
+
ellipsesAfter = false;
|
280
|
+
break;
|
259
281
|
}
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
282
|
+
if (nextSpace < 0) {
|
283
|
+
previewEnd = doc.content.length;
|
284
|
+
ellipsesAfter = false;
|
285
|
+
break;
|
264
286
|
}
|
287
|
+
previewEnd = nextSpace;
|
288
|
+
}
|
289
|
+
contentPositions.push({
|
290
|
+
highlight: position,
|
291
|
+
previewStart: previewStart, previewEnd: previewEnd,
|
292
|
+
ellipsesBefore: ellipsesBefore, ellipsesAfter: ellipsesAfter
|
293
|
+
});
|
294
|
+
}
|
295
|
+
}
|
296
|
+
}
|
297
|
+
|
298
|
+
if (titlePositions.length > 0) {
|
299
|
+
titlePositions.sort(function(p1, p2){ return p1[0] - p2[0] });
|
300
|
+
resultDocOrSection.innerHTML = '';
|
301
|
+
addHighlightedText(resultDocOrSection, doc.title, 0, doc.title.length, titlePositions);
|
302
|
+
}
|
265
303
|
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
304
|
+
if (contentPositions.length > 0) {
|
305
|
+
contentPositions.sort(function(p1, p2){ return p1.highlight[0] - p2.highlight[0] });
|
306
|
+
var contentPosition = contentPositions[0];
|
307
|
+
var previewPosition = {
|
308
|
+
highlight: [contentPosition.highlight],
|
309
|
+
previewStart: contentPosition.previewStart, previewEnd: contentPosition.previewEnd,
|
310
|
+
ellipsesBefore: contentPosition.ellipsesBefore, ellipsesAfter: contentPosition.ellipsesAfter
|
311
|
+
};
|
312
|
+
var previewPositions = [previewPosition];
|
313
|
+
for (var j = 1; j < contentPositions.length; j++) {
|
314
|
+
contentPosition = contentPositions[j];
|
315
|
+
if (previewPosition.previewEnd < contentPosition.previewStart) {
|
316
|
+
previewPosition = {
|
317
|
+
highlight: [contentPosition.highlight],
|
318
|
+
previewStart: contentPosition.previewStart, previewEnd: contentPosition.previewEnd,
|
319
|
+
ellipsesBefore: contentPosition.ellipsesBefore, ellipsesAfter: contentPosition.ellipsesAfter
|
270
320
|
}
|
321
|
+
previewPositions.push(previewPosition);
|
322
|
+
} else {
|
323
|
+
previewPosition.highlight.push(contentPosition.highlight);
|
324
|
+
previewPosition.previewEnd = contentPosition.previewEnd;
|
325
|
+
previewPosition.ellipsesAfter = contentPosition.ellipsesAfter;
|
326
|
+
}
|
327
|
+
}
|
328
|
+
|
329
|
+
var resultPreviews = document.createElement('div');
|
330
|
+
resultPreviews.classList.add('search-result-previews');
|
331
|
+
resultLink.appendChild(resultPreviews);
|
332
|
+
|
333
|
+
var content = doc.content;
|
334
|
+
for (var j = 0; j < Math.min(previewPositions.length, {{ site.search.previews | default: 3 }}); j++) {
|
335
|
+
var position = previewPositions[j];
|
336
|
+
|
337
|
+
var resultPreview = document.createElement('div');
|
338
|
+
resultPreview.classList.add('search-result-preview');
|
339
|
+
resultPreviews.appendChild(resultPreview);
|
340
|
+
|
341
|
+
if (position.ellipsesBefore) {
|
342
|
+
resultPreview.appendChild(document.createTextNode('... '));
|
343
|
+
}
|
344
|
+
addHighlightedText(resultPreview, content, position.previewStart, position.previewEnd, position.highlight);
|
345
|
+
if (position.ellipsesAfter) {
|
346
|
+
resultPreview.appendChild(document.createTextNode(' ...'));
|
271
347
|
}
|
272
348
|
}
|
273
349
|
}
|
274
|
-
});
|
275
350
|
|
276
|
-
|
277
|
-
|
278
|
-
|
351
|
+
{%- if site.search.rel_url != false %}
|
352
|
+
var resultRelUrl = document.createElement('span');
|
353
|
+
resultRelUrl.classList.add('search-result-rel-url');
|
354
|
+
resultRelUrl.innerText = doc.relUrl;
|
355
|
+
resultTitle.appendChild(resultRelUrl);
|
356
|
+
{%- endif %}
|
357
|
+
}
|
358
|
+
|
359
|
+
function addHighlightedText(parent, text, start, end, positions) {
|
360
|
+
var index = start;
|
361
|
+
for (var i in positions) {
|
362
|
+
var position = positions[i];
|
363
|
+
var span = document.createElement('span');
|
364
|
+
span.innerHTML = text.substring(index, position[0]);
|
365
|
+
parent.appendChild(span);
|
366
|
+
index = position[0] + position[1];
|
367
|
+
var highlight = document.createElement('span');
|
368
|
+
highlight.classList.add('search-result-highlight');
|
369
|
+
highlight.innerHTML = text.substring(position[0], index);
|
370
|
+
parent.appendChild(highlight);
|
371
|
+
}
|
372
|
+
var span = document.createElement('span');
|
373
|
+
span.innerHTML = text.substring(index, end);
|
374
|
+
parent.appendChild(span);
|
375
|
+
}
|
279
376
|
}
|
280
|
-
}
|
281
377
|
|
282
|
-
|
378
|
+
jtd.addEvent(searchInput, 'focus', function(){
|
379
|
+
setTimeout(update, 0);
|
380
|
+
});
|
283
381
|
|
284
|
-
function
|
285
|
-
|
286
|
-
|
382
|
+
jtd.addEvent(searchInput, 'keyup', function(e){
|
383
|
+
switch (e.keyCode) {
|
384
|
+
case 27: // When esc key is pressed, hide the results and clear the field
|
385
|
+
searchInput.value = '';
|
386
|
+
break;
|
387
|
+
case 38: // arrow up
|
388
|
+
case 40: // arrow down
|
389
|
+
case 13: // enter
|
390
|
+
e.preventDefault();
|
391
|
+
return;
|
392
|
+
}
|
393
|
+
update();
|
394
|
+
});
|
395
|
+
|
396
|
+
jtd.addEvent(searchInput, 'keydown', function(e){
|
397
|
+
switch (e.keyCode) {
|
398
|
+
case 38: // arrow up
|
399
|
+
e.preventDefault();
|
400
|
+
var active = document.querySelector('.search-result.active');
|
401
|
+
if (active) {
|
402
|
+
active.classList.remove('active');
|
403
|
+
if (active.parentElement.previousSibling) {
|
404
|
+
var previous = active.parentElement.previousSibling.querySelector('.search-result');
|
405
|
+
previous.classList.add('active');
|
406
|
+
}
|
407
|
+
}
|
408
|
+
return;
|
409
|
+
case 40: // arrow down
|
410
|
+
e.preventDefault();
|
411
|
+
var active = document.querySelector('.search-result.active');
|
412
|
+
if (active) {
|
413
|
+
if (active.parentElement.nextSibling) {
|
414
|
+
var next = active.parentElement.nextSibling.querySelector('.search-result');
|
415
|
+
active.classList.remove('active');
|
416
|
+
next.classList.add('active');
|
417
|
+
}
|
418
|
+
} else {
|
419
|
+
var next = document.querySelector('.search-result');
|
420
|
+
if (next) {
|
421
|
+
next.classList.add('active');
|
422
|
+
}
|
423
|
+
}
|
424
|
+
return;
|
425
|
+
case 13: // enter
|
426
|
+
e.preventDefault();
|
427
|
+
var active = document.querySelector('.search-result.active');
|
428
|
+
if (active) {
|
429
|
+
active.click();
|
430
|
+
} else {
|
431
|
+
var first = document.querySelector('.search-result');
|
432
|
+
if (first) {
|
433
|
+
first.click();
|
434
|
+
}
|
435
|
+
}
|
436
|
+
return;
|
437
|
+
}
|
438
|
+
});
|
439
|
+
|
440
|
+
jtd.addEvent(document, 'click', function(e){
|
441
|
+
if (e.target != searchInput) {
|
442
|
+
hideSearch();
|
443
|
+
}
|
444
|
+
});
|
287
445
|
}
|
446
|
+
{%- endif %}
|
288
447
|
|
289
448
|
// Switch theme
|
290
449
|
|
@@ -302,10 +461,9 @@ jtd.setTheme = function(theme) {
|
|
302
461
|
|
303
462
|
jtd.onReady(function(){
|
304
463
|
initNav();
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
}
|
464
|
+
{%- if site.search_enabled != false %}
|
465
|
+
initSearch();
|
466
|
+
{%- endif %}
|
309
467
|
});
|
310
468
|
|
311
469
|
})(window.jtd = window.jtd || {});
|