编程题:Markdown渲染器v1
Markdown是一种轻量级标记语言,由John Gruber和Aaron Swartz在2004年创造。通过易读易写的纯文本格式编写Markdown文件,可以方便地转换成HTML、PDF、PPT等格式。很多云笔记、代码托管等网站支持用Markdown格式写文档。完成本题后您将立即成为Markdown行家。
Markdown语法很简单,大约只有12类。V1版只需实现以下功能:
- 通用原则:
- 保留文本首、尾、中间的空格,不要删除或替换成 。
- 语法如果要求起始标记后接1个空格,那这个空格是语法元素,不是内容。之后到行尾才是文本内容。
- 例如#..标题.(为清晰用小数点代表空格)的起始标记是#.,文本内容是.标题.(文字前后的空格原样保留)
- **标题**(heading):**行首为1到6个#字符、后接一个空格**,表示一至六级标题,翻译为<h1>...</h1>至<h6>...</h6>结构。
- 标题只允许一行(不用考虑多行)。
- 标题与其他结构必须由一个空行隔开。
- 标题内容保持原样(本次无需考虑其他格式)
- **水平线**(horizontal rule):单独一行的3个连字符---为水平线,翻译为<hr>标签。
- 水平线与其他结构必须由一个空行隔开。
- **段落**(paragraph):由空行分隔的**多行文本**,被翻译为<p>...</p>段落结构。
- 段落各行内容需要按后续说明进行必要的文本修饰转换(着重、代码等)。
- 除末行外,段落**中间**的行需要追加<br>标签表示换行。
- 段落末行直接跟</p>结束标签。
- **无序列表**(unordered list):**以-开头,后接一个空格**,后续**单行文本**。
txt
- 第1组、第1项
- 第 1 组 第2项
- 第2组、第1项
转换为:
html
<ul>
<li>第1组、第1项</li>
<li> 第 1 组 第2项 </li>
</ul>
<ul>
<li>第2组、第1项</li>
</ul>
- 连续的列表项汇集在同一组<ul>...</ul>结构中。
- 只需实现单级列表(本次不考虑嵌套的多级列表)。
- 列表文本只有一行(本次不考虑多行文本)。
- 列表文本内容需按后续说明进行必要的文本修饰转换(着重、代码等)。
- 列表与其他结构必须由一个空行隔开。
- **文本**中可有以下修饰:
- **强调**:被**1个星号**包围的文本翻译为<em>...</em>结构,表现为*斜体*。
- **重要**:被**2个星号**包围的文本翻译为<strong>...</strong>结构,表现为**粗体**。
- **关键**:被**3个星号**包围的文本翻译为<strong><em>...</em></strong>结构,表现为***粗斜体***。
- **代码**:被**1个反引号**\包围的文本翻译为<code>...</code>结构,用等宽字体表示视为代码。
- 强调、重要、关键3种修饰不会嵌套(结束后才可能开始另一个修饰),但可以包含代码。
- 代码不会包含前3种修饰(因为代码中经常包含星号,比如指针等)
- 代码无需考虑包含反引号的情况(实际产品要考虑实现转义功能)
任务:解析Markdown基本结构,并转换为HTML。
目的:掌握Markdown常用语法;练习HTML后端生成方法。
提示:
- 逐步实现功能。
- 标题、水平线、段落、列表都是以1个空行作为分隔,可以视为块结构。
- 在划分出块结构后,再修饰行中的文本。
#### 输入规格
- 整行读入并转换,直到EOF为止。
- 这题开始有Unicode字符,用UTF-8编码就好,无需特殊处理。
- 输入合乎规范,无需考虑容错。
#### 输出规格
- HTML格式文本。
- 可以重定向到HTML文件,用浏览器打开查看。
#### 样例输入
in
# 一级标题
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题
---
段落1行1
段落2行1
段落2行2
- 列表A1
- 列表B1
- 列表B2
*强调(斜体)*
**着重(粗体)**
***着重强调(粗斜体)***
a ^= b; b ^= a; a ^= b;
#### 样例输出
out
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Markdown</title>
</head>
<body>
<h1>一级标题</h1>
<h2>二级标题</h2>
<h3>三级标题</h3>
<h4>四级标题</h4>
<h5>五级标题</h5>
<h6>六级标题</h6>
<hr>
<p>段落1行1</p>
<p>段落2行1<br>
段落2行2</p>
<ul>
<li>列表A1</li>
</ul>
<ul>
<li>列表B1</li>
<li>列表B2</li>
</ul>
<p><em>强调(斜体)</em></p>
<p><strong>着重(粗体)</strong></p>
<p><strong><em>着重强调(粗斜体)</em></strong></p>
<p><code>a ^= b; b ^= a; a ^= b;</code></p>
</body>
</html>
#### 样例解释
- 测试点0:样例
- 测试点1:标题
- 测试点2:水平分割线
- 测试点3:段落
- 测试点4:列表
- 测试点5:强调等修饰
- 测试点6:代码
- 测试点7:强调修饰组合。
- 测试点8:文本修饰组合。
- 测试点9:全功能组合测试。
答案:若无答案欢迎评论
Markdown语法很简单,大约只有12类。V1版只需实现以下功能:
- 通用原则:
- 保留文本首、尾、中间的空格,不要删除或替换成 。
- 语法如果要求起始标记后接1个空格,那这个空格是语法元素,不是内容。之后到行尾才是文本内容。
- 例如#..标题.(为清晰用小数点代表空格)的起始标记是#.,文本内容是.标题.(文字前后的空格原样保留)
- **标题**(heading):**行首为1到6个#字符、后接一个空格**,表示一至六级标题,翻译为<h1>...</h1>至<h6>...</h6>结构。
- 标题只允许一行(不用考虑多行)。
- 标题与其他结构必须由一个空行隔开。
- 标题内容保持原样(本次无需考虑其他格式)
- **水平线**(horizontal rule):单独一行的3个连字符---为水平线,翻译为<hr>标签。
- 水平线与其他结构必须由一个空行隔开。
- **段落**(paragraph):由空行分隔的**多行文本**,被翻译为<p>...</p>段落结构。
- 段落各行内容需要按后续说明进行必要的文本修饰转换(着重、代码等)。
- 除末行外,段落**中间**的行需要追加<br>标签表示换行。
- 段落末行直接跟</p>结束标签。
- **无序列表**(unordered list):**以-开头,后接一个空格**,后续**单行文本**。
txt
- 第1组、第1项
- 第 1 组 第2项
- 第2组、第1项
转换为:
html
<ul>
<li>第1组、第1项</li>
<li> 第 1 组 第2项 </li>
</ul>
<ul>
<li>第2组、第1项</li>
</ul>
- 连续的列表项汇集在同一组<ul>...</ul>结构中。
- 只需实现单级列表(本次不考虑嵌套的多级列表)。
- 列表文本只有一行(本次不考虑多行文本)。
- 列表文本内容需按后续说明进行必要的文本修饰转换(着重、代码等)。
- 列表与其他结构必须由一个空行隔开。
- **文本**中可有以下修饰:
- **强调**:被**1个星号**包围的文本翻译为<em>...</em>结构,表现为*斜体*。
- **重要**:被**2个星号**包围的文本翻译为<strong>...</strong>结构,表现为**粗体**。
- **关键**:被**3个星号**包围的文本翻译为<strong><em>...</em></strong>结构,表现为***粗斜体***。
- **代码**:被**1个反引号**\包围的文本翻译为<code>...</code>结构,用等宽字体表示视为代码。
- 强调、重要、关键3种修饰不会嵌套(结束后才可能开始另一个修饰),但可以包含代码。
- 代码不会包含前3种修饰(因为代码中经常包含星号,比如指针等)
- 代码无需考虑包含反引号的情况(实际产品要考虑实现转义功能)
任务:解析Markdown基本结构,并转换为HTML。
目的:掌握Markdown常用语法;练习HTML后端生成方法。
提示:
- 逐步实现功能。
- 标题、水平线、段落、列表都是以1个空行作为分隔,可以视为块结构。
- 在划分出块结构后,再修饰行中的文本。
#### 输入规格
- 整行读入并转换,直到EOF为止。
- 这题开始有Unicode字符,用UTF-8编码就好,无需特殊处理。
- 输入合乎规范,无需考虑容错。
#### 输出规格
- HTML格式文本。
- 可以重定向到HTML文件,用浏览器打开查看。
#### 样例输入
in
# 一级标题
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题
---
段落1行1
段落2行1
段落2行2
- 列表A1
- 列表B1
- 列表B2
*强调(斜体)*
**着重(粗体)**
***着重强调(粗斜体)***
a ^= b; b ^= a; a ^= b;
#### 样例输出
out
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Markdown</title>
</head>
<body>
<h1>一级标题</h1>
<h2>二级标题</h2>
<h3>三级标题</h3>
<h4>四级标题</h4>
<h5>五级标题</h5>
<h6>六级标题</h6>
<hr>
<p>段落1行1</p>
<p>段落2行1<br>
段落2行2</p>
<ul>
<li>列表A1</li>
</ul>
<ul>
<li>列表B1</li>
<li>列表B2</li>
</ul>
<p><em>强调(斜体)</em></p>
<p><strong>着重(粗体)</strong></p>
<p><strong><em>着重强调(粗斜体)</em></strong></p>
<p><code>a ^= b; b ^= a; a ^= b;</code></p>
</body>
</html>
#### 样例解释
- 测试点0:样例
- 测试点1:标题
- 测试点2:水平分割线
- 测试点3:段落
- 测试点4:列表
- 测试点5:强调等修饰
- 测试点6:代码
- 测试点7:强调修饰组合。
- 测试点8:文本修饰组合。
- 测试点9:全功能组合测试。
答案:若无答案欢迎评论