# Commonmark-java **Repository Path**: chinasoft_ohos/Commonmark-java ## Basic Information - **Project Name**: Commonmark-java - **Description**: 自定义表扩展名 - **Primary Language**: Java - **License**: BSD-2-Clause - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-04-10 - **Last Updated**: 2021-09-25 ## Categories & Tags **Categories**: harmonyos-toolkit **Tags**: None ## README # commonmark-java #### 项目介绍 - 项目名称:commonmark-java - 所属系列:openharmony的第三方组件适配移植 - 功能:自定义表扩展名 - 项目移植状态:主功能完成 - 调用差异:无 - 开发版本:sdk6,DevEco Studio2.2 beta1 - 基线版本:Release 0.17.2 #### 效果演示 ![效果演示](https://images.gitee.com/uploads/images/2021/0524/202230_760a559d_8695913.gif "截图.gif") #### 安装教程 1.在项目根目录下的build.gradle文件中, ``` allprojects { repositories { maven { url 'https://s01.oss.sonatype.org/content/repositories/releases/' } } } ``` 2.在entry模块的build.gradle文件中, ``` dependencies { implementation('com.gitee.chinasoft_ohos:commonmark:1.0.0') ...... } ``` 在sdk6,DevEco Studio2.2 beta1下项目可直接运行 如无法运行,删除项目.gradle,.idea,build,gradle,build.gradle文件, 并依据自己的版本创建新项目,将新项目的对应文件复制到根目录下 #### 使用说明 解析并渲染为HTML ``` import org.commonmark.node.*; import org.commonmark.parser.Parser; import org.commonmark.renderer.html.HtmlRenderer; Parser parser = Parser.builder().build(); Node document = parser.parse("This is *Sparta*"); HtmlRenderer renderer = HtmlRenderer.builder().build(); renderer.render(document); // "

This is Sparta

\n" ``` 这将使用具有默认选项的解析器和渲染器。这两个构建器都有配置其行为的方法: - `escapeHtml(true)`在`HtmlRenderer`将难逃原始的HTML标签和块。 - `sanitizeUrls(true)`上`HtmlRenderer`会剥去潜在不安全的URL``和``标签 - 有关所有可用选项,请参见构建器上的方法。 请注意,该库不会尝试清除允许使用的标签等方面的结果HTML。这是调用方的责任,如果您公开结果HTML,则可能要在此之后对其运行清除程序。 为了呈现为纯文本,还有一个`TextContentRenderer`具有非常相似的API。 ##### 使用访客来处理已解析的节点 解析源文本后,结果是一棵节点树。该树可以在渲染之前进行修改,或者仅在不渲染的情况下进行检查: ```java Node node = parser.parse("Example\n=======\n\nSome more text"); WordCountVisitor visitor = new WordCountVisitor(); node.accept(visitor); visitor.wordCount; // 4 class WordCountVisitor extends AbstractVisitor { int wordCount = 0; @Override public void visit(Text text) { // This is called for all Text nodes. Override other visit methods for other node types. // Count words (this is just an example, don't actually do it this way for various reasons). wordCount += text.getLiteral().split("\\W+").length; // Descend into children (could be omitted in this case because Text nodes don't have children). visitChildren(text); } } ``` ##### 添加或更改HTML元素的属性 有时您可能需要自定义HTML的呈现方式。如果您要做的就是在某些元素上添加或更改属性,则有一种简单的方法。 在此示例中,我们`AttributeProvider`在渲染器上注册的工厂,以`class="border"`在`img`元素上设置属性。 ```java Parser parser = Parser.builder().build(); HtmlRenderer renderer = HtmlRenderer.builder() .attributeProviderFactory(new AttributeProviderFactory() { public AttributeProvider create(AttributeProviderContext context) { return new ImageAttributeProvider(); } }) .build(); Node document = parser.parse("![text](/url.png)"); renderer.render(document); // "

\"text\"

\n" class ImageAttributeProvider implements AttributeProvider { @Override public void setAttributes(Node node, String tagName, Map attributes) { if (node instanceof Image) { attributes.put("class", "border"); } } } ``` ##### 自定义HTML呈现 如果您要做的不仅仅是改变属性,还可以通过一种方法来完全控制HTML的呈现方式。 在此示例中,我们更改了缩进代码块的呈现方式,以仅将它们包装起来,`pre`而不是`pre`和`code`: ```java Parser parser = Parser.builder().build(); HtmlRenderer renderer = HtmlRenderer.builder() .nodeRendererFactory(new HtmlNodeRendererFactory() { public NodeRenderer create(HtmlNodeRendererContext context) { return new IndentedCodeBlockNodeRenderer(context); } }) .build(); Node document = parser.parse("Example:\n\n code"); renderer.render(document); // "

Example:

\n
code\n
\n" class IndentedCodeBlockNodeRenderer implements NodeRenderer { private final HtmlWriter html; IndentedCodeBlockNodeRenderer(HtmlNodeRendererContext context) { this.html = context.getWriter(); } @Override public Set> getNodeTypes() { // Return the node types we want to use this renderer for. return Collections.>singleton(IndentedCodeBlock.class); } @Override public void render(Node node) { // We only handle one type as per getNodeTypes, so we can just cast it here. IndentedCodeBlock codeBlock = (IndentedCodeBlock) node; html.line(); html.tag("pre"); html.text(codeBlock.getLiteral()); html.tag("/pre"); html.line(); } } ``` ##### 添加您自己的节点类型 如果要在文档中存储其他数据或在结果HTML中包含自定义元素,则可以创建自己的子类, `CustomNode` 并将实例作为子节点添加到现有节点。 要为它们定义HTML呈现,可以使用`NodeRenderer`如上所述的。 #### 测试信息 CodeCheck代码测试无异常 CloudTest代码测试无异常 病毒安全检测通过 当前版本demo功能与原组件基本无差异 #### 版本迭代 - 1.0.0 - 0.0.1-SNAPSHOT #### 版权和许可信息 ``` Copyright (c) 2015-2019 Atlassian and others. BSD (2-clause) licensed, see LICENSE.txt file. ```