题目
这道题相比于202006-3Markdown渲染器要简单得多。输入中已经用空行分好了区块,主函数先判断输入的串是否空行,然后再根据第一个字符判断是标题、列表还是段落,只需要进行简单的操作。随后调用行内容处理函数处理强调和超链接的情况。
题目已经极大地简化了处理过程,基本上没有难度。
#include <bits/stdc++.h>
using namespace std;
int state=0;//0:初始态;1:段落;2:列表
string Highlight(string str)
{
bool tag=false;
string tmp="";
string t="";
for(int i=0;i<str.length();i++)
{
if(!tag&&str[i]=='_')
{
tag=true;
t+="<em>";
}
else if(tag&&str[i]=='_')
{
tag=false;
t+=tmp+"</em>";
tmp="";
}
else if(tag) tmp+=str[i];
else if(!tag) t+=str[i];
}
return t;
}
string Hyper_link(string str)
{
int tag1=0,tag2=0;
string t="",tmp1="",tmp2="";
for(int i=0;i<str.length();i++)
{
if(tag1==0&&str[i]=='[')
{
tag1=1;
}
else if(tag1==1&&str[i]==']') tag1=2;
else if(tag2==0&&tag1==2&&str[i]=='(') tag2=1;
else if(tag2==1&&str[i]==')')
{
tag1=0;
tag2=0;
t+="<a href=\""+tmp2+"\">"+tmp1+"</a>";
tmp1="";
tmp2="";
}
else if(tag1==1) tmp1+=str[i];
else if(tag2==1) tmp2+=str[i];
else t+=str[i];
}
return t;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
string str;
while(getline(cin,str))
{
if(str=="")
{
if(state==1)
{
cout<<"</p>"<<endl;
}
else if(state==2)
{
cout<<"</ul>"<<endl;
}
state=0;
}
else if(str[0]=='#')
{
int cnt=0;
string t="";
bool flag1=false;
bool flag2=false;
for(int i=0;i<str.length();i++)
{
if(!flag1&&str[i]=='#') cnt++;
else if(!flag1&&str[i]==' ')
{
flag1=true;
}
else if(!flag2&&str[i]==' ') continue;
else if(!flag2&&str[i]!=' ')
{
t+=str[i];
flag2=true;
}
else t+=str[i];
}
t=Highlight(t);
t=Hyper_link(t);
cout<<"<h"+to_string(cnt)+">"+t+"</h"+to_string(cnt)+">"<<endl;
}
else if(str[0]=='*')
{
int i=1;
while(str[i]==' ') i++;
string t="";
for(;i<str.length();i++)
{
t+=str[i];
}
t=Highlight(t);
t=Hyper_link(t);
if(state==0) cout<<"<ul>"<<endl;
cout<<"<li>"+t+"</li>"<<endl;
state=2;
}
else
{
str=Highlight(str);
str=Hyper_link(str);
if(state==0) cout<<"<p>"<<str;
else cout<<endl<<str;
state=1;
}
}
if(state==1) cout<<"</p>"<<endl;
else if(state==2) cout<<"</ul>"<<endl;
return 0;
}