From 2789a3ccf4c3ff859f876df5e2907348a9187b91 Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Mon, 29 Nov 2021 18:04:23 +0100 Subject: [PATCH] clean up codebase --- packages/nextra-theme-docs/src/footer.js | 2 +- .../src/{ => icons}/arrow-right.js | 0 .../src/{discord-icon.js => icons/discord.js} | 8 ++--- .../src/{github-icon.js => icons/github.js} | 0 packages/nextra-theme-docs/src/index.js | 34 ++++++------------- packages/nextra-theme-docs/src/navbar.js | 4 +-- packages/nextra-theme-docs/src/sidebar.js | 30 +++++++++++++--- packages/nextra-theme-docs/src/toc.js | 14 ++++---- .../src/utils/get-headings.js | 5 +++ .../nextra-theme-docs/src/utils/get-title.js | 6 ++++ 10 files changed, 61 insertions(+), 42 deletions(-) rename packages/nextra-theme-docs/src/{ => icons}/arrow-right.js (100%) rename packages/nextra-theme-docs/src/{discord-icon.js => icons/discord.js} (95%) rename packages/nextra-theme-docs/src/{github-icon.js => icons/github.js} (100%) create mode 100644 packages/nextra-theme-docs/src/utils/get-headings.js create mode 100644 packages/nextra-theme-docs/src/utils/get-title.js diff --git a/packages/nextra-theme-docs/src/footer.js b/packages/nextra-theme-docs/src/footer.js index 02349f09c1..0ebd671e04 100644 --- a/packages/nextra-theme-docs/src/footer.js +++ b/packages/nextra-theme-docs/src/footer.js @@ -4,7 +4,7 @@ import Link from 'next/link' import { useRouter } from 'next/router' import parseGitUrl from 'parse-git-url' -import ArrowRight from './arrow-right' +import ArrowRight from './icons/arrow-right' import renderComponent from './utils/render-component' const NextLink = ({ route, title, isRTL }) => { diff --git a/packages/nextra-theme-docs/src/arrow-right.js b/packages/nextra-theme-docs/src/icons/arrow-right.js similarity index 100% rename from packages/nextra-theme-docs/src/arrow-right.js rename to packages/nextra-theme-docs/src/icons/arrow-right.js diff --git a/packages/nextra-theme-docs/src/discord-icon.js b/packages/nextra-theme-docs/src/icons/discord.js similarity index 95% rename from packages/nextra-theme-docs/src/discord-icon.js rename to packages/nextra-theme-docs/src/icons/discord.js index 7e9a35426f..349fefd979 100644 --- a/packages/nextra-theme-docs/src/discord-icon.js +++ b/packages/nextra-theme-docs/src/icons/discord.js @@ -1,4 +1,4 @@ -import React from "react"; +import React from 'react' const DiscordIcon = ({ height = 40 }) => { return ( @@ -16,7 +16,7 @@ const DiscordIcon = ({ height = 40 }) => { fill="currentColor" /> - ); -}; + ) +} -export default DiscordIcon; +export default DiscordIcon diff --git a/packages/nextra-theme-docs/src/github-icon.js b/packages/nextra-theme-docs/src/icons/github.js similarity index 100% rename from packages/nextra-theme-docs/src/github-icon.js rename to packages/nextra-theme-docs/src/icons/github.js diff --git a/packages/nextra-theme-docs/src/index.js b/packages/nextra-theme-docs/src/index.js index 9f3ad40891..74e2775e74 100644 --- a/packages/nextra-theme-docs/src/index.js +++ b/packages/nextra-theme-docs/src/index.js @@ -3,11 +3,8 @@ import { useRouter } from 'next/router' import 'focus-visible' import { SkipNavContent } from '@reach/skip-nav' import { ThemeProvider } from 'next-themes' -import innerText from 'react-innertext' import cn from 'classnames' -import normalizePages from './utils/normalize-pages' - import Head from './head' import Navbar from './navbar' import Footer, { NavLinks } from './footer' @@ -18,8 +15,9 @@ import { ActiveAnchor } from './misc/active-anchor' import defaultConfig from './misc/default.config' import { getFSRoute } from './utils/get-fs-route' import { MenuContext } from './utils/menu-context' - -const titleType = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] +import normalizePages from './utils/normalize-pages' +import { getHeadings } from './utils/get-headings' +import { getTitle } from './utils/get-title' function useDirectoryInfo(pageMap) { const { locale, defaultLocale, asPath } = useRouter() @@ -58,13 +56,6 @@ function Body({ meta, config, toc, filepathWithName, navLinks, children }) { ) } -const getHeadline = (titles, meta) => { - const titleEl = titles.find(child => child.type === 'h1') - const headline = - meta.title || (titleEl ? innerText(titleEl.props.children) : 'Untitled') - return headline -} - const Layout = ({ filename, config: _config, pageMap, meta, children }) => { const { route, locale } = useRouter() @@ -85,13 +76,9 @@ const Layout = ({ filename, config: _config, pageMap, meta, children }) => { const content = children.type() const filepath = route.slice(0, route.lastIndexOf('/') + 1) const filepathWithName = filepath + filename - const titles = - content.props.children.filter?.(child => titleType.includes(child.type)) || - [] - const headline = getHeadline(titles, meta) - const anchors = titles - .filter(child => child.props && (config.floatTOC || child.type === 'h2')) - .map(child => child.props.children) + const headings = getHeadings(content.props.children) + const title = meta.title || getTitle(headings) || 'Untitled' + const isRTL = useMemo(() => { if (!config.i18n) return config.direction === 'rtl' || null const localeConfig = config.i18n.find(l => l.locale === locale) @@ -103,7 +90,7 @@ const Layout = ({ filename, config: _config, pageMap, meta, children }) => { if (activeType === 'nav') { return ( - + { flatDirectories={flatDirectories} fullDirectories={directories} mdShow={false} + headings={headings} config={config} /> { // Docs layout return ( - + { directories={docsDirectories} flatDirectories={flatDirectories} fullDirectories={directories} - anchors={config.floatTOC ? [] : anchors} + headings={headings} config={config} /> } + toc={} navLinks={ + headings + .filter(child => child.props && child.type === 'h2') + .map(child => child.props.children), + [headings] + ) + const { menu } = useMenuContext() useEffect(() => { if (menu) { document.body.classList.add('overflow-hidden') @@ -170,10 +177,23 @@ export default function Sidebar({ ) : null)} - + - + diff --git a/packages/nextra-theme-docs/src/toc.js b/packages/nextra-theme-docs/src/toc.js index b0d33702ae..58e3892b88 100644 --- a/packages/nextra-theme-docs/src/toc.js +++ b/packages/nextra-theme-docs/src/toc.js @@ -19,23 +19,23 @@ const indent = level => { return {} } -export default function ToC({ titles }) { +export default function ToC({ headings }) { const slugger = new Slugger() const activeAnchor = useActiveAnchor() return ( - {titles ? ( + {headings ? ( - {titles - .filter(item => item.type !== 'h1') - .map(item => { - const text = innerText(item.props.children) || '' + {headings + .filter(heading => heading.type !== 'h1') + .map(heading => { + const text = innerText(heading.props.children) || '' const slug = slugger.slug(text) const state = activeAnchor[slug] return ( - + titleType.includes(child.type)) || [] +} diff --git a/packages/nextra-theme-docs/src/utils/get-title.js b/packages/nextra-theme-docs/src/utils/get-title.js new file mode 100644 index 0000000000..8c04e9e8b9 --- /dev/null +++ b/packages/nextra-theme-docs/src/utils/get-title.js @@ -0,0 +1,6 @@ +import innerText from 'react-innertext' + +export function getTitle(headings) { + const titleEl = headings.find(child => child.type === 'h1') + return titleEl ? innerText(titleEl.props.children) : null +}