用html+javascript打造公文一键排版系统3:获取参数设置、公文标题排版

简介: 用html+javascript打造公文一键排版系统3:获取参数设置、公文标题排版

我们用自定义函数setDocFmt()来实现对公文的排版。

一、获取公文参数值

要对公文进行排版,首先要读取公文“参数设置”区中的参数值。比如公文要求对公文标题的一般规定是:一般用2号小标宋体字,居中显示。标题与正文中间空一行。

这些是“参数设置”中关于“文件标题”的默认设置。如果用户有特殊的要求,也可以在“参数设置”修改默认的设置。

所以我们在setDocFmt()中首先使用调用自定义函数getArg()来获取这些参数。

function getArg()
{
  taDbg.value += "\n--- getArg()" ;

  //标题字体名 font name
  dtfn = document.getElementById('selDocTitleFontName').value;
  //alert(fn);
  //标题字号 font size
  dtfs = document.getElementById('selDocTitleFontSize').value;
  //alert(fs);
  //标题对齐方式 text align
  dtta = document.getElementById('selDocTitleAlign').value;

  //一级标题字号 font name
  pt1fn = document.getElementById('selPrimaryTitleFontName').value;
  //一级标题字号 font size
  pt1fs = document.getElementById('selPrimaryTitleFontSize').value;

  //二级标题字号 font name
  pt2fn = document.getElementById('selSecondaryTitleFontName').value;
  //二级标题字号 font size
  pt2fs = document.getElementById('selSecondaryTitleFontSize').value;

  //正文字体名称
  mtfn = document.getElementById('selMainTextFontName').value;
  //正文字体字号
  mtfs = document.getElementById('selMainTextFontSize').value;
  //行距 row spacing
  rs  = document.getElementById('tbRowSp').value;
  //首行行首空格数
  sn  = document.getElementById('tbLeadSpNum').value;
}

二、公文标题排版

在获取公文参数值后,我们正式开始排版。

与“清除格式”一样,我们首先调用getClearInfoArray() 对要排版的内容进行格式清除。

然后在开始对公文标题进行排版,这主要在自定义函数setDocTitle()中完成:

function setDocTitle(s)
{
    taDbg.value += "\n--- setDocTitle("+ s  + ");" ;
    
    return '<p style="font-family:' + dtfn + ';font-size:' + dtfs +'pt; text-align:' + dtta + '; line-height:' +  rs + 'pt;">' + s;
}

主要是使用<p>标签,并通过css把与标题相关的参数值作为<p>的属性。

由于标题通常与正文中间空一行,所以setDocFmt()中在setDocTitle()完成标题格式设置后,我们添加了“<p style="line-height:"' + rs +'">&nbsp;';”来实现。即:

//标题
  t[0]  = setDocTitle(t[0]) + '</p><p style="line-height:"' + rs +'"> ';


这样我们就完成了标题的排版。这里我们不考虑标题有几行的情况。

function setDocFmt()
{
  taDbg.value += "\n---setDocFmt()\n";

  getArg();

  var t = getClearInfoArray();

  //标题
  t[0]  = setDocTitle(t[0]) + '</p><p style="line-height:"' + rs +'"> ';

  /*处理正文*/  

  edRichBody.innerHTML = t.join('</p><p>'); 
}

效果如下图:

image.png

完整的代码如下:    

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>公文一键排版</title>
<meta name="author" content="purpleendurer" >
<meta name="description" content="公文一键排版">
<script type="text/javascript">
const 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>');
}
const 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
];
 
 
//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>');
}
 
 
const aAlign = [
  ["左对齐","left"],//0
  ["居中对齐","center"],//1
  ["右对齐","right"],//2
  ["两端分散对齐","justify"]//3
];
 
 
//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>');
}
 
 
function showSrc()
{
  if (btnShowSrc.value=="显示源码")
  {
    edRichBody.innerText = edRichBody.innerHTML;
    btnShowSrc.value = "显示预览";
    btnShowSrc.style.background = "cyan";
  }
  else
  {
    edRichBody.innerHTML = edRichBody.innerText;
    btnShowSrc.value = "显示源码";
    btnShowSrc.style.background = "yellow";
  }
}
 
 
function stripPattribs(s)
{
  var i = s.indexOf('>');
  return  ((-1 != i) ? s.substr(i+1)  : s);
}
 
String.prototype.stripHTML = function() 
{
    var reTag = /<(?:.|\s)*?>/g;  
  //var reTag = /<[^>]+>/gi;  //过滤所有html标签,但不包括html标签内的内容 
 
    return this.replace(reTag,"");
}
 
String.prototype.trim = function() 
{//去除首尾空格
  return this.replace(/(^\s*)|(\s*$)/g, ""); 
  /*var t = this.replace(/(^\s*)|(\s*$)/g, ""); 
  return t =t.replace(/(^ *)|( *$)/g, ""); */
} 
 
function getClearInfoArray()
{
  taDbg.value += "\n---getClearInfoArray()\n";

  var s = edRichBody.innerHTML;
  var t = s.split('<p');
 
  for (var i=0; i < t.length; i++)
  {
    taDbg.value += "\nt[" + i + "]=" + t[i];
  }    
  
  while (t[0].length==0 || t[0]=='></p>')
  {
    taDbg.value += "\nshift: " + t[0];
    t.shift();
  }
 
  while (t[t.length-1].length==0 || t[t.length-1]=='></p>')
  {
    taDbg.value += "\npop: " + t[t.length-1];
    t.pop();
  }
 
  for (var i=0; i < t.length; i++)
  {
    t[i] = stripPattribs(t[i]);
    t[i] = t[i].stripHTML();
    t[i] = t[i].trim(); //去除首尾空格
    t[i] = t[i].replace(/ /ig, ''); //去除空格代码     
  }
 
  while (t[t.length-1].length==0 || t[t.length-1]=='></p>')
  {
    taDbg.value += "\npop: " + t[t.length-1];
    t.pop();
  }
 
  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>');
 
  edRichBody.innerHTML = s;
} 


function setDocTitle(s)
{
  taDbg.value += "\n--- setDocTitle("+ s  + ");" ;
  
  return '<p style="font-family:' + dtfn + ';font-size:' + dtfs +'pt; text-align:' + dtta + '; line-height:' +  rs + 'pt;">' + s;
}


function getArg()
{
  taDbg.value += "\n--- getArg()" ;

  //标题字体名 font name
  dtfn = document.getElementById('selDocTitleFontName').value;
  //alert(fn);
  //标题字号 font size
  dtfs = document.getElementById('selDocTitleFontSize').value;
  //alert(fs);
  //标题对齐方式 text align
  dtta = document.getElementById('selDocTitleAlign').value;

  //一级标题字号 font name
  pt1fn = document.getElementById('selPrimaryTitleFontName').value;
  //一级标题字号 font size
  pt1fs = document.getElementById('selPrimaryTitleFontSize').value;

  //二级标题字号 font name
  pt2fn = document.getElementById('selSecondaryTitleFontName').value;
  //二级标题字号 font size
  pt2fs = document.getElementById('selSecondaryTitleFontSize').value;

  //正文字体名称
  mtfn = document.getElementById('selMainTextFontName').value;
  //正文字体字号
  mtfs = document.getElementById('selMainTextFontSize').value;
  //行距 row spacing
  rs  = document.getElementById('tbRowSp').value;
  //首行行首空格数
  sn  = document.getElementById('tbLeadSpNum').value;
}    

function setDocFmt()
{
  taDbg.value += "\n---setDocFmt()\n";

  getArg();

  var t = getClearInfoArray();

  //标题
  t[0]  = setDocTitle(t[0]) + '</p><p style="line-height:"' + rs +'"> ';

  /*处理正文*/  

  edRichBody.innerHTML = t.join('</p><p>'); 
}  
 
</script>
</head>
<body>
<fieldset  style="width: 1100px;">
 <legend>实时编辑区</legend>
<!--
<iframe id="editor" width="600px" height="200px" style="border: solid 1px;" src="http://nyncj.hechi.gov.cn"></iframe>
//-->
<iframe id="editor" width="1200px" height="400px" style="border: solid 1px;"></iframe>
</fieldset>
<p>
  <input type="button" id="btnclearDocFmt" value="清除格式" onclick="clearDocFmt()" />
  <input type="button" id="btnsetDocFmt" value="一键排版" onclick="setDocFmt()" />
  <input type="button" id="btnShowSrc" value="显示源码" onclick="showSrc()" style="background:yellow; 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)" />
</p>
<fieldset style="width: 1200px;">
  <legend>参数设置</legend>
  <p>文件标题:
  <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="cbSecondaryTitleString">粗体
  </p>
  <p>三级标题:
    <input type="checkbox" checked id="cbThirdTitleString">粗体
  </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>
 </fieldset>
<p>调试信息</p>
<textarea id="taDbg" style="width: 1225px; height: 200px">调试信息</textarea>
<script type="text/javascript">
const edRich = document.getElementById("editor");
const taDbg = document.getElementById("taDbg");
const btnShowSrc =  document.getElementById("btnShowSrc");
//一级标题字号 font name
var pt1fn = document.getElementById('selPrimaryTitleFontName').value;
//一级标题字号 font size
var pt1fs =  document.getElementById('selPrimaryTitleFontSize').value;
//alert(fs);
//行距 row spacing
 var rs  =  document.getElementById('tbRowSp').value;
//首行行首空格数
 var sn  =  document.getElementById('tbLeadSpNum').value;
// (iframe.contentDocument||iframe.contentWindow.document).body.innerHTML
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=""></a></p><p></p><p class="MsoNormal"><p class="MsoNormal" align="center" style="text-align:center"><span lang="EN-US" style="font-family:黑体">SQL</span><span style="font-family:黑体">注入基础<span lang="EN-US"><o:p></o:p></span></span></p><p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span style="font-family:黑体">一、<span lang="EN-US">SQL</span>注入分类<span lang="EN-US"><o:p></o:p></span></span></p><p class="MsoNormal" style="text-indent:21.1pt;mso-char-indent-count:2.0"><b style="mso-bidi-font-weight:normal"><span style="font-family:楷体">(一)什么是<span lang="EN-US">SQL</span>注入<span lang="EN-US">?<o:p></o:p></span></span></b></p><p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span lang="EN-US">SLQ</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">注入</span><span lang="EN-US">(</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">英文</span><span lang="EN-US">: Sqlinject)</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">:当</span><span lang="EN-US">web</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">应用向后台数据库传递</span><span lang="EN-US">SQL</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">语句进行数据库操作时,如果对用户输入的参数没有经过严格的过滤,那么用户可以构造特殊的</span><span lang="EN-US">sq1</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">语句,从而带入到数据库中执行,获取或修改数据库中的数据。</span><span lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">例如很多影视网站泄露</span><span lang="EN-US">VIP</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">会员密码大多就是通过</span><span lang="EN-US">SQL</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">注入漏洞暴露的,这类网站特别容易受到</span><span lang="EN-US">SQL</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">注入攻击。</span><span lang="EN-US"><o:p></o:p></span></p><br></p>';
}
else
{
  window.alert("undefined");
}
</script>
</body>
</html>
相关文章
|
18天前
Next.js 实战 (二):搭建 Layouts 基础排版布局
本文介绍了作者在Next.js v15.x版本发布后,对一个旧项目的重构过程。文章详细说明了项目开发规范配置、UI组件库选择(最终选择了Ant-Design)、以及使用Ant Design的Layout组件实现中后台布局的方法。文末展示了布局的初步效果,并提供了GitHub仓库链接供读者参考学习。
Next.js 实战 (二):搭建 Layouts 基础排版布局
|
1月前
|
Web App开发 JavaScript 前端开发
2024年5月node.js安装(winmac系统)保姆级教程
本篇博客为2024年5月版Node.js安装教程,适用于Windows和Mac系统。作者是一名熟悉JavaScript与Vue的大一学生,分享了Node.js的基本介绍、下载链接及简单安装步骤。安装完成后,通过终端命令`node -v`验证版本即可确认安装成功。欢迎关注作者,获取更多技术文章。
30 2
2024年5月node.js安装(winmac系统)保姆级教程
|
15天前
|
Web App开发 移动开发 HTML5
html5 + Three.js 3D风雪封印在棱镜中的梅花鹿动效源码
html5 + Three.js 3D风雪封印在棱镜中的梅花鹿动效源码。画面中心是悬浮于空的梅花鹿,其四周由白色线段组成了一个6边形将中心的梅花鹿包裹其中。四周漂浮的白雪随着多边形的转动而同步旋转。建议使用支持HTML5与css3效果较好的火狐(Firefox)或谷歌(Chrome)等浏览器预览本源码。
51 2
|
28天前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
36 2
|
1月前
|
前端开发 JavaScript 安全
HTML+CSS+JS密码灯登录表单
通过结合使用HTML、CSS和JavaScript,我们创建了一个带有密码强度指示器的登录表单。这不仅提高了用户体验,还帮助用户创建更安全的密码。希望本文的详细介绍和代码示例能帮助您在实际项目中实现类似功能,提升网站的安全性和用户友好性。
47 3
|
1月前
|
JavaScript
JS鼠标框选并删除HTML源码
这是一个js鼠标框选效果,可实现鼠标右击出现框选效果的功能。右击鼠标可拖拽框选元素,向下拖拽可实现删除效果,简单实用,欢迎下载
42 4
|
1月前
|
移动开发 HTML5
html5+three.js公路开车小游戏源码
html5公路开车小游戏是一款html5基于three.js制作的汽车开车小游戏源代码,在公路上开车网页小游戏源代码。
59 0
html5+three.js公路开车小游戏源码
|
1月前
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤
随着前端开发技术的快速发展,代码规范和格式化工具变得尤为重要。本文介绍了如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤。通过这些工具,可以显著提升编码效率和代码质量。
470 4
|
1月前
|
JSON 移动开发 数据格式
html5+css3+js移动端带歌词音乐播放器代码
音乐播放器特效是一款html5+css3+js制作的手机移动端音乐播放器代码,带歌词显示。包括支持单曲循环,歌词显示,歌曲搜索,音量控制,列表循环等功能。利用json获取音乐歌单和歌词,基于html5 audio属性手机音乐播放器代码。
111 6
HTML 标题2
HTML标题通过&lt;h1&gt;到&lt;h6&gt;标签定义,其中&lt;h1&gt;为最大标题,&lt;h6&gt;为最小标题。&lt;hr&gt;标签用于创建水平线,分隔页面内容。注释通过&lt;!-- --&gt;添加,提高代码可读性,浏览器不显示。