Jquery 实现一个简单的 HTML 代码格式化工具

时间:2024-03-05 18:49:51

Jquery 实现一个简单的 HTML 代码格式化工具,主要功能,对中英文之间加入空格,格式化 HTML 代码:

<html>
  <head>
    <title>HTML 代码格式化工具</title>
    <script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
    <style>
      input {
        display: inline-block;
        padding: 6px 12px;
        margin-bottom: 0;
        font-size: 14px;
        font-weight: normal;
        text-align: center;
        white-space: nowrap;
        background-image: none;
        border: 1px solid transparent;
        vertical-align: middle;
        -webkit-appearance: button;
        background-color: #16c0f8;
        bottom: 0;
        right: 0;
        box-shadow: none;
        width: 80px;
        border-radius: 0;
        color: #fff;
        opacity: 0.85;
        margin: 0 5px;
        padding: 8px 20px 7px;
        text-decoration: none; /*background-color: #ddd;
        color: #666;*/
        box-sizing: border-box;
        border-radius: 3px;
        cursor: pointer;
      }
    </style>
  </head>
  <body>
    <div style="width:60%;height:100%; margin:0 auto">
      <p>
        <strong>HTML 代码格式化工具</strong>
      </p>
      <p>
        <textarea
          name="oldHtmlCode"
          id="oldHtmlCode"
          cols="160"
          rows="24"
          style="width:100%;height:40%;"
        ></textarea>
      </p>
      <p style="text-align:right;">
        <input type="button" name="btnFormat" id="btnFormat" value="格式化" />
      </p>
      <p>
        <textarea
          name="newHtmlCode"
          id="newHtmlCode"
          cols="160"
          rows="24"
          style="width:100%;height:40%;"
        ></textarea>
      </p>
    </div>
  </body>
</html>
<script type="text/javascript">
  $(function() {
    $("#btnFormat").click(function() {
      //匹配英文临近中文
      var p1 = /([A-Za-z])((<[^<]*>)*[\u4e00-\u9fa5]+)/gi;
      var r = $("#oldHtmlCode").val();
      r = r.replace(p1, "$1 $2");
      //匹配数字临近中文
      var p2 = /([0-9])([\u4e00-\u9fa5]+)/gi;
      r = r.replace(p2, "$1 $2");
      //匹配中文临近数字
      var p3 = /([\u4e00-\u9fa5]+)([0-9])/gi;
      r = r.replace(p3, "$1 $2");

      var p4 = /([\u4e00-\u9fa5]+(<[^<]*>)*)([A-Za-z])/gi;
      r = r.replace(p4, "$1 $3");
      //r = r.replace(") ", ")");
      $("#newHtmlCode").val(format(r));
    });
    $("#btnFormat").click(function() {
      //获取贴入文本域的需要格式化的html代码
      var text = $("#origin").val();
      //执行格式化函数对文本进行格式化
      var fmt = format(text);
      //将格式化后的代码放入文本域进行显示
      $("#result").val(fmt);
    });
    function format(strs) {
      var left = null;
      var right = null;
      var str = "";
      var blank = "\t";
      var fmt = [];

      for (var i = 0; i < strs.length; i++) {
        //发现左尖括号后将其位置记录在left变量上
        if (strs[i] == "<") {
          left = i;
        } else if (strs[i] == ">") {
          //发现右尖括号后将其记录在right变量上
          right = i;
        }
        //当做尖括号右尖括号都记录了一个位置后,说明二者之间的内容为代码的一行
        if (typeof left == "number" && typeof right == "number") {
          //判断字符串左尖括号后是否为‘/’,如果满足,表明该行代码为双标签的闭合标签
          if (strs[left + 1] == "/") {
            //对数组中的空格做出栈,确保代码缩进正确
            fmt.pop();
            //将该行代码放入str变量中
            str += fmt.join("") + strs.slice(left, right + 1);
            //判断字符串右尖括号前一位是否为‘/’,如满足,表明该标签为严格闭合的单标签
          } else if (strs[right - 1] == "/") {
            str += fmt.join("") + strs.slice(left, right + 1);
            //判断字符串开头是否包含input/imig/hr/br/link/meta等字母,用于屏蔽非严格未闭合的单标签
          } else if (
            strs
              .slice(left, right)
              .search(/\<input|\<img|\<hr|\<br|\<link|\<meta/) != -1
          ) {
            str += fmt.join("") + strs.slice(left, right + 1);
            //对双标签的左标签进行的操作
          } else {
            str += fmt.join("") + strs.slice(left, right + 1);
            //向数组中堆入一个空格,确保下一行双标签的左标签的缩进正确
            fmt.push(blank);
          }
          //对 right 位置后的字符串进行遍历
          for (var j = right; j < strs.length; j++) {
            //查找right位置后,第一个左尖括号的位置,二者之间的内容即为代码中的文本内容
            if (strs[j] == "<") {
              //去掉文本中多余的空格
              var s = strs.slice(right + 1, j).replace(/\s*/g, "");
              if (s) {
                // 当文本中去掉空格后任然有内容,则将文本拼入 str 变量进行存储
                str += s;
              }
              break;
            }
          }
          // 每次获得一次左右尖括号的位置后,即得到了一行代码,为代码做换行处理
          str += "\n";
          // 重置 left、right 的值,用于 for 循环的下次存储做右尖括号的位置
          left = null;
          right = null;
        }
      }
      // 返回得到的格式化完成的 html 代码字符串
      return str;
    }
  });
</script>

目前还不是很完善,只是解决了自己常用的一些场景。