P2395 BBCode 转换 Markdown

题目背景

BBCode 和 Markdown 是两种常用的格式语言。所谓格式语言指,例如在某些网站评论区发表评论时,可以使用其对你的评论进行修饰,使文字可以有颜色、粗体等各种样式。

题目描述

BBCode 的语法如下所示: ```plaintext [h1]Hello World![/h1] [h2][i]This is a BBCode[/i][/h2] [b][i]I love[/i] Olympic [i]Informatics[/i][/b] ``` 例如,在标签 `[h1]` 中,在 `[h1]` 和 `[/h1]` 之间包裹的内容属于一级标题,对于这之间的文字要按照一级标题的样式渲染。 请注意 BBCode 要求标签的开闭必须**完整且且嵌套无误**,也就是说,如下列的例子都是不合法的 BBCode: - `[h1]Hello World!`(标签未闭合) - `[h1]Hello World![/h2]`(两个标签不匹配) - `[h1][i]Hello World![/h1][/i]`(嵌套次序错误) 另外,极其重要的一点是,BBCode 有一个特殊的标签 `[quote][/quote]`,在其中的任意文字都不应被解析为 BBCode 代码,而应该对其进行 Markdown 化处理后被原样输出。 现在介绍 Markdown。其语法如下所示: ```markdown # Hello World! # ## *This is a Markdown* ## __*I love* Olympic *Informatics*__ ``` 你的任务就是将给定的一串 BBCode 转换成 Markdown,并对不合法的输入报错。 题目数据中会出现的所有 BBCode 的标签与其对应 Markdown 对应关系如下,保证不出现除此之外的对应: | 意义 | BBCode | Markdown | |:-:|:-:|:-:| | 一级标题 | `[h1]文字[/h1]` | `# 文字 #` | | 二级标题 | `[h2]文字[/h2]` | `## 文字 ##` | | 斜体 | `[i]文字[/i]` | `*文字*` | | 粗体 | `[b]文字[/b]` | `__文字__` | | 链接 | `[url=地址]文字[/url]` | `[文字](地址)` | | 图片 | `[img=图片地址]图片说明[/img]` | `![图片说明](图片地址)` | | 代码段 | `[quote]代码[/quote]` | 对代码的每一行前添加 `>` 与一个空格 | 对于 `[quote]` 标签的附加说明: ::::info[BBCode]{open} ```plaintext [quote] import Foundation let a = 1 let b = 2 println(a+b) [/quote] ``` :::: ::::success[Markdown]{open} ```markdown > import Foundation > let a = 1 > let b = 2 > println(a+b) ``` ::::

输入格式

需转换的 BBCode。

输出格式

如果输入中的 BBCode 是合法的,则输出其转换成的 Markdown,否则输出对应的报错信息,详见“说明/提示”部分。

说明/提示

**对样例 6 的解释**:匹配到第一个关闭标签后即不认为后面的内容仍是代码段。 为保证评测顺利不被误判,请注意下列要求: 1. 尊重原输入输出的换行,不自行添删。 对于这一条的例外是, 遇到 `[quote]` 标签不在新的一行时,Markdown 中请另起一行。另外 `[quote]` 标签中的代码段头尾空行请去除。不会出现空白的 `quote`。 2. 请注意上表中的空格。 3. 对于不合法的 BBCode 输入,你的程序必须报错: - 对于匹配错误的标签输出 `Match Error`; - 对于未闭合的标签输出 `Unclosed Mark`,请参考样例。 两种情况同时出现的时候(即同时有匹配错误和未闭合的标签时),按照匹配错误处理,输出 `Match Error`。 由于 `quote` 标签的特殊性,为保证不出现歧义,数据保证 `quote` 标签不会出现错误。 例如:对于出现如 `[i][h1]Text[/i]` 这样的情况,按照 `Match Error` 处理,对于 `[i][h1]Text[/h1]` 这样的情况,按照 `Unclosed Mark` 处理。 保证以下七个字符不出现在除 `quote` 标签包裹的段落中的文字中:`[`、`]`、`/`、`*`、`_`、`#`、`>`,但地址中可能会出现 `/` 字符。 保证输入不会出现标签不完整的情况,例如 `[h1]Text[/h`。 对于曾经在其他地方使用过 Markdown 与 BBCode 的同学:题中的格式不是严格的 BBCode 与 Markdown 格式,请勿被经验迷惑。