本文檔全面概述了 flexmark-java,它是 CommonMark Markdown 解析器的高效能 Java 實作。它詳細介紹了其功能,包括速度、可擴展性和詳細的源位置跟踪,以及快速啟動、可用擴展和從 pegdown 遷移的說明。該文件還涵蓋了其持續的開發和貢獻指南。
Flexmark-java
flexmark-java 是 CommonMark(規格 0.28)解析器的 Java 實現,使用
區塊在前,內聯在 Markdown 解析架構之後。
它的優點是速度、靈活性、基於 Markdown 源元素的 AST 以及詳細信息
源位置精確到構成元素的詞位的各個字符,並且
可擴展性。
該 API 允許對解析過程進行精細控制,並針對大型資料的解析進行了最佳化
安裝的擴充功能的數量。解析器和擴充功能為解析器提供了大量選項
行為和 HTML 呈現變化。最終目標是讓解析器和渲染器能夠
非常準確地模仿其他解析器。現在已部分完成
Markdown 處理器模擬的實現
這個專案的動機是需要取代我的 Markdown Navigator 中的 pegdown 解析器
JetBrains IDE 的插件。 pegdown 具有很棒的功能集,但整體速度較慢
比理想情況要好,對於病態輸入,在解析過程中要么掛起,要么實際上掛起。
️版本 0.60.0 由於重新組織、重命名、清理和
優化實作類別。更改詳情請見
版本-0.60.0-更改。
最新的
要求
適用於版本 0.62.2 或更低、Java 8 或更高版本、Java 9+ 相容。對於版本 0.64.0 或
以上,Java 11 以上。
該專案位於 Maven 上:com.vladsch.flexmark
除了 org.jetbrains:annotations:24.0.1 之外,核心沒有任何依賴項。對於擴展,請參見
下面的擴充描述。
API 仍在不斷發展以適應新的擴充功能和功能。
快速入門
對於 Maven,添加 flexmark-all 作為依賴項,其中包括核心和所有模組
以下範例:
來源:
基本樣本.java
透過 Gradle 建構
使用 Android Studio 進行建置
由於重複文件而導致的附加設定:
更多資訊可以在文件中找到:
維基主頁使用範例
擴展詳細信息
編寫擴展
Pegdown 遷移助手
PegdownOptionsAdapter 類別將 pegdown Extensions.* 標誌轉換為 Flexmark 選項並
擴展列表。包含 Pegdown Extensions.java 是為了方便,但找不到新選項
在 pegdown 1.6.0 中。這些位於 flexmark-profile-pegdown 模組中,但您可以獲得
來自此儲存庫的原始程式碼:PegdownOptionsAdapter.java、Extensions.java 並製作自己的
版本,根據您的專案需求進行修改。
您可以將擴充標誌傳遞給 static PegdownOptionsAdapter.flexmarkOptions(int) 或您
可以實例化 PegdownOptionsAdapter 並使用便捷方法來設定、新增和刪除
擴展標誌。 PegdownOptionsAdapter.getFlexmarkOptions() 將會傳回一個新的副本
DataHolder 每次都帶有反映掛鉤擴展標誌的選項。
預設的 flexmark-java pegdown 模擬使用不太嚴格的 HTML 區塊解析,這會中斷
空白行上的 HTML 區塊。如果所有標籤都在,Pegdown 只會中斷空白行上的 HTML 區塊
HTML 區塊已關閉。
為了更接近原始的 pegdown HTML 區塊解析行為,請使用以下方法:
布爾 strictHtml 參數:
還提供了帶有自訂連結解析器的範例,其中包括用於
如果需要覆蓋,請變更連結的 URL 或屬性以及自訂節點渲染器
產生的連結 HTML。
flexmark-java 有更多的擴充和配置選項
pegdown 除了 pegdown 1.6.0 中提供的擴充功能之外。
透過 PegdownOptionsAdapter 提供的可用擴展
最新添加和更改
0.60.0版本中實現的主要重組和程式碼清理,請參見
版本 0.60.0-由於出色的工作而進行的更改
Alex Karezin 您可以獲得模組依賴關係的概述
能夠深入到包和類別。
合併 API 將多個 Markdown 文件合併為一個
文件.
Docx 渲染器擴充:
有限屬性節點處理
可擴充的 HTML 到 Markdown 轉換器模組:
flexmark-html2md-轉換器。樣本:
HtmlToMarkdownCustomizedSample.java
Java9+模組相容性
複合枚舉參考
用於建立的枚舉引用擴展
元素和標題的合法編號。
宏擴充允許任意降價內容
作為區塊或內聯元素插入,允許僅在內聯的地方使用區塊元素
語法允許使用元素。
GitLab Flavored Markdown 用於解析和
渲染 GitLab Markdown 擴充。
OSGi 模組由 Dan Klco (GitHub @klcodanr) 提供
媒體標籤媒體連結變壓器擴展禮貌
Cornelia Schultz (GitHub @CorneliaXaos) 轉換鏈接
對音訊、嵌入、圖片和視訊 HTML5 標記使用自訂前綴。
用於翻譯 Markdown 的翻譯助理 API
文件更容易。
警告 建立塊樣式的側面內容。為了
完整的文件請參閱 Admonition Extension,MkDocs 資料
文件.
建立枚舉的枚舉參考
圖形、表格和其他 Markdown 元素的參考。
用於解析 {name name=value name='value' name="value" #id .class-name} 屬性形式的屬性的屬性。
YouTube 嵌入式連結轉換器
感謝 Vyacheslav N. Boyko (GitHub @bvn13) 將 YouTube 影片的簡單連結轉換為
嵌入影片 iframe HTML。
使用 docx4j 函式庫的 Docx 轉換器。使用方法:
DocxConverter範例,如何自訂:
自訂 Docx 渲染
本模組的開發由以下機構贊助
約翰研究所有限公司。
更新庫以符合 CommonMark(規範 0.28)並添加
ParserEmulationProfile.COMMONMARK027 和 ParserEmulationProfile.COMMONMARK028 允許
選擇特定規格版本選項。
自訂節點渲染 API,能夠為被覆蓋的節點呼叫標準渲染,
允許自訂節點渲染僅處理特殊情況,並讓其餘的渲染為
通常。自訂連結解析器
Gfm-問題和
Gfm-Users 用於解析和渲染的擴充 #123 和
分別@用戶名。
深度 HTML 區塊解析選項,可以更好地處理其他標籤之後的原始文字標籤
以及 pegdown HTML 區塊解析相容性。
flexmark-all 模組,包括:核心、所有擴充、格式化程式、JIRA 和 YouTrack
轉換器、pegdown 設定檔模組和 HTML 到 Markdown 轉換。
PDF輸出模組
使用 Open HTML To PDF 輸出 PDF
印刷實施
XWiki 巨集擴充
傑基爾標籤
Html 轉 Markdown
Maven Markdown 頁面產生器插件
Markdown Formatter 模組將 AST 輸出為 markdown
格式選項。
Markdown 格式化程式的表格
列寬和 Markdown 表格的對齊方式:
版本、錯誤修復、增強和支持
我使用 flexmark-java 作為 JetBrains IDE 的 Markdown Navigator 外掛的解析器。我傾向於
使用最新的、未發布的版本來修復錯誤或獲得改進。所以如果你發現一個錯誤
為您的專案帶來阻礙,或在 github 問題頁面中看到一個已標記為已修復的下一個版本的錯誤,該錯誤正在影響您的項目,那麼請告訴我,我也許能夠及時解決
發布新版本來解決您的問題。否則,我會讓錯誤修復和增強
累積思考沒有人會受到已經確定的事情的影響。
API中的擴充點非常多
API 中有許多擴充選項及其預期用途。良好的軟啟動是
flexmark-java-samples 模組,其中包含所需的簡單範例
擴展。下一個最佳位置是具有類似語法的現有擴展的源代碼
到你想要添加的內容。
如果您的擴充功能與正確的 API 相匹配,那麼任務通常會非常簡短且順利。如果你的
擴充功能以非預期的方式使用 API 或不遵循預期的內務處理
協議,你可能會發現這是一場艱苦的戰鬥,與 if/else 條件處理的老鼠巢
修復一個錯誤只會導致創建另一個錯誤。
一般來說,如果添加一個簡單的擴充功能需要超過幾十行,那麼您要么
操作錯誤或 API 缺少擴充點。如果你看看所有的
實現的擴充你會看到大多數都是除了樣板程式碼之外的幾行程式碼
由 API 指定。這就是這個函式庫的目標:提供一個可擴展的核心,使
輕鬆編寫擴充功能。
較大的擴充是 flexmark-ext-tables 和 flexmark-ext-spec-example,其核心是
兩者都是大約 200 行程式碼。您可以將它們用作估計您的尺寸的指南柱
擴大。
我自己添加擴展的經驗表明,有時新型擴展是最好的
透過 API 增強來解決,以使其實現無縫,或透過修復以下錯誤
在擴展以正確的方式強調 API 之前是不可見的。您的預期
擴展可能正是需要這種方法的擴展。
如果找不到答案,請隨時提出問題
結論是:如果您想實現擴充功能或功能,請不要猶豫
打開一個問題,我將為您提供解決問題的最佳方法。它可能會為你節省很多
在您投入大量時間之前,讓我改進 API 來滿足您的擴充需求
徒勞無功的努力。
我確實要求你意識到我是這個項目的首席廚師和洗瓶工,沒有一個
一點點火神心靈融合技能。我確實要求您描述一下您想要實現的內容
因為我讀不懂你的心思。請圍繞原始碼做一些背景調查工作
程式碼和文檔,因為未經您的同意,我無法將我所知道的轉移給您
努力。
可以諮詢
如果您有商業應用程式並且不想自己編寫擴充功能或想要
為了減少實現擴展和整合 flexmark-java 的時間和精力,感覺
有空聯絡我。我可以提供諮詢/承包服務。
Markdown 處理器仿真
儘管有它的名字,commonmark 既不是其他 Markdown 風格的超集也不是子集。
相反,它為原始的「核心」提出了一個標準的、明確的語法規範。
Markdown,從而有效地引入了另一種風格。雖然預設是 Flexmark
相容於 commonmark,它的解析器可以透過多種方式進行調整。所需的調整集
模擬最常用的 Markdown 解析器可在 Flexmark 中使用,如下所示
解析器仿真設定檔。
正如名稱 ParserEmulationProfile 所暗示的那樣,只有解析器被調整為
特定的降價風味。應用程式設定檔不會新增超出可用功能的功能
共同標記。如果您想使用 Flexmark 完全模擬另一個 Markdown 處理器的行為,
您必須調整解析器並配置提供附加功能的 Flexmark 擴展
您想要模擬的解析器中可用的功能。
重寫列表解析器以更好地控制其他 Markdown 處理器的模擬
Markdown 處理器模擬已完成。添加
用於模擬這些解析器的特定降價處理行為的處理器預設位於
簡短的待辦事項清單。
有些模擬家族在模擬目標方面比其他家族做得更好。大部分
這項工作旨在模擬這些處理器如何解析標準 Markdown 和列表
具體相關解析。對於擴展原始 Markdown 的處理器,您需要添加
那些已經在 flexmark-java 實現到解析器/渲染器建構器的擴展
選項。
如果出現以下情況,擴充將被修改以包含其自己的針對特定處理器模擬的預設:
此處理器已實現等效的擴展。
如果您發現差異,請提出問題以便解決。
主要處理器系列已實現,一些系列成員還:
配置文件來封裝變體的配置詳細信息
0.11.0 中新增了家庭:
歷史和動機
flexmark-java 是 commonmark-java 專案的分支,經過修改以產生 AST
反映原始來源中的所有元素,所有元素的完整來源位置追蹤
在 AST 和更簡單的 JetBrains Open API PsiTree 生成中。
API 進行了更改,以允許對解析過程進行更精細的控制,並針對以下方面進行了最佳化
解析大量已安裝的擴充功能。解析器和擴充功能有很多
調整解析器行為和 HTML 渲染變化的選項。最終目標是擁有
解析器和渲染器能夠非常精確地模仿其他解析器。
這樣做的動機是需要取代 Markdown Navigator 外掛程式中的 pegdown 解析器。
pegdown 有一個很棒的功能集,但它的速度整體來說不太理想,對於
病理輸入在解析過程中要么掛起,要么實際上掛起。
commonmark-java擁有優秀的解析架構,易於理解與擴展。
目標是確保在 AST 中添加來源位置追蹤不會改變易用性
解析和產生 AST 的過程超出了絕對必要的範圍。
選擇commonmark-java作為解析器的原因是:速度快、易於理解、易於使用
延伸和速度。現在我已經重新設計了核心並添加了一些擴展,我非常高興
對我的選擇很滿意。
另一個目標是提高擴展修改解析器行為的能力,以便任何
Markdown 的方言可以透過擴展機制來實現。可擴展的選項
新增 API 以允許在一個地方設定所有選項。解析器、渲染器和擴充的使用
這些配置選項,包括停用一些核心區塊解析器。
這是一項正在進行的工作,有許多 API 變更。沒有嘗試保留落後的 API
與原始專案的兼容性,直到功能集基本完成,甚至不相容
該專案的早期版本。
特性比較
(1)
flexmark-java 100,000 個病態輸入 [ 在 68ms 內解析, 100,000 ] 在 57ms 內, 100,000
嵌套 [ ] 在 55 毫秒內解析
(2)
commonmark-java 100,000 的病態輸入 [ 30ms 內解析, 100,000 ] 30ms 內, 100,000
巢狀 [ ] 解析耗時 43 毫秒
(3)
pegdown 病理輸入 17 [ 在 650 毫秒內解析,18 [ 在 1300 毫秒內解析
進步
我很高興決定為我自己切換到基於 commonmark-java 的解析器
專案.儘管我必須對其內部進行大手術才能獲得完整的來源位置
追蹤和匹配源元素的 AST,使用起來很愉快,現在是
很高興延長。如果您不需要源級元素 AST 或 flexmark-java 的其餘部分
添加並且 CommonMark 是您的目標 Markdown 解析器,那麼我鼓勵您使用
commonmark-java 因為它是滿足您需求的絕佳選擇,而且其性能並不
承受您不會使用的功能的開銷。
基準測試
最新,2017 年 1 月 28 日 flexmark-java 0.13.1,來自 CE EAP 2017 的 intellij-markdown,commonmark-java
0.8.0:
上述比例:
因為這兩個檔案代表 pegdown 的病態輸入,所以我不再將它們執行為
基準的一部分,以防止結果出現偏差。結果供後代參考。
上述比例:
貢獻
歡迎請求請求、問題和評論?對於拉取請求:
執照
版權所有 (c) 2015-2016 Atlassian 等。
版權所有 (c) 2016-2023,弗拉基米爾‧施耐德,
BSD(2-clause)許可,請參閱 LICENSE.txt 檔案。
例子:
三葉渲染器 3
文件 | 教學影片 | Linux | 蘋果系統 | 視窗 | 皮伊 |
---|---|---|---|---|---|
️
警告
️
目前,大量無證且不穩定的工作正在進行
master
分支。我們強烈建議您使用我們的
最新版本
直至另行通知。
如果您已經想嘗試即將發生的更改,請查看
本移植指引。
它應該涵蓋大部分新功能和即將到來的重大變化。
介紹
Mitsuba 3 是一款以研究為導向的前向光和反向光渲染系統
瑞士洛桑聯邦理工學院 (EPFL) 開發的交通模擬。
它由一個核心庫和一組實現功能的插件組成
從材質和光源到完整的渲染演算法。
Mitsuba 3 是可重定向的:這意味著底層實作和
資料結構可以轉換以完成各種不同的任務。為了
例如,相同的程式碼可以模擬標量(經典的一次一束)RGB 傳輸
或 GPU 上的差分光譜傳輸。這一切都建立在
Dr.Jit,專為此專案開發的專用即時(JIT) 編譯器。
主要特點
跨平台:Mitsuba 3 已在 Linux ( x86_64
)、macOS 上進行測試
( aarch64
、 x8664
)和 Windows ( x8664
)。
高效能:底層Dr.Jit編譯器融合渲染程式碼
進入內核,使用實現最先進的性能
針對 CPU 的 LLVM 後端和 CUDA/OptiX 後端
針對具有光線追蹤硬體加速功能的 NVIDIA GPU。
Python優先:Mitsuba 3與Python深度整合。材料,
紋理,甚至完整的渲染演算法都可以用Python開發,
系統即時編譯(並可選擇區分)。
這使得電腦圖形學研究所需的實驗成為可能
其他學科。
差異化:Mitsuba 3 是一個可微分渲染器,這表示它
可以計算整個模擬相對於輸入的導數
參數,例如相機姿態、幾何形狀、BSDF、紋理和體積。它
實作了 EPFL 最近開發的可微分渲染演算法。
光譜和偏振:Mitsuba 3 可用作單色儀
渲染器、基於 RGB 的渲染器或光譜渲染器。每個變體都可以
如果需要的話,可以選擇考慮極化的影響。
教學影片、文檔
我們錄製了幾個 YouTube 視頻,提供了溫和的介紹
三葉 3 和 Dr.Jit。除此之外,您還可以找到完整的 Juypter 筆記本
涵蓋各種應用程式、操作指南和參考文檔
閱讀文檔。
安裝
我們透過 PyPI 提供預編譯的二進位輪。以這種方式安裝三葉就像運行一樣簡單
pip安裝三葉
在命令列上。 Python 套件預設包含 13 個變體:
scalar_rgb
scalar_spectral
scalarspectralpolarized
llvmadrgb
llvmadmono
llvmadmono_polarized
llvmadspectral
llvmadspectral_polarized
cudaadrgb
cudaadmono
cudaadmono_polarized
cudaadspectral
cudaadspectral_polarized
前兩個使用 RGB 執行經典的一次一光模擬
或光譜顏色表示,而後兩者可用於反演
在 CPU 或 GPU 上渲染。要存取其他變體,您需要
使用 CMake 編譯 Dr.Jit 的自訂版本。請參閱
文件
有關詳細資訊。
要求
Python >= 3.8
(可選)對於 GPU 上的計算: Nvidia driver >= 495.89
(可選)對於 CPU 上的向量化/平行計算: LLVM >= 11.1
用法
這是一個簡單的「Hello World」範例,展示了渲染一個
使用 Python 中的 Mitsuba 3 的場景:
# 使用別名「mi」導入庫 import mitsuba as mi# 設定渲染器的變體mi.setvariant('scalarrgb')# 載入場景scene = mi.loaddict(mi.cornellbox())# 渲染場景img = mi. render (scene)# 將渲染影像寫入EXR檔案mi.Bitmap(img).write('cbox.exr')
可以找到涵蓋各種應用程式的教學和範例筆記本
在文檔中。
關於
該專案由 Wenzel Jakob 創建。
程式碼的重要功能和/或改進由以下人員貢獻
賽巴斯蒂安·施派爾,
尼古拉斯·羅塞爾,
梅林·尼米爾-大衛,
德里奧·維西尼,
蒂齊安·澤爾特納,
巴蒂斯特·尼科萊特,
米格爾·克雷斯波,
文森·勒羅伊,和
張子怡.
在學術課程中使用 Mitsuba 3 時,請引用:
@software{Mitsuba3,標題= {Mitsuba 3 渲染器},作者= {Wenzel Jakob 和Sébastien Speierer 和Nicolas Roussel 和Merlin Nimier-David 和Delio Vicini 和Tizian Zeltner 和Baptiste Nicolet 和Miguel Crespo 和Vincent Leroy 和Ziyi Zhu},註= {https://mitsuba-renderer.org},版本 = {3.1.1},年份 = 2022}