201703-3 Markdown

问题描述
  Markdown 是一种很流行的轻量级标记语言(lightweight markup language),广泛用于撰写带格式的文档。例如以下这段文本就是用 Markdown 的语法写成的:

  这些用 Markdown 写成的文本,尽管本身是纯文本格式,然而读者可以很容易地看出它的文档结构。同时,还有很多工具可以自动把 Markdown 文本转换成 HTML 甚至 Word、PDF 等格式,取得更好的排版效果。例如上面这段文本通过转化得到的 HTML 代码如下所示:

  本题要求由你来编写一个 Markdown 的转换工具,完成 Markdown 文本到 HTML 代码的转换工作。简化起见,本题定义的 Markdown 语法规则和转换规则描述如下:
  ●区块:区块是文档的顶级结构。本题的 Markdown 语法有 3 种区块格式。在输入中,相邻两个区块之间用一个或多个空行分隔。输出时删除所有分隔区块的空行。
  ○段落:一般情况下,连续多行输入构成一个段落。段落的转换规则是在段落的第一行行首插入 <p>,在最后一行行末插入 </p>
  ○标题:每个标题区块只有一行,由若干个 # 开头,接着一个或多个空格,然后是标题内容,直到行末。# 的个数决定了标题的等级。转换时,# Heading 转换为 <h1>Heading</h1>## Heading 转换为 <h2>Heading</h2>,以此类推。标题等级最深为 6。
  ○无序列表:无序列表由若干行组成,每行由 * 开头,接着一个或多个空格,然后是列表项目的文字,直到行末。转换时,在最开始插入一行 <ul>,最后插入一行 </ul>;对于每行,* Item 转换为 <li>Item</li>。本题中的无序列表只有一层,不会出现缩进的情况。
  ●行内:对于区块中的内容,有以下两种行内结构。
  ○强调:_Text_ 转换为 <em>Text</em>。强调不会出现嵌套,每行中 _ 的个数一定是偶数,且不会连续相邻。注意 _Text_ 的前后不一定是空格字符。
  ○超级链接:[Text](Link) 转换为 <a href="Link">Text</a>。超级链接和强调可以相互嵌套,但每种格式不会超过一层。
输入格式
  输入由若干行组成,表示一个用本题规定的 Markdown 语法撰写的文档。
输出格式
  输出由若干行组成,表示输入的 Markdown 文档转换成产生的 HTML 代码。
样例输入

Hello

Hello, world!
样例输出

Hello

Hello, world!

评测用例规模与约定
  本题的测试点满足以下条件:
  ●本题每个测试点的输入数据所包含的行数都不超过100,每行字符的个数(包括行末换行符)都不超过100。
  ●除了换行符之外,所有字符都是 ASCII 码 32 至 126 的可打印字符。
  ●每行行首和行末都不会出现空格字符。
  ●输入数据除了 Markdown 语法所需,内容中不会出现 #*_[]()<>& 这些字符。
  ●所有测试点均符合题目所规定的 Markdown 语法,你的程序不需要考虑语法错误的情况。
  每个测试点包含的语法规则如下表所示,其中“√”表示包含,“×”表示不包含。

字符串处理,注意网址和强调的嵌套,似乎没有把另一半符号也去嵌套进去的情况
查了下拷贝一部分字符串的方法:
string t(s,pos1,pos2),不过这里用不着……

#include <iostream>
#include <stdio.h>
#include <map>
#include <set>
#include <queue>
#include <algorithm>
#include <vector>
#include <math.h>
#include <iterator>
#include <string.h>
using namespace std;
typedef long long ll;
int mo[4][2]={0,1,1,0,0,-1,-1,0};
const int MAXN=0x3f3f3f3f;
const int sz=1005;
string s[105],ans[105];

void get(int x,int k,int p,int ed){
    int i;
    int em=-1,l1,l2,r1,r2;
    for(i=p;i<ed;i++){
        if(s[x][i]=='_'){
            while(s[x][i]=='_') i++;
            ans[k]+="<em>";
            em=i;
            for(int j=i;j<ed;j++){
                if(s[x][j]=='_'){
                    get(x,k,em,j);
                    ans[k]+="</em>";
                    i=j;
                    while(s[x][i+1]=='_') i++;
                    break;
                }
            }
        }else if(s[x][i]=='['){
            ans[k]+="<a href=\"";
            l1=i+1;
            int j;
            for(j=i;j<ed;j++){
                if(s[x][j]==']'){
                    r1=j;
                    j++;
                    break;
                }
            }
            for(;j<ed;j++){
                if(s[x][j]=='('){
                    l2=j+1;
                }
                if(s[x][j]==')'){
                    r2=j;
                    break;
                }
            }
            i=j;
            get(x,k,l2,r2);
            ans[k]+="\">";
            get(x,k,l1,r1);
            ans[k]+="</a>";
        }else{
            ans[k]+=s[x][i];
        }
    }
}

int main()
{
    //freopen("r.txt","r",stdin);
    int n,m,cot,t,k,lt,pt;
    cot=0;
    lt=0;
    k=0;
    pt=0;
    while(getline(cin,s[cot])){
        cot++;
    }
    for(int i=0;i<cot;i++){
        if(s[i].length()==0) continue;
        if(s[i][0]=='#'){
            t=1;
            int j;
            for(j=1;j<s[i].length();j++){
                if(s[i][j]=='#'){
                    t++;
                }else{
                    break;
                }
            }
            for(;j<s[i].length();j++){
                if(s[i][j]!=' ') break;
            }
            ans[k]+="<h";
            char c='0'+t;
            ans[k]+=c;
            ans[k]+='>';
            get(i,k,j,s[i].length());
            ans[k]+="</h";
            ans[k]+=c;
            ans[k]+='>';
            k++;
        }else if(s[i][0]=='*'){
            if(!lt){
                lt=1;
                ans[k]+="<ul>";
                k++;
            }
            int j=1;
            for(;j<s[i].length();j++){
                if(s[i][j]!=' ') break;
            }
            ans[k]+="<li>";
            get(i,k,j,s[i].length());
            ans[k]+="</li>";
            k++;
            if(i+1==cot||s[i+1][0]!='*'){
                lt=0;
                ans[k]+="</ul>";
                k++;
            }
        }else{
            if(!pt){
                pt=1;
                ans[k]+="<p>";
            }
            get(i,k,0,s[i].length());
            if(i+1==cot||s[i+1].length()==0){
                pt=0;
                ans[k]+="</p>";
            }
            k++;
        }
    }
    for(int i=0;i<k;i++){
        cout<<ans[i]<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值