1、前言
个人博客系统正在开发中。。。
欢迎路过的java新手一起交流。。。
欢迎大佬指正。。。
本文主要描述文章发布过程中MarkDown文件的解析过程。
MarkDown文件有以下语法说明
语法 | 格式 |
---|---|
标题 | 标题采用#+#的数量+空格,如# 表示一级标题,## 表示二级标题 |
文本样式-强调 | *文本*,表示强调文本 |
文本样式-加粗 | **文本**,表示j加粗文本 |
文本样式-标记 | ==文本==,表示标记文本 |
文本样式-删除 | ~~文本~~,表示删除文本 |
链接 | [链接名称](链接地址) |
图片 | ![图片提示](图片地址+#+对齐方式 =图片宽度x图片高度) |
本文主要实现以上语法的解析
2、设计思路
首先,段落是一个MarkDown文件的组成单位,它以\r\n作为标志。
其次,一个标题就构成一个段落。
第三,普通文本、文本样式、链接和图片在段落之中。
最后,段落与文本、图片构成树结构。
针对以上特征,可以做出以下设计思路
Ⅰ、对于一个MarkDown文件需使用Scanner类获取其中的段落。
Ⅱ、对于一个语法应该确定相应的解析逻辑解析相应的文本。
Ⅲ、对解析出的文本设置相应的处理器。
关于解析逻辑
Ⅰ、使用String对象的charAt方法逐次扫描段落。
Ⅱ、对相应的语法设置相应的布尔标志表示语法开始或者结束。
Ⅲ、用相应的逻辑解析语法格式并记录标志位。
Ⅳ 、通过标志位从段落字符串中提取子串。
关于处理器
Ⅰ、用一种Html标签表示相应的文本格式。
Ⅱ、给标签加上内联样式以便识别相应的文本内容。
3、代码清单
3.1、未加处理器调试程序
package org.fine123.test;
import java.io.File;
import java.io.FileInputStream;
import java.util.Scanner;
public class TestArticleURL {
public static void main(String[] args) {
String MdFilesrc = "E:/Download/app/Blog/_drafts/test.md";
File file = new File(MdFilesrc);
try {
if (file.exists()) {
FileInputStream in = new FileInputStream(file);
Scanner scanner = new Scanner(in);
while (scanner.hasNext()) {
String s = scanner.nextLine();
s = s.trim();
boolean contentTitleFlag = false;
int contentTitleCount = 0;
boolean boldTextFlag = false;
int blodTextStart = 0;
int boldTextEnd = 0;
boolean markedTextFlag = false;
int markedTextStart = 0;
int markedTextEnd = 0;
boolean deleteTextFlag = false;
int deleteTextStart = 0;
int deleteTextEnd = 0;
boolean linkTitleTextFlag = false;
int linkTitleTextStart = 0;
int linkTitleTextEnd = 0;
boolean linkAddrTextFlag = false;
int linkAddrTextStart = 0;
int linkAddrTextEnd = 0;
boolean ImgTextFlag = false;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
/* 内容标题解析器开始 */
if (c == '#' && contentTitleFlag) {
contentTitleCount++;
} else if (c == ' ' && i > 0 && s.