Provide a way to populate field values from Markdown/MDX processing pipeline
还没有人认领这个 Issue。
评估
- 难度
- 5/5
- 预计耗时
- 一周以上
- 新手友好度
- 35/100
- Issue 类型
- 功能
- 描述清晰度
- 基本清楚
- 活跃度
- 停滞
- 技术栈
- javascript, markdown
- 领域
- tooling
调研方向
该 issue 未指定实现文件或测试;首先跟踪 Markdown/MDX 处理流水线,以及当前如何处理插件生成的 vFile.data。完成标准是将这些值与 frontmatter、code 和 _raw 一同暴露在生成的内容对象中,并为 searchMeta 示例提供覆盖。
由索引模型根据 Issue 内容生成。
描述
Feature:
I'd like to use an MDX plugin to create programmatic meta (variable declarations) that can then be exposed in the final object contentlayer provides.
Use case:
An example of here this would be useful is generating a TOC, creating a list of unique keywords, etc.
Work around:
Use computed fields (which don't expose the the raw AST)
Related issues: https://github.com/kentcdodds/mdx-bundler/issues/169
Consider the following config structure
export default makeSource({
contentDirPath: "content",
documentTypes: [Posts, Things, People],
mdx: {
rehypePlugins: [rehypeSlug, rehypeAutolinkHeadings, searchMeta],
},
});
Where searchMeta looks at paragraph nodes of mhast, grabs a list of unique words, and adds them to the metadata as searchMeta.
A markdown file with the structure of:
---
title: Hello World
slug: hello-world
---
Hello World! Please say Hello!
Would generate a final object of:
{
"title": "Hello World",
"slug": "hello-world",
"searchMeta": ["hello", "world", "please", "say"],
"code": "().....",
"_raw": "..."
}
For sake of complete, if not ugly code, here's a working example of the plugin that adds searchMeta to the data attribute of the vFile in the rehype plugin chain.
import { visit } from "unist-util-visit";
export default function searchMeta() {
return (tree, file) => {
visit(tree, { tagName: "p" }, (node) => {
let words = node.children.reduce((collector, current) => {
if (typeof current.value === "string") {
let wordList = current.value
.split(" ")
.filter((word) => !word.includes(":"))
.map((word) => word.toLowerCase().replace(/[^a-z0-9]/gi, ""))
.filter((word) => word.length > 3);
let newCollector = new Set([...wordList, ...collector]);
return newCollector;
} else {
return collector;
}
}, new Set());
file.data.searchMeta = [...words];
});
};
}
- 主要语言
- TypeScript
- 星标
- 3.5k
- 派生
- 192
- PR 合并指标
- 30 天内没有已合并 PR
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
contentlayerdev/contentlayer 的其他 Issue
-
难度 3/5 1-2 天 新手友好度 25/100
contentlayerdev/contentlayer#506 · 84 条评论 · 47 个 reaction ·
-
Poor/broken monorepo DX: can't specify .contentlayer/ output path, no docs for custom config path 未关闭help wanted meta: never-stale needs-research
难度 4/5 3-5 天 新手友好度 38/100
contentlayerdev/contentlayer#464 · 4 条评论 · 9 个 reaction ·
-
meta: never-stale
难度 5/5 一周以上 新手友好度 10/100
contentlayerdev/contentlayer#429 · 49 条评论 · 83 个 reaction ·
-
meta: never-stale topic: markdown/mdx
难度 4/5 3-5 天 新手友好度 42/100
contentlayerdev/contentlayer#421 · 4 个 reaction ·
-
meta: never-stale needs-research topic: schema
难度 5/5 一周以上 新手友好度 25/100
contentlayerdev/contentlayer#420 ·
查看 contentlayerdev/contentlayer 的全部 Issue
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 84/100
bcgov/bc-wallet-mobile#4761 · 1 条评论 ·
-
external-issue to-triage
难度 2/5 1-3 小时 新手友好度 88/100
-
area-deployment area-integrations triage:bot-seen
难度 2/5 半天 新手友好度 86/100
-
难度 2/5 1-3 小时 新手友好度 82/100
-
refactor
难度 2/5 1-3 小时 新手友好度 84/100