Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
Open WIN Community
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
open-science
community
Open WIN Community
Commits
16628f2b
Commit
16628f2b
authored
4 years ago
by
Silvio Giebl
Browse files
Options
Downloads
Patches
Plain Diff
Improved search responsiveness for many results
parent
0421ab7f
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
assets/js/just-the-docs.js
+155
-136
155 additions, 136 deletions
assets/js/just-the-docs.js
with
155 additions
and
136 deletions
assets/js/just-the-docs.js
+
155
−
136
View file @
16628f2b
...
...
@@ -118,6 +118,7 @@ function searchLoaded(index, docs) {
var
searchResults
=
document
.
getElementById
(
'
search-results
'
);
var
mainHeader
=
document
.
getElementById
(
'
main-header
'
);
var
currentInput
;
var
currentSearchIndex
=
0
;
function
showSearch
()
{
document
.
documentElement
.
classList
.
add
(
'
search-active
'
);
...
...
@@ -128,6 +129,8 @@ function searchLoaded(index, docs) {
}
function
update
()
{
currentSearchIndex
++
;
var
input
=
searchInput
.
value
;
if
(
input
===
''
)
{
hideSearch
();
...
...
@@ -180,161 +183,177 @@ function searchLoaded(index, docs) {
resultsList
.
classList
.
add
(
'
search-results-list
'
);
searchResults
.
appendChild
(
resultsList
);
for
(
var
i
in
results
)
{
var
result
=
results
[
i
];
var
doc
=
docs
[
result
.
ref
];
var
resultsListItem
=
document
.
createElement
(
'
li
'
);
resultsListItem
.
classList
.
add
(
'
search-results-list-item
'
);
resultsList
.
appendChild
(
resultsListItem
);
var
resultLink
=
document
.
createElement
(
'
a
'
);
resultLink
.
classList
.
add
(
'
search-result
'
);
resultLink
.
setAttribute
(
'
href
'
,
doc
.
url
);
resultsListItem
.
appendChild
(
resultLink
);
var
resultTitle
=
document
.
createElement
(
'
div
'
);
resultTitle
.
classList
.
add
(
'
search-result-title
'
);
resultLink
.
appendChild
(
resultTitle
);
var
resultDoc
=
document
.
createElement
(
'
div
'
);
resultDoc
.
classList
.
add
(
'
search-result-doc
'
);
resultDoc
.
innerHTML
=
'
<svg viewBox="0 0 24 24" class="search-result-icon"><use xlink:href="#svg-doc"></use></svg>
'
;
resultTitle
.
appendChild
(
resultDoc
);
var
resultDocTitle
=
document
.
createElement
(
'
div
'
);
resultDocTitle
.
classList
.
add
(
'
search-result-doc-title
'
);
resultDocTitle
.
innerHTML
=
doc
.
doc
;
resultDoc
.
appendChild
(
resultDocTitle
);
var
resultDocOrSection
=
resultDocTitle
;
if
(
doc
.
doc
!=
doc
.
title
)
{
resultDoc
.
classList
.
add
(
'
search-result-doc-parent
'
);
var
resultSection
=
document
.
createElement
(
'
div
'
);
resultSection
.
classList
.
add
(
'
search-result-section
'
);
resultSection
.
innerHTML
=
doc
.
title
;
resultTitle
.
appendChild
(
resultSection
);
resultDocOrSection
=
resultSection
;
addResults
(
resultsList
,
results
,
0
,
10
,
100
,
currentSearchIndex
);
}
function
addResults
(
resultsList
,
results
,
start
,
batchSize
,
batchMillis
,
searchIndex
)
{
if
(
searchIndex
!=
currentSearchIndex
)
{
return
;
}
for
(
var
i
=
start
;
i
<
(
start
+
batchSize
);
i
++
)
{
if
(
i
==
results
.
length
)
{
return
;
}
addResult
(
resultsList
,
results
[
i
]);
}
setTimeout
(
function
()
{
addResults
(
resultsList
,
results
,
start
+
batchSize
,
batchSize
,
batchMillis
,
searchIndex
);
},
batchMillis
);
}
var
metadata
=
result
.
matchData
.
metadata
;
var
titlePositions
=
[];
var
contentPositions
=
[];
for
(
var
j
in
metadata
)
{
var
meta
=
metadata
[
j
];
if
(
meta
.
title
)
{
var
positions
=
meta
.
title
.
position
;
for
(
var
k
in
positions
)
{
titlePositions
.
push
(
positions
[
k
]);
}
function
addResult
(
resultsList
,
result
)
{
var
doc
=
docs
[
result
.
ref
];
var
resultsListItem
=
document
.
createElement
(
'
li
'
);
resultsListItem
.
classList
.
add
(
'
search-results-list-item
'
);
resultsList
.
appendChild
(
resultsListItem
);
var
resultLink
=
document
.
createElement
(
'
a
'
);
resultLink
.
classList
.
add
(
'
search-result
'
);
resultLink
.
setAttribute
(
'
href
'
,
doc
.
url
);
resultsListItem
.
appendChild
(
resultLink
);
var
resultTitle
=
document
.
createElement
(
'
div
'
);
resultTitle
.
classList
.
add
(
'
search-result-title
'
);
resultLink
.
appendChild
(
resultTitle
);
var
resultDoc
=
document
.
createElement
(
'
div
'
);
resultDoc
.
classList
.
add
(
'
search-result-doc
'
);
resultDoc
.
innerHTML
=
'
<svg viewBox="0 0 24 24" class="search-result-icon"><use xlink:href="#svg-doc"></use></svg>
'
;
resultTitle
.
appendChild
(
resultDoc
);
var
resultDocTitle
=
document
.
createElement
(
'
div
'
);
resultDocTitle
.
classList
.
add
(
'
search-result-doc-title
'
);
resultDocTitle
.
innerHTML
=
doc
.
doc
;
resultDoc
.
appendChild
(
resultDocTitle
);
var
resultDocOrSection
=
resultDocTitle
;
if
(
doc
.
doc
!=
doc
.
title
)
{
resultDoc
.
classList
.
add
(
'
search-result-doc-parent
'
);
var
resultSection
=
document
.
createElement
(
'
div
'
);
resultSection
.
classList
.
add
(
'
search-result-section
'
);
resultSection
.
innerHTML
=
doc
.
title
;
resultTitle
.
appendChild
(
resultSection
);
resultDocOrSection
=
resultSection
;
}
var
metadata
=
result
.
matchData
.
metadata
;
var
titlePositions
=
[];
var
contentPositions
=
[];
for
(
var
j
in
metadata
)
{
var
meta
=
metadata
[
j
];
if
(
meta
.
title
)
{
var
positions
=
meta
.
title
.
position
;
for
(
var
k
in
positions
)
{
titlePositions
.
push
(
positions
[
k
]);
}
if
(
meta
.
content
)
{
var
positions
=
meta
.
content
.
position
;
for
(
var
k
in
positions
)
{
var
position
=
positions
[
k
];
var
previewStart
=
position
[
0
];
var
previewEnd
=
position
[
0
]
+
position
[
1
];
var
ellipsesBefore
=
true
;
var
ellipsesAfter
=
true
;
for
(
var
k
=
0
;
k
<
{{
site
.
search
.
preview_words_before
|
default
:
5
}};
k
++
)
{
var
nextSpace
=
doc
.
content
.
lastIndexOf
(
'
'
,
previewStart
-
2
);
var
nextDot
=
doc
.
content
.
lastIndexOf
(
'
.
'
,
previewStart
-
2
);
if
((
nextDot
>=
0
)
&&
(
nextDot
>
nextSpace
))
{
previewStart
=
nextDot
+
1
;
ellipsesBefore
=
false
;
break
;
}
if
(
nextSpace
<
0
)
{
previewStart
=
0
;
ellipsesBefore
=
false
;
break
;
}
previewStart
=
nextSpace
+
1
;
}
if
(
meta
.
content
)
{
var
positions
=
meta
.
content
.
position
;
for
(
var
k
in
positions
)
{
var
position
=
positions
[
k
];
var
previewStart
=
position
[
0
];
var
previewEnd
=
position
[
0
]
+
position
[
1
];
var
ellipsesBefore
=
true
;
var
ellipsesAfter
=
true
;
for
(
var
k
=
0
;
k
<
{{
site
.
search
.
preview_words_before
|
default
:
5
}};
k
++
)
{
var
nextSpace
=
doc
.
content
.
lastIndexOf
(
'
'
,
previewStart
-
2
);
var
nextDot
=
doc
.
content
.
lastIndexOf
(
'
.
'
,
previewStart
-
2
);
if
((
nextDot
>=
0
)
&&
(
nextDot
>
nextSpace
))
{
previewStart
=
nextDot
+
1
;
ellipsesBefore
=
false
;
break
;
}
if
(
nextSpace
<
0
)
{
previewStart
=
0
;
ellipsesBefore
=
false
;
break
;
}
previewStart
=
nextSpace
+
1
;
}
for
(
var
k
=
0
;
k
<
{{
site
.
search
.
preview_words_after
|
default
:
10
}};
k
++
)
{
var
nextSpace
=
doc
.
content
.
indexOf
(
'
'
,
previewEnd
+
1
);
var
nextDot
=
doc
.
content
.
indexOf
(
'
.
'
,
previewEnd
+
1
);
if
((
nextDot
>=
0
)
&&
(
nextDot
<
nextSpace
))
{
previewEnd
=
nextDot
;
ellipsesAfter
=
false
;
break
;
}
for
(
var
k
=
0
;
k
<
{{
site
.
search
.
preview_words_after
|
default
:
10
}};
k
++
)
{
var
nextSpace
=
doc
.
content
.
indexOf
(
'
'
,
previewEnd
+
1
);
var
nextDot
=
doc
.
content
.
indexOf
(
'
.
'
,
previewEnd
+
1
);
if
((
nextDot
>=
0
)
&&
(
nextDot
<
nextSpace
))
{
previewEnd
=
nextDot
;
ellipsesAfter
=
false
;
break
;
}
if
(
nextSpace
<
0
)
{
previewEnd
=
doc
.
content
.
length
;
ellipsesAfter
=
false
;
break
;
}
previewEnd
=
nextSpace
;
if
(
nextSpace
<
0
)
{
previewEnd
=
doc
.
content
.
length
;
ellipsesAfter
=
false
;
break
;
}
contentPositions
.
push
({
highlight
:
position
,
previewStart
:
previewStart
,
previewEnd
:
previewEnd
,
ellipsesBefore
:
ellipsesBefore
,
ellipsesAfter
:
ellipsesAfter
});
previewEnd
=
nextSpace
;
}
contentPositions
.
push
({
highlight
:
position
,
previewStart
:
previewStart
,
previewEnd
:
previewEnd
,
ellipsesBefore
:
ellipsesBefore
,
ellipsesAfter
:
ellipsesAfter
});
}
}
}
if
(
titlePositions
.
length
>
0
)
{
titlePositions
.
sort
(
function
(
p1
,
p2
){
return
p1
[
0
]
-
p2
[
0
]
});
resultDocOrSection
.
innerHTML
=
''
;
addHighlightedText
(
resultDocOrSection
,
doc
.
title
,
0
,
doc
.
title
.
length
,
titlePositions
);
}
if
(
titlePositions
.
length
>
0
)
{
titlePositions
.
sort
(
function
(
p1
,
p2
){
return
p1
[
0
]
-
p2
[
0
]
});
resultDocOrSection
.
innerHTML
=
''
;
addHighlightedText
(
resultDocOrSection
,
doc
.
title
,
0
,
doc
.
title
.
length
,
titlePositions
);
}
if
(
contentPositions
.
length
>
0
)
{
contentPositions
.
sort
(
function
(
p1
,
p2
){
return
p1
.
highlight
[
0
]
-
p2
.
highlight
[
0
]
});
var
contentPosition
=
contentPositions
[
0
];
var
previewPosition
=
{
highlight
:
[
contentPosition
.
highlight
],
previewStart
:
contentPosition
.
previewStart
,
previewEnd
:
contentPosition
.
previewEnd
,
ellipsesBefore
:
contentPosition
.
ellipsesBefore
,
ellipsesAfter
:
contentPosition
.
ellipsesAfter
};
var
previewPositions
=
[
previewPosition
];
for
(
var
j
=
1
;
j
<
contentPositions
.
length
;
j
++
)
{
contentPosition
=
contentPositions
[
j
];
if
(
previewPosition
.
previewEnd
<
contentPosition
.
previewStart
)
{
previewPosition
=
{
highlight
:
[
contentPosition
.
highlight
],
previewStart
:
contentPosition
.
previewStart
,
previewEnd
:
contentPosition
.
previewEnd
,
ellipsesBefore
:
contentPosition
.
ellipsesBefore
,
ellipsesAfter
:
contentPosition
.
ellipsesAfter
}
previewPositions
.
push
(
previewPosition
);
}
else
{
previewPosition
.
highlight
.
push
(
contentPosition
.
highlight
);
previewPosition
.
previewEnd
=
contentPosition
.
previewEnd
;
previewPosition
.
ellipsesAfter
=
contentPosition
.
ellipsesAfter
;
if
(
contentPositions
.
length
>
0
)
{
contentPositions
.
sort
(
function
(
p1
,
p2
){
return
p1
.
highlight
[
0
]
-
p2
.
highlight
[
0
]
});
var
contentPosition
=
contentPositions
[
0
];
var
previewPosition
=
{
highlight
:
[
contentPosition
.
highlight
],
previewStart
:
contentPosition
.
previewStart
,
previewEnd
:
contentPosition
.
previewEnd
,
ellipsesBefore
:
contentPosition
.
ellipsesBefore
,
ellipsesAfter
:
contentPosition
.
ellipsesAfter
};
var
previewPositions
=
[
previewPosition
];
for
(
var
j
=
1
;
j
<
contentPositions
.
length
;
j
++
)
{
contentPosition
=
contentPositions
[
j
];
if
(
previewPosition
.
previewEnd
<
contentPosition
.
previewStart
)
{
previewPosition
=
{
highlight
:
[
contentPosition
.
highlight
],
previewStart
:
contentPosition
.
previewStart
,
previewEnd
:
contentPosition
.
previewEnd
,
ellipsesBefore
:
contentPosition
.
ellipsesBefore
,
ellipsesAfter
:
contentPosition
.
ellipsesAfter
}
previewPositions
.
push
(
previewPosition
);
}
else
{
previewPosition
.
highlight
.
push
(
contentPosition
.
highlight
);
previewPosition
.
previewEnd
=
contentPosition
.
previewEnd
;
previewPosition
.
ellipsesAfter
=
contentPosition
.
ellipsesAfter
;
}
}
var
resultPreviews
=
document
.
createElement
(
'
div
'
);
resultPreviews
.
classList
.
add
(
'
search-result-previews
'
);
resultLink
.
appendChild
(
resultPreviews
);
var
resultPreviews
=
document
.
createElement
(
'
div
'
);
resultPreviews
.
classList
.
add
(
'
search-result-previews
'
);
resultLink
.
appendChild
(
resultPreviews
);
var
content
=
doc
.
content
;
for
(
var
j
=
0
;
j
<
Math
.
min
(
previewPositions
.
length
,
{{
site
.
search
.
previews
|
default
:
3
}});
j
++
)
{
var
position
=
previewPositions
[
j
];
var
content
=
doc
.
content
;
for
(
var
j
=
0
;
j
<
Math
.
min
(
previewPositions
.
length
,
{{
site
.
search
.
previews
|
default
:
3
}});
j
++
)
{
var
position
=
previewPositions
[
j
];
var
resultPreview
=
document
.
createElement
(
'
div
'
);
resultPreview
.
classList
.
add
(
'
search-result-preview
'
);
resultPreviews
.
appendChild
(
resultPreview
);
var
resultPreview
=
document
.
createElement
(
'
div
'
);
resultPreview
.
classList
.
add
(
'
search-result-preview
'
);
resultPreviews
.
appendChild
(
resultPreview
);
if
(
position
.
ellipsesBefore
)
{
resultPreview
.
appendChild
(
document
.
createTextNode
(
'
...
'
));
}
addHighlightedText
(
resultPreview
,
content
,
position
.
previewStart
,
position
.
previewEnd
,
position
.
highlight
);
if
(
position
.
ellipsesAfter
)
{
resultPreview
.
appendChild
(
document
.
createTextNode
(
'
...
'
));
}
if
(
position
.
ellipsesBefore
)
{
resultPreview
.
appendChild
(
document
.
createTextNode
(
'
...
'
));
}
addHighlightedText
(
resultPreview
,
content
,
position
.
previewStart
,
position
.
previewEnd
,
position
.
highlight
);
if
(
position
.
ellipsesAfter
)
{
resultPreview
.
appendChild
(
document
.
createTextNode
(
'
...
'
));
}
}
{
%-
if
site
.
search
.
rel_url
!=
false
%
}
var
resultRelUrl
=
document
.
createElement
(
'
span
'
);
resultRelUrl
.
classList
.
add
(
'
search-result-rel-url
'
);
resultRelUrl
.
innerText
=
doc
.
relUrl
;
resultTitle
.
appendChild
(
resultRelUrl
);
{
%-
endif
%
}
}
{
%-
if
site
.
search
.
rel_url
!=
false
%
}
var
resultRelUrl
=
document
.
createElement
(
'
span
'
);
resultRelUrl
.
classList
.
add
(
'
search-result-rel-url
'
);
resultRelUrl
.
innerText
=
doc
.
relUrl
;
resultTitle
.
appendChild
(
resultRelUrl
);
{
%-
endif
%
}
}
function
addHighlightedText
(
parent
,
text
,
start
,
end
,
positions
)
{
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment