您是否需要一块代码来动态地从Markdwon中提取标题,描述或前材,或者您只是想知道它是如何完成的?
本教程向您展示了如何有效地进行并逐步进行。
只给我代码:
const extractMetadataFromMarkdown = (markdown) => {
const characterBetweenGroupedHyphens = /^---([\s\S]*?)---/;
const metadataMatched = markdown.match(characterBetweenGroupedHyphens);
const metadata = metadataMatched[1];
if (!metadata) {
return {};
}
const metadataLines = metadata.split("\n");
const metadataObject = metadataLines.reduce((accumulator, line) => {
const [key, ...value] = line.split(":").map((part) => part.trim());
if (key)
accumulator[key] = value[1] ? value.join(":") : value.join("");
return accumulator;
}, {});
return metadataObject;
};
现在,让我们逐步解释一切。
步骤1:声明一个名为“ extractmark decondermetadata”的函数
const extractMarkdownMetadata = markdown => {
// The rest of the code will go here
};
extractMarkdownMetadata
以markdwon
为论点。假设我们要使用的降价是:
`---
title: how to get things done
description: this is greate
tags: money, income, coding
conver_image: ayobami.jpg
---
This is the main body of the article.`
步骤2:写一个匹配---
和---
中的任何内容
const artionbetweengroupedhyphens =/^---([\ s \ s]*?)----/;
显然,您有上面的正则目的,但是您是否了解其每个单元的作用?让我解释一下:
/: indicates we start writing a regex
^: means the matching only matches the beginning of a string
---: matches three hyphens
\s : matches whitespace characters (enter, tab and more)
\S : matches non-whitespace characters (texts, numbers and symbols)
[\s\S]: it matches a white or non-white space character
*: matches the preceding element zero or more times, in this case, it operates on [\s\S],
?: matches the preceding element zero or one time. So "*?" makes the matching lazy.
([\s\S]*?): () is a group capturing that remembers/keeps the string in the bracket as a group.
---: matches three ending hyphens
/: indicates the end of the regex
步骤3:从字符串中提取trantmeta或元数据
const metadataMatched = markdown.match(characterBetweenGroupedHyphens);
const metadata = metadataMatched[1];
别忘了,markdwon
是一连串作为参数传递给该函数的降价,现在,我们从中提取元数据。如果我们委托。
"title: how to get things done
description: this is greate
tags: money, income, coding
conver_image: ayobami.jpg"
您可能想问,为什么我们要用1
评估元数据匹配[1],为什么不0或其他任何数字?
这是因为正则表达式匹配了包括--- and ---
的字符串,它是数组的第一个元素,但是组捕获的组有助于选择( and )
之间的文本为metadataMatched
的第二个元素。因此,我们使用1
访问它。
步骤4:将元数据串分为数组的线条
if (!metadata) {
return {};
}
const metadataLines = metadata.split("\n");
如果metadata
是虚假的,我们返回一个空对象,然后将metadata
字符串拆分为一系列字符串。
步骤5:将行转换为对象
我们将元数据分成一系列字符串时,metadataLines
应该看起来如下:
[
"title: how to get things done",
"description: this is greate",
"tags: money, income, coding",
"conver_image: ayobami.jpg"
]
现在,让我们将所有内容转换为对象。
// Use reduce to accumulate the metadata into an object
const metadata = metadataLines.reduce((accumulator, line) => {
// Split the line into key-value pairs
const [key, ...value] = line.split(":").map(part => part.trim());
if(key) {
accumulator[key] = value[1] ? value.join(":") : value.join("");
}
return accumulator;
}, {});
是的,这就是减少功能的作用。
const [key, ...value] = line.split(":").map(part => part.trim());
该部分将每一行分为半彩色(:)。您应该已经意识到,由于其余操作员(...),值是一个数组。我们这样做的是,如果Semi-Colon也被用作value
的一部分key-value
对,例如“标题:如何完成事情:最佳方法:最佳方法”。
在这种情况下,将第一个半颜色之前的唯一字符串视为关键,而其余的则被认为是值。
if(key) {
accumulator[key] = value[1] ? value.join(":") : value.join("");
}
return accumulator;
然后,我们将密钥和值转换为key-value
对,然后将其放入accumulator
。请记住,accumulator
是reduce
回调函数的参数。
value[1] ? value.join(":") : value.join("")
我们检查了值是否是具有多个Elment的数组,如果是的,则数组元素与“:”以及具有元素的连接;我们将其变成一个字符串。
如果您查看完整的功能,则应看到下面看起来像:
return accumulator;
}, {});
我们将一个空对象作为累加器传递给reduce method
,因为累加器默认是一个数组。
现在,最终结果应该看起来像:
{
title: "how to get things done",
description: "this is greate",
tags: "money, income, coding",
"conver_image: "ayobami.jpg"
}
最后,我们现在可以从JavaScript中提取前磨牙或元数据。你在等什么?去使用您现在学到的任何东西。
很快见!
还有一件事
您想解决内容或编程中的任何业务问题吗?让我们谈谈。随时在Ayobami Ogundiran上的Twitter上与我联系