正文中的标题分为四级,文中结构层次序数依次可以用“一、”“(一)”“1.”“(1)”标注;一般第一层用黑体字、第二层用楷体字加粗、第三层和第四层用仿宋体字标注。
对于以阿拉伯数字开头、后接英文点号.及其它文字的三级标题,我们一般也加粗。所以我们要对三级标题进行区分和排版,最简单的判断思路,就是在用indexOf()在段落文本字符串中检索英文点号,如果返回值为-1,说明字符串中不包括三级标题,如果返回值不为-1,那么我们就截取英文点号前的字符串并用正则表达式来检测,如果截取出来的字符串全部是由阿拉伯数字构成,那么这个字符串就包括了三级标题,反之则没有包含。代码如下:
//判断是否为纯数字串
String.prototype.isNum = function()
{
return /^\d+$/.test(this);
}
//功能:判断段落文本是否包含三级标题
//输入:p:段落文本
//输出:true:包含三级标题;false:不包含三级标题
function isIncludeThirdTitle(p)
{
var t = p.indexOf('.');
return ((-1 != t) && p.substring(0,t).isNum()) ? true : false;
}//isIncludeThirdTitle(p)
但是在实际工作中,标题序号中的阿拉伯数字也可能写成中文全角的,而标题序号中的英文点号.也可能被写成全角点号.,所以我们还要针对这些情况进一步完善代码:
//判断是否为纯半角阿拉伯数字串
String.prototype.isArabicNumEn = function()
{
return /^\d+$/.test(this);
}
//判断是否为纯全角阿拉伯数字串
String.prototype.isArabicNumCn = function()
{
//[\uff10|\uff11|\uff12|\uff13|\uff14|\uff15|\uff16|\uff17|\uff18|\uff19]=[0|1|2|3|4|5|6|7|8|9]
return (/^[\uff10|\uff11|\uff12|\uff13|\uff14|\uff15|\uff16|\uff17|\uff18|\uff19]+$/.test(this));
}
//判断是否为纯全角或纯半角阿拉伯数字串
String.prototype.isPureArabicNum = function()
{
//[\uff10|\uff11|\uff12|\uff13|\uff14|\uff15|\uff16|\uff17|\uff18|\uff19]=[0|1|2|3|4|5|6|7|8|9]
return (this.isArabicNumEn() || this.isArabicNumCn());
}
//判断是否为全阿拉伯数字串(全角或半角阿拉伯数字均可)
String.prototype.isArabicNum = function()
{
//[\uff10|\uff11|\uff12|\uff13|\uff14|\uff15|\uff16|\uff17|\uff18|\uff19]=[0|1|2|3|4|5|6|7|8|9]
return (/^[\d|\uff10|\uff11|\uff12|\uff13|\uff14|\uff15|\uff16|\uff17|\uff18|\uff19]+$/.test(this));
}
//Is the paragraph with third title?三级标题
function isIncludeThirdTitle(p)
{
var t = p.indexOf('.');
if (-1==t)
{
t = p.indexOf('.');
}
return ((-1 != t) && p.substring(0,t).isPureArabicNum()) ? true : false;
}//isIncludeThirdTitle(p)
我们针对纯半角,纯全角,纯半角或纯全角,半角和全角混合四种阿拉伯数字字符串增加了四个正则表达式来检测是,这里我们只考虑三级标题序号中的阿拉伯数字串为纯半角或纯全角阿拉伯数字串构成这种情况,所以在isIncludeThirdTitle()中我们使用了isPureArabicNum()。
然后我们修改setParaFmt(),调用setParaTitle3()来对包含三级标题的段落文本进行排版。
//功能:设置段落格式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)
//功能:设置三级标题set paragraph format with third title
//输入:t:文字
//输出:格式化字符串
function setParaTitle3(t)
{
taDbg.value += "\n---setParaTitle3:" + t;
var r;
if (ptIsALine(t)) //标题是否单独成行
{
//return '
' + s;
r = '
' + t;
}
else
{
//标题不单独成行
var n = getFirstPunctuationPos(t);
//r = '
' + t.substring(0, n) + '' + t.substring(n);
r = '
' + (tt3Strong ? '' : '') + t.substring(0, n) + (tt3Strong ? '' : '') + t.substring(n) + (t.isEndWithPunctuation() ?'' : '(缺少结束符号?)');
}
return r;
}//setParaTitle3(t)
在编写和测试setParaTitle3()时,有一段测试段落文本是:
1.加强技术学习。一要
由于段末漏了标点符号,被ptIsALine()误识别为只包含标题的段落,出现这个问题的原因是对于一级标题 和二级标题 ,我们允许其段末没有标点符号 。
在修改ptIsALine()代码时,发现其实只要将ptIsALine()直接替换成isAstatement()函数就行了。
对于包含三级标题,段末又没有标点符号的情况,我可以增加一个温馨提示信息:
*公文一键排版系统温馨提示:此处是否遗漏标点符号
代码为:
//功能:设置三级标题set paragraph format with third title
//输入:t:文字
//输出:格式化字符串
function setParaTitle3(t)
{
taDbg.value += "\n---setParaTitle3:" + t;
var r;
//var b = document.getElementById("cbThirdTitleString").checked; //是否加粗
if (isAstatement(t))//(ptIsALine(t)) //标题是否单独成行
{
//return '' + s;
r = '
' + t;
}
else
{
//标题不单独成行
const strMissPunctuation = "*公文一键排版系统温馨提示:此处是否遗漏标点符号";
var n = getFirstPunctuationPos(t);
//r = '
' + t.substring(0, n) + '' + t.substring(n);
r = '
' + (tt3Strong ? '' : '') + t.substring(0, n) + (tt3Strong ? '' : '') + t.substring(n) + (t.isEndWithPunctuation() ?'' : '' + strMissPunctuation + '');
}//if
return r;
}//setParaTitle3(t)
但是当我们连续点击排版按钮,就会出现下面这种情况:
1.加强技术学习。一要*公文一键排版系统温馨提示:此处是否遗漏标点符号*公文一键排版系统温馨提示:此处是否遗漏标点符号*公文一键排版系统温馨提示:此处是否遗漏标点符号
所以我们还要先判断文本中是否已经包含了提示信息,如果已经包括了提示信息,我们要先把原来的提示信息截出去, 再补上新的提示信息,代码如下:
//功能:在段落文本末尾添加缺少标点符号的提示文本
//输入:q:待添加提示的文本
//输出:添加提示后的文本
function appendMissPunctuationPrompt(q)
{
const strMissPunctuation = "*公文一键排版系统温馨提示:此处是否遗漏标点符号";
var k =q.lastIndexOf(strMissPunctuation);
/*
//alert(q);
if (-1 != k)//是否已包含缺少标点符号的提示文本?
{
q = q.substring(0, k);//已包含则舍弃
//alert(q);
}
q += '' + strMissPunctuation + '';
*/
q = (-1 != k ? q.substring(0, k) : q) + '' + strMissPunctuation + '';
return q;
//return (-1 != k ? q.substring(0, k) : q) + '' + strMissPunctuation + '';
}//appendMissPunctuationPrompt()
//功能:设置三级标题set paragraph format with third title
//输入:t:文字
//输出:格式化字符串
function setParaTitle3(t)
{
taDbg.value += "\n---setParaTitle3:" + t;
var r;
//var b = document.getElementById("cbThirdTitleString").checked; //是否加粗
if (isAstatement(t))//(ptIsALine(t)) //标题是否单独成行
{
//return '' + s;
r = '
' + t;
}
else
{
//标题不单独成行
var n = getFirstPunctuationPos(t);
//r = '
' + t.substring(0, n) + '' + t.substring(n);
//r = '
' + (tt3Strong ? '' : '') + t.substring(0, n) + (tt3Strong ? '' : '') + t.substring(n) + (t.isEndWithPunctuation() ?'' : '' + strMissPunctuation + '');
r = '
' + (tt3Strong ? '' : '') + t.substring(0, n) + (tt3Strong ? '' : '') + t.substring(n);
if ( !r.isEndWithPunctuation())
{
r = appendMissPunctuationPrompt(r);
}
}//if
}//setParaTitle3()
程序运行效果如下:
完整代码如下:
公文一键排版系统
调试信息