如何从Markdown提取标题,描述或元数据
#javascript #教程 #markdown #frontmatter

您是否需要一块代码来动态地从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  
};

extractMarkdownMetadatamarkdwon为论点。假设我们要使用的降价是:


`---
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。请记住,accumulatorreduce回调函数的参数。

    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上与我联系