本文档全面概述了 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}