非常に識別可能なシミュレーションの質問、私は1.5時間やりました〜
本質的に、強調とリンクの影響を考慮しなければ、最初の3つの状況を作ることは難しくありません。
しかし、このトピックが深まる
につれ、このトピックを作成する上で2つの主な問題があることがわかりました。1。入力段落から入力フォームへの切り替え、入力フォームから入力段落への切り替えなど、入力状態の遷移を考慮する必要があります。
2.強調されているが入れ子はありませんが、リンクの入れ子と強調があります。処理を強調してからリンクを処理できます。2つの順次処理は影響を受けません(簡単にアクセスできるように置換形式を確認できます)。
#include<bits/stdc++.h>
using namespace std;
string s;
void f1();
void f2();
void f3();
string pr1(string s);
string pr2(string s);
string pr1(string s){
string ans;
for(int i=0;s[i];i++){
if(s[i]=='_'){
//cout<<s<<"a"<<endl;
int j=i+1;
while(s[j]&&s[j]!='_')j++;
string tepp="<em>"+s.substr(i+1,j-i-1)+"</em>";
ans+=tepp;
i=j;
continue;
}
ans+=s[i];
}
ans=pr2(ans);
return ans;
}
string pr2(string s){
string ans;
for(int i=0;s[i];i++){
if(s[i]=='['){
//cout<<s<<"a"<<endl;
int j=i+1,cun;
while(s[j]&&s[j]!=']')j++;
string text=s.substr(i+1,j-i-1);
cun=j+2;
j+=2;
while(s[j]!=')')j++;
string link=s.substr(cun,j-cun);
string tepp="<a href=\""+link+"\">"+text+"</a>";
ans+=tepp;
i=j;
continue;
}
ans+=s[i];
}
return ans;
}
void f1(){
int cnt=0;
while(cnt<s.size()&&s[cnt]=='#')cnt++;
int cun=cnt;
while(cnt<s.size()&&s[cun]==' ')cun++;
cout<<"<h"<<cnt<<'>'<<pr1(s.substr(cun,s.size()-cun))<<"</h"<<cnt<<'>'<<endl;
}
void f2(){
cout<<"<ul>"<<endl;
int tep=1;
while(tep<s.size()&&s[tep]==' ')tep++;
cout<<"<li>"<<pr1(s.substr(tep,s.size()-tep))<<"</li>"<<endl;
while(getline(cin,s)){
if(s=="")break;
if(s[0]=='#'){
cout<<"</ul>"<<endl;
f1();
return;
}
if(s[0]!='*'){
cout<<"</ul>"<<endl;
f3();
return;
}
int tep=1;
while(tep<s.size()&&s[tep]==' ')tep++;
cout<<"<li>"<<pr1(s.substr(tep,s.size()-tep))<<"</li>"<<endl;
}
cout<<"</ul>"<<endl;
}
void f3(){
cout<<"<p>"<<pr1(s);
while(getline(cin,s)){
if(s==""){
cout<<"</p>"<<endl;
return;
}
else if(s[0]=='#'){
cout<<"</p>"<<endl;
f1();
return;
}
else if(s[0]=='*'){
cout<<"</p>"<<endl;
f2();
return;
}
cout<<endl<<pr1(s);
}
cout<<"</p>"<<endl;
}
int main(){
while(getline(cin,s)){
if(s=="")continue;
if(s[0]=='#'){
f1();
}
else if(s[0]=='*'){
f2();
}
else if(s[0]!='#'&&s[0]!='*')f3();
}
}