Skip to content

Commit 6e26d67

Browse files
author
ZYROUGE
committed
Added Search
1 parent b5c0db3 commit 6e26d67

File tree

5 files changed

+194
-7
lines changed

5 files changed

+194
-7
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "jsdoc-skyceil",
3-
"version": "1.0.5",
3+
"version": "1.0.6",
44
"description": "A clean and minimalistic JSDoc theme",
55
"main": "publish.js",
66
"scripts": {

publish.js

Lines changed: 104 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,107 @@ function buildNav(members) {
409409
return nav;
410410
}
411411

412+
function buildMemberSearch(items, itemHeading, itemsSeen, linktoFn) {
413+
let search = [];
414+
415+
if (items.length) {
416+
let itemsSearch = [];
417+
418+
items.forEach(item => {
419+
var methods = find({ kind: "function", memberof: item.longname })
420+
var members = find({ kind: "member", memberof: item.longname })
421+
var hasMethods = !!(methods.length || members.length);
422+
let displayName;
423+
424+
if ( !hasOwnProp.call(item, 'longname') ) {
425+
itemsSearch.push({ name: item.name, url: linktoFn('', item.name) });
426+
}
427+
else if ( !hasOwnProp.call(itemsSeen, item.longname) ) {
428+
if (env.conf.templates.default.useLongnameInNav) {
429+
displayName = item.longname;
430+
} else {
431+
displayName = item.name;
432+
}
433+
434+
itemsSearch.push({
435+
name: displayName,
436+
url: linktoFn(item.longname, displayName.replace(/\b(module|event):/g, ''))
437+
});
438+
439+
if(hasMethods) {
440+
methods.forEach(meth => {
441+
itemsSearch.push({
442+
name: meth.longname,
443+
url: linktoFn(meth.longname, meth.name)
444+
});
445+
});
446+
members.forEach(meth => {
447+
itemsSearch.push({
448+
name: meth.longname,
449+
url: linktoFn(meth.longname, meth.name)
450+
});
451+
});
452+
}
453+
}
454+
});
455+
456+
if (itemsSearch.length) {
457+
search.push(...itemsSearch);
458+
}
459+
}
460+
461+
return search;
462+
}
463+
464+
/**
465+
* Create the search bar in sidebar.
466+
* @param {object} members The members that will be used to create the sidebar.
467+
* @param {array<object>} members.classes
468+
* @param {array<object>} members.externals
469+
* @param {array<object>} members.globals
470+
* @param {array<object>} members.mixins
471+
* @param {array<object>} members.modules
472+
* @param {array<object>} members.namespaces
473+
* @param {array<object>} members.tutorials
474+
* @param {array<object>} members.events
475+
* @param {array<object>} members.interfaces
476+
* @return {string} The HTML for the navigation sidebar.
477+
*/
478+
function buildSearch(members) {
479+
let globalNav;
480+
let search = [{ name: "Home", url: '<a href="index.html">Home</a>' }];
481+
const seen = {};
482+
const seenTutorials = {};
483+
484+
search.push(...buildMemberSearch(members.modules, 'Modules', {}, linkto));
485+
search.push(...buildMemberSearch(members.externals, 'Externals', seen, linktoExternal));
486+
search.push(...buildMemberSearch(members.namespaces, 'Namespaces', seen, linkto));
487+
search.push(...buildMemberSearch(members.classes, 'Classes', seen, linkto));
488+
search.push(...buildMemberSearch(members.interfaces, 'Interfaces', seen, linkto));
489+
search.push(...buildMemberSearch(members.events, 'Events', seen, linkto));
490+
search.push(...buildMemberSearch(members.mixins, 'Mixins', seen, linkto));
491+
search.push(...buildMemberSearch(members.tutorials, 'Tutorials', seenTutorials, linktoTutorial));
492+
493+
if (members.globals.length) {
494+
globalNav = [];
495+
496+
members.globals.forEach(({kind, longname, name}) => {
497+
if ( kind !== 'typedef' && !hasOwnProp.call(seen, longname) ) {
498+
globalNav.push({ name: name, url: linkto(longname, name) });
499+
}
500+
});
501+
502+
if (!globalNav.length) {
503+
search.push({ name: "Global", url: linkto('global', 'Global') });
504+
}
505+
else {
506+
search.push(...globalNav);
507+
}
508+
}
509+
510+
return search;
511+
}
512+
412513
function prettifyReadme (readme) {
413514
let prettifiedReadme = readme;
414515
prettifiedReadme = prettifiedReadme.replace(/class="prettyprint/g, "class=\"prettyprint linenums");
@@ -625,7 +726,9 @@ exports.publish = (taffyData, opts, tutorials) => {
625726

626727
// once for all
627728
view.nav = buildNav(members);
628-
attachModuleSymbols( find({ longname: {left: 'module:'} }), members.modules );
729+
attachModuleSymbols( find({ longname: { left: 'module:'} }), members.modules );
730+
view.search = buildSearch(members);
731+
fs.writeFileSync(path.join(outdir, "search.json"), JSON.stringify(view.search));
629732

630733
// generate the pretty-printed source files first so other pages can link to them
631734
if (outputSourceFiles) {

static/scripts/nav.js

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const init = async () => {
2-
window.addEventListener("DOMContentLoaded", function () {
2+
document.addEventListener("DOMContentLoaded", function () {
33
const body = document.querySelector("body");
44

55
// Burger
@@ -48,6 +48,7 @@ const init = async () => {
4848
}
4949
}
5050

51+
makeSearch();
5152
});
5253

5354
function toggleClass(element, className) {
@@ -57,6 +58,40 @@ const init = async () => {
5758
element.classList.add(className);
5859
}
5960
}
61+
62+
async function makeSearch() {
63+
const searchData = await fetch("search.json");
64+
const data = await searchData.json();
65+
const textbox = document.getElementById("search-box");
66+
const results = document.getElementById("search-results");
67+
const fuse = new Fuse(data, {
68+
includeScore: true,
69+
keys: ['name']
70+
});
71+
textbox.addEventListener("change", textboxhandle);
72+
textbox.addEventListener("keydown", textboxhandle);
73+
textbox.addEventListener("keyup", textboxhandle);
74+
textbox.addEventListener("keypress", textboxhandle);
75+
function textboxhandle() {
76+
const val = textbox.value.trim();
77+
if(val.length) {
78+
const items = fuse.search(val);
79+
let resHtml = "";
80+
if(items.length) {
81+
items.sort((a, b) => b.score - a.score).forEach(({ item }) => {
82+
resHtml += `<p onclick="this.querySelector('a').click()">${item.name}${item.url}</p>`;
83+
});
84+
} else {
85+
resHtml += "<p>No result</p>"
86+
}
87+
results.innerHTML = resHtml;
88+
results.style.display = "block";
89+
} else {
90+
results.innerHTML = "";
91+
results.style.display = "none";
92+
}
93+
}
94+
}
6095
}
6196

6297
init();

static/styles/skyceil.css

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,56 @@ body[data-theme="dark"] {
6262
border-radius: 10px;
6363
outline: none;
6464
background: transparent !important;
65-
font-size: 1.5rem;
65+
font-size: 1.2rem;
6666
cursor: pointer;
6767
}
6868

69+
.utilities {
70+
display: flex;
71+
flex-direction: row;
72+
justify-content: center;
73+
align-items: center;
74+
}
75+
76+
#search-box {
77+
outline: none;
78+
border: 2px solid var(--simple-code);
79+
padding: 5px;
80+
border-radius: 2px;
81+
font-family: 'Montserrat', sans-serif;
82+
background-color: var(--background);
83+
color: var(--font);
84+
}
85+
86+
#search-results {
87+
position: absolute;
88+
border: 2px solid var(--simple-code);
89+
background-color: var(--background);
90+
width: 75%;
91+
margin-top: 6px;
92+
max-height: 70%;
93+
overflow-y: auto;
94+
}
95+
96+
#search-results p {
97+
display: block;
98+
cursor: pointer;
99+
padding: 5px;
100+
font-size: 1.2rem;
101+
color: var(--font);
102+
text-decoration: none;
103+
margin: 0;
104+
}
105+
106+
#search-results p a {
107+
font-size: 14px;
108+
display: block;
109+
}
110+
111+
#search-results p:hover {
112+
background-color: var(--simple-code);
113+
}
114+
69115
html
70116
{
71117
overflow-x: hidden;

tmpl/layout.tmpl

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
<script src="scripts/prettify/prettify.js"></script>
88
<script src="scripts/prettify/lang-css.js"></script>
99
<script src="scripts/nav.js"></script>
10+
<script src="https://cdnjs.cloudflare.com/ajax/libs/fuse.js/3.4.6/fuse.min.js"></script>
1011

1112
<meta name="viewport" content="width=device-width, initial-scale=1.0">
1213

@@ -19,9 +20,11 @@
1920

2021
<nav class="navbar">
2122
<div class="utilities">
22-
<center>
23-
<button class="theme" data-theme="light"><i class="fas fa-moon"></i></button>
24-
</center>
23+
<div id="search">
24+
<input type="text" id="search-box" placeholder="Search for stuffs..."><br>
25+
<div id="search-results" style="display: none;"></div>
26+
</div>
27+
<button class="theme" data-theme="light"><i class="fas fa-moon"></i></button>
2528
</div>
2629
<hr>
2730
<?js= this.nav ?>

0 commit comments

Comments
 (0)