mirror of
https://gitee.com/bookshelfplus/bookshelfplus
synced 2025-09-12 19:51:39 +08:00
完善Markdown导出表格功能
This commit is contained in:
@@ -0,0 +1,155 @@
|
||||
package plus.bookshelf.Common.MarkdownUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class MarkdownTable {
|
||||
|
||||
public enum Alignment {
|
||||
LEFT(" :--- "), CENTER(" :--: "), RIGHT(" ---: ");
|
||||
public final String format;
|
||||
|
||||
Alignment(String format) {
|
||||
this.format = format;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return format;
|
||||
}
|
||||
}
|
||||
|
||||
// 表格的列数
|
||||
private Integer numOfColumns = 0;
|
||||
|
||||
// 表格的行
|
||||
private List<String[]> rows;
|
||||
|
||||
// 表格的表头
|
||||
private String[] headers;
|
||||
|
||||
// 表格的样式
|
||||
private Alignment[] alignments;
|
||||
|
||||
private MarkdownTable(Integer numOfColumns) {
|
||||
this.numOfColumns = numOfColumns;
|
||||
headers = new String[numOfColumns];
|
||||
alignments = new Alignment[numOfColumns];
|
||||
rows = new ArrayList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建一个表格
|
||||
* <p>
|
||||
* 创建表格前需要先指定表格的列数,然后添加行。
|
||||
* 创建表格后,表格列数不可再修改。
|
||||
* 可以调用toString()方法获取表格的Markdown字符串。
|
||||
*
|
||||
* @param numOfColumns
|
||||
* @return
|
||||
*/
|
||||
public static MarkdownTable create(Integer numOfColumns) {
|
||||
return new MarkdownTable(numOfColumns);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置表格的表头
|
||||
*
|
||||
* @param header
|
||||
* @return
|
||||
*/
|
||||
public MarkdownTable setHeader(Object... header) {
|
||||
if (header.length != numOfColumns) {
|
||||
throw new IllegalArgumentException("表格的列数不匹配");
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
for (Object o : header) {
|
||||
headers[i++] = o.toString();
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置对齐方式
|
||||
*
|
||||
* @param alignments
|
||||
* @return
|
||||
*/
|
||||
public MarkdownTable setAlignment(Alignment... alignments) {
|
||||
if (alignments.length != numOfColumns) {
|
||||
throw new IllegalArgumentException("表格的列数不匹配");
|
||||
}
|
||||
this.alignments = alignments;
|
||||
return this;
|
||||
}
|
||||
|
||||
public MarkdownTable setAlignment(Alignment alignment) {
|
||||
for (int i = 0; i < numOfColumns; i++) {
|
||||
alignments[i] = alignment;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加一行
|
||||
*
|
||||
* @param row
|
||||
* @return
|
||||
*/
|
||||
public MarkdownTable addRow(String... row) {
|
||||
if (row.length != numOfColumns) {
|
||||
throw new IllegalArgumentException("表格的列数不匹配");
|
||||
}
|
||||
rows.add(row);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取表格的Markdown字符串
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return toStringBuilder().toString();
|
||||
}
|
||||
|
||||
public StringBuilder toStringBuilder() {
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
|
||||
// 表头
|
||||
stringBuilder.append("| ");
|
||||
String headerStr = String.join(" | ", headers);
|
||||
stringBuilder.append(headerStr);
|
||||
stringBuilder.append(" |\n");
|
||||
|
||||
// 分割线
|
||||
for (int i = 0; i < alignments.length; i++) {
|
||||
stringBuilder.append("|");
|
||||
String format = alignments[i].toString();
|
||||
stringBuilder.append(format);
|
||||
}
|
||||
stringBuilder.append("|\n");
|
||||
|
||||
// 表格内容
|
||||
for (String[] row : rows) {
|
||||
stringBuilder.append("|");
|
||||
|
||||
// String rowStr = String.join(" | ", row);
|
||||
// stringBuilder.append(rowStr);
|
||||
// stringBuilder.append(" |\n");
|
||||
|
||||
for (String o : row) {
|
||||
stringBuilder.append(" ");
|
||||
stringBuilder.append(o.replace("\n", "<br>")
|
||||
.replace("|", "\\|"));
|
||||
stringBuilder.append(" |");
|
||||
}
|
||||
stringBuilder.append("\n");
|
||||
}
|
||||
|
||||
// 删除最后一个换行符
|
||||
stringBuilder.deleteCharAt(stringBuilder.lastIndexOf("\n"));
|
||||
return stringBuilder;
|
||||
}
|
||||
}
|
@@ -44,9 +44,11 @@ public class MarkdownUtils {
|
||||
* @return String
|
||||
*/
|
||||
public String getMarkdown() {
|
||||
// // 去除最后的一个换行符 (保留一个换行符)
|
||||
// return markdown.deleteCharAt(markdown.length() - 1).toString();
|
||||
|
||||
// 去除最后的两个换行符
|
||||
markdown.delete(markdown.length() - 2, markdown.length());
|
||||
return markdown.toString();
|
||||
return markdown.delete(markdown.length() - 2, markdown.length()).toString();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -277,12 +279,13 @@ public class MarkdownUtils {
|
||||
}
|
||||
|
||||
/**
|
||||
* 表格 TODO
|
||||
* 表格
|
||||
*
|
||||
* @param text
|
||||
* @param table
|
||||
* @return
|
||||
*/
|
||||
public MarkdownUtils table(String text) {
|
||||
public MarkdownUtils table(MarkdownTable table) {
|
||||
this.append(table.toString());
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
@@ -1,6 +1,7 @@
|
||||
package plus.bookshelf;
|
||||
|
||||
import org.junit.Test;
|
||||
import plus.bookshelf.Common.MarkdownUtils.MarkdownTable;
|
||||
import plus.bookshelf.Common.MarkdownUtils.MarkdownUtils;
|
||||
|
||||
public class markDownTest {
|
||||
@@ -42,12 +43,38 @@ public class markDownTest {
|
||||
.ol("这是一段有序列表的段落", 5)
|
||||
.ol("这是一段有序列表的段落", 6)
|
||||
.ol("这是一段有序列表的段落", 7)
|
||||
.table("这是一段表格的段落")
|
||||
.table(MarkdownTable.create(3)
|
||||
.setHeader("标题1", "标题2", "标题3")
|
||||
.setAlignment(MarkdownTable.Alignment.CENTER)
|
||||
.addRow("1", "2", "3")
|
||||
.addRow("1", "2", "3")
|
||||
.addRow("1", "2", "3")
|
||||
)
|
||||
.table(MarkdownTable.create(3)
|
||||
.setHeader("标题1", "标题2", "标题3")
|
||||
.setAlignment(MarkdownTable.Alignment.CENTER, MarkdownTable.Alignment.LEFT, MarkdownTable.Alignment.RIGHT)
|
||||
.addRow("1", "2", "3\n4")
|
||||
.addRow("1", "2", "3|||wew")
|
||||
.addRow("1", "2", "3")
|
||||
.addRow("1", "2", MarkdownUtils.getInstance()
|
||||
.inlineCode("222")
|
||||
.getMarkdown()
|
||||
)
|
||||
)
|
||||
.link("这是一段链接的段落", "https://www.baidu.com")
|
||||
.image("https://t7.baidu.com/it/u=1595072465,3644073269&fm=193&f=GIF")
|
||||
.blockquote(MarkdownUtils.getInstance()
|
||||
.p("这是一段段落")
|
||||
.p("这是一段段落"))
|
||||
.p("这是一段段落")
|
||||
.blockquote(MarkdownUtils.getInstance()
|
||||
.p("这是一段段落")
|
||||
.p("这是一段段落")
|
||||
.blockquote(MarkdownUtils.getInstance()
|
||||
.p("这是一段段落")
|
||||
.p("这是一段段落")
|
||||
)
|
||||
)
|
||||
)
|
||||
.getMarkdown();
|
||||
System.out.println(markdown);
|
||||
}
|
||||
|
Reference in New Issue
Block a user