3244. Markdown
作者:
浩淼大海
,
2024-11-22 21:10:41
,
所有人可见
,
阅读 5
#include<bits/stdc++.h>
using namespace std;
const int N=1e6;
vector<string> strs;
//先处理区块
//区块后处理两种情况:1,仅强调;2,超链接嵌套强调(一层)
int link(string str,int i){
string text, link1;
for(i++;str[i]!=']';i++){
char c=str[i];
if(c=='_'){
text += "<em>";
i ++ ;
while (str[i] != '_') text += str[i ++ ];
text += "</em>";
}else{
text+=str[i];
}
}
for(i+=2;str[i]!=')';i++){
link1+=str[i];
}
printf("<a href=\"%s\">%s</a>", link1.c_str(), text.c_str());
return i;
}
int en(string str,int i){
printf("<em>");
for (i ++; str[i] != '_'; i ++ )
{
char c = str[i];
if (c == '[') i = link(str, i);
else cout << c;
}
printf("</em>");
return i;
}
void work_line(string s){
int k=0;
while(s[k]==' ') k++;//处理开头的空格
s=s.substr(k);
char a;
for(int i=0;i<s.size();i++){
a=s[i];
if(a=='_'){
i=en(s,i);
}else if(a=='['){
i=link(s,i);
}else cout<<a;
}
}
void work(int a,int b){//传入的是非空行的下标
//
if(strs[a][0]=='#'){
int k=0;
while(strs[a][k]=='#') k++;
printf("<h%d>",k);
work_line(strs[a].substr(k));
printf("</h%d>\n", k);
}else if(strs[a][0]=='*'){
printf("<ul>\n");
for(int i=a;i<=b;i++){
printf("<li>");
work_line(strs[i].substr(1));
printf("</li>\n");
}
printf("</ul>\n");
}else{
printf("<p>");
for(int i=a;i<=b;i++){
work_line(strs[i]);
if(i!=b) cout<<endl;
}
printf("</p>\n");
}
}
int main(){
string a;
while(getline(cin,a)) strs.push_back(a);//只要有输入,无论是否空都读入
for(int i=0;i<strs.size();i++){
if(strs[i].empty()) continue;
int j=i+1;
while(j<strs.size()&&strs[j].size()) j++;//这里遇到了连续的一段文字,找到他的首尾下标
work(i,j-1);
i=j-1;//i在循环自动++
}
return 0;
}
printf输出字符串有问题,参照题解代码
或换成 cout<<”[HTML_REMOVED]“<[HTML_REMOVED]“;