最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

unified如何處理markdown解析器詳解

 更新時(shí)間:2023年01月28日 09:11:07   作者:kukiiu  
這篇文章主要為大家介紹了unified如何處理markdown解析器詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

unified是什么

unified是用于文檔處理的生態(tài)系統(tǒng),核心包提供了文檔處理的流程控制,具體功能由生態(tài)系統(tǒng)中各個(gè)插件提供。例如我們?nèi)绻枰幚韒arkdown,就需要使用markdown處理相關(guān)的插件。當(dāng)然除了markdwon以外,還提供了處理HTML、JSX等的插件。其良好的擴(kuò)展能力能讓我們很方便的在解析文檔過程中添加各種新功能。

如果我們遇到了需要處理markdown文檔、markdown轉(zhuǎn)HTML、HTML轉(zhuǎn)markdown等操作,那么可以嘗試使用unified來作為解析器。

unified生態(tài)簡(jiǎn)介

上面說到unified除了用于解析markdown外,還有各種各樣的插件用于不同類型的文檔解析。

unified主要有以下四個(gè)生態(tài)系統(tǒng):

  • remark — Markdown生態(tài)
  • rehype — HTML生態(tài)
  • retext — 自然語(yǔ)言生態(tài)
  • redot — dot語(yǔ)言繪圖生態(tài)

每個(gè)生態(tài)系統(tǒng)下面都有用于處理各自文檔類型的插件,以remark生態(tài)來說,如常用有以下插件:

  • remark-parse - 用于將markdown字符串轉(zhuǎn)換為語(yǔ)法樹。通常來講處理markdown都會(huì)首先用到這個(gè)插件,后續(xù)的插件會(huì)根據(jù)業(yè)務(wù)場(chǎng)景增刪或替換語(yǔ)法樹內(nèi)容。
  • remark-stringify - 用于將markdown語(yǔ)法樹轉(zhuǎn)換為markdown字符串,是remark-parse的逆過程,經(jīng)過處理后的語(yǔ)法樹可通過該插件恢復(fù)成為markdown輸出。
  • remark-frontmatter - 用于處理markdown的‘元信息’,frontmatter是一種在文檔頭部用于備注元信息的格式,通常我們用于配置該markdown的基本屬性如標(biāo)題、作者、標(biāo)簽等,這個(gè)插件可以幫助我們提取這些信息并轉(zhuǎn)成結(jié)構(gòu)化對(duì)象。

工作原理

unified工作流程由三個(gè)階段組成:

| ............................... process ....................................... |
| .......... 解析(parse) ... | ... 處理(run) ... | ... 序列化(stringify) ..........|
                  +--------+                     +----------+
        Input ->- | Parser | ->- Syntax Tree ->- | Compiler | ->- Output
                  +--------+          |          +----------+
                                      X
                                      |
                               +--------------+
                               | Transformers |
                               +--------------+

Parse

該階段用于將Markdown, HTML, 或其他格式文檔轉(zhuǎn)換為抽象語(yǔ)法樹(AST),基于語(yǔ)法樹可以讓程序更容易處理非結(jié)構(gòu)化文檔。常用的語(yǔ)法樹有以下幾種

remark-parse插件就是在該階段工作。

Transform

該階段用于根據(jù)業(yè)務(wù)場(chǎng)景處理AST,是整個(gè)流程的核心階段,生態(tài)中大部分插件及我們自定義的插件大都運(yùn)行在這個(gè)階段。當(dāng)然這個(gè)階段是可選的,沒有這個(gè)階段也能運(yùn)行,但是沒有太大意義。remark-frontmatter插件就是在這個(gè)階段工作。

還有一類稱為橋接(Bridge)的插件也是運(yùn)行在這個(gè)階段,這類插件用于不同結(jié)構(gòu)的AST相互轉(zhuǎn)換。例如我們需要將處理后的Markdown轉(zhuǎn)換為HTML,就需要將mdast轉(zhuǎn)換為hast,常見的幾種Bridge插件有:

Stringify

該階段用于將AST序列化為字符串輸出。 remark-stringify插件就是在這個(gè)階段工作。

牛刀小試

環(huán)境搭建

安裝依賴

npm install unified remark-parse remark-stringify remark-frontmatter js-yaml

編寫運(yùn)行代碼

// index.js
const unified = require('unified')
console.log(unified)

運(yùn)行

node index.js

報(bào)錯(cuò)

處理ESM類型包

由于unified使用的是ESM方式打包,而我們通常寫的node代碼用CommonJS方式在這里是無法正常運(yùn)行的,所以我們需要使用ESM的方式來編寫運(yùn)行代碼。

  • 首先將index.js改名為index.mjs(使用package.json配置也行,這里不舉例了)
  • 將引入方式改為ESM的import
// index.mjs
// 由于unified沒有導(dǎo)出default,這里要用{}括起來
import { unified } from 'unified'
console.log(unified)
  • 運(yùn)行
node index.mjs

可以看到已經(jīng)可以正常運(yùn)行,基本運(yùn)行環(huán)境就完成了。

最簡(jiǎn)用法

修改運(yùn)行文件

import { unified } from 'unified'
import remarkParse from 'remark-parse'
import remarkStringify from 'remark-stringify'
// 初始化一個(gè)unified解析器
const res = unified()
    // 使用Markdown解析器將文本轉(zhuǎn)為AST
    .use(remarkParse)
    // 將MarkdownAST轉(zhuǎn)為字符串
    .use(remarkStringify)
    // 開始同步執(zhí)行解析
    .processSync('# hello unified')
console.log(res)

這個(gè)例子僅是最基礎(chǔ)的運(yùn)行沒有什么實(shí)際功能,運(yùn)行結(jié)果:

加載文檔meta

import { unified } from 'unified'
import remarkParse from 'remark-parse'
import remarkFrontmatter from 'remark-frontmatter'
import remarkStringify from 'remark-stringify'
import yaml from 'js-yaml'
const res = unified()
    .use(remarkParse)
    // 添加解析yaml的插件,會(huì)將具有yaml塊標(biāo)志(默認(rèn)為---)的文檔塊解析成為yaml類型節(jié)點(diǎn),
    .use(remarkFrontmatter, ['yaml'])
    // 添加一個(gè)自定義插件來處理yaml類型節(jié)點(diǎn)
    .use(() => (tree, vFile) => {
        console.log(tree)
        // unist-util-visit 提供了更多便捷訪問AST的工具,這里我們先簡(jiǎn)單獲取
        const node = tree.children.find(n => n.type == 'yaml')
        if(node) {
            // 使用yaml解析器解析yaml格式字符串
            const meta = yaml.load(node.value)
            // { title: 'I AM TITLE', tags: [ 'unified', 'good' ] }
            console.log(meta)
            // 賦值到該文件的解析數(shù)據(jù)中返回給外部使用
            vFile.data.meta = meta
        }
    })
    .use(remarkStringify)
    .processSync(`---
title: I AM TITLE
tags:
    - unified
    - good
---
# hello unified'
`)
console.log(res)

從打印結(jié)果可以看到,經(jīng)過remark-frontmatter處理后,被---標(biāo)志包含的文檔塊被轉(zhuǎn)換成了yaml類型的節(jié)點(diǎn),我們就可以方便的基于這個(gè)節(jié)點(diǎn)來解析數(shù)據(jù)了。

同時(shí)我們還自定義了一個(gè)簡(jiǎn)易的插件,用于處理yaml類型的節(jié)點(diǎn),最終結(jié)果如下所示,已經(jīng)正確提取出出來Markdown中的自定義屬性數(shù)據(jù):

一個(gè)實(shí)際使用例子:

dumi - 為組件研發(fā)而生的靜態(tài)站點(diǎn)框架

該項(xiàng)目使用了unified來將markdown轉(zhuǎn)換為react-jsx,markdown用于寫組件說明文檔,jsx用于渲染為網(wǎng)站。其中除了使用unified生態(tài)的部分插件外,dumi還實(shí)現(xiàn)了許多自定義的功能插件用于擴(kuò)展markdown的語(yǔ)法。

本章后續(xù)將逐一拆解相關(guān)代碼,深入學(xué)習(xí)unified插件開發(fā)及實(shí)戰(zhàn)運(yùn)用,更多關(guān)于unified處理markdown解析器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

以上就是unified如何處理markdown解析器詳解的詳細(xì)內(nèi)容,更多關(guān)于unified處理markdown解析器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • ECharts Canvas渲染在SVG合理運(yùn)用

    ECharts Canvas渲染在SVG合理運(yùn)用

    這篇文章主要為大家介紹了ECharts Canvas渲染在SVG合理運(yùn)用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 微信小程序中使用javascript 回調(diào)函數(shù)

    微信小程序中使用javascript 回調(diào)函數(shù)

    這篇文章主要介紹了微信小程序中使用javascript 回調(diào)函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 微信小程序 picker-view 組件詳解及簡(jiǎn)單實(shí)例

    微信小程序 picker-view 組件詳解及簡(jiǎn)單實(shí)例

    這篇文章主要介紹了微信小程序 picker-view 組件詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • 微信小程序 定位到當(dāng)前城市實(shí)現(xiàn)實(shí)例代碼

    微信小程序 定位到當(dāng)前城市實(shí)現(xiàn)實(shí)例代碼

    這篇文章主要介紹了微信小程序 定位到當(dāng)前城市實(shí)現(xiàn)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • electron渲染進(jìn)程主進(jìn)程相互傳值示例解析

    electron渲染進(jìn)程主進(jìn)程相互傳值示例解析

    這篇文章主要為大家介紹了electron渲染進(jìn)程主進(jìn)程相互傳值示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Preload基礎(chǔ)使用方法詳解

    Preload基礎(chǔ)使用方法詳解

    preload 顧名思義就是一種預(yù)加載的方式,它通過聲明向?yàn)g覽器聲明一個(gè)需要提交加載的資源,當(dāng)資源真正被使用的時(shí)候立即執(zhí)行,就無需等待網(wǎng)絡(luò)的消耗
    2020-02-02
  • javascript函數(shù)式編程基礎(chǔ)

    javascript函數(shù)式編程基礎(chǔ)

    這篇文章主要介紹了javascript函數(shù)式編程,文章有介紹函數(shù)自核,聲明式和命令式代碼,感興趣的小伙伴可以一起來閱讀下面我文章內(nèi)容
    2021-09-09
  • 微信小程序  modal詳解及實(shí)例代碼

    微信小程序 modal詳解及實(shí)例代碼

    這篇文章主要介紹了微信小程序 modal詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • JavaScript 原型與原型鏈詳情

    JavaScript 原型與原型鏈詳情

    這篇文章主要介紹了JavaScript 原型與原型鏈,JavaScript常被描述為一種基于原型的語(yǔ)言,對(duì)象以其原型為模板、從原型繼承屬性和放法。原型對(duì)象也可能擁有原型,并從中繼承屬性和方法,一層一層以此類推。這種關(guān)系常被稱為原型鏈,帶著簡(jiǎn)單的了解看看下文內(nèi)容具體介紹吧
    2021-10-10
  • VSCode多行注釋插件KoroFileHeader使用示例

    VSCode多行注釋插件KoroFileHeader使用示例

    這篇文章主要為大家介紹了VSCode多行注釋插件KoroFileHeader使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03

最新評(píng)論

交口县| 苗栗县| 广南县| 德惠市| 古蔺县| 西昌市| 永兴县| 永年县| 赤城县| 南宫市| 曲靖市| 冷水江市| 黄平县| 天全县| 南通市| 灵石县| 申扎县| 定远县| 邯郸县| 新野县| 城市| 治县。| 开鲁县| 安仁县| 南郑县| 嵊州市| 蓝山县| 扎囊县| 乌审旗| 庆云县| 兴仁县| 和平区| 梨树县| 惠安县| 临澧县| 镇安县| 金秀| 平顺县| 乌拉特中旗| 嵩明县| 白水县|