Provide a way to populate field values from Markdown/MDX processing pipeline
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 35/100
- Tipo de issue
- Nueva funcionalidad
- Claridad
- Bastante claro
- Estado de actividad
- Estancado
- Stack tecnológico
- javascript, markdown
- Área
- tooling
Línea de trabajo
El issue no especifica archivos de implementación ni pruebas; empieza por seguir el flujo de procesamiento de Markdown/MDX y cómo se gestiona actualmente vFile.data producido por plugins. Se considera terminado cuando esos valores se exponen en el objeto de contenido generado junto a frontmatter, code y _raw, con cobertura para el ejemplo de searchMeta.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
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];
});
};
}
- Lenguaje dominante
- TypeScript
- Estrellas
- 3.5k
- Forks
- 192
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de contentlayerdev/contentlayer
-
Dificultad 3/5 1-2 días Aptitud para principiantes 25/100
contentlayerdev/contentlayer#506 · 84 comentarios · 47 reacciones ·
-
Poor/broken monorepo DX: can't specify .contentlayer/ output path, no docs for custom config path Abiertohelp wanted meta: never-stale needs-research
Dificultad 4/5 3-5 días Aptitud para principiantes 38/100
contentlayerdev/contentlayer#464 · 4 comentarios · 9 reacciones ·
-
State of the project Abiertometa: never-stale
Dificultad 5/5 Más de una semana Aptitud para principiantes 10/100
contentlayerdev/contentlayer#429 · 49 comentarios · 83 reacciones ·
-
meta: never-stale topic: markdown/mdx
Dificultad 4/5 3-5 días Aptitud para principiantes 42/100
contentlayerdev/contentlayer#421 · 4 reacciones ·
-
meta: never-stale needs-research topic: schema
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
contentlayerdev/contentlayer#420 ·
Todos los issues de contentlayerdev/contentlayer
Issues similares
-
blocklist removal
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
MetaMask/eth-phishing-detect#296544 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
pastelsky/bundlephobia#1122 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
-
category/development priority/P2 scope/file-operations scope/testing type/enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
-
Enatega Customer and Rider app: Add-ons price is not visible to customer after order is placed. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100