MD4C代表“ C的Markdown for C”,這正是該項目的意義。
簡而言之,Markdown是此README.md文件寫入的標記語言。
如果您不熟悉它,以下資源可以解釋更多:
MD4C是C在C中的Markdown解析器實現,具有以下功能:
合規性:通常,MD4C旨在符合最新版本的Commonmark規範。目前,我們完全符合Commonmark 0.31。
擴展: MD4C支持一些常見和接受的擴展。見下文。
性能: MD4C非常快。
緊湊度: MD4C解析器在一個源文件和一個標頭文件中實現。除標準C庫外,沒有其他依賴關係。
嵌入: MD4C解析器在其他項目中很容易重複使用,其API非常簡單:實際上只有一個函數md_parse() 。
推動模型: MD4C解析完整的文檔,並調用應用程序提供的幾個回調功能,以告知其大約每個塊的開始/結尾,每個跨度的開始/結束以及任何文本內容。
可移植性: MD4C在Windows和Posix符合OSS上構建和工作。 (至少只要平台提供C標準庫(包括堆內存管理),也應該在大多數其他平台上運行它應該很容易。)
編碼:默認情況下,MD4C期望輸入文檔的UTF-8編碼。但是可以彙編以識別僅ASCII控製字符(即禁用所有Unicode特定代碼),或者(在Windows上)期望UTF-16(即,在Windows上通常稱為“ unicode”)。請參閱下面的更多詳細信息。
允許許可證: MD4C可根據MIT許可獲得。
如果您只需要解析Markdown文檔,則需要包括md4c.h並針對MD4C庫( -lmd4c )鏈接;或或者將md4c.[hc]直接在您的代碼庫中,因為解析器僅在單個C源文件中實現。
主要提供的功能是md_parse() 。它在Markdown語法中採用文本,並將其指向指向結構,該結構為多個回調函數提供指針。
當md_parse()處理輸入時,它調用回調(輸入或離開任何降壓塊或跨度時;以及輸出文檔的任何文本內容時),允許應用程序將其轉換為另一種格式或將其渲染到屏幕上。
如果您需要將Markdown轉換為HTML,請包括md4c-html.h ,並針對MD4C-HTML庫( -lmd4c-html )鏈接;或或者將源md4c.[hc] , md4c-html.[hc]和entity.[hc]中的代碼庫中。
要轉換降價輸入,請調用md_html()函數。它採用降價輸入並調用提供的回調功能。回調用HTML輸出的塊饋送。典型的回調實現只會將塊附加到緩衝區中或將其寫入文件。
默認行為是僅識別由COONMARK規範定義的Markdown語法。
但是,有了適當的標誌,可以調整行為以實現一些擴展:
使用標誌MD_FLAG_COLLAPSEWHITESPACE ,將非平凡的空格折疊成一個空間。
使用標誌MD_FLAG_TABLES ,支持GitHub式表。
使用標誌MD_FLAG_TASKLISTS ,支持GitHub式任務列表。
使用標誌MD_FLAG_STRIKETHROUGH ,啟用了罷工 - 跨度跨度(在tilde標記中包含文本, ~foo bar~ )。
使用標誌MD_FLAG_PERMISSIVEURLAUTOLINKS允許的URL自動鏈接(未包含在<和>中)。
使用FLAG MD_FLAG_PERMISSIVEEMAILAUTOLINKS ,支持寬鬆的電子郵件自動鏈接(未包含在<和>中)。
使用FLAG MD_FLAG_PERMISSIVEWWWAUTOLINKS允許的www autoLinks無需指定任何方案(例如www.example.com )。然後,MD4C假設http:方案。
使用FLAG MD_FLAG_LATEXMATHSPANS乳膠數學跨度( $...$ )和乳膠顯示數學跨度( $$...$$ )。 (請注意,HTML渲染器將它們逐字輸出,以自定義標籤<x-equation> 。)。
使用FLAG MD_FLAG_WIKILINKS ,支持Wiki-Style鏈接( [[link label]]和[[target article|link label]] ])。 (請注意,HTML渲染器將它們輸出以自定義標籤<x-wikilink> 。)
使用標誌MD_FLAG_UNDERLINE ,下劃線( _ )表示下劃線,而不是普通的重點或強調。
Concommark(某些人認為是錯誤的功能)的一些功能可能會被以下標誌禁用:
使用標誌MD_FLAG_NOHTMLSPANS或MD_FLAG_NOHTMLBLOCKS ,RAW內線HTML或RAW HTML塊分別被禁用。
使用FLAG MD_FLAG_NOINDENTEDCODEBLOCKS ,縮進的代碼塊被禁用。
CONCORMARK規範聲明任何Unicode代碼點的序列都是有效的CONCORMARK文檔。
但是,在仔細檢查下,Unicode在解析Markdown文檔時在幾種非常具體的情況下扮演著任何角色:
為了在處理重點和強烈重視時檢測單詞邊界,需要對Unicode字符的某些分類(無論是空間還是標點符號)。
對於(不敏感的)鏈接參考標籤與相應的鏈接參考定義的匹配,使用Unicode案例折疊。
用於將html實體( & )和數字字符引用(例如# ಫ )轉化為其Unicode等效物。
但是請注意,MD4C在渲染器/應用程序上將此翻譯留下;由於渲染器應該真正知道輸出編碼以及是否真的需要執行這種翻譯。 (例如,當渲染器輸出HTML時,它可能會使實體未經翻譯並將工作推薦給Web瀏覽器。)
MD4C依賴於Commark的此屬性,並且實現在很大程度上是編碼不可思議的。大多數MD4C代碼僅假定您選擇的編碼與ASCII兼容。即128以下的編碼點具有與ASCII相同的數值。
任何輸入MD4C都不理解,僅將其視為文檔文本的一部分,並發送到渲染器的回調函數不變。
MD4C必須了解Unicode的兩種情況(單詞邊界檢測和鏈接參考匹配)按以下預處理器宏指定(如構建MD4C時指定)所指定的處理。
如果定義了預處理器宏MD4C_USE_UTF8 ,則MD4C假定utf-8對於單詞邊界檢測和鏈接標籤的案例不敏感匹配。
當這些宏都沒有明確使用時,這是默認行為。
在Windows上,如果定義了預處理器宏MD4C_USE_UTF16 ,則MD4C使用WCHAR代替char ,並假設在這些情況下編碼UTF-16。 (UTF-16是Windows開發人員通常稱之為“ Unicode”,Win32API通常可以使用的。)
請注意,由於此宏還會影響md4c.h中的類型,因此在構建MD4C以及包括md4c.h時,您必須定義宏。
另請注意,僅在解析器( md4c.[hc] )中支持這。 HTML渲染器不支持此功能,您將必須編寫自己的自定義渲染器來使用此功能。
如果定義了預處理器宏MD4C_USE_ASCII ,則MD4C僅假定ASCII輸入。
這有效地意味著不會將非ASCII的空格或標點字符識別為這樣,並且鏈接參考匹配僅適用於ASCII字母( [a-zA-Z] )。
在md4c.h中的評論中,解析器的API已得到很好的記錄。同樣,在其標題md4c-html.h中描述了降壓到HTML API。
還有Wiki項目提供了一些更全面的文檔。但是請注意,這是不完整的,並且某些細節可能已經過時了。
問:MD4C與其他Markdown解析器相比如何?
答:其他一些實現將Markdown解析器和HTML生成器組合到隱藏在接口後面的單個糾纏代碼中,該代碼只允許從Markdown轉換為HTML。如果您想以任何其他方式處理輸入,它們通常是無法使用的。
其次,大多數解析器(如果不是全部;至少在C/C ++語言的範圍內)都是完全類似DOM的解析器:它們構造了整個Markdown文檔的抽象語法樹(AST)表示。這需要時間,這會導致更大的內存足跡。
只要您需要,建造AST就完全可以。如果不這樣做,就記憶消耗而言,使用MD4C的可能性很大,較少飢餓。
最後但並非最不重要的一點是,某些Markdown解析器以幼稚的方式實施。當以巧妙的輸入模式餵食時,它們可能會表現出二次解析時間(甚至更糟)。 MD4C仍然可以在一小部分中解析的內容可能會變成很長的幾分鐘或可能與它們的數小時。因此,當使用這種幼稚的解析器來處理不受信任的來源的輸入時,拒絕服務攻擊的可能性就成為了真正的危險。
無論使用哪種瘋狂的輸入MD4C解析器,我們提供了很多努力,以提供線性解析時間。 (如果您遇到導致亞線性解析時間的輸入模式,請隨時猶豫並將其報告為錯誤。)
問:MD4C是否執行任何輸入驗證?
答:不。我們為此感到自豪。 :-)
CONCORMARK規範指出,任何Unicode字符的序列都是有效的標記文檔。 (實際上,這或多或少總是意味著UTF-8編碼。)
換句話說,根據規範,是否以某種方式破壞了某種降級語法構造並不重要。如果破碎,它將不會被識別,而解析器應該將其視為逐字文字。
MD4C進一步邁出了一步:它將任何字節序列視為有效的輸入,完全遵循Gigo Philosophy(垃圾中的垃圾,垃圾)。即任何不正確的UTF-8字節序列都將作為文本的一部分傳播到相應的回調。
如果您需要驗證輸入是一個良好的UTF-8文檔,則必須自己進行。最簡單的方法是簡單地驗證整個文檔,然後再將其傳遞給MD4C解析器。
MD4C覆蓋MIT許可證,請參閱文件LICENSE.md 。
端口和與其他語言的綁定:
CONCORMARK-D:MD4C端口到D語言。
MARKDOWN-WASM:MD4C端口到WebAssembly。
PYMD4C:MD4C的Python綁定
使用MD4C的軟件:
imgui_md:親愛的imgui
Markdown Monolith彙編器:用於構建基於瀏覽器的書籍的命令行工具。
Qownnotes:具有Markdown支持和OwnCloud / NextCloud Integration的普通文本記事本和托多斯管理器。
QT:跨平台C ++ GUI框架。
Textosaurus:基於QT和Scintilla的跨平台文本編輯器。
8:跨平台串聯編程語言。