mirror of
https://github.com/carbon-design-system/carbon-components-svelte.git
synced 2025-09-14 18:01:06 +00:00
docs: implement rudimentary full-text search (#1849)
This commit is contained in:
parent
6da4572c26
commit
e5e13a9e78
5 changed files with 96 additions and 5 deletions
1
docs/.gitignore
vendored
1
docs/.gitignore
vendored
|
@ -1,3 +1,4 @@
|
||||||
/node_modules
|
/node_modules
|
||||||
/dist
|
/dist
|
||||||
/.routify
|
/.routify
|
||||||
|
src/SEARCH_INDEX.json
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "run-p dev:*",
|
"dev": "yarn build:index-docs && run-p dev:*",
|
||||||
"dev:routify": "cross-env NODE_ENV=development routify run",
|
"dev:routify": "cross-env NODE_ENV=development routify run",
|
||||||
"dev:svite": "vite dev",
|
"dev:svite": "vite dev",
|
||||||
"build": "run-s build:*",
|
"build": "run-s build:*",
|
||||||
|
"build:index-docs": "node scripts/index-docs.js",
|
||||||
"build:routify": "routify run -b",
|
"build:routify": "routify run -b",
|
||||||
"build:svite": "vite build"
|
"build:svite": "vite build"
|
||||||
},
|
},
|
||||||
|
@ -16,6 +17,7 @@
|
||||||
"clipboard-copy": "^4.0.1",
|
"clipboard-copy": "^4.0.1",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"mdsvex": "^0.10.6",
|
"mdsvex": "^0.10.6",
|
||||||
|
"minisearch": "^6.2.0",
|
||||||
"npm-run-all": "^4.1.5",
|
"npm-run-all": "^4.1.5",
|
||||||
"prettier": "^2.7.1",
|
"prettier": "^2.7.1",
|
||||||
"prettier-plugin-svelte": "^2.7.0",
|
"prettier-plugin-svelte": "^2.7.0",
|
||||||
|
|
43
docs/scripts/index-docs.js
Normal file
43
docs/scripts/index-docs.js
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
// @ts-check
|
||||||
|
const fs = require("fs");
|
||||||
|
const path = require("path");
|
||||||
|
const { slug } = require("github-slugger");
|
||||||
|
|
||||||
|
const COMPONENTS_PATH = "./src/pages/components";
|
||||||
|
const SEARCH_INDEX_PATH = "./src/SEARCH_INDEX.json";
|
||||||
|
const H2_DELMIMITER = "## ";
|
||||||
|
|
||||||
|
const files = fs.readdirSync(COMPONENTS_PATH);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} Document
|
||||||
|
* @property {string} id
|
||||||
|
* @property {string} text
|
||||||
|
* @property {string} description
|
||||||
|
* @property {string} href
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @type {Document[]} */
|
||||||
|
const documents = [];
|
||||||
|
|
||||||
|
for (const file of files) {
|
||||||
|
const [component_name] = file.split(".");
|
||||||
|
const file_path = path.join(COMPONENTS_PATH, file);
|
||||||
|
const file_content = fs.readFileSync(file_path, "utf8");
|
||||||
|
|
||||||
|
file_content.split("\n").forEach((line) => {
|
||||||
|
if (line.startsWith(H2_DELMIMITER)) {
|
||||||
|
const [, h2] = line.split(H2_DELMIMITER);
|
||||||
|
const hash = slug(h2);
|
||||||
|
|
||||||
|
documents.push({
|
||||||
|
id: component_name + hash,
|
||||||
|
text: component_name,
|
||||||
|
description: h2,
|
||||||
|
href: `/components/${component_name}#${hash}`,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.writeFileSync(SEARCH_INDEX_PATH, JSON.stringify(documents, null, 2));
|
|
@ -1,5 +1,11 @@
|
||||||
<script>
|
<script>
|
||||||
import { isActive, url, layout, beforeUrlChange } from "@sveltech/routify";
|
import {
|
||||||
|
isActive,
|
||||||
|
url,
|
||||||
|
layout,
|
||||||
|
beforeUrlChange,
|
||||||
|
goto,
|
||||||
|
} from "@sveltech/routify";
|
||||||
import {
|
import {
|
||||||
Header,
|
Header,
|
||||||
HeaderUtilities,
|
HeaderUtilities,
|
||||||
|
@ -8,6 +14,7 @@
|
||||||
HeaderPanelLinks,
|
HeaderPanelLinks,
|
||||||
HeaderPanelLink,
|
HeaderPanelLink,
|
||||||
HeaderPanelDivider,
|
HeaderPanelDivider,
|
||||||
|
HeaderSearch,
|
||||||
SkipToContent,
|
SkipToContent,
|
||||||
SideNav,
|
SideNav,
|
||||||
SideNavItems,
|
SideNavItems,
|
||||||
|
@ -15,12 +22,30 @@
|
||||||
Theme,
|
Theme,
|
||||||
Tag,
|
Tag,
|
||||||
} from "carbon-components-svelte";
|
} from "carbon-components-svelte";
|
||||||
|
import MiniSearch from "minisearch";
|
||||||
import LogoGithub from "carbon-icons-svelte/lib/LogoGithub.svelte";
|
import LogoGithub from "carbon-icons-svelte/lib/LogoGithub.svelte";
|
||||||
import { theme } from "../store";
|
import { theme } from "../store";
|
||||||
|
import SEARCH_INDEX from "../SEARCH_INDEX.json";
|
||||||
|
|
||||||
|
const miniSearch = new MiniSearch({
|
||||||
|
fields: ["text", "description"],
|
||||||
|
storeFields: ["text", "description", "href"],
|
||||||
|
searchOptions: {
|
||||||
|
prefix: true,
|
||||||
|
boost: { description: 2 },
|
||||||
|
fuzzy: 0.1,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
miniSearch.addAll(SEARCH_INDEX);
|
||||||
|
|
||||||
const deprecated = [];
|
const deprecated = [];
|
||||||
const new_components = [];
|
const new_components = [];
|
||||||
|
|
||||||
|
let value = "";
|
||||||
|
let active = false;
|
||||||
|
$: results = miniSearch.search(value).slice(0, 10);
|
||||||
|
|
||||||
let isOpen = false;
|
let isOpen = false;
|
||||||
let isSideNavOpen = true;
|
let isSideNavOpen = true;
|
||||||
let innerWidth = 2048;
|
let innerWidth = 2048;
|
||||||
|
@ -50,13 +75,21 @@
|
||||||
<SkipToContent />
|
<SkipToContent />
|
||||||
</svelte:fragment>
|
</svelte:fragment>
|
||||||
|
|
||||||
<span slot="platform" class="platform-name">
|
<span slot="platform" class="platform-name" class:hidden="{active}">
|
||||||
Carbon Components Svelte <code class="code-01"
|
Carbon Components Svelte <code class="code-01"
|
||||||
>v{process.env.VERSION || ""}</code
|
>v{process.env.VERSION || ""}</code
|
||||||
>
|
>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<HeaderUtilities>
|
<HeaderUtilities>
|
||||||
|
<HeaderSearch
|
||||||
|
bind:value
|
||||||
|
bind:active
|
||||||
|
placeholder="Search"
|
||||||
|
results="{results}"
|
||||||
|
on:select="{(e) => {
|
||||||
|
$goto(e.detail.selectedResult.href);
|
||||||
|
}}"
|
||||||
|
/>
|
||||||
<HeaderActionLink
|
<HeaderActionLink
|
||||||
icon="{LogoGithub}"
|
icon="{LogoGithub}"
|
||||||
href="https://github.com/carbon-design-system/carbon-components-svelte"
|
href="https://github.com/carbon-design-system/carbon-components-svelte"
|
||||||
|
@ -132,6 +165,13 @@
|
||||||
</Theme>
|
</Theme>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
|
/** Hide logo to make space for search bar on narrower screens. */
|
||||||
|
@media (max-width: 1056px) {
|
||||||
|
.platform-name.hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.platform-name {
|
.platform-name {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: baseline;
|
align-items: baseline;
|
||||||
|
|
|
@ -165,7 +165,7 @@ bufferutil@^4.0.1:
|
||||||
node-gyp-build "~3.7.0"
|
node-gyp-build "~3.7.0"
|
||||||
|
|
||||||
carbon-components-svelte@../:
|
carbon-components-svelte@../:
|
||||||
version "0.81.1"
|
version "0.82.1"
|
||||||
dependencies:
|
dependencies:
|
||||||
flatpickr "4.6.9"
|
flatpickr "4.6.9"
|
||||||
|
|
||||||
|
@ -879,6 +879,11 @@ minimist@^1.2.5:
|
||||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
|
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
|
||||||
integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
|
integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
|
||||||
|
|
||||||
|
minisearch@^6.2.0:
|
||||||
|
version "6.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/minisearch/-/minisearch-6.2.0.tgz#310b50508551f22e10815f5baedeeeded03a6b5d"
|
||||||
|
integrity sha512-BECkorDF1TY2rGKt9XHdSeP9TP29yUbrAaCh/C03wpyf1vx3uYcP/+8XlMcpTkgoU0rBVnHMAOaP83Rc9Tm+TQ==
|
||||||
|
|
||||||
ms@2.1.2:
|
ms@2.1.2:
|
||||||
version "2.1.2"
|
version "2.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
|
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue