模拟 - Markdown - 第十次CCF计算机软件能力认证
分解成小的模块,写一部分,测试一部分。
技巧:
要 修 改 字 符 串 中 间 的 某 一 部 分 时 , 可 以 从 前 到 后 扫 描 , 然 后 用 一 个 空 字 符 串 类 加 得 到 新 的 结 果 。 要修改字符串中间的某一部分时,可以从前到后扫描,然后用一个空字符串类加得到新的结果。 要修改字符串中间的某一部分时,可以从前到后扫描,然后用一个空字符串类加得到新的结果。
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
vector<string> str;
int next_char(string & line, int p)
{
while(line[p] == ' ') p ++;
return p;
}
string cal_em(string & line)
{
string s = "";
for(int i = 0, j = 0; line[i]; i ++)
{
if(line[i] == '_')
{
if(!j)
{
s += "<em>";
j ^= 1;
}
else
{
s += "</em>";
j ^= 1;
}
continue;
}
s += line[i];
}
return s;
}
string cal_link(string & line)
{
string s = "", text = "", link = "";
for(int i = 0; line[i]; i++)
{
if(line[i] == '[')
{
s += "<a href=\"";
int j = i + 1;
while(j < line.size() && line[j] != ']') j ++;
text = line.substr(i+1, j-i-1);
i = j + 1; //'('
while(j < line.size() && line[j] != ')') j ++;
link = line.substr(i+1, j-i-1);
s += link + "\">" + text + "</a>";
i = j;
continue;
}
s += line[i];
}
return s;
}
void to_head(int k)
{
string line = str[k];
int cnt = 0;
for(int i = 0; i < line.size(); i ++)
{
if(line[i] == '#') cnt ++;
else if(line[i] == ' ')
{
int j = next_char(line, i + 1);
string res = line.substr(j);
if(res.find('_') != -1) res = cal_em(res);
if(res.find('[') != -1) res = cal_link(res);
cout<<"<h"<<cnt<<">"<<res<<"</h"<<cnt<<">"<<endl;
return ;
}
}
}
void to_list(int k)
{
string line = str[k];
if(k-1 >= 0 && !str[k-1].size() || k-1 < 0) cout<<"<ul>"<<endl;
int j = next_char(line, 1);
string res = line.substr(j);
if(res.find('_') != -1) res = cal_em(res);
if(res.find('[') != -1) res = cal_link(res);
cout<<"<li>"<<res<<"</li>"<<endl;
if(k+1 < str.size() && !str[k+1].size() || k+1 >= str.size()) cout<<"</ul>"<<endl;
}
void to_paragraph(int k)
{
string line = str[k];
if(k-1 >= 0 && !str[k-1].size() || k-1 < 0) cout<<"<p>";
if(line.find('_') != -1) line = cal_em(line);
if(line.find('[') != -1) line = cal_link(line);
cout<<line;
if(k+1 < str.size() && str[k+1].size()) cout<<endl;
if(k+1 < str.size() && !str[k+1].size() || k+1 >= str.size()) cout<<"</p>"<<endl;
}
void solve(int k)
{
string & line = str[k];
if(line[0] == '#') to_head(k);
else if(line[0] == '*') to_list(k);
else to_paragraph(k);
}
int main()
{
string line;
while(getline(cin, line)) str.push_back(line);
for(int i = 0; i < str.size(); i ++)
{
if(!str[i].size()) continue;
solve(i);
}
return 0;
}