contentlayerdev / contentlayerdev/contentlayer

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

Aperta
#216 13 commenti 5 reazioni 0 assegnatari Vedi su GitHub
topic: markdown/mdx topic: schema
Lingua principale
TypeScript
Stelle
3.5k
Fork
192
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

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

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

L’issue non indica file di implementazione né test; inizia tracciando la pipeline di elaborazione Markdown/MDX e il modo in cui vFile.data prodotto dai plugin viene attualmente gestito. Il lavoro è completato quando questi valori vengono esposti nell’oggetto di contenuto generato insieme a frontmatter, code e _raw, con una copertura per l’esempio searchMeta.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
javascript, markdown
Ambito
tooling
Tipo di issue
Funzionalità
Difficoltà
5/5
Tempo stimato
Più di una settimana
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.