# 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
#### 效果演示

#### 安装教程
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("");
renderer.render(document);
// "
\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:
\ncode\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.
```