仿【Emmet】转【HTML】功能
一、定义正则表达式:
var
whitespace = "[\\x20\\t\\r\\n\\f]*",
nvarcharEncoding = whitespace + "\\{([^}]+)\\}" + whitespace,
characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
relationEncoding = "[>\\+]",
multiEncoding = whitespace + "(\\d+)" + whitespace + "\\*" + whitespace,
attrEncoding = whitespace + "\\[" + whitespace + "(" + characterEncoding + ")(?:" + whitespace + "([*^$|!~]?=)" + whitespace +
"(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + characterEncoding.replace("w", "w#") + "))|)" + whitespace + "\\]" + whitespace,
mainEncoding = whitespace + "[#\\.]?" + characterEncoding + whitespace,
htmlEncoding = whitespace + "(" + multiEncoding + ")*((" + mainEncoding + "|" + attrEncoding + "|" + nvarcharEncoding + ")+)" + whitespace,
htmlsEncoding = htmlEncoding + "(" + relationEncoding + htmlEncoding + ")*"; var
rsingle = /[\(\)]/g,
rdouble = /[(][^()]*[)]/g,
rsinglel = /^[\x20\t\r\n\f]*\(/,
rsingler = new RegExp("^(" + htmlsEncoding + ")?\\)+"); var rmulti = new RegExp(multiEncoding);
var rchild = new RegExp("^(" + whitespace + "\\))?" + whitespace + ">");
var rnext = new RegExp("^" + whitespace + "\\+");
var rid = new RegExp("^" + whitespace + "#(" + characterEncoding + ")");
var rtag = new RegExp("^" + whitespace + "(\\w+)");
var rclass = new RegExp("^" + whitespace + "\\.(" + characterEncoding + ")");
var rcontent = new RegExp("^" + whitespace + nvarcharEncoding);
var rattr = new RegExp("^" + attrEncoding);
var rhtml = new RegExp("^" + htmlsEncoding + "$");
二、定义方法入口:
function dynamicMultiTag(selector) {
if (!selector || $.type(selector) !== "string" || !rhtml.test(selector.replace(rsingle, ""))) { return selector; }
var match = selector.replace(rdouble, "");
while (rdouble.test(match)) { match = match.replace(rdouble, ""); }
if (rsingle.test(match)) { return selector; }
return _dynamicMultiTag_(selector);
}
三、定义方法主体:
function _dynamicMultiTag_(selector) {
var match, multi = 1, result, results = [];
if (match = rmulti.exec(selector)) {
multi = match[1] >>> 0;
selector = selector.replace(rmulti, '');
}
if (rsinglel.test(selector)) {
selector = selector.replace(rsinglel, '');
result = _dynamicMultiTag_(selector);
while (multi--) {
results.push(result);
}
selector = selector.replace(rsingler, '');
if (rnext.test(selector)) { results.push(_dynamicMultiTag_(selector.replace(rnext, ''))); }
return results.join('');
}
var tag = 'div', htmls = [];
if (match = rtag.exec(selector)) { tag = match[1]; selector = selector.replace(rtag, ""); }
htmls.push('<', tag);
if (match = rid.exec(selector)) {
htmls.push(' id="', match[1], '"');
selector = selector.replace(rid, "");
}
if (match = rclass.exec(selector)) {
htmls.push(' class="', match[1]);
while (match = rclass.exec(selector = selector.replace(rclass, ''))) { htmls.push(' ', match[1]); }
htmls.push('"');
}
if (match = rid.exec(selector)) {
htmls.push(' id="', match[1], '"');
selector = selector.replace(rid, "");
}
while (match = rattr.exec(selector)) {
htmls.push(match[1], match[2], '"', match[3] || match[4] || match[5], '"');
selector = selector.replace(rattr, "");
}
htmls.push('>');
if (match = rcontent.exec(selector)) {
htmls.push(match[1]);
selector = selector.replace(rcontent, "");
}
if (rchild.test(selector)) {
htmls.push(_dynamicMultiTag_(selector = selector.replace(rchild, "")));
}
htmls.push('</', tag, '>');
if (rnext.test(selector)) {
htmls.push(_dynamicMultiTag_(selector = selector.replace(rnext, "")));
}
result = htmls.join('');
while (multi--) { results.push(result); }
return results.join('');
}
四、使用方法:dynamicMultiTag(selector) //selector ==> {string|object string} == >('2*div') ==>"<div></div><div></div>"
1、克隆(如:"2*div" ==> "<div></div><div></div>")
2、选择器(如:'div#id.class > div + span' ==> '<div id="id" class="class"><div></div><span></span></div>')
3、内容(如:'span{我是span元素的内容}' ==> '<span>我是span元素的内容</span>')
4、多元(如:'(div.i11 > span.i12) + (div.i21 + div.i22 > (div.i221 + span.i222))' ==> <div class="i11"><span class="i12"></span></div><div class="i21"></div><div class="i22"><div class="i221"></div><span class="i222"></span></div>)
仿【Emmet】转【HTML】功能的更多相关文章
- Emmet的高级功能与使用技巧
Emmet系列教程 前端开发利器Emmet的介绍 Emmet快速编写HTML代码 Emmet快速编写CSS样式 Emmet快速编写CSS样式 编写好HTML和CSS代码时,我们也需要修改或添加一些内容 ...
- c#/asp.net实现炫酷仿调色板/颜色选择器功能
asp.net 之颜色选择器,仿调色板功能 1. 插件非常容易使用,只需引用相应的js文件和css样式文件即可,见代码示例,插件精小,炫酷 2. 只需要初始化即可使用,并且选择的颜色会在文本框中以16 ...
- Android学习之仿QQ側滑功能的实现
如今项目越来越多的应用了滑动删除的功能,Android本来遵循的是长按删除,IOS定制的是滑动删除,不可否认滑动删除确实在客户体验上要好一点,所以看了非常多关于仿QQ滑动删除的样例,还是感觉代码家的A ...
- uniapp+nvue开发之仿微信语音+视频通话功能 :实现一对一语音视频在线通话
本篇文章是利用uni-app和nvue实现微信效果功能的第三篇了,今天我们基于uniapp + nvue实现的uniapp仿微信音视频通话插件实例项目,实现了以下功能: 1: 语音通话 2: 视频 ...
- uniapp+nvue实现仿微信App界面+功能 —— uni-app实现聊天+语音+视频+图片消息
基于uniapp + nvue实现的uniapp仿微信界面功能聊天应用 txim 实例项目,实现了以下功能. 1: 聊天会话管理 2: 好友列表 3: 文字.语音.视频.表情.位置等聊天消息收发 4: ...
- 使用Jquery UI 高仿百度搜索下拉列表功能
最近项目有个需求,在新添加商户的时候,用户输入商户名称后,如果系统中有类似的商户名称,直接显示出来,如下图的效果: 实现这个功能,直接使用了JQuery UI 插件 目前我使用的实现版本是: 网友可以 ...
- C# 实现简单仿QQ登陆注册功能
闲来没事,想做一个仿QQ登陆注册的winform,于是利用工作之余,根据自己的掌握和查阅的资料,历时4天修改完成,新手水平,希望和大家共同学习进步,有不同见解希望提出! 废话不多说,进入正题: 先来看 ...
- 安卓listView实现下拉刷新上拉加载滑动仿QQ的删除功能
大家对这些功能都是看的多了,然后对上拉刷新和下拉加载的原理都是非常清楚的,所以实现这功能其实也就是为了让大家能够从众多的同行们来进行比较学习而已,虽然即使是这样,但是面试的时候面试官还是会问你上拉和下 ...
- 利用百度地图Android sdk高仿微信发送位置功能
接触了百度地图开发平台半个月了,这2天试着模仿了微信给好友发送位置功能,对百度地图的操作能力又上了一个台阶 (假设须要完整demo.请评论留下邮箱) (眼下源代码已经不发送,假设须要源代码.加qq31 ...
- jq仿ps颜色拾取功能-js颜色拾取
1.效果展示 2.html代码:index.html <!DOCTYPE html> <html lang="en"> <head> <m ...
随机推荐
- Rails 5 开发进阶
Rails 5 开发进阶:https://www.gitbook.com/book/kelby/rails-beginner-s-guide/details cancan : http://blo ...
- 破解激活Win10无风险?激活后删除激活工具无影响===http://www.pconline.com.cn/win10/693/6932077_all.html#content_page_4
1Windows激活:测试环境搭建 随着Windows 10的发布,许多用户都用上了这个新一代的操作系统.Windows 10有个最好的设置就是,只要你在已经激活的旧系统中升进行升级操作,就能获得一个 ...
- Shell 获取指定行的内容
需求: 有一个文件,根据指定的字符串,得到该字符串上两行的内容. 文件内容如下: linux-56:# cat sys.ttconnect.ini # Copyright (C) 1999, 2006 ...
- Java笔记:异常
Exception 类的层次 所有的异常类是从 java.lang.Exception 类继承的子类. Exception 类是 Throwable 类的子类.除了Exception类外,Throwa ...
- WPF 动画显示控件
当我们要显示一个控件的时候,不仅仅要显示这个控件,还要有动画的效果. 主要用到了DoubleAnimation类. public static void ShowAnimation(object co ...
- Android Studio导入项目问题小结
1. import project 之后一直停留在 building 界面 解决方案: 1.随便找一个你能运行的as项目 2.打开gradle-wrapper.properties,文件目录:项目/g ...
- 创建Hello World程序(part-2)
空有洪荒之力,却没用在聊妹上,今晚接着写博客... 如下图,点击左侧导航栏中的Program.cs 文件,隔一会儿会弹出一个窗口,提示是否需要添加用于编译和调试相关的东西,点Yes就行了 如下图,左侧 ...
- 百度地图api的覆盖物样式与bootstrap样式冲突解决办法
使用百度地图api 和 bootstrap ,发现标注样式出现了问题 label左侧 宽度变得非常窄 正常情况下应该是下面这样的: 原因是boostrap样式和百度地图样式冲突了. 解决办法: .ba ...
- Delphi容器类之---TOrderedList、TStack、TQueue、TObjectStack、TObjectQueue
TOrderedList.TStack.TQueue Contnrs单元还定义了其他三个类:TOrderedList.TStack.TQueue TOrderedList TOrderedList = ...
- [BI项目记]-新任务处理
上一篇主要介绍如何借助TFS创建一个新的工作项,此篇主要演示如何对其进行处理. 首先回顾下新工作项不同阶段的定义. 接下来进入到开发阶段,根据需求创建五个报表.打开SQL Server Data To ...