[Java] Markdown渲染器 202006-3

import java.io.*;
import java.util.StringTokenizer; 

enum Text {
    
    
	BLANKLINE,
	PARAGRAPH,
	PROJECT;
}

public class Main {
    
    

	private static int countParagraph(StringBuilder paragraph, int w) {
    
    
		int ans = 0;
		for (int i = 0; i < paragraph.length();) {
    
    
			ans++;
			if (i + w <= paragraph.length()) {
    
    
				i += w;
			}
			else {
    
    
				break;
			}
			while (i < paragraph.length() && paragraph.charAt(i) == ' ') {
    
    
				i++;
			}
		}
		return ans;
	}

	private static int countProject(StringBuilder project, int w) {
    
    
		if (project.length() == 0) return 1;
		return countParagraph(project, w - 3);
	}

    public static void main(String[] args) {
    
     
		BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out = new PrintWriter(System.out);

		// 渲染所需的终端行数
		int w = 0, ans = -1;
		StringBuilder paragraph = new StringBuilder(); // 段落
		StringBuilder project = new StringBuilder(); // 项目
		Text prev = Text.BLANKLINE;
		try {
    
    
	        w = Integer.parseInt(sc.readLine());
	        String line = null;
			while ((line = sc.readLine()) != null) {
    
    
				switch(prev) {
    
    
					// 前一个是项目
					case PROJECT:
						if (line.startsWith("  ") && line.trim().length() != 0) {
    
    
							if (project.length() != 0) {
    
    
								project.append(" ");
							}
							project.append(line.trim());
							prev = Text.PROJECT;
							continue;
						}
						if (line.startsWith("* ")) {
    
    
							ans += countProject(project, w);
							project.setLength(0);
							project.append(line.substring(2).trim());
							prev = Text.PROJECT;
							continue;
						}
						line = line.trim();
						// 当前为段落
						if (line.length() != 0) {
    
    
							ans += countProject(project, w) + 1;
							project.setLength(0);
							paragraph.append(line);
							prev = Text.PARAGRAPH;
						}
						else {
    
    
							ans += countProject(project, w);
							project.setLength(0);
							prev = Text.BLANKLINE;
						}
						break;
					// 前一个是段落
					case PARAGRAPH:
						// 当前为项目
						if (line.startsWith("* ")) {
    
    
							ans += countParagraph(paragraph, w) + 1;
							paragraph.setLength(0);
							project.append(line.substring(2).trim());
							prev = Text.PROJECT;
							continue;
						}
						line = line.trim();
						if (line.length() != 0) {
    
    
							paragraph.append(" ").append(line);
							prev = Text.PARAGRAPH;
						}
						else {
    
    
							ans += countParagraph(paragraph, w);
							paragraph.setLength(0);
							prev = Text.BLANKLINE;
						}
						break;
					// 前一个是空白行
					case BLANKLINE:
						if (line.startsWith("* ")) {
    
    
							ans++;
							project.append(line.substring(2).trim());
							prev = Text.PROJECT;
							continue;
						}
						line = line.trim();
						if (line.length() != 0) {
    
    
							ans++;
							paragraph.append(line);
							prev = Text.PARAGRAPH;
						}
						else {
    
    
							prev = Text.BLANKLINE;
						}
						break;
				}
			}
		} catch (IOException e) {
    
    
			e.printStackTrace();
		}
		if (prev == Text.PROJECT) {
    
    
			ans += countProject(project, w);
		}
		if (prev == Text.PARAGRAPH) {
    
    
			ans += countParagraph(paragraph, w);
		}
    	out.println(ans);
		out.flush();
    }
} 

猜你喜欢

转载自blog.csdn.net/weixin_41714373/article/details/109112509
今日推荐