Markdown 是一種很流行的輕量級標記語言(lightweight markup language),普遍用於撰寫帶格式的文檔。例如如下這段文本就是用 Markdown 的語法寫成的:c++
這些用 Markdown 寫成的文本,儘管自己是純文本格式,然而讀者能夠很容易地看出它的文檔結構。同時,還有不少工具能夠自動把 Markdown 文本轉換成 HTML 甚至 Word、PDF 等格式,取得更好的排版效果。例如上面這段文本經過轉化獲得的 HTML 代碼以下所示:函數
<p>
,在最後一行行末插入 </p>
。#
開頭,接着一個或多個空格,而後是標題內容,直到行末。#
的個數決定了標題的等級。轉換時,# Heading
轉換爲 <h1>Heading</h1>
,## Heading
轉換爲 <h2>Heading</h2>
,以此類推。標題等級最深爲 6。*
開頭,接着一個或多個空格,而後是列表項目的文字,直到行末。轉換時,在最開始插入一行 <ul>
,最後插入一行 </ul>
;對於每行,* Item
轉換爲 <li>Item</li>
。本題中的無序列表只有一層,不會出現縮進的狀況。_Text_
轉換爲 <em>Text</em>
。強調不會出現嵌套,每行中 _
的個數必定是偶數,且不會連續相鄰。注意 _Text_
的先後不必定是空格字符。超級連接:[Text](Link)
轉換爲 <a href="Link">Text</a>
。超級連接和強調能夠相互嵌套,但每種格式不會超過一層。工具
輸入由若干行組成,表示一個用本題規定的 Markdown 語法撰寫的文檔。測試
輸出由若干行組成,表示輸入的 Markdown 文檔轉換成產生的 HTML 代碼。spa
# Hellocode
Hello, world!ci
<h1>Hello</h1>
<p>Hello, world!</p>文檔
#
、*
、_
、[
、]
、(
、)
、<
、>
、&
這些字符。#include <bits/stdc++.h> using namespace std; string str,tar; // link and em can 嵌套 // TODO string link(int&); string em(int &i) { i++; string s; for(;str[i]!='_';i++) { if(str[i]!='[') s+=str[i]; else s+=link(i); } return "<em>"+ s +"</em>"; } string link(int& i) { i++; string s1,s2,s; for(;str[i]!=']';i++) { if(str[i]=='_') s1+=em(i); else s1+=str[i]; } while(str[i]!='(') i++; for(i++;str[i]!=')';i++) { if(str[i]=='_') s2+=em(i); else s2+=str[i]; } return "<a href=\""+s2+"\">"+s1+"</a>"; } string transText(int &i) { string mid; for(;i<str.size();i++) { if(str[i]=='_') mid+=em(i); else if(str[i]=='[') mid+=link(i); else mid+=str[i]; } return mid; } void transHead() { int i=0,lev=0; string first , end,mid; for(;str[i]=='#';i++)lev++; char l= lev+'0'; string le ;le+=l; first = "<h" + le+ ">"; end = "</h"+ le+">"; mid=first; for(;str[i]==' ';i++); mid+=transText(i); mid = mid + end +'\n'; tar+=mid; } void transList() { string first = "<ul>" , end = "</ul>"; string midFirst = "<li>",midEnd = "</li>"; tar = tar + first +'\n'; do{ string mid; int i=1; while(str[i]==' ') i++; mid+=transText(i); tar = tar + midFirst+mid+midEnd+'\n'; }while(getline(cin,str)&&str!=""); tar = tar + end +'\n'; } void transPara() { tar = tar+"<p>"; int i=0; tar = tar + transText(i); while(getline(cin,str)&&str!="") { int i=0; tar =tar +'\n' + transText(i); } tar = tar + "</p>\n"; } int main() { while(getline(cin,str)) { if(str=="")continue; else if(str[0]=='#') transHead(); else if(str[0]=='*') transList(); else transPara(); } cout<<tar; return 0; }