完成公文标题的排版后,我们要进行对正文中的标题进行处理。
一般正文中的标题分为四级,文中结构层次序数依次可以用“一、”“(一)”“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;
}
实现的效果如下:
完整的代码如下:
公文一键排版
调试信息