Skip to content

Commit

Permalink
~ 优化 parsePath
Browse files Browse the repository at this point in the history
  • Loading branch information
cloudcome committed Dec 20, 2016
1 parent 88543b4 commit 6a45e7e
Show file tree
Hide file tree
Showing 7 changed files with 192 additions and 38 deletions.
31 changes: 11 additions & 20 deletions bs-config.js
@@ -1,17 +1,8 @@
'use strict';

// 当前 website 的 port
var WEBSITE_PROT = 10000;

// Browser-sync 启动的端口
var BROWSER_SYNC_MAIN_PORT = WEBSITE_PROT++;

// Browser-sync ui 端口
var BROWSER_SYNC_UI_PORT = WEBSITE_PROT++;

// weinre 端口
var BROWSER_SYNC_WEINRE_PORT = WEBSITE_PROT++;

var UI_PORT = 10000;
var WEINRE_PORT = UI_PORT + 1;
var BROWSER_SYNC_PORT = UI_PORT + 1;

/*
|--------------------------------------------------------------------------
Expand All @@ -28,20 +19,20 @@ var BROWSER_SYNC_WEINRE_PORT = WEBSITE_PROT++;
*/
module.exports = {
"ui": {
"port": BROWSER_SYNC_UI_PORT,
"port": UI_PORT,
"weinre": {
"port": BROWSER_SYNC_WEINRE_PORT
"port": WEINRE_PORT
}
},
"files": [
'./webroot-dev/static/**',
'./webroot-dev/.views/**',
'./webserver/**'
'./example/**'
],
"watchOptions": {},
"server": false,
"proxy": EXPRESS_URL,
"port": BROWSER_SYNC_MAIN_PORT,
"server": {
baseDir: "./"
},
"proxy": false,
"port": BROWSER_SYNC_PORT,
"middleware": false,
"serveStatic": [],
"ghostMode": {
Expand Down
5 changes: 5 additions & 0 deletions example/coolie-config.js
@@ -0,0 +1,5 @@
coolie.config({
mainModulesDir: '/example/',
nodeModulesDir: '/node_modules/',
nodeModuleMainPath: 'src/index.js'
}).use();
55 changes: 55 additions & 0 deletions example/index.html
@@ -0,0 +1,55 @@
<!doctype html>
<!--
- 文件描述
- @author ydr.me
- @create 2016-06-27 17:26
-->
<html lang="zh-Hans">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="renderer" content="webkit">
<meta name="viewport" content="width=device-width,user-scalable=no,maximum-scale=1.0,minimum-scale=1.0,minimal-ui">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-touch-fullscreen" content="yes">
<meta name="format-detection" content="telephone=no">
<meta name="author" content="云淡然;http://ydr.me">
<meta name="keywords" content="关键词1,关键词2">
<meta name="description" content="描述语句">
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
<title>index.html</title>
<style>
textarea {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
display: block;
width: 100%;
font-size: 20px;
margin-bottom: 20px;
padding: 6px;
}

button {
padding: 10px 20px;
font-size: 20px;
}
</style>
</head>
<body ontouchstart="">

<h1>object.parsePath(path) example</h1>
原始:
<textarea id="source" rows="1">a["\""]</textarea>
结果:
<textarea id="target" rows="1"></textarea>

<button id="parse">parsePath</button>


<script src="/node_modules/coolie.js/coolie.js"
data-config="/example/coolie-config.js"
data-main="index.js"></script>

</body>
</html>
18 changes: 18 additions & 0 deletions example/index.js
@@ -0,0 +1,18 @@
/**
* 文件描述
* @author ydr.me
* @create 2016-06-27 17:34
*/


'use strict';

var object = require('../src/index');

var sourceEl = document.getElementById('source');
var targetEl = document.getElementById('target');
var parseEl = document.getElementById('parse');

parseEl.onclick = function () {
targetEl.value = object.parsePath(sourceEl.value).join(' ==> ');
};
3 changes: 2 additions & 1 deletion package.json
@@ -1,6 +1,6 @@
{
"name": "blear.utils.object",
"version": "1.0.7",
"version": "1.0.8",
"description": "object utils",
"scripts": {
"live": "browser-sync start --config bs-config.js",
Expand Down Expand Up @@ -37,6 +37,7 @@
},
"peerDependencies": {},
"devDependencies": {
"coolie.js": "^2.0.22",
"jasmine-core": "^2.4.1",
"karma": "^0.13.22",
"karma-chrome-launcher": "^1.0.1",
Expand Down
103 changes: 86 additions & 17 deletions src/index.js
Expand Up @@ -280,27 +280,42 @@ var supply = exports.supply = function supply(_deep, _source, _target) {
};


var isQuote = function (char) {
return char === "'" || char === '"';
};
var BRACKET_START = '[';
var BRACKET_END = ']';
var BACKSLASH = '\\';
var POINT = '.';


/**
* 根据路径获取路径数组
* @param {String|Array} path 路径
* @returns {Array}
*
* @example
* object.pathList('a.b.c');
* object.parsePath('a.b.c');
* // => ['a', 'b', 'c']
*/
var pathList = exports.pathList = function (path) {
var parsePath = exports.parsePath = function (path) {
var pathList = [];

if (typeis.Array(path)) {
pathList = path;
} else {
var point = '.';
var bracketStart = '[';
var bracketEnd = ']';
var start = 0;
// [~~~]
var inBracket = false;
// .~~~
var inPoint = false;
// "~~~"
var inQuote = '';
// \~~~
var inEscape = false;
var current = 0;
var length = path.length;
var lastPath = '';
var lastChar = '';
var push = function () {
if (lastPath) {
pathList.push(lastPath);
Expand All @@ -309,20 +324,74 @@ var pathList = exports.pathList = function (path) {
lastPath = '';
};

while (start !== length) {
var char = path[start];
while (current !== length) {
var char = path[current];

if (char === point) {
push();
} else if (char === bracketStart) {
push();
} else if (char === bracketEnd) {
//
} else {
// [=> ~~
if (inBracket) {
// [=>"
if (!inQuote && isQuote(char)) {
inQuote = char;
}
// ["~~ \=>~ ~~"]
else if (inEscape) {
// ["~~ \=>" ~~"}
if (char === inQuote) {
lastPath = lastPath.slice(0, -1);
}

lastPath += char;
inEscape = false;
}
// ["~~ =>"]
else if (inQuote == char) {
inBracket = false;
inQuote = '';
current++;
push();
}
// [00000 =>]
else if (!inQuote && char === BRACKET_END) {
inBracket = false;
push();
}
// ["~~ =>\ ~~"]
else if (char === BACKSLASH) {
inEscape = true;
lastPath += char;
} else {
lastPath += char;
}
}
// .=> ~~
else if (inPoint) {
if (char === BRACKET_START) {
inBracket = true;
inPoint = false;
push();
} else if (char === POINT) {
inPoint = true;
push();
} else {
lastPath += char;
}
}
// =>.
else if (char === POINT) {
inPoint = true;
}
// =>[
else if (char === BRACKET_START) {
inBracket = true;
}
// =>~
else {
inPoint = true;
lastPath += char;
}

start++;
current++;
lastChar = char;
}

push();
Expand All @@ -347,7 +416,7 @@ var pathList = exports.pathList = function (path) {
* // => 2
*/
exports.value = function (obj, path) {
var _pathList = pathList(path);
var _pathList = parsePath(path);
var i = 0;
var j = _pathList.length;
var ret;
Expand Down
15 changes: 15 additions & 0 deletions test/test.index.js
Expand Up @@ -316,6 +316,21 @@ describe('index.js', function () {
expect(o3.b[1]).toBe(3);
});

it('.parsePath', function () {
expect(object.parsePath('a.b').join(' > ')).toEqual('a > b');
expect(object.parsePath('a.b["c"]').join(' > ')).toEqual('a > b > c');
expect(object.parsePath('a.b["c"].d').join(' > ')).toEqual('a > b > c > d');
expect(object.parsePath('a.b["c"]["d"]').join(' > ')).toEqual('a > b > c > d');
expect(object.parsePath('a.b["c"][1]').join(' > ')).toEqual('a > b > c > 1');
expect(object.parsePath('a.b["c"][1].d').join(' > ')).toEqual('a > b > c > 1 > d');
expect(object.parsePath('a.b["c"][1][2]').join(' > ')).toEqual('a > b > c > 1 > 2');
expect(object.parsePath('a.b["c"][1][2][3]').join(' > ')).toEqual('a > b > c > 1 > 2 > 3');
expect(object.parsePath('a.b["c"][1][2][3].d').join(' > ')).toEqual('a > b > c > 1 > 2 > 3 > d');
expect(object.parsePath('a.b["c"][1][2][3].d.e').join(' > ')).toEqual('a > b > c > 1 > 2 > 3 > d > e');
expect(object.parsePath('a.b["\'c"]').join(' > ')).toEqual('a > b > \'c');
expect(object.parsePath('a.b["\\"c"]').join(' > ')).toEqual('a > b > "c');
});

it('.value', function () {
var o1 = {
a: {
Expand Down

0 comments on commit 6a45e7e

Please sign in to comment.