用html+javascript打造公文一键排版系统4:一级标题排版

完成公文标题的排版后,我们要进行对正文中的标题进行处理。

一般正文中的标题分为四级,文中结构层次序数依次可以用“一、”“(一)”“1.”“(1)”标注;一般第一层用黑体字、第二层用楷体字加粗、第三层和第四层用仿宋体字标注。

我们先定义一个设置一个段落文字格式的函数setParaFmt,来分别对各级标题进行排版。

//功能:设置段落格式set paragraph format
//输入:p:段落文字
//输出:设置格式的文本
function setParaFmt(p)
{
	switch (getTitleLevel(p))
	{
		case 1:
			t = setParaTitle1(p);//一级标题
			break;
		case 2:
			t = setParaTitle2(p);//二级标题
			break;
		case 3:
			t = setParaTitle3(p);//三级标题
			break;
		default:	//main text正文
			t = '

' + p; }//switch taDbg.value += "\n---setParaFmt:" + t; return t; }//setParaFmt(p)

其中首先调用getTitleLevel(p)函数来判断一个段落文字格式包括几级标题,再调用相应的函数来进行格式设置。

//功能:获取文字串的标题级别
//输入:p:文字串
//输出:1:一级标题,2:二级标题,3:三级标题,0:其它
function getTitleLevel(p)
{
    taDbg.value += "\n---getTitleLevel:" + p;

    if (isIncludePrimaryTitle(p))//一级标题
    {
        return 1;
    }

    //二级标题
    /*
    return 2;
    */

    //三级标题
    /*
    return 3;
    */

    return 0;
}//getTitleLevel(p)


我们先实现对一级标题的排版。

思路是逐段分析要处理的文字,

首先要判断否包括一级标题:如果文字以一~十开头,紧接着一个顿号,那么我们就可以判断这里包括一级标题。

实现方法有两种:

第一种方法以顿号为突破口:

利用indexOf()获取字符串中第一个顿号的位置,如果返回值是-1,说明没有包含顿号,不包含一级标题。

如果字符串包括顿号,我们成功获取第一个顿号的位置,则截取顿号前的字符串,利用正则表达式判断是否为一~十的字符,如果是,那么就是一级标题,如果不全是,就不是一级标题。

代码如下:

//判断是否包括一级标题的方法一:以顿号为突破口
//是否为只包含一二三四五六七八九十的字符串
String.prototype.isCnNum = function() 
{
    //[\u4e00|\u4e8c|\u4e09|\u56db|\u4e94|\u516d|\u4e03|\u516b|\u4e5d|\u5341] = [一二三四五六七八九十]
    return (/^[\u4e00|\u4e8c|\u4e09|\u56db|\u4e94|\u516d|\u4e03|\u516b|\u4e5d|\u5341]+$/.test(this));
}

function isIncludePrimaryTitle(p)
{
    var t = p.indexOf('、');//获取第一个顿号的位置
    return ((-1 != t) && (p.substring(0,t).isCnNum())) ? true : false;
}//isIncludePrimaryTitle(p)

这里我们用isCnNum来判断字符串中是否全为一~十之间的汉字。

第二种办法就是直接使用正则表达式一步到位,代码如下:

//判断是否包括一级标题的方法二:正则表达式
function isIncludePrimaryTitle(p)
{
    return /^[\u4e00|\u4e8c|\u4e09|\u56db|\u4e94|\u516d|\u4e03|\u516b|\u4e5d|\u5341]+[\u3001]{1}/.test(p); //可匹配“ 一、大力”中的“一、”
    //return /^\s*[\u4e00|\u4e8c|\u4e09|\u56db|\u4e94|\u516d|\u4e03|\u516b|\u4e5d|\u5341]+[\u3001]{1}/.test(p); //可匹配“   一、大力”或“ 一、大力”中的“一、”
}//isIncludePrimaryTitle(p)


在确定文字包含一级标题后,我就调用setParaTitle1()来进行排版:
 

//功能:设置一级标题set paragraph format with primay title 
//输入:t:文字
//输出:无
function setParaTitle1(t)
{
    var r;
    if (ptIsALine(t))     //标题是否单独成行
    {
        //return '

' + s;         r = '

' + t;     }     else     {         //标题不单独成行         var n = t.indexOf('。');         r = '

' + t.substring(0, n) + '' +     t.substring(n);     }     taDbg.value += "\n---setParaTitle1:" + r;          return r; }

然后要分析判断这段文字是否只包含标题,还是在标题后面连着正文。

判断的方法是:

用indexOf获取第一个句号的位置n,如果n位于段末,那么文字是独立标题行。

否则,要判断段末是否以标点符号结尾,如果是以标点符号结尾,那么文字不是独立标题行,否则就是独立标题行,这里的标点符号我们同时考虑中文和英文的。

代码如下:

//判断是否为中文标点符号
String.prototype.isCnPunctuation = function() 
{ 
/*
    var reg = /[\u3002|\uff1f|\uff01|\uff0c|\u3001|\uff1b|\uff1a|\u201c|\u201d|\u2018|\u2019|\uff08|\uff09|\u300a|\u300b|\u3008|\u3009|\u3010|\u3011|\u300e|\u300f|\u300c|\u300d|\ufe43|\ufe44|\u3014|\u3015|\u2026|\u2014|\uff5e|\ufe4f|\uffe5]/;
    return (reg.test(this)) ? true : false;
*/
    return (/[\u3002|\uff1f|\uff01|\uff0c|\u3001|\uff1b|\uff1a|\u201c|\u201d|\u2018|\u2019|\uff08|\uff09|\u300a|\u300b|\u3008|\u3009|\u3010|\u3011|\u300e|\u300f|\u300c|\u300d|\ufe43|\ufe44|\u3014|\u3015|\u2026|\u2014|\uff5e|\ufe4f|\uffe5]/.test(this)) ? true : false;  
}

//判断是否为英文标点符号
String.prototype.isEnPunctuation = function() 
{ 
/*
    var reg = /[\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F]/;
    return (reg.test(c)) ? true : false;
*/
    return (/[\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F]/.test(this)) ? true : false;  
}

//功能:判断是否为中文或英文标点符号
String.prototype.isPunctuation = function() 
{ 
    //return ((/[\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F]/.test(this)) || (/[\u3002|\uff1f|\uff01|\uff0c|\u3001|\uff1b|\uff1a|\u201c|\u201d|\u2018|\u2019|\uff08|\uff09|\u300a|\u300b|\u3008|\u3009|\u3010|\u3011|\u300e|\u300f|\u300c|\u300d|\ufe43|\ufe44|\u3014|\u3015|\u2026|\u2014|\uff5e|\ufe4f|\uffe5]/.test(this))) ? true : false; 
    return (this.isEnPunctuation() || this.isCnPunctuation()) ? true : false; 

}

//功能:是否以标点符号结束Is aunctuation at the end of the string
String.prototype.isEndWithPunctuation = function()
{
/*
    var c = this.substring(this.length-1);
    return c.isPunctuation();
*/
    return this.substring(this.length-1).isPunctuation();
}

//功能:标题是否单独成行 Is paragraph title a single line?     
//输入:t:文字
//输出:true:是独立标题行,false:不是独立标题行
function ptIsALine(t)
{
    var r = false;
    var n = t.indexOf('。');
    if (n==(t.length-1))//句号是否位于段末
    {
        r = true;//有且只有一个'。'
    }
    else
    {
        if (!t.isEndWithPunctuation())//未以标点符号结尾
        {
            r = true;
        }
    }
    return r;
}     

实现的效果如下:

用html+javascript打造公文一键排版系统4:一级标题排版_第1张图片

 

完整的代码如下:





公文一键排版





实时编辑区

参数设置 公文标题:排版内容包括公文标题

正文一级标题:

正文二级标题: 粗体

正文三级标题: 粗体

正文: 行距(行间距):  段落首行行首空格数:

调试信息

你可能感兴趣的:(原创作品,网页制作,JavaScript,javascript,html,前端,正则表达式,公文,排版,一键排版)