自动为 Gatsby网站中的 Markdown 页面添加 sidebar

news/2024/5/20 23:22:39/文章来源:https://blog.csdn.net/hope_worker/article/details/108078460

0 简介

我想在Gatsby网站上创建Markdown页面时自动添加侧边栏。
有一个 starter “ gatsby-gitbook-starter” 可以支持markdown文件的侧边栏,但仅支持1级。 我希望能够支持更多级别。

你可以通过下面的命令安装这个starter。

gatsby new gatsby-gitbook-starter https://github.com/hasura/gatsby-gitbook-starter

相关文档可以在这里找到 this link

1. 从 “gatsby-gitbook-starter” 学到的

1.1 如何获取 markdown files 相关的数据

// in /src/templates/docs.js
export const pageQuery = graphql`query($id: String!) {site {siteMetadata {titledocsLocation}}mdx(fields: { id: { eq: $id } }) {fields {idtitleslug}bodytableOfContentsparent {... on File {relativePath}}frontmatter {metaTitlemetaDescription}}allMdx {edges {node {fields {slugtitle}}}}}
`;

tableOfContents 就是 sidebar navigation 需要的数据.
可以 GraphiQL query 来查看.
在这里插入图片描述

为了简便起见,使用下面的 sample data:


a={"tableOfContents": {"items": [{"url": "#heading-h11","title": "Heading H11"},{"url": "#heading-h12","title": "Heading H12","items": [{"url": "#heading-h2","title": "Heading H2","items": [{"url": "#heading-h3","title": "Heading H3",}]}]}] }
};
b = a.tableOfContents.items;

1.2 如何把数据转化为 component

// in /src/components/rightSidebar.jsif (item.node.tableOfContents.items) {innerItems = item.node.tableOfContents.items.map((innerItem, index) => {const itemId = innerItem.title? innerItem.title.replace(/\s+/g, '').toLowerCase(): '#';return (<ListItem key={index} to={`#${itemId}`} level={1}>{innerItem.title}</ListItem>);});}}}if (innerItems) {finalNavItems = innerItems;}});}if (finalNavItems && finalNavItems.length) {return (<Sidebar><ul className={'rightSideBarUL'}><li className={'rightSideTitle'}>CONTENTS</li>{finalNavItems}</ul></Sidebar>);} else {return (<Sidebar><ul></ul></Sidebar>);}}}

从代码我们可以看到,只支持1级 title。

2. 使用递归函数来改进

2.1 第一次尝试

定义下面的递归函数:

function items2Components(items, depth) {let res = [];for (let i = 0; i < items.length; i++) {let innerItem = items[i];const itemId = innerItem.title? innerItem.title.replace(/\s+/g, '').toLowerCase(): '#';if (items[i].items) {res.push(     <ListItem key={index} to={`#${itemId}`} level={depth}>{innerItem.title}{items2Components(innerItem.items, depth+1)}</ListItem>)} else {res.push(     <ListItem key={index} to={`#${itemId}`} level={depth}>{innerItem.title}</ListItem>)}}return res;
}

来替换 starter中原来的代码

 innerItems = item.node.tableOfContents.items.map((innerItem, index) => {const itemId = innerItem.title? innerItem.title.replace(/\s+/g, '').toLowerCase(): '#';return (<ListItem key={index} to={`#${itemId}`} level={1}>{innerItem.title}</ListItem>);});

这样可以工作,但是会有warning,而且点击后还会出现异常。

Warning: validateDOMNesting(...): <a> cannot appear as a descendant of <a>. 

这是因为’<a>’ 不支持嵌套使用, “<a> <a> <a/> </a>” 在html中是不支持的.
所以需要改变实现方式。

2.2 使用递归的方式来“拍平”嵌套的数据结构.

function items2ObjectInfo(items, res, depth) {for (let i = 0; i < items.length; i++) {var innerItem = items[i];const itemId = innerItem.title? innerItem.title.replace(/\s+/g, '').toLowerCase(): '#';if (innerItem.items) {res.push({title: innerItem.title,to: `#${itemId}`,level: depth,});items2ObjectInfo(innerItem.items, res, depth+1)} else {res.push({title: innerItem.title,to: `#${itemId}`,level: depth,});}}return res;
};

这个函数会将sample data “拍平” 成下面的样子:

 [{"to": "#heading-h11","title": "Heading H11","level": "1"},{"url": "#heading-h12","title": "Heading H12""level": "1"},{"url": "#heading-h2","title": "Heading H2""level": "2"},{"url": "#heading-h3","title": "Heading H3","level": "3"}]

然后我们可以将拍平后的数据来创建components.

items2ObjectInfo(item.node.tableOfContents.items, listLinkInfo);console.log(listLinkInfo);innerItems = listLinkInfo.map((item, index) => {return (<ListItem key={index} to={item.to} level={item.level}>{item.title}</ListItem>)});

2.3 为sidebar添加样式

高level的标题字体更大。

function calcFontsizeByLevel(level) {const maxSize = 18;let fontSize = maxSize - level*1;if (fontSize < 5) {fontSize = 5;}return fontSize;
}const ListItem = (props) => {return (<li><a style={{fontSize: calcFontsizeByLevel(props.level)}} href={props.to} {...props}>{props.children}</a></li>);
};

最终的结果是像下面这样的:

在这里插入图片描述

medium 链接

这篇文章的英文版发到了medium上。链接地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_884619.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在标题栏title前添加网站logo?

第一种方法&#xff1a;据说在网站根目录下放着我们的ico型logo&#xff0c;命名为favicon.ico&#xff0c;浏览器会自动去找到并显示。试了试&#xff0c;在firefox23和ie8下都没有成功。 第二种方法&#xff1a;添加代码&#xff0c;如下&#xff1a; 1 <link rel"sh…

阿里云域名解析完成后仍然无法通过域名正常访问网站

通过阿里云进行域名解析后&#xff0c;仍然无法正常访问网站的解释&#xff0c;与解决办法 1、域名解析完成后&#xff0c;未在主机管理页面进行域名绑定。 域名绑定流程&#xff1a; 进入阿里云虚拟主机页面&#xff0c;找到相应的虚拟主机&#xff0c;点击后面的管理。 点击…

web页面性能优化以及SEO

前言&#xff1a; 在同样的网络环境下&#xff0c;两个同样能满足你的需求的网站&#xff0c;一个“Duang”的一下就加载出来了&#xff0c;一个纠结了半天才出来&#xff0c;你会选择哪个&#xff1f;研究表明&#xff1a;用户最满意的打开网页时间是2-5秒&#xff0c;如果等…

wordpress建站优化技巧

wordpress是一款开源的PHP博客程序&#xff0c;可以有大量的开源主题与插件&#xff0c;使用液非常简单&#xff0c;wordpress在全球范围应用都十分广泛&#xff0c;根据Pingdom.com最近发布的一份数据&#xff0c;2013年在Technorati排名前100的博客&#xff08;Technorati为一…

个人网站添加百度统计

网站如何添加百度统计&#xff1f; 上线网站后&#xff0c;需要进行网站的维护和及时观察网站的流量等方面去了解自己的网站&#xff0c;百度统计工具可以查看多少访客访问了网站&#xff0c;以及分析流量来源等情况。那应该如何为网站添加百度统计工具呢&#xff1f; 1、注册…

[转]50个c/c++源代码网站

[转]50个c/c源代码网站 Posted on 2010-03-05 14:59 feisky 阅读(1182) 评论(2) 编辑 收藏 所属分类: C/C C/C是最主要的编程语言。这里列出了50名优秀网站和网页清单&#xff0c;这些网站提供c/c源代码 。这份清单提供了源代码的链接以及它们的小说明。我已尽力包括最佳的C/C…

32个不应该做的JOOMLA SEO优化手法

32个不应该做的JOOMLA SEO优化手法 隐藏元件的方式有很多&#xff0c;這也是最常被誤用的SEO手法&#xff0c;但也是Google抓最兇的部分&#xff0c;所以你要避免&#xff1a; 1. 在白背景上使用白色文字 2. 藏字在圖的下方 3. 利用CSS隐藏文字 4. 用小字來建立鏈接以及增加…

Win7部署asp.net网站问题---HTTP 错误 500.0 - Internal Server Error 调用 LoadLibraryEx 失败...

在IIS上部署网站时遇到这样一个问题&#xff1a;“ HTTP 错误 500.0 - Internal Server Error调用 LoadLibraryEx 失败&#xff0c;在 ISAPI 筛选器 "C:\Program Files (x86)\Sybase\PowerDynamo\win32\dyisa03.dll" 上”。 具体的问题展示如图&#xff1a; 通过网络…

高效在线抠图网站

介绍几款高效的抠图网站&#xff0c;给那些不想动手的。 1、怪兽抠图 链接: https://818ps.com/koutu/ 这是一个国内的站点&#xff0c;抠图后的图片不需要登录就能下载。 点击 上传图片 上传你需要抠图的素材。 用蓝色画出想保留的区域 用红色画出想要抠除的区域 - 简单…

VS2013 发布网站时文件丢失解决办法

网站发布时&#xff0c;发现一些模板文件没有复制到文件夹中解决办法&#xff1a;选择文件打开属性窗口找到生成操作&#xff0c;选项选择“内容”&#xff0c;然后重新发布 转载于:https://www.cnblogs.com/linyongqin/articles/6393166.html

常用网站链接

IEEE802标准下载 Browse Standards | Get Program | IEEE Xplorehttps://ieeexplore.ieee.org/browse/standards/get-program/page/series?id68

WordPress使用七牛CDN加速网站教程

七牛是一个著名的云加速公司&#xff0c;国内很多大网站都在使用&#xff0c;而且对新用户会有不少的免费额度&#xff0c;如果网站不是很大的话完全够用。 今天waitig就给大家介绍一下如何使用七牛来给WordPress加速。 注册 首先去七牛注册一个账号&#xff0c;可以直接点此注…

网站进行SEO优化时如何做好布局内链?

5月12日SEO经验 昨日和杭州西湖区某企业SEO总监谈我们在优化中如何让蜘蛛有效抓取,谈到中到底站内链接布局有多重要?想必每一个专业的网站优化人员都知道,网站的每一个页面就像一张蜘蛛网一样,良好的站内链接能很好的吸引蜘蛛抓取,而且网站内链做的好,在一定程度上是可以取代外…

网站进行SEO优化是什么样的什么样的网站页面才算是高质量的页面?

现在很多SEOer都在追求权重,但权重的获取往往离不开高质量的页面,很多人把目光重点放在了首页的页面,从而忽视内页的优化,也是比较不合理的,那么在搜索引擎的认识之中,什么样的页面才算是高质量的页面呢?下面开铭网络就给大家来分享分享个人的见解。 开铭网络认为,搜索引擎判…

新站建设之初如何规划seo?新站seo这些策略和方法很关键

俗话说&#xff0c;早起的鸟儿有虫吃&#xff0c;网站优化工作也一样。勤劳的人会得到比别人更多的好处。然而&#xff0c;许多事情不是靠勤奋来实现的。我们需要注意方法和策略。如果要进行网站优化&#xff0c;在网站上线初期就要有明确的优化思路和明确的目标。从网站建设的…

新站建设之初如何规划seo?新站seo这些策略和方法很关键

俗话说&#xff0c;早起的鸟儿有虫吃&#xff0c;网站优化工作也一样。勤劳的人会得到比别人更多的好处。然而&#xff0c;许多事情不是靠勤奋来实现的。我们需要注意方法和策略。如果要进行网站优化&#xff0c;在网站上线初期就要有明确的优化思路和明确的目标。从网站建设的…

电子行业为什么需要做网站seo优化?

搜索引擎是用户查找信息的重要手段。通常,用户会通过百度搜索找到他们想要的信息,这是网络的主要驱动力。SEO是最大限度地提高我们网站在搜索引擎上的曝光率,让别人在数亿搜索结果中首先看到我们。然后就有可能产生订单或点击我们的广告来产生利润。因此,对于一个希望盈利的网站…

网站seo优化怎么做能快速提高关键词排名?网站seo流量提升策略和方案步骤分享

对于任何一个营销推广方式&#xff0c;实际上在某种程度上&#xff0c;都存在一定的基础流程&#xff0c;而搜索引擎优化也不例外&#xff0c;我们在做企业网站SEO排名的时候&#xff0c;总是有一个常用的策略&#xff0c;因此&#xff0c;如果你是刚接触SEO行业&#xff0c;我…

react+antd+nginx网站前端搭建(从零开始的开发者记录:一)

react项目创建 基本工具安装 sudo apt-get install -y npm sudo npm install -g yarn create-react-app创建react项目 create-react-app react-demo cd react-demo npm run start自动启动浏览器后可以看到 npm的默认端口为3000&#xff0c;若已被占用&#xff0c;则向后寻找…

如何快速构建网站chatgpt插件

在本文中&#xff0c;我们将一步一步地探索并构建一个名为"AI Prompt Testing"的项目。该项目是一个网站插件&#xff0c;旨在帮助网站生成一个ChatGPT提示测试题&#xff0c;以巩固当前网页的内容。 1、抽象提取 这个网站chatgpt插件大概的效果&#xff0c;类比的…