contentlayerdev / contentlayerdev/contentlayer

Provide a way to populate field values from Markdown/MDX processing pipeline

Đang mở
#216 13 bình luận 5 reaction 0 người được giao Xem trên GitHub
topic: markdown/mdx topic: schema
Ngôn ngữ chính
TypeScript
Star
3.5k
Fork
192
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

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

```js
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:

```markdown

---
title: Hello World
slug: hello-world
---
Hello World! Please say Hello!
```

Would generate a final object of:

```json
{
"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.

```js

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];
});
};
}
```

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.