Markdown渲染器

#include <iostream>
#include <vector>
using namespace std;

struct Markdown{
    int type;//标记相应的类型 0 空行,1 项目列表第一行 2项目列表其余行 3段落
    string s; 
};

bool isSpace(string s){//判断是否为空行
    for(int i=0;i<s.size();++i)
    {
        if(s[i]!=' ')
        return false;
     } 
     return true;
} 

string remove_space(string s){//去除首尾的空格
    int pos1=0,pos2=s.length()-1;
    for(int i=0;i<s.length();++i){
        if(s[i]!=' '){
            pos1 =i;
            break;
        }
    } 
    for(int i=s.length()-1;i>=0;i--){
        if(s[i]!=' '){
            pos2=i;
            break;
        }
    }
    string temp =s.substr(pos1,pos2-pos1+1);
    return temp;
} 
vector<Markdown> vec;
int main()
{
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    Markdown temp;
    int w,flag=0;//flag标记当前输入行的前一行类型 
    string str;
    cin>>w; 
    while(getline(cin,str))
    {
        if(isSpace(str)){//处理空行
            if(flag){//上一行不是空行,就添加一个空行
                temp.s="";
                temp.type=0;
                vec.push_back(temp);
                flag=0; 
            } 
            continue;
        }
        if(str.size()>=2 && str[0]=='*' && str[1]==' '){//处理项目列表的第一行
            if(flag==3){//上一行是一个段落,就插入一行空行隔开
                temp.s="";
                temp.type=0;
                vec.push_back(temp); 
            }
            //把项目列表再放入vec中
            temp.type=1;temp.s=remove_space(str.substr(2,str.size()));
            vec.push_back(temp);
            flag=1;
        }
        else if(str.size()>=2 && str[0]==' ' && str[1]==' ' &&(flag==1 || flag==2)){
            if(vec[vec.size()-1].s==""){//项目列表第一行为空
                vec[vec.size()-1].s = remove_space(str);
            }
            else
            {
                vec[vec.size()-1].s =vec[vec.size()-1].s+" "+remove_space(str);
            }
            flag=2;
        }
        else{//处理段落 
            if(flag==1 || flag==2){
                temp.s="";
                temp.type=0;
                vec.push_back(temp);
                temp.s=remove_space(str);
                temp.type=3;
                vec.push_back(temp);
            }else if(flag ==3){
                vec[vec.size()-1].s = vec[vec.size()-1].s+" " +remove_space(str);
            }
            else{
                temp.s = remove_space(str);
                temp.type = 3;
                vec.push_back(temp);
            }
            flag=3;
        }
    }
        long long int ans=0;
        for(int i=0;i<vec.size();++i){
            int type =vec[i].type;
            string s=vec[i].s;
            if(!type) {
            ans++;
            //cout<<endl;//空行 
            }
            else if(type ==1 ||type ==2){//项目列表 
                if(!s.size()){
                    ans++;
                    continue;
                }
                int t=0;
                while(t<s.size()){
                    while(1){//保证每行的开头不是空格 
                    if(t>=s.size()) break;
                    if(s[t]!=' ')break;
                    t++;
                    }
                    //cout<<s.substr(t,w-3)<<endl;
                    t+=(w-3);
                    ans++;
                }
            }
            else{
                int t=0;
                while(t<s.size()){
                    while(1){//保证每行的开头不是空格 
                    if(t>=s.size()) break;
                    if(s[t]!=' ')break;
                    t++;
                    }
                    //cout<<s.substr(t,w)<<endl;
                    t+=w;
                    ans++;
            }
        }
    }
    if(!vec[vec.size()-1].type)
    ans--;
    cout<<ans<<endl;
    return 0;
}

注意:分清楚要处理的对象分为几类:标好类,每一类有每一类自己独特的处理方法,总结出当前行和上一行之间的关系。

posted @ 2020-08-28 17:00  zmachine  阅读(841)  评论(0编辑  收藏  举报