-->
当前位置:首页 > 题库 > 正文内容

编程题:Markdown渲染器v1

Luz3年前 (2022-04-10)题库931
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:全功能组合测试。





答案:若无答案欢迎评论

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。