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

公文中二级标题的一般以(X)标注(其中X为由"一二三四五六七八九十"中的字符组成的字符串),用楷体字加粗。

首先我们要判断一段文字是否包含二级标题,最简单的方法 就是判断文字中的头一个字符是否为(或(,如果是就包含二级标题,否则就不包含二级标题。即:

	var t = p[0];
	if (t=='(' || t=='(' )
	{
		//alert(t);
		return 2;//二级标题
	}

但是有些人可能会用㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩来做序号,而且4级标题(x)(其中x为0~9组成的字符串)也是以(或(开头的。

所以我们写了一个isIncludeSecondaryTitle()来进行判断,并修改getTitleLevel()函数,加入二级标题的判断:

//Is a secondary title serial number with parenthesis是带小括号的二级标题序号吗?
function isT2SNwithParenthesis(p)
{
	var t = p[0];
	if (t == '(')
	{
		t = p.indexOf(')');
		if ((-1 != t) && ((p.substring(1,t)).isCnNum())) 
		{
			return true;
		}
	}//if

	if (t == '(')
	{
		t= p.indexOf(')');
		if ((-1 != t) && (p.substring(1,t).isCnNum())) 
		{
			return true;
		}
	}//if

	return false;//二级标题	
}//isSNwithParenthesis(p)


//Is the paragraph with secondary title?二级标题
function isIncludeSecondaryTitle(p)
{
	var t = p[0];//t = p.substring(0, 1);
	if (-1!= "㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩".indexOf(t))
	{
		return true;
	}

	if (isT2SNwithParenthesis(p))
	{
		return true;//二级标题
	}

	return false;
}//isIncludeSecondaryTitle(p)           


//功能:获取文字串的标题级别
//输入:p:文字串
//输出:1:一级标题,2:二级标题,3:三级标题,0:其它
function getTitleLevel(p)
{
	taDbg.value += "\n---getTitleLevel:" + p;
 
	var t = p[0];//t = p.substring(0, 1);
	if (t=='(' || t=='(' )
	{
		//alert(t);
		return 2;//二级标题
	}
	
	if (isIncludePrimaryTitle(p))//一级标题
	{
		return 1;
	}
 
	//三级标题
	/*
	return 3;
	*/
 
	return 0;
}//getTitleLevel(p)   

需要注意的是,这里我们没有考虑以序号中的小括号一个为中文小括号,另一个为英文小括号的情况,如()【注:左边为中文小括号,右边为英文小括号】或()【注:左边为英文小括号,右边为中文小括号】。

然后我们修改setParaFmt(),调用 setParaTitle2()来完成二级标题段落的排版。

//功能:设置段落格式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 return t; } //功能:设置二级标题set paragraph format with secondary title //输入:t:文字 //输出:格式化字符串 function setParaTitle2(t) { taDbg.value += "\n---setParaTitle2:" + t; var r; if (ptIsALine(t)) //标题是否单独成行 { //return '

' + s; r = '

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

' + t.substring(0, n) + '' + t.substring(n); } return r; }//setParaTitle2(t)

在setParaTitle2()中我们调用ptIsALine()来判断段落是否只含标题。

//功能:标题是否单独成行 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;
}

由于ptIsALine()只检测中文句号,所以在测试中我们会发现以问号结尾的二级标题没有被识别出来。

通常表示一个语句结束的标点符号有:。!?…,我们都必须都考虑进去。

因此,我们需要修改ptIsALine()代码,如下:

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();
}

var sStatementEndPunctuation = '。!?….!?';//语句结束符号


//功能:获取段落文字中的第一个语句结束符号位置
//输入:p:字符串
//输出:第一个语句结束符号位置
function getFirstPunctuationPos(p)
{
	//taDbg.value += '\n ---getFirstPunctuationPos(' + p + ')\n';
	var r = p.length, n;

	for (var i = 0; i < sStatementEndPunctuation.length; i++)
	{
		n = p.indexOf(sStatementEndPunctuation[i]);
		if ( (-1 != n) && (n < r) )
		{
			r = n;
			//taDbg.value += '\n' + sStatementEndPunctuation[i] + ': n=' + n + '    r=' + r;
		}
	}
	return r;
}//getFirstPunctuationPos(p)


//功能:判断字符串是否只有一句话
//输入:p:字符串
//输出:true:是一句话;false:不是一句话
function isAstatement(p)
{
	var n = getFirstPunctuationPos(p);
	return  ((( -1 != n) &&  (n == p.length-1)) ? true : false);
}


//功能:标题是否单独成行 Is paragraph title a single line?	 
//输入:t:文字
//输出:true:是独立标题行,false:不是独立标题行
function ptIsALine(t)
{
	return (!t.isEndWithPunctuation()) ? true : isAstatement(t) ;
} //ptIsALine(t) 

如果段落除了二级标题,还有其他内容的话,我们需要把二级标题文字按二级标题格式设置,其他内容按正文格式设置。因为二级标题文字语句的结束标点符号,可能是句号,也可能是问号、感叹号……,所以我们还要对setParaTitle1()和setParaTitle2()作相应的修改:

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

' + s; r = '

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

' + t.substring(0, n) + '' + t.substring(n); } taDbg.value += "\n---setParaTitle1:" + r; return r; } //setParaTitle1(t) //功能:设置二级标题set paragraph format with secondary title //输入:t:文字 //输出:格式化字符串 function setParaTitle2(t) { taDbg.value += "\n---setParaTitle2:" + t; var r; if (ptIsALine(t)) //标题是否单独成行 { //return '

' + s; r = '

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

' + t.substring(0, n) + '' + t.substring(n); } return r; }//setParaTitle2(t)

代码运行效果如下:

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

 其中(二)影视网站风险大! 因为序号左边小括号为英文小括号,右边括号为中文小括号,所以没有按二级标题来设置格式。

完整代码如下:





公文一键排版





实时编辑区

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

正文一级标题:

正文二级标题: 粗体

正文三级标题: 粗体

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

调试信息

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