用html+javascript打造公文一键排版系统16:更新单个附件说明排版,实现多个附件说明排版

利用公休的时间继续完善。

一、更新单个附件说明排版

之前实现单个附件说明排版时,我们只考虑了“附件:”中冒号为半角的情况,而没有考虑存在多任余空格的情况,我们今天先针对存在多任余空格的情况进行完善,增加了温馨提示:

//功能:设置单一附件说明格式 set single attachment description format
//输入:p=单一附件说明字符串
//输出:格式化的附件说明格式
//更新:20230730创建对单个附件说明格式的处理代码
//           20230801更新
//           20230807 从setAtttDescFmt改名为setSingleAttDescFmt
function setSingleAttDescFmt(p)
{var t = p;var a = '';/* 20230807停用if (-1 != t.indexOf(':'))//是半角冒号?{t = p.replace(':', ':');a = g_sWarmPromptLeft + g_sWarmPromptTxt + "已将半角冒号转换为全角冒号" + g_sWarmPromptRight;	  //温馨提示}
*///20230807添加if (/^附件\s*:\s*/.test(t))//包含多余空格?{t = p.replace(/^附\s*件\s*/, "附件");a = g_sWarmPromptLeft + g_sWarmPromptTxt  + "已删除多余空格/";	  //温馨提示}if (/^附件\s*:\s*/.test(t))//是半角冒号?{//a = p.indexOf(':');//t = p.substring(0, a) + ':' + p.substring(a+1);t = p.replace(/^附\s*件\s*:\s*/, "附件:");if (""==a){a = g_sWarmPromptLeft + g_sWarmPromptTxt;}a += "已将半角冒号:转换为全角冒号:/";	  //温馨提示}//公文如有附件,在正文下空一行左空二字编排"附件"二字,后标全角冒号和附件名称。var sBlankLine = '<p style="margin:0px;  line-height:' + rs + 'pt; font-family:' + mtfn + '; font-size:'+ mtfs + 'pt;">&nbsp;</p>';//var t  =  '<p style="margin:0pt 0pt 0pt 32pt; line-height:' + rs + 'pt; font-family:' + mtfn + '; font-size:'+ mtfs + 'pt;">' + t;//20230801停用var t  =  '<p style="border:1px solid red; word-break: break-all; margin:0pt 0pt 0pt ' + (mtfs * 5) + 'pt; text-indent:-' + (mtfs * 3)  + 'pt; line-height:' + rs + 'pt; font-family:' + mtfn + '; font-size:'+ mtfs + 'pt;">' + t;//20230801增加taDbg.value += '\nsetSingleAttDescFmt:' + sBlankLine + t +  (""==a ? a : a + g_sWarmPromptRight);return  sBlankLine + t + a;   }// setSingleAttDescFmt(p)

为了突出展现排版的效果,我们给附件说明行增加一个红框。 

二、实现多个附件说明排版

(一)思路

对于多个附件说明,由于从第2个附件说明开始,其文本格式和不带结束标点符号和正文的三级标题是一样的,所以我要结合多个附件说明的第一行来一起来检测。

我们的检测方法是:

首先检查当前行是否为多个附件说明的第一行,其格式为:

附件:1.河池市××关于××的通 知

如果是,那么进行排版,

然后就循环检测下一行是否符合格式:

2.河池市××关于×× ××的通 知

3.河池市××关于×× ××的通 知

如果符合,就排版并继续循环;

如果不符合,就跳出循环。

在etDocFmt()中的相关代码如下:

	while (i < t.length){
//其它代码if (isSingleAttDesc(t[i])) //是单个附件说明?20230730增加{t[i] = setSingleAttDescFmt(t[i]);i++;bMainDeDe = false;//20230830增加continue;}if (isMultiAttDesc1(t[i]))//是多个附件说明{taDbg.value += '\nisMultiAttDesc1:' + t[i];t[i] = setMultiAttDescFmt1(t[i]);i++;while (isMultiAttDescX(t[i])){taDbg.value += '\nisMultiAttDescX:' + t[i];t[i] = setMultiAttDescFmt2(t[i]);i++;}continue;}t[i] = setParaFmt(t[i]);i++;}//while()

(二)检测当前行是否为多个附件说明的第一行

附件:1.河池市××关于××的通 知

可以用正则表达式来检测:

//功能:判断是文本行是否为多个附件的头1个附件说明 is the firest in multi attachment description?
//输入:p=字符串
//输出:true=是,false=否
//更新:20230730创建
function isMultiAttDesc1(p)
{return (/^(附){1}\s*(件){1}\s*(:|:){1}\s*\d+(\.|.){1}\s*/.test(p)) && !p[p.length-1].isPunctuation();  
}  //isMultiAttDesc1(p)

跟上面一样,为了突出展现排版的效果,我们给附件说明行增加一个红框。  

(三)多个附件说明的第一行的排版

如果符合发现附件说明的第一行,我们就进行排版,排版的关键跟单一附件说明是类似的,关键是要设置好css里margin和text-indent:

//功能:设置多个附件说明中第一个附件格式 set the first multi attachment description format
//输入:p=附件说明字符串
//输出:格式化的附件说明格式
//      20230806 创建
//      20230807 更新   
function setMultiAttDescFmt1(p)
{var t = p;var a = '';if (/^附\s+件/.test(t) || /^附件\s+/.test(t))//包含多余空格?{t = p.replace(/^附\s*件\s*/, "附件");a = g_sWarmPromptLeft + g_sWarmPromptTxt  + "已删除多余空格/";	  //温馨提示}if (/^附件\s*:\s*/.test(t))//是半角冒号?{t = t.replace(/^附\s*件\s*:\s*/, "附件:");if (""==a){a = g_sWarmPromptLeft + g_sWarmPromptTxt;}a += "已将半角冒号转换为全角冒号/";	  //温馨提示}t = t.replace(/^附件:\s+/, "附件:");//删除冒号后的空格if (/^附件:\d+\./.test(t))//是半角点号?{var n = p.indexOf('.');t = p.substring(0, n) + '.' + p.substring(n+1);if (""==a){a = g_sWarmPromptLeft + g_sWarmPromptTxt;}a += "已将半角点号转换为全角点号/"  ;	  //温馨提示}//公文如有附件,在正文下空一行左空二字编排"附件"二字,后标全角冒号和附件名称。var sBlankLine = '<p style="margin:0px; line-height:' + rs + 'pt; font-family:' + mtfn + '; font-size:'+ mtfs + 'pt;">&nbsp;</p>';var w = getStrWidth(t.substring(0, t.indexOf('.')+1),  mtfs+ 'pt ' + mtfn)*0.75;// + mtfs*2;var t  =  '<p style="border:1px solid red; word-break: break-all; margin:0pt 0pt 0pt ' + (mtfs * 6.5) + 'pt; text-indent:-' + w + 'pt; line-height:' + rs + 'pt; font-family:' + mtfn + '; font-size:'+ mtfs + 'pt;">' + t;taDbg.value += '\nsetSingleAttDescFmt:' + sBlankLine + t +  (""==a ? a : a + g_sWarmPromptRight);return  sBlankLine + t + a;   
}// setMultiAttDescFmt1(p)

为了突出展现排版的效果,我们给附件说明行增加一个红框。 

(四)检测多个附件说明的第2-n行

2.河池市××关于×× ××的通 知

3.河池市××关于×× ××的通 知

我们仍然用正则表达式来检测:

//功能:判断是文本行是否为多个附件的2-x个附件说明 is the 2-x in multi attachment description?
//输入:p=字符串
//输出:true=是,false=否
//更新:20230806创建
function isMultiAttDescX(p)
{return (/^\d+(\.|.)\s*/.test(p)) && !p[p.length-1].isPunctuation();  
}  //isMultiAttDesc1(p)

之前我们检测三级标题的代码没有使用正则表达式:

//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)

(五)多个附件说明的第2-n行排版

这里排版的难度在于计算缩进text-indent。比如附件2和附件10的缩进是不同的。

这里我们用之前写的getStrWidth(s, f)来获取“附件n.”(其中n为大于0的正整数)的宽度。

//功能:利用canvas取字符串宽度
//输入:s=字符串,f=字体大小 字体名称
//输出:字符串宽度(单位为px, 1pt=1px*0.75)
//记录:20230722创建
function getStrWidth(s, f)
{//alert(s);var canvas = getStrWidth.canvas || (getStrWidth.canvas = document.createElement("canvas"));var ctx = canvas.getContext("2d"); ctx.font = f;return ctx.measureText(s).width;
}//geStrWidth()//功能:设置多个附件说明的2-x的格式 set multi attachment description format
//输入:p=附件说明字符串
//输出:格式化的附件说明格式
//更新:20230806 创建
function setMultiAttDescFmt2(p)
{var t = p;	var a = '';var i = -1;if (/^d+\s*\d*\s*\./.test(t))//包含半角点号. ?{//i = p.indexOf('.');//t = p.substring(0, i-1) + '.' + p.substring(i);//附件说明中可能包含多个半角点号,所以为用replace可能将其它的半角点号替换到t =  p.replace('.', '.');a = g_sWarmPromptLeft + g_sWarmPromptTxt  + "已将半角点号.转换为全角点号./";	  //温馨提示}if (/^d+\s+\d*\s*./.test(t) || /^d+\s*\d*\s+./.test(t) )//包含多余空格?{i = p.indexOf('.');t = t.substring(0, i) .eliminateSpace() + t.substring(i);if ("" ==a){a = g_sWarmPromptLeft + g_sWarmPromptTxt;}a +=  "已删除多余空格/";	  //温馨提示}var w = getStrWidth(t.substring(0, t.indexOf('.')+1),  mtfs+ 'pt ' + mtfn)*0.75  ;var t  =  '<p style="border:1px solid red; word-break: break-all; margin:0pt 0pt 0pt ' + (mtfs * 6.5) + 'pt; text-indent:-' + w + 'pt; line-height:' + rs + 'pt; font-family:' + mtfn + '; font-size:'+ mtfs + 'pt;">' + t;return  t + (""==a ? a : a + g_sWarmPromptRight);   
}//setMultiAttDescFmt2(p)

跟上面一样,为了突出展现排版的效果,我们给附件说明行增加一个红框。 

 三、运行效果

 

四、完整的测试系统代码

为了突出重点,我们不再把文件一键排版系统的全部代码都发上来,而是精简出一个测试系统代码。如下:

<!DOCTYPE HTML>
<HTML>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta name="Author" content="PurpleEndurer"><title>公文一键排版系统</title>
</head>
<body>
<script>var aFontName = ["方正小标宋简体",//0"黑体",//1"微软雅黑",//2"仿宋_GB2312",//3"仿宋",//4"楷体_GB2312",//5"楷体",//6"宋体",//7"Arial",//8"Wingdings 2"//9
];//sId:select control id, iDefSel:default selected
function showFontNameSel(sId, iDefSel)
{document.write('<select id="', sId, '" width="50">');for (var i = 0; i < aFontName.length; i++){document.write('<option value="', aFontName[i], '"');document.write(i==iDefSel ? ' selected>' : '>');document.write(aFontName[i],'</option>');}document.write('</select>');
}var aFontSize = [['初号', 42],//0['小初', 36],//1['一号', 26],//2['小一', 24],//3['二号', 22],//4['小二', 18],//5['三号', 16],//6['小三', 15],//7['四号', 14],//8['小四', 12],//9['五号', 10.5], //10['小五', 9],//11['六号', 7.5],//12['小六', 6.5],//13['七号', 5.5],//14['八号', 5]//15
];var aAlign = [["左对齐","left"],//0["居中对齐","center"],//1["右对齐","right"],//2["两端分散对齐","justify"]//3
];var g_sWarmPromptLeft = '<span style="color:red; font-style:italic;padding-left:15pt">';//2023年7月29增
var g_sWarmPromptTxt = "*公文一键排版系统温馨提示:";//2023年7月29增
var g_sWarmPromptRight = '</span>';//2023年7月29增//sId=select control id, iDefSel=default selected
function showFontSizeSel(sId, iDefSel)
{document.write('<select id="', sId, '">');for (var i = 0; i < aFontSize.length; i++){document.write('<option value="',aFontSize[i][1], '"');document.write(i==iDefSel ? ' selected>' : '>');document.write(aFontSize[i][0],'</option>');}document.write('</select>');
}//sId=select control id, iDefSel=default selected
function showAlignSel(sId, iDefSel)
{document.write('<select id="', sId, '">');for (var i = 0; i < aAlign.length; i++){document.write('<option value="',aAlign[i][1], '"');document.write(i==iDefSel ? ' selected>' : '>');document.write(aAlign[i][0],'</option>');}document.write('</select>');
}//showAlignSel()function setDocTitle(s)
{//dtfn = 标题字体名 font name//dtfs = 标题字号 font size//dtta = 标题对齐方式 text align//rs = 行距 row spacingreturn '<p style="margin:0px; font-family:' + dtfn + ';font-size:' + dtfs +'pt; text-align:' + dtta + '; line-height:' +  rs + 'pt;">' + s;
}//setDocTitle()//去除<P>中的属性
function stripPattribs(s)
{var i = s.indexOf('>');return ((-1 != i) ? s.substr(i+1) : s);
}//去除HTML代码
String.prototype.stripHTML = function() 
{//var reTag = /<(?:.|\s)*?>/g;  //var reTag = /<[^>]+>/gi;	//过滤所有html标签,但不包括html标签内的内容 return this.replace(/<(?:.|\s)*?>/g,"");
}//功能:判断是否为中文或英文标点符号
String.prototype.isPunctuation = function() 
{ return ((/[\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F|\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))); //return (this.isEnPunctuation() || this.isCnPunctuation()) ? true : false; //20230730停用//return (this.isEnPunctuation() || this.isCnPunctuation()); //20230730增加
}							 
</script>
<fieldset  style="width: 1100px;"><legend>实时编辑区</legend>
<iframe id="editor" width="1200px" height="400px" style="border: solid 1px;"></iframe>
</fieldset>
<p><input type="button" id="btnclearDocFmt" value="清除格式" onclick="clearDocFmt()"   style="background:cyan;  border-radius: 25px;"  /><input type="button" id="btnsetDocFmt" value="一键排版" onclick="setDocFmt()"  style="background:purple; color:white; border-radius: 25px;" /><input type="button" id="btnShowSrc" value="显示源码" onclick="showSrc()" style="background:yellow; border-radius: 25px;" /><input type="button" id="btnDelBlank" value="删除空格" onclick="edRichBody.innerText=delBlankText(edRichBody.innerText);edRichBody.innerHTML=delBlankHTML(edRichBody.innerHTML)"   style="background:#9999cc; color:white;  border-radius: 25px;"  /><input type="button" id="btnB" value="B" title="加粗/正常"  style="font-weight:bolder" onclick="execCmd('bold',false,null)" /><input type="button" id="btnItalic" value="I" title="斜体/正常"  style="font-weight:bolder;font-style:italic" onclick="execCmd('italic',false,null)" /><input type="button" id="btnUnderline" value="I" title="下划线"  style="font-weight:bolder;text-decoration:underline" onclick="execCmd('underline',false,null)" /><input type="button" id="btnHalf2Full" value="半角转全角" onclick="edRichBody.innerText=half2Full(edRichBody.innerText)"   style="background:blue; color:white;  border-radius: 25px;"  /><input type="button" id="btnFull2Half" value="全角转半角" onclick="edRichBody.innerText=full2Half(edRichBody.innerText)"  style="background:green; color:white; border-radius: 25px;" />
</p></p>
<fieldset style="width: 1200px;"><legend>参数设置</legend>公文标题:<input type="checkbox" checked id="cbDocTilte">排版内容包括公文标题<script>showFontNameSel("selDocTitleFontName", 0);document.write(' ');showFontSizeSel("selDocTitleFontSize", 4);document.write(' ');showAlignSel("selDocTitleAlign", 1);</script><p>正文一级标题:<script>showFontNameSel("selPrimaryTitleFontName", 1);document.write(' ');showFontSizeSel("selPrimaryTitleFontSize", 6);</script></p><p>正文二级标题:<script>showFontNameSel("selSecondaryTitleFontName", 5);document.write(' ');showFontSizeSel("selSecondaryTitleFontSize", 6);</script><input type="checkbox" checked id="cbSecondaryTitleStrong">粗体</p><p>正文三级标题:<input type="checkbox" checked id="cbThirdTitleStrong">粗体</p><p>正文:	<script>showFontNameSel("selMainTextFontName", 3);document.write(' ');showFontSizeSel("selMainTextFontSize", 6);document.write(' ');</script>行距(行间距):<input type="text" id="tbRowSp" value="28" size="2"><!--  row spacing//-->  段落首行行首空格数:<input type="text" id="tbLeadSpNum" value="2" size="2"></P><p>全角和半角字符转换:<input type="checkbox" checked id="cbIncLetter" onclick="cbIncLetter = this.checked; ">将字母一并转换<input type="checkbox" checked id="cbIncNumber" onclick="cbIncNumber = this.checked; ">将阿拉伯数字一并转换<input type="checkbox" checked id="cbIncPunctuation" onclick="cbIncPunctuation = this.checked; ">将标点符号一并转换<input type="checkbox" checked id="cbIncSpace" onclick="cbIncSpace = this.checked;">将空格一并转换</p></fieldset><p>调试信息</p>
<textarea id="taDbg" style="width: 1225px; height: 200px">调试信息</textarea><script>const edRich = document.getElementById("editor");
const taDbg = document.getElementById("taDbg");
const btnShowSrc = document.getElementById("btnShowSrc");
//const btnHalf2Full = document.getElementById("btnHalf2Full");
//const btnFull2Half = document.getElementById("btnFull2Half");
var cbIncLetter = document.getElementById("cbIncLetter").checked;//20230803增加
var cbIncNumber = document.getElementById("cbIncNumber").checked;//20230803增加
var cbIncPunctuation = document.getElementById("cbIncPunctuation").checked;//20230803增加
var cbIncSpace = document.getElementById("cbIncSpace").checked;//20230803增加var bMainDeDe = false;//是否发现主送机关,false=未发现,true=已发现//排版内容是否包括公文标题
var cbDocTilte;		//  = document.getElementById('cbDocTilte').value;
//标题字体名 document title font name
var dtfn;	// = document.getElementById('selDocTitleFontName').value;
//标题字号 document title font size
var dtfs;	// = document.getElementById('selDocTitleFontSize').value;
//标题对齐方式 document title text align
var dtta;// = document.getElementById('selDocTitleAlign').value;//一级标题字号 font name
var pt1fn;	// = document.getElementById('selPrimaryTitleFontName').value;
//一级标题字号 font size
var pt1fs;	// = document.getElementById('selPrimaryTitleFontSize').value;//二级标题字号 psecondary title font name
var st2fn;	// = document.getElementById('selSecondaryTitleFontName').value;
//二级标题字号  secondary title font size
var st2fs;	// = document.getElementById('selSecondaryTitleFontSize').value;
//二级标题字体加粗  secondary title strong
var st2Strong;	// = document.getElementById('cbSecondaryTitleStrong').value;//三级标题字体加粗  third title strong
var tt3Strong;	//	 = document.getElementById('cbThirdTitleStrong').value;//行距 row spacingvar rs;		//  = document.getElementById('tbRowSp').value;
//首行行首空格数var sn;		//  = document.getElementById('tbLeadSpNum').value;//正文字体名称
var mtfn;	// = document.getElementById('selMainTextFontName').value;//正文字体字号
var mtfs;	// = document.getElementById('selMainTextFontSize').value;       
var edRichDoc;
var edRichBody;if (typeof(edRich)  != "undefined"){edRichDoc = edRich.contentWindow.document;edRichDoc.designMode = "on";edRichDoc.contentEditable = true;edRichBody = edRichDoc.body;edRichBody.innerHTML = '<p><a href="http://blog.csdn.net/purpleendurer">http://blog.csdn.net/purpleendurer</a></p><p></p><p style="font-family:方正小标宋简体;font-size:22pt; text-align:center; line-height:28pt;"><p align="center" style="text-align:center;text-indent:24.0pt;line-height:28.0pt"><span lang="EN-US" style="font-size:22.0pt;font-family:方正小标宋简体;mso-hansi-font-family:黑体;color:black">SQL</span><span style="font-size:22.0pt;font-family:方正小标宋简体;mso-hansi-font-family:黑体;color:black">注入基础<span lang="EN-US"><o:p></o:p></span></span></p><p style="text-indent:2em;">河池市××局、        市×× 局:   </p><p style="text-indent:24.0pt;line-height:28.0pt;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px"><span style="font-size:16.0pt;font-family:黑体;color:black">一、<span lang="EN-US">SQL</span>注入分类<span lang="EN-US"><o:p></o:p></span></span></p><p style="text-indent:24.0pt;line-height:28.0pt;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px"><b><span style="font-size:16.0pt;font-family:楷体_GB2312;color:black">(一)什么是<span lang="EN-US">SQL</span>注入<span lang="EN-US">?<o:p></o:p></span></span></b></p><p style="text-indent:24.0pt;line-height:28.0pt;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px"><span lang="EN-US" style="font-size:16.0pt;font-family:仿宋_GB2312;color:black">SLQ</span><span style="font-size:16.0pt;font-family:仿宋_GB2312;color:black">注入<span lang="EN-US">(</span>英文<span lang="EN-US">: Sqlinject)</span>:当<span lang="EN-US">web</span>应用向后台数据库传递<span lang="EN-US">SQL</span>语句进行数据库操作时,如果对用户输入的参数没有经过严格的过滤,那么用户可以构造特殊的<span lang="EN-US">sq1</span>语句,从而带入到数据库中执行,获取或修改数据库中的数据。<span lang="EN-US"><o:p></o:p></span></span></p><p style="text-indent:24.0pt;line-height:28.0pt;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px"><span style="font-size:16.0pt;color:black">&nbsp;&nbsp;1.加强技术学习。一要<span lang="EN-US"><o:p></o:p></span></span></p><p style="text-indent:24.0pt;line-height:28.0pt;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px"><span style="font-size:16.0pt;color:black">&nbsp;&nbsp;2.强化安全保障。一要。<span lang="EN-US"><o:p></o:p></span></span></p><p>附件:河池市××关于××××××××××××××××××××××××××××××××××××××××××××××××××的通知</p><p>附件:河池市××关于××的通知</p><p>附件:河池市××关于××的通知。</p><p>附件:1.河池市××关于××××××××××××××××××××××××××××××××××××××××××××××××××××××的通 知 </p><p>2.河池市××关于×× ××的通 知 </p><p>3.河池市××关于×× ××××××××××××××××××××××××××××××××××××××××××××××××××××的通 知</p><p>附件:1.河池市××关于××的通 知</p><p>测试1</p><p style="text-indent:24.0pt;line-height:28.0pt;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">河池市××××局</p><p>2023年7月22日</p><p>测试2</p><p>广西壮族自治区河池市××××局</p><p>2023年7月22日</p><p>测试3</p><p>河池市××局</p><p>2023年7月22日</p><p>测试4</p><p>河池市×局</p><p>2023年7月22日</p><p>附件</p><p>附件标题</p><p>附件:</p><p>附件标题</p><p>附  件</p><p>附件标题</p>';
}
else
{window.alert("undefined");
}  //判断是否为中文标点符号
String.prototype.isCnPunctuation = function() 
{ 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)); //20230730修改
}//判断是否为英文标点符号
String.prototype.isEnPunctuation = function() 
{ return /[\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F]/.test(this);
}//判断是否为纯半角阿拉伯数字串
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));//20230803停用return (/^[0-9]+$/.test(this));//20230803增加
}//功能:判断是否为纯半角英文字母
//更新:20230804增加
String.prototype.isLetterEn = function() 
{return (/^[a-zA-Z]+$/.test(this));
} //功能:判断是否为纯全角英文字母
//更新:20230804增加
String.prototype.isLetterCn = function() 
{return (/^[a-zA-Z]+$/.test(this));//20230804增加
}//功能:删除字符串中的所有空格
//记录:20230726创建
String.prototype.eliminateSpace = function()
{return this.replace(/\s*/g,"");
}//功能:删除字符串中的所有半角和全角空格
//记录:20230804创建
String.prototype.eliminateBlank = function()
{return this.replace(/  /ig,"");
}function getArg()
{// 排版内容包括公文标题cbDocTilte  = document.getElementById('cbDocTilte').checked;//标题字体名 document title font namedtfn = document.getElementById('selDocTitleFontName').value;//alert(fn);//标题字号 document title font sizedtfs = document.getElementById('selDocTitleFontSize').value;//alert(fs);//标题对齐方式 document title text aligndtta = document.getElementById('selDocTitleAlign').value;//一级标题字号 primary title font namept1fn = document.getElementById('selPrimaryTitleFontName').value;//一级标题字号  primary titlefont sizept1fs = document.getElementById('selPrimaryTitleFontSize').value;//二级标题字号 psecondary title font namest2fn = document.getElementById('selSecondaryTitleFontName').value;//二级标题字号  secondary title font sizest2fs = document.getElementById('selSecondaryTitleFontSize').value;//二级标题字体加粗  secondary title strongst2Strong	 = document.getElementById('cbSecondaryTitleStrong').checked;//三级标题字体加粗  third title strongtt3Strong = document.getElementById('cbThirdTitleStrong').checked;//正文字体名称mtfn = document.getElementById('selMainTextFontName').value;//正文字体字号mtfs = document.getElementById('selMainTextFontSize').value;//行距 row spacingrs  = document.getElementById('tbRowSp').value;//首行行首空格数sn  = document.getElementById('tbLeadSpNum').value*16;//20230729增加*16
}//	  getArg()function showSrc()
{if (btnShowSrc.value=="显示源码"){edRichBody.innerText = edRichBody.innerHTML;//edRichBody.innerText = edRichBody.innerHTML.replace('</p>','</p>'+chr(10));	  //edRichBody.innerText = edRichBody.innerText.replace('<\/p>','<\/p>'+chr(10)+chr(13));	  btnShowSrc.value = "显示预览";btnShowSrc.style.background = "cyan";}else{edRichBody.innerHTML = edRichBody.innerText;//edRichBody.innerHTML = edRichBody.innerText.replace(chr(10)+chr(13),'');btnShowSrc.value = "显示源码";btnShowSrc.style.background = "yellow";}
} //功能:将edRichBody内容分解成字符串数组并清除其中的多余字符:空格、HTML代码等
//输入:无
//输出:清后多余字符的字符串数组
//记录:20230729增加清除温馨提示信息,将多个循环整合到一个循环内
function getClearInfoArray()
{var s = edRichBody.innerHTML.replace(/<br(?:.|\s)*?>/gi,'</p><p>');var t = s.split('<p');taDbg.value += "\n---getClearInfoArray()\n";for (var i=0; i < t.length; i++){taDbg.value += "\nt[" + i + "]=" + t[i];}    s = 0;while (s < t.length){t[s] = stripPattribs(t[s]);t[s] = t[s].stripHTML();//以下两句顺序不能颠倒t[s] = t[s].replace(/&nbsp;/ig, ''); //去除空格代码	  &nbsp;t[s] = t[s].trim(); //去除首尾空格var j = t[s].indexOf(g_sWarmPromptTxt);//20230729增加:清除温馨提示信息if (-1 != j){t[s] = t[s].substring(0,j);}if (t[s].length==0 || t[s]=='></p>' || t[s]==null){taDbg.value += "\nsplice: t[" + s + ']=' + t[s];t.splice(s,1);}else{s++;}}//while()taDbg.value += "\n---\n";for (var i=0; i < t.length; i++){taDbg.value += "\nt[" + i + "]=" + t[i];} return t;
}function clearDocFmt()
{var s = '<p>' + getClearInfoArray().join('</p><p>');//alert(s);edRichBody.innerHTML = s;//alert(edRichBody.innerHTML);
}//功能:利用canvas取字符串宽度
//输入:s=字符串,f=字体大小 字体名称
//输出:字符串宽度(单位为px, 1pt=1px*0.75)
//记录:20230722创建
function getStrWidth(s, f)
{//alert(s);var canvas = getStrWidth.canvas || (getStrWidth.canvas = document.createElement("canvas"));var ctx = canvas.getContext("2d"); ctx.font = f;return ctx.measureText(s).width;
}//geStrWidth()//功能:判断是文本行是否为多个附件的头1个附件说明 is the firest in multi attachment description?
//输入:p=字符串
//输出:true=是,false=否
//更新:20230730创建
function isMultiAttDesc1(p)
{return (/^(附){1}\s*(件){1}\s*(:|:){1}\s*\d+(\.|.){1}\s*/.test(p)) && !p[p.length-1].isPunctuation();  
}  //isMultiAttDesc1(p)//功能:判断是文本行是否为多个附件的2-x个附件说明 is the 2-x in multi attachment description?
//输入:p=字符串
//输出:true=是,false=否
//更新:20230806创建
function isMultiAttDescX(p)
{return (/^\d+(\.|.)\s*/.test(p)) && !p[p.length-1].isPunctuation();  
}  //isMultiAttDesc1(p)//功能:判断是文本行是否为单个附件的附件说明 is a single Attachment Description?
//输入:p=字符串
//输出:true=是,false=否
//更新:20230730创建
function isSingleAttDesc(p)
{return (/^(附){1}\s*(件){1}\s*(:|:){1}\s*[^0-9]+\s*/.test(p)) && !p[p.length-1].isPunctuation(); 
}//功能:判断是文本行是否为附件说明 is Attachment Description?
//输入:p=字符串
//输出:true=是,false=否
//更新:20230730创建
function isAttachmentDescription(p)
{//return (/^(附){1}\s*(件){1}\s*(:){1}\s*(\d. | \d.)*/.test(p)) & !p[p.length-1].isPunctuation(); return (/^(附){1}\s*(件){1}\s*(:|:){1}\s*/.test(p)) && !p[p.length-1].isPunctuation();  
} //功能:删除字符串中的所有空格
//记录:20230726创建
String.prototype.eliminateSpace = function()
{return this.replace(/\s*/g,"");
}//功能:设置单一附件说明格式 set single attachment description format
//输入:p=单一附件说明字符串
//输出:格式化的附件说明格式
//更新:20230730创建对单个附件说明格式的处理代码
//           20230801更新
//           20230807 从setAtttDescFmt改名为setSingleAttDescFmt
function setSingleAttDescFmt(p)
{var t = p;var a = '';/* 20230807停用if (-1 != t.indexOf(':'))//是半角冒号?{t = p.replace(':', ':');a = g_sWarmPromptLeft + g_sWarmPromptTxt + "已将半角冒号转换为全角冒号" + g_sWarmPromptRight;	  //温馨提示}
*///20230807添加if (/^附件\s*:\s*/.test(t))//包含多余空格?{t = p.replace(/^附\s*件\s*/, "附件");a = g_sWarmPromptLeft + g_sWarmPromptTxt  + "已删除多余空格/";	  //温馨提示}if (/^附件\s*:\s*/.test(t))//是半角冒号?{//a = p.indexOf(':');//t = p.substring(0, a) + ':' + p.substring(a+1);t = p.replace(/^附\s*件\s*:\s*/, "附件:");if (""==a){a = g_sWarmPromptLeft + g_sWarmPromptTxt;}a += "已将半角冒号:转换为全角冒号:/";	  //温馨提示}//公文如有附件,在正文下空一行左空二字编排"附件"二字,后标全角冒号和附件名称。var sBlankLine = '<p style="margin:0px;  line-height:' + rs + 'pt; font-family:' + mtfn + '; font-size:'+ mtfs + 'pt;">&nbsp;</p>';//var t  =  '<p style="margin:0pt 0pt 0pt 32pt; line-height:' + rs + 'pt; font-family:' + mtfn + '; font-size:'+ mtfs + 'pt;">' + t;//20230801停用var t  =  '<p style="border:1px solid red; word-break: break-all; margin:0pt 0pt 0pt ' + (mtfs * 5) + 'pt; text-indent:-' + (mtfs * 3)  + 'pt; line-height:' + rs + 'pt; font-family:' + mtfn + '; font-size:'+ mtfs + 'pt;">' + t;//20230801增加taDbg.value += '\nsetSingleAttDescFmt:' + sBlankLine + t +  (""==a ? a : a + g_sWarmPromptRight);return  sBlankLine + t + a;   }// setSingleAttDescFmt(p)//功能:设置多个附件说明中第一个附件格式 set the first multi attachment description format
//输入:p=附件说明字符串
//输出:格式化的附件说明格式
//      20230806 创建
//      20230807 更新   
function setMultiAttDescFmt1(p)
{var t = p;var a = '';if (/^附\s+件/.test(t) || /^附件\s+/.test(t))//包含多余空格?{t = p.replace(/^附\s*件\s*/, "附件");a = g_sWarmPromptLeft + g_sWarmPromptTxt  + "已删除多余空格/";	  //温馨提示}if (/^附件\s*:\s*/.test(t))//是半角冒号?{t = t.replace(/^附\s*件\s*:\s*/, "附件:");if (""==a){a = g_sWarmPromptLeft + g_sWarmPromptTxt;}a += "已将半角冒号转换为全角冒号/";	  //温馨提示}t = t.replace(/^附件:\s+/, "附件:");//删除冒号后的空格if (/^附件:\d+\./.test(t))//是半角点号?{var n = p.indexOf('.');t = p.substring(0, n) + '.' + p.substring(n+1);if (""==a){a = g_sWarmPromptLeft + g_sWarmPromptTxt;}a += "已将半角点号转换为全角点号/"  ;	  //温馨提示}//公文如有附件,在正文下空一行左空二字编排"附件"二字,后标全角冒号和附件名称。var sBlankLine = '<p style="margin:0px; line-height:' + rs + 'pt; font-family:' + mtfn + '; font-size:'+ mtfs + 'pt;">&nbsp;</p>';var w = getStrWidth(t.substring(0, t.indexOf('.')+1),  mtfs+ 'pt ' + mtfn)*0.75;// + mtfs*2;var t  =  '<p style="border:1px solid red; word-break: break-all; margin:0pt 0pt 0pt ' + (mtfs * 6.5) + 'pt; text-indent:-' + w + 'pt; line-height:' + rs + 'pt; font-family:' + mtfn + '; font-size:'+ mtfs + 'pt;">' + t;taDbg.value += '\nsetSingleAttDescFmt:' + sBlankLine + t +  (""==a ? a : a + g_sWarmPromptRight);return  sBlankLine + t + a;   
}// setMultiAttDescFmt1(p)//功能:设置多个附件说明的2-x的格式 set multi attachment description format
//输入:p=附件说明字符串
//输出:格式化的附件说明格式
//更新:20230806 创建
function setMultiAttDescFmt2(p)
{var t = p;	var a = '';var i = -1;if (/^d+\s*\d*\s*\./.test(t))//包含半角点号. ?{//i = p.indexOf('.');//t = p.substring(0, i-1) + '.' + p.substring(i);//附件说明中可能包含多个半角点号,所以为用replace可能将其它的半角点号替换到t =  p.replace('.', '.');a = g_sWarmPromptLeft + g_sWarmPromptTxt  + "已将半角点号.转换为全角点号./";	  //温馨提示}if (/^d+\s+\d*\s*./.test(t) || /^d+\s*\d*\s+./.test(t) )//包含多余空格?{i = p.indexOf('.');t = t.substring(0, i) .eliminateSpace() + t.substring(i);if ("" ==a){a = g_sWarmPromptLeft + g_sWarmPromptTxt;}a +=  "已删除多余空格/";	  //温馨提示}var w = getStrWidth(t.substring(0, t.indexOf('.')+1),  mtfs+ 'pt ' + mtfn)*0.75  ;var t  =  '<p style="border:1px solid red; word-break: break-all; margin:0pt 0pt 0pt ' + (mtfs * 6.5) + 'pt; text-indent:-' + w + 'pt; line-height:' + rs + 'pt; font-family:' + mtfn + '; font-size:'+ mtfs + 'pt;">' + t;return  t + (""==a ? a : a + g_sWarmPromptRight);   
}//setMultiAttDescFmt2(p)//功能:设置段落格式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 style="margin:0px; line-height:' +  rs + 'pt; text-indent: ' + sn + 'pt;font-family:' + mtfn + '; font-size:'+ mtfs + 'pt;">' + p;
//	}//switch//taDbg.value += "\n---setParaFmt:" + t;return t;
}//setParaFmt(p)//功能:设置公文格式Set document format
//输入:无
//输出:无
//记录:20230726添加对附件及附件标题格式的处理代码
//           20230729添加对主送单位格式的处理代码    
//           20230730增加 bMainDeDe
function setDocFmt()
{taDbg.value += "\n---setDocFmt()\n";getArg(); //读取预设参数var t = getClearInfoArray();/*//标题if (cbDocTilte){t[0]  = setDocTitle(t[0]) + '</p><p style="margin:0px; line-height:"' + rs +'">&nbsp;';}
*/ var i =  (cbDocTilte ? 1 : 0);//2023-07-26增加while (i < t.length){
/*if (i < t.length-1)//20230716增加{if (isBadging(t[i],t[i+1]))//是落款?{//落款前加空行t[i-1] += '</p><p style="margin:0px; line-height:"' + rs +'">&nbsp;';//设置落款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;bMainDeDe = false;//20230830增加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;bMainDeDe = false;//20230830增加continue;}}//ifif (isMainDeDe(t[i]) && !bMainDeDe)//是主送单位吗?20230729增,20230830增加 !bMainDeDe{t[i] = setMainDeDe(t[i]);bMainDeDe = true; //20230804增加i++;continue;}
*/if (isSingleAttDesc(t[i])) //是单个附件说明?20230730增加{t[i] = setSingleAttDescFmt(t[i]);i++;bMainDeDe = false;//20230830增加continue;}if (isMultiAttDesc1(t[i]))//是多个附件说明{taDbg.value += '\nisMultiAttDesc1:' + t[i];t[i] = setMultiAttDescFmt1(t[i]);i++;while (isMultiAttDescX(t[i])){taDbg.value += '\nisMultiAttDescX:' + t[i];t[i] = setMultiAttDescFmt2(t[i]);i++;}continue;}t[i] = setParaFmt(t[i]);i++;}//while()//alert(t.join(''));edRichBody.innerHTML = t.join(''); 
}//setDocFmt()    
</script>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/27089.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

APP外包开发的开发语言对比

在开发iOS APP时有两种语言可以选择&#xff0c;Swift&#xff08;Swift Programming Language&#xff09;和 Objective-C&#xff08;Objective-C Programming Language&#xff09;&#xff0c;它们是两种不同的编程语言&#xff0c;都被用于iOS和macOS等苹果平台的软件开发…

[国产MCU]-BL602开发实例-定时器

定时器 文章目录 定时器1、BL602定时器介绍2、定时器驱动API介绍3、定时器使用实例3.1 单次计时3.2 持续计时通用定时器,用于定时,当时间到达我们所设置的定时时间会产生定时中断,可以用来完成定时任务。本文将详细介绍如何使用BL602的定时器功能。 1、BL602定时器介绍 BL6…

如何搭建自动化测试框架?资深测试整理的PO模式,一套打通自动化...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Po模型介绍 1、简…

Redis 报错 RedisConnectionException: Unable to connect to x.x.x.x:6379

文章目录 Redis报错类型可能解决方案 Redis报错类型 org.springframework.data.redis.connection. spingboot调用redis出错 PoolException: Could not get a resource from the pool; 连接池异常:无法从池中获取资源; nested exception is io.lettuce.core. 嵌套异常 RedisConn…

聊聊JDK动态代理原理

1. 示例 首先&#xff0c;定义一个接口&#xff1a; public interface Staff {void work(); }然后&#xff0c;新增一个类并实现上面的接口&#xff1a; public class Coder implements Staff {Overridepublic void work() {System.out.println("认真写bug……");…

一起学数据结构(3)——万字解析:链表的概念及单链表的实现

上篇文章介绍了数据结构的一些基本概念&#xff0c;以及顺序表的概念和实现&#xff0c;本文来介绍链表的概念和单链表的实现&#xff0c;在此之前&#xff0c;首先来回顾以下顺序表的特点&#xff1a; 1.顺序表特点回顾&#xff1a; 1. 顺序表是一组地址连续的存储单元依次存…

图像提示词攻略--基于 stable diffusion v2

Stable Diffusion 是一种潜在的文本到图像扩散模型&#xff0c;能够在给定任何文本输入&#xff08;称为提示&#xff09;的情况下生成逼真的图像。 在本文中&#xff0c;我将讨论和探索一些提高提示有效性的方法。从在提示中添加某些关键字和组合词、从更改单词顺序及其标点符…

24v转3.3v输出3A用什么芯片

问&#xff1a;客户需要一个能够将24V输入电压转换为3.3V输出电压&#xff0c;并且能够提供1-3A的电流输出的芯片。还希望它能够内置MOS管。有什么推荐的型号吗&#xff1f;&#xff08;vin24v、5v&#xff0c;vout3.3v&#xff0c;Io1-3A&#xff09; 答&#xff1a;推荐使用…

【福建事业单位-推理判断】08逻辑论证-加强-原因解释-日常总结

福建事业单位-推理判断】08逻辑论证-加强 一、加强题1.1 建立联系——搭桥1.2 补充论据必要条件&#xff08;没它不行&#xff09;补充论据&#xff08;解释原因和举例论证&#xff09; 总结 二、原因解释题三、日常结论复习建议 一、加强题 加强的题型&#xff0c;一般只加强…

替换开源LDAP,某科技企业用宁盾目录统一身份,为业务敏捷提供支撑

客户介绍 某高科技企业成立于2015年&#xff0c;是一家深耕于大物流领域的人工智能公司&#xff0c;迄今为止已为全球16个国家和地区&#xff0c;120余家客户打造智能化升级体验&#xff0c;场景覆盖海陆空铁、工厂等货运物流领域。 该公司使用开源LDAP面临的挑战 挑战1 开源…

详解Kafka分区机制原理|Kafka 系列 二

Kafka 系列第二篇&#xff0c;详解分区机制原理。为了不错过更新&#xff0c;请大家将本号“设为星标”。 点击上方“后端开发技术”&#xff0c;选择“设为星标” &#xff0c;优质资源及时送达 上一篇文章介绍了 Kafka 的基本概念和术语&#xff0c;里面有个概念是 分区(Part…

高翔《自动驾驶中的SLAM技术》代码详解 — 第6章 2D SLAM

目录 6.2 扫描匹配算法 6.2.1 点到点的扫描匹配 6.2 扫描匹配算法 6.2.1 点到点的扫描匹配 // src/ch6/test_2dlidar_io.cc // Created by xiang on 2022/3/15. // #include <gflags/gflags.h> #include <glog/logging.h> #include <opencv2/highgui.hpp>…

解释器模式(Interpreter)

解释器模式是一种行为设计模式&#xff0c;可以解释语言的语法或表达式。给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;然后定义一个解释器&#xff0c;使用该文法来解释语言中的句子。解释器模式提供了评估语言的语法或表达式的方式。 Interpreter is a behav…

行业追踪,2023-08-07

自动复盘 2023-08-07 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

ros tf

欢迎访问我的博客首页。 tf 1. tf 命令行工具1.1 发布 tf1.2 查看 tf 2.参考 1. tf 命令行工具 1.1 发布 tf 我们根据 cartographer_ros 的 launch 文件 backpack_2d.launch 写一个 tf.launch&#xff0c;并使用命令 roslaunch cartographer_ros tf.launch 启动。该 launch 文件…

【Renpy】设置选项不满足条件禁止选择

【要求】如果某个属性不满足某个要求&#xff0c;则无法选择这个选项。 【版本】Renpy 8.1.1 【实现】 1.在options.rpy文件中添加 define config.menu_include_disabled True 2.在选项中增加if条件。 menu:"Yes" if money > 20: ##如果money小于20这个选项…

3.01 用户在确认订单页收货地址操作

用户在确认订单页面&#xff0c;可以针对收货地址做如下操作&#xff1a; 1. 查询用户的所有收货地址列表 2. 新增收货地址 3. 删除收货地址 4. 修改收货地址 5. 设置默认地址步骤1&#xff1a;创建对应用户地址BO public class AddressBO {private String addressId;private…

高抗干扰LCD液晶屏驱动芯片,低功耗的特性适用于水电气表以及工控仪表类产品

VK2C23是一个点阵式存储映射的LCD驱动器&#xff0c;可支持最大224点&#xff08;56SEGx4COM&#xff09;或者最大416点&#xff08;52SEGx8COM&#xff09;的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据&#xff0c;也可通过指令进入省电模式。其高抗干扰&#xff…

zookeeper+kafka

目录 Kafka概述 一、为什么需要消息队列&#xff08;MQ&#xff09; 二、使用消息队列的好处 三、消息队列的两种模式 四、Kafka 定义 五、Kafka 简介 六、Kafka 的特性 七、Kafka 系统架构 分区的原因 八、部署kafka 集群 1.下载安装包 2.安装 Kafka 3.修改…

风控安全产品系统设计的一些思考

背景 本篇文章会从系统架构设计的角度&#xff0c;分享在对业务安全风控相关基础安全产品进行系统设计时遇到的问题难点及其解决方案。 内容包括三部分&#xff1a;&#xff08;1&#xff09;风控业务架构&#xff1b;&#xff08;2&#xff09;基础安全产品的职责&#xff1…