编程题:Markdown渲染器v1
Markdown是一种轻量级标记语言,由John Gruber和Aaron Swartz在2004年创造。通过易读易写的纯文本格式编写Markdown文件,可以方便地转换成HTML、PDF、PPT等格式。很多云笔记、代码托管等网站支持用Markdown格式写文档,PTA题面也是用Markdown写的。完成本题后您将立即成为Markdown行家。
Markdown语法很简单,大约只有12类。V1版只需实现以下功能:
- **标题**(heading):**行首为1到6个#字符、后接一个空格**,表示一至六级标题,翻译为<h1>...</h1>结构。
- 标题只允许一行(不用考虑多行)。
- 标题与其他结构必须由一个空行隔开。
- 标题内容保持原样(标题中无其他格式)
- **水平线**(horizontal rule):单独一行的---为水平线,翻译为<hr>标签。
- 水平线与其他结构必须由一个空行隔开。
- **段落**(paragraph):由空行分隔的**多行文本**,被翻译为<p>...</p>段落结构。
- 除末行以外,段落中的行需要追加<br>表示换行。
- **无序列表**(unordered list):**以-开头,后接一个空格**,后续**单行文本**。翻译为:
html
<ul>
<li> aaa
<li> bbb
</ul>
- 连续的列表项汇集在同一<ul>...</ul>结构中。
- 只需实现单级列表。
- 列表与其他结构必须由一个空行隔开。
- **文本**中可有以下修饰:
- **强调**(emphasizing):被**1个星号包围**的文本表现为斜体,翻译为<em>...</em>结构。
- **重要**(strong importance):被**2个星号包围**的文本表现为粗体,翻译为<strong>...</strong>结构。
- **至关重要**:被**3个星号包围**的文本表现为粗斜体,翻译为<strong><em>...</em></strong>结构。
- **代码**(code):被**反引号**\包围的视为代码,用等宽字体表示,翻译为<code>...</code>结构。
任务:解析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>
#### 样例解释
无发可说。
答案:若无答案欢迎评论
Markdown语法很简单,大约只有12类。V1版只需实现以下功能:
- **标题**(heading):**行首为1到6个#字符、后接一个空格**,表示一至六级标题,翻译为<h1>...</h1>结构。
- 标题只允许一行(不用考虑多行)。
- 标题与其他结构必须由一个空行隔开。
- 标题内容保持原样(标题中无其他格式)
- **水平线**(horizontal rule):单独一行的---为水平线,翻译为<hr>标签。
- 水平线与其他结构必须由一个空行隔开。
- **段落**(paragraph):由空行分隔的**多行文本**,被翻译为<p>...</p>段落结构。
- 除末行以外,段落中的行需要追加<br>表示换行。
- **无序列表**(unordered list):**以-开头,后接一个空格**,后续**单行文本**。翻译为:
html
<ul>
<li> aaa
<li> bbb
</ul>
- 连续的列表项汇集在同一<ul>...</ul>结构中。
- 只需实现单级列表。
- 列表与其他结构必须由一个空行隔开。
- **文本**中可有以下修饰:
- **强调**(emphasizing):被**1个星号包围**的文本表现为斜体,翻译为<em>...</em>结构。
- **重要**(strong importance):被**2个星号包围**的文本表现为粗体,翻译为<strong>...</strong>结构。
- **至关重要**:被**3个星号包围**的文本表现为粗斜体,翻译为<strong><em>...</em></strong>结构。
- **代码**(code):被**反引号**\包围的视为代码,用等宽字体表示,翻译为<code>...</code>结构。
任务:解析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>
#### 样例解释
无发可说。
答案:若无答案欢迎评论