#include<bits/stdc++.h>
using namespace std;
//一个区块一个区块地处理
//标题和无序列表比较特殊,它们在首个字符特征显著且除它们之外,其他都当段落处理
void solve(string lines)
{
//处理下划线,标签<em></em>
//size_t是unsigned int
size_t leftp = lines.find("_"); //返回字符_在字符串中第一次出现的位置,如果没有找到则返回string::npos
while(leftp != string::npos)
{
lines.replace(leftp, 1, "<em>"); //用"<em>"替代lines中的1个字符(从leftp开始)
//要先替换后再找,不然下标会不对
size_t rightp = lines.find("_", leftp+1); //起始位置
lines.replace(rightp, 1, "</em>");
leftp = lines.find("_", rightp+1);
}
//处理方括号
leftp = lines.find("[");
while(leftp != string::npos)
{
size_t rightp = lines.find("]", leftp+1);
size_t leftp2 = lines.find("(", rightp+1);
size_t rightp2 = lines.find(")", leftp2+1);
string tmp1 = lines.substr(leftp+1, rightp-leftp-1); //分别为起始位置和长度
string tmp2 = lines.substr(leftp2+1, rightp2-leftp2-1);
// basic_string &replace( iterator start, iterator end, const basic_string &str );
lines.replace(lines.begin()+leftp, lines.begin()+rightp2+1, "<a href=\"" + tmp2 + "\">" + tmp1 +"</a>"); //[leftp,rightp2]
leftp = lines.find("[", rightp2+1);
}
//处理#标签,<h></h>
if(lines[0]=='#')
{
int i=1;
while(lines[i]=='#') i++;
int j = i;
while(lines[j]==' ') j++;
//substr()返回本字符串的一个子串,从index开始,长num个字符,如果没有指定,将是默认值 string::npos。
//这样,substr()函数将简单的返回从index开始的剩余的字符串。
lines = "<h" + string(1, '0'+i) + ">" + lines.substr(j);
lines.insert(lines.size()-1, "</h" + string(1, '0'+i) + ">"); //不用"+="是因为lines最后一个字符是"\n"
}
//处理*,标签<ul><li></li>......</ul>
else if(lines[0]=='*')
{
leftp = 0;
while(leftp!=string::npos)
{
int i=leftp+1;
while(lines[i]==' ') i++;
size_t rightp = lines.find("\n", i);
//先插入在替代,因为要处理下标是后面,要处理前面的会导致后面的下标不正确
lines.insert(rightp, "</li>");
lines.replace(leftp, i-leftp, "<li>");
leftp = lines.find("*", rightp+1);
}
lines.insert(0, "<ul>\n");
lines.insert(lines.size(), "</ul>\n");
}
//处理段落
else
{
lines = "<p>" + lines.substr(0, lines.size()-1) + "</p>\n"; //长度减1是因为最后一个字符是换行符
}
cout<<lines;
}
int main()
{
std::string line, lines="";
//getline函数:从istream中读取一行数据,当遇到“\n”时结束返回,但cin不会主动删除输入流内的换行符
//不用cin.ignore() 因为文本中会有多个换行符
std::getline(std::cin, line);
bool flag = false;
while(1)
{
if(line.size()>0) lines += line + "\n";
else if(line.size()==0 && lines.size()>0) //line.size()==0表示空行
{
solve(lines);
lines = "";
}
if(flag) break;
if(!getline(cin, line)) flag = true;
}
return 0;
}
/*
# Heading
## Sub-heading
Paragraphs are separated
by a blank line.
text attributes _italic_.
Bullet list:
* apples
* oranges
* pears
A [link](http://example.com).
*/
CCF201703-3 Markdown
最新推荐文章于 2020-03-25 13:07:34 发布