最近工作有点忙,所 以没能及时完善公文一键排版系统,现在只好熬夜更新一下。
有时公文有包括附件,招照公文排版规范:
附件应当另面编排,并在版记之前,与公文正文一起装订。“附件”二字及附件顺序号用3号黑体字顶格编排在版心左上角第一行。附件标题居中编排在版心第三行。附件顺序号和附件标题应当与附件说明的表述一致。附件格式要求同正文。
如附件与正文不能一起装订,应当在附件左上角第一行顶格编排公文的发文字号并在其后标注“附件”二字及附件顺序号。
这里我们先实现附件与公文正文一起装订的情况,暂时不考虑附件与正文不能一起装订的情况。
要对附件及附件标题进行排版,首先要判断并确认附件及附件标题。
“附件”标识行,如果只有一个附件时,通常内容就是“附件”两个字。这时我们可以这样判断:
//功能:判断字符串是否为“附件”“附件x”“附件x-x”,其中x为阿拉伯数字
//输入:p:字符串
//输出:true:是;false:否
//记录:20230726创建
function isAttachment(p)
{
return "附件"==p ? true : false;
}
如果有多个附件“附件”标识行的内容就是附件x或附件x-x,其中x为阿拉伯数字。
我们可以用正则表达式来判断:
//功能:判断字符串是否为“附件”“附件x”“附件x-x”,其中x为阿拉伯数字
//输入:p:字符串
//输出:true:是;false:否
//记录:20230726创建
function isAttachment(p)
{
//return "附件"==p ? true : false;
return (/^(附件){1}([\d|-]*)$/.test(p));
}
如果我们在输入公文“附件”标识行时不小心在“附”和“件”之间添加了空格呢?我们也要考虑这种情况并给予温馨提示,把上面的代码再进一步改进如下:
//功能:判断字符串是否为“附件”“附件x”“附件x-x”,其中x为阿拉伯数字
//输入:p:字符串
//输出:true:是;false:否
//记录:20230726创建
function isAttachment(p)
{
//return "附件"==p ? true : false;
//return (/^(附件){1}([\d|-]*)$/.test(p));
return (/^(附){1}\s*(件){1}([\d|-]*)$/.test(p));
}
由于附件标题的格式与正文的标题格式是一致的,所 以我们只需要调用 isAstatement()来进行判断就行了。
与对落款判断和排版一样,我们把前后相连两个段落内容放在一起进行判断:
//功能:判断相连两段文字是否为附件及标题
//输入:p1:前一段;p2:后一段
//输出:true:是;false:否
//记录:20230726创建
function isAttachmentTitle(p1, p2)
{
if (! isAttachment(p1))//前一段内容是“附件”?
{
return false;//不是
}
return (! isAstatement(p2)); //后一段是否为一句话
}//isAttachmentTitle()
如果确定两个段落内容是附件及附件标题,那么我们就可以进行排版了:
//功能:设置附件及附件标题格式
//输入:p1:附件;p2:附件标题
//输出:附件及附件标题格式化后的字符串
//记录:20230726创建
function setAttachmentTitleFmt(p1, p2)
{
//附件 与 附件标题之间要间隔一行
return '' + p1 + '
' + p2 + '
';
}//setAttachmentTitleFmt(p1, p2)
如果我们想智能化和人性化一些,那么可以对在输入公文“附件”标识行时不小心在“附”和“件”之间添加了空格这种情况进行检测并给予温馨提示,我们要添加一个函数isAttachmentWithSpace() ,利用正则表达式来检测字符串中是否包含空格:
//功能:判断字符串是否为“附s件”“附s件x”“附s件x-x”,其中s为空格,x为阿拉伯数字
//输入:p:字符串
//输出:true:是;false:否
//记录:20230726创建
function isAttachmentWithSpace(p)
{
//return "附件"==p ? true : false;
return (/^(附){1}\s+(件){1}([\d|-]*)$/.test(p));
}
然后为字符串增加一个删除所有空格的方法.eliminateSpace():
//功能:删除字符串中的所有空格
//记录:20230726创建
String.prototype.eliminateSpace = function()
{
return this.replace(/\s*/g,"");
}
再修改完善setAttachmentTitleFmt()函数,引入上面增加的函数isAttachmentWithSpace() 和.eliminateSpace():
//功能:设置附件及附件标题格式
//输入:p1:附件;p2:附件标题
//输出:附件及附件标题格式化后的字符串
//记录:20230726创建
function setAttachmentTitleFmt(p1, p2)
{
//附件 与 附件标题之间要间隔一行
//return '' + p1 + '
' + p2 + '
';
return '' + (isAttachmentWithSpace(p1) ? p1.eliminateSpace() + '*公文一键排版系统温馨提示:本行多余的空格已删除' : p1) + '
' + p2 + '
';
}//setAttachmentTitleFmt(p1, p2)
这样,程序在遇到输入公文“附件”标识行时不小心在“附”和“件”之间添加了空格呢这种情况会改正并给予温馨提示:
*公文一键排版系统温馨提示:本行多余的空格已删除
最后我们修改setDocFmt(),对附件和附件标题进行判断和排版:
//功能:设置公文格式Set document format
//输入:无
//输出:无
//记录:20230726添加对附件及附件标题格式的处理代码
function setDocFmt()
{
taDbg.value += "\n---setDocFmt()\n";
getArg(); //读取预设参数
var t = getClearInfoArray();
//标题
if (cbDocTilte)
{
t[0] = setDocTitle(t[0]) + ' ';
}
var i = (cbDocTilte ? 1 : 0);//增:2023-07-16
while (i < t.length)
{
if (i < t.length-1)//20230726增加
{
if (isBadging(t[i],t[i+1]))//是落款?
{
//落款前加空行
t[i-1] += '
';
//设置落款
t[i] = setBadging(t[i],t[i+1]);
t[i+1] = null;
taDbg.value += "\nt[" + (i-1) + "]=" + t[i-1] + "\nt[" + i +"]=" + t[i] + "\nt[" +(i+1) +"]=" + t[i+1];
//i++;
//i++;
i += 2;
continue;
}
if (isAttachmentTitle(t[i],t[i+1])) //是附件及附件标题?
{
t[i] = setAttachmentTitleFmt(t[i],t[i+1]);
t[i+1] = null;
taDbg.value += "\nt[" + (i-1) + "]=" + t[i-1] + "\nt[" + i +"]=" + t[i] + "\nt[" +(i+1) +"]=" + t[i+1];
//i++;
//i++;
i += 2;
continue;
}
}//if
t[i] = setParaFmt(t[i]);
i++;
}//while()
alert(t.join(''));
edRichBody.innerHTML = t.join('');
}//setDocFmt()
之前我们在调用 isBadging(t[i],t[i+1])将前后相连两个段落内容放在一起判断是否为落款时,没有考虑t[i]为最后一个段落,t[i+1]=undefined 这种情况,现在调用isAttachmentTitle(t[i],t[i+1])是否为附件及附件标题时,也面临 同样的情况,所以这里我们增加了
if (i < t.length-1)//20230726增加
{
//*****
}
代码运行效果如下:
完整代码如下:
公文一键排版系统
调试信息