<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
unified
是用於檔案處理的生態系統,核心包提供了檔案處理的流程控制,具體功能由生態系統中各個外掛提供。例如我們如果需要處理markdown,就需要使用markdown處理相關的外掛。當然除了markdwon以外,還提供了處理HTML、JSX等的外掛。其良好的擴充套件能力能讓我們很方便的在解析檔案過程中新增各種新功能。
如果我們遇到了需要處理markdown檔案、markdown轉HTML、HTML轉markdown等操作,那麼可以嘗試使用unified來作為解析器。
上面說到unified除了用於解析markdown外,還有各種各樣的外掛用於不同型別的檔案解析。
unified主要有以下四個生態系統:
每個生態系統下面都有用於處理各自檔案型別的外掛,以remark
生態來說,如常用有以下外掛:
remark-parse
的逆過程,經過處理後的語法樹可通過該外掛恢復成為markdown輸出。frontmatter
是一種在檔案頭部用於備註元資訊的格式,通常我們用於設定該markdown的基本屬性如標題、作者、標籤等,這個外掛可以幫助我們提取這些資訊並轉成結構化物件。unified
工作流程由三個階段組成:
| ............................... process ....................................... | | .......... 解析(parse) ... | ... 處理(run) ... | ... 序列化(stringify) ..........| +--------+ +----------+ Input ->- | Parser | ->- Syntax Tree ->- | Compiler | ->- Output +--------+ | +----------+ X | +--------------+ | Transformers | +--------------+
該階段用於將Markdown, HTML, 或其他格式檔案轉換為抽象語法樹(AST),基於語法樹可以讓程式更容易處理非結構化檔案。常用的語法樹有以下幾種
remark-parse
外掛就是在該階段工作。
該階段用於根據業務場景處理AST,是整個流程的核心階段,生態中大部分外掛及我們自定義的外掛大都執行在這個階段。當然這個階段是可選的,沒有這個階段也能執行,但是沒有太大意義。remark-frontmatter
外掛就是在這個階段工作。
還有一類稱為橋接(Bridge)的外掛也是執行在這個階段,這類外掛用於不同結構的AST相互轉換。例如我們需要將處理後的Markdown轉換為HTML,就需要將mdast
轉換為hast
,常見的幾種Bridge外掛有:
該階段用於將AST序列化為字串輸出。 remark-stringify
外掛就是在這個階段工作。
安裝依賴
npm install unified remark-parse remark-stringify remark-frontmatter js-yaml
編寫執行程式碼
// index.js const unified = require('unified') console.log(unified)
執行
node index.js
報錯
由於unified
使用的是ESM
方式打包,而我們通常寫的node程式碼用CommonJS
方式在這裡是無法正常執行的,所以我們需要使用ESM
的方式來編寫執行程式碼。
index.js
改名為index.mjs
(使用package.json設定也行,這裡不舉例了)ESM
的import// index.mjs // 由於unified沒有匯出default,這裡要用{}括起來 import { unified } from 'unified' console.log(unified)
node index.mjs
可以看到已經可以正常執行,基本執行環境就完成了。
修改執行檔案
import { unified } from 'unified' import remarkParse from 'remark-parse' import remarkStringify from 'remark-stringify' // 初始化一個unified解析器 const res = unified() // 使用Markdown解析器將文字轉為AST .use(remarkParse) // 將MarkdownAST轉為字串 .use(remarkStringify) // 開始同步執行解析 .processSync('# hello unified') console.log(res)
這個例子僅是最基礎的執行沒有什麼實際功能,執行結果:
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的外掛,會將具有yaml塊標誌(預設為---)的檔案塊解析成為yaml型別節點, .use(remarkFrontmatter, ['yaml']) // 新增一個自定義外掛來處理yaml型別節點 .use(() => (tree, vFile) => { console.log(tree) // unist-util-visit 提供了更多便捷存取AST的工具,這裡我們先簡單獲取 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) // 賦值到該檔案的解析資料中返回給外部使用 vFile.data.meta = meta } }) .use(remarkStringify) .processSync(`--- title: I AM TITLE tags: - unified - good --- # hello unified' `) console.log(res)
從列印結果可以看到,經過remark-frontmatter
處理後,被---
標誌包含的檔案塊被轉換成了yaml
型別的節點,我們就可以方便的基於這個節點來解析資料了。
同時我們還自定義了一個簡易的外掛,用於處理yaml
型別的節點,最終結果如下所示,已經正確提取出出來Markdown中的自定義屬性資料:
該專案使用了unified來將markdown轉換為react-jsx,markdown用於寫元件說明檔案,jsx用於渲染為網站。其中除了使用unified生態的部分外掛外,dumi還實現了許多自定義的功能外掛用於擴充套件markdown的語法。
本章後續將逐一拆解相關程式碼,深入學習unified外掛開發及實戰運用,更多關於unified處理markdown解析器的資料請關注it145.com其它相關文章!
以上就是unified如何處理markdown解析器詳解的詳細內容,更多關於unified處理markdown解析器的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45