diff --git a/.github/docs-scraper/docs.rsshub.app.json b/.github/docs-scraper/docs.rsshub.app.json new file mode 100644 index 000000000..6cc1f5bf8 --- /dev/null +++ b/.github/docs-scraper/docs.rsshub.app.json @@ -0,0 +1,53 @@ +{ + "index_uid": "rsshub-staging", + "sitemap_urls": ["https://docs.rsshub.app/sitemap.xml"], + "start_urls": ["https://docs.rsshub.app"], + "selectors": { + "lvl0": { + "selector": "", + "global": true, + "default_value": "Routes" + }, + "lvl1": ".content h1", + "lvl2": ".content h2", + "lvl3": ".content h3", + "lvl4": ".content h4", + "lvl5": ".content h5", + "text": ".content p, .content .params, .content table, .content p code" + }, + "strip_chars": " .,;:#", + "scrap_start_urls": false, + "min_indexed_level": 1, + "js_render": false, + "js_wait": 2, + "custom_settings": { + "displayedAttributes": [ + "hierarchy_radio_lvl1", + "hierarchy_radio_lvl2", + "hierarchy_radio_lvl3", + "hierarchy_radio_lvl4", + "hierarchy_radio_lvl5", + "hierarchy_lvl0", + "hierarchy_lvl1", + "hierarchy_lvl2", + "hierarchy_lvl3", + "hierarchy_lvl4", + "hierarchy_lvl5", + "hierarchy_lvl6", + "anchor", + "url", + "content" + ], + "searchableAttributes": [ + "hierarchy_lvl2", + "hierarchy_lvl3", + "hierarchy_lvl4", + "anchor", + "content", + "hierarchy_lvl5", + "hierarchy_lvl1" + ], + "sortableAttributes": ["anchor"] + }, + "selectors_exclude": [".badge", ".author", ".tip"] +} diff --git a/.github/workflows/docs-search-index.yml b/.github/workflows/docs-search-index.yml new file mode 100644 index 000000000..8d5fe7918 --- /dev/null +++ b/.github/workflows/docs-search-index.yml @@ -0,0 +1,54 @@ +name: Update meilisearch index + +on: + push: + branches: + - master + paths: + - '.github/workflows/docs-search-index.yml' + - '.github/docs-scraper/docs.rsshub.app.json' + - 'src/**' + workflow_dispatch: {} + schedule: + - cron: '44 1 * * 1' + +permissions: + contents: read + +concurrency: + group: docs-search-index + cancel-in-progress: true + +jobs: + scrape-docs: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Pull image + run: docker pull getmeili/docs-scraper + - name: Wait for Netlify to finish + if: github.event_name == 'push' && github.run_attempt == 1 + run: sleep 1m + - name: Run docs-scraper + timeout-minutes: 30 + env: + HOST_URL: ${{ vars.MEILISEARCH_HOST_URL }} + API_KEY: ${{ secrets.MEILISEARCH_API_KEY }} + CONFIG_FILE_PATH: ${{ github.workspace }}/.github/docs-scraper/docs.rsshub.app.json + run: | + docker run -t --rm \ + -e MEILISEARCH_HOST_URL=$HOST_URL \ + -e MEILISEARCH_API_KEY=$API_KEY \ + -v $CONFIG_FILE_PATH:/docs-scraper/config.json \ + getmeili/docs-scraper pipenv run ./docs_scraper config.json + - name: Swap index + env: + HOST_URL: ${{ vars.MEILISEARCH_HOST_URL }} + API_KEY: ${{ secrets.MEILISEARCH_API_KEY }} + run: | + curl \ + -X POST $HOST_URL/swap-indexes \ + -H "Authorization: Bearer $API_KEY" \ + -H 'Content-Type: application/json' \ + -d '[{"indexes":["rsshub","rsshub-staging"]}]' diff --git a/.vitepress/config/shared.ts b/.vitepress/config/shared.ts index 9383de697..db91263a3 100644 --- a/.vitepress/config/shared.ts +++ b/.vitepress/config/shared.ts @@ -33,6 +33,9 @@ export const shared = defineConfig({ dark: 'github-dark', }, }, + sitemap: { + hostname: 'https://docs.rsshub.app', + }, head: [ ['meta', { property: 'og:image', content: 'https://docs.rsshub.app/logo.png' }], @@ -57,23 +60,6 @@ export const shared = defineConfig({ outline: { level: [2, 3], }, - search: { - provider: 'local', - options: { - miniSearch: { - options: { - extractField: (document, fieldName) => { - if (fieldName !== 'text' || document.id.includes('/routes/')) { - return document[fieldName] - } - }, - }, - searchOptions: { - boost: { title: 1, text: 0.1, titles: 1 } - } - } - } - }, // https://vitepress.dev/reference/default-theme-config nav: [ diff --git a/.vitepress/theme/index.ts b/.vitepress/theme/index.ts index 093471018..db452307e 100644 --- a/.vitepress/theme/index.ts +++ b/.vitepress/theme/index.ts @@ -1,7 +1,8 @@ // https://vitepress.dev/guide/custom-theme -import { h } from 'vue' +import { h, onMounted } from 'vue' import type { Theme } from 'vitepress' import DefaultTheme from 'vitepress/theme' +import "meilisearch-docsearch/css"; import './style.css' import Route from './components/Route.vue' import Site from './components/Site.vue' @@ -10,9 +11,31 @@ import InstanceList from './components/InstanceList.vue' export default { extends: DefaultTheme, + setup() { + onMounted(() => { + // For SSR Compatibility https://vitepress.dev/guide/ssr-compat#ssr-compatibility + import('meilisearch-docsearch').then((docsearch) => { + docsearch.default({ + container: "#docsearch", + host: "https://meilisearch.rsshub.app", + apiKey: "375c36cd9573a2c1d1e536214158c37120fdd0ba6cd8829f7a848e940cc22245", + indexUid: "rsshub", + }); + }) + }) + }, Layout: () => { return h(DefaultTheme.Layout, null, { // https://vitepress.dev/guide/extending-default-theme#layout-slots + 'nav-bar-content-before': () => h( + 'span', + { id: 'content-before' }, + [ + h('span', { + id: 'docsearch' + }), + ] + ), }) }, enhanceApp({ app, router, siteData }) { diff --git a/.vitepress/theme/style.css b/.vitepress/theme/style.css index 765a66164..876838ce5 100644 --- a/.vitepress/theme/style.css +++ b/.vitepress/theme/style.css @@ -140,13 +140,26 @@ } /** - * Component: Algolia + * Component: meilisearch * -------------------------------------------------------------------------- */ -.DocSearch { - --docsearch-primary-color: var(--vp-c-brand-1) !important; +:root { + --docsearch-primary-color: var(--vp-c-brand-2); +} + +#content-before { + display: flex; + justify-content: space-between; +} + +#docsearch { + margin: auto 1em; } + +/** + * Component: Other + * -------------------------------------------------------------------------- */ :root { --vp-c-text-1: #000; --vp-c-text-2: #454545; @@ -189,4 +202,4 @@ img { display: inline-block; -} \ No newline at end of file +} diff --git a/package.json b/package.json index 995ac347f..653bacbd2 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "type": "module", "devDependencies": { "markdown-it": "14.0.0", + "meilisearch-docsearch": "0.6.0", "vitepress": "1.0.0-rc.45", "vue": "3.4.21" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 74f855f5e..9ca815d0c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ devDependencies: markdown-it: specifier: 14.0.0 version: 14.0.0 + meilisearch-docsearch: + specifier: 0.6.0 + version: 0.6.0 vitepress: specifier: 1.0.0-rc.45 version: 1.0.0-rc.45(@algolia/client-search@4.22.1)(search-insights@2.13.0) @@ -778,6 +781,14 @@ packages: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true + /cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: true + /csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} dev: true @@ -873,6 +884,23 @@ packages: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} dev: true + /meilisearch-docsearch@0.6.0: + resolution: {integrity: sha512-Pq61rCNIrwxMZ2vGc7ZkPUJSv92hPz1xPqy/jbDXmmA5GLSje6n98dotiUC9TKGzeRrG7DYCNbCjjdrlyoi8Bg==} + dependencies: + meilisearch: 0.35.0 + solid-js: 1.8.5 + transitivePeerDependencies: + - encoding + dev: true + + /meilisearch@0.35.0: + resolution: {integrity: sha512-gF1I6K5/Wpe7BWfjBnG+o19y/FIpJ9HbN+byON6CB9U3uE7qc6GvwUbjKOllh7LKXQVVxH/kCu7Jn0ODCUwqbQ==} + dependencies: + cross-fetch: 3.1.8 + transitivePeerDependencies: + - encoding + dev: true + /minisearch@6.3.0: resolution: {integrity: sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==} dev: true @@ -887,6 +915,18 @@ packages: hasBin: true dev: true + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + /perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} dev: true @@ -944,12 +984,24 @@ packages: resolution: {integrity: sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==} dev: true + /seroval@0.12.4: + resolution: {integrity: sha512-JIsZHp98o+okpYN8HEPyI9Blr0gxAUPIGvg3waXrEMFjPz9obiLYMz0uFiUGezKiCK8loosYbn8WsqO8WtAJUA==} + engines: {node: '>=10'} + dev: true + /shiki@1.2.0: resolution: {integrity: sha512-xLhiTMOIUXCv5DqJ4I70GgQCtdlzsTqFLZWcMHHG3TAieBUbvEGthdrlPDlX4mL/Wszx9C6rEcxU6kMlg4YlxA==} dependencies: '@shikijs/core': 1.2.0 dev: true + /solid-js@1.8.5: + resolution: {integrity: sha512-xvtJvzJzWbsn35oKFhW9kNwaxG1Z/YLMsDp4tLVcYZTMPzvzQ8vEZuyDQ6nt7xDArVgZJ7TUFrJUwrui/oq53A==} + dependencies: + csstype: 3.1.3 + seroval: 0.12.4 + dev: true + /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} @@ -969,6 +1021,10 @@ packages: engines: {node: '>=4'} dev: true + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + /uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} dev: true @@ -1092,3 +1148,14 @@ packages: '@vue/server-renderer': 3.4.21(vue@3.4.21) '@vue/shared': 3.4.21 dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true diff --git a/src/index.md b/src/index.md index 1b636fe17..42d367da8 100644 --- a/src/index.md +++ b/src/index.md @@ -5,7 +5,7 @@ layout: home hero: name: "RSSHub" text: "Everything is RSSible" - tagline: 🧡 Generate a RSS/Atom/JSON feed from anything. + tagline: 🧡 Generate an RSS/Atom/JSON feed from anything. image: src: /logo.png alt: RSSHub