You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43310 lines
1.1 MiB
43310 lines
1.1 MiB
(global["webpackJsonp"] = global["webpackJsonp"] || []).push([["common/vendor"],{
|
|
|
|
/***/ 1:
|
|
/*!*********************************************************!*\
|
|
!*** ./node_modules/@dcloudio/uni-mp-weixin/dist/wx.js ***!
|
|
\*********************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = void 0;
|
|
var objectKeys = ['qy', 'env', 'error', 'version', 'lanDebug', 'cloud', 'serviceMarket', 'router', 'worklet', '__webpack_require_UNI_MP_PLUGIN__'];
|
|
var singlePageDisableKey = ['lanDebug', 'router', 'worklet'];
|
|
var target = typeof globalThis !== 'undefined' ? globalThis : function () {
|
|
return this;
|
|
}();
|
|
var key = ['w', 'x'].join('');
|
|
var oldWx = target[key];
|
|
var launchOption = oldWx.getLaunchOptionsSync ? oldWx.getLaunchOptionsSync() : null;
|
|
function isWxKey(key) {
|
|
if (launchOption && launchOption.scene === 1154 && singlePageDisableKey.includes(key)) {
|
|
return false;
|
|
}
|
|
return objectKeys.indexOf(key) > -1 || typeof oldWx[key] === 'function';
|
|
}
|
|
function initWx() {
|
|
var newWx = {};
|
|
for (var _key in oldWx) {
|
|
if (isWxKey(_key)) {
|
|
// TODO wrapper function
|
|
newWx[_key] = oldWx[_key];
|
|
}
|
|
}
|
|
return newWx;
|
|
}
|
|
target[key] = initWx();
|
|
var _default = target[key];
|
|
exports.default = _default;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 10:
|
|
/*!****************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/nonIterableRest.js ***!
|
|
\****************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
function _nonIterableRest() {
|
|
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
}
|
|
module.exports = _nonIterableRest, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 11:
|
|
/*!***************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/defineProperty.js ***!
|
|
\***************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var toPropertyKey = __webpack_require__(/*! ./toPropertyKey.js */ 12);
|
|
function _defineProperty(obj, key, value) {
|
|
key = toPropertyKey(key);
|
|
if (key in obj) {
|
|
Object.defineProperty(obj, key, {
|
|
value: value,
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true
|
|
});
|
|
} else {
|
|
obj[key] = value;
|
|
}
|
|
return obj;
|
|
}
|
|
module.exports = _defineProperty, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 12:
|
|
/*!**************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/toPropertyKey.js ***!
|
|
\**************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var _typeof = __webpack_require__(/*! ./typeof.js */ 13)["default"];
|
|
var toPrimitive = __webpack_require__(/*! ./toPrimitive.js */ 14);
|
|
function toPropertyKey(t) {
|
|
var i = toPrimitive(t, "string");
|
|
return "symbol" == _typeof(i) ? i : i + "";
|
|
}
|
|
module.exports = toPropertyKey, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 13:
|
|
/*!*******************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/typeof.js ***!
|
|
\*******************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
function _typeof(o) {
|
|
"@babel/helpers - typeof";
|
|
|
|
return (module.exports = _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
|
|
return typeof o;
|
|
} : function (o) {
|
|
return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
|
|
}, module.exports.__esModule = true, module.exports["default"] = module.exports), _typeof(o);
|
|
}
|
|
module.exports = _typeof, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 14:
|
|
/*!************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/toPrimitive.js ***!
|
|
\************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var _typeof = __webpack_require__(/*! ./typeof.js */ 13)["default"];
|
|
function toPrimitive(t, r) {
|
|
if ("object" != _typeof(t) || !t) return t;
|
|
var e = t[Symbol.toPrimitive];
|
|
if (void 0 !== e) {
|
|
var i = e.call(t, r || "default");
|
|
if ("object" != _typeof(i)) return i;
|
|
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
}
|
|
return ("string" === r ? String : Number)(t);
|
|
}
|
|
module.exports = toPrimitive, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 15:
|
|
/*!**********************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/construct.js ***!
|
|
\**********************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var setPrototypeOf = __webpack_require__(/*! ./setPrototypeOf.js */ 16);
|
|
var isNativeReflectConstruct = __webpack_require__(/*! ./isNativeReflectConstruct.js */ 17);
|
|
function _construct(t, e, r) {
|
|
if (isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments);
|
|
var o = [null];
|
|
o.push.apply(o, e);
|
|
var p = new (t.bind.apply(t, o))();
|
|
return r && setPrototypeOf(p, r.prototype), p;
|
|
}
|
|
module.exports = _construct, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 16:
|
|
/*!***************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/setPrototypeOf.js ***!
|
|
\***************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
function _setPrototypeOf(o, p) {
|
|
module.exports = _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {
|
|
o.__proto__ = p;
|
|
return o;
|
|
}, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
return _setPrototypeOf(o, p);
|
|
}
|
|
module.exports = _setPrototypeOf, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 17:
|
|
/*!*************************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/isNativeReflectConstruct.js ***!
|
|
\*************************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
function _isNativeReflectConstruct() {
|
|
try {
|
|
var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
|
|
} catch (t) {}
|
|
return (module.exports = _isNativeReflectConstruct = function _isNativeReflectConstruct() {
|
|
return !!t;
|
|
}, module.exports.__esModule = true, module.exports["default"] = module.exports)();
|
|
}
|
|
module.exports = _isNativeReflectConstruct, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 174:
|
|
/*!*******************************************!*\
|
|
!*** D:/工作/zhonglmini/common/testdata.js ***!
|
|
\*******************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = void 0;
|
|
//商家信息
|
|
var storeData = {
|
|
//商家唯一标识
|
|
storeId: '168',
|
|
//商家名称
|
|
storeName: '小太阳商店',
|
|
//头像
|
|
avatar: '/static/face/face_2.jpg',
|
|
//横幅图片
|
|
banner: '/static/goods/banner.jpg',
|
|
//商家住址
|
|
address: '新疆阿克苏是他北路2号',
|
|
//配送时间
|
|
deliveryTime: '11:00~20:30',
|
|
//联系电话
|
|
telephone: '18299989916',
|
|
//商家购物车
|
|
shoppingCart: [],
|
|
//配送费
|
|
shippingDees: 0,
|
|
//配送起步价
|
|
startingPrice: 30
|
|
};
|
|
|
|
//评论数据
|
|
var commentData = [{
|
|
header_img: "/static/face/face_4.jpg",
|
|
user_name: "测试1",
|
|
rate: 5,
|
|
create_time: "2019.04.12",
|
|
content: "好评",
|
|
imgs: ['/static/goods/1.jpg', '/static/goods/3.jpg', '/static/goods/4.jpg', '/static/goods/5.jpg']
|
|
}, {
|
|
content: "中评",
|
|
create_time: "2019.04.12",
|
|
header_img: "/static/face/face_5.jpg",
|
|
user_name: "测试2",
|
|
rate: 4
|
|
// imgs:[]
|
|
}, {
|
|
content: "",
|
|
create_time: "2019.04.12",
|
|
header_img: "/static/face/face_6.jpg",
|
|
user_name: "测试3",
|
|
rate: 2
|
|
// imgs:[]
|
|
}, {
|
|
content: "好评",
|
|
create_time: "2019.04.12",
|
|
header_img: "/static/face/face_7.jpg",
|
|
user_name: "小蚂蚁",
|
|
rate: 5,
|
|
imgs: ['/static/goods/7.jpg', '/static/goods/8.jpg', '/static/goods/9.jpg', '/static/goods/10.jpg']
|
|
}, {
|
|
content: "中评",
|
|
create_time: "2019.04.12",
|
|
header_img: "/static/face/face_8.jpg",
|
|
user_name: "沙漠骆驼",
|
|
rate: 3.5
|
|
// imgs:[]
|
|
}, {
|
|
content: "",
|
|
create_time: "2019.04.12",
|
|
header_img: "/static/face/face_9.jpg",
|
|
user_name: "莫思",
|
|
rate: 2.3
|
|
// imgs:[]
|
|
}];
|
|
|
|
//商品数据
|
|
var goodsData = [{
|
|
id: 1,
|
|
type_id: 1,
|
|
name: '白果王水果沙拉',
|
|
descripe: "脆糯营养,口感好,健康绿色",
|
|
img: '/static/goods/9.jpg',
|
|
price: "9",
|
|
oldprice: "100"
|
|
}, {
|
|
id: 2,
|
|
type_id: 2,
|
|
name: '精品烤山药',
|
|
descripe: "脆糯营养,口感好,健康绿色",
|
|
img: '/static/goods/10.jpg',
|
|
price: "8",
|
|
oldprice: "100"
|
|
}, {
|
|
id: 3,
|
|
type_id: 2,
|
|
name: '川味毛血旺',
|
|
descripe: "脆糯营养,口感好,健康绿色",
|
|
img: '/static/goods/11.jpg',
|
|
price: "4",
|
|
oldprice: ""
|
|
}, {
|
|
id: 4,
|
|
type_id: 3,
|
|
name: '吐鲁番烤全羊',
|
|
descripe: "脆糯营养,口感好,健康绿色",
|
|
img: '/static/goods/4.jpg',
|
|
price: "4",
|
|
oldprice: ""
|
|
}, {
|
|
id: 5,
|
|
type_id: 3,
|
|
name: '红烧肉',
|
|
descripe: "脆糯营养,口感好,健康绿色",
|
|
img: '/static/goods/5.jpg',
|
|
price: "4",
|
|
oldprice: ""
|
|
}, {
|
|
id: 6,
|
|
type_id: 4,
|
|
name: '新疆特色辣子鸡',
|
|
descripe: "脆糯营养,口感好,健康绿色",
|
|
img: '/static/goods/6.jpg',
|
|
price: "4",
|
|
oldprice: ""
|
|
}, {
|
|
id: 7,
|
|
type_id: 5,
|
|
name: '绝味海鲜拼盘',
|
|
descripe: "脆糯营养,口感好,健康绿色",
|
|
img: '/static/goods/7.jpg',
|
|
price: "4",
|
|
oldprice: ""
|
|
}, {
|
|
id: 8,
|
|
type_id: 5,
|
|
name: '金色香糯大粽子',
|
|
descripe: "脆糯营养,口感好,健康绿色",
|
|
img: '/static/goods/3.jpg',
|
|
price: "4",
|
|
oldprice: ""
|
|
}, {
|
|
id: 9,
|
|
type_id: 5,
|
|
name: '马梓林香香鸡',
|
|
descripe: "脆糯营养,口感好,健康绿色",
|
|
img: '/static/goods/2.jpg',
|
|
price: "4",
|
|
oldprice: ""
|
|
}, {
|
|
id: 10,
|
|
type_id: 6,
|
|
name: '草莓味莫普氏蛋糕',
|
|
descripe: "脆糯营养,口感好,健康绿色",
|
|
img: '/static/goods/1.jpg',
|
|
price: "4",
|
|
oldprice: ""
|
|
}];
|
|
|
|
//商品种类数据
|
|
var categoryData = [{
|
|
id: 1,
|
|
name: '烧烤'
|
|
}, {
|
|
id: 2,
|
|
name: '生鲜'
|
|
}, {
|
|
id: 3,
|
|
name: '绿蔬'
|
|
}, {
|
|
id: 4,
|
|
name: '肉类'
|
|
}, {
|
|
id: 5,
|
|
name: '川味'
|
|
}, {
|
|
id: 6,
|
|
name: '粤菜'
|
|
}, {
|
|
id: 7,
|
|
name: '湘菜'
|
|
}, {
|
|
id: 8,
|
|
name: '西餐'
|
|
}, {
|
|
id: 9,
|
|
name: '饮料'
|
|
}, {
|
|
id: 10,
|
|
name: '糕点'
|
|
}, {
|
|
id: 11,
|
|
name: '凉菜'
|
|
}, {
|
|
id: 12,
|
|
name: '火锅'
|
|
}, {
|
|
id: 13,
|
|
name: '干锅'
|
|
}];
|
|
|
|
//商品详细
|
|
var goodsInfo = {
|
|
//商品id
|
|
id: 1,
|
|
//商品类id
|
|
type_id: 1,
|
|
//商品名称
|
|
name: '新疆特色辣子鸡排饭',
|
|
//商品描述-就是掌柜描述,
|
|
descripe: "口味可以自己选,有香辣、蒜香、葱香、孜然、老麻口味",
|
|
//主图
|
|
img: '/static/face/face_5.jpg',
|
|
//滚动图片
|
|
banner_img: ['/static/goods/4.jpg', '/static/goods/5.jpg', '/static/goods/6.jpg'],
|
|
//现价
|
|
price: "23",
|
|
//原价
|
|
oldprice: "44",
|
|
//月销售
|
|
monthly_sales: "566",
|
|
//商品标签
|
|
goods_tag: ['约800克', '香辣', '特色菜', '营养美食'],
|
|
//详情
|
|
detail: [{
|
|
tit: '掌柜描述',
|
|
txt: '口味可以自己选,有香辣、蒜香、葱香、孜然、老麻口味'
|
|
}, {
|
|
tit: '主料',
|
|
txt: '鸡胸排,大葱'
|
|
}, {
|
|
tit: '菜系',
|
|
txt: '新疆特色菜'
|
|
}, {
|
|
tit: '口味',
|
|
txt: '香辣'
|
|
}
|
|
//......更多
|
|
],
|
|
|
|
//图文
|
|
desc: "\n\t\t<div style=\"width:100%\">\n\t\t\t<img style=\"width:100%;display:block;\" src=\"/static/goods/5.jpg\" />\n\t\t\t<img style=\"width:100%;display:block;\" src=\"/static/goods/6.jpg\" />\n\t\t\t<img style=\"width:100%;display:block;\" src=\"/static/goods/7.jpg\" />\n\t\t\t<img style=\"width:100%;display:block;\" src=\"/static/goods/8.jpg\" />\n\t\t\t<img style=\"width:100%;display:block;\" src=\"/static/goods/9.jpg\" />\n\t\t</div>\n\t"
|
|
};
|
|
|
|
//商品评价
|
|
var goodsEva = {
|
|
//总评价数
|
|
sum: '386',
|
|
//好评
|
|
praise: '306',
|
|
//差评
|
|
bad_review: '80',
|
|
//评价标签
|
|
eva_tag: {
|
|
//有图
|
|
'exist_pic': '62',
|
|
//赞
|
|
'appreciate': '96',
|
|
//踩
|
|
'oppose': '16',
|
|
//其他标签
|
|
'other': ['92%人口味满意', '300人希望再次购买']
|
|
},
|
|
eva_list: [{
|
|
//用户名
|
|
name: '白色的太阳',
|
|
//头像
|
|
avatar: '/static/face/face_4.jpg',
|
|
//评论时间
|
|
time: '2020.03.12',
|
|
//点赞或踩商品,没有投票【0】、赞【1】、踩【2】
|
|
point: 1,
|
|
//评价内容
|
|
content: "味道好极了,家里人超爱吃,希望下次能多放点辣椒,我们家吃辣",
|
|
//上传的图片
|
|
pic: ['/static/goods/7.jpg', '/static/goods/8.jpg', '/static/goods/9.jpg']
|
|
}, {
|
|
//用户名
|
|
name: '匿名用户',
|
|
//头像
|
|
avatar: '/static/face/face_2.jpg',
|
|
//评论时间
|
|
time: '2020.03.16',
|
|
//点赞或踩商品,没有投票【0】、赞【1】、踩【2】
|
|
point: 2,
|
|
//评价内容
|
|
content: "",
|
|
//上传的图片
|
|
pic: []
|
|
}, {
|
|
//用户名
|
|
name: '匿名用户',
|
|
//头像
|
|
avatar: '/static/face/face_3.jpg',
|
|
//评论时间
|
|
time: '2020.03.16',
|
|
//点赞或踩商品,没有投票【0】、赞【1】、踩【2】
|
|
point: 0,
|
|
//评价内容
|
|
content: "一般般",
|
|
//上传的图片
|
|
pic: []
|
|
}]
|
|
};
|
|
var _default = {
|
|
storeData: storeData,
|
|
commentData: commentData,
|
|
goodsData: goodsData,
|
|
categoryData: categoryData,
|
|
goodsInfo: goodsInfo,
|
|
goodsEva: goodsEva
|
|
};
|
|
exports.default = _default;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 18:
|
|
/*!******************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/toConsumableArray.js ***!
|
|
\******************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var arrayWithoutHoles = __webpack_require__(/*! ./arrayWithoutHoles.js */ 19);
|
|
var iterableToArray = __webpack_require__(/*! ./iterableToArray.js */ 20);
|
|
var unsupportedIterableToArray = __webpack_require__(/*! ./unsupportedIterableToArray.js */ 8);
|
|
var nonIterableSpread = __webpack_require__(/*! ./nonIterableSpread.js */ 21);
|
|
function _toConsumableArray(arr) {
|
|
return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();
|
|
}
|
|
module.exports = _toConsumableArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 19:
|
|
/*!******************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js ***!
|
|
\******************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var arrayLikeToArray = __webpack_require__(/*! ./arrayLikeToArray.js */ 9);
|
|
function _arrayWithoutHoles(arr) {
|
|
if (Array.isArray(arr)) return arrayLikeToArray(arr);
|
|
}
|
|
module.exports = _arrayWithoutHoles, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 2:
|
|
/*!************************************************************!*\
|
|
!*** ./node_modules/@dcloudio/uni-mp-weixin/dist/index.js ***!
|
|
\************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(wx, global) {
|
|
|
|
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ 4);
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.createApp = createApp;
|
|
exports.createComponent = createComponent;
|
|
exports.createPage = createPage;
|
|
exports.createPlugin = createPlugin;
|
|
exports.createSubpackageApp = createSubpackageApp;
|
|
exports.default = void 0;
|
|
var _slicedToArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ 5));
|
|
var _defineProperty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/defineProperty */ 11));
|
|
var _construct2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/construct */ 15));
|
|
var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ 18));
|
|
var _typeof2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/typeof */ 13));
|
|
var _uniI18n = __webpack_require__(/*! @dcloudio/uni-i18n */ 22);
|
|
var _vue = _interopRequireDefault(__webpack_require__(/*! vue */ 25));
|
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
var realAtob;
|
|
var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
|
|
var b64re = /^(?:[A-Za-z\d+/]{4})*?(?:[A-Za-z\d+/]{2}(?:==)?|[A-Za-z\d+/]{3}=?)?$/;
|
|
if (typeof atob !== 'function') {
|
|
realAtob = function realAtob(str) {
|
|
str = String(str).replace(/[\t\n\f\r ]+/g, '');
|
|
if (!b64re.test(str)) {
|
|
throw new Error("Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.");
|
|
}
|
|
|
|
// Adding the padding if missing, for semplicity
|
|
str += '=='.slice(2 - (str.length & 3));
|
|
var bitmap;
|
|
var result = '';
|
|
var r1;
|
|
var r2;
|
|
var i = 0;
|
|
for (; i < str.length;) {
|
|
bitmap = b64.indexOf(str.charAt(i++)) << 18 | b64.indexOf(str.charAt(i++)) << 12 | (r1 = b64.indexOf(str.charAt(i++))) << 6 | (r2 = b64.indexOf(str.charAt(i++)));
|
|
result += r1 === 64 ? String.fromCharCode(bitmap >> 16 & 255) : r2 === 64 ? String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255) : String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255, bitmap & 255);
|
|
}
|
|
return result;
|
|
};
|
|
} else {
|
|
// 注意atob只能在全局对象上调用,例如:`const Base64 = {atob};Base64.atob('xxxx')`是错误的用法
|
|
realAtob = atob;
|
|
}
|
|
function b64DecodeUnicode(str) {
|
|
return decodeURIComponent(realAtob(str).split('').map(function (c) {
|
|
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
|
|
}).join(''));
|
|
}
|
|
function getCurrentUserInfo() {
|
|
var token = wx.getStorageSync('uni_id_token') || '';
|
|
var tokenArr = token.split('.');
|
|
if (!token || tokenArr.length !== 3) {
|
|
return {
|
|
uid: null,
|
|
role: [],
|
|
permission: [],
|
|
tokenExpired: 0
|
|
};
|
|
}
|
|
var userInfo;
|
|
try {
|
|
userInfo = JSON.parse(b64DecodeUnicode(tokenArr[1]));
|
|
} catch (error) {
|
|
throw new Error('获取当前用户信息出错,详细错误信息为:' + error.message);
|
|
}
|
|
userInfo.tokenExpired = userInfo.exp * 1000;
|
|
delete userInfo.exp;
|
|
delete userInfo.iat;
|
|
return userInfo;
|
|
}
|
|
function uniIdMixin(Vue) {
|
|
Vue.prototype.uniIDHasRole = function (roleId) {
|
|
var _getCurrentUserInfo = getCurrentUserInfo(),
|
|
role = _getCurrentUserInfo.role;
|
|
return role.indexOf(roleId) > -1;
|
|
};
|
|
Vue.prototype.uniIDHasPermission = function (permissionId) {
|
|
var _getCurrentUserInfo2 = getCurrentUserInfo(),
|
|
permission = _getCurrentUserInfo2.permission;
|
|
return this.uniIDHasRole('admin') || permission.indexOf(permissionId) > -1;
|
|
};
|
|
Vue.prototype.uniIDTokenValid = function () {
|
|
var _getCurrentUserInfo3 = getCurrentUserInfo(),
|
|
tokenExpired = _getCurrentUserInfo3.tokenExpired;
|
|
return tokenExpired > Date.now();
|
|
};
|
|
}
|
|
var _toString = Object.prototype.toString;
|
|
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
function isFn(fn) {
|
|
return typeof fn === 'function';
|
|
}
|
|
function isStr(str) {
|
|
return typeof str === 'string';
|
|
}
|
|
function isObject(obj) {
|
|
return obj !== null && (0, _typeof2.default)(obj) === 'object';
|
|
}
|
|
function isPlainObject(obj) {
|
|
return _toString.call(obj) === '[object Object]';
|
|
}
|
|
function hasOwn(obj, key) {
|
|
return hasOwnProperty.call(obj, key);
|
|
}
|
|
function noop() {}
|
|
|
|
/**
|
|
* Create a cached version of a pure function.
|
|
*/
|
|
function cached(fn) {
|
|
var cache = Object.create(null);
|
|
return function cachedFn(str) {
|
|
var hit = cache[str];
|
|
return hit || (cache[str] = fn(str));
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Camelize a hyphen-delimited string.
|
|
*/
|
|
var camelizeRE = /-(\w)/g;
|
|
var camelize = cached(function (str) {
|
|
return str.replace(camelizeRE, function (_, c) {
|
|
return c ? c.toUpperCase() : '';
|
|
});
|
|
});
|
|
function sortObject(obj) {
|
|
var sortObj = {};
|
|
if (isPlainObject(obj)) {
|
|
Object.keys(obj).sort().forEach(function (key) {
|
|
sortObj[key] = obj[key];
|
|
});
|
|
}
|
|
return !Object.keys(sortObj) ? obj : sortObj;
|
|
}
|
|
var HOOKS = ['invoke', 'success', 'fail', 'complete', 'returnValue'];
|
|
var globalInterceptors = {};
|
|
var scopedInterceptors = {};
|
|
function mergeHook(parentVal, childVal) {
|
|
var res = childVal ? parentVal ? parentVal.concat(childVal) : Array.isArray(childVal) ? childVal : [childVal] : parentVal;
|
|
return res ? dedupeHooks(res) : res;
|
|
}
|
|
function dedupeHooks(hooks) {
|
|
var res = [];
|
|
for (var i = 0; i < hooks.length; i++) {
|
|
if (res.indexOf(hooks[i]) === -1) {
|
|
res.push(hooks[i]);
|
|
}
|
|
}
|
|
return res;
|
|
}
|
|
function removeHook(hooks, hook) {
|
|
var index = hooks.indexOf(hook);
|
|
if (index !== -1) {
|
|
hooks.splice(index, 1);
|
|
}
|
|
}
|
|
function mergeInterceptorHook(interceptor, option) {
|
|
Object.keys(option).forEach(function (hook) {
|
|
if (HOOKS.indexOf(hook) !== -1 && isFn(option[hook])) {
|
|
interceptor[hook] = mergeHook(interceptor[hook], option[hook]);
|
|
}
|
|
});
|
|
}
|
|
function removeInterceptorHook(interceptor, option) {
|
|
if (!interceptor || !option) {
|
|
return;
|
|
}
|
|
Object.keys(option).forEach(function (hook) {
|
|
if (HOOKS.indexOf(hook) !== -1 && isFn(option[hook])) {
|
|
removeHook(interceptor[hook], option[hook]);
|
|
}
|
|
});
|
|
}
|
|
function addInterceptor(method, option) {
|
|
if (typeof method === 'string' && isPlainObject(option)) {
|
|
mergeInterceptorHook(scopedInterceptors[method] || (scopedInterceptors[method] = {}), option);
|
|
} else if (isPlainObject(method)) {
|
|
mergeInterceptorHook(globalInterceptors, method);
|
|
}
|
|
}
|
|
function removeInterceptor(method, option) {
|
|
if (typeof method === 'string') {
|
|
if (isPlainObject(option)) {
|
|
removeInterceptorHook(scopedInterceptors[method], option);
|
|
} else {
|
|
delete scopedInterceptors[method];
|
|
}
|
|
} else if (isPlainObject(method)) {
|
|
removeInterceptorHook(globalInterceptors, method);
|
|
}
|
|
}
|
|
function wrapperHook(hook, params) {
|
|
return function (data) {
|
|
return hook(data, params) || data;
|
|
};
|
|
}
|
|
function isPromise(obj) {
|
|
return !!obj && ((0, _typeof2.default)(obj) === 'object' || typeof obj === 'function') && typeof obj.then === 'function';
|
|
}
|
|
function queue(hooks, data, params) {
|
|
var promise = false;
|
|
for (var i = 0; i < hooks.length; i++) {
|
|
var hook = hooks[i];
|
|
if (promise) {
|
|
promise = Promise.resolve(wrapperHook(hook, params));
|
|
} else {
|
|
var res = hook(data, params);
|
|
if (isPromise(res)) {
|
|
promise = Promise.resolve(res);
|
|
}
|
|
if (res === false) {
|
|
return {
|
|
then: function then() {}
|
|
};
|
|
}
|
|
}
|
|
}
|
|
return promise || {
|
|
then: function then(callback) {
|
|
return callback(data);
|
|
}
|
|
};
|
|
}
|
|
function wrapperOptions(interceptor) {
|
|
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
['success', 'fail', 'complete'].forEach(function (name) {
|
|
if (Array.isArray(interceptor[name])) {
|
|
var oldCallback = options[name];
|
|
options[name] = function callbackInterceptor(res) {
|
|
queue(interceptor[name], res, options).then(function (res) {
|
|
/* eslint-disable no-mixed-operators */
|
|
return isFn(oldCallback) && oldCallback(res) || res;
|
|
});
|
|
};
|
|
}
|
|
});
|
|
return options;
|
|
}
|
|
function wrapperReturnValue(method, returnValue) {
|
|
var returnValueHooks = [];
|
|
if (Array.isArray(globalInterceptors.returnValue)) {
|
|
returnValueHooks.push.apply(returnValueHooks, (0, _toConsumableArray2.default)(globalInterceptors.returnValue));
|
|
}
|
|
var interceptor = scopedInterceptors[method];
|
|
if (interceptor && Array.isArray(interceptor.returnValue)) {
|
|
returnValueHooks.push.apply(returnValueHooks, (0, _toConsumableArray2.default)(interceptor.returnValue));
|
|
}
|
|
returnValueHooks.forEach(function (hook) {
|
|
returnValue = hook(returnValue) || returnValue;
|
|
});
|
|
return returnValue;
|
|
}
|
|
function getApiInterceptorHooks(method) {
|
|
var interceptor = Object.create(null);
|
|
Object.keys(globalInterceptors).forEach(function (hook) {
|
|
if (hook !== 'returnValue') {
|
|
interceptor[hook] = globalInterceptors[hook].slice();
|
|
}
|
|
});
|
|
var scopedInterceptor = scopedInterceptors[method];
|
|
if (scopedInterceptor) {
|
|
Object.keys(scopedInterceptor).forEach(function (hook) {
|
|
if (hook !== 'returnValue') {
|
|
interceptor[hook] = (interceptor[hook] || []).concat(scopedInterceptor[hook]);
|
|
}
|
|
});
|
|
}
|
|
return interceptor;
|
|
}
|
|
function invokeApi(method, api, options) {
|
|
for (var _len = arguments.length, params = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
|
|
params[_key - 3] = arguments[_key];
|
|
}
|
|
var interceptor = getApiInterceptorHooks(method);
|
|
if (interceptor && Object.keys(interceptor).length) {
|
|
if (Array.isArray(interceptor.invoke)) {
|
|
var res = queue(interceptor.invoke, options);
|
|
return res.then(function (options) {
|
|
// 重新访问 getApiInterceptorHooks, 允许 invoke 中再次调用 addInterceptor,removeInterceptor
|
|
return api.apply(void 0, [wrapperOptions(getApiInterceptorHooks(method), options)].concat(params));
|
|
});
|
|
} else {
|
|
return api.apply(void 0, [wrapperOptions(interceptor, options)].concat(params));
|
|
}
|
|
}
|
|
return api.apply(void 0, [options].concat(params));
|
|
}
|
|
var promiseInterceptor = {
|
|
returnValue: function returnValue(res) {
|
|
if (!isPromise(res)) {
|
|
return res;
|
|
}
|
|
return new Promise(function (resolve, reject) {
|
|
res.then(function (res) {
|
|
if (res[0]) {
|
|
reject(res[0]);
|
|
} else {
|
|
resolve(res[1]);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
};
|
|
var SYNC_API_RE = /^\$|Window$|WindowStyle$|sendHostEvent|sendNativeEvent|restoreGlobal|requireGlobal|getCurrentSubNVue|getMenuButtonBoundingClientRect|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64|getLocale|setLocale|invokePushCallback|getWindowInfo|getDeviceInfo|getAppBaseInfo|getSystemSetting|getAppAuthorizeSetting|initUTS|requireUTS|registerUTS/;
|
|
var CONTEXT_API_RE = /^create|Manager$/;
|
|
|
|
// Context例外情况
|
|
var CONTEXT_API_RE_EXC = ['createBLEConnection'];
|
|
|
|
// 同步例外情况
|
|
var ASYNC_API = ['createBLEConnection', 'createPushMessage'];
|
|
var CALLBACK_API_RE = /^on|^off/;
|
|
function isContextApi(name) {
|
|
return CONTEXT_API_RE.test(name) && CONTEXT_API_RE_EXC.indexOf(name) === -1;
|
|
}
|
|
function isSyncApi(name) {
|
|
return SYNC_API_RE.test(name) && ASYNC_API.indexOf(name) === -1;
|
|
}
|
|
function isCallbackApi(name) {
|
|
return CALLBACK_API_RE.test(name) && name !== 'onPush';
|
|
}
|
|
function handlePromise(promise) {
|
|
return promise.then(function (data) {
|
|
return [null, data];
|
|
}).catch(function (err) {
|
|
return [err];
|
|
});
|
|
}
|
|
function shouldPromise(name) {
|
|
if (isContextApi(name) || isSyncApi(name) || isCallbackApi(name)) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/* eslint-disable no-extend-native */
|
|
if (!Promise.prototype.finally) {
|
|
Promise.prototype.finally = function (callback) {
|
|
var promise = this.constructor;
|
|
return this.then(function (value) {
|
|
return promise.resolve(callback()).then(function () {
|
|
return value;
|
|
});
|
|
}, function (reason) {
|
|
return promise.resolve(callback()).then(function () {
|
|
throw reason;
|
|
});
|
|
});
|
|
};
|
|
}
|
|
function promisify(name, api) {
|
|
if (!shouldPromise(name) || !isFn(api)) {
|
|
return api;
|
|
}
|
|
return function promiseApi() {
|
|
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
for (var _len2 = arguments.length, params = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
|
|
params[_key2 - 1] = arguments[_key2];
|
|
}
|
|
if (isFn(options.success) || isFn(options.fail) || isFn(options.complete)) {
|
|
return wrapperReturnValue(name, invokeApi.apply(void 0, [name, api, options].concat(params)));
|
|
}
|
|
return wrapperReturnValue(name, handlePromise(new Promise(function (resolve, reject) {
|
|
invokeApi.apply(void 0, [name, api, Object.assign({}, options, {
|
|
success: resolve,
|
|
fail: reject
|
|
})].concat(params));
|
|
})));
|
|
};
|
|
}
|
|
var EPS = 1e-4;
|
|
var BASE_DEVICE_WIDTH = 750;
|
|
var isIOS = false;
|
|
var deviceWidth = 0;
|
|
var deviceDPR = 0;
|
|
function checkDeviceWidth() {
|
|
var _wx$getSystemInfoSync = wx.getSystemInfoSync(),
|
|
platform = _wx$getSystemInfoSync.platform,
|
|
pixelRatio = _wx$getSystemInfoSync.pixelRatio,
|
|
windowWidth = _wx$getSystemInfoSync.windowWidth; // uni=>wx runtime 编译目标是 uni 对象,内部不允许直接使用 uni
|
|
|
|
deviceWidth = windowWidth;
|
|
deviceDPR = pixelRatio;
|
|
isIOS = platform === 'ios';
|
|
}
|
|
function upx2px(number, newDeviceWidth) {
|
|
if (deviceWidth === 0) {
|
|
checkDeviceWidth();
|
|
}
|
|
number = Number(number);
|
|
if (number === 0) {
|
|
return 0;
|
|
}
|
|
var result = number / BASE_DEVICE_WIDTH * (newDeviceWidth || deviceWidth);
|
|
if (result < 0) {
|
|
result = -result;
|
|
}
|
|
result = Math.floor(result + EPS);
|
|
if (result === 0) {
|
|
if (deviceDPR === 1 || !isIOS) {
|
|
result = 1;
|
|
} else {
|
|
result = 0.5;
|
|
}
|
|
}
|
|
return number < 0 ? -result : result;
|
|
}
|
|
var LOCALE_ZH_HANS = 'zh-Hans';
|
|
var LOCALE_ZH_HANT = 'zh-Hant';
|
|
var LOCALE_EN = 'en';
|
|
var LOCALE_FR = 'fr';
|
|
var LOCALE_ES = 'es';
|
|
var messages = {};
|
|
var locale;
|
|
{
|
|
locale = normalizeLocale(wx.getSystemInfoSync().language) || LOCALE_EN;
|
|
}
|
|
function initI18nMessages() {
|
|
if (!isEnableLocale()) {
|
|
return;
|
|
}
|
|
var localeKeys = Object.keys(__uniConfig.locales);
|
|
if (localeKeys.length) {
|
|
localeKeys.forEach(function (locale) {
|
|
var curMessages = messages[locale];
|
|
var userMessages = __uniConfig.locales[locale];
|
|
if (curMessages) {
|
|
Object.assign(curMessages, userMessages);
|
|
} else {
|
|
messages[locale] = userMessages;
|
|
}
|
|
});
|
|
}
|
|
}
|
|
initI18nMessages();
|
|
var i18n = (0, _uniI18n.initVueI18n)(locale, {});
|
|
var t = i18n.t;
|
|
var i18nMixin = i18n.mixin = {
|
|
beforeCreate: function beforeCreate() {
|
|
var _this = this;
|
|
var unwatch = i18n.i18n.watchLocale(function () {
|
|
_this.$forceUpdate();
|
|
});
|
|
this.$once('hook:beforeDestroy', function () {
|
|
unwatch();
|
|
});
|
|
},
|
|
methods: {
|
|
$$t: function $$t(key, values) {
|
|
return t(key, values);
|
|
}
|
|
}
|
|
};
|
|
var setLocale = i18n.setLocale;
|
|
var getLocale = i18n.getLocale;
|
|
function initAppLocale(Vue, appVm, locale) {
|
|
var state = Vue.observable({
|
|
locale: locale || i18n.getLocale()
|
|
});
|
|
var localeWatchers = [];
|
|
appVm.$watchLocale = function (fn) {
|
|
localeWatchers.push(fn);
|
|
};
|
|
Object.defineProperty(appVm, '$locale', {
|
|
get: function get() {
|
|
return state.locale;
|
|
},
|
|
set: function set(v) {
|
|
state.locale = v;
|
|
localeWatchers.forEach(function (watch) {
|
|
return watch(v);
|
|
});
|
|
}
|
|
});
|
|
}
|
|
function isEnableLocale() {
|
|
return typeof __uniConfig !== 'undefined' && __uniConfig.locales && !!Object.keys(__uniConfig.locales).length;
|
|
}
|
|
function include(str, parts) {
|
|
return !!parts.find(function (part) {
|
|
return str.indexOf(part) !== -1;
|
|
});
|
|
}
|
|
function startsWith(str, parts) {
|
|
return parts.find(function (part) {
|
|
return str.indexOf(part) === 0;
|
|
});
|
|
}
|
|
function normalizeLocale(locale, messages) {
|
|
if (!locale) {
|
|
return;
|
|
}
|
|
locale = locale.trim().replace(/_/g, '-');
|
|
if (messages && messages[locale]) {
|
|
return locale;
|
|
}
|
|
locale = locale.toLowerCase();
|
|
if (locale === 'chinese') {
|
|
// 支付宝
|
|
return LOCALE_ZH_HANS;
|
|
}
|
|
if (locale.indexOf('zh') === 0) {
|
|
if (locale.indexOf('-hans') > -1) {
|
|
return LOCALE_ZH_HANS;
|
|
}
|
|
if (locale.indexOf('-hant') > -1) {
|
|
return LOCALE_ZH_HANT;
|
|
}
|
|
if (include(locale, ['-tw', '-hk', '-mo', '-cht'])) {
|
|
return LOCALE_ZH_HANT;
|
|
}
|
|
return LOCALE_ZH_HANS;
|
|
}
|
|
var lang = startsWith(locale, [LOCALE_EN, LOCALE_FR, LOCALE_ES]);
|
|
if (lang) {
|
|
return lang;
|
|
}
|
|
}
|
|
// export function initI18n() {
|
|
// const localeKeys = Object.keys(__uniConfig.locales || {})
|
|
// if (localeKeys.length) {
|
|
// localeKeys.forEach((locale) =>
|
|
// i18n.add(locale, __uniConfig.locales[locale])
|
|
// )
|
|
// }
|
|
// }
|
|
|
|
function getLocale$1() {
|
|
// 优先使用 $locale
|
|
if (isFn(getApp)) {
|
|
var app = getApp({
|
|
allowDefault: true
|
|
});
|
|
if (app && app.$vm) {
|
|
return app.$vm.$locale;
|
|
}
|
|
}
|
|
return normalizeLocale(wx.getSystemInfoSync().language) || LOCALE_EN;
|
|
}
|
|
function setLocale$1(locale) {
|
|
var app = isFn(getApp) ? getApp() : false;
|
|
if (!app) {
|
|
return false;
|
|
}
|
|
var oldLocale = app.$vm.$locale;
|
|
if (oldLocale !== locale) {
|
|
app.$vm.$locale = locale;
|
|
onLocaleChangeCallbacks.forEach(function (fn) {
|
|
return fn({
|
|
locale: locale
|
|
});
|
|
});
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
var onLocaleChangeCallbacks = [];
|
|
function onLocaleChange(fn) {
|
|
if (onLocaleChangeCallbacks.indexOf(fn) === -1) {
|
|
onLocaleChangeCallbacks.push(fn);
|
|
}
|
|
}
|
|
if (typeof global !== 'undefined') {
|
|
global.getLocale = getLocale$1;
|
|
}
|
|
var interceptors = {
|
|
promiseInterceptor: promiseInterceptor
|
|
};
|
|
var baseApi = /*#__PURE__*/Object.freeze({
|
|
__proto__: null,
|
|
upx2px: upx2px,
|
|
getLocale: getLocale$1,
|
|
setLocale: setLocale$1,
|
|
onLocaleChange: onLocaleChange,
|
|
addInterceptor: addInterceptor,
|
|
removeInterceptor: removeInterceptor,
|
|
interceptors: interceptors
|
|
});
|
|
function findExistsPageIndex(url) {
|
|
var pages = getCurrentPages();
|
|
var len = pages.length;
|
|
while (len--) {
|
|
var page = pages[len];
|
|
if (page.$page && page.$page.fullPath === url) {
|
|
return len;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
var redirectTo = {
|
|
name: function name(fromArgs) {
|
|
if (fromArgs.exists === 'back' && fromArgs.delta) {
|
|
return 'navigateBack';
|
|
}
|
|
return 'redirectTo';
|
|
},
|
|
args: function args(fromArgs) {
|
|
if (fromArgs.exists === 'back' && fromArgs.url) {
|
|
var existsPageIndex = findExistsPageIndex(fromArgs.url);
|
|
if (existsPageIndex !== -1) {
|
|
var delta = getCurrentPages().length - 1 - existsPageIndex;
|
|
if (delta > 0) {
|
|
fromArgs.delta = delta;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
var previewImage = {
|
|
args: function args(fromArgs) {
|
|
var currentIndex = parseInt(fromArgs.current);
|
|
if (isNaN(currentIndex)) {
|
|
return;
|
|
}
|
|
var urls = fromArgs.urls;
|
|
if (!Array.isArray(urls)) {
|
|
return;
|
|
}
|
|
var len = urls.length;
|
|
if (!len) {
|
|
return;
|
|
}
|
|
if (currentIndex < 0) {
|
|
currentIndex = 0;
|
|
} else if (currentIndex >= len) {
|
|
currentIndex = len - 1;
|
|
}
|
|
if (currentIndex > 0) {
|
|
fromArgs.current = urls[currentIndex];
|
|
fromArgs.urls = urls.filter(function (item, index) {
|
|
return index < currentIndex ? item !== urls[currentIndex] : true;
|
|
});
|
|
} else {
|
|
fromArgs.current = urls[0];
|
|
}
|
|
return {
|
|
indicator: false,
|
|
loop: false
|
|
};
|
|
}
|
|
};
|
|
var UUID_KEY = '__DC_STAT_UUID';
|
|
var deviceId;
|
|
function useDeviceId(result) {
|
|
deviceId = deviceId || wx.getStorageSync(UUID_KEY);
|
|
if (!deviceId) {
|
|
deviceId = Date.now() + '' + Math.floor(Math.random() * 1e7);
|
|
wx.setStorage({
|
|
key: UUID_KEY,
|
|
data: deviceId
|
|
});
|
|
}
|
|
result.deviceId = deviceId;
|
|
}
|
|
function addSafeAreaInsets(result) {
|
|
if (result.safeArea) {
|
|
var safeArea = result.safeArea;
|
|
result.safeAreaInsets = {
|
|
top: safeArea.top,
|
|
left: safeArea.left,
|
|
right: result.windowWidth - safeArea.right,
|
|
bottom: result.screenHeight - safeArea.bottom
|
|
};
|
|
}
|
|
}
|
|
function populateParameters(result) {
|
|
var _result$brand = result.brand,
|
|
brand = _result$brand === void 0 ? '' : _result$brand,
|
|
_result$model = result.model,
|
|
model = _result$model === void 0 ? '' : _result$model,
|
|
_result$system = result.system,
|
|
system = _result$system === void 0 ? '' : _result$system,
|
|
_result$language = result.language,
|
|
language = _result$language === void 0 ? '' : _result$language,
|
|
theme = result.theme,
|
|
version = result.version,
|
|
platform = result.platform,
|
|
fontSizeSetting = result.fontSizeSetting,
|
|
SDKVersion = result.SDKVersion,
|
|
pixelRatio = result.pixelRatio,
|
|
deviceOrientation = result.deviceOrientation;
|
|
// const isQuickApp = "mp-weixin".indexOf('quickapp-webview') !== -1
|
|
|
|
var extraParam = {};
|
|
|
|
// osName osVersion
|
|
var osName = '';
|
|
var osVersion = '';
|
|
{
|
|
osName = system.split(' ')[0] || '';
|
|
osVersion = system.split(' ')[1] || '';
|
|
}
|
|
var hostVersion = version;
|
|
|
|
// deviceType
|
|
var deviceType = getGetDeviceType(result, model);
|
|
|
|
// deviceModel
|
|
var deviceBrand = getDeviceBrand(brand);
|
|
|
|
// hostName
|
|
var _hostName = getHostName(result);
|
|
|
|
// deviceOrientation
|
|
var _deviceOrientation = deviceOrientation; // 仅 微信 百度 支持
|
|
|
|
// devicePixelRatio
|
|
var _devicePixelRatio = pixelRatio;
|
|
|
|
// SDKVersion
|
|
var _SDKVersion = SDKVersion;
|
|
|
|
// hostLanguage
|
|
var hostLanguage = language.replace(/_/g, '-');
|
|
|
|
// wx.getAccountInfoSync
|
|
|
|
var parameters = {
|
|
appId: "__UNI__9D89562",
|
|
appName: "中龙",
|
|
appVersion: "1.0.0",
|
|
appVersionCode: "100",
|
|
appLanguage: getAppLanguage(hostLanguage),
|
|
uniCompileVersion: "4.15",
|
|
uniRuntimeVersion: "4.15",
|
|
uniPlatform: undefined || "mp-weixin",
|
|
deviceBrand: deviceBrand,
|
|
deviceModel: model,
|
|
deviceType: deviceType,
|
|
devicePixelRatio: _devicePixelRatio,
|
|
deviceOrientation: _deviceOrientation,
|
|
osName: osName.toLocaleLowerCase(),
|
|
osVersion: osVersion,
|
|
hostTheme: theme,
|
|
hostVersion: hostVersion,
|
|
hostLanguage: hostLanguage,
|
|
hostName: _hostName,
|
|
hostSDKVersion: _SDKVersion,
|
|
hostFontSizeSetting: fontSizeSetting,
|
|
windowTop: 0,
|
|
windowBottom: 0,
|
|
// TODO
|
|
osLanguage: undefined,
|
|
osTheme: undefined,
|
|
ua: undefined,
|
|
hostPackageName: undefined,
|
|
browserName: undefined,
|
|
browserVersion: undefined
|
|
};
|
|
Object.assign(result, parameters, extraParam);
|
|
}
|
|
function getGetDeviceType(result, model) {
|
|
var deviceType = result.deviceType || 'phone';
|
|
{
|
|
var deviceTypeMaps = {
|
|
ipad: 'pad',
|
|
windows: 'pc',
|
|
mac: 'pc'
|
|
};
|
|
var deviceTypeMapsKeys = Object.keys(deviceTypeMaps);
|
|
var _model = model.toLocaleLowerCase();
|
|
for (var index = 0; index < deviceTypeMapsKeys.length; index++) {
|
|
var _m = deviceTypeMapsKeys[index];
|
|
if (_model.indexOf(_m) !== -1) {
|
|
deviceType = deviceTypeMaps[_m];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return deviceType;
|
|
}
|
|
function getDeviceBrand(brand) {
|
|
var deviceBrand = brand;
|
|
if (deviceBrand) {
|
|
deviceBrand = brand.toLocaleLowerCase();
|
|
}
|
|
return deviceBrand;
|
|
}
|
|
function getAppLanguage(defaultLanguage) {
|
|
return getLocale$1 ? getLocale$1() : defaultLanguage;
|
|
}
|
|
function getHostName(result) {
|
|
var _platform = 'WeChat';
|
|
var _hostName = result.hostName || _platform; // mp-jd
|
|
{
|
|
if (result.environment) {
|
|
_hostName = result.environment;
|
|
} else if (result.host && result.host.env) {
|
|
_hostName = result.host.env;
|
|
}
|
|
}
|
|
return _hostName;
|
|
}
|
|
var getSystemInfo = {
|
|
returnValue: function returnValue(result) {
|
|
useDeviceId(result);
|
|
addSafeAreaInsets(result);
|
|
populateParameters(result);
|
|
}
|
|
};
|
|
var showActionSheet = {
|
|
args: function args(fromArgs) {
|
|
if ((0, _typeof2.default)(fromArgs) === 'object') {
|
|
fromArgs.alertText = fromArgs.title;
|
|
}
|
|
}
|
|
};
|
|
var getAppBaseInfo = {
|
|
returnValue: function returnValue(result) {
|
|
var _result = result,
|
|
version = _result.version,
|
|
language = _result.language,
|
|
SDKVersion = _result.SDKVersion,
|
|
theme = _result.theme;
|
|
var _hostName = getHostName(result);
|
|
var hostLanguage = language.replace('_', '-');
|
|
result = sortObject(Object.assign(result, {
|
|
appId: "__UNI__9D89562",
|
|
appName: "中龙",
|
|
appVersion: "1.0.0",
|
|
appVersionCode: "100",
|
|
appLanguage: getAppLanguage(hostLanguage),
|
|
hostVersion: version,
|
|
hostLanguage: hostLanguage,
|
|
hostName: _hostName,
|
|
hostSDKVersion: SDKVersion,
|
|
hostTheme: theme
|
|
}));
|
|
}
|
|
};
|
|
var getDeviceInfo = {
|
|
returnValue: function returnValue(result) {
|
|
var _result2 = result,
|
|
brand = _result2.brand,
|
|
model = _result2.model;
|
|
var deviceType = getGetDeviceType(result, model);
|
|
var deviceBrand = getDeviceBrand(brand);
|
|
useDeviceId(result);
|
|
result = sortObject(Object.assign(result, {
|
|
deviceType: deviceType,
|
|
deviceBrand: deviceBrand,
|
|
deviceModel: model
|
|
}));
|
|
}
|
|
};
|
|
var getWindowInfo = {
|
|
returnValue: function returnValue(result) {
|
|
addSafeAreaInsets(result);
|
|
result = sortObject(Object.assign(result, {
|
|
windowTop: 0,
|
|
windowBottom: 0
|
|
}));
|
|
}
|
|
};
|
|
var getAppAuthorizeSetting = {
|
|
returnValue: function returnValue(result) {
|
|
var locationReducedAccuracy = result.locationReducedAccuracy;
|
|
result.locationAccuracy = 'unsupported';
|
|
if (locationReducedAccuracy === true) {
|
|
result.locationAccuracy = 'reduced';
|
|
} else if (locationReducedAccuracy === false) {
|
|
result.locationAccuracy = 'full';
|
|
}
|
|
}
|
|
};
|
|
|
|
// import navigateTo from 'uni-helpers/navigate-to'
|
|
|
|
var compressImage = {
|
|
args: function args(fromArgs) {
|
|
// https://developers.weixin.qq.com/community/develop/doc/000c08940c865011298e0a43256800?highLine=compressHeight
|
|
if (fromArgs.compressedHeight && !fromArgs.compressHeight) {
|
|
fromArgs.compressHeight = fromArgs.compressedHeight;
|
|
}
|
|
if (fromArgs.compressedWidth && !fromArgs.compressWidth) {
|
|
fromArgs.compressWidth = fromArgs.compressedWidth;
|
|
}
|
|
}
|
|
};
|
|
var protocols = {
|
|
redirectTo: redirectTo,
|
|
// navigateTo, // 由于在微信开发者工具的页面参数,会显示__id__参数,因此暂时关闭mp-weixin对于navigateTo的AOP
|
|
previewImage: previewImage,
|
|
getSystemInfo: getSystemInfo,
|
|
getSystemInfoSync: getSystemInfo,
|
|
showActionSheet: showActionSheet,
|
|
getAppBaseInfo: getAppBaseInfo,
|
|
getDeviceInfo: getDeviceInfo,
|
|
getWindowInfo: getWindowInfo,
|
|
getAppAuthorizeSetting: getAppAuthorizeSetting,
|
|
compressImage: compressImage
|
|
};
|
|
var todos = ['vibrate', 'preloadPage', 'unPreloadPage', 'loadSubPackage'];
|
|
var canIUses = [];
|
|
var CALLBACKS = ['success', 'fail', 'cancel', 'complete'];
|
|
function processCallback(methodName, method, returnValue) {
|
|
return function (res) {
|
|
return method(processReturnValue(methodName, res, returnValue));
|
|
};
|
|
}
|
|
function processArgs(methodName, fromArgs) {
|
|
var argsOption = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
var returnValue = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
var keepFromArgs = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
|
|
if (isPlainObject(fromArgs)) {
|
|
// 一般 api 的参数解析
|
|
var toArgs = keepFromArgs === true ? fromArgs : {}; // returnValue 为 false 时,说明是格式化返回值,直接在返回值对象上修改赋值
|
|
if (isFn(argsOption)) {
|
|
argsOption = argsOption(fromArgs, toArgs) || {};
|
|
}
|
|
for (var key in fromArgs) {
|
|
if (hasOwn(argsOption, key)) {
|
|
var keyOption = argsOption[key];
|
|
if (isFn(keyOption)) {
|
|
keyOption = keyOption(fromArgs[key], fromArgs, toArgs);
|
|
}
|
|
if (!keyOption) {
|
|
// 不支持的参数
|
|
console.warn("The '".concat(methodName, "' method of platform '\u5FAE\u4FE1\u5C0F\u7A0B\u5E8F' does not support option '").concat(key, "'"));
|
|
} else if (isStr(keyOption)) {
|
|
// 重写参数 key
|
|
toArgs[keyOption] = fromArgs[key];
|
|
} else if (isPlainObject(keyOption)) {
|
|
// {name:newName,value:value}可重新指定参数 key:value
|
|
toArgs[keyOption.name ? keyOption.name : key] = keyOption.value;
|
|
}
|
|
} else if (CALLBACKS.indexOf(key) !== -1) {
|
|
if (isFn(fromArgs[key])) {
|
|
toArgs[key] = processCallback(methodName, fromArgs[key], returnValue);
|
|
}
|
|
} else {
|
|
if (!keepFromArgs) {
|
|
toArgs[key] = fromArgs[key];
|
|
}
|
|
}
|
|
}
|
|
return toArgs;
|
|
} else if (isFn(fromArgs)) {
|
|
fromArgs = processCallback(methodName, fromArgs, returnValue);
|
|
}
|
|
return fromArgs;
|
|
}
|
|
function processReturnValue(methodName, res, returnValue) {
|
|
var keepReturnValue = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
if (isFn(protocols.returnValue)) {
|
|
// 处理通用 returnValue
|
|
res = protocols.returnValue(methodName, res);
|
|
}
|
|
return processArgs(methodName, res, returnValue, {}, keepReturnValue);
|
|
}
|
|
function wrapper(methodName, method) {
|
|
if (hasOwn(protocols, methodName)) {
|
|
var protocol = protocols[methodName];
|
|
if (!protocol) {
|
|
// 暂不支持的 api
|
|
return function () {
|
|
console.error("Platform '\u5FAE\u4FE1\u5C0F\u7A0B\u5E8F' does not support '".concat(methodName, "'."));
|
|
};
|
|
}
|
|
return function (arg1, arg2) {
|
|
// 目前 api 最多两个参数
|
|
var options = protocol;
|
|
if (isFn(protocol)) {
|
|
options = protocol(arg1);
|
|
}
|
|
arg1 = processArgs(methodName, arg1, options.args, options.returnValue);
|
|
var args = [arg1];
|
|
if (typeof arg2 !== 'undefined') {
|
|
args.push(arg2);
|
|
}
|
|
if (isFn(options.name)) {
|
|
methodName = options.name(arg1);
|
|
} else if (isStr(options.name)) {
|
|
methodName = options.name;
|
|
}
|
|
var returnValue = wx[methodName].apply(wx, args);
|
|
if (isSyncApi(methodName)) {
|
|
// 同步 api
|
|
return processReturnValue(methodName, returnValue, options.returnValue, isContextApi(methodName));
|
|
}
|
|
return returnValue;
|
|
};
|
|
}
|
|
return method;
|
|
}
|
|
var todoApis = Object.create(null);
|
|
var TODOS = ['onTabBarMidButtonTap', 'subscribePush', 'unsubscribePush', 'onPush', 'offPush', 'share'];
|
|
function createTodoApi(name) {
|
|
return function todoApi(_ref) {
|
|
var fail = _ref.fail,
|
|
complete = _ref.complete;
|
|
var res = {
|
|
errMsg: "".concat(name, ":fail method '").concat(name, "' not supported")
|
|
};
|
|
isFn(fail) && fail(res);
|
|
isFn(complete) && complete(res);
|
|
};
|
|
}
|
|
TODOS.forEach(function (name) {
|
|
todoApis[name] = createTodoApi(name);
|
|
});
|
|
var providers = {
|
|
oauth: ['weixin'],
|
|
share: ['weixin'],
|
|
payment: ['wxpay'],
|
|
push: ['weixin']
|
|
};
|
|
function getProvider(_ref2) {
|
|
var service = _ref2.service,
|
|
success = _ref2.success,
|
|
fail = _ref2.fail,
|
|
complete = _ref2.complete;
|
|
var res = false;
|
|
if (providers[service]) {
|
|
res = {
|
|
errMsg: 'getProvider:ok',
|
|
service: service,
|
|
provider: providers[service]
|
|
};
|
|
isFn(success) && success(res);
|
|
} else {
|
|
res = {
|
|
errMsg: 'getProvider:fail service not found'
|
|
};
|
|
isFn(fail) && fail(res);
|
|
}
|
|
isFn(complete) && complete(res);
|
|
}
|
|
var extraApi = /*#__PURE__*/Object.freeze({
|
|
__proto__: null,
|
|
getProvider: getProvider
|
|
});
|
|
var getEmitter = function () {
|
|
var Emitter;
|
|
return function getUniEmitter() {
|
|
if (!Emitter) {
|
|
Emitter = new _vue.default();
|
|
}
|
|
return Emitter;
|
|
};
|
|
}();
|
|
function apply(ctx, method, args) {
|
|
return ctx[method].apply(ctx, args);
|
|
}
|
|
function $on() {
|
|
return apply(getEmitter(), '$on', Array.prototype.slice.call(arguments));
|
|
}
|
|
function $off() {
|
|
return apply(getEmitter(), '$off', Array.prototype.slice.call(arguments));
|
|
}
|
|
function $once() {
|
|
return apply(getEmitter(), '$once', Array.prototype.slice.call(arguments));
|
|
}
|
|
function $emit() {
|
|
return apply(getEmitter(), '$emit', Array.prototype.slice.call(arguments));
|
|
}
|
|
var eventApi = /*#__PURE__*/Object.freeze({
|
|
__proto__: null,
|
|
$on: $on,
|
|
$off: $off,
|
|
$once: $once,
|
|
$emit: $emit
|
|
});
|
|
|
|
/**
|
|
* 框架内 try-catch
|
|
*/
|
|
/**
|
|
* 开发者 try-catch
|
|
*/
|
|
function tryCatch(fn) {
|
|
return function () {
|
|
try {
|
|
return fn.apply(fn, arguments);
|
|
} catch (e) {
|
|
// TODO
|
|
console.error(e);
|
|
}
|
|
};
|
|
}
|
|
function getApiCallbacks(params) {
|
|
var apiCallbacks = {};
|
|
for (var name in params) {
|
|
var param = params[name];
|
|
if (isFn(param)) {
|
|
apiCallbacks[name] = tryCatch(param);
|
|
delete params[name];
|
|
}
|
|
}
|
|
return apiCallbacks;
|
|
}
|
|
var cid;
|
|
var cidErrMsg;
|
|
var enabled;
|
|
function normalizePushMessage(message) {
|
|
try {
|
|
return JSON.parse(message);
|
|
} catch (e) {}
|
|
return message;
|
|
}
|
|
function invokePushCallback(args) {
|
|
if (args.type === 'enabled') {
|
|
enabled = true;
|
|
} else if (args.type === 'clientId') {
|
|
cid = args.cid;
|
|
cidErrMsg = args.errMsg;
|
|
invokeGetPushCidCallbacks(cid, args.errMsg);
|
|
} else if (args.type === 'pushMsg') {
|
|
var message = {
|
|
type: 'receive',
|
|
data: normalizePushMessage(args.message)
|
|
};
|
|
for (var i = 0; i < onPushMessageCallbacks.length; i++) {
|
|
var callback = onPushMessageCallbacks[i];
|
|
callback(message);
|
|
// 该消息已被阻止
|
|
if (message.stopped) {
|
|
break;
|
|
}
|
|
}
|
|
} else if (args.type === 'click') {
|
|
onPushMessageCallbacks.forEach(function (callback) {
|
|
callback({
|
|
type: 'click',
|
|
data: normalizePushMessage(args.message)
|
|
});
|
|
});
|
|
}
|
|
}
|
|
var getPushCidCallbacks = [];
|
|
function invokeGetPushCidCallbacks(cid, errMsg) {
|
|
getPushCidCallbacks.forEach(function (callback) {
|
|
callback(cid, errMsg);
|
|
});
|
|
getPushCidCallbacks.length = 0;
|
|
}
|
|
function getPushClientId(args) {
|
|
if (!isPlainObject(args)) {
|
|
args = {};
|
|
}
|
|
var _getApiCallbacks = getApiCallbacks(args),
|
|
success = _getApiCallbacks.success,
|
|
fail = _getApiCallbacks.fail,
|
|
complete = _getApiCallbacks.complete;
|
|
var hasSuccess = isFn(success);
|
|
var hasFail = isFn(fail);
|
|
var hasComplete = isFn(complete);
|
|
Promise.resolve().then(function () {
|
|
if (typeof enabled === 'undefined') {
|
|
enabled = false;
|
|
cid = '';
|
|
cidErrMsg = 'uniPush is not enabled';
|
|
}
|
|
getPushCidCallbacks.push(function (cid, errMsg) {
|
|
var res;
|
|
if (cid) {
|
|
res = {
|
|
errMsg: 'getPushClientId:ok',
|
|
cid: cid
|
|
};
|
|
hasSuccess && success(res);
|
|
} else {
|
|
res = {
|
|
errMsg: 'getPushClientId:fail' + (errMsg ? ' ' + errMsg : '')
|
|
};
|
|
hasFail && fail(res);
|
|
}
|
|
hasComplete && complete(res);
|
|
});
|
|
if (typeof cid !== 'undefined') {
|
|
invokeGetPushCidCallbacks(cid, cidErrMsg);
|
|
}
|
|
});
|
|
}
|
|
var onPushMessageCallbacks = [];
|
|
// 不使用 defineOnApi 实现,是因为 defineOnApi 依赖 UniServiceJSBridge ,该对象目前在小程序上未提供,故简单实现
|
|
var onPushMessage = function onPushMessage(fn) {
|
|
if (onPushMessageCallbacks.indexOf(fn) === -1) {
|
|
onPushMessageCallbacks.push(fn);
|
|
}
|
|
};
|
|
var offPushMessage = function offPushMessage(fn) {
|
|
if (!fn) {
|
|
onPushMessageCallbacks.length = 0;
|
|
} else {
|
|
var index = onPushMessageCallbacks.indexOf(fn);
|
|
if (index > -1) {
|
|
onPushMessageCallbacks.splice(index, 1);
|
|
}
|
|
}
|
|
};
|
|
var baseInfo = wx.getAppBaseInfo && wx.getAppBaseInfo();
|
|
if (!baseInfo) {
|
|
baseInfo = wx.getSystemInfoSync();
|
|
}
|
|
var host = baseInfo ? baseInfo.host : null;
|
|
var shareVideoMessage = host && host.env === 'SAAASDK' ? wx.miniapp.shareVideoMessage : wx.shareVideoMessage;
|
|
var api = /*#__PURE__*/Object.freeze({
|
|
__proto__: null,
|
|
shareVideoMessage: shareVideoMessage,
|
|
getPushClientId: getPushClientId,
|
|
onPushMessage: onPushMessage,
|
|
offPushMessage: offPushMessage,
|
|
invokePushCallback: invokePushCallback
|
|
});
|
|
var mocks = ['__route__', '__wxExparserNodeId__', '__wxWebviewId__'];
|
|
function findVmByVueId(vm, vuePid) {
|
|
var $children = vm.$children;
|
|
// 优先查找直属(反向查找:https://github.com/dcloudio/uni-app/issues/1200)
|
|
for (var i = $children.length - 1; i >= 0; i--) {
|
|
var childVm = $children[i];
|
|
if (childVm.$scope._$vueId === vuePid) {
|
|
return childVm;
|
|
}
|
|
}
|
|
// 反向递归查找
|
|
var parentVm;
|
|
for (var _i = $children.length - 1; _i >= 0; _i--) {
|
|
parentVm = findVmByVueId($children[_i], vuePid);
|
|
if (parentVm) {
|
|
return parentVm;
|
|
}
|
|
}
|
|
}
|
|
function initBehavior(options) {
|
|
return Behavior(options);
|
|
}
|
|
function isPage() {
|
|
return !!this.route;
|
|
}
|
|
function initRelation(detail) {
|
|
this.triggerEvent('__l', detail);
|
|
}
|
|
function selectAllComponents(mpInstance, selector, $refs) {
|
|
var components = mpInstance.selectAllComponents(selector) || [];
|
|
components.forEach(function (component) {
|
|
var ref = component.dataset.ref;
|
|
$refs[ref] = component.$vm || toSkip(component);
|
|
{
|
|
if (component.dataset.vueGeneric === 'scoped') {
|
|
component.selectAllComponents('.scoped-ref').forEach(function (scopedComponent) {
|
|
selectAllComponents(scopedComponent, selector, $refs);
|
|
});
|
|
}
|
|
}
|
|
});
|
|
}
|
|
function syncRefs(refs, newRefs) {
|
|
var oldKeys = (0, _construct2.default)(Set, (0, _toConsumableArray2.default)(Object.keys(refs)));
|
|
var newKeys = Object.keys(newRefs);
|
|
newKeys.forEach(function (key) {
|
|
var oldValue = refs[key];
|
|
var newValue = newRefs[key];
|
|
if (Array.isArray(oldValue) && Array.isArray(newValue) && oldValue.length === newValue.length && newValue.every(function (value) {
|
|
return oldValue.includes(value);
|
|
})) {
|
|
return;
|
|
}
|
|
refs[key] = newValue;
|
|
oldKeys.delete(key);
|
|
});
|
|
oldKeys.forEach(function (key) {
|
|
delete refs[key];
|
|
});
|
|
return refs;
|
|
}
|
|
function initRefs(vm) {
|
|
var mpInstance = vm.$scope;
|
|
var refs = {};
|
|
Object.defineProperty(vm, '$refs', {
|
|
get: function get() {
|
|
var $refs = {};
|
|
selectAllComponents(mpInstance, '.vue-ref', $refs);
|
|
// TODO 暂不考虑 for 中的 scoped
|
|
var forComponents = mpInstance.selectAllComponents('.vue-ref-in-for') || [];
|
|
forComponents.forEach(function (component) {
|
|
var ref = component.dataset.ref;
|
|
if (!$refs[ref]) {
|
|
$refs[ref] = [];
|
|
}
|
|
$refs[ref].push(component.$vm || toSkip(component));
|
|
});
|
|
return syncRefs(refs, $refs);
|
|
}
|
|
});
|
|
}
|
|
function handleLink(event) {
|
|
var _ref3 = event.detail || event.value,
|
|
vuePid = _ref3.vuePid,
|
|
vueOptions = _ref3.vueOptions; // detail 是微信,value 是百度(dipatch)
|
|
|
|
var parentVm;
|
|
if (vuePid) {
|
|
parentVm = findVmByVueId(this.$vm, vuePid);
|
|
}
|
|
if (!parentVm) {
|
|
parentVm = this.$vm;
|
|
}
|
|
vueOptions.parent = parentVm;
|
|
}
|
|
function markMPComponent(component) {
|
|
// 在 Vue 中标记为小程序组件
|
|
var IS_MP = '__v_isMPComponent';
|
|
Object.defineProperty(component, IS_MP, {
|
|
configurable: true,
|
|
enumerable: false,
|
|
value: true
|
|
});
|
|
return component;
|
|
}
|
|
function toSkip(obj) {
|
|
var OB = '__ob__';
|
|
var SKIP = '__v_skip';
|
|
if (isObject(obj) && Object.isExtensible(obj)) {
|
|
// 避免被 @vue/composition-api 观测
|
|
Object.defineProperty(obj, OB, {
|
|
configurable: true,
|
|
enumerable: false,
|
|
value: (0, _defineProperty2.default)({}, SKIP, true)
|
|
});
|
|
}
|
|
return obj;
|
|
}
|
|
var WORKLET_RE = /_(.*)_worklet_factory_/;
|
|
function initWorkletMethods(mpMethods, vueMethods) {
|
|
if (vueMethods) {
|
|
Object.keys(vueMethods).forEach(function (name) {
|
|
var matches = name.match(WORKLET_RE);
|
|
if (matches) {
|
|
var workletName = matches[1];
|
|
mpMethods[name] = vueMethods[name];
|
|
mpMethods[workletName] = vueMethods[workletName];
|
|
}
|
|
});
|
|
}
|
|
}
|
|
var MPPage = Page;
|
|
var MPComponent = Component;
|
|
var customizeRE = /:/g;
|
|
var customize = cached(function (str) {
|
|
return camelize(str.replace(customizeRE, '-'));
|
|
});
|
|
function initTriggerEvent(mpInstance) {
|
|
var oldTriggerEvent = mpInstance.triggerEvent;
|
|
var newTriggerEvent = function newTriggerEvent(event) {
|
|
for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
|
|
args[_key3 - 1] = arguments[_key3];
|
|
}
|
|
// 事件名统一转驼峰格式,仅处理:当前组件为 vue 组件、当前组件为 vue 组件子组件
|
|
if (this.$vm || this.dataset && this.dataset.comType) {
|
|
event = customize(event);
|
|
} else {
|
|
// 针对微信/QQ小程序单独补充驼峰格式事件,以兼容历史项目
|
|
var newEvent = customize(event);
|
|
if (newEvent !== event) {
|
|
oldTriggerEvent.apply(this, [newEvent].concat(args));
|
|
}
|
|
}
|
|
return oldTriggerEvent.apply(this, [event].concat(args));
|
|
};
|
|
try {
|
|
// 京东小程序 triggerEvent 为只读
|
|
mpInstance.triggerEvent = newTriggerEvent;
|
|
} catch (error) {
|
|
mpInstance._triggerEvent = newTriggerEvent;
|
|
}
|
|
}
|
|
function initHook(name, options, isComponent) {
|
|
var oldHook = options[name];
|
|
options[name] = function () {
|
|
markMPComponent(this);
|
|
initTriggerEvent(this);
|
|
if (oldHook) {
|
|
for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
|
|
args[_key4] = arguments[_key4];
|
|
}
|
|
return oldHook.apply(this, args);
|
|
}
|
|
};
|
|
}
|
|
if (!MPPage.__$wrappered) {
|
|
MPPage.__$wrappered = true;
|
|
Page = function Page() {
|
|
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
initHook('onLoad', options);
|
|
return MPPage(options);
|
|
};
|
|
Page.after = MPPage.after;
|
|
Component = function Component() {
|
|
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
initHook('created', options);
|
|
return MPComponent(options);
|
|
};
|
|
}
|
|
var PAGE_EVENT_HOOKS = ['onPullDownRefresh', 'onReachBottom', 'onAddToFavorites', 'onShareTimeline', 'onShareAppMessage', 'onPageScroll', 'onResize', 'onTabItemTap'];
|
|
function initMocks(vm, mocks) {
|
|
var mpInstance = vm.$mp[vm.mpType];
|
|
mocks.forEach(function (mock) {
|
|
if (hasOwn(mpInstance, mock)) {
|
|
vm[mock] = mpInstance[mock];
|
|
}
|
|
});
|
|
}
|
|
function hasHook(hook, vueOptions) {
|
|
if (!vueOptions) {
|
|
return true;
|
|
}
|
|
if (_vue.default.options && Array.isArray(_vue.default.options[hook])) {
|
|
return true;
|
|
}
|
|
vueOptions = vueOptions.default || vueOptions;
|
|
if (isFn(vueOptions)) {
|
|
if (isFn(vueOptions.extendOptions[hook])) {
|
|
return true;
|
|
}
|
|
if (vueOptions.super && vueOptions.super.options && Array.isArray(vueOptions.super.options[hook])) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
if (isFn(vueOptions[hook]) || Array.isArray(vueOptions[hook])) {
|
|
return true;
|
|
}
|
|
var mixins = vueOptions.mixins;
|
|
if (Array.isArray(mixins)) {
|
|
return !!mixins.find(function (mixin) {
|
|
return hasHook(hook, mixin);
|
|
});
|
|
}
|
|
}
|
|
function initHooks(mpOptions, hooks, vueOptions) {
|
|
hooks.forEach(function (hook) {
|
|
if (hasHook(hook, vueOptions)) {
|
|
mpOptions[hook] = function (args) {
|
|
return this.$vm && this.$vm.__call_hook(hook, args);
|
|
};
|
|
}
|
|
});
|
|
}
|
|
function initUnknownHooks(mpOptions, vueOptions) {
|
|
var excludes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
findHooks(vueOptions).forEach(function (hook) {
|
|
return initHook$1(mpOptions, hook, excludes);
|
|
});
|
|
}
|
|
function findHooks(vueOptions) {
|
|
var hooks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
if (vueOptions) {
|
|
Object.keys(vueOptions).forEach(function (name) {
|
|
if (name.indexOf('on') === 0 && isFn(vueOptions[name])) {
|
|
hooks.push(name);
|
|
}
|
|
});
|
|
}
|
|
return hooks;
|
|
}
|
|
function initHook$1(mpOptions, hook, excludes) {
|
|
if (excludes.indexOf(hook) === -1 && !hasOwn(mpOptions, hook)) {
|
|
mpOptions[hook] = function (args) {
|
|
return this.$vm && this.$vm.__call_hook(hook, args);
|
|
};
|
|
}
|
|
}
|
|
function initVueComponent(Vue, vueOptions) {
|
|
vueOptions = vueOptions.default || vueOptions;
|
|
var VueComponent;
|
|
if (isFn(vueOptions)) {
|
|
VueComponent = vueOptions;
|
|
} else {
|
|
VueComponent = Vue.extend(vueOptions);
|
|
}
|
|
vueOptions = VueComponent.options;
|
|
return [VueComponent, vueOptions];
|
|
}
|
|
function initSlots(vm, vueSlots) {
|
|
if (Array.isArray(vueSlots) && vueSlots.length) {
|
|
var $slots = Object.create(null);
|
|
vueSlots.forEach(function (slotName) {
|
|
$slots[slotName] = true;
|
|
});
|
|
vm.$scopedSlots = vm.$slots = $slots;
|
|
}
|
|
}
|
|
function initVueIds(vueIds, mpInstance) {
|
|
vueIds = (vueIds || '').split(',');
|
|
var len = vueIds.length;
|
|
if (len === 1) {
|
|
mpInstance._$vueId = vueIds[0];
|
|
} else if (len === 2) {
|
|
mpInstance._$vueId = vueIds[0];
|
|
mpInstance._$vuePid = vueIds[1];
|
|
}
|
|
}
|
|
function initData(vueOptions, context) {
|
|
var data = vueOptions.data || {};
|
|
var methods = vueOptions.methods || {};
|
|
if (typeof data === 'function') {
|
|
try {
|
|
data = data.call(context); // 支持 Vue.prototype 上挂的数据
|
|
} catch (e) {
|
|
if (Object({"VUE_APP_DARK_MODE":"false","VUE_APP_NAME":"中龙","VUE_APP_PLATFORM":"mp-weixin","NODE_ENV":"development","BASE_URL":"/"}).VUE_APP_DEBUG) {
|
|
console.warn('根据 Vue 的 data 函数初始化小程序 data 失败,请尽量确保 data 函数中不访问 vm 对象,否则可能影响首次数据渲染速度。', data);
|
|
}
|
|
}
|
|
} else {
|
|
try {
|
|
// 对 data 格式化
|
|
data = JSON.parse(JSON.stringify(data));
|
|
} catch (e) {}
|
|
}
|
|
if (!isPlainObject(data)) {
|
|
data = {};
|
|
}
|
|
Object.keys(methods).forEach(function (methodName) {
|
|
if (context.__lifecycle_hooks__.indexOf(methodName) === -1 && !hasOwn(data, methodName)) {
|
|
data[methodName] = methods[methodName];
|
|
}
|
|
});
|
|
return data;
|
|
}
|
|
var PROP_TYPES = [String, Number, Boolean, Object, Array, null];
|
|
function createObserver(name) {
|
|
return function observer(newVal, oldVal) {
|
|
if (this.$vm) {
|
|
this.$vm[name] = newVal; // 为了触发其他非 render watcher
|
|
}
|
|
};
|
|
}
|
|
|
|
function initBehaviors(vueOptions, initBehavior) {
|
|
var vueBehaviors = vueOptions.behaviors;
|
|
var vueExtends = vueOptions.extends;
|
|
var vueMixins = vueOptions.mixins;
|
|
var vueProps = vueOptions.props;
|
|
if (!vueProps) {
|
|
vueOptions.props = vueProps = [];
|
|
}
|
|
var behaviors = [];
|
|
if (Array.isArray(vueBehaviors)) {
|
|
vueBehaviors.forEach(function (behavior) {
|
|
behaviors.push(behavior.replace('uni://', "wx".concat("://")));
|
|
if (behavior === 'uni://form-field') {
|
|
if (Array.isArray(vueProps)) {
|
|
vueProps.push('name');
|
|
vueProps.push('value');
|
|
} else {
|
|
vueProps.name = {
|
|
type: String,
|
|
default: ''
|
|
};
|
|
vueProps.value = {
|
|
type: [String, Number, Boolean, Array, Object, Date],
|
|
default: ''
|
|
};
|
|
}
|
|
}
|
|
});
|
|
}
|
|
if (isPlainObject(vueExtends) && vueExtends.props) {
|
|
behaviors.push(initBehavior({
|
|
properties: initProperties(vueExtends.props, true)
|
|
}));
|
|
}
|
|
if (Array.isArray(vueMixins)) {
|
|
vueMixins.forEach(function (vueMixin) {
|
|
if (isPlainObject(vueMixin) && vueMixin.props) {
|
|
behaviors.push(initBehavior({
|
|
properties: initProperties(vueMixin.props, true)
|
|
}));
|
|
}
|
|
});
|
|
}
|
|
return behaviors;
|
|
}
|
|
function parsePropType(key, type, defaultValue, file) {
|
|
// [String]=>String
|
|
if (Array.isArray(type) && type.length === 1) {
|
|
return type[0];
|
|
}
|
|
return type;
|
|
}
|
|
function initProperties(props) {
|
|
var isBehavior = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
var file = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
|
|
var options = arguments.length > 3 ? arguments[3] : undefined;
|
|
var properties = {};
|
|
if (!isBehavior) {
|
|
properties.vueId = {
|
|
type: String,
|
|
value: ''
|
|
};
|
|
{
|
|
if (options.virtualHost) {
|
|
properties.virtualHostStyle = {
|
|
type: null,
|
|
value: ''
|
|
};
|
|
properties.virtualHostClass = {
|
|
type: null,
|
|
value: ''
|
|
};
|
|
}
|
|
}
|
|
// scopedSlotsCompiler auto
|
|
properties.scopedSlotsCompiler = {
|
|
type: String,
|
|
value: ''
|
|
};
|
|
properties.vueSlots = {
|
|
// 小程序不能直接定义 $slots 的 props,所以通过 vueSlots 转换到 $slots
|
|
type: null,
|
|
value: [],
|
|
observer: function observer(newVal, oldVal) {
|
|
var $slots = Object.create(null);
|
|
newVal.forEach(function (slotName) {
|
|
$slots[slotName] = true;
|
|
});
|
|
this.setData({
|
|
$slots: $slots
|
|
});
|
|
}
|
|
};
|
|
}
|
|
if (Array.isArray(props)) {
|
|
// ['title']
|
|
props.forEach(function (key) {
|
|
properties[key] = {
|
|
type: null,
|
|
observer: createObserver(key)
|
|
};
|
|
});
|
|
} else if (isPlainObject(props)) {
|
|
// {title:{type:String,default:''},content:String}
|
|
Object.keys(props).forEach(function (key) {
|
|
var opts = props[key];
|
|
if (isPlainObject(opts)) {
|
|
// title:{type:String,default:''}
|
|
var value = opts.default;
|
|
if (isFn(value)) {
|
|
value = value();
|
|
}
|
|
opts.type = parsePropType(key, opts.type);
|
|
properties[key] = {
|
|
type: PROP_TYPES.indexOf(opts.type) !== -1 ? opts.type : null,
|
|
value: value,
|
|
observer: createObserver(key)
|
|
};
|
|
} else {
|
|
// content:String
|
|
var type = parsePropType(key, opts);
|
|
properties[key] = {
|
|
type: PROP_TYPES.indexOf(type) !== -1 ? type : null,
|
|
observer: createObserver(key)
|
|
};
|
|
}
|
|
});
|
|
}
|
|
return properties;
|
|
}
|
|
function wrapper$1(event) {
|
|
// TODO 又得兼容 mpvue 的 mp 对象
|
|
try {
|
|
event.mp = JSON.parse(JSON.stringify(event));
|
|
} catch (e) {}
|
|
event.stopPropagation = noop;
|
|
event.preventDefault = noop;
|
|
event.target = event.target || {};
|
|
if (!hasOwn(event, 'detail')) {
|
|
event.detail = {};
|
|
}
|
|
if (hasOwn(event, 'markerId')) {
|
|
event.detail = (0, _typeof2.default)(event.detail) === 'object' ? event.detail : {};
|
|
event.detail.markerId = event.markerId;
|
|
}
|
|
if (isPlainObject(event.detail)) {
|
|
event.target = Object.assign({}, event.target, event.detail);
|
|
}
|
|
return event;
|
|
}
|
|
function getExtraValue(vm, dataPathsArray) {
|
|
var context = vm;
|
|
dataPathsArray.forEach(function (dataPathArray) {
|
|
var dataPath = dataPathArray[0];
|
|
var value = dataPathArray[2];
|
|
if (dataPath || typeof value !== 'undefined') {
|
|
// ['','',index,'disable']
|
|
var propPath = dataPathArray[1];
|
|
var valuePath = dataPathArray[3];
|
|
var vFor;
|
|
if (Number.isInteger(dataPath)) {
|
|
vFor = dataPath;
|
|
} else if (!dataPath) {
|
|
vFor = context;
|
|
} else if (typeof dataPath === 'string' && dataPath) {
|
|
if (dataPath.indexOf('#s#') === 0) {
|
|
vFor = dataPath.substr(3);
|
|
} else {
|
|
vFor = vm.__get_value(dataPath, context);
|
|
}
|
|
}
|
|
if (Number.isInteger(vFor)) {
|
|
context = value;
|
|
} else if (!propPath) {
|
|
context = vFor[value];
|
|
} else {
|
|
if (Array.isArray(vFor)) {
|
|
context = vFor.find(function (vForItem) {
|
|
return vm.__get_value(propPath, vForItem) === value;
|
|
});
|
|
} else if (isPlainObject(vFor)) {
|
|
context = Object.keys(vFor).find(function (vForKey) {
|
|
return vm.__get_value(propPath, vFor[vForKey]) === value;
|
|
});
|
|
} else {
|
|
console.error('v-for 暂不支持循环数据:', vFor);
|
|
}
|
|
}
|
|
if (valuePath) {
|
|
context = vm.__get_value(valuePath, context);
|
|
}
|
|
}
|
|
});
|
|
return context;
|
|
}
|
|
function processEventExtra(vm, extra, event, __args__) {
|
|
var extraObj = {};
|
|
if (Array.isArray(extra) && extra.length) {
|
|
/**
|
|
*[
|
|
* ['data.items', 'data.id', item.data.id],
|
|
* ['metas', 'id', meta.id]
|
|
*],
|
|
*[
|
|
* ['data.items', 'data.id', item.data.id],
|
|
* ['metas', 'id', meta.id]
|
|
*],
|
|
*'test'
|
|
*/
|
|
extra.forEach(function (dataPath, index) {
|
|
if (typeof dataPath === 'string') {
|
|
if (!dataPath) {
|
|
// model,prop.sync
|
|
extraObj['$' + index] = vm;
|
|
} else {
|
|
if (dataPath === '$event') {
|
|
// $event
|
|
extraObj['$' + index] = event;
|
|
} else if (dataPath === 'arguments') {
|
|
extraObj['$' + index] = event.detail ? event.detail.__args__ || __args__ : __args__;
|
|
} else if (dataPath.indexOf('$event.') === 0) {
|
|
// $event.target.value
|
|
extraObj['$' + index] = vm.__get_value(dataPath.replace('$event.', ''), event);
|
|
} else {
|
|
extraObj['$' + index] = vm.__get_value(dataPath);
|
|
}
|
|
}
|
|
} else {
|
|
extraObj['$' + index] = getExtraValue(vm, dataPath);
|
|
}
|
|
});
|
|
}
|
|
return extraObj;
|
|
}
|
|
function getObjByArray(arr) {
|
|
var obj = {};
|
|
for (var i = 1; i < arr.length; i++) {
|
|
var element = arr[i];
|
|
obj[element[0]] = element[1];
|
|
}
|
|
return obj;
|
|
}
|
|
function processEventArgs(vm, event) {
|
|
var args = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
var extra = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
|
|
var isCustom = arguments.length > 4 ? arguments[4] : undefined;
|
|
var methodName = arguments.length > 5 ? arguments[5] : undefined;
|
|
var isCustomMPEvent = false; // wxcomponent 组件,传递原始 event 对象
|
|
|
|
// fixed 用户直接触发 mpInstance.triggerEvent
|
|
var __args__ = isPlainObject(event.detail) ? event.detail.__args__ || [event.detail] : [event.detail];
|
|
if (isCustom) {
|
|
// 自定义事件
|
|
isCustomMPEvent = event.currentTarget && event.currentTarget.dataset && event.currentTarget.dataset.comType === 'wx';
|
|
if (!args.length) {
|
|
// 无参数,直接传入 event 或 detail 数组
|
|
if (isCustomMPEvent) {
|
|
return [event];
|
|
}
|
|
return __args__;
|
|
}
|
|
}
|
|
var extraObj = processEventExtra(vm, extra, event, __args__);
|
|
var ret = [];
|
|
args.forEach(function (arg) {
|
|
if (arg === '$event') {
|
|
if (methodName === '__set_model' && !isCustom) {
|
|
// input v-model value
|
|
ret.push(event.target.value);
|
|
} else {
|
|
if (isCustom && !isCustomMPEvent) {
|
|
ret.push(__args__[0]);
|
|
} else {
|
|
// wxcomponent 组件或内置组件
|
|
ret.push(event);
|
|
}
|
|
}
|
|
} else {
|
|
if (Array.isArray(arg) && arg[0] === 'o') {
|
|
ret.push(getObjByArray(arg));
|
|
} else if (typeof arg === 'string' && hasOwn(extraObj, arg)) {
|
|
ret.push(extraObj[arg]);
|
|
} else {
|
|
ret.push(arg);
|
|
}
|
|
}
|
|
});
|
|
return ret;
|
|
}
|
|
var ONCE = '~';
|
|
var CUSTOM = '^';
|
|
function isMatchEventType(eventType, optType) {
|
|
return eventType === optType || optType === 'regionchange' && (eventType === 'begin' || eventType === 'end');
|
|
}
|
|
function getContextVm(vm) {
|
|
var $parent = vm.$parent;
|
|
// 父组件是 scoped slots 或者其他自定义组件时继续查找
|
|
while ($parent && $parent.$parent && ($parent.$options.generic || $parent.$parent.$options.generic || $parent.$scope._$vuePid)) {
|
|
$parent = $parent.$parent;
|
|
}
|
|
return $parent && $parent.$parent;
|
|
}
|
|
function handleEvent(event) {
|
|
var _this2 = this;
|
|
event = wrapper$1(event);
|
|
|
|
// [['tap',[['handle',[1,2,a]],['handle1',[1,2,a]]]]]
|
|
var dataset = (event.currentTarget || event.target).dataset;
|
|
if (!dataset) {
|
|
return console.warn('事件信息不存在');
|
|
}
|
|
var eventOpts = dataset.eventOpts || dataset['event-opts']; // 支付宝 web-view 组件 dataset 非驼峰
|
|
if (!eventOpts) {
|
|
return console.warn('事件信息不存在');
|
|
}
|
|
|
|
// [['handle',[1,2,a]],['handle1',[1,2,a]]]
|
|
var eventType = event.type;
|
|
var ret = [];
|
|
eventOpts.forEach(function (eventOpt) {
|
|
var type = eventOpt[0];
|
|
var eventsArray = eventOpt[1];
|
|
var isCustom = type.charAt(0) === CUSTOM;
|
|
type = isCustom ? type.slice(1) : type;
|
|
var isOnce = type.charAt(0) === ONCE;
|
|
type = isOnce ? type.slice(1) : type;
|
|
if (eventsArray && isMatchEventType(eventType, type)) {
|
|
eventsArray.forEach(function (eventArray) {
|
|
var methodName = eventArray[0];
|
|
if (methodName) {
|
|
var handlerCtx = _this2.$vm;
|
|
if (handlerCtx.$options.generic) {
|
|
// mp-weixin,mp-toutiao 抽象节点模拟 scoped slots
|
|
handlerCtx = getContextVm(handlerCtx) || handlerCtx;
|
|
}
|
|
if (methodName === '$emit') {
|
|
handlerCtx.$emit.apply(handlerCtx, processEventArgs(_this2.$vm, event, eventArray[1], eventArray[2], isCustom, methodName));
|
|
return;
|
|
}
|
|
var handler = handlerCtx[methodName];
|
|
if (!isFn(handler)) {
|
|
var _type = _this2.$vm.mpType === 'page' ? 'Page' : 'Component';
|
|
var path = _this2.route || _this2.is;
|
|
throw new Error("".concat(_type, " \"").concat(path, "\" does not have a method \"").concat(methodName, "\""));
|
|
}
|
|
if (isOnce) {
|
|
if (handler.once) {
|
|
return;
|
|
}
|
|
handler.once = true;
|
|
}
|
|
var params = processEventArgs(_this2.$vm, event, eventArray[1], eventArray[2], isCustom, methodName);
|
|
params = Array.isArray(params) ? params : [];
|
|
// 参数尾部增加原始事件对象用于复杂表达式内获取额外数据
|
|
if (/=\s*\S+\.eventParams\s*\|\|\s*\S+\[['"]event-params['"]\]/.test(handler.toString())) {
|
|
// eslint-disable-next-line no-sparse-arrays
|
|
params = params.concat([,,,,,,,,,, event]);
|
|
}
|
|
ret.push(handler.apply(handlerCtx, params));
|
|
}
|
|
});
|
|
}
|
|
});
|
|
if (eventType === 'input' && ret.length === 1 && typeof ret[0] !== 'undefined') {
|
|
return ret[0];
|
|
}
|
|
}
|
|
var eventChannels = {};
|
|
function getEventChannel(id) {
|
|
var eventChannel = eventChannels[id];
|
|
delete eventChannels[id];
|
|
return eventChannel;
|
|
}
|
|
var hooks = ['onShow', 'onHide', 'onError', 'onPageNotFound', 'onThemeChange', 'onUnhandledRejection'];
|
|
function initEventChannel() {
|
|
_vue.default.prototype.getOpenerEventChannel = function () {
|
|
// 微信小程序使用自身getOpenerEventChannel
|
|
{
|
|
return this.$scope.getOpenerEventChannel();
|
|
}
|
|
};
|
|
var callHook = _vue.default.prototype.__call_hook;
|
|
_vue.default.prototype.__call_hook = function (hook, args) {
|
|
if (hook === 'onLoad' && args && args.__id__) {
|
|
this.__eventChannel__ = getEventChannel(args.__id__);
|
|
delete args.__id__;
|
|
}
|
|
return callHook.call(this, hook, args);
|
|
};
|
|
}
|
|
function initScopedSlotsParams() {
|
|
var center = {};
|
|
var parents = {};
|
|
function currentId(fn) {
|
|
var vueIds = this.$options.propsData.vueId;
|
|
if (vueIds) {
|
|
var vueId = vueIds.split(',')[0];
|
|
fn(vueId);
|
|
}
|
|
}
|
|
_vue.default.prototype.$hasSSP = function (vueId) {
|
|
var slot = center[vueId];
|
|
if (!slot) {
|
|
parents[vueId] = this;
|
|
this.$on('hook:destroyed', function () {
|
|
delete parents[vueId];
|
|
});
|
|
}
|
|
return slot;
|
|
};
|
|
_vue.default.prototype.$getSSP = function (vueId, name, needAll) {
|
|
var slot = center[vueId];
|
|
if (slot) {
|
|
var params = slot[name] || [];
|
|
if (needAll) {
|
|
return params;
|
|
}
|
|
return params[0];
|
|
}
|
|
};
|
|
_vue.default.prototype.$setSSP = function (name, value) {
|
|
var index = 0;
|
|
currentId.call(this, function (vueId) {
|
|
var slot = center[vueId];
|
|
var params = slot[name] = slot[name] || [];
|
|
params.push(value);
|
|
index = params.length - 1;
|
|
});
|
|
return index;
|
|
};
|
|
_vue.default.prototype.$initSSP = function () {
|
|
currentId.call(this, function (vueId) {
|
|
center[vueId] = {};
|
|
});
|
|
};
|
|
_vue.default.prototype.$callSSP = function () {
|
|
currentId.call(this, function (vueId) {
|
|
if (parents[vueId]) {
|
|
parents[vueId].$forceUpdate();
|
|
}
|
|
});
|
|
};
|
|
_vue.default.mixin({
|
|
destroyed: function destroyed() {
|
|
var propsData = this.$options.propsData;
|
|
var vueId = propsData && propsData.vueId;
|
|
if (vueId) {
|
|
delete center[vueId];
|
|
delete parents[vueId];
|
|
}
|
|
}
|
|
});
|
|
}
|
|
function parseBaseApp(vm, _ref4) {
|
|
var mocks = _ref4.mocks,
|
|
initRefs = _ref4.initRefs;
|
|
initEventChannel();
|
|
{
|
|
initScopedSlotsParams();
|
|
}
|
|
if (vm.$options.store) {
|
|
_vue.default.prototype.$store = vm.$options.store;
|
|
}
|
|
uniIdMixin(_vue.default);
|
|
_vue.default.prototype.mpHost = "mp-weixin";
|
|
_vue.default.mixin({
|
|
beforeCreate: function beforeCreate() {
|
|
if (!this.$options.mpType) {
|
|
return;
|
|
}
|
|
this.mpType = this.$options.mpType;
|
|
this.$mp = (0, _defineProperty2.default)({
|
|
data: {}
|
|
}, this.mpType, this.$options.mpInstance);
|
|
this.$scope = this.$options.mpInstance;
|
|
delete this.$options.mpType;
|
|
delete this.$options.mpInstance;
|
|
if (this.mpType === 'page' && typeof getApp === 'function') {
|
|
// hack vue-i18n
|
|
var app = getApp();
|
|
if (app.$vm && app.$vm.$i18n) {
|
|
this._i18n = app.$vm.$i18n;
|
|
}
|
|
}
|
|
if (this.mpType !== 'app') {
|
|
initRefs(this);
|
|
initMocks(this, mocks);
|
|
}
|
|
}
|
|
});
|
|
var appOptions = {
|
|
onLaunch: function onLaunch(args) {
|
|
if (this.$vm) {
|
|
// 已经初始化过了,主要是为了百度,百度 onShow 在 onLaunch 之前
|
|
return;
|
|
}
|
|
{
|
|
if (wx.canIUse && !wx.canIUse('nextTick')) {
|
|
// 事实 上2.2.3 即可,简单使用 2.3.0 的 nextTick 判断
|
|
console.error('当前微信基础库版本过低,请将 微信开发者工具-详情-项目设置-调试基础库版本 更换为`2.3.0`以上');
|
|
}
|
|
}
|
|
this.$vm = vm;
|
|
this.$vm.$mp = {
|
|
app: this
|
|
};
|
|
this.$vm.$scope = this;
|
|
// vm 上也挂载 globalData
|
|
this.$vm.globalData = this.globalData;
|
|
this.$vm._isMounted = true;
|
|
this.$vm.__call_hook('mounted', args);
|
|
this.$vm.__call_hook('onLaunch', args);
|
|
}
|
|
};
|
|
|
|
// 兼容旧版本 globalData
|
|
appOptions.globalData = vm.$options.globalData || {};
|
|
// 将 methods 中的方法挂在 getApp() 中
|
|
var methods = vm.$options.methods;
|
|
if (methods) {
|
|
Object.keys(methods).forEach(function (name) {
|
|
appOptions[name] = methods[name];
|
|
});
|
|
}
|
|
initAppLocale(_vue.default, vm, normalizeLocale(wx.getSystemInfoSync().language) || LOCALE_EN);
|
|
initHooks(appOptions, hooks);
|
|
initUnknownHooks(appOptions, vm.$options);
|
|
return appOptions;
|
|
}
|
|
function parseApp(vm) {
|
|
return parseBaseApp(vm, {
|
|
mocks: mocks,
|
|
initRefs: initRefs
|
|
});
|
|
}
|
|
function createApp(vm) {
|
|
App(parseApp(vm));
|
|
return vm;
|
|
}
|
|
var encodeReserveRE = /[!'()*]/g;
|
|
var encodeReserveReplacer = function encodeReserveReplacer(c) {
|
|
return '%' + c.charCodeAt(0).toString(16);
|
|
};
|
|
var commaRE = /%2C/g;
|
|
|
|
// fixed encodeURIComponent which is more conformant to RFC3986:
|
|
// - escapes [!'()*]
|
|
// - preserve commas
|
|
var encode = function encode(str) {
|
|
return encodeURIComponent(str).replace(encodeReserveRE, encodeReserveReplacer).replace(commaRE, ',');
|
|
};
|
|
function stringifyQuery(obj) {
|
|
var encodeStr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : encode;
|
|
var res = obj ? Object.keys(obj).map(function (key) {
|
|
var val = obj[key];
|
|
if (val === undefined) {
|
|
return '';
|
|
}
|
|
if (val === null) {
|
|
return encodeStr(key);
|
|
}
|
|
if (Array.isArray(val)) {
|
|
var result = [];
|
|
val.forEach(function (val2) {
|
|
if (val2 === undefined) {
|
|
return;
|
|
}
|
|
if (val2 === null) {
|
|
result.push(encodeStr(key));
|
|
} else {
|
|
result.push(encodeStr(key) + '=' + encodeStr(val2));
|
|
}
|
|
});
|
|
return result.join('&');
|
|
}
|
|
return encodeStr(key) + '=' + encodeStr(val);
|
|
}).filter(function (x) {
|
|
return x.length > 0;
|
|
}).join('&') : null;
|
|
return res ? "?".concat(res) : '';
|
|
}
|
|
function parseBaseComponent(vueComponentOptions) {
|
|
var _ref5 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
|
|
isPage = _ref5.isPage,
|
|
initRelation = _ref5.initRelation;
|
|
var needVueOptions = arguments.length > 2 ? arguments[2] : undefined;
|
|
var _initVueComponent = initVueComponent(_vue.default, vueComponentOptions),
|
|
_initVueComponent2 = (0, _slicedToArray2.default)(_initVueComponent, 2),
|
|
VueComponent = _initVueComponent2[0],
|
|
vueOptions = _initVueComponent2[1];
|
|
var options = _objectSpread({
|
|
multipleSlots: true,
|
|
// styleIsolation: 'apply-shared',
|
|
addGlobalClass: true
|
|
}, vueOptions.options || {});
|
|
{
|
|
// 微信 multipleSlots 部分情况有 bug,导致内容顺序错乱 如 u-list,提供覆盖选项
|
|
if (vueOptions['mp-weixin'] && vueOptions['mp-weixin'].options) {
|
|
Object.assign(options, vueOptions['mp-weixin'].options);
|
|
}
|
|
}
|
|
var componentOptions = {
|
|
options: options,
|
|
data: initData(vueOptions, _vue.default.prototype),
|
|
behaviors: initBehaviors(vueOptions, initBehavior),
|
|
properties: initProperties(vueOptions.props, false, vueOptions.__file, options),
|
|
lifetimes: {
|
|
attached: function attached() {
|
|
var properties = this.properties;
|
|
var options = {
|
|
mpType: isPage.call(this) ? 'page' : 'component',
|
|
mpInstance: this,
|
|
propsData: properties
|
|
};
|
|
initVueIds(properties.vueId, this);
|
|
|
|
// 处理父子关系
|
|
initRelation.call(this, {
|
|
vuePid: this._$vuePid,
|
|
vueOptions: options
|
|
});
|
|
|
|
// 初始化 vue 实例
|
|
this.$vm = new VueComponent(options);
|
|
|
|
// 处理$slots,$scopedSlots(暂不支持动态变化$slots)
|
|
initSlots(this.$vm, properties.vueSlots);
|
|
|
|
// 触发首次 setData
|
|
this.$vm.$mount();
|
|
},
|
|
ready: function ready() {
|
|
// 当组件 props 默认值为 true,初始化时传入 false 会导致 created,ready 触发, 但 attached 不触发
|
|
// https://developers.weixin.qq.com/community/develop/doc/00066ae2844cc0f8eb883e2a557800
|
|
if (this.$vm) {
|
|
this.$vm._isMounted = true;
|
|
this.$vm.__call_hook('mounted');
|
|
this.$vm.__call_hook('onReady');
|
|
}
|
|
},
|
|
detached: function detached() {
|
|
this.$vm && this.$vm.$destroy();
|
|
}
|
|
},
|
|
pageLifetimes: {
|
|
show: function show(args) {
|
|
this.$vm && this.$vm.__call_hook('onPageShow', args);
|
|
},
|
|
hide: function hide() {
|
|
this.$vm && this.$vm.__call_hook('onPageHide');
|
|
},
|
|
resize: function resize(size) {
|
|
this.$vm && this.$vm.__call_hook('onPageResize', size);
|
|
}
|
|
},
|
|
methods: {
|
|
__l: handleLink,
|
|
__e: handleEvent
|
|
}
|
|
};
|
|
// externalClasses
|
|
if (vueOptions.externalClasses) {
|
|
componentOptions.externalClasses = vueOptions.externalClasses;
|
|
}
|
|
if (Array.isArray(vueOptions.wxsCallMethods)) {
|
|
vueOptions.wxsCallMethods.forEach(function (callMethod) {
|
|
componentOptions.methods[callMethod] = function (args) {
|
|
return this.$vm[callMethod](args);
|
|
};
|
|
});
|
|
}
|
|
if (needVueOptions) {
|
|
return [componentOptions, vueOptions, VueComponent];
|
|
}
|
|
if (isPage) {
|
|
return componentOptions;
|
|
}
|
|
return [componentOptions, VueComponent];
|
|
}
|
|
function parseComponent(vueComponentOptions, needVueOptions) {
|
|
return parseBaseComponent(vueComponentOptions, {
|
|
isPage: isPage,
|
|
initRelation: initRelation
|
|
}, needVueOptions);
|
|
}
|
|
var hooks$1 = ['onShow', 'onHide', 'onUnload'];
|
|
hooks$1.push.apply(hooks$1, PAGE_EVENT_HOOKS);
|
|
function parseBasePage(vuePageOptions) {
|
|
var _parseComponent = parseComponent(vuePageOptions, true),
|
|
_parseComponent2 = (0, _slicedToArray2.default)(_parseComponent, 2),
|
|
pageOptions = _parseComponent2[0],
|
|
vueOptions = _parseComponent2[1];
|
|
initHooks(pageOptions.methods, hooks$1, vueOptions);
|
|
pageOptions.methods.onLoad = function (query) {
|
|
this.options = query;
|
|
var copyQuery = Object.assign({}, query);
|
|
delete copyQuery.__id__;
|
|
this.$page = {
|
|
fullPath: '/' + (this.route || this.is) + stringifyQuery(copyQuery)
|
|
};
|
|
this.$vm.$mp.query = query; // 兼容 mpvue
|
|
this.$vm.__call_hook('onLoad', query);
|
|
};
|
|
{
|
|
initUnknownHooks(pageOptions.methods, vuePageOptions, ['onReady']);
|
|
}
|
|
{
|
|
initWorkletMethods(pageOptions.methods, vueOptions.methods);
|
|
}
|
|
return pageOptions;
|
|
}
|
|
function parsePage(vuePageOptions) {
|
|
return parseBasePage(vuePageOptions);
|
|
}
|
|
function createPage(vuePageOptions) {
|
|
{
|
|
return Component(parsePage(vuePageOptions));
|
|
}
|
|
}
|
|
function createComponent(vueOptions) {
|
|
{
|
|
return Component(parseComponent(vueOptions));
|
|
}
|
|
}
|
|
function createSubpackageApp(vm) {
|
|
var appOptions = parseApp(vm);
|
|
var app = getApp({
|
|
allowDefault: true
|
|
});
|
|
vm.$scope = app;
|
|
var globalData = app.globalData;
|
|
if (globalData) {
|
|
Object.keys(appOptions.globalData).forEach(function (name) {
|
|
if (!hasOwn(globalData, name)) {
|
|
globalData[name] = appOptions.globalData[name];
|
|
}
|
|
});
|
|
}
|
|
Object.keys(appOptions).forEach(function (name) {
|
|
if (!hasOwn(app, name)) {
|
|
app[name] = appOptions[name];
|
|
}
|
|
});
|
|
if (isFn(appOptions.onShow) && wx.onAppShow) {
|
|
wx.onAppShow(function () {
|
|
for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
|
|
args[_key5] = arguments[_key5];
|
|
}
|
|
vm.__call_hook('onShow', args);
|
|
});
|
|
}
|
|
if (isFn(appOptions.onHide) && wx.onAppHide) {
|
|
wx.onAppHide(function () {
|
|
for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
|
|
args[_key6] = arguments[_key6];
|
|
}
|
|
vm.__call_hook('onHide', args);
|
|
});
|
|
}
|
|
if (isFn(appOptions.onLaunch)) {
|
|
var args = wx.getLaunchOptionsSync && wx.getLaunchOptionsSync();
|
|
vm.__call_hook('onLaunch', args);
|
|
}
|
|
return vm;
|
|
}
|
|
function createPlugin(vm) {
|
|
var appOptions = parseApp(vm);
|
|
if (isFn(appOptions.onShow) && wx.onAppShow) {
|
|
wx.onAppShow(function () {
|
|
for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
|
|
args[_key7] = arguments[_key7];
|
|
}
|
|
vm.__call_hook('onShow', args);
|
|
});
|
|
}
|
|
if (isFn(appOptions.onHide) && wx.onAppHide) {
|
|
wx.onAppHide(function () {
|
|
for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
|
|
args[_key8] = arguments[_key8];
|
|
}
|
|
vm.__call_hook('onHide', args);
|
|
});
|
|
}
|
|
if (isFn(appOptions.onLaunch)) {
|
|
var args = wx.getLaunchOptionsSync && wx.getLaunchOptionsSync();
|
|
vm.__call_hook('onLaunch', args);
|
|
}
|
|
return vm;
|
|
}
|
|
todos.forEach(function (todoApi) {
|
|
protocols[todoApi] = false;
|
|
});
|
|
canIUses.forEach(function (canIUseApi) {
|
|
var apiName = protocols[canIUseApi] && protocols[canIUseApi].name ? protocols[canIUseApi].name : canIUseApi;
|
|
if (!wx.canIUse(apiName)) {
|
|
protocols[canIUseApi] = false;
|
|
}
|
|
});
|
|
var uni = {};
|
|
if (typeof Proxy !== 'undefined' && "mp-weixin" !== 'app-plus') {
|
|
uni = new Proxy({}, {
|
|
get: function get(target, name) {
|
|
if (hasOwn(target, name)) {
|
|
return target[name];
|
|
}
|
|
if (baseApi[name]) {
|
|
return baseApi[name];
|
|
}
|
|
if (api[name]) {
|
|
return promisify(name, api[name]);
|
|
}
|
|
{
|
|
if (extraApi[name]) {
|
|
return promisify(name, extraApi[name]);
|
|
}
|
|
if (todoApis[name]) {
|
|
return promisify(name, todoApis[name]);
|
|
}
|
|
}
|
|
if (eventApi[name]) {
|
|
return eventApi[name];
|
|
}
|
|
return promisify(name, wrapper(name, wx[name]));
|
|
},
|
|
set: function set(target, name, value) {
|
|
target[name] = value;
|
|
return true;
|
|
}
|
|
});
|
|
} else {
|
|
Object.keys(baseApi).forEach(function (name) {
|
|
uni[name] = baseApi[name];
|
|
});
|
|
{
|
|
Object.keys(todoApis).forEach(function (name) {
|
|
uni[name] = promisify(name, todoApis[name]);
|
|
});
|
|
Object.keys(extraApi).forEach(function (name) {
|
|
uni[name] = promisify(name, extraApi[name]);
|
|
});
|
|
}
|
|
Object.keys(eventApi).forEach(function (name) {
|
|
uni[name] = eventApi[name];
|
|
});
|
|
Object.keys(api).forEach(function (name) {
|
|
uni[name] = promisify(name, api[name]);
|
|
});
|
|
Object.keys(wx).forEach(function (name) {
|
|
if (hasOwn(wx, name) || hasOwn(protocols, name)) {
|
|
uni[name] = promisify(name, wrapper(name, wx[name]));
|
|
}
|
|
});
|
|
}
|
|
wx.createApp = createApp;
|
|
wx.createPage = createPage;
|
|
wx.createComponent = createComponent;
|
|
wx.createSubpackageApp = createSubpackageApp;
|
|
wx.createPlugin = createPlugin;
|
|
var uni$1 = uni;
|
|
var _default = uni$1;
|
|
exports.default = _default;
|
|
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-weixin/dist/wx.js */ 1)["default"], __webpack_require__(/*! ./../../../webpack/buildin/global.js */ 3)))
|
|
|
|
/***/ }),
|
|
|
|
/***/ 20:
|
|
/*!****************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/iterableToArray.js ***!
|
|
\****************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
function _iterableToArray(iter) {
|
|
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
|
|
}
|
|
module.exports = _iterableToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 21:
|
|
/*!******************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/nonIterableSpread.js ***!
|
|
\******************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
function _nonIterableSpread() {
|
|
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
}
|
|
module.exports = _nonIterableSpread, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 22:
|
|
/*!*************************************************************!*\
|
|
!*** ./node_modules/@dcloudio/uni-i18n/dist/uni-i18n.es.js ***!
|
|
\*************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(uni, global) {
|
|
|
|
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ 4);
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.LOCALE_ZH_HANT = exports.LOCALE_ZH_HANS = exports.LOCALE_FR = exports.LOCALE_ES = exports.LOCALE_EN = exports.I18n = exports.Formatter = void 0;
|
|
exports.compileI18nJsonStr = compileI18nJsonStr;
|
|
exports.hasI18nJson = hasI18nJson;
|
|
exports.initVueI18n = initVueI18n;
|
|
exports.isI18nStr = isI18nStr;
|
|
exports.isString = void 0;
|
|
exports.normalizeLocale = normalizeLocale;
|
|
exports.parseI18nJson = parseI18nJson;
|
|
exports.resolveLocale = resolveLocale;
|
|
var _slicedToArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ 5));
|
|
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ 23));
|
|
var _createClass2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/createClass */ 24));
|
|
var _typeof2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/typeof */ 13));
|
|
var isObject = function isObject(val) {
|
|
return val !== null && (0, _typeof2.default)(val) === 'object';
|
|
};
|
|
var defaultDelimiters = ['{', '}'];
|
|
var BaseFormatter = /*#__PURE__*/function () {
|
|
function BaseFormatter() {
|
|
(0, _classCallCheck2.default)(this, BaseFormatter);
|
|
this._caches = Object.create(null);
|
|
}
|
|
(0, _createClass2.default)(BaseFormatter, [{
|
|
key: "interpolate",
|
|
value: function interpolate(message, values) {
|
|
var delimiters = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultDelimiters;
|
|
if (!values) {
|
|
return [message];
|
|
}
|
|
var tokens = this._caches[message];
|
|
if (!tokens) {
|
|
tokens = parse(message, delimiters);
|
|
this._caches[message] = tokens;
|
|
}
|
|
return compile(tokens, values);
|
|
}
|
|
}]);
|
|
return BaseFormatter;
|
|
}();
|
|
exports.Formatter = BaseFormatter;
|
|
var RE_TOKEN_LIST_VALUE = /^(?:\d)+/;
|
|
var RE_TOKEN_NAMED_VALUE = /^(?:\w)+/;
|
|
function parse(format, _ref) {
|
|
var _ref2 = (0, _slicedToArray2.default)(_ref, 2),
|
|
startDelimiter = _ref2[0],
|
|
endDelimiter = _ref2[1];
|
|
var tokens = [];
|
|
var position = 0;
|
|
var text = '';
|
|
while (position < format.length) {
|
|
var char = format[position++];
|
|
if (char === startDelimiter) {
|
|
if (text) {
|
|
tokens.push({
|
|
type: 'text',
|
|
value: text
|
|
});
|
|
}
|
|
text = '';
|
|
var sub = '';
|
|
char = format[position++];
|
|
while (char !== undefined && char !== endDelimiter) {
|
|
sub += char;
|
|
char = format[position++];
|
|
}
|
|
var isClosed = char === endDelimiter;
|
|
var type = RE_TOKEN_LIST_VALUE.test(sub) ? 'list' : isClosed && RE_TOKEN_NAMED_VALUE.test(sub) ? 'named' : 'unknown';
|
|
tokens.push({
|
|
value: sub,
|
|
type: type
|
|
});
|
|
}
|
|
// else if (char === '%') {
|
|
// // when found rails i18n syntax, skip text capture
|
|
// if (format[position] !== '{') {
|
|
// text += char
|
|
// }
|
|
// }
|
|
else {
|
|
text += char;
|
|
}
|
|
}
|
|
text && tokens.push({
|
|
type: 'text',
|
|
value: text
|
|
});
|
|
return tokens;
|
|
}
|
|
function compile(tokens, values) {
|
|
var compiled = [];
|
|
var index = 0;
|
|
var mode = Array.isArray(values) ? 'list' : isObject(values) ? 'named' : 'unknown';
|
|
if (mode === 'unknown') {
|
|
return compiled;
|
|
}
|
|
while (index < tokens.length) {
|
|
var token = tokens[index];
|
|
switch (token.type) {
|
|
case 'text':
|
|
compiled.push(token.value);
|
|
break;
|
|
case 'list':
|
|
compiled.push(values[parseInt(token.value, 10)]);
|
|
break;
|
|
case 'named':
|
|
if (mode === 'named') {
|
|
compiled.push(values[token.value]);
|
|
} else {
|
|
if (true) {
|
|
console.warn("Type of token '".concat(token.type, "' and format of value '").concat(mode, "' don't match!"));
|
|
}
|
|
}
|
|
break;
|
|
case 'unknown':
|
|
if (true) {
|
|
console.warn("Detect 'unknown' type of token!");
|
|
}
|
|
break;
|
|
}
|
|
index++;
|
|
}
|
|
return compiled;
|
|
}
|
|
var LOCALE_ZH_HANS = 'zh-Hans';
|
|
exports.LOCALE_ZH_HANS = LOCALE_ZH_HANS;
|
|
var LOCALE_ZH_HANT = 'zh-Hant';
|
|
exports.LOCALE_ZH_HANT = LOCALE_ZH_HANT;
|
|
var LOCALE_EN = 'en';
|
|
exports.LOCALE_EN = LOCALE_EN;
|
|
var LOCALE_FR = 'fr';
|
|
exports.LOCALE_FR = LOCALE_FR;
|
|
var LOCALE_ES = 'es';
|
|
exports.LOCALE_ES = LOCALE_ES;
|
|
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
var hasOwn = function hasOwn(val, key) {
|
|
return hasOwnProperty.call(val, key);
|
|
};
|
|
var defaultFormatter = new BaseFormatter();
|
|
function include(str, parts) {
|
|
return !!parts.find(function (part) {
|
|
return str.indexOf(part) !== -1;
|
|
});
|
|
}
|
|
function startsWith(str, parts) {
|
|
return parts.find(function (part) {
|
|
return str.indexOf(part) === 0;
|
|
});
|
|
}
|
|
function normalizeLocale(locale, messages) {
|
|
if (!locale) {
|
|
return;
|
|
}
|
|
locale = locale.trim().replace(/_/g, '-');
|
|
if (messages && messages[locale]) {
|
|
return locale;
|
|
}
|
|
locale = locale.toLowerCase();
|
|
if (locale === 'chinese') {
|
|
// 支付宝
|
|
return LOCALE_ZH_HANS;
|
|
}
|
|
if (locale.indexOf('zh') === 0) {
|
|
if (locale.indexOf('-hans') > -1) {
|
|
return LOCALE_ZH_HANS;
|
|
}
|
|
if (locale.indexOf('-hant') > -1) {
|
|
return LOCALE_ZH_HANT;
|
|
}
|
|
if (include(locale, ['-tw', '-hk', '-mo', '-cht'])) {
|
|
return LOCALE_ZH_HANT;
|
|
}
|
|
return LOCALE_ZH_HANS;
|
|
}
|
|
var locales = [LOCALE_EN, LOCALE_FR, LOCALE_ES];
|
|
if (messages && Object.keys(messages).length > 0) {
|
|
locales = Object.keys(messages);
|
|
}
|
|
var lang = startsWith(locale, locales);
|
|
if (lang) {
|
|
return lang;
|
|
}
|
|
}
|
|
var I18n = /*#__PURE__*/function () {
|
|
function I18n(_ref3) {
|
|
var locale = _ref3.locale,
|
|
fallbackLocale = _ref3.fallbackLocale,
|
|
messages = _ref3.messages,
|
|
watcher = _ref3.watcher,
|
|
formater = _ref3.formater;
|
|
(0, _classCallCheck2.default)(this, I18n);
|
|
this.locale = LOCALE_EN;
|
|
this.fallbackLocale = LOCALE_EN;
|
|
this.message = {};
|
|
this.messages = {};
|
|
this.watchers = [];
|
|
if (fallbackLocale) {
|
|
this.fallbackLocale = fallbackLocale;
|
|
}
|
|
this.formater = formater || defaultFormatter;
|
|
this.messages = messages || {};
|
|
this.setLocale(locale || LOCALE_EN);
|
|
if (watcher) {
|
|
this.watchLocale(watcher);
|
|
}
|
|
}
|
|
(0, _createClass2.default)(I18n, [{
|
|
key: "setLocale",
|
|
value: function setLocale(locale) {
|
|
var _this = this;
|
|
var oldLocale = this.locale;
|
|
this.locale = normalizeLocale(locale, this.messages) || this.fallbackLocale;
|
|
if (!this.messages[this.locale]) {
|
|
// 可能初始化时不存在
|
|
this.messages[this.locale] = {};
|
|
}
|
|
this.message = this.messages[this.locale];
|
|
// 仅发生变化时,通知
|
|
if (oldLocale !== this.locale) {
|
|
this.watchers.forEach(function (watcher) {
|
|
watcher(_this.locale, oldLocale);
|
|
});
|
|
}
|
|
}
|
|
}, {
|
|
key: "getLocale",
|
|
value: function getLocale() {
|
|
return this.locale;
|
|
}
|
|
}, {
|
|
key: "watchLocale",
|
|
value: function watchLocale(fn) {
|
|
var _this2 = this;
|
|
var index = this.watchers.push(fn) - 1;
|
|
return function () {
|
|
_this2.watchers.splice(index, 1);
|
|
};
|
|
}
|
|
}, {
|
|
key: "add",
|
|
value: function add(locale, message) {
|
|
var override = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
|
var curMessages = this.messages[locale];
|
|
if (curMessages) {
|
|
if (override) {
|
|
Object.assign(curMessages, message);
|
|
} else {
|
|
Object.keys(message).forEach(function (key) {
|
|
if (!hasOwn(curMessages, key)) {
|
|
curMessages[key] = message[key];
|
|
}
|
|
});
|
|
}
|
|
} else {
|
|
this.messages[locale] = message;
|
|
}
|
|
}
|
|
}, {
|
|
key: "f",
|
|
value: function f(message, values, delimiters) {
|
|
return this.formater.interpolate(message, values, delimiters).join('');
|
|
}
|
|
}, {
|
|
key: "t",
|
|
value: function t(key, locale, values) {
|
|
var message = this.message;
|
|
if (typeof locale === 'string') {
|
|
locale = normalizeLocale(locale, this.messages);
|
|
locale && (message = this.messages[locale]);
|
|
} else {
|
|
values = locale;
|
|
}
|
|
if (!hasOwn(message, key)) {
|
|
console.warn("Cannot translate the value of keypath ".concat(key, ". Use the value of keypath as default."));
|
|
return key;
|
|
}
|
|
return this.formater.interpolate(message[key], values).join('');
|
|
}
|
|
}]);
|
|
return I18n;
|
|
}();
|
|
exports.I18n = I18n;
|
|
function watchAppLocale(appVm, i18n) {
|
|
// 需要保证 watch 的触发在组件渲染之前
|
|
if (appVm.$watchLocale) {
|
|
// vue2
|
|
appVm.$watchLocale(function (newLocale) {
|
|
i18n.setLocale(newLocale);
|
|
});
|
|
} else {
|
|
appVm.$watch(function () {
|
|
return appVm.$locale;
|
|
}, function (newLocale) {
|
|
i18n.setLocale(newLocale);
|
|
});
|
|
}
|
|
}
|
|
function getDefaultLocale() {
|
|
if (typeof uni !== 'undefined' && uni.getLocale) {
|
|
return uni.getLocale();
|
|
}
|
|
// 小程序平台,uni 和 uni-i18n 互相引用,导致访问不到 uni,故在 global 上挂了 getLocale
|
|
if (typeof global !== 'undefined' && global.getLocale) {
|
|
return global.getLocale();
|
|
}
|
|
return LOCALE_EN;
|
|
}
|
|
function initVueI18n(locale) {
|
|
var messages = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
var fallbackLocale = arguments.length > 2 ? arguments[2] : undefined;
|
|
var watcher = arguments.length > 3 ? arguments[3] : undefined;
|
|
// 兼容旧版本入参
|
|
if (typeof locale !== 'string') {
|
|
var _ref4 = [messages, locale];
|
|
locale = _ref4[0];
|
|
messages = _ref4[1];
|
|
}
|
|
if (typeof locale !== 'string') {
|
|
// 因为小程序平台,uni-i18n 和 uni 互相引用,导致此时访问 uni 时,为 undefined
|
|
locale = getDefaultLocale();
|
|
}
|
|
if (typeof fallbackLocale !== 'string') {
|
|
fallbackLocale = typeof __uniConfig !== 'undefined' && __uniConfig.fallbackLocale || LOCALE_EN;
|
|
}
|
|
var i18n = new I18n({
|
|
locale: locale,
|
|
fallbackLocale: fallbackLocale,
|
|
messages: messages,
|
|
watcher: watcher
|
|
});
|
|
var _t = function t(key, values) {
|
|
if (typeof getApp !== 'function') {
|
|
// app view
|
|
/* eslint-disable no-func-assign */
|
|
_t = function t(key, values) {
|
|
return i18n.t(key, values);
|
|
};
|
|
} else {
|
|
var isWatchedAppLocale = false;
|
|
_t = function t(key, values) {
|
|
var appVm = getApp().$vm;
|
|
// 可能$vm还不存在,比如在支付宝小程序中,组件定义较早,在props的default里使用了t()函数(如uni-goods-nav),此时app还未初始化
|
|
// options: {
|
|
// type: Array,
|
|
// default () {
|
|
// return [{
|
|
// icon: 'shop',
|
|
// text: t("uni-goods-nav.options.shop"),
|
|
// }, {
|
|
// icon: 'cart',
|
|
// text: t("uni-goods-nav.options.cart")
|
|
// }]
|
|
// }
|
|
// },
|
|
if (appVm) {
|
|
// 触发响应式
|
|
appVm.$locale;
|
|
if (!isWatchedAppLocale) {
|
|
isWatchedAppLocale = true;
|
|
watchAppLocale(appVm, i18n);
|
|
}
|
|
}
|
|
return i18n.t(key, values);
|
|
};
|
|
}
|
|
return _t(key, values);
|
|
};
|
|
return {
|
|
i18n: i18n,
|
|
f: function f(message, values, delimiters) {
|
|
return i18n.f(message, values, delimiters);
|
|
},
|
|
t: function t(key, values) {
|
|
return _t(key, values);
|
|
},
|
|
add: function add(locale, message) {
|
|
var override = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
|
return i18n.add(locale, message, override);
|
|
},
|
|
watch: function watch(fn) {
|
|
return i18n.watchLocale(fn);
|
|
},
|
|
getLocale: function getLocale() {
|
|
return i18n.getLocale();
|
|
},
|
|
setLocale: function setLocale(newLocale) {
|
|
return i18n.setLocale(newLocale);
|
|
}
|
|
};
|
|
}
|
|
var isString = function isString(val) {
|
|
return typeof val === 'string';
|
|
};
|
|
exports.isString = isString;
|
|
var formater;
|
|
function hasI18nJson(jsonObj, delimiters) {
|
|
if (!formater) {
|
|
formater = new BaseFormatter();
|
|
}
|
|
return walkJsonObj(jsonObj, function (jsonObj, key) {
|
|
var value = jsonObj[key];
|
|
if (isString(value)) {
|
|
if (isI18nStr(value, delimiters)) {
|
|
return true;
|
|
}
|
|
} else {
|
|
return hasI18nJson(value, delimiters);
|
|
}
|
|
});
|
|
}
|
|
function parseI18nJson(jsonObj, values, delimiters) {
|
|
if (!formater) {
|
|
formater = new BaseFormatter();
|
|
}
|
|
walkJsonObj(jsonObj, function (jsonObj, key) {
|
|
var value = jsonObj[key];
|
|
if (isString(value)) {
|
|
if (isI18nStr(value, delimiters)) {
|
|
jsonObj[key] = compileStr(value, values, delimiters);
|
|
}
|
|
} else {
|
|
parseI18nJson(value, values, delimiters);
|
|
}
|
|
});
|
|
return jsonObj;
|
|
}
|
|
function compileI18nJsonStr(jsonStr, _ref5) {
|
|
var locale = _ref5.locale,
|
|
locales = _ref5.locales,
|
|
delimiters = _ref5.delimiters;
|
|
if (!isI18nStr(jsonStr, delimiters)) {
|
|
return jsonStr;
|
|
}
|
|
if (!formater) {
|
|
formater = new BaseFormatter();
|
|
}
|
|
var localeValues = [];
|
|
Object.keys(locales).forEach(function (name) {
|
|
if (name !== locale) {
|
|
localeValues.push({
|
|
locale: name,
|
|
values: locales[name]
|
|
});
|
|
}
|
|
});
|
|
localeValues.unshift({
|
|
locale: locale,
|
|
values: locales[locale]
|
|
});
|
|
try {
|
|
return JSON.stringify(compileJsonObj(JSON.parse(jsonStr), localeValues, delimiters), null, 2);
|
|
} catch (e) {}
|
|
return jsonStr;
|
|
}
|
|
function isI18nStr(value, delimiters) {
|
|
return value.indexOf(delimiters[0]) > -1;
|
|
}
|
|
function compileStr(value, values, delimiters) {
|
|
return formater.interpolate(value, values, delimiters).join('');
|
|
}
|
|
function compileValue(jsonObj, key, localeValues, delimiters) {
|
|
var value = jsonObj[key];
|
|
if (isString(value)) {
|
|
// 存在国际化
|
|
if (isI18nStr(value, delimiters)) {
|
|
jsonObj[key] = compileStr(value, localeValues[0].values, delimiters);
|
|
if (localeValues.length > 1) {
|
|
// 格式化国际化语言
|
|
var valueLocales = jsonObj[key + 'Locales'] = {};
|
|
localeValues.forEach(function (localValue) {
|
|
valueLocales[localValue.locale] = compileStr(value, localValue.values, delimiters);
|
|
});
|
|
}
|
|
}
|
|
} else {
|
|
compileJsonObj(value, localeValues, delimiters);
|
|
}
|
|
}
|
|
function compileJsonObj(jsonObj, localeValues, delimiters) {
|
|
walkJsonObj(jsonObj, function (jsonObj, key) {
|
|
compileValue(jsonObj, key, localeValues, delimiters);
|
|
});
|
|
return jsonObj;
|
|
}
|
|
function walkJsonObj(jsonObj, walk) {
|
|
if (Array.isArray(jsonObj)) {
|
|
for (var i = 0; i < jsonObj.length; i++) {
|
|
if (walk(jsonObj, i)) {
|
|
return true;
|
|
}
|
|
}
|
|
} else if (isObject(jsonObj)) {
|
|
for (var key in jsonObj) {
|
|
if (walk(jsonObj, key)) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function resolveLocale(locales) {
|
|
return function (locale) {
|
|
if (!locale) {
|
|
return locale;
|
|
}
|
|
locale = normalizeLocale(locale) || locale;
|
|
return resolveLocaleChain(locale).find(function (locale) {
|
|
return locales.indexOf(locale) > -1;
|
|
});
|
|
};
|
|
}
|
|
function resolveLocaleChain(locale) {
|
|
var chain = [];
|
|
var tokens = locale.split('-');
|
|
while (tokens.length) {
|
|
chain.push(tokens.join('-'));
|
|
tokens.pop();
|
|
}
|
|
return chain;
|
|
}
|
|
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-weixin/dist/index.js */ 2)["default"], __webpack_require__(/*! ./../../../webpack/buildin/global.js */ 3)))
|
|
|
|
/***/ }),
|
|
|
|
/***/ 23:
|
|
/*!***************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/classCallCheck.js ***!
|
|
\***************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
function _classCallCheck(instance, Constructor) {
|
|
if (!(instance instanceof Constructor)) {
|
|
throw new TypeError("Cannot call a class as a function");
|
|
}
|
|
}
|
|
module.exports = _classCallCheck, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 24:
|
|
/*!************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/createClass.js ***!
|
|
\************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var toPropertyKey = __webpack_require__(/*! ./toPropertyKey.js */ 12);
|
|
function _defineProperties(target, props) {
|
|
for (var i = 0; i < props.length; i++) {
|
|
var descriptor = props[i];
|
|
descriptor.enumerable = descriptor.enumerable || false;
|
|
descriptor.configurable = true;
|
|
if ("value" in descriptor) descriptor.writable = true;
|
|
Object.defineProperty(target, toPropertyKey(descriptor.key), descriptor);
|
|
}
|
|
}
|
|
function _createClass(Constructor, protoProps, staticProps) {
|
|
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
Object.defineProperty(Constructor, "prototype", {
|
|
writable: false
|
|
});
|
|
return Constructor;
|
|
}
|
|
module.exports = _createClass, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 25:
|
|
/*!******************************************************************************************!*\
|
|
!*** ./node_modules/@dcloudio/vue-cli-plugin-uni/packages/mp-vue/dist/mp.runtime.esm.js ***!
|
|
\******************************************************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* WEBPACK VAR INJECTION */(function(global) {/*!
|
|
* Vue.js v2.6.11
|
|
* (c) 2014-2023 Evan You
|
|
* Released under the MIT License.
|
|
*/
|
|
/* */
|
|
|
|
var emptyObject = Object.freeze({});
|
|
|
|
// These helpers produce better VM code in JS engines due to their
|
|
// explicitness and function inlining.
|
|
function isUndef (v) {
|
|
return v === undefined || v === null
|
|
}
|
|
|
|
function isDef (v) {
|
|
return v !== undefined && v !== null
|
|
}
|
|
|
|
function isTrue (v) {
|
|
return v === true
|
|
}
|
|
|
|
function isFalse (v) {
|
|
return v === false
|
|
}
|
|
|
|
/**
|
|
* Check if value is primitive.
|
|
*/
|
|
function isPrimitive (value) {
|
|
return (
|
|
typeof value === 'string' ||
|
|
typeof value === 'number' ||
|
|
// $flow-disable-line
|
|
typeof value === 'symbol' ||
|
|
typeof value === 'boolean'
|
|
)
|
|
}
|
|
|
|
/**
|
|
* Quick object check - this is primarily used to tell
|
|
* Objects from primitive values when we know the value
|
|
* is a JSON-compliant type.
|
|
*/
|
|
function isObject (obj) {
|
|
return obj !== null && typeof obj === 'object'
|
|
}
|
|
|
|
/**
|
|
* Get the raw type string of a value, e.g., [object Object].
|
|
*/
|
|
var _toString = Object.prototype.toString;
|
|
|
|
function toRawType (value) {
|
|
return _toString.call(value).slice(8, -1)
|
|
}
|
|
|
|
/**
|
|
* Strict object type check. Only returns true
|
|
* for plain JavaScript objects.
|
|
*/
|
|
function isPlainObject (obj) {
|
|
return _toString.call(obj) === '[object Object]'
|
|
}
|
|
|
|
function isRegExp (v) {
|
|
return _toString.call(v) === '[object RegExp]'
|
|
}
|
|
|
|
/**
|
|
* Check if val is a valid array index.
|
|
*/
|
|
function isValidArrayIndex (val) {
|
|
var n = parseFloat(String(val));
|
|
return n >= 0 && Math.floor(n) === n && isFinite(val)
|
|
}
|
|
|
|
function isPromise (val) {
|
|
return (
|
|
isDef(val) &&
|
|
typeof val.then === 'function' &&
|
|
typeof val.catch === 'function'
|
|
)
|
|
}
|
|
|
|
/**
|
|
* Convert a value to a string that is actually rendered.
|
|
*/
|
|
function toString (val) {
|
|
return val == null
|
|
? ''
|
|
: Array.isArray(val) || (isPlainObject(val) && val.toString === _toString)
|
|
? JSON.stringify(val, null, 2)
|
|
: String(val)
|
|
}
|
|
|
|
/**
|
|
* Convert an input value to a number for persistence.
|
|
* If the conversion fails, return original string.
|
|
*/
|
|
function toNumber (val) {
|
|
var n = parseFloat(val);
|
|
return isNaN(n) ? val : n
|
|
}
|
|
|
|
/**
|
|
* Make a map and return a function for checking if a key
|
|
* is in that map.
|
|
*/
|
|
function makeMap (
|
|
str,
|
|
expectsLowerCase
|
|
) {
|
|
var map = Object.create(null);
|
|
var list = str.split(',');
|
|
for (var i = 0; i < list.length; i++) {
|
|
map[list[i]] = true;
|
|
}
|
|
return expectsLowerCase
|
|
? function (val) { return map[val.toLowerCase()]; }
|
|
: function (val) { return map[val]; }
|
|
}
|
|
|
|
/**
|
|
* Check if a tag is a built-in tag.
|
|
*/
|
|
var isBuiltInTag = makeMap('slot,component', true);
|
|
|
|
/**
|
|
* Check if an attribute is a reserved attribute.
|
|
*/
|
|
var isReservedAttribute = makeMap('key,ref,slot,slot-scope,is');
|
|
|
|
/**
|
|
* Remove an item from an array.
|
|
*/
|
|
function remove (arr, item) {
|
|
if (arr.length) {
|
|
var index = arr.indexOf(item);
|
|
if (index > -1) {
|
|
return arr.splice(index, 1)
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check whether an object has the property.
|
|
*/
|
|
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
function hasOwn (obj, key) {
|
|
return hasOwnProperty.call(obj, key)
|
|
}
|
|
|
|
/**
|
|
* Create a cached version of a pure function.
|
|
*/
|
|
function cached (fn) {
|
|
var cache = Object.create(null);
|
|
return (function cachedFn (str) {
|
|
var hit = cache[str];
|
|
return hit || (cache[str] = fn(str))
|
|
})
|
|
}
|
|
|
|
/**
|
|
* Camelize a hyphen-delimited string.
|
|
*/
|
|
var camelizeRE = /-(\w)/g;
|
|
var camelize = cached(function (str) {
|
|
return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })
|
|
});
|
|
|
|
/**
|
|
* Capitalize a string.
|
|
*/
|
|
var capitalize = cached(function (str) {
|
|
return str.charAt(0).toUpperCase() + str.slice(1)
|
|
});
|
|
|
|
/**
|
|
* Hyphenate a camelCase string.
|
|
*/
|
|
var hyphenateRE = /\B([A-Z])/g;
|
|
var hyphenate = cached(function (str) {
|
|
return str.replace(hyphenateRE, '-$1').toLowerCase()
|
|
});
|
|
|
|
/**
|
|
* Simple bind polyfill for environments that do not support it,
|
|
* e.g., PhantomJS 1.x. Technically, we don't need this anymore
|
|
* since native bind is now performant enough in most browsers.
|
|
* But removing it would mean breaking code that was able to run in
|
|
* PhantomJS 1.x, so this must be kept for backward compatibility.
|
|
*/
|
|
|
|
/* istanbul ignore next */
|
|
function polyfillBind (fn, ctx) {
|
|
function boundFn (a) {
|
|
var l = arguments.length;
|
|
return l
|
|
? l > 1
|
|
? fn.apply(ctx, arguments)
|
|
: fn.call(ctx, a)
|
|
: fn.call(ctx)
|
|
}
|
|
|
|
boundFn._length = fn.length;
|
|
return boundFn
|
|
}
|
|
|
|
function nativeBind (fn, ctx) {
|
|
return fn.bind(ctx)
|
|
}
|
|
|
|
var bind = Function.prototype.bind
|
|
? nativeBind
|
|
: polyfillBind;
|
|
|
|
/**
|
|
* Convert an Array-like object to a real Array.
|
|
*/
|
|
function toArray (list, start) {
|
|
start = start || 0;
|
|
var i = list.length - start;
|
|
var ret = new Array(i);
|
|
while (i--) {
|
|
ret[i] = list[i + start];
|
|
}
|
|
return ret
|
|
}
|
|
|
|
/**
|
|
* Mix properties into target object.
|
|
*/
|
|
function extend (to, _from) {
|
|
for (var key in _from) {
|
|
to[key] = _from[key];
|
|
}
|
|
return to
|
|
}
|
|
|
|
/**
|
|
* Merge an Array of Objects into a single Object.
|
|
*/
|
|
function toObject (arr) {
|
|
var res = {};
|
|
for (var i = 0; i < arr.length; i++) {
|
|
if (arr[i]) {
|
|
extend(res, arr[i]);
|
|
}
|
|
}
|
|
return res
|
|
}
|
|
|
|
/* eslint-disable no-unused-vars */
|
|
|
|
/**
|
|
* Perform no operation.
|
|
* Stubbing args to make Flow happy without leaving useless transpiled code
|
|
* with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/).
|
|
*/
|
|
function noop (a, b, c) {}
|
|
|
|
/**
|
|
* Always return false.
|
|
*/
|
|
var no = function (a, b, c) { return false; };
|
|
|
|
/* eslint-enable no-unused-vars */
|
|
|
|
/**
|
|
* Return the same value.
|
|
*/
|
|
var identity = function (_) { return _; };
|
|
|
|
/**
|
|
* Check if two values are loosely equal - that is,
|
|
* if they are plain objects, do they have the same shape?
|
|
*/
|
|
function looseEqual (a, b) {
|
|
if (a === b) { return true }
|
|
var isObjectA = isObject(a);
|
|
var isObjectB = isObject(b);
|
|
if (isObjectA && isObjectB) {
|
|
try {
|
|
var isArrayA = Array.isArray(a);
|
|
var isArrayB = Array.isArray(b);
|
|
if (isArrayA && isArrayB) {
|
|
return a.length === b.length && a.every(function (e, i) {
|
|
return looseEqual(e, b[i])
|
|
})
|
|
} else if (a instanceof Date && b instanceof Date) {
|
|
return a.getTime() === b.getTime()
|
|
} else if (!isArrayA && !isArrayB) {
|
|
var keysA = Object.keys(a);
|
|
var keysB = Object.keys(b);
|
|
return keysA.length === keysB.length && keysA.every(function (key) {
|
|
return looseEqual(a[key], b[key])
|
|
})
|
|
} else {
|
|
/* istanbul ignore next */
|
|
return false
|
|
}
|
|
} catch (e) {
|
|
/* istanbul ignore next */
|
|
return false
|
|
}
|
|
} else if (!isObjectA && !isObjectB) {
|
|
return String(a) === String(b)
|
|
} else {
|
|
return false
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Return the first index at which a loosely equal value can be
|
|
* found in the array (if value is a plain object, the array must
|
|
* contain an object of the same shape), or -1 if it is not present.
|
|
*/
|
|
function looseIndexOf (arr, val) {
|
|
for (var i = 0; i < arr.length; i++) {
|
|
if (looseEqual(arr[i], val)) { return i }
|
|
}
|
|
return -1
|
|
}
|
|
|
|
/**
|
|
* Ensure a function is called only once.
|
|
*/
|
|
function once (fn) {
|
|
var called = false;
|
|
return function () {
|
|
if (!called) {
|
|
called = true;
|
|
fn.apply(this, arguments);
|
|
}
|
|
}
|
|
}
|
|
|
|
var ASSET_TYPES = [
|
|
'component',
|
|
'directive',
|
|
'filter'
|
|
];
|
|
|
|
var LIFECYCLE_HOOKS = [
|
|
'beforeCreate',
|
|
'created',
|
|
'beforeMount',
|
|
'mounted',
|
|
'beforeUpdate',
|
|
'updated',
|
|
'beforeDestroy',
|
|
'destroyed',
|
|
'activated',
|
|
'deactivated',
|
|
'errorCaptured',
|
|
'serverPrefetch'
|
|
];
|
|
|
|
/* */
|
|
|
|
|
|
|
|
var config = ({
|
|
/**
|
|
* Option merge strategies (used in core/util/options)
|
|
*/
|
|
// $flow-disable-line
|
|
optionMergeStrategies: Object.create(null),
|
|
|
|
/**
|
|
* Whether to suppress warnings.
|
|
*/
|
|
silent: false,
|
|
|
|
/**
|
|
* Show production mode tip message on boot?
|
|
*/
|
|
productionTip: "development" !== 'production',
|
|
|
|
/**
|
|
* Whether to enable devtools
|
|
*/
|
|
devtools: "development" !== 'production',
|
|
|
|
/**
|
|
* Whether to record perf
|
|
*/
|
|
performance: false,
|
|
|
|
/**
|
|
* Error handler for watcher errors
|
|
*/
|
|
errorHandler: null,
|
|
|
|
/**
|
|
* Warn handler for watcher warns
|
|
*/
|
|
warnHandler: null,
|
|
|
|
/**
|
|
* Ignore certain custom elements
|
|
*/
|
|
ignoredElements: [],
|
|
|
|
/**
|
|
* Custom user key aliases for v-on
|
|
*/
|
|
// $flow-disable-line
|
|
keyCodes: Object.create(null),
|
|
|
|
/**
|
|
* Check if a tag is reserved so that it cannot be registered as a
|
|
* component. This is platform-dependent and may be overwritten.
|
|
*/
|
|
isReservedTag: no,
|
|
|
|
/**
|
|
* Check if an attribute is reserved so that it cannot be used as a component
|
|
* prop. This is platform-dependent and may be overwritten.
|
|
*/
|
|
isReservedAttr: no,
|
|
|
|
/**
|
|
* Check if a tag is an unknown element.
|
|
* Platform-dependent.
|
|
*/
|
|
isUnknownElement: no,
|
|
|
|
/**
|
|
* Get the namespace of an element
|
|
*/
|
|
getTagNamespace: noop,
|
|
|
|
/**
|
|
* Parse the real tag name for the specific platform.
|
|
*/
|
|
parsePlatformTagName: identity,
|
|
|
|
/**
|
|
* Check if an attribute must be bound using property, e.g. value
|
|
* Platform-dependent.
|
|
*/
|
|
mustUseProp: no,
|
|
|
|
/**
|
|
* Perform updates asynchronously. Intended to be used by Vue Test Utils
|
|
* This will significantly reduce performance if set to false.
|
|
*/
|
|
async: true,
|
|
|
|
/**
|
|
* Exposed for legacy reasons
|
|
*/
|
|
_lifecycleHooks: LIFECYCLE_HOOKS
|
|
});
|
|
|
|
/* */
|
|
|
|
/**
|
|
* unicode letters used for parsing html tags, component names and property paths.
|
|
* using https://www.w3.org/TR/html53/semantics-scripting.html#potentialcustomelementname
|
|
* skipping \u10000-\uEFFFF due to it freezing up PhantomJS
|
|
*/
|
|
var unicodeRegExp = /a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/;
|
|
|
|
/**
|
|
* Check if a string starts with $ or _
|
|
*/
|
|
function isReserved (str) {
|
|
var c = (str + '').charCodeAt(0);
|
|
return c === 0x24 || c === 0x5F
|
|
}
|
|
|
|
/**
|
|
* Define a property.
|
|
*/
|
|
function def (obj, key, val, enumerable) {
|
|
Object.defineProperty(obj, key, {
|
|
value: val,
|
|
enumerable: !!enumerable,
|
|
writable: true,
|
|
configurable: true
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Parse simple path.
|
|
*/
|
|
var bailRE = new RegExp(("[^" + (unicodeRegExp.source) + ".$_\\d]"));
|
|
function parsePath (path) {
|
|
if (bailRE.test(path)) {
|
|
return
|
|
}
|
|
var segments = path.split('.');
|
|
return function (obj) {
|
|
for (var i = 0; i < segments.length; i++) {
|
|
if (!obj) { return }
|
|
obj = obj[segments[i]];
|
|
}
|
|
return obj
|
|
}
|
|
}
|
|
|
|
/* */
|
|
|
|
// can we use __proto__?
|
|
var hasProto = '__proto__' in {};
|
|
|
|
// Browser environment sniffing
|
|
var inBrowser = typeof window !== 'undefined';
|
|
var inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;
|
|
var weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();
|
|
var UA = inBrowser && window.navigator.userAgent.toLowerCase();
|
|
var isIE = UA && /msie|trident/.test(UA);
|
|
var isIE9 = UA && UA.indexOf('msie 9.0') > 0;
|
|
var isEdge = UA && UA.indexOf('edge/') > 0;
|
|
var isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android');
|
|
var isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');
|
|
var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge;
|
|
var isPhantomJS = UA && /phantomjs/.test(UA);
|
|
var isFF = UA && UA.match(/firefox\/(\d+)/);
|
|
|
|
// Firefox has a "watch" function on Object.prototype...
|
|
var nativeWatch = ({}).watch;
|
|
if (inBrowser) {
|
|
try {
|
|
var opts = {};
|
|
Object.defineProperty(opts, 'passive', ({
|
|
get: function get () {
|
|
}
|
|
})); // https://github.com/facebook/flow/issues/285
|
|
window.addEventListener('test-passive', null, opts);
|
|
} catch (e) {}
|
|
}
|
|
|
|
// this needs to be lazy-evaled because vue may be required before
|
|
// vue-server-renderer can set VUE_ENV
|
|
var _isServer;
|
|
var isServerRendering = function () {
|
|
if (_isServer === undefined) {
|
|
/* istanbul ignore if */
|
|
if (!inBrowser && !inWeex && typeof global !== 'undefined') {
|
|
// detect presence of vue-server-renderer and avoid
|
|
// Webpack shimming the process
|
|
_isServer = global['process'] && global['process'].env.VUE_ENV === 'server';
|
|
} else {
|
|
_isServer = false;
|
|
}
|
|
}
|
|
return _isServer
|
|
};
|
|
|
|
// detect devtools
|
|
var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;
|
|
|
|
/* istanbul ignore next */
|
|
function isNative (Ctor) {
|
|
return typeof Ctor === 'function' && /native code/.test(Ctor.toString())
|
|
}
|
|
|
|
var hasSymbol =
|
|
typeof Symbol !== 'undefined' && isNative(Symbol) &&
|
|
typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys);
|
|
|
|
var _Set;
|
|
/* istanbul ignore if */ // $flow-disable-line
|
|
if (typeof Set !== 'undefined' && isNative(Set)) {
|
|
// use native Set when available.
|
|
_Set = Set;
|
|
} else {
|
|
// a non-standard Set polyfill that only works with primitive keys.
|
|
_Set = /*@__PURE__*/(function () {
|
|
function Set () {
|
|
this.set = Object.create(null);
|
|
}
|
|
Set.prototype.has = function has (key) {
|
|
return this.set[key] === true
|
|
};
|
|
Set.prototype.add = function add (key) {
|
|
this.set[key] = true;
|
|
};
|
|
Set.prototype.clear = function clear () {
|
|
this.set = Object.create(null);
|
|
};
|
|
|
|
return Set;
|
|
}());
|
|
}
|
|
|
|
/* */
|
|
|
|
var warn = noop;
|
|
var tip = noop;
|
|
var generateComponentTrace = (noop); // work around flow check
|
|
var formatComponentName = (noop);
|
|
|
|
if (true) {
|
|
var hasConsole = typeof console !== 'undefined';
|
|
var classifyRE = /(?:^|[-_])(\w)/g;
|
|
var classify = function (str) { return str
|
|
.replace(classifyRE, function (c) { return c.toUpperCase(); })
|
|
.replace(/[-_]/g, ''); };
|
|
|
|
warn = function (msg, vm) {
|
|
var trace = vm ? generateComponentTrace(vm) : '';
|
|
|
|
if (config.warnHandler) {
|
|
config.warnHandler.call(null, msg, vm, trace);
|
|
} else if (hasConsole && (!config.silent)) {
|
|
console.error(("[Vue warn]: " + msg + trace));
|
|
}
|
|
};
|
|
|
|
tip = function (msg, vm) {
|
|
if (hasConsole && (!config.silent)) {
|
|
console.warn("[Vue tip]: " + msg + (
|
|
vm ? generateComponentTrace(vm) : ''
|
|
));
|
|
}
|
|
};
|
|
|
|
formatComponentName = function (vm, includeFile) {
|
|
if (vm.$root === vm) {
|
|
if (vm.$options && vm.$options.__file) { // fixed by xxxxxx
|
|
return ('') + vm.$options.__file
|
|
}
|
|
return '<Root>'
|
|
}
|
|
var options = typeof vm === 'function' && vm.cid != null
|
|
? vm.options
|
|
: vm._isVue
|
|
? vm.$options || vm.constructor.options
|
|
: vm;
|
|
var name = options.name || options._componentTag;
|
|
var file = options.__file;
|
|
if (!name && file) {
|
|
var match = file.match(/([^/\\]+)\.vue$/);
|
|
name = match && match[1];
|
|
}
|
|
|
|
return (
|
|
(name ? ("<" + (classify(name)) + ">") : "<Anonymous>") +
|
|
(file && includeFile !== false ? (" at " + file) : '')
|
|
)
|
|
};
|
|
|
|
var repeat = function (str, n) {
|
|
var res = '';
|
|
while (n) {
|
|
if (n % 2 === 1) { res += str; }
|
|
if (n > 1) { str += str; }
|
|
n >>= 1;
|
|
}
|
|
return res
|
|
};
|
|
|
|
generateComponentTrace = function (vm) {
|
|
if (vm._isVue && vm.$parent) {
|
|
var tree = [];
|
|
var currentRecursiveSequence = 0;
|
|
while (vm && vm.$options.name !== 'PageBody') {
|
|
if (tree.length > 0) {
|
|
var last = tree[tree.length - 1];
|
|
if (last.constructor === vm.constructor) {
|
|
currentRecursiveSequence++;
|
|
vm = vm.$parent;
|
|
continue
|
|
} else if (currentRecursiveSequence > 0) {
|
|
tree[tree.length - 1] = [last, currentRecursiveSequence];
|
|
currentRecursiveSequence = 0;
|
|
}
|
|
}
|
|
!vm.$options.isReserved && tree.push(vm);
|
|
vm = vm.$parent;
|
|
}
|
|
return '\n\nfound in\n\n' + tree
|
|
.map(function (vm, i) { return ("" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm)
|
|
? ((formatComponentName(vm[0])) + "... (" + (vm[1]) + " recursive calls)")
|
|
: formatComponentName(vm))); })
|
|
.join('\n')
|
|
} else {
|
|
return ("\n\n(found in " + (formatComponentName(vm)) + ")")
|
|
}
|
|
};
|
|
}
|
|
|
|
/* */
|
|
|
|
var uid = 0;
|
|
|
|
/**
|
|
* A dep is an observable that can have multiple
|
|
* directives subscribing to it.
|
|
*/
|
|
var Dep = function Dep () {
|
|
this.id = uid++;
|
|
this.subs = [];
|
|
};
|
|
|
|
Dep.prototype.addSub = function addSub (sub) {
|
|
this.subs.push(sub);
|
|
};
|
|
|
|
Dep.prototype.removeSub = function removeSub (sub) {
|
|
remove(this.subs, sub);
|
|
};
|
|
|
|
Dep.prototype.depend = function depend () {
|
|
if (Dep.SharedObject.target) {
|
|
Dep.SharedObject.target.addDep(this);
|
|
}
|
|
};
|
|
|
|
Dep.prototype.notify = function notify () {
|
|
// stabilize the subscriber list first
|
|
var subs = this.subs.slice();
|
|
if ( true && !config.async) {
|
|
// subs aren't sorted in scheduler if not running async
|
|
// we need to sort them now to make sure they fire in correct
|
|
// order
|
|
subs.sort(function (a, b) { return a.id - b.id; });
|
|
}
|
|
for (var i = 0, l = subs.length; i < l; i++) {
|
|
subs[i].update();
|
|
}
|
|
};
|
|
|
|
// The current target watcher being evaluated.
|
|
// This is globally unique because only one watcher
|
|
// can be evaluated at a time.
|
|
// fixed by xxxxxx (nvue shared vuex)
|
|
/* eslint-disable no-undef */
|
|
Dep.SharedObject = {};
|
|
Dep.SharedObject.target = null;
|
|
Dep.SharedObject.targetStack = [];
|
|
|
|
function pushTarget (target) {
|
|
Dep.SharedObject.targetStack.push(target);
|
|
Dep.SharedObject.target = target;
|
|
Dep.target = target;
|
|
}
|
|
|
|
function popTarget () {
|
|
Dep.SharedObject.targetStack.pop();
|
|
Dep.SharedObject.target = Dep.SharedObject.targetStack[Dep.SharedObject.targetStack.length - 1];
|
|
Dep.target = Dep.SharedObject.target;
|
|
}
|
|
|
|
/* */
|
|
|
|
var VNode = function VNode (
|
|
tag,
|
|
data,
|
|
children,
|
|
text,
|
|
elm,
|
|
context,
|
|
componentOptions,
|
|
asyncFactory
|
|
) {
|
|
this.tag = tag;
|
|
this.data = data;
|
|
this.children = children;
|
|
this.text = text;
|
|
this.elm = elm;
|
|
this.ns = undefined;
|
|
this.context = context;
|
|
this.fnContext = undefined;
|
|
this.fnOptions = undefined;
|
|
this.fnScopeId = undefined;
|
|
this.key = data && data.key;
|
|
this.componentOptions = componentOptions;
|
|
this.componentInstance = undefined;
|
|
this.parent = undefined;
|
|
this.raw = false;
|
|
this.isStatic = false;
|
|
this.isRootInsert = true;
|
|
this.isComment = false;
|
|
this.isCloned = false;
|
|
this.isOnce = false;
|
|
this.asyncFactory = asyncFactory;
|
|
this.asyncMeta = undefined;
|
|
this.isAsyncPlaceholder = false;
|
|
};
|
|
|
|
var prototypeAccessors = { child: { configurable: true } };
|
|
|
|
// DEPRECATED: alias for componentInstance for backwards compat.
|
|
/* istanbul ignore next */
|
|
prototypeAccessors.child.get = function () {
|
|
return this.componentInstance
|
|
};
|
|
|
|
Object.defineProperties( VNode.prototype, prototypeAccessors );
|
|
|
|
var createEmptyVNode = function (text) {
|
|
if ( text === void 0 ) text = '';
|
|
|
|
var node = new VNode();
|
|
node.text = text;
|
|
node.isComment = true;
|
|
return node
|
|
};
|
|
|
|
function createTextVNode (val) {
|
|
return new VNode(undefined, undefined, undefined, String(val))
|
|
}
|
|
|
|
// optimized shallow clone
|
|
// used for static nodes and slot nodes because they may be reused across
|
|
// multiple renders, cloning them avoids errors when DOM manipulations rely
|
|
// on their elm reference.
|
|
function cloneVNode (vnode) {
|
|
var cloned = new VNode(
|
|
vnode.tag,
|
|
vnode.data,
|
|
// #7975
|
|
// clone children array to avoid mutating original in case of cloning
|
|
// a child.
|
|
vnode.children && vnode.children.slice(),
|
|
vnode.text,
|
|
vnode.elm,
|
|
vnode.context,
|
|
vnode.componentOptions,
|
|
vnode.asyncFactory
|
|
);
|
|
cloned.ns = vnode.ns;
|
|
cloned.isStatic = vnode.isStatic;
|
|
cloned.key = vnode.key;
|
|
cloned.isComment = vnode.isComment;
|
|
cloned.fnContext = vnode.fnContext;
|
|
cloned.fnOptions = vnode.fnOptions;
|
|
cloned.fnScopeId = vnode.fnScopeId;
|
|
cloned.asyncMeta = vnode.asyncMeta;
|
|
cloned.isCloned = true;
|
|
return cloned
|
|
}
|
|
|
|
/*
|
|
* not type checking this file because flow doesn't play well with
|
|
* dynamically accessing methods on Array prototype
|
|
*/
|
|
|
|
var arrayProto = Array.prototype;
|
|
var arrayMethods = Object.create(arrayProto);
|
|
|
|
var methodsToPatch = [
|
|
'push',
|
|
'pop',
|
|
'shift',
|
|
'unshift',
|
|
'splice',
|
|
'sort',
|
|
'reverse'
|
|
];
|
|
|
|
/**
|
|
* Intercept mutating methods and emit events
|
|
*/
|
|
methodsToPatch.forEach(function (method) {
|
|
// cache original method
|
|
var original = arrayProto[method];
|
|
def(arrayMethods, method, function mutator () {
|
|
var args = [], len = arguments.length;
|
|
while ( len-- ) args[ len ] = arguments[ len ];
|
|
|
|
var result = original.apply(this, args);
|
|
var ob = this.__ob__;
|
|
var inserted;
|
|
switch (method) {
|
|
case 'push':
|
|
case 'unshift':
|
|
inserted = args;
|
|
break
|
|
case 'splice':
|
|
inserted = args.slice(2);
|
|
break
|
|
}
|
|
if (inserted) { ob.observeArray(inserted); }
|
|
// notify change
|
|
ob.dep.notify();
|
|
return result
|
|
});
|
|
});
|
|
|
|
/* */
|
|
|
|
var arrayKeys = Object.getOwnPropertyNames(arrayMethods);
|
|
|
|
/**
|
|
* In some cases we may want to disable observation inside a component's
|
|
* update computation.
|
|
*/
|
|
var shouldObserve = true;
|
|
|
|
function toggleObserving (value) {
|
|
shouldObserve = value;
|
|
}
|
|
|
|
/**
|
|
* Observer class that is attached to each observed
|
|
* object. Once attached, the observer converts the target
|
|
* object's property keys into getter/setters that
|
|
* collect dependencies and dispatch updates.
|
|
*/
|
|
var Observer = function Observer (value) {
|
|
this.value = value;
|
|
this.dep = new Dep();
|
|
this.vmCount = 0;
|
|
def(value, '__ob__', this);
|
|
if (Array.isArray(value)) {
|
|
if (hasProto) {
|
|
{// fixed by xxxxxx 微信小程序使用 plugins 之后,数组方法被直接挂载到了数组对象上,需要执行 copyAugment 逻辑
|
|
if(value.push !== value.__proto__.push){
|
|
copyAugment(value, arrayMethods, arrayKeys);
|
|
} else {
|
|
protoAugment(value, arrayMethods);
|
|
}
|
|
}
|
|
} else {
|
|
copyAugment(value, arrayMethods, arrayKeys);
|
|
}
|
|
this.observeArray(value);
|
|
} else {
|
|
this.walk(value);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Walk through all properties and convert them into
|
|
* getter/setters. This method should only be called when
|
|
* value type is Object.
|
|
*/
|
|
Observer.prototype.walk = function walk (obj) {
|
|
var keys = Object.keys(obj);
|
|
for (var i = 0; i < keys.length; i++) {
|
|
defineReactive$$1(obj, keys[i]);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Observe a list of Array items.
|
|
*/
|
|
Observer.prototype.observeArray = function observeArray (items) {
|
|
for (var i = 0, l = items.length; i < l; i++) {
|
|
observe(items[i]);
|
|
}
|
|
};
|
|
|
|
// helpers
|
|
|
|
/**
|
|
* Augment a target Object or Array by intercepting
|
|
* the prototype chain using __proto__
|
|
*/
|
|
function protoAugment (target, src) {
|
|
/* eslint-disable no-proto */
|
|
target.__proto__ = src;
|
|
/* eslint-enable no-proto */
|
|
}
|
|
|
|
/**
|
|
* Augment a target Object or Array by defining
|
|
* hidden properties.
|
|
*/
|
|
/* istanbul ignore next */
|
|
function copyAugment (target, src, keys) {
|
|
for (var i = 0, l = keys.length; i < l; i++) {
|
|
var key = keys[i];
|
|
def(target, key, src[key]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Attempt to create an observer instance for a value,
|
|
* returns the new observer if successfully observed,
|
|
* or the existing observer if the value already has one.
|
|
*/
|
|
function observe (value, asRootData) {
|
|
if (!isObject(value) || value instanceof VNode) {
|
|
return
|
|
}
|
|
var ob;
|
|
if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
|
|
ob = value.__ob__;
|
|
} else if (
|
|
shouldObserve &&
|
|
!isServerRendering() &&
|
|
(Array.isArray(value) || isPlainObject(value)) &&
|
|
Object.isExtensible(value) &&
|
|
!value._isVue &&
|
|
!value.__v_isMPComponent
|
|
) {
|
|
ob = new Observer(value);
|
|
}
|
|
if (asRootData && ob) {
|
|
ob.vmCount++;
|
|
}
|
|
return ob
|
|
}
|
|
|
|
/**
|
|
* Define a reactive property on an Object.
|
|
*/
|
|
function defineReactive$$1 (
|
|
obj,
|
|
key,
|
|
val,
|
|
customSetter,
|
|
shallow
|
|
) {
|
|
var dep = new Dep();
|
|
|
|
var property = Object.getOwnPropertyDescriptor(obj, key);
|
|
if (property && property.configurable === false) {
|
|
return
|
|
}
|
|
|
|
// cater for pre-defined getter/setters
|
|
var getter = property && property.get;
|
|
var setter = property && property.set;
|
|
if ((!getter || setter) && arguments.length === 2) {
|
|
val = obj[key];
|
|
}
|
|
|
|
var childOb = !shallow && observe(val);
|
|
Object.defineProperty(obj, key, {
|
|
enumerable: true,
|
|
configurable: true,
|
|
get: function reactiveGetter () {
|
|
var value = getter ? getter.call(obj) : val;
|
|
if (Dep.SharedObject.target) { // fixed by xxxxxx
|
|
dep.depend();
|
|
if (childOb) {
|
|
childOb.dep.depend();
|
|
if (Array.isArray(value)) {
|
|
dependArray(value);
|
|
}
|
|
}
|
|
}
|
|
return value
|
|
},
|
|
set: function reactiveSetter (newVal) {
|
|
var value = getter ? getter.call(obj) : val;
|
|
/* eslint-disable no-self-compare */
|
|
if (newVal === value || (newVal !== newVal && value !== value)) {
|
|
return
|
|
}
|
|
/* eslint-enable no-self-compare */
|
|
if ( true && customSetter) {
|
|
customSetter();
|
|
}
|
|
// #7981: for accessor properties without setter
|
|
if (getter && !setter) { return }
|
|
if (setter) {
|
|
setter.call(obj, newVal);
|
|
} else {
|
|
val = newVal;
|
|
}
|
|
childOb = !shallow && observe(newVal);
|
|
dep.notify();
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Set a property on an object. Adds the new property and
|
|
* triggers change notification if the property doesn't
|
|
* already exist.
|
|
*/
|
|
function set (target, key, val) {
|
|
if ( true &&
|
|
(isUndef(target) || isPrimitive(target))
|
|
) {
|
|
warn(("Cannot set reactive property on undefined, null, or primitive value: " + ((target))));
|
|
}
|
|
if (Array.isArray(target) && isValidArrayIndex(key)) {
|
|
target.length = Math.max(target.length, key);
|
|
target.splice(key, 1, val);
|
|
return val
|
|
}
|
|
if (key in target && !(key in Object.prototype)) {
|
|
target[key] = val;
|
|
return val
|
|
}
|
|
var ob = (target).__ob__;
|
|
if (target._isVue || (ob && ob.vmCount)) {
|
|
true && warn(
|
|
'Avoid adding reactive properties to a Vue instance or its root $data ' +
|
|
'at runtime - declare it upfront in the data option.'
|
|
);
|
|
return val
|
|
}
|
|
if (!ob) {
|
|
target[key] = val;
|
|
return val
|
|
}
|
|
defineReactive$$1(ob.value, key, val);
|
|
ob.dep.notify();
|
|
return val
|
|
}
|
|
|
|
/**
|
|
* Delete a property and trigger change if necessary.
|
|
*/
|
|
function del (target, key) {
|
|
if ( true &&
|
|
(isUndef(target) || isPrimitive(target))
|
|
) {
|
|
warn(("Cannot delete reactive property on undefined, null, or primitive value: " + ((target))));
|
|
}
|
|
if (Array.isArray(target) && isValidArrayIndex(key)) {
|
|
target.splice(key, 1);
|
|
return
|
|
}
|
|
var ob = (target).__ob__;
|
|
if (target._isVue || (ob && ob.vmCount)) {
|
|
true && warn(
|
|
'Avoid deleting properties on a Vue instance or its root $data ' +
|
|
'- just set it to null.'
|
|
);
|
|
return
|
|
}
|
|
if (!hasOwn(target, key)) {
|
|
return
|
|
}
|
|
delete target[key];
|
|
if (!ob) {
|
|
return
|
|
}
|
|
ob.dep.notify();
|
|
}
|
|
|
|
/**
|
|
* Collect dependencies on array elements when the array is touched, since
|
|
* we cannot intercept array element access like property getters.
|
|
*/
|
|
function dependArray (value) {
|
|
for (var e = (void 0), i = 0, l = value.length; i < l; i++) {
|
|
e = value[i];
|
|
e && e.__ob__ && e.__ob__.dep.depend();
|
|
if (Array.isArray(e)) {
|
|
dependArray(e);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* */
|
|
|
|
/**
|
|
* Option overwriting strategies are functions that handle
|
|
* how to merge a parent option value and a child option
|
|
* value into the final value.
|
|
*/
|
|
var strats = config.optionMergeStrategies;
|
|
|
|
/**
|
|
* Options with restrictions
|
|
*/
|
|
if (true) {
|
|
strats.el = strats.propsData = function (parent, child, vm, key) {
|
|
if (!vm) {
|
|
warn(
|
|
"option \"" + key + "\" can only be used during instance " +
|
|
'creation with the `new` keyword.'
|
|
);
|
|
}
|
|
return defaultStrat(parent, child)
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Helper that recursively merges two data objects together.
|
|
*/
|
|
function mergeData (to, from) {
|
|
if (!from) { return to }
|
|
var key, toVal, fromVal;
|
|
|
|
var keys = hasSymbol
|
|
? Reflect.ownKeys(from)
|
|
: Object.keys(from);
|
|
|
|
for (var i = 0; i < keys.length; i++) {
|
|
key = keys[i];
|
|
// in case the object is already observed...
|
|
if (key === '__ob__') { continue }
|
|
toVal = to[key];
|
|
fromVal = from[key];
|
|
if (!hasOwn(to, key)) {
|
|
set(to, key, fromVal);
|
|
} else if (
|
|
toVal !== fromVal &&
|
|
isPlainObject(toVal) &&
|
|
isPlainObject(fromVal)
|
|
) {
|
|
mergeData(toVal, fromVal);
|
|
}
|
|
}
|
|
return to
|
|
}
|
|
|
|
/**
|
|
* Data
|
|
*/
|
|
function mergeDataOrFn (
|
|
parentVal,
|
|
childVal,
|
|
vm
|
|
) {
|
|
if (!vm) {
|
|
// in a Vue.extend merge, both should be functions
|
|
if (!childVal) {
|
|
return parentVal
|
|
}
|
|
if (!parentVal) {
|
|
return childVal
|
|
}
|
|
// when parentVal & childVal are both present,
|
|
// we need to return a function that returns the
|
|
// merged result of both functions... no need to
|
|
// check if parentVal is a function here because
|
|
// it has to be a function to pass previous merges.
|
|
return function mergedDataFn () {
|
|
return mergeData(
|
|
typeof childVal === 'function' ? childVal.call(this, this) : childVal,
|
|
typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal
|
|
)
|
|
}
|
|
} else {
|
|
return function mergedInstanceDataFn () {
|
|
// instance merge
|
|
var instanceData = typeof childVal === 'function'
|
|
? childVal.call(vm, vm)
|
|
: childVal;
|
|
var defaultData = typeof parentVal === 'function'
|
|
? parentVal.call(vm, vm)
|
|
: parentVal;
|
|
if (instanceData) {
|
|
return mergeData(instanceData, defaultData)
|
|
} else {
|
|
return defaultData
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
strats.data = function (
|
|
parentVal,
|
|
childVal,
|
|
vm
|
|
) {
|
|
if (!vm) {
|
|
if (childVal && typeof childVal !== 'function') {
|
|
true && warn(
|
|
'The "data" option should be a function ' +
|
|
'that returns a per-instance value in component ' +
|
|
'definitions.',
|
|
vm
|
|
);
|
|
|
|
return parentVal
|
|
}
|
|
return mergeDataOrFn(parentVal, childVal)
|
|
}
|
|
|
|
return mergeDataOrFn(parentVal, childVal, vm)
|
|
};
|
|
|
|
/**
|
|
* Hooks and props are merged as arrays.
|
|
*/
|
|
function mergeHook (
|
|
parentVal,
|
|
childVal
|
|
) {
|
|
var res = childVal
|
|
? parentVal
|
|
? parentVal.concat(childVal)
|
|
: Array.isArray(childVal)
|
|
? childVal
|
|
: [childVal]
|
|
: parentVal;
|
|
return res
|
|
? dedupeHooks(res)
|
|
: res
|
|
}
|
|
|
|
function dedupeHooks (hooks) {
|
|
var res = [];
|
|
for (var i = 0; i < hooks.length; i++) {
|
|
if (res.indexOf(hooks[i]) === -1) {
|
|
res.push(hooks[i]);
|
|
}
|
|
}
|
|
return res
|
|
}
|
|
|
|
LIFECYCLE_HOOKS.forEach(function (hook) {
|
|
strats[hook] = mergeHook;
|
|
});
|
|
|
|
/**
|
|
* Assets
|
|
*
|
|
* When a vm is present (instance creation), we need to do
|
|
* a three-way merge between constructor options, instance
|
|
* options and parent options.
|
|
*/
|
|
function mergeAssets (
|
|
parentVal,
|
|
childVal,
|
|
vm,
|
|
key
|
|
) {
|
|
var res = Object.create(parentVal || null);
|
|
if (childVal) {
|
|
true && assertObjectType(key, childVal, vm);
|
|
return extend(res, childVal)
|
|
} else {
|
|
return res
|
|
}
|
|
}
|
|
|
|
ASSET_TYPES.forEach(function (type) {
|
|
strats[type + 's'] = mergeAssets;
|
|
});
|
|
|
|
/**
|
|
* Watchers.
|
|
*
|
|
* Watchers hashes should not overwrite one
|
|
* another, so we merge them as arrays.
|
|
*/
|
|
strats.watch = function (
|
|
parentVal,
|
|
childVal,
|
|
vm,
|
|
key
|
|
) {
|
|
// work around Firefox's Object.prototype.watch...
|
|
if (parentVal === nativeWatch) { parentVal = undefined; }
|
|
if (childVal === nativeWatch) { childVal = undefined; }
|
|
/* istanbul ignore if */
|
|
if (!childVal) { return Object.create(parentVal || null) }
|
|
if (true) {
|
|
assertObjectType(key, childVal, vm);
|
|
}
|
|
if (!parentVal) { return childVal }
|
|
var ret = {};
|
|
extend(ret, parentVal);
|
|
for (var key$1 in childVal) {
|
|
var parent = ret[key$1];
|
|
var child = childVal[key$1];
|
|
if (parent && !Array.isArray(parent)) {
|
|
parent = [parent];
|
|
}
|
|
ret[key$1] = parent
|
|
? parent.concat(child)
|
|
: Array.isArray(child) ? child : [child];
|
|
}
|
|
return ret
|
|
};
|
|
|
|
/**
|
|
* Other object hashes.
|
|
*/
|
|
strats.props =
|
|
strats.methods =
|
|
strats.inject =
|
|
strats.computed = function (
|
|
parentVal,
|
|
childVal,
|
|
vm,
|
|
key
|
|
) {
|
|
if (childVal && "development" !== 'production') {
|
|
assertObjectType(key, childVal, vm);
|
|
}
|
|
if (!parentVal) { return childVal }
|
|
var ret = Object.create(null);
|
|
extend(ret, parentVal);
|
|
if (childVal) { extend(ret, childVal); }
|
|
return ret
|
|
};
|
|
strats.provide = mergeDataOrFn;
|
|
|
|
/**
|
|
* Default strategy.
|
|
*/
|
|
var defaultStrat = function (parentVal, childVal) {
|
|
return childVal === undefined
|
|
? parentVal
|
|
: childVal
|
|
};
|
|
|
|
/**
|
|
* Validate component names
|
|
*/
|
|
function checkComponents (options) {
|
|
for (var key in options.components) {
|
|
validateComponentName(key);
|
|
}
|
|
}
|
|
|
|
function validateComponentName (name) {
|
|
if (!new RegExp(("^[a-zA-Z][\\-\\.0-9_" + (unicodeRegExp.source) + "]*$")).test(name)) {
|
|
warn(
|
|
'Invalid component name: "' + name + '". Component names ' +
|
|
'should conform to valid custom element name in html5 specification.'
|
|
);
|
|
}
|
|
if (isBuiltInTag(name) || config.isReservedTag(name)) {
|
|
warn(
|
|
'Do not use built-in or reserved HTML elements as component ' +
|
|
'id: ' + name
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Ensure all props option syntax are normalized into the
|
|
* Object-based format.
|
|
*/
|
|
function normalizeProps (options, vm) {
|
|
var props = options.props;
|
|
if (!props) { return }
|
|
var res = {};
|
|
var i, val, name;
|
|
if (Array.isArray(props)) {
|
|
i = props.length;
|
|
while (i--) {
|
|
val = props[i];
|
|
if (typeof val === 'string') {
|
|
name = camelize(val);
|
|
res[name] = { type: null };
|
|
} else if (true) {
|
|
warn('props must be strings when using array syntax.');
|
|
}
|
|
}
|
|
} else if (isPlainObject(props)) {
|
|
for (var key in props) {
|
|
val = props[key];
|
|
name = camelize(key);
|
|
res[name] = isPlainObject(val)
|
|
? val
|
|
: { type: val };
|
|
}
|
|
} else if (true) {
|
|
warn(
|
|
"Invalid value for option \"props\": expected an Array or an Object, " +
|
|
"but got " + (toRawType(props)) + ".",
|
|
vm
|
|
);
|
|
}
|
|
options.props = res;
|
|
}
|
|
|
|
/**
|
|
* Normalize all injections into Object-based format
|
|
*/
|
|
function normalizeInject (options, vm) {
|
|
var inject = options.inject;
|
|
if (!inject) { return }
|
|
var normalized = options.inject = {};
|
|
if (Array.isArray(inject)) {
|
|
for (var i = 0; i < inject.length; i++) {
|
|
normalized[inject[i]] = { from: inject[i] };
|
|
}
|
|
} else if (isPlainObject(inject)) {
|
|
for (var key in inject) {
|
|
var val = inject[key];
|
|
normalized[key] = isPlainObject(val)
|
|
? extend({ from: key }, val)
|
|
: { from: val };
|
|
}
|
|
} else if (true) {
|
|
warn(
|
|
"Invalid value for option \"inject\": expected an Array or an Object, " +
|
|
"but got " + (toRawType(inject)) + ".",
|
|
vm
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Normalize raw function directives into object format.
|
|
*/
|
|
function normalizeDirectives (options) {
|
|
var dirs = options.directives;
|
|
if (dirs) {
|
|
for (var key in dirs) {
|
|
var def$$1 = dirs[key];
|
|
if (typeof def$$1 === 'function') {
|
|
dirs[key] = { bind: def$$1, update: def$$1 };
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function assertObjectType (name, value, vm) {
|
|
if (!isPlainObject(value)) {
|
|
warn(
|
|
"Invalid value for option \"" + name + "\": expected an Object, " +
|
|
"but got " + (toRawType(value)) + ".",
|
|
vm
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Merge two option objects into a new one.
|
|
* Core utility used in both instantiation and inheritance.
|
|
*/
|
|
function mergeOptions (
|
|
parent,
|
|
child,
|
|
vm
|
|
) {
|
|
if (true) {
|
|
checkComponents(child);
|
|
}
|
|
|
|
if (typeof child === 'function') {
|
|
child = child.options;
|
|
}
|
|
|
|
normalizeProps(child, vm);
|
|
normalizeInject(child, vm);
|
|
normalizeDirectives(child);
|
|
|
|
// Apply extends and mixins on the child options,
|
|
// but only if it is a raw options object that isn't
|
|
// the result of another mergeOptions call.
|
|
// Only merged options has the _base property.
|
|
if (!child._base) {
|
|
if (child.extends) {
|
|
parent = mergeOptions(parent, child.extends, vm);
|
|
}
|
|
if (child.mixins) {
|
|
for (var i = 0, l = child.mixins.length; i < l; i++) {
|
|
parent = mergeOptions(parent, child.mixins[i], vm);
|
|
}
|
|
}
|
|
}
|
|
|
|
var options = {};
|
|
var key;
|
|
for (key in parent) {
|
|
mergeField(key);
|
|
}
|
|
for (key in child) {
|
|
if (!hasOwn(parent, key)) {
|
|
mergeField(key);
|
|
}
|
|
}
|
|
function mergeField (key) {
|
|
var strat = strats[key] || defaultStrat;
|
|
options[key] = strat(parent[key], child[key], vm, key);
|
|
}
|
|
return options
|
|
}
|
|
|
|
/**
|
|
* Resolve an asset.
|
|
* This function is used because child instances need access
|
|
* to assets defined in its ancestor chain.
|
|
*/
|
|
function resolveAsset (
|
|
options,
|
|
type,
|
|
id,
|
|
warnMissing
|
|
) {
|
|
/* istanbul ignore if */
|
|
if (typeof id !== 'string') {
|
|
return
|
|
}
|
|
var assets = options[type];
|
|
// check local registration variations first
|
|
if (hasOwn(assets, id)) { return assets[id] }
|
|
var camelizedId = camelize(id);
|
|
if (hasOwn(assets, camelizedId)) { return assets[camelizedId] }
|
|
var PascalCaseId = capitalize(camelizedId);
|
|
if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] }
|
|
// fallback to prototype chain
|
|
var res = assets[id] || assets[camelizedId] || assets[PascalCaseId];
|
|
if ( true && warnMissing && !res) {
|
|
warn(
|
|
'Failed to resolve ' + type.slice(0, -1) + ': ' + id,
|
|
options
|
|
);
|
|
}
|
|
return res
|
|
}
|
|
|
|
/* */
|
|
|
|
|
|
|
|
function validateProp (
|
|
key,
|
|
propOptions,
|
|
propsData,
|
|
vm
|
|
) {
|
|
var prop = propOptions[key];
|
|
var absent = !hasOwn(propsData, key);
|
|
var value = propsData[key];
|
|
// boolean casting
|
|
var booleanIndex = getTypeIndex(Boolean, prop.type);
|
|
if (booleanIndex > -1) {
|
|
if (absent && !hasOwn(prop, 'default')) {
|
|
value = false;
|
|
} else if (value === '' || value === hyphenate(key)) {
|
|
// only cast empty string / same name to boolean if
|
|
// boolean has higher priority
|
|
var stringIndex = getTypeIndex(String, prop.type);
|
|
if (stringIndex < 0 || booleanIndex < stringIndex) {
|
|
value = true;
|
|
}
|
|
}
|
|
}
|
|
// check default value
|
|
if (value === undefined) {
|
|
value = getPropDefaultValue(vm, prop, key);
|
|
// since the default value is a fresh copy,
|
|
// make sure to observe it.
|
|
var prevShouldObserve = shouldObserve;
|
|
toggleObserving(true);
|
|
observe(value);
|
|
toggleObserving(prevShouldObserve);
|
|
}
|
|
if (
|
|
true
|
|
) {
|
|
assertProp(prop, key, value, vm, absent);
|
|
}
|
|
return value
|
|
}
|
|
|
|
/**
|
|
* Get the default value of a prop.
|
|
*/
|
|
function getPropDefaultValue (vm, prop, key) {
|
|
// no default, return undefined
|
|
if (!hasOwn(prop, 'default')) {
|
|
return undefined
|
|
}
|
|
var def = prop.default;
|
|
// warn against non-factory defaults for Object & Array
|
|
if ( true && isObject(def)) {
|
|
warn(
|
|
'Invalid default value for prop "' + key + '": ' +
|
|
'Props with type Object/Array must use a factory function ' +
|
|
'to return the default value.',
|
|
vm
|
|
);
|
|
}
|
|
// the raw prop value was also undefined from previous render,
|
|
// return previous default value to avoid unnecessary watcher trigger
|
|
if (vm && vm.$options.propsData &&
|
|
vm.$options.propsData[key] === undefined &&
|
|
vm._props[key] !== undefined
|
|
) {
|
|
return vm._props[key]
|
|
}
|
|
// call factory function for non-Function types
|
|
// a value is Function if its prototype is function even across different execution context
|
|
return typeof def === 'function' && getType(prop.type) !== 'Function'
|
|
? def.call(vm)
|
|
: def
|
|
}
|
|
|
|
/**
|
|
* Assert whether a prop is valid.
|
|
*/
|
|
function assertProp (
|
|
prop,
|
|
name,
|
|
value,
|
|
vm,
|
|
absent
|
|
) {
|
|
if (prop.required && absent) {
|
|
warn(
|
|
'Missing required prop: "' + name + '"',
|
|
vm
|
|
);
|
|
return
|
|
}
|
|
if (value == null && !prop.required) {
|
|
return
|
|
}
|
|
var type = prop.type;
|
|
var valid = !type || type === true;
|
|
var expectedTypes = [];
|
|
if (type) {
|
|
if (!Array.isArray(type)) {
|
|
type = [type];
|
|
}
|
|
for (var i = 0; i < type.length && !valid; i++) {
|
|
var assertedType = assertType(value, type[i]);
|
|
expectedTypes.push(assertedType.expectedType || '');
|
|
valid = assertedType.valid;
|
|
}
|
|
}
|
|
|
|
if (!valid) {
|
|
warn(
|
|
getInvalidTypeMessage(name, value, expectedTypes),
|
|
vm
|
|
);
|
|
return
|
|
}
|
|
var validator = prop.validator;
|
|
if (validator) {
|
|
if (!validator(value)) {
|
|
warn(
|
|
'Invalid prop: custom validator check failed for prop "' + name + '".',
|
|
vm
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
var simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/;
|
|
|
|
function assertType (value, type) {
|
|
var valid;
|
|
var expectedType = getType(type);
|
|
if (simpleCheckRE.test(expectedType)) {
|
|
var t = typeof value;
|
|
valid = t === expectedType.toLowerCase();
|
|
// for primitive wrapper objects
|
|
if (!valid && t === 'object') {
|
|
valid = value instanceof type;
|
|
}
|
|
} else if (expectedType === 'Object') {
|
|
valid = isPlainObject(value);
|
|
} else if (expectedType === 'Array') {
|
|
valid = Array.isArray(value);
|
|
} else {
|
|
valid = value instanceof type;
|
|
}
|
|
return {
|
|
valid: valid,
|
|
expectedType: expectedType
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Use function string name to check built-in types,
|
|
* because a simple equality check will fail when running
|
|
* across different vms / iframes.
|
|
*/
|
|
function getType (fn) {
|
|
var match = fn && fn.toString().match(/^\s*function (\w+)/);
|
|
return match ? match[1] : ''
|
|
}
|
|
|
|
function isSameType (a, b) {
|
|
return getType(a) === getType(b)
|
|
}
|
|
|
|
function getTypeIndex (type, expectedTypes) {
|
|
if (!Array.isArray(expectedTypes)) {
|
|
return isSameType(expectedTypes, type) ? 0 : -1
|
|
}
|
|
for (var i = 0, len = expectedTypes.length; i < len; i++) {
|
|
if (isSameType(expectedTypes[i], type)) {
|
|
return i
|
|
}
|
|
}
|
|
return -1
|
|
}
|
|
|
|
function getInvalidTypeMessage (name, value, expectedTypes) {
|
|
var message = "Invalid prop: type check failed for prop \"" + name + "\"." +
|
|
" Expected " + (expectedTypes.map(capitalize).join(', '));
|
|
var expectedType = expectedTypes[0];
|
|
var receivedType = toRawType(value);
|
|
var expectedValue = styleValue(value, expectedType);
|
|
var receivedValue = styleValue(value, receivedType);
|
|
// check if we need to specify expected value
|
|
if (expectedTypes.length === 1 &&
|
|
isExplicable(expectedType) &&
|
|
!isBoolean(expectedType, receivedType)) {
|
|
message += " with value " + expectedValue;
|
|
}
|
|
message += ", got " + receivedType + " ";
|
|
// check if we need to specify received value
|
|
if (isExplicable(receivedType)) {
|
|
message += "with value " + receivedValue + ".";
|
|
}
|
|
return message
|
|
}
|
|
|
|
function styleValue (value, type) {
|
|
if (type === 'String') {
|
|
return ("\"" + value + "\"")
|
|
} else if (type === 'Number') {
|
|
return ("" + (Number(value)))
|
|
} else {
|
|
return ("" + value)
|
|
}
|
|
}
|
|
|
|
function isExplicable (value) {
|
|
var explicitTypes = ['string', 'number', 'boolean'];
|
|
return explicitTypes.some(function (elem) { return value.toLowerCase() === elem; })
|
|
}
|
|
|
|
function isBoolean () {
|
|
var args = [], len = arguments.length;
|
|
while ( len-- ) args[ len ] = arguments[ len ];
|
|
|
|
return args.some(function (elem) { return elem.toLowerCase() === 'boolean'; })
|
|
}
|
|
|
|
/* */
|
|
|
|
function handleError (err, vm, info) {
|
|
// Deactivate deps tracking while processing error handler to avoid possible infinite rendering.
|
|
// See: https://github.com/vuejs/vuex/issues/1505
|
|
pushTarget();
|
|
try {
|
|
if (vm) {
|
|
var cur = vm;
|
|
while ((cur = cur.$parent)) {
|
|
var hooks = cur.$options.errorCaptured;
|
|
if (hooks) {
|
|
for (var i = 0; i < hooks.length; i++) {
|
|
try {
|
|
var capture = hooks[i].call(cur, err, vm, info) === false;
|
|
if (capture) { return }
|
|
} catch (e) {
|
|
globalHandleError(e, cur, 'errorCaptured hook');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
globalHandleError(err, vm, info);
|
|
} finally {
|
|
popTarget();
|
|
}
|
|
}
|
|
|
|
function invokeWithErrorHandling (
|
|
handler,
|
|
context,
|
|
args,
|
|
vm,
|
|
info
|
|
) {
|
|
var res;
|
|
try {
|
|
res = args ? handler.apply(context, args) : handler.call(context);
|
|
if (res && !res._isVue && isPromise(res) && !res._handled) {
|
|
res.catch(function (e) { return handleError(e, vm, info + " (Promise/async)"); });
|
|
// issue #9511
|
|
// avoid catch triggering multiple times when nested calls
|
|
res._handled = true;
|
|
}
|
|
} catch (e) {
|
|
handleError(e, vm, info);
|
|
}
|
|
return res
|
|
}
|
|
|
|
function globalHandleError (err, vm, info) {
|
|
if (config.errorHandler) {
|
|
try {
|
|
return config.errorHandler.call(null, err, vm, info)
|
|
} catch (e) {
|
|
// if the user intentionally throws the original error in the handler,
|
|
// do not log it twice
|
|
if (e !== err) {
|
|
logError(e, null, 'config.errorHandler');
|
|
}
|
|
}
|
|
}
|
|
logError(err, vm, info);
|
|
}
|
|
|
|
function logError (err, vm, info) {
|
|
if (true) {
|
|
warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm);
|
|
}
|
|
/* istanbul ignore else */
|
|
if ((inBrowser || inWeex) && typeof console !== 'undefined') {
|
|
console.error(err);
|
|
} else {
|
|
throw err
|
|
}
|
|
}
|
|
|
|
/* */
|
|
|
|
var callbacks = [];
|
|
var pending = false;
|
|
|
|
function flushCallbacks () {
|
|
pending = false;
|
|
var copies = callbacks.slice(0);
|
|
callbacks.length = 0;
|
|
for (var i = 0; i < copies.length; i++) {
|
|
copies[i]();
|
|
}
|
|
}
|
|
|
|
// Here we have async deferring wrappers using microtasks.
|
|
// In 2.5 we used (macro) tasks (in combination with microtasks).
|
|
// However, it has subtle problems when state is changed right before repaint
|
|
// (e.g. #6813, out-in transitions).
|
|
// Also, using (macro) tasks in event handler would cause some weird behaviors
|
|
// that cannot be circumvented (e.g. #7109, #7153, #7546, #7834, #8109).
|
|
// So we now use microtasks everywhere, again.
|
|
// A major drawback of this tradeoff is that there are some scenarios
|
|
// where microtasks have too high a priority and fire in between supposedly
|
|
// sequential events (e.g. #4521, #6690, which have workarounds)
|
|
// or even between bubbling of the same event (#6566).
|
|
var timerFunc;
|
|
|
|
// The nextTick behavior leverages the microtask queue, which can be accessed
|
|
// via either native Promise.then or MutationObserver.
|
|
// MutationObserver has wider support, however it is seriously bugged in
|
|
// UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It
|
|
// completely stops working after triggering a few times... so, if native
|
|
// Promise is available, we will use it:
|
|
/* istanbul ignore next, $flow-disable-line */
|
|
if (typeof Promise !== 'undefined' && isNative(Promise)) {
|
|
var p = Promise.resolve();
|
|
timerFunc = function () {
|
|
p.then(flushCallbacks);
|
|
// In problematic UIWebViews, Promise.then doesn't completely break, but
|
|
// it can get stuck in a weird state where callbacks are pushed into the
|
|
// microtask queue but the queue isn't being flushed, until the browser
|
|
// needs to do some other work, e.g. handle a timer. Therefore we can
|
|
// "force" the microtask queue to be flushed by adding an empty timer.
|
|
if (isIOS) { setTimeout(noop); }
|
|
};
|
|
} else if (!isIE && typeof MutationObserver !== 'undefined' && (
|
|
isNative(MutationObserver) ||
|
|
// PhantomJS and iOS 7.x
|
|
MutationObserver.toString() === '[object MutationObserverConstructor]'
|
|
)) {
|
|
// Use MutationObserver where native Promise is not available,
|
|
// e.g. PhantomJS, iOS7, Android 4.4
|
|
// (#6466 MutationObserver is unreliable in IE11)
|
|
var counter = 1;
|
|
var observer = new MutationObserver(flushCallbacks);
|
|
var textNode = document.createTextNode(String(counter));
|
|
observer.observe(textNode, {
|
|
characterData: true
|
|
});
|
|
timerFunc = function () {
|
|
counter = (counter + 1) % 2;
|
|
textNode.data = String(counter);
|
|
};
|
|
} else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {
|
|
// Fallback to setImmediate.
|
|
// Technically it leverages the (macro) task queue,
|
|
// but it is still a better choice than setTimeout.
|
|
timerFunc = function () {
|
|
setImmediate(flushCallbacks);
|
|
};
|
|
} else {
|
|
// Fallback to setTimeout.
|
|
timerFunc = function () {
|
|
setTimeout(flushCallbacks, 0);
|
|
};
|
|
}
|
|
|
|
function nextTick (cb, ctx) {
|
|
var _resolve;
|
|
callbacks.push(function () {
|
|
if (cb) {
|
|
try {
|
|
cb.call(ctx);
|
|
} catch (e) {
|
|
handleError(e, ctx, 'nextTick');
|
|
}
|
|
} else if (_resolve) {
|
|
_resolve(ctx);
|
|
}
|
|
});
|
|
if (!pending) {
|
|
pending = true;
|
|
timerFunc();
|
|
}
|
|
// $flow-disable-line
|
|
if (!cb && typeof Promise !== 'undefined') {
|
|
return new Promise(function (resolve) {
|
|
_resolve = resolve;
|
|
})
|
|
}
|
|
}
|
|
|
|
/* */
|
|
|
|
/* not type checking this file because flow doesn't play well with Proxy */
|
|
|
|
var initProxy;
|
|
|
|
if (true) {
|
|
var allowedGlobals = makeMap(
|
|
'Infinity,undefined,NaN,isFinite,isNaN,' +
|
|
'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +
|
|
'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' +
|
|
'require' // for Webpack/Browserify
|
|
);
|
|
|
|
var warnNonPresent = function (target, key) {
|
|
warn(
|
|
"Property or method \"" + key + "\" is not defined on the instance but " +
|
|
'referenced during render. Make sure that this property is reactive, ' +
|
|
'either in the data option, or for class-based components, by ' +
|
|
'initializing the property. ' +
|
|
'See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.',
|
|
target
|
|
);
|
|
};
|
|
|
|
var warnReservedPrefix = function (target, key) {
|
|
warn(
|
|
"Property \"" + key + "\" must be accessed with \"$data." + key + "\" because " +
|
|
'properties starting with "$" or "_" are not proxied in the Vue instance to ' +
|
|
'prevent conflicts with Vue internals. ' +
|
|
'See: https://vuejs.org/v2/api/#data',
|
|
target
|
|
);
|
|
};
|
|
|
|
var hasProxy =
|
|
typeof Proxy !== 'undefined' && isNative(Proxy);
|
|
|
|
if (hasProxy) {
|
|
var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact');
|
|
config.keyCodes = new Proxy(config.keyCodes, {
|
|
set: function set (target, key, value) {
|
|
if (isBuiltInModifier(key)) {
|
|
warn(("Avoid overwriting built-in modifier in config.keyCodes: ." + key));
|
|
return false
|
|
} else {
|
|
target[key] = value;
|
|
return true
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
var hasHandler = {
|
|
has: function has (target, key) {
|
|
var has = key in target;
|
|
var isAllowed = allowedGlobals(key) ||
|
|
(typeof key === 'string' && key.charAt(0) === '_' && !(key in target.$data));
|
|
if (!has && !isAllowed) {
|
|
if (key in target.$data) { warnReservedPrefix(target, key); }
|
|
else { warnNonPresent(target, key); }
|
|
}
|
|
return has || !isAllowed
|
|
}
|
|
};
|
|
|
|
var getHandler = {
|
|
get: function get (target, key) {
|
|
if (typeof key === 'string' && !(key in target)) {
|
|
if (key in target.$data) { warnReservedPrefix(target, key); }
|
|
else { warnNonPresent(target, key); }
|
|
}
|
|
return target[key]
|
|
}
|
|
};
|
|
|
|
initProxy = function initProxy (vm) {
|
|
if (hasProxy) {
|
|
// determine which proxy handler to use
|
|
var options = vm.$options;
|
|
var handlers = options.render && options.render._withStripped
|
|
? getHandler
|
|
: hasHandler;
|
|
vm._renderProxy = new Proxy(vm, handlers);
|
|
} else {
|
|
vm._renderProxy = vm;
|
|
}
|
|
};
|
|
}
|
|
|
|
/* */
|
|
|
|
var seenObjects = new _Set();
|
|
|
|
/**
|
|
* Recursively traverse an object to evoke all converted
|
|
* getters, so that every nested property inside the object
|
|
* is collected as a "deep" dependency.
|
|
*/
|
|
function traverse (val) {
|
|
_traverse(val, seenObjects);
|
|
seenObjects.clear();
|
|
}
|
|
|
|
function _traverse (val, seen) {
|
|
var i, keys;
|
|
var isA = Array.isArray(val);
|
|
if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) {
|
|
return
|
|
}
|
|
if (val.__ob__) {
|
|
var depId = val.__ob__.dep.id;
|
|
if (seen.has(depId)) {
|
|
return
|
|
}
|
|
seen.add(depId);
|
|
}
|
|
if (isA) {
|
|
i = val.length;
|
|
while (i--) { _traverse(val[i], seen); }
|
|
} else {
|
|
keys = Object.keys(val);
|
|
i = keys.length;
|
|
while (i--) { _traverse(val[keys[i]], seen); }
|
|
}
|
|
}
|
|
|
|
var mark;
|
|
var measure;
|
|
|
|
if (true) {
|
|
var perf = inBrowser && window.performance;
|
|
/* istanbul ignore if */
|
|
if (
|
|
perf &&
|
|
perf.mark &&
|
|
perf.measure &&
|
|
perf.clearMarks &&
|
|
perf.clearMeasures
|
|
) {
|
|
mark = function (tag) { return perf.mark(tag); };
|
|
measure = function (name, startTag, endTag) {
|
|
perf.measure(name, startTag, endTag);
|
|
perf.clearMarks(startTag);
|
|
perf.clearMarks(endTag);
|
|
// perf.clearMeasures(name)
|
|
};
|
|
}
|
|
}
|
|
|
|
/* */
|
|
|
|
var normalizeEvent = cached(function (name) {
|
|
var passive = name.charAt(0) === '&';
|
|
name = passive ? name.slice(1) : name;
|
|
var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first
|
|
name = once$$1 ? name.slice(1) : name;
|
|
var capture = name.charAt(0) === '!';
|
|
name = capture ? name.slice(1) : name;
|
|
return {
|
|
name: name,
|
|
once: once$$1,
|
|
capture: capture,
|
|
passive: passive
|
|
}
|
|
});
|
|
|
|
function createFnInvoker (fns, vm) {
|
|
function invoker () {
|
|
var arguments$1 = arguments;
|
|
|
|
var fns = invoker.fns;
|
|
if (Array.isArray(fns)) {
|
|
var cloned = fns.slice();
|
|
for (var i = 0; i < cloned.length; i++) {
|
|
invokeWithErrorHandling(cloned[i], null, arguments$1, vm, "v-on handler");
|
|
}
|
|
} else {
|
|
// return handler return value for single handlers
|
|
return invokeWithErrorHandling(fns, null, arguments, vm, "v-on handler")
|
|
}
|
|
}
|
|
invoker.fns = fns;
|
|
return invoker
|
|
}
|
|
|
|
function updateListeners (
|
|
on,
|
|
oldOn,
|
|
add,
|
|
remove$$1,
|
|
createOnceHandler,
|
|
vm
|
|
) {
|
|
var name, def$$1, cur, old, event;
|
|
for (name in on) {
|
|
def$$1 = cur = on[name];
|
|
old = oldOn[name];
|
|
event = normalizeEvent(name);
|
|
if (isUndef(cur)) {
|
|
true && warn(
|
|
"Invalid handler for event \"" + (event.name) + "\": got " + String(cur),
|
|
vm
|
|
);
|
|
} else if (isUndef(old)) {
|
|
if (isUndef(cur.fns)) {
|
|
cur = on[name] = createFnInvoker(cur, vm);
|
|
}
|
|
if (isTrue(event.once)) {
|
|
cur = on[name] = createOnceHandler(event.name, cur, event.capture);
|
|
}
|
|
add(event.name, cur, event.capture, event.passive, event.params);
|
|
} else if (cur !== old) {
|
|
old.fns = cur;
|
|
on[name] = old;
|
|
}
|
|
}
|
|
for (name in oldOn) {
|
|
if (isUndef(on[name])) {
|
|
event = normalizeEvent(name);
|
|
remove$$1(event.name, oldOn[name], event.capture);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* */
|
|
|
|
/* */
|
|
|
|
// fixed by xxxxxx (mp properties)
|
|
function extractPropertiesFromVNodeData(data, Ctor, res, context) {
|
|
var propOptions = Ctor.options.mpOptions && Ctor.options.mpOptions.properties;
|
|
if (isUndef(propOptions)) {
|
|
return res
|
|
}
|
|
var externalClasses = Ctor.options.mpOptions.externalClasses || [];
|
|
var attrs = data.attrs;
|
|
var props = data.props;
|
|
if (isDef(attrs) || isDef(props)) {
|
|
for (var key in propOptions) {
|
|
var altKey = hyphenate(key);
|
|
var result = checkProp(res, props, key, altKey, true) ||
|
|
checkProp(res, attrs, key, altKey, false);
|
|
// externalClass
|
|
if (
|
|
result &&
|
|
res[key] &&
|
|
externalClasses.indexOf(altKey) !== -1 &&
|
|
context[camelize(res[key])]
|
|
) {
|
|
// 赋值 externalClass 真正的值(模板里 externalClass 的值可能是字符串)
|
|
res[key] = context[camelize(res[key])];
|
|
}
|
|
}
|
|
}
|
|
return res
|
|
}
|
|
|
|
function extractPropsFromVNodeData (
|
|
data,
|
|
Ctor,
|
|
tag,
|
|
context// fixed by xxxxxx
|
|
) {
|
|
// we are only extracting raw values here.
|
|
// validation and default values are handled in the child
|
|
// component itself.
|
|
var propOptions = Ctor.options.props;
|
|
if (isUndef(propOptions)) {
|
|
// fixed by xxxxxx
|
|
return extractPropertiesFromVNodeData(data, Ctor, {}, context)
|
|
}
|
|
var res = {};
|
|
var attrs = data.attrs;
|
|
var props = data.props;
|
|
if (isDef(attrs) || isDef(props)) {
|
|
for (var key in propOptions) {
|
|
var altKey = hyphenate(key);
|
|
if (true) {
|
|
var keyInLowerCase = key.toLowerCase();
|
|
if (
|
|
key !== keyInLowerCase &&
|
|
attrs && hasOwn(attrs, keyInLowerCase)
|
|
) {
|
|
tip(
|
|
"Prop \"" + keyInLowerCase + "\" is passed to component " +
|
|
(formatComponentName(tag || Ctor)) + ", but the declared prop name is" +
|
|
" \"" + key + "\". " +
|
|
"Note that HTML attributes are case-insensitive and camelCased " +
|
|
"props need to use their kebab-case equivalents when using in-DOM " +
|
|
"templates. You should probably use \"" + altKey + "\" instead of \"" + key + "\"."
|
|
);
|
|
}
|
|
}
|
|
checkProp(res, props, key, altKey, true) ||
|
|
checkProp(res, attrs, key, altKey, false);
|
|
}
|
|
}
|
|
// fixed by xxxxxx
|
|
return extractPropertiesFromVNodeData(data, Ctor, res, context)
|
|
}
|
|
|
|
function checkProp (
|
|
res,
|
|
hash,
|
|
key,
|
|
altKey,
|
|
preserve
|
|
) {
|
|
if (isDef(hash)) {
|
|
if (hasOwn(hash, key)) {
|
|
res[key] = hash[key];
|
|
if (!preserve) {
|
|
delete hash[key];
|
|
}
|
|
return true
|
|
} else if (hasOwn(hash, altKey)) {
|
|
res[key] = hash[altKey];
|
|
if (!preserve) {
|
|
delete hash[altKey];
|
|
}
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
/* */
|
|
|
|
// The template compiler attempts to minimize the need for normalization by
|
|
// statically analyzing the template at compile time.
|
|
//
|
|
// For plain HTML markup, normalization can be completely skipped because the
|
|
// generated render function is guaranteed to return Array<VNode>. There are
|
|
// two cases where extra normalization is needed:
|
|
|
|
// 1. When the children contains components - because a functional component
|
|
// may return an Array instead of a single root. In this case, just a simple
|
|
// normalization is needed - if any child is an Array, we flatten the whole
|
|
// thing with Array.prototype.concat. It is guaranteed to be only 1-level deep
|
|
// because functional components already normalize their own children.
|
|
function simpleNormalizeChildren (children) {
|
|
for (var i = 0; i < children.length; i++) {
|
|
if (Array.isArray(children[i])) {
|
|
return Array.prototype.concat.apply([], children)
|
|
}
|
|
}
|
|
return children
|
|
}
|
|
|
|
// 2. When the children contains constructs that always generated nested Arrays,
|
|
// e.g. <template>, <slot>, v-for, or when the children is provided by user
|
|
// with hand-written render functions / JSX. In such cases a full normalization
|
|
// is needed to cater to all possible types of children values.
|
|
function normalizeChildren (children) {
|
|
return isPrimitive(children)
|
|
? [createTextVNode(children)]
|
|
: Array.isArray(children)
|
|
? normalizeArrayChildren(children)
|
|
: undefined
|
|
}
|
|
|
|
function isTextNode (node) {
|
|
return isDef(node) && isDef(node.text) && isFalse(node.isComment)
|
|
}
|
|
|
|
function normalizeArrayChildren (children, nestedIndex) {
|
|
var res = [];
|
|
var i, c, lastIndex, last;
|
|
for (i = 0; i < children.length; i++) {
|
|
c = children[i];
|
|
if (isUndef(c) || typeof c === 'boolean') { continue }
|
|
lastIndex = res.length - 1;
|
|
last = res[lastIndex];
|
|
// nested
|
|
if (Array.isArray(c)) {
|
|
if (c.length > 0) {
|
|
c = normalizeArrayChildren(c, ((nestedIndex || '') + "_" + i));
|
|
// merge adjacent text nodes
|
|
if (isTextNode(c[0]) && isTextNode(last)) {
|
|
res[lastIndex] = createTextVNode(last.text + (c[0]).text);
|
|
c.shift();
|
|
}
|
|
res.push.apply(res, c);
|
|
}
|
|
} else if (isPrimitive(c)) {
|
|
if (isTextNode(last)) {
|
|
// merge adjacent text nodes
|
|
// this is necessary for SSR hydration because text nodes are
|
|
// essentially merged when rendered to HTML strings
|
|
res[lastIndex] = createTextVNode(last.text + c);
|
|
} else if (c !== '') {
|
|
// convert primitive to vnode
|
|
res.push(createTextVNode(c));
|
|
}
|
|
} else {
|
|
if (isTextNode(c) && isTextNode(last)) {
|
|
// merge adjacent text nodes
|
|
res[lastIndex] = createTextVNode(last.text + c.text);
|
|
} else {
|
|
// default key for nested array children (likely generated by v-for)
|
|
if (isTrue(children._isVList) &&
|
|
isDef(c.tag) &&
|
|
isUndef(c.key) &&
|
|
isDef(nestedIndex)) {
|
|
c.key = "__vlist" + nestedIndex + "_" + i + "__";
|
|
}
|
|
res.push(c);
|
|
}
|
|
}
|
|
}
|
|
return res
|
|
}
|
|
|
|
/* */
|
|
|
|
function initProvide (vm) {
|
|
var provide = vm.$options.provide;
|
|
if (provide) {
|
|
vm._provided = typeof provide === 'function'
|
|
? provide.call(vm)
|
|
: provide;
|
|
}
|
|
}
|
|
|
|
function initInjections (vm) {
|
|
var result = resolveInject(vm.$options.inject, vm);
|
|
if (result) {
|
|
toggleObserving(false);
|
|
Object.keys(result).forEach(function (key) {
|
|
/* istanbul ignore else */
|
|
if (true) {
|
|
defineReactive$$1(vm, key, result[key], function () {
|
|
warn(
|
|
"Avoid mutating an injected value directly since the changes will be " +
|
|
"overwritten whenever the provided component re-renders. " +
|
|
"injection being mutated: \"" + key + "\"",
|
|
vm
|
|
);
|
|
});
|
|
} else {}
|
|
});
|
|
toggleObserving(true);
|
|
}
|
|
}
|
|
|
|
function resolveInject (inject, vm) {
|
|
if (inject) {
|
|
// inject is :any because flow is not smart enough to figure out cached
|
|
var result = Object.create(null);
|
|
var keys = hasSymbol
|
|
? Reflect.ownKeys(inject)
|
|
: Object.keys(inject);
|
|
|
|
for (var i = 0; i < keys.length; i++) {
|
|
var key = keys[i];
|
|
// #6574 in case the inject object is observed...
|
|
if (key === '__ob__') { continue }
|
|
var provideKey = inject[key].from;
|
|
var source = vm;
|
|
while (source) {
|
|
if (source._provided && hasOwn(source._provided, provideKey)) {
|
|
result[key] = source._provided[provideKey];
|
|
break
|
|
}
|
|
source = source.$parent;
|
|
}
|
|
if (!source) {
|
|
if ('default' in inject[key]) {
|
|
var provideDefault = inject[key].default;
|
|
result[key] = typeof provideDefault === 'function'
|
|
? provideDefault.call(vm)
|
|
: provideDefault;
|
|
} else if (true) {
|
|
warn(("Injection \"" + key + "\" not found"), vm);
|
|
}
|
|
}
|
|
}
|
|
return result
|
|
}
|
|
}
|
|
|
|
/* */
|
|
|
|
|
|
|
|
/**
|
|
* Runtime helper for resolving raw children VNodes into a slot object.
|
|
*/
|
|
function resolveSlots (
|
|
children,
|
|
context
|
|
) {
|
|
if (!children || !children.length) {
|
|
return {}
|
|
}
|
|
var slots = {};
|
|
for (var i = 0, l = children.length; i < l; i++) {
|
|
var child = children[i];
|
|
var data = child.data;
|
|
// remove slot attribute if the node is resolved as a Vue slot node
|
|
if (data && data.attrs && data.attrs.slot) {
|
|
delete data.attrs.slot;
|
|
}
|
|
// named slots should only be respected if the vnode was rendered in the
|
|
// same context.
|
|
if ((child.context === context || child.fnContext === context) &&
|
|
data && data.slot != null
|
|
) {
|
|
var name = data.slot;
|
|
var slot = (slots[name] || (slots[name] = []));
|
|
if (child.tag === 'template') {
|
|
slot.push.apply(slot, child.children || []);
|
|
} else {
|
|
slot.push(child);
|
|
}
|
|
} else {
|
|
// fixed by xxxxxx 临时 hack 掉 uni-app 中的异步 name slot page
|
|
if(child.asyncMeta && child.asyncMeta.data && child.asyncMeta.data.slot === 'page'){
|
|
(slots['page'] || (slots['page'] = [])).push(child);
|
|
}else{
|
|
(slots.default || (slots.default = [])).push(child);
|
|
}
|
|
}
|
|
}
|
|
// ignore slots that contains only whitespace
|
|
for (var name$1 in slots) {
|
|
if (slots[name$1].every(isWhitespace)) {
|
|
delete slots[name$1];
|
|
}
|
|
}
|
|
return slots
|
|
}
|
|
|
|
function isWhitespace (node) {
|
|
return (node.isComment && !node.asyncFactory) || node.text === ' '
|
|
}
|
|
|
|
/* */
|
|
|
|
function normalizeScopedSlots (
|
|
slots,
|
|
normalSlots,
|
|
prevSlots
|
|
) {
|
|
var res;
|
|
var hasNormalSlots = Object.keys(normalSlots).length > 0;
|
|
var isStable = slots ? !!slots.$stable : !hasNormalSlots;
|
|
var key = slots && slots.$key;
|
|
if (!slots) {
|
|
res = {};
|
|
} else if (slots._normalized) {
|
|
// fast path 1: child component re-render only, parent did not change
|
|
return slots._normalized
|
|
} else if (
|
|
isStable &&
|
|
prevSlots &&
|
|
prevSlots !== emptyObject &&
|
|
key === prevSlots.$key &&
|
|
!hasNormalSlots &&
|
|
!prevSlots.$hasNormal
|
|
) {
|
|
// fast path 2: stable scoped slots w/ no normal slots to proxy,
|
|
// only need to normalize once
|
|
return prevSlots
|
|
} else {
|
|
res = {};
|
|
for (var key$1 in slots) {
|
|
if (slots[key$1] && key$1[0] !== '$') {
|
|
res[key$1] = normalizeScopedSlot(normalSlots, key$1, slots[key$1]);
|
|
}
|
|
}
|
|
}
|
|
// expose normal slots on scopedSlots
|
|
for (var key$2 in normalSlots) {
|
|
if (!(key$2 in res)) {
|
|
res[key$2] = proxyNormalSlot(normalSlots, key$2);
|
|
}
|
|
}
|
|
// avoriaz seems to mock a non-extensible $scopedSlots object
|
|
// and when that is passed down this would cause an error
|
|
if (slots && Object.isExtensible(slots)) {
|
|
(slots)._normalized = res;
|
|
}
|
|
def(res, '$stable', isStable);
|
|
def(res, '$key', key);
|
|
def(res, '$hasNormal', hasNormalSlots);
|
|
return res
|
|
}
|
|
|
|
function normalizeScopedSlot(normalSlots, key, fn) {
|
|
var normalized = function () {
|
|
var res = arguments.length ? fn.apply(null, arguments) : fn({});
|
|
res = res && typeof res === 'object' && !Array.isArray(res)
|
|
? [res] // single vnode
|
|
: normalizeChildren(res);
|
|
return res && (
|
|
res.length === 0 ||
|
|
(res.length === 1 && res[0].isComment) // #9658
|
|
) ? undefined
|
|
: res
|
|
};
|
|
// this is a slot using the new v-slot syntax without scope. although it is
|
|
// compiled as a scoped slot, render fn users would expect it to be present
|
|
// on this.$slots because the usage is semantically a normal slot.
|
|
if (fn.proxy) {
|
|
Object.defineProperty(normalSlots, key, {
|
|
get: normalized,
|
|
enumerable: true,
|
|
configurable: true
|
|
});
|
|
}
|
|
return normalized
|
|
}
|
|
|
|
function proxyNormalSlot(slots, key) {
|
|
return function () { return slots[key]; }
|
|
}
|
|
|
|
/* */
|
|
|
|
/**
|
|
* Runtime helper for rendering v-for lists.
|
|
*/
|
|
function renderList (
|
|
val,
|
|
render
|
|
) {
|
|
var ret, i, l, keys, key;
|
|
if (Array.isArray(val) || typeof val === 'string') {
|
|
ret = new Array(val.length);
|
|
for (i = 0, l = val.length; i < l; i++) {
|
|
ret[i] = render(val[i], i, i, i); // fixed by xxxxxx
|
|
}
|
|
} else if (typeof val === 'number') {
|
|
ret = new Array(val);
|
|
for (i = 0; i < val; i++) {
|
|
ret[i] = render(i + 1, i, i, i); // fixed by xxxxxx
|
|
}
|
|
} else if (isObject(val)) {
|
|
if (hasSymbol && val[Symbol.iterator]) {
|
|
ret = [];
|
|
var iterator = val[Symbol.iterator]();
|
|
var result = iterator.next();
|
|
while (!result.done) {
|
|
ret.push(render(result.value, ret.length, i, i++)); // fixed by xxxxxx
|
|
result = iterator.next();
|
|
}
|
|
} else {
|
|
keys = Object.keys(val);
|
|
ret = new Array(keys.length);
|
|
for (i = 0, l = keys.length; i < l; i++) {
|
|
key = keys[i];
|
|
ret[i] = render(val[key], key, i, i); // fixed by xxxxxx
|
|
}
|
|
}
|
|
}
|
|
if (!isDef(ret)) {
|
|
ret = [];
|
|
}
|
|
(ret)._isVList = true;
|
|
return ret
|
|
}
|
|
|
|
/* */
|
|
|
|
/**
|
|
* Runtime helper for rendering <slot>
|
|
*/
|
|
function renderSlot (
|
|
name,
|
|
fallback,
|
|
props,
|
|
bindObject
|
|
) {
|
|
var scopedSlotFn = this.$scopedSlots[name];
|
|
var nodes;
|
|
if (scopedSlotFn) { // scoped slot
|
|
props = props || {};
|
|
if (bindObject) {
|
|
if ( true && !isObject(bindObject)) {
|
|
warn(
|
|
'slot v-bind without argument expects an Object',
|
|
this
|
|
);
|
|
}
|
|
props = extend(extend({}, bindObject), props);
|
|
}
|
|
// fixed by xxxxxx app-plus scopedSlot
|
|
nodes = scopedSlotFn(props, this, props._i) || fallback;
|
|
} else {
|
|
nodes = this.$slots[name] || fallback;
|
|
}
|
|
|
|
var target = props && props.slot;
|
|
if (target) {
|
|
return this.$createElement('template', { slot: target }, nodes)
|
|
} else {
|
|
return nodes
|
|
}
|
|
}
|
|
|
|
/* */
|
|
|
|
/**
|
|
* Runtime helper for resolving filters
|
|
*/
|
|
function resolveFilter (id) {
|
|
return resolveAsset(this.$options, 'filters', id, true) || identity
|
|
}
|
|
|
|
/* */
|
|
|
|
function isKeyNotMatch (expect, actual) {
|
|
if (Array.isArray(expect)) {
|
|
return expect.indexOf(actual) === -1
|
|
} else {
|
|
return expect !== actual
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Runtime helper for checking keyCodes from config.
|
|
* exposed as Vue.prototype._k
|
|
* passing in eventKeyName as last argument separately for backwards compat
|
|
*/
|
|
function checkKeyCodes (
|
|
eventKeyCode,
|
|
key,
|
|
builtInKeyCode,
|
|
eventKeyName,
|
|
builtInKeyName
|
|
) {
|
|
var mappedKeyCode = config.keyCodes[key] || builtInKeyCode;
|
|
if (builtInKeyName && eventKeyName && !config.keyCodes[key]) {
|
|
return isKeyNotMatch(builtInKeyName, eventKeyName)
|
|
} else if (mappedKeyCode) {
|
|
return isKeyNotMatch(mappedKeyCode, eventKeyCode)
|
|
} else if (eventKeyName) {
|
|
return hyphenate(eventKeyName) !== key
|
|
}
|
|
}
|
|
|
|
/* */
|
|
|
|
/**
|
|
* Runtime helper for merging v-bind="object" into a VNode's data.
|
|
*/
|
|
function bindObjectProps (
|
|
data,
|
|
tag,
|
|
value,
|
|
asProp,
|
|
isSync
|
|
) {
|
|
if (value) {
|
|
if (!isObject(value)) {
|
|
true && warn(
|
|
'v-bind without argument expects an Object or Array value',
|
|
this
|
|
);
|
|
} else {
|
|
if (Array.isArray(value)) {
|
|
value = toObject(value);
|
|
}
|
|
var hash;
|
|
var loop = function ( key ) {
|
|
if (
|
|
key === 'class' ||
|
|
key === 'style' ||
|
|
isReservedAttribute(key)
|
|
) {
|
|
hash = data;
|
|
} else {
|
|
var type = data.attrs && data.attrs.type;
|
|
hash = asProp || config.mustUseProp(tag, type, key)
|
|
? data.domProps || (data.domProps = {})
|
|
: data.attrs || (data.attrs = {});
|
|
}
|
|
var camelizedKey = camelize(key);
|
|
var hyphenatedKey = hyphenate(key);
|
|
if (!(camelizedKey in hash) && !(hyphenatedKey in hash)) {
|
|
hash[key] = value[key];
|
|
|
|
if (isSync) {
|
|
var on = data.on || (data.on = {});
|
|
on[("update:" + key)] = function ($event) {
|
|
value[key] = $event;
|
|
};
|
|
}
|
|
}
|
|
};
|
|
|
|
for (var key in value) loop( key );
|
|
}
|
|
}
|
|
return data
|
|
}
|
|
|
|
/* */
|
|
|
|
/**
|
|
* Runtime helper for rendering static trees.
|
|
*/
|
|
function renderStatic (
|
|
index,
|
|
isInFor
|
|
) {
|
|
var cached = this._staticTrees || (this._staticTrees = []);
|
|
var tree = cached[index];
|
|
// if has already-rendered static tree and not inside v-for,
|
|
// we can reuse the same tree.
|
|
if (tree && !isInFor) {
|
|
return tree
|
|
}
|
|
// otherwise, render a fresh tree.
|
|
tree = cached[index] = this.$options.staticRenderFns[index].call(
|
|
this._renderProxy,
|
|
null,
|
|
this // for render fns generated for functional component templates
|
|
);
|
|
markStatic(tree, ("__static__" + index), false);
|
|
return tree
|
|
}
|
|
|
|
/**
|
|
* Runtime helper for v-once.
|
|
* Effectively it means marking the node as static with a unique key.
|
|
*/
|
|
function markOnce (
|
|
tree,
|
|
index,
|
|
key
|
|
) {
|
|
markStatic(tree, ("__once__" + index + (key ? ("_" + key) : "")), true);
|
|
return tree
|
|
}
|
|
|
|
function markStatic (
|
|
tree,
|
|
key,
|
|
isOnce
|
|
) {
|
|
if (Array.isArray(tree)) {
|
|
for (var i = 0; i < tree.length; i++) {
|
|
if (tree[i] && typeof tree[i] !== 'string') {
|
|
markStaticNode(tree[i], (key + "_" + i), isOnce);
|
|
}
|
|
}
|
|
} else {
|
|
markStaticNode(tree, key, isOnce);
|
|
}
|
|
}
|
|
|
|
function markStaticNode (node, key, isOnce) {
|
|
node.isStatic = true;
|
|
node.key = key;
|
|
node.isOnce = isOnce;
|
|
}
|
|
|
|
/* */
|
|
|
|
function bindObjectListeners (data, value) {
|
|
if (value) {
|
|
if (!isPlainObject(value)) {
|
|
true && warn(
|
|
'v-on without argument expects an Object value',
|
|
this
|
|
);
|
|
} else {
|
|
var on = data.on = data.on ? extend({}, data.on) : {};
|
|
for (var key in value) {
|
|
var existing = on[key];
|
|
var ours = value[key];
|
|
on[key] = existing ? [].concat(existing, ours) : ours;
|
|
}
|
|
}
|
|
}
|
|
return data
|
|
}
|
|
|
|
/* */
|
|
|
|
function resolveScopedSlots (
|
|
fns, // see flow/vnode
|
|
res,
|
|
// the following are added in 2.6
|
|
hasDynamicKeys,
|
|
contentHashKey
|
|
) {
|
|
res = res || { $stable: !hasDynamicKeys };
|
|
for (var i = 0; i < fns.length; i++) {
|
|
var slot = fns[i];
|
|
if (Array.isArray(slot)) {
|
|
resolveScopedSlots(slot, res, hasDynamicKeys);
|
|
} else if (slot) {
|
|
// marker for reverse proxying v-slot without scope on this.$slots
|
|
if (slot.proxy) {
|
|
slot.fn.proxy = true;
|
|
}
|
|
res[slot.key] = slot.fn;
|
|
}
|
|
}
|
|
if (contentHashKey) {
|
|
(res).$key = contentHashKey;
|
|
}
|
|
return res
|
|
}
|
|
|
|
/* */
|
|
|
|
function bindDynamicKeys (baseObj, values) {
|
|
for (var i = 0; i < values.length; i += 2) {
|
|
var key = values[i];
|
|
if (typeof key === 'string' && key) {
|
|
baseObj[values[i]] = values[i + 1];
|
|
} else if ( true && key !== '' && key !== null) {
|
|
// null is a special value for explicitly removing a binding
|
|
warn(
|
|
("Invalid value for dynamic directive argument (expected string or null): " + key),
|
|
this
|
|
);
|
|
}
|
|
}
|
|
return baseObj
|
|
}
|
|
|
|
// helper to dynamically append modifier runtime markers to event names.
|
|
// ensure only append when value is already string, otherwise it will be cast
|
|
// to string and cause the type check to miss.
|
|
function prependModifier (value, symbol) {
|
|
return typeof value === 'string' ? symbol + value : value
|
|
}
|
|
|
|
/* */
|
|
|
|
function installRenderHelpers (target) {
|
|
target._o = markOnce;
|
|
target._n = toNumber;
|
|
target._s = toString;
|
|
target._l = renderList;
|
|
target._t = renderSlot;
|
|
target._q = looseEqual;
|
|
target._i = looseIndexOf;
|
|
target._m = renderStatic;
|
|
target._f = resolveFilter;
|
|
target._k = checkKeyCodes;
|
|
target._b = bindObjectProps;
|
|
target._v = createTextVNode;
|
|
target._e = createEmptyVNode;
|
|
target._u = resolveScopedSlots;
|
|
target._g = bindObjectListeners;
|
|
target._d = bindDynamicKeys;
|
|
target._p = prependModifier;
|
|
}
|
|
|
|
/* */
|
|
|
|
function FunctionalRenderContext (
|
|
data,
|
|
props,
|
|
children,
|
|
parent,
|
|
Ctor
|
|
) {
|
|
var this$1 = this;
|
|
|
|
var options = Ctor.options;
|
|
// ensure the createElement function in functional components
|
|
// gets a unique context - this is necessary for correct named slot check
|
|
var contextVm;
|
|
if (hasOwn(parent, '_uid')) {
|
|
contextVm = Object.create(parent);
|
|
// $flow-disable-line
|
|
contextVm._original = parent;
|
|
} else {
|
|
// the context vm passed in is a functional context as well.
|
|
// in this case we want to make sure we are able to get a hold to the
|
|
// real context instance.
|
|
contextVm = parent;
|
|
// $flow-disable-line
|
|
parent = parent._original;
|
|
}
|
|
var isCompiled = isTrue(options._compiled);
|
|
var needNormalization = !isCompiled;
|
|
|
|
this.data = data;
|
|
this.props = props;
|
|
this.children = children;
|
|
this.parent = parent;
|
|
this.listeners = data.on || emptyObject;
|
|
this.injections = resolveInject(options.inject, parent);
|
|
this.slots = function () {
|
|
if (!this$1.$slots) {
|
|
normalizeScopedSlots(
|
|
data.scopedSlots,
|
|
this$1.$slots = resolveSlots(children, parent)
|
|
);
|
|
}
|
|
return this$1.$slots
|
|
};
|
|
|
|
Object.defineProperty(this, 'scopedSlots', ({
|
|
enumerable: true,
|
|
get: function get () {
|
|
return normalizeScopedSlots(data.scopedSlots, this.slots())
|
|
}
|
|
}));
|
|
|
|
// support for compiled functional template
|
|
if (isCompiled) {
|
|
// exposing $options for renderStatic()
|
|
this.$options = options;
|
|
// pre-resolve slots for renderSlot()
|
|
this.$slots = this.slots();
|
|
this.$scopedSlots = normalizeScopedSlots(data.scopedSlots, this.$slots);
|
|
}
|
|
|
|
if (options._scopeId) {
|
|
this._c = function (a, b, c, d) {
|
|
var vnode = createElement(contextVm, a, b, c, d, needNormalization);
|
|
if (vnode && !Array.isArray(vnode)) {
|
|
vnode.fnScopeId = options._scopeId;
|
|
vnode.fnContext = parent;
|
|
}
|
|
return vnode
|
|
};
|
|
} else {
|
|
this._c = function (a, b, c, d) { return createElement(contextVm, a, b, c, d, needNormalization); };
|
|
}
|
|
}
|
|
|
|
installRenderHelpers(FunctionalRenderContext.prototype);
|
|
|
|
function createFunctionalComponent (
|
|
Ctor,
|
|
propsData,
|
|
data,
|
|
contextVm,
|
|
children
|
|
) {
|
|
var options = Ctor.options;
|
|
var props = {};
|
|
var propOptions = options.props;
|
|
if (isDef(propOptions)) {
|
|
for (var key in propOptions) {
|
|
props[key] = validateProp(key, propOptions, propsData || emptyObject);
|
|
}
|
|
} else {
|
|
if (isDef(data.attrs)) { mergeProps(props, data.attrs); }
|
|
if (isDef(data.props)) { mergeProps(props, data.props); }
|
|
}
|
|
|
|
var renderContext = new FunctionalRenderContext(
|
|
data,
|
|
props,
|
|
children,
|
|
contextVm,
|
|
Ctor
|
|
);
|
|
|
|
var vnode = options.render.call(null, renderContext._c, renderContext);
|
|
|
|
if (vnode instanceof VNode) {
|
|
return cloneAndMarkFunctionalResult(vnode, data, renderContext.parent, options, renderContext)
|
|
} else if (Array.isArray(vnode)) {
|
|
var vnodes = normalizeChildren(vnode) || [];
|
|
var res = new Array(vnodes.length);
|
|
for (var i = 0; i < vnodes.length; i++) {
|
|
res[i] = cloneAndMarkFunctionalResult(vnodes[i], data, renderContext.parent, options, renderContext);
|
|
}
|
|
return res
|
|
}
|
|
}
|
|
|
|
function cloneAndMarkFunctionalResult (vnode, data, contextVm, options, renderContext) {
|
|
// #7817 clone node before setting fnContext, otherwise if the node is reused
|
|
// (e.g. it was from a cached normal slot) the fnContext causes named slots
|
|
// that should not be matched to match.
|
|
var clone = cloneVNode(vnode);
|
|
clone.fnContext = contextVm;
|
|
clone.fnOptions = options;
|
|
if (true) {
|
|
(clone.devtoolsMeta = clone.devtoolsMeta || {}).renderContext = renderContext;
|
|
}
|
|
if (data.slot) {
|
|
(clone.data || (clone.data = {})).slot = data.slot;
|
|
}
|
|
return clone
|
|
}
|
|
|
|
function mergeProps (to, from) {
|
|
for (var key in from) {
|
|
to[camelize(key)] = from[key];
|
|
}
|
|
}
|
|
|
|
/* */
|
|
|
|
/* */
|
|
|
|
/* */
|
|
|
|
/* */
|
|
|
|
// inline hooks to be invoked on component VNodes during patch
|
|
var componentVNodeHooks = {
|
|
init: function init (vnode, hydrating) {
|
|
if (
|
|
vnode.componentInstance &&
|
|
!vnode.componentInstance._isDestroyed &&
|
|
vnode.data.keepAlive
|
|
) {
|
|
// kept-alive components, treat as a patch
|
|
var mountedNode = vnode; // work around flow
|
|
componentVNodeHooks.prepatch(mountedNode, mountedNode);
|
|
} else {
|
|
var child = vnode.componentInstance = createComponentInstanceForVnode(
|
|
vnode,
|
|
activeInstance
|
|
);
|
|
child.$mount(hydrating ? vnode.elm : undefined, hydrating);
|
|
}
|
|
},
|
|
|
|
prepatch: function prepatch (oldVnode, vnode) {
|
|
var options = vnode.componentOptions;
|
|
var child = vnode.componentInstance = oldVnode.componentInstance;
|
|
updateChildComponent(
|
|
child,
|
|
options.propsData, // updated props
|
|
options.listeners, // updated listeners
|
|
vnode, // new parent vnode
|
|
options.children // new children
|
|
);
|
|
},
|
|
|
|
insert: function insert (vnode) {
|
|
var context = vnode.context;
|
|
var componentInstance = vnode.componentInstance;
|
|
if (!componentInstance._isMounted) {
|
|
callHook(componentInstance, 'onServiceCreated');
|
|
callHook(componentInstance, 'onServiceAttached');
|
|
componentInstance._isMounted = true;
|
|
callHook(componentInstance, 'mounted');
|
|
}
|
|
if (vnode.data.keepAlive) {
|
|
if (context._isMounted) {
|
|
// vue-router#1212
|
|
// During updates, a kept-alive component's child components may
|
|
// change, so directly walking the tree here may call activated hooks
|
|
// on incorrect children. Instead we push them into a queue which will
|
|
// be processed after the whole patch process ended.
|
|
queueActivatedComponent(componentInstance);
|
|
} else {
|
|
activateChildComponent(componentInstance, true /* direct */);
|
|
}
|
|
}
|
|
},
|
|
|
|
destroy: function destroy (vnode) {
|
|
var componentInstance = vnode.componentInstance;
|
|
if (!componentInstance._isDestroyed) {
|
|
if (!vnode.data.keepAlive) {
|
|
componentInstance.$destroy();
|
|
} else {
|
|
deactivateChildComponent(componentInstance, true /* direct */);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
var hooksToMerge = Object.keys(componentVNodeHooks);
|
|
|
|
function createComponent (
|
|
Ctor,
|
|
data,
|
|
context,
|
|
children,
|
|
tag
|
|
) {
|
|
if (isUndef(Ctor)) {
|
|
return
|
|
}
|
|
|
|
var baseCtor = context.$options._base;
|
|
|
|
// plain options object: turn it into a constructor
|
|
if (isObject(Ctor)) {
|
|
Ctor = baseCtor.extend(Ctor);
|
|
}
|
|
|
|
// if at this stage it's not a constructor or an async component factory,
|
|
// reject.
|
|
if (typeof Ctor !== 'function') {
|
|
if (true) {
|
|
warn(("Invalid Component definition: " + (String(Ctor))), context);
|
|
}
|
|
return
|
|
}
|
|
|
|
// async component
|
|
var asyncFactory;
|
|
if (isUndef(Ctor.cid)) {
|
|
asyncFactory = Ctor;
|
|
Ctor = resolveAsyncComponent(asyncFactory, baseCtor);
|
|
if (Ctor === undefined) {
|
|
// return a placeholder node for async component, which is rendered
|
|
// as a comment node but preserves all the raw information for the node.
|
|
// the information will be used for async server-rendering and hydration.
|
|
return createAsyncPlaceholder(
|
|
asyncFactory,
|
|
data,
|
|
context,
|
|
children,
|
|
tag
|
|
)
|
|
}
|
|
}
|
|
|
|
data = data || {};
|
|
|
|
// resolve constructor options in case global mixins are applied after
|
|
// component constructor creation
|
|
resolveConstructorOptions(Ctor);
|
|
|
|
// transform component v-model data into props & events
|
|
if (isDef(data.model)) {
|
|
transformModel(Ctor.options, data);
|
|
}
|
|
|
|
// extract props
|
|
var propsData = extractPropsFromVNodeData(data, Ctor, tag, context); // fixed by xxxxxx
|
|
|
|
// functional component
|
|
if (isTrue(Ctor.options.functional)) {
|
|
return createFunctionalComponent(Ctor, propsData, data, context, children)
|
|
}
|
|
|
|
// extract listeners, since these needs to be treated as
|
|
// child component listeners instead of DOM listeners
|
|
var listeners = data.on;
|
|
// replace with listeners with .native modifier
|
|
// so it gets processed during parent component patch.
|
|
data.on = data.nativeOn;
|
|
|
|
if (isTrue(Ctor.options.abstract)) {
|
|
// abstract components do not keep anything
|
|
// other than props & listeners & slot
|
|
|
|
// work around flow
|
|
var slot = data.slot;
|
|
data = {};
|
|
if (slot) {
|
|
data.slot = slot;
|
|
}
|
|
}
|
|
|
|
// install component management hooks onto the placeholder node
|
|
installComponentHooks(data);
|
|
|
|
// return a placeholder vnode
|
|
var name = Ctor.options.name || tag;
|
|
var vnode = new VNode(
|
|
("vue-component-" + (Ctor.cid) + (name ? ("-" + name) : '')),
|
|
data, undefined, undefined, undefined, context,
|
|
{ Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children },
|
|
asyncFactory
|
|
);
|
|
|
|
return vnode
|
|
}
|
|
|
|
function createComponentInstanceForVnode (
|
|
vnode, // we know it's MountedComponentVNode but flow doesn't
|
|
parent // activeInstance in lifecycle state
|
|
) {
|
|
var options = {
|
|
_isComponent: true,
|
|
_parentVnode: vnode,
|
|
parent: parent
|
|
};
|
|
// check inline-template render functions
|
|
var inlineTemplate = vnode.data.inlineTemplate;
|
|
if (isDef(inlineTemplate)) {
|
|
options.render = inlineTemplate.render;
|
|
options.staticRenderFns = inlineTemplate.staticRenderFns;
|
|
}
|
|
return new vnode.componentOptions.Ctor(options)
|
|
}
|
|
|
|
function installComponentHooks (data) {
|
|
var hooks = data.hook || (data.hook = {});
|
|
for (var i = 0; i < hooksToMerge.length; i++) {
|
|
var key = hooksToMerge[i];
|
|
var existing = hooks[key];
|
|
var toMerge = componentVNodeHooks[key];
|
|
if (existing !== toMerge && !(existing && existing._merged)) {
|
|
hooks[key] = existing ? mergeHook$1(toMerge, existing) : toMerge;
|
|
}
|
|
}
|
|
}
|
|
|
|
function mergeHook$1 (f1, f2) {
|
|
var merged = function (a, b) {
|
|
// flow complains about extra args which is why we use any
|
|
f1(a, b);
|
|
f2(a, b);
|
|
};
|
|
merged._merged = true;
|
|
return merged
|
|
}
|
|
|
|
// transform component v-model info (value and callback) into
|
|
// prop and event handler respectively.
|
|
function transformModel (options, data) {
|
|
var prop = (options.model && options.model.prop) || 'value';
|
|
var event = (options.model && options.model.event) || 'input'
|
|
;(data.attrs || (data.attrs = {}))[prop] = data.model.value;
|
|
var on = data.on || (data.on = {});
|
|
var existing = on[event];
|
|
var callback = data.model.callback;
|
|
if (isDef(existing)) {
|
|
if (
|
|
Array.isArray(existing)
|
|
? existing.indexOf(callback) === -1
|
|
: existing !== callback
|
|
) {
|
|
on[event] = [callback].concat(existing);
|
|
}
|
|
} else {
|
|
on[event] = callback;
|
|
}
|
|
}
|
|
|
|
/* */
|
|
|
|
var SIMPLE_NORMALIZE = 1;
|
|
var ALWAYS_NORMALIZE = 2;
|
|
|
|
// wrapper function for providing a more flexible interface
|
|
// without getting yelled at by flow
|
|
function createElement (
|
|
context,
|
|
tag,
|
|
data,
|
|
children,
|
|
normalizationType,
|
|
alwaysNormalize
|
|
) {
|
|
if (Array.isArray(data) || isPrimitive(data)) {
|
|
normalizationType = children;
|
|
children = data;
|
|
data = undefined;
|
|
}
|
|
if (isTrue(alwaysNormalize)) {
|
|
normalizationType = ALWAYS_NORMALIZE;
|
|
}
|
|
return _createElement(context, tag, data, children, normalizationType)
|
|
}
|
|
|
|
function _createElement (
|
|
context,
|
|
tag,
|
|
data,
|
|
children,
|
|
normalizationType
|
|
) {
|
|
if (isDef(data) && isDef((data).__ob__)) {
|
|
true && warn(
|
|
"Avoid using observed data object as vnode data: " + (JSON.stringify(data)) + "\n" +
|
|
'Always create fresh vnode data objects in each render!',
|
|
context
|
|
);
|
|
return createEmptyVNode()
|
|
}
|
|
// object syntax in v-bind
|
|
if (isDef(data) && isDef(data.is)) {
|
|
tag = data.is;
|
|
}
|
|
if (!tag) {
|
|
// in case of component :is set to falsy value
|
|
return createEmptyVNode()
|
|
}
|
|
// warn against non-primitive key
|
|
if ( true &&
|
|
isDef(data) && isDef(data.key) && !isPrimitive(data.key)
|
|
) {
|
|
{
|
|
warn(
|
|
'Avoid using non-primitive value as key, ' +
|
|
'use string/number value instead.',
|
|
context
|
|
);
|
|
}
|
|
}
|
|
// support single function children as default scoped slot
|
|
if (Array.isArray(children) &&
|
|
typeof children[0] === 'function'
|
|
) {
|
|
data = data || {};
|
|
data.scopedSlots = { default: children[0] };
|
|
children.length = 0;
|
|
}
|
|
if (normalizationType === ALWAYS_NORMALIZE) {
|
|
children = normalizeChildren(children);
|
|
} else if (normalizationType === SIMPLE_NORMALIZE) {
|
|
children = simpleNormalizeChildren(children);
|
|
}
|
|
var vnode, ns;
|
|
if (typeof tag === 'string') {
|
|
var Ctor;
|
|
ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag);
|
|
if (config.isReservedTag(tag)) {
|
|
// platform built-in elements
|
|
if ( true && isDef(data) && isDef(data.nativeOn)) {
|
|
warn(
|
|
("The .native modifier for v-on is only valid on components but it was used on <" + tag + ">."),
|
|
context
|
|
);
|
|
}
|
|
vnode = new VNode(
|
|
config.parsePlatformTagName(tag), data, children,
|
|
undefined, undefined, context
|
|
);
|
|
} else if ((!data || !data.pre) && isDef(Ctor = resolveAsset(context.$options, 'components', tag))) {
|
|
// component
|
|
vnode = createComponent(Ctor, data, context, children, tag);
|
|
} else {
|
|
// unknown or unlisted namespaced elements
|
|
// check at runtime because it may get assigned a namespace when its
|
|
// parent normalizes children
|
|
vnode = new VNode(
|
|
tag, data, children,
|
|
undefined, undefined, context
|
|
);
|
|
}
|
|
} else {
|
|
// direct component options / constructor
|
|
vnode = createComponent(tag, data, context, children);
|
|
}
|
|
if (Array.isArray(vnode)) {
|
|
return vnode
|
|
} else if (isDef(vnode)) {
|
|
if (isDef(ns)) { applyNS(vnode, ns); }
|
|
if (isDef(data)) { registerDeepBindings(data); }
|
|
return vnode
|
|
} else {
|
|
return createEmptyVNode()
|
|
}
|
|
}
|
|
|
|
function applyNS (vnode, ns, force) {
|
|
vnode.ns = ns;
|
|
if (vnode.tag === 'foreignObject') {
|
|
// use default namespace inside foreignObject
|
|
ns = undefined;
|
|
force = true;
|
|
}
|
|
if (isDef(vnode.children)) {
|
|
for (var i = 0, l = vnode.children.length; i < l; i++) {
|
|
var child = vnode.children[i];
|
|
if (isDef(child.tag) && (
|
|
isUndef(child.ns) || (isTrue(force) && child.tag !== 'svg'))) {
|
|
applyNS(child, ns, force);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// ref #5318
|
|
// necessary to ensure parent re-render when deep bindings like :style and
|
|
// :class are used on slot nodes
|
|
function registerDeepBindings (data) {
|
|
if (isObject(data.style)) {
|
|
traverse(data.style);
|
|
}
|
|
if (isObject(data.class)) {
|
|
traverse(data.class);
|
|
}
|
|
}
|
|
|
|
/* */
|
|
|
|
function initRender (vm) {
|
|
vm._vnode = null; // the root of the child tree
|
|
vm._staticTrees = null; // v-once cached trees
|
|
var options = vm.$options;
|
|
var parentVnode = vm.$vnode = options._parentVnode; // the placeholder node in parent tree
|
|
var renderContext = parentVnode && parentVnode.context;
|
|
vm.$slots = resolveSlots(options._renderChildren, renderContext);
|
|
vm.$scopedSlots = emptyObject;
|
|
// bind the createElement fn to this instance
|
|
// so that we get proper render context inside it.
|
|
// args order: tag, data, children, normalizationType, alwaysNormalize
|
|
// internal version is used by render functions compiled from templates
|
|
vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); };
|
|
// normalization is always applied for the public version, used in
|
|
// user-written render functions.
|
|
vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); };
|
|
|
|
// $attrs & $listeners are exposed for easier HOC creation.
|
|
// they need to be reactive so that HOCs using them are always updated
|
|
var parentData = parentVnode && parentVnode.data;
|
|
|
|
/* istanbul ignore else */
|
|
if (true) {
|
|
defineReactive$$1(vm, '$attrs', parentData && parentData.attrs || emptyObject, function () {
|
|
!isUpdatingChildComponent && warn("$attrs is readonly.", vm);
|
|
}, true);
|
|
defineReactive$$1(vm, '$listeners', options._parentListeners || emptyObject, function () {
|
|
!isUpdatingChildComponent && warn("$listeners is readonly.", vm);
|
|
}, true);
|
|
} else {}
|
|
}
|
|
|
|
var currentRenderingInstance = null;
|
|
|
|
function renderMixin (Vue) {
|
|
// install runtime convenience helpers
|
|
installRenderHelpers(Vue.prototype);
|
|
|
|
Vue.prototype.$nextTick = function (fn) {
|
|
return nextTick(fn, this)
|
|
};
|
|
|
|
Vue.prototype._render = function () {
|
|
var vm = this;
|
|
var ref = vm.$options;
|
|
var render = ref.render;
|
|
var _parentVnode = ref._parentVnode;
|
|
|
|
if (_parentVnode) {
|
|
vm.$scopedSlots = normalizeScopedSlots(
|
|
_parentVnode.data.scopedSlots,
|
|
vm.$slots,
|
|
vm.$scopedSlots
|
|
);
|
|
}
|
|
|
|
// set parent vnode. this allows render functions to have access
|
|
// to the data on the placeholder node.
|
|
vm.$vnode = _parentVnode;
|
|
// render self
|
|
var vnode;
|
|
try {
|
|
// There's no need to maintain a stack because all render fns are called
|
|
// separately from one another. Nested component's render fns are called
|
|
// when parent component is patched.
|
|
currentRenderingInstance = vm;
|
|
vnode = render.call(vm._renderProxy, vm.$createElement);
|
|
} catch (e) {
|
|
handleError(e, vm, "render");
|
|
// return error render result,
|
|
// or previous vnode to prevent render error causing blank component
|
|
/* istanbul ignore else */
|
|
if ( true && vm.$options.renderError) {
|
|
try {
|
|
vnode = vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e);
|
|
} catch (e) {
|
|
handleError(e, vm, "renderError");
|
|
vnode = vm._vnode;
|
|
}
|
|
} else {
|
|
vnode = vm._vnode;
|
|
}
|
|
} finally {
|
|
currentRenderingInstance = null;
|
|
}
|
|
// if the returned array contains only a single node, allow it
|
|
if (Array.isArray(vnode) && vnode.length === 1) {
|
|
vnode = vnode[0];
|
|
}
|
|
// return empty vnode in case the render function errored out
|
|
if (!(vnode instanceof VNode)) {
|
|
if ( true && Array.isArray(vnode)) {
|
|
warn(
|
|
'Multiple root nodes returned from render function. Render function ' +
|
|
'should return a single root node.',
|
|
vm
|
|
);
|
|
}
|
|
vnode = createEmptyVNode();
|
|
}
|
|
// set parent
|
|
vnode.parent = _parentVnode;
|
|
return vnode
|
|
};
|
|
}
|
|
|
|
/* */
|
|
|
|
function ensureCtor (comp, base) {
|
|
if (
|
|
comp.__esModule ||
|
|
(hasSymbol && comp[Symbol.toStringTag] === 'Module')
|
|
) {
|
|
comp = comp.default;
|
|
}
|
|
return isObject(comp)
|
|
? base.extend(comp)
|
|
: comp
|
|
}
|
|
|
|
function createAsyncPlaceholder (
|
|
factory,
|
|
data,
|
|
context,
|
|
children,
|
|
tag
|
|
) {
|
|
var node = createEmptyVNode();
|
|
node.asyncFactory = factory;
|
|
node.asyncMeta = { data: data, context: context, children: children, tag: tag };
|
|
return node
|
|
}
|
|
|
|
function resolveAsyncComponent (
|
|
factory,
|
|
baseCtor
|
|
) {
|
|
if (isTrue(factory.error) && isDef(factory.errorComp)) {
|
|
return factory.errorComp
|
|
}
|
|
|
|
if (isDef(factory.resolved)) {
|
|
return factory.resolved
|
|
}
|
|
|
|
var owner = currentRenderingInstance;
|
|
if (owner && isDef(factory.owners) && factory.owners.indexOf(owner) === -1) {
|
|
// already pending
|
|
factory.owners.push(owner);
|
|
}
|
|
|
|
if (isTrue(factory.loading) && isDef(factory.loadingComp)) {
|
|
return factory.loadingComp
|
|
}
|
|
|
|
if (owner && !isDef(factory.owners)) {
|
|
var owners = factory.owners = [owner];
|
|
var sync = true;
|
|
var timerLoading = null;
|
|
var timerTimeout = null
|
|
|
|
;(owner).$on('hook:destroyed', function () { return remove(owners, owner); });
|
|
|
|
var forceRender = function (renderCompleted) {
|
|
for (var i = 0, l = owners.length; i < l; i++) {
|
|
(owners[i]).$forceUpdate();
|
|
}
|
|
|
|
if (renderCompleted) {
|
|
owners.length = 0;
|
|
if (timerLoading !== null) {
|
|
clearTimeout(timerLoading);
|
|
timerLoading = null;
|
|
}
|
|
if (timerTimeout !== null) {
|
|
clearTimeout(timerTimeout);
|
|
timerTimeout = null;
|
|
}
|
|
}
|
|
};
|
|
|
|
var resolve = once(function (res) {
|
|
// cache resolved
|
|
factory.resolved = ensureCtor(res, baseCtor);
|
|
// invoke callbacks only if this is not a synchronous resolve
|
|
// (async resolves are shimmed as synchronous during SSR)
|
|
if (!sync) {
|
|
forceRender(true);
|
|
} else {
|
|
owners.length = 0;
|
|
}
|
|
});
|
|
|
|
var reject = once(function (reason) {
|
|
true && warn(
|
|
"Failed to resolve async component: " + (String(factory)) +
|
|
(reason ? ("\nReason: " + reason) : '')
|
|
);
|
|
if (isDef(factory.errorComp)) {
|
|
factory.error = true;
|
|
forceRender(true);
|
|
}
|
|
});
|
|
|
|
var res = factory(resolve, reject);
|
|
|
|
if (isObject(res)) {
|
|
if (isPromise(res)) {
|
|
// () => Promise
|
|
if (isUndef(factory.resolved)) {
|
|
res.then(resolve, reject);
|
|
}
|
|
} else if (isPromise(res.component)) {
|
|
res.component.then(resolve, reject);
|
|
|
|
if (isDef(res.error)) {
|
|
factory.errorComp = ensureCtor(res.error, baseCtor);
|
|
}
|
|
|
|
if (isDef(res.loading)) {
|
|
factory.loadingComp = ensureCtor(res.loading, baseCtor);
|
|
if (res.delay === 0) {
|
|
factory.loading = true;
|
|
} else {
|
|
timerLoading = setTimeout(function () {
|
|
timerLoading = null;
|
|
if (isUndef(factory.resolved) && isUndef(factory.error)) {
|
|
factory.loading = true;
|
|
forceRender(false);
|
|
}
|
|
}, res.delay || 200);
|
|
}
|
|
}
|
|
|
|
if (isDef(res.timeout)) {
|
|
timerTimeout = setTimeout(function () {
|
|
timerTimeout = null;
|
|
if (isUndef(factory.resolved)) {
|
|
reject(
|
|
true
|
|
? ("timeout (" + (res.timeout) + "ms)")
|
|
: undefined
|
|
);
|
|
}
|
|
}, res.timeout);
|
|
}
|
|
}
|
|
}
|
|
|
|
sync = false;
|
|
// return in case resolved synchronously
|
|
return factory.loading
|
|
? factory.loadingComp
|
|
: factory.resolved
|
|
}
|
|
}
|
|
|
|
/* */
|
|
|
|
function isAsyncPlaceholder (node) {
|
|
return node.isComment && node.asyncFactory
|
|
}
|
|
|
|
/* */
|
|
|
|
function getFirstComponentChild (children) {
|
|
if (Array.isArray(children)) {
|
|
for (var i = 0; i < children.length; i++) {
|
|
var c = children[i];
|
|
if (isDef(c) && (isDef(c.componentOptions) || isAsyncPlaceholder(c))) {
|
|
return c
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* */
|
|
|
|
/* */
|
|
|
|
function initEvents (vm) {
|
|
vm._events = Object.create(null);
|
|
vm._hasHookEvent = false;
|
|
// init parent attached events
|
|
var listeners = vm.$options._parentListeners;
|
|
if (listeners) {
|
|
updateComponentListeners(vm, listeners);
|
|
}
|
|
}
|
|
|
|
var target;
|
|
|
|
function add (event, fn) {
|
|
target.$on(event, fn);
|
|
}
|
|
|
|
function remove$1 (event, fn) {
|
|
target.$off(event, fn);
|
|
}
|
|
|
|
function createOnceHandler (event, fn) {
|
|
var _target = target;
|
|
return function onceHandler () {
|
|
var res = fn.apply(null, arguments);
|
|
if (res !== null) {
|
|
_target.$off(event, onceHandler);
|
|
}
|
|
}
|
|
}
|
|
|
|
function updateComponentListeners (
|
|
vm,
|
|
listeners,
|
|
oldListeners
|
|
) {
|
|
target = vm;
|
|
updateListeners(listeners, oldListeners || {}, add, remove$1, createOnceHandler, vm);
|
|
target = undefined;
|
|
}
|
|
|
|
function eventsMixin (Vue) {
|
|
var hookRE = /^hook:/;
|
|
Vue.prototype.$on = function (event, fn) {
|
|
var vm = this;
|
|
if (Array.isArray(event)) {
|
|
for (var i = 0, l = event.length; i < l; i++) {
|
|
vm.$on(event[i], fn);
|
|
}
|
|
} else {
|
|
(vm._events[event] || (vm._events[event] = [])).push(fn);
|
|
// optimize hook:event cost by using a boolean flag marked at registration
|
|
// instead of a hash lookup
|
|
if (hookRE.test(event)) {
|
|
vm._hasHookEvent = true;
|
|
}
|
|
}
|
|
return vm
|
|
};
|
|
|
|
Vue.prototype.$once = function (event, fn) {
|
|
var vm = this;
|
|
function on () {
|
|
vm.$off(event, on);
|
|
fn.apply(vm, arguments);
|
|
}
|
|
on.fn = fn;
|
|
vm.$on(event, on);
|
|
return vm
|
|
};
|
|
|
|
Vue.prototype.$off = function (event, fn) {
|
|
var vm = this;
|
|
// all
|
|
if (!arguments.length) {
|
|
vm._events = Object.create(null);
|
|
return vm
|
|
}
|
|
// array of events
|
|
if (Array.isArray(event)) {
|
|
for (var i$1 = 0, l = event.length; i$1 < l; i$1++) {
|
|
vm.$off(event[i$1], fn);
|
|
}
|
|
return vm
|
|
}
|
|
// specific event
|
|
var cbs = vm._events[event];
|
|
if (!cbs) {
|
|
return vm
|
|
}
|
|
if (!fn) {
|
|
vm._events[event] = null;
|
|
return vm
|
|
}
|
|
// specific handler
|
|
var cb;
|
|
var i = cbs.length;
|
|
while (i--) {
|
|
cb = cbs[i];
|
|
if (cb === fn || cb.fn === fn) {
|
|
cbs.splice(i, 1);
|
|
break
|
|
}
|
|
}
|
|
return vm
|
|
};
|
|
|
|
Vue.prototype.$emit = function (event) {
|
|
var vm = this;
|
|
if (true) {
|
|
var lowerCaseEvent = event.toLowerCase();
|
|
if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) {
|
|
tip(
|
|
"Event \"" + lowerCaseEvent + "\" is emitted in component " +
|
|
(formatComponentName(vm)) + " but the handler is registered for \"" + event + "\". " +
|
|
"Note that HTML attributes are case-insensitive and you cannot use " +
|
|
"v-on to listen to camelCase events when using in-DOM templates. " +
|
|
"You should probably use \"" + (hyphenate(event)) + "\" instead of \"" + event + "\"."
|
|
);
|
|
}
|
|
}
|
|
var cbs = vm._events[event];
|
|
if (cbs) {
|
|
cbs = cbs.length > 1 ? toArray(cbs) : cbs;
|
|
var args = toArray(arguments, 1);
|
|
var info = "event handler for \"" + event + "\"";
|
|
for (var i = 0, l = cbs.length; i < l; i++) {
|
|
invokeWithErrorHandling(cbs[i], vm, args, vm, info);
|
|
}
|
|
}
|
|
return vm
|
|
};
|
|
}
|
|
|
|
/* */
|
|
|
|
var activeInstance = null;
|
|
var isUpdatingChildComponent = false;
|
|
|
|
function setActiveInstance(vm) {
|
|
var prevActiveInstance = activeInstance;
|
|
activeInstance = vm;
|
|
return function () {
|
|
activeInstance = prevActiveInstance;
|
|
}
|
|
}
|
|
|
|
function initLifecycle (vm) {
|
|
var options = vm.$options;
|
|
|
|
// locate first non-abstract parent
|
|
var parent = options.parent;
|
|
if (parent && !options.abstract) {
|
|
while (parent.$options.abstract && parent.$parent) {
|
|
parent = parent.$parent;
|
|
}
|
|
parent.$children.push(vm);
|
|
}
|
|
|
|
vm.$parent = parent;
|
|
vm.$root = parent ? parent.$root : vm;
|
|
|
|
vm.$children = [];
|
|
vm.$refs = {};
|
|
|
|
vm._watcher = null;
|
|
vm._inactive = null;
|
|
vm._directInactive = false;
|
|
vm._isMounted = false;
|
|
vm._isDestroyed = false;
|
|
vm._isBeingDestroyed = false;
|
|
}
|
|
|
|
function lifecycleMixin (Vue) {
|
|
Vue.prototype._update = function (vnode, hydrating) {
|
|
var vm = this;
|
|
var prevEl = vm.$el;
|
|
var prevVnode = vm._vnode;
|
|
var restoreActiveInstance = setActiveInstance(vm);
|
|
vm._vnode = vnode;
|
|
// Vue.prototype.__patch__ is injected in entry points
|
|
// based on the rendering backend used.
|
|
if (!prevVnode) {
|
|
// initial render
|
|
vm.$el = vm.__patch__(vm.$el, vnode, hydrating, false /* removeOnly */);
|
|
} else {
|
|
// updates
|
|
vm.$el = vm.__patch__(prevVnode, vnode);
|
|
}
|
|
restoreActiveInstance();
|
|
// update __vue__ reference
|
|
if (prevEl) {
|
|
prevEl.__vue__ = null;
|
|
}
|
|
if (vm.$el) {
|
|
vm.$el.__vue__ = vm;
|
|
}
|
|
// if parent is an HOC, update its $el as well
|
|
if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {
|
|
vm.$parent.$el = vm.$el;
|
|
}
|
|
// updated hook is called by the scheduler to ensure that children are
|
|
// updated in a parent's updated hook.
|
|
};
|
|
|
|
Vue.prototype.$forceUpdate = function () {
|
|
var vm = this;
|
|
if (vm._watcher) {
|
|
vm._watcher.update();
|
|
}
|
|
};
|
|
|
|
Vue.prototype.$destroy = function () {
|
|
var vm = this;
|
|
if (vm._isBeingDestroyed) {
|
|
return
|
|
}
|
|
callHook(vm, 'beforeDestroy');
|
|
vm._isBeingDestroyed = true;
|
|
// remove self from parent
|
|
var parent = vm.$parent;
|
|
if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) {
|
|
remove(parent.$children, vm);
|
|
}
|
|
// teardown watchers
|
|
if (vm._watcher) {
|
|
vm._watcher.teardown();
|
|
}
|
|
var i = vm._watchers.length;
|
|
while (i--) {
|
|
vm._watchers[i].teardown();
|
|
}
|
|
// remove reference from data ob
|
|
// frozen object may not have observer.
|
|
if (vm._data.__ob__) {
|
|
vm._data.__ob__.vmCount--;
|
|
}
|
|
// call the last hook...
|
|
vm._isDestroyed = true;
|
|
// invoke destroy hooks on current rendered tree
|
|
vm.__patch__(vm._vnode, null);
|
|
// fire destroyed hook
|
|
callHook(vm, 'destroyed');
|
|
// turn off all instance listeners.
|
|
vm.$off();
|
|
// remove __vue__ reference
|
|
if (vm.$el) {
|
|
vm.$el.__vue__ = null;
|
|
}
|
|
// release circular reference (#6759)
|
|
if (vm.$vnode) {
|
|
vm.$vnode.parent = null;
|
|
}
|
|
};
|
|
}
|
|
|
|
function updateChildComponent (
|
|
vm,
|
|
propsData,
|
|
listeners,
|
|
parentVnode,
|
|
renderChildren
|
|
) {
|
|
if (true) {
|
|
isUpdatingChildComponent = true;
|
|
}
|
|
|
|
// determine whether component has slot children
|
|
// we need to do this before overwriting $options._renderChildren.
|
|
|
|
// check if there are dynamic scopedSlots (hand-written or compiled but with
|
|
// dynamic slot names). Static scoped slots compiled from template has the
|
|
// "$stable" marker.
|
|
var newScopedSlots = parentVnode.data.scopedSlots;
|
|
var oldScopedSlots = vm.$scopedSlots;
|
|
var hasDynamicScopedSlot = !!(
|
|
(newScopedSlots && !newScopedSlots.$stable) ||
|
|
(oldScopedSlots !== emptyObject && !oldScopedSlots.$stable) ||
|
|
(newScopedSlots && vm.$scopedSlots.$key !== newScopedSlots.$key)
|
|
);
|
|
|
|
// Any static slot children from the parent may have changed during parent's
|
|
// update. Dynamic scoped slots may also have changed. In such cases, a forced
|
|
// update is necessary to ensure correctness.
|
|
var needsForceUpdate = !!(
|
|
renderChildren || // has new static slots
|
|
vm.$options._renderChildren || // has old static slots
|
|
hasDynamicScopedSlot
|
|
);
|
|
|
|
vm.$options._parentVnode = parentVnode;
|
|
vm.$vnode = parentVnode; // update vm's placeholder node without re-render
|
|
|
|
if (vm._vnode) { // update child tree's parent
|
|
vm._vnode.parent = parentVnode;
|
|
}
|
|
vm.$options._renderChildren = renderChildren;
|
|
|
|
// update $attrs and $listeners hash
|
|
// these are also reactive so they may trigger child update if the child
|
|
// used them during render
|
|
vm.$attrs = parentVnode.data.attrs || emptyObject;
|
|
vm.$listeners = listeners || emptyObject;
|
|
|
|
// update props
|
|
if (propsData && vm.$options.props) {
|
|
toggleObserving(false);
|
|
var props = vm._props;
|
|
var propKeys = vm.$options._propKeys || [];
|
|
for (var i = 0; i < propKeys.length; i++) {
|
|
var key = propKeys[i];
|
|
var propOptions = vm.$options.props; // wtf flow?
|
|
props[key] = validateProp(key, propOptions, propsData, vm);
|
|
}
|
|
toggleObserving(true);
|
|
// keep a copy of raw propsData
|
|
vm.$options.propsData = propsData;
|
|
}
|
|
|
|
// fixed by xxxxxx update properties(mp runtime)
|
|
vm._$updateProperties && vm._$updateProperties(vm);
|
|
|
|
// update listeners
|
|
listeners = listeners || emptyObject;
|
|
var oldListeners = vm.$options._parentListeners;
|
|
vm.$options._parentListeners = listeners;
|
|
updateComponentListeners(vm, listeners, oldListeners);
|
|
|
|
// resolve slots + force update if has children
|
|
if (needsForceUpdate) {
|
|
vm.$slots = resolveSlots(renderChildren, parentVnode.context);
|
|
vm.$forceUpdate();
|
|
}
|
|
|
|
if (true) {
|
|
isUpdatingChildComponent = false;
|
|
}
|
|
}
|
|
|
|
function isInInactiveTree (vm) {
|
|
while (vm && (vm = vm.$parent)) {
|
|
if (vm._inactive) { return true }
|
|
}
|
|
return false
|
|
}
|
|
|
|
function activateChildComponent (vm, direct) {
|
|
if (direct) {
|
|
vm._directInactive = false;
|
|
if (isInInactiveTree(vm)) {
|
|
return
|
|
}
|
|
} else if (vm._directInactive) {
|
|
return
|
|
}
|
|
if (vm._inactive || vm._inactive === null) {
|
|
vm._inactive = false;
|
|
for (var i = 0; i < vm.$children.length; i++) {
|
|
activateChildComponent(vm.$children[i]);
|
|
}
|
|
callHook(vm, 'activated');
|
|
}
|
|
}
|
|
|
|
function deactivateChildComponent (vm, direct) {
|
|
if (direct) {
|
|
vm._directInactive = true;
|
|
if (isInInactiveTree(vm)) {
|
|
return
|
|
}
|
|
}
|
|
if (!vm._inactive) {
|
|
vm._inactive = true;
|
|
for (var i = 0; i < vm.$children.length; i++) {
|
|
deactivateChildComponent(vm.$children[i]);
|
|
}
|
|
callHook(vm, 'deactivated');
|
|
}
|
|
}
|
|
|
|
function callHook (vm, hook) {
|
|
// #7573 disable dep collection when invoking lifecycle hooks
|
|
pushTarget();
|
|
var handlers = vm.$options[hook];
|
|
var info = hook + " hook";
|
|
if (handlers) {
|
|
for (var i = 0, j = handlers.length; i < j; i++) {
|
|
invokeWithErrorHandling(handlers[i], vm, null, vm, info);
|
|
}
|
|
}
|
|
if (vm._hasHookEvent) {
|
|
vm.$emit('hook:' + hook);
|
|
}
|
|
popTarget();
|
|
}
|
|
|
|
/* */
|
|
|
|
var MAX_UPDATE_COUNT = 100;
|
|
|
|
var queue = [];
|
|
var activatedChildren = [];
|
|
var has = {};
|
|
var circular = {};
|
|
var waiting = false;
|
|
var flushing = false;
|
|
var index = 0;
|
|
|
|
/**
|
|
* Reset the scheduler's state.
|
|
*/
|
|
function resetSchedulerState () {
|
|
index = queue.length = activatedChildren.length = 0;
|
|
has = {};
|
|
if (true) {
|
|
circular = {};
|
|
}
|
|
waiting = flushing = false;
|
|
}
|
|
|
|
// Async edge case #6566 requires saving the timestamp when event listeners are
|
|
// attached. However, calling performance.now() has a perf overhead especially
|
|
// if the page has thousands of event listeners. Instead, we take a timestamp
|
|
// every time the scheduler flushes and use that for all event listeners
|
|
// attached during that flush.
|
|
var currentFlushTimestamp = 0;
|
|
|
|
// Async edge case fix requires storing an event listener's attach timestamp.
|
|
var getNow = Date.now;
|
|
|
|
// Determine what event timestamp the browser is using. Annoyingly, the
|
|
// timestamp can either be hi-res (relative to page load) or low-res
|
|
// (relative to UNIX epoch), so in order to compare time we have to use the
|
|
// same timestamp type when saving the flush timestamp.
|
|
// All IE versions use low-res event timestamps, and have problematic clock
|
|
// implementations (#9632)
|
|
if (inBrowser && !isIE) {
|
|
var performance = window.performance;
|
|
if (
|
|
performance &&
|
|
typeof performance.now === 'function' &&
|
|
getNow() > document.createEvent('Event').timeStamp
|
|
) {
|
|
// if the event timestamp, although evaluated AFTER the Date.now(), is
|
|
// smaller than it, it means the event is using a hi-res timestamp,
|
|
// and we need to use the hi-res version for event listener timestamps as
|
|
// well.
|
|
getNow = function () { return performance.now(); };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Flush both queues and run the watchers.
|
|
*/
|
|
function flushSchedulerQueue () {
|
|
currentFlushTimestamp = getNow();
|
|
flushing = true;
|
|
var watcher, id;
|
|
|
|
// Sort queue before flush.
|
|
// This ensures that:
|
|
// 1. Components are updated from parent to child. (because parent is always
|
|
// created before the child)
|
|
// 2. A component's user watchers are run before its render watcher (because
|
|
// user watchers are created before the render watcher)
|
|
// 3. If a component is destroyed during a parent component's watcher run,
|
|
// its watchers can be skipped.
|
|
queue.sort(function (a, b) { return a.id - b.id; });
|
|
|
|
// do not cache length because more watchers might be pushed
|
|
// as we run existing watchers
|
|
for (index = 0; index < queue.length; index++) {
|
|
watcher = queue[index];
|
|
if (watcher.before) {
|
|
watcher.before();
|
|
}
|
|
id = watcher.id;
|
|
has[id] = null;
|
|
watcher.run();
|
|
// in dev build, check and stop circular updates.
|
|
if ( true && has[id] != null) {
|
|
circular[id] = (circular[id] || 0) + 1;
|
|
if (circular[id] > MAX_UPDATE_COUNT) {
|
|
warn(
|
|
'You may have an infinite update loop ' + (
|
|
watcher.user
|
|
? ("in watcher with expression \"" + (watcher.expression) + "\"")
|
|
: "in a component render function."
|
|
),
|
|
watcher.vm
|
|
);
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
// keep copies of post queues before resetting state
|
|
var activatedQueue = activatedChildren.slice();
|
|
var updatedQueue = queue.slice();
|
|
|
|
resetSchedulerState();
|
|
|
|
// call component updated and activated hooks
|
|
callActivatedHooks(activatedQueue);
|
|
callUpdatedHooks(updatedQueue);
|
|
|
|
// devtool hook
|
|
/* istanbul ignore if */
|
|
if (devtools && config.devtools) {
|
|
devtools.emit('flush');
|
|
}
|
|
}
|
|
|
|
function callUpdatedHooks (queue) {
|
|
var i = queue.length;
|
|
while (i--) {
|
|
var watcher = queue[i];
|
|
var vm = watcher.vm;
|
|
if (vm._watcher === watcher && vm._isMounted && !vm._isDestroyed) {
|
|
callHook(vm, 'updated');
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Queue a kept-alive component that was activated during patch.
|
|
* The queue will be processed after the entire tree has been patched.
|
|
*/
|
|
function queueActivatedComponent (vm) {
|
|
// setting _inactive to false here so that a render function can
|
|
// rely on checking whether it's in an inactive tree (e.g. router-view)
|
|
vm._inactive = false;
|
|
activatedChildren.push(vm);
|
|
}
|
|
|
|
function callActivatedHooks (queue) {
|
|
for (var i = 0; i < queue.length; i++) {
|
|
queue[i]._inactive = true;
|
|
activateChildComponent(queue[i], true /* true */);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Push a watcher into the watcher queue.
|
|
* Jobs with duplicate IDs will be skipped unless it's
|
|
* pushed when the queue is being flushed.
|
|
*/
|
|
function queueWatcher (watcher) {
|
|
var id = watcher.id;
|
|
if (has[id] == null) {
|
|
has[id] = true;
|
|
if (!flushing) {
|
|
queue.push(watcher);
|
|
} else {
|
|
// if already flushing, splice the watcher based on its id
|
|
// if already past its id, it will be run next immediately.
|
|
var i = queue.length - 1;
|
|
while (i > index && queue[i].id > watcher.id) {
|
|
i--;
|
|
}
|
|
queue.splice(i + 1, 0, watcher);
|
|
}
|
|
// queue the flush
|
|
if (!waiting) {
|
|
waiting = true;
|
|
|
|
if ( true && !config.async) {
|
|
flushSchedulerQueue();
|
|
return
|
|
}
|
|
nextTick(flushSchedulerQueue);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* */
|
|
|
|
|
|
|
|
var uid$2 = 0;
|
|
|
|
/**
|
|
* A watcher parses an expression, collects dependencies,
|
|
* and fires callback when the expression value changes.
|
|
* This is used for both the $watch() api and directives.
|
|
*/
|
|
var Watcher = function Watcher (
|
|
vm,
|
|
expOrFn,
|
|
cb,
|
|
options,
|
|
isRenderWatcher
|
|
) {
|
|
this.vm = vm;
|
|
if (isRenderWatcher) {
|
|
vm._watcher = this;
|
|
}
|
|
vm._watchers.push(this);
|
|
// options
|
|
if (options) {
|
|
this.deep = !!options.deep;
|
|
this.user = !!options.user;
|
|
this.lazy = !!options.lazy;
|
|
this.sync = !!options.sync;
|
|
this.before = options.before;
|
|
} else {
|
|
this.deep = this.user = this.lazy = this.sync = false;
|
|
}
|
|
this.cb = cb;
|
|
this.id = ++uid$2; // uid for batching
|
|
this.active = true;
|
|
this.dirty = this.lazy; // for lazy watchers
|
|
this.deps = [];
|
|
this.newDeps = [];
|
|
this.depIds = new _Set();
|
|
this.newDepIds = new _Set();
|
|
this.expression = true
|
|
? expOrFn.toString()
|
|
: undefined;
|
|
// parse expression for getter
|
|
if (typeof expOrFn === 'function') {
|
|
this.getter = expOrFn;
|
|
} else {
|
|
this.getter = parsePath(expOrFn);
|
|
if (!this.getter) {
|
|
this.getter = noop;
|
|
true && warn(
|
|
"Failed watching path: \"" + expOrFn + "\" " +
|
|
'Watcher only accepts simple dot-delimited paths. ' +
|
|
'For full control, use a function instead.',
|
|
vm
|
|
);
|
|
}
|
|
}
|
|
this.value = this.lazy
|
|
? undefined
|
|
: this.get();
|
|
};
|
|
|
|
/**
|
|
* Evaluate the getter, and re-collect dependencies.
|
|
*/
|
|
Watcher.prototype.get = function get () {
|
|
pushTarget(this);
|
|
var value;
|
|
var vm = this.vm;
|
|
try {
|
|
value = this.getter.call(vm, vm);
|
|
} catch (e) {
|
|
if (this.user) {
|
|
handleError(e, vm, ("getter for watcher \"" + (this.expression) + "\""));
|
|
} else {
|
|
throw e
|
|
}
|
|
} finally {
|
|
// "touch" every property so they are all tracked as
|
|
// dependencies for deep watching
|
|
if (this.deep) {
|
|
traverse(value);
|
|
}
|
|
popTarget();
|
|
this.cleanupDeps();
|
|
}
|
|
return value
|
|
};
|
|
|
|
/**
|
|
* Add a dependency to this directive.
|
|
*/
|
|
Watcher.prototype.addDep = function addDep (dep) {
|
|
var id = dep.id;
|
|
if (!this.newDepIds.has(id)) {
|
|
this.newDepIds.add(id);
|
|
this.newDeps.push(dep);
|
|
if (!this.depIds.has(id)) {
|
|
dep.addSub(this);
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Clean up for dependency collection.
|
|
*/
|
|
Watcher.prototype.cleanupDeps = function cleanupDeps () {
|
|
var i = this.deps.length;
|
|
while (i--) {
|
|
var dep = this.deps[i];
|
|
if (!this.newDepIds.has(dep.id)) {
|
|
dep.removeSub(this);
|
|
}
|
|
}
|
|
var tmp = this.depIds;
|
|
this.depIds = this.newDepIds;
|
|
this.newDepIds = tmp;
|
|
this.newDepIds.clear();
|
|
tmp = this.deps;
|
|
this.deps = this.newDeps;
|
|
this.newDeps = tmp;
|
|
this.newDeps.length = 0;
|
|
};
|
|
|
|
/**
|
|
* Subscriber interface.
|
|
* Will be called when a dependency changes.
|
|
*/
|
|
Watcher.prototype.update = function update () {
|
|
/* istanbul ignore else */
|
|
if (this.lazy) {
|
|
this.dirty = true;
|
|
} else if (this.sync) {
|
|
this.run();
|
|
} else {
|
|
queueWatcher(this);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Scheduler job interface.
|
|
* Will be called by the scheduler.
|
|
*/
|
|
Watcher.prototype.run = function run () {
|
|
if (this.active) {
|
|
var value = this.get();
|
|
if (
|
|
value !== this.value ||
|
|
// Deep watchers and watchers on Object/Arrays should fire even
|
|
// when the value is the same, because the value may
|
|
// have mutated.
|
|
isObject(value) ||
|
|
this.deep
|
|
) {
|
|
// set new value
|
|
var oldValue = this.value;
|
|
this.value = value;
|
|
if (this.user) {
|
|
try {
|
|
this.cb.call(this.vm, value, oldValue);
|
|
} catch (e) {
|
|
handleError(e, this.vm, ("callback for watcher \"" + (this.expression) + "\""));
|
|
}
|
|
} else {
|
|
this.cb.call(this.vm, value, oldValue);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Evaluate the value of the watcher.
|
|
* This only gets called for lazy watchers.
|
|
*/
|
|
Watcher.prototype.evaluate = function evaluate () {
|
|
this.value = this.get();
|
|
this.dirty = false;
|
|
};
|
|
|
|
/**
|
|
* Depend on all deps collected by this watcher.
|
|
*/
|
|
Watcher.prototype.depend = function depend () {
|
|
var i = this.deps.length;
|
|
while (i--) {
|
|
this.deps[i].depend();
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Remove self from all dependencies' subscriber list.
|
|
*/
|
|
Watcher.prototype.teardown = function teardown () {
|
|
if (this.active) {
|
|
// remove self from vm's watcher list
|
|
// this is a somewhat expensive operation so we skip it
|
|
// if the vm is being destroyed.
|
|
if (!this.vm._isBeingDestroyed) {
|
|
remove(this.vm._watchers, this);
|
|
}
|
|
var i = this.deps.length;
|
|
while (i--) {
|
|
this.deps[i].removeSub(this);
|
|
}
|
|
this.active = false;
|
|
}
|
|
};
|
|
|
|
/* */
|
|
|
|
var sharedPropertyDefinition = {
|
|
enumerable: true,
|
|
configurable: true,
|
|
get: noop,
|
|
set: noop
|
|
};
|
|
|
|
function proxy (target, sourceKey, key) {
|
|
sharedPropertyDefinition.get = function proxyGetter () {
|
|
return this[sourceKey][key]
|
|
};
|
|
sharedPropertyDefinition.set = function proxySetter (val) {
|
|
this[sourceKey][key] = val;
|
|
};
|
|
Object.defineProperty(target, key, sharedPropertyDefinition);
|
|
}
|
|
|
|
function initState (vm) {
|
|
vm._watchers = [];
|
|
var opts = vm.$options;
|
|
if (opts.props) { initProps(vm, opts.props); }
|
|
if (opts.methods) { initMethods(vm, opts.methods); }
|
|
if (opts.data) {
|
|
initData(vm);
|
|
} else {
|
|
observe(vm._data = {}, true /* asRootData */);
|
|
}
|
|
if (opts.computed) { initComputed(vm, opts.computed); }
|
|
if (opts.watch && opts.watch !== nativeWatch) {
|
|
initWatch(vm, opts.watch);
|
|
}
|
|
}
|
|
|
|
function initProps (vm, propsOptions) {
|
|
var propsData = vm.$options.propsData || {};
|
|
var props = vm._props = {};
|
|
// cache prop keys so that future props updates can iterate using Array
|
|
// instead of dynamic object key enumeration.
|
|
var keys = vm.$options._propKeys = [];
|
|
var isRoot = !vm.$parent;
|
|
// root instance props should be converted
|
|
if (!isRoot) {
|
|
toggleObserving(false);
|
|
}
|
|
var loop = function ( key ) {
|
|
keys.push(key);
|
|
var value = validateProp(key, propsOptions, propsData, vm);
|
|
/* istanbul ignore else */
|
|
if (true) {
|
|
var hyphenatedKey = hyphenate(key);
|
|
if (isReservedAttribute(hyphenatedKey) ||
|
|
config.isReservedAttr(hyphenatedKey)) {
|
|
warn(
|
|
("\"" + hyphenatedKey + "\" is a reserved attribute and cannot be used as component prop."),
|
|
vm
|
|
);
|
|
}
|
|
defineReactive$$1(props, key, value, function () {
|
|
if (!isRoot && !isUpdatingChildComponent) {
|
|
{
|
|
if(vm.mpHost === 'mp-baidu' || vm.mpHost === 'mp-kuaishou' || vm.mpHost === 'mp-xhs'){//百度、快手、小红书 observer 在 setData callback 之后触发,直接忽略该 warn
|
|
return
|
|
}
|
|
//fixed by xxxxxx __next_tick_pending,uni://form-field 时不告警
|
|
if(
|
|
key === 'value' &&
|
|
Array.isArray(vm.$options.behaviors) &&
|
|
vm.$options.behaviors.indexOf('uni://form-field') !== -1
|
|
){
|
|
return
|
|
}
|
|
if(vm._getFormData){
|
|
return
|
|
}
|
|
var $parent = vm.$parent;
|
|
while($parent){
|
|
if($parent.__next_tick_pending){
|
|
return
|
|
}
|
|
$parent = $parent.$parent;
|
|
}
|
|
}
|
|
warn(
|
|
"Avoid mutating a prop directly since the value will be " +
|
|
"overwritten whenever the parent component re-renders. " +
|
|
"Instead, use a data or computed property based on the prop's " +
|
|
"value. Prop being mutated: \"" + key + "\"",
|
|
vm
|
|
);
|
|
}
|
|
});
|
|
} else {}
|
|
// static props are already proxied on the component's prototype
|
|
// during Vue.extend(). We only need to proxy props defined at
|
|
// instantiation here.
|
|
if (!(key in vm)) {
|
|
proxy(vm, "_props", key);
|
|
}
|
|
};
|
|
|
|
for (var key in propsOptions) loop( key );
|
|
toggleObserving(true);
|
|
}
|
|
|
|
function initData (vm) {
|
|
var data = vm.$options.data;
|
|
data = vm._data = typeof data === 'function'
|
|
? getData(data, vm)
|
|
: data || {};
|
|
if (!isPlainObject(data)) {
|
|
data = {};
|
|
true && warn(
|
|
'data functions should return an object:\n' +
|
|
'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',
|
|
vm
|
|
);
|
|
}
|
|
// proxy data on instance
|
|
var keys = Object.keys(data);
|
|
var props = vm.$options.props;
|
|
var methods = vm.$options.methods;
|
|
var i = keys.length;
|
|
while (i--) {
|
|
var key = keys[i];
|
|
if (true) {
|
|
if (methods && hasOwn(methods, key)) {
|
|
warn(
|
|
("Method \"" + key + "\" has already been defined as a data property."),
|
|
vm
|
|
);
|
|
}
|
|
}
|
|
if (props && hasOwn(props, key)) {
|
|
true && warn(
|
|
"The data property \"" + key + "\" is already declared as a prop. " +
|
|
"Use prop default value instead.",
|
|
vm
|
|
);
|
|
} else if (!isReserved(key)) {
|
|
proxy(vm, "_data", key);
|
|
}
|
|
}
|
|
// observe data
|
|
observe(data, true /* asRootData */);
|
|
}
|
|
|
|
function getData (data, vm) {
|
|
// #7573 disable dep collection when invoking data getters
|
|
pushTarget();
|
|
try {
|
|
return data.call(vm, vm)
|
|
} catch (e) {
|
|
handleError(e, vm, "data()");
|
|
return {}
|
|
} finally {
|
|
popTarget();
|
|
}
|
|
}
|
|
|
|
var computedWatcherOptions = { lazy: true };
|
|
|
|
function initComputed (vm, computed) {
|
|
// $flow-disable-line
|
|
var watchers = vm._computedWatchers = Object.create(null);
|
|
// computed properties are just getters during SSR
|
|
var isSSR = isServerRendering();
|
|
|
|
for (var key in computed) {
|
|
var userDef = computed[key];
|
|
var getter = typeof userDef === 'function' ? userDef : userDef.get;
|
|
if ( true && getter == null) {
|
|
warn(
|
|
("Getter is missing for computed property \"" + key + "\"."),
|
|
vm
|
|
);
|
|
}
|
|
|
|
if (!isSSR) {
|
|
// create internal watcher for the computed property.
|
|
watchers[key] = new Watcher(
|
|
vm,
|
|
getter || noop,
|
|
noop,
|
|
computedWatcherOptions
|
|
);
|
|
}
|
|
|
|
// component-defined computed properties are already defined on the
|
|
// component prototype. We only need to define computed properties defined
|
|
// at instantiation here.
|
|
if (!(key in vm)) {
|
|
defineComputed(vm, key, userDef);
|
|
} else if (true) {
|
|
if (key in vm.$data) {
|
|
warn(("The computed property \"" + key + "\" is already defined in data."), vm);
|
|
} else if (vm.$options.props && key in vm.$options.props) {
|
|
warn(("The computed property \"" + key + "\" is already defined as a prop."), vm);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function defineComputed (
|
|
target,
|
|
key,
|
|
userDef
|
|
) {
|
|
var shouldCache = !isServerRendering();
|
|
if (typeof userDef === 'function') {
|
|
sharedPropertyDefinition.get = shouldCache
|
|
? createComputedGetter(key)
|
|
: createGetterInvoker(userDef);
|
|
sharedPropertyDefinition.set = noop;
|
|
} else {
|
|
sharedPropertyDefinition.get = userDef.get
|
|
? shouldCache && userDef.cache !== false
|
|
? createComputedGetter(key)
|
|
: createGetterInvoker(userDef.get)
|
|
: noop;
|
|
sharedPropertyDefinition.set = userDef.set || noop;
|
|
}
|
|
if ( true &&
|
|
sharedPropertyDefinition.set === noop) {
|
|
sharedPropertyDefinition.set = function () {
|
|
warn(
|
|
("Computed property \"" + key + "\" was assigned to but it has no setter."),
|
|
this
|
|
);
|
|
};
|
|
}
|
|
Object.defineProperty(target, key, sharedPropertyDefinition);
|
|
}
|
|
|
|
function createComputedGetter (key) {
|
|
return function computedGetter () {
|
|
var watcher = this._computedWatchers && this._computedWatchers[key];
|
|
if (watcher) {
|
|
if (watcher.dirty) {
|
|
watcher.evaluate();
|
|
}
|
|
if (Dep.SharedObject.target) {// fixed by xxxxxx
|
|
watcher.depend();
|
|
}
|
|
return watcher.value
|
|
}
|
|
}
|
|
}
|
|
|
|
function createGetterInvoker(fn) {
|
|
return function computedGetter () {
|
|
return fn.call(this, this)
|
|
}
|
|
}
|
|
|
|
function initMethods (vm, methods) {
|
|
var props = vm.$options.props;
|
|
for (var key in methods) {
|
|
if (true) {
|
|
if (typeof methods[key] !== 'function') {
|
|
warn(
|
|
"Method \"" + key + "\" has type \"" + (typeof methods[key]) + "\" in the component definition. " +
|
|
"Did you reference the function correctly?",
|
|
vm
|
|
);
|
|
}
|
|
if (props && hasOwn(props, key)) {
|
|
warn(
|
|
("Method \"" + key + "\" has already been defined as a prop."),
|
|
vm
|
|
);
|
|
}
|
|
if ((key in vm) && isReserved(key)) {
|
|
warn(
|
|
"Method \"" + key + "\" conflicts with an existing Vue instance method. " +
|
|
"Avoid defining component methods that start with _ or $."
|
|
);
|
|
}
|
|
}
|
|
vm[key] = typeof methods[key] !== 'function' ? noop : bind(methods[key], vm);
|
|
}
|
|
}
|
|
|
|
function initWatch (vm, watch) {
|
|
for (var key in watch) {
|
|
var handler = watch[key];
|
|
if (Array.isArray(handler)) {
|
|
for (var i = 0; i < handler.length; i++) {
|
|
createWatcher(vm, key, handler[i]);
|
|
}
|
|
} else {
|
|
createWatcher(vm, key, handler);
|
|
}
|
|
}
|
|
}
|
|
|
|
function createWatcher (
|
|
vm,
|
|
expOrFn,
|
|
handler,
|
|
options
|
|
) {
|
|
if (isPlainObject(handler)) {
|
|
options = handler;
|
|
handler = handler.handler;
|
|
}
|
|
if (typeof handler === 'string') {
|
|
handler = vm[handler];
|
|
}
|
|
return vm.$watch(expOrFn, handler, options)
|
|
}
|
|
|
|
function stateMixin (Vue) {
|
|
// flow somehow has problems with directly declared definition object
|
|
// when using Object.defineProperty, so we have to procedurally build up
|
|
// the object here.
|
|
var dataDef = {};
|
|
dataDef.get = function () { return this._data };
|
|
var propsDef = {};
|
|
propsDef.get = function () { return this._props };
|
|
if (true) {
|
|
dataDef.set = function () {
|
|
warn(
|
|
'Avoid replacing instance root $data. ' +
|
|
'Use nested data properties instead.',
|
|
this
|
|
);
|
|
};
|
|
propsDef.set = function () {
|
|
warn("$props is readonly.", this);
|
|
};
|
|
}
|
|
Object.defineProperty(Vue.prototype, '$data', dataDef);
|
|
Object.defineProperty(Vue.prototype, '$props', propsDef);
|
|
|
|
Vue.prototype.$set = set;
|
|
Vue.prototype.$delete = del;
|
|
|
|
Vue.prototype.$watch = function (
|
|
expOrFn,
|
|
cb,
|
|
options
|
|
) {
|
|
var vm = this;
|
|
if (isPlainObject(cb)) {
|
|
return createWatcher(vm, expOrFn, cb, options)
|
|
}
|
|
options = options || {};
|
|
options.user = true;
|
|
var watcher = new Watcher(vm, expOrFn, cb, options);
|
|
if (options.immediate) {
|
|
try {
|
|
cb.call(vm, watcher.value);
|
|
} catch (error) {
|
|
handleError(error, vm, ("callback for immediate watcher \"" + (watcher.expression) + "\""));
|
|
}
|
|
}
|
|
return function unwatchFn () {
|
|
watcher.teardown();
|
|
}
|
|
};
|
|
}
|
|
|
|
/* */
|
|
|
|
var uid$3 = 0;
|
|
|
|
function initMixin (Vue) {
|
|
Vue.prototype._init = function (options) {
|
|
var vm = this;
|
|
// a uid
|
|
vm._uid = uid$3++;
|
|
|
|
var startTag, endTag;
|
|
/* istanbul ignore if */
|
|
if ( true && config.performance && mark) {
|
|
startTag = "vue-perf-start:" + (vm._uid);
|
|
endTag = "vue-perf-end:" + (vm._uid);
|
|
mark(startTag);
|
|
}
|
|
|
|
// a flag to avoid this being observed
|
|
vm._isVue = true;
|
|
// merge options
|
|
if (options && options._isComponent) {
|
|
// optimize internal component instantiation
|
|
// since dynamic options merging is pretty slow, and none of the
|
|
// internal component options needs special treatment.
|
|
initInternalComponent(vm, options);
|
|
} else {
|
|
vm.$options = mergeOptions(
|
|
resolveConstructorOptions(vm.constructor),
|
|
options || {},
|
|
vm
|
|
);
|
|
}
|
|
/* istanbul ignore else */
|
|
if (true) {
|
|
initProxy(vm);
|
|
} else {}
|
|
// expose real self
|
|
vm._self = vm;
|
|
initLifecycle(vm);
|
|
initEvents(vm);
|
|
initRender(vm);
|
|
callHook(vm, 'beforeCreate');
|
|
!vm._$fallback && initInjections(vm); // resolve injections before data/props
|
|
initState(vm);
|
|
!vm._$fallback && initProvide(vm); // resolve provide after data/props
|
|
!vm._$fallback && callHook(vm, 'created');
|
|
|
|
/* istanbul ignore if */
|
|
if ( true && config.performance && mark) {
|
|
vm._name = formatComponentName(vm, false);
|
|
mark(endTag);
|
|
measure(("vue " + (vm._name) + " init"), startTag, endTag);
|
|
}
|
|
|
|
if (vm.$options.el) {
|
|
vm.$mount(vm.$options.el);
|
|
}
|
|
};
|
|
}
|
|
|
|
function initInternalComponent (vm, options) {
|
|
var opts = vm.$options = Object.create(vm.constructor.options);
|
|
// doing this because it's faster than dynamic enumeration.
|
|
var parentVnode = options._parentVnode;
|
|
opts.parent = options.parent;
|
|
opts._parentVnode = parentVnode;
|
|
|
|
var vnodeComponentOptions = parentVnode.componentOptions;
|
|
opts.propsData = vnodeComponentOptions.propsData;
|
|
opts._parentListeners = vnodeComponentOptions.listeners;
|
|
opts._renderChildren = vnodeComponentOptions.children;
|
|
opts._componentTag = vnodeComponentOptions.tag;
|
|
|
|
if (options.render) {
|
|
opts.render = options.render;
|
|
opts.staticRenderFns = options.staticRenderFns;
|
|
}
|
|
}
|
|
|
|
function resolveConstructorOptions (Ctor) {
|
|
var options = Ctor.options;
|
|
if (Ctor.super) {
|
|
var superOptions = resolveConstructorOptions(Ctor.super);
|
|
var cachedSuperOptions = Ctor.superOptions;
|
|
if (superOptions !== cachedSuperOptions) {
|
|
// super option changed,
|
|
// need to resolve new options.
|
|
Ctor.superOptions = superOptions;
|
|
// check if there are any late-modified/attached options (#4976)
|
|
var modifiedOptions = resolveModifiedOptions(Ctor);
|
|
// update base extend options
|
|
if (modifiedOptions) {
|
|
extend(Ctor.extendOptions, modifiedOptions);
|
|
}
|
|
options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions);
|
|
if (options.name) {
|
|
options.components[options.name] = Ctor;
|
|
}
|
|
}
|
|
}
|
|
return options
|
|
}
|
|
|
|
function resolveModifiedOptions (Ctor) {
|
|
var modified;
|
|
var latest = Ctor.options;
|
|
var sealed = Ctor.sealedOptions;
|
|
for (var key in latest) {
|
|
if (latest[key] !== sealed[key]) {
|
|
if (!modified) { modified = {}; }
|
|
modified[key] = latest[key];
|
|
}
|
|
}
|
|
return modified
|
|
}
|
|
|
|
function Vue (options) {
|
|
if ( true &&
|
|
!(this instanceof Vue)
|
|
) {
|
|
warn('Vue is a constructor and should be called with the `new` keyword');
|
|
}
|
|
this._init(options);
|
|
}
|
|
|
|
initMixin(Vue);
|
|
stateMixin(Vue);
|
|
eventsMixin(Vue);
|
|
lifecycleMixin(Vue);
|
|
renderMixin(Vue);
|
|
|
|
/* */
|
|
|
|
function initUse (Vue) {
|
|
Vue.use = function (plugin) {
|
|
var installedPlugins = (this._installedPlugins || (this._installedPlugins = []));
|
|
if (installedPlugins.indexOf(plugin) > -1) {
|
|
return this
|
|
}
|
|
|
|
// additional parameters
|
|
var args = toArray(arguments, 1);
|
|
args.unshift(this);
|
|
if (typeof plugin.install === 'function') {
|
|
plugin.install.apply(plugin, args);
|
|
} else if (typeof plugin === 'function') {
|
|
plugin.apply(null, args);
|
|
}
|
|
installedPlugins.push(plugin);
|
|
return this
|
|
};
|
|
}
|
|
|
|
/* */
|
|
|
|
function initMixin$1 (Vue) {
|
|
Vue.mixin = function (mixin) {
|
|
this.options = mergeOptions(this.options, mixin);
|
|
return this
|
|
};
|
|
}
|
|
|
|
/* */
|
|
|
|
function initExtend (Vue) {
|
|
/**
|
|
* Each instance constructor, including Vue, has a unique
|
|
* cid. This enables us to create wrapped "child
|
|
* constructors" for prototypal inheritance and cache them.
|
|
*/
|
|
Vue.cid = 0;
|
|
var cid = 1;
|
|
|
|
/**
|
|
* Class inheritance
|
|
*/
|
|
Vue.extend = function (extendOptions) {
|
|
extendOptions = extendOptions || {};
|
|
var Super = this;
|
|
var SuperId = Super.cid;
|
|
var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {});
|
|
if (cachedCtors[SuperId]) {
|
|
return cachedCtors[SuperId]
|
|
}
|
|
|
|
var name = extendOptions.name || Super.options.name;
|
|
if ( true && name) {
|
|
validateComponentName(name);
|
|
}
|
|
|
|
var Sub = function VueComponent (options) {
|
|
this._init(options);
|
|
};
|
|
Sub.prototype = Object.create(Super.prototype);
|
|
Sub.prototype.constructor = Sub;
|
|
Sub.cid = cid++;
|
|
Sub.options = mergeOptions(
|
|
Super.options,
|
|
extendOptions
|
|
);
|
|
Sub['super'] = Super;
|
|
|
|
// For props and computed properties, we define the proxy getters on
|
|
// the Vue instances at extension time, on the extended prototype. This
|
|
// avoids Object.defineProperty calls for each instance created.
|
|
if (Sub.options.props) {
|
|
initProps$1(Sub);
|
|
}
|
|
if (Sub.options.computed) {
|
|
initComputed$1(Sub);
|
|
}
|
|
|
|
// allow further extension/mixin/plugin usage
|
|
Sub.extend = Super.extend;
|
|
Sub.mixin = Super.mixin;
|
|
Sub.use = Super.use;
|
|
|
|
// create asset registers, so extended classes
|
|
// can have their private assets too.
|
|
ASSET_TYPES.forEach(function (type) {
|
|
Sub[type] = Super[type];
|
|
});
|
|
// enable recursive self-lookup
|
|
if (name) {
|
|
Sub.options.components[name] = Sub;
|
|
}
|
|
|
|
// keep a reference to the super options at extension time.
|
|
// later at instantiation we can check if Super's options have
|
|
// been updated.
|
|
Sub.superOptions = Super.options;
|
|
Sub.extendOptions = extendOptions;
|
|
Sub.sealedOptions = extend({}, Sub.options);
|
|
|
|
// cache constructor
|
|
cachedCtors[SuperId] = Sub;
|
|
return Sub
|
|
};
|
|
}
|
|
|
|
function initProps$1 (Comp) {
|
|
var props = Comp.options.props;
|
|
for (var key in props) {
|
|
proxy(Comp.prototype, "_props", key);
|
|
}
|
|
}
|
|
|
|
function initComputed$1 (Comp) {
|
|
var computed = Comp.options.computed;
|
|
for (var key in computed) {
|
|
defineComputed(Comp.prototype, key, computed[key]);
|
|
}
|
|
}
|
|
|
|
/* */
|
|
|
|
function initAssetRegisters (Vue) {
|
|
/**
|
|
* Create asset registration methods.
|
|
*/
|
|
ASSET_TYPES.forEach(function (type) {
|
|
Vue[type] = function (
|
|
id,
|
|
definition
|
|
) {
|
|
if (!definition) {
|
|
return this.options[type + 's'][id]
|
|
} else {
|
|
/* istanbul ignore if */
|
|
if ( true && type === 'component') {
|
|
validateComponentName(id);
|
|
}
|
|
if (type === 'component' && isPlainObject(definition)) {
|
|
definition.name = definition.name || id;
|
|
definition = this.options._base.extend(definition);
|
|
}
|
|
if (type === 'directive' && typeof definition === 'function') {
|
|
definition = { bind: definition, update: definition };
|
|
}
|
|
this.options[type + 's'][id] = definition;
|
|
return definition
|
|
}
|
|
};
|
|
});
|
|
}
|
|
|
|
/* */
|
|
|
|
|
|
|
|
function getComponentName (opts) {
|
|
return opts && (opts.Ctor.options.name || opts.tag)
|
|
}
|
|
|
|
function matches (pattern, name) {
|
|
if (Array.isArray(pattern)) {
|
|
return pattern.indexOf(name) > -1
|
|
} else if (typeof pattern === 'string') {
|
|
return pattern.split(',').indexOf(name) > -1
|
|
} else if (isRegExp(pattern)) {
|
|
return pattern.test(name)
|
|
}
|
|
/* istanbul ignore next */
|
|
return false
|
|
}
|
|
|
|
function pruneCache (keepAliveInstance, filter) {
|
|
var cache = keepAliveInstance.cache;
|
|
var keys = keepAliveInstance.keys;
|
|
var _vnode = keepAliveInstance._vnode;
|
|
for (var key in cache) {
|
|
var cachedNode = cache[key];
|
|
if (cachedNode) {
|
|
var name = getComponentName(cachedNode.componentOptions);
|
|
if (name && !filter(name)) {
|
|
pruneCacheEntry(cache, key, keys, _vnode);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function pruneCacheEntry (
|
|
cache,
|
|
key,
|
|
keys,
|
|
current
|
|
) {
|
|
var cached$$1 = cache[key];
|
|
if (cached$$1 && (!current || cached$$1.tag !== current.tag)) {
|
|
cached$$1.componentInstance.$destroy();
|
|
}
|
|
cache[key] = null;
|
|
remove(keys, key);
|
|
}
|
|
|
|
var patternTypes = [String, RegExp, Array];
|
|
|
|
var KeepAlive = {
|
|
name: 'keep-alive',
|
|
abstract: true,
|
|
|
|
props: {
|
|
include: patternTypes,
|
|
exclude: patternTypes,
|
|
max: [String, Number]
|
|
},
|
|
|
|
created: function created () {
|
|
this.cache = Object.create(null);
|
|
this.keys = [];
|
|
},
|
|
|
|
destroyed: function destroyed () {
|
|
for (var key in this.cache) {
|
|
pruneCacheEntry(this.cache, key, this.keys);
|
|
}
|
|
},
|
|
|
|
mounted: function mounted () {
|
|
var this$1 = this;
|
|
|
|
this.$watch('include', function (val) {
|
|
pruneCache(this$1, function (name) { return matches(val, name); });
|
|
});
|
|
this.$watch('exclude', function (val) {
|
|
pruneCache(this$1, function (name) { return !matches(val, name); });
|
|
});
|
|
},
|
|
|
|
render: function render () {
|
|
var slot = this.$slots.default;
|
|
var vnode = getFirstComponentChild(slot);
|
|
var componentOptions = vnode && vnode.componentOptions;
|
|
if (componentOptions) {
|
|
// check pattern
|
|
var name = getComponentName(componentOptions);
|
|
var ref = this;
|
|
var include = ref.include;
|
|
var exclude = ref.exclude;
|
|
if (
|
|
// not included
|
|
(include && (!name || !matches(include, name))) ||
|
|
// excluded
|
|
(exclude && name && matches(exclude, name))
|
|
) {
|
|
return vnode
|
|
}
|
|
|
|
var ref$1 = this;
|
|
var cache = ref$1.cache;
|
|
var keys = ref$1.keys;
|
|
var key = vnode.key == null
|
|
// same constructor may get registered as different local components
|
|
// so cid alone is not enough (#3269)
|
|
? componentOptions.Ctor.cid + (componentOptions.tag ? ("::" + (componentOptions.tag)) : '')
|
|
: vnode.key;
|
|
if (cache[key]) {
|
|
vnode.componentInstance = cache[key].componentInstance;
|
|
// make current key freshest
|
|
remove(keys, key);
|
|
keys.push(key);
|
|
} else {
|
|
cache[key] = vnode;
|
|
keys.push(key);
|
|
// prune oldest entry
|
|
if (this.max && keys.length > parseInt(this.max)) {
|
|
pruneCacheEntry(cache, keys[0], keys, this._vnode);
|
|
}
|
|
}
|
|
|
|
vnode.data.keepAlive = true;
|
|
}
|
|
return vnode || (slot && slot[0])
|
|
}
|
|
};
|
|
|
|
var builtInComponents = {
|
|
KeepAlive: KeepAlive
|
|
};
|
|
|
|
/* */
|
|
|
|
function initGlobalAPI (Vue) {
|
|
// config
|
|
var configDef = {};
|
|
configDef.get = function () { return config; };
|
|
if (true) {
|
|
configDef.set = function () {
|
|
warn(
|
|
'Do not replace the Vue.config object, set individual fields instead.'
|
|
);
|
|
};
|
|
}
|
|
Object.defineProperty(Vue, 'config', configDef);
|
|
|
|
// exposed util methods.
|
|
// NOTE: these are not considered part of the public API - avoid relying on
|
|
// them unless you are aware of the risk.
|
|
Vue.util = {
|
|
warn: warn,
|
|
extend: extend,
|
|
mergeOptions: mergeOptions,
|
|
defineReactive: defineReactive$$1
|
|
};
|
|
|
|
Vue.set = set;
|
|
Vue.delete = del;
|
|
Vue.nextTick = nextTick;
|
|
|
|
// 2.6 explicit observable API
|
|
Vue.observable = function (obj) {
|
|
observe(obj);
|
|
return obj
|
|
};
|
|
|
|
Vue.options = Object.create(null);
|
|
ASSET_TYPES.forEach(function (type) {
|
|
Vue.options[type + 's'] = Object.create(null);
|
|
});
|
|
|
|
// this is used to identify the "base" constructor to extend all plain-object
|
|
// components with in Weex's multi-instance scenarios.
|
|
Vue.options._base = Vue;
|
|
|
|
extend(Vue.options.components, builtInComponents);
|
|
|
|
initUse(Vue);
|
|
initMixin$1(Vue);
|
|
initExtend(Vue);
|
|
initAssetRegisters(Vue);
|
|
}
|
|
|
|
initGlobalAPI(Vue);
|
|
|
|
Object.defineProperty(Vue.prototype, '$isServer', {
|
|
get: isServerRendering
|
|
});
|
|
|
|
Object.defineProperty(Vue.prototype, '$ssrContext', {
|
|
get: function get () {
|
|
/* istanbul ignore next */
|
|
return this.$vnode && this.$vnode.ssrContext
|
|
}
|
|
});
|
|
|
|
// expose FunctionalRenderContext for ssr runtime helper installation
|
|
Object.defineProperty(Vue, 'FunctionalRenderContext', {
|
|
value: FunctionalRenderContext
|
|
});
|
|
|
|
Vue.version = '2.6.11';
|
|
|
|
/**
|
|
* https://raw.githubusercontent.com/Tencent/westore/master/packages/westore/utils/diff.js
|
|
*/
|
|
var ARRAYTYPE = '[object Array]';
|
|
var OBJECTTYPE = '[object Object]';
|
|
var NULLTYPE = '[object Null]';
|
|
var UNDEFINEDTYPE = '[object Undefined]';
|
|
// const FUNCTIONTYPE = '[object Function]'
|
|
|
|
function diff(current, pre) {
|
|
var result = {};
|
|
syncKeys(current, pre);
|
|
_diff(current, pre, '', result);
|
|
return result
|
|
}
|
|
|
|
function syncKeys(current, pre) {
|
|
if (current === pre) { return }
|
|
var rootCurrentType = type(current);
|
|
var rootPreType = type(pre);
|
|
if (rootCurrentType == OBJECTTYPE && rootPreType == OBJECTTYPE) {
|
|
if(Object.keys(current).length >= Object.keys(pre).length){
|
|
for (var key in pre) {
|
|
var currentValue = current[key];
|
|
if (currentValue === undefined) {
|
|
current[key] = null;
|
|
} else {
|
|
syncKeys(currentValue, pre[key]);
|
|
}
|
|
}
|
|
}
|
|
} else if (rootCurrentType == ARRAYTYPE && rootPreType == ARRAYTYPE) {
|
|
if (current.length >= pre.length) {
|
|
pre.forEach(function (item, index) {
|
|
syncKeys(current[index], item);
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
function nullOrUndefined(currentType, preType) {
|
|
if(
|
|
(currentType === NULLTYPE || currentType === UNDEFINEDTYPE) &&
|
|
(preType === NULLTYPE || preType === UNDEFINEDTYPE)
|
|
) {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
function _diff(current, pre, path, result) {
|
|
if (current === pre) { return }
|
|
var rootCurrentType = type(current);
|
|
var rootPreType = type(pre);
|
|
if (rootCurrentType == OBJECTTYPE) {
|
|
if (rootPreType != OBJECTTYPE || Object.keys(current).length < Object.keys(pre).length) {
|
|
setResult(result, path, current);
|
|
} else {
|
|
var loop = function ( key ) {
|
|
var currentValue = current[key];
|
|
var preValue = pre[key];
|
|
var currentType = type(currentValue);
|
|
var preType = type(preValue);
|
|
if (currentType != ARRAYTYPE && currentType != OBJECTTYPE) {
|
|
if (currentValue !== pre[key] && nullOrUndefined(currentType, preType)) {
|
|
setResult(result, (path == '' ? '' : path + ".") + key, currentValue);
|
|
}
|
|
} else if (currentType == ARRAYTYPE) {
|
|
if (preType != ARRAYTYPE) {
|
|
setResult(result, (path == '' ? '' : path + ".") + key, currentValue);
|
|
} else {
|
|
if (currentValue.length < preValue.length) {
|
|
setResult(result, (path == '' ? '' : path + ".") + key, currentValue);
|
|
} else {
|
|
currentValue.forEach(function (item, index) {
|
|
_diff(item, preValue[index], (path == '' ? '' : path + ".") + key + '[' + index + ']', result);
|
|
});
|
|
}
|
|
}
|
|
} else if (currentType == OBJECTTYPE) {
|
|
if (preType != OBJECTTYPE || Object.keys(currentValue).length < Object.keys(preValue).length) {
|
|
setResult(result, (path == '' ? '' : path + ".") + key, currentValue);
|
|
} else {
|
|
for (var subKey in currentValue) {
|
|
_diff(currentValue[subKey], preValue[subKey], (path == '' ? '' : path + ".") + key + '.' + subKey, result);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
for (var key in current) loop( key );
|
|
}
|
|
} else if (rootCurrentType == ARRAYTYPE) {
|
|
if (rootPreType != ARRAYTYPE) {
|
|
setResult(result, path, current);
|
|
} else {
|
|
if (current.length < pre.length) {
|
|
setResult(result, path, current);
|
|
} else {
|
|
current.forEach(function (item, index) {
|
|
_diff(item, pre[index], path + '[' + index + ']', result);
|
|
});
|
|
}
|
|
}
|
|
} else {
|
|
setResult(result, path, current);
|
|
}
|
|
}
|
|
|
|
function setResult(result, k, v) {
|
|
// if (type(v) != FUNCTIONTYPE) {
|
|
result[k] = v;
|
|
// }
|
|
}
|
|
|
|
function type(obj) {
|
|
return Object.prototype.toString.call(obj)
|
|
}
|
|
|
|
/* */
|
|
|
|
function flushCallbacks$1(vm) {
|
|
if (vm.__next_tick_callbacks && vm.__next_tick_callbacks.length) {
|
|
if (Object({"VUE_APP_DARK_MODE":"false","VUE_APP_NAME":"中龙","VUE_APP_PLATFORM":"mp-weixin","NODE_ENV":"development","BASE_URL":"/"}).VUE_APP_DEBUG) {
|
|
var mpInstance = vm.$scope;
|
|
console.log('[' + (+new Date) + '][' + (mpInstance.is || mpInstance.route) + '][' + vm._uid +
|
|
']:flushCallbacks[' + vm.__next_tick_callbacks.length + ']');
|
|
}
|
|
var copies = vm.__next_tick_callbacks.slice(0);
|
|
vm.__next_tick_callbacks.length = 0;
|
|
for (var i = 0; i < copies.length; i++) {
|
|
copies[i]();
|
|
}
|
|
}
|
|
}
|
|
|
|
function hasRenderWatcher(vm) {
|
|
return queue.find(function (watcher) { return vm._watcher === watcher; })
|
|
}
|
|
|
|
function nextTick$1(vm, cb) {
|
|
//1.nextTick 之前 已 setData 且 setData 还未回调完成
|
|
//2.nextTick 之前存在 render watcher
|
|
if (!vm.__next_tick_pending && !hasRenderWatcher(vm)) {
|
|
if(Object({"VUE_APP_DARK_MODE":"false","VUE_APP_NAME":"中龙","VUE_APP_PLATFORM":"mp-weixin","NODE_ENV":"development","BASE_URL":"/"}).VUE_APP_DEBUG){
|
|
var mpInstance = vm.$scope;
|
|
console.log('[' + (+new Date) + '][' + (mpInstance.is || mpInstance.route) + '][' + vm._uid +
|
|
']:nextVueTick');
|
|
}
|
|
return nextTick(cb, vm)
|
|
}else{
|
|
if(Object({"VUE_APP_DARK_MODE":"false","VUE_APP_NAME":"中龙","VUE_APP_PLATFORM":"mp-weixin","NODE_ENV":"development","BASE_URL":"/"}).VUE_APP_DEBUG){
|
|
var mpInstance$1 = vm.$scope;
|
|
console.log('[' + (+new Date) + '][' + (mpInstance$1.is || mpInstance$1.route) + '][' + vm._uid +
|
|
']:nextMPTick');
|
|
}
|
|
}
|
|
var _resolve;
|
|
if (!vm.__next_tick_callbacks) {
|
|
vm.__next_tick_callbacks = [];
|
|
}
|
|
vm.__next_tick_callbacks.push(function () {
|
|
if (cb) {
|
|
try {
|
|
cb.call(vm);
|
|
} catch (e) {
|
|
handleError(e, vm, 'nextTick');
|
|
}
|
|
} else if (_resolve) {
|
|
_resolve(vm);
|
|
}
|
|
});
|
|
// $flow-disable-line
|
|
if (!cb && typeof Promise !== 'undefined') {
|
|
return new Promise(function (resolve) {
|
|
_resolve = resolve;
|
|
})
|
|
}
|
|
}
|
|
|
|
/* */
|
|
|
|
function clearInstance(key, value) {
|
|
// 简易去除 Vue 和小程序组件实例
|
|
if (value) {
|
|
if (value._isVue || value.__v_isMPComponent) {
|
|
return {}
|
|
}
|
|
}
|
|
return value
|
|
}
|
|
|
|
function cloneWithData(vm) {
|
|
// 确保当前 vm 所有数据被同步
|
|
var ret = Object.create(null);
|
|
var dataKeys = [].concat(
|
|
Object.keys(vm._data || {}),
|
|
Object.keys(vm._computedWatchers || {}));
|
|
|
|
dataKeys.reduce(function(ret, key) {
|
|
ret[key] = vm[key];
|
|
return ret
|
|
}, ret);
|
|
|
|
// vue-composition-api
|
|
var compositionApiState = vm.__composition_api_state__ || vm.__secret_vfa_state__;
|
|
var rawBindings = compositionApiState && compositionApiState.rawBindings;
|
|
if (rawBindings) {
|
|
Object.keys(rawBindings).forEach(function (key) {
|
|
ret[key] = vm[key];
|
|
});
|
|
}
|
|
|
|
//TODO 需要把无用数据处理掉,比如 list=>l0 则 list 需要移除,否则多传输一份数据
|
|
Object.assign(ret, vm.$mp.data || {});
|
|
if (
|
|
Array.isArray(vm.$options.behaviors) &&
|
|
vm.$options.behaviors.indexOf('uni://form-field') !== -1
|
|
) { //form-field
|
|
ret['name'] = vm.name;
|
|
ret['value'] = vm.value;
|
|
}
|
|
|
|
return JSON.parse(JSON.stringify(ret, clearInstance))
|
|
}
|
|
|
|
var patch = function(oldVnode, vnode) {
|
|
var this$1 = this;
|
|
|
|
if (vnode === null) { //destroy
|
|
return
|
|
}
|
|
if (this.mpType === 'page' || this.mpType === 'component') {
|
|
var mpInstance = this.$scope;
|
|
var data = Object.create(null);
|
|
try {
|
|
data = cloneWithData(this);
|
|
} catch (err) {
|
|
console.error(err);
|
|
}
|
|
data.__webviewId__ = mpInstance.data.__webviewId__;
|
|
var mpData = Object.create(null);
|
|
Object.keys(data).forEach(function (key) { //仅同步 data 中有的数据
|
|
mpData[key] = mpInstance.data[key];
|
|
});
|
|
var diffData = this.$shouldDiffData === false ? data : diff(data, mpData);
|
|
if (Object.keys(diffData).length) {
|
|
if (Object({"VUE_APP_DARK_MODE":"false","VUE_APP_NAME":"中龙","VUE_APP_PLATFORM":"mp-weixin","NODE_ENV":"development","BASE_URL":"/"}).VUE_APP_DEBUG) {
|
|
console.log('[' + (+new Date) + '][' + (mpInstance.is || mpInstance.route) + '][' + this._uid +
|
|
']差量更新',
|
|
JSON.stringify(diffData));
|
|
}
|
|
this.__next_tick_pending = true;
|
|
mpInstance.setData(diffData, function () {
|
|
this$1.__next_tick_pending = false;
|
|
flushCallbacks$1(this$1);
|
|
});
|
|
} else {
|
|
flushCallbacks$1(this);
|
|
}
|
|
}
|
|
};
|
|
|
|
/* */
|
|
|
|
function createEmptyRender() {
|
|
|
|
}
|
|
|
|
function mountComponent$1(
|
|
vm,
|
|
el,
|
|
hydrating
|
|
) {
|
|
if (!vm.mpType) {//main.js 中的 new Vue
|
|
return vm
|
|
}
|
|
if (vm.mpType === 'app') {
|
|
vm.$options.render = createEmptyRender;
|
|
}
|
|
if (!vm.$options.render) {
|
|
vm.$options.render = createEmptyRender;
|
|
if (true) {
|
|
/* istanbul ignore if */
|
|
if ((vm.$options.template && vm.$options.template.charAt(0) !== '#') ||
|
|
vm.$options.el || el) {
|
|
warn(
|
|
'You are using the runtime-only build of Vue where the template ' +
|
|
'compiler is not available. Either pre-compile the templates into ' +
|
|
'render functions, or use the compiler-included build.',
|
|
vm
|
|
);
|
|
} else {
|
|
warn(
|
|
'Failed to mount component: template or render function not defined.',
|
|
vm
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
!vm._$fallback && callHook(vm, 'beforeMount');
|
|
|
|
var updateComponent = function () {
|
|
vm._update(vm._render(), hydrating);
|
|
};
|
|
|
|
// we set this to vm._watcher inside the watcher's constructor
|
|
// since the watcher's initial patch may call $forceUpdate (e.g. inside child
|
|
// component's mounted hook), which relies on vm._watcher being already defined
|
|
new Watcher(vm, updateComponent, noop, {
|
|
before: function before() {
|
|
if (vm._isMounted && !vm._isDestroyed) {
|
|
callHook(vm, 'beforeUpdate');
|
|
}
|
|
}
|
|
}, true /* isRenderWatcher */);
|
|
hydrating = false;
|
|
return vm
|
|
}
|
|
|
|
/* */
|
|
|
|
function renderClass (
|
|
staticClass,
|
|
dynamicClass
|
|
) {
|
|
if (isDef(staticClass) || isDef(dynamicClass)) {
|
|
return concat(staticClass, stringifyClass(dynamicClass))
|
|
}
|
|
/* istanbul ignore next */
|
|
return ''
|
|
}
|
|
|
|
function concat (a, b) {
|
|
return a ? b ? (a + ' ' + b) : a : (b || '')
|
|
}
|
|
|
|
function stringifyClass (value) {
|
|
if (Array.isArray(value)) {
|
|
return stringifyArray(value)
|
|
}
|
|
if (isObject(value)) {
|
|
return stringifyObject(value)
|
|
}
|
|
if (typeof value === 'string') {
|
|
return value
|
|
}
|
|
/* istanbul ignore next */
|
|
return ''
|
|
}
|
|
|
|
function stringifyArray (value) {
|
|
var res = '';
|
|
var stringified;
|
|
for (var i = 0, l = value.length; i < l; i++) {
|
|
if (isDef(stringified = stringifyClass(value[i])) && stringified !== '') {
|
|
if (res) { res += ' '; }
|
|
res += stringified;
|
|
}
|
|
}
|
|
return res
|
|
}
|
|
|
|
function stringifyObject (value) {
|
|
var res = '';
|
|
for (var key in value) {
|
|
if (value[key]) {
|
|
if (res) { res += ' '; }
|
|
res += key;
|
|
}
|
|
}
|
|
return res
|
|
}
|
|
|
|
/* */
|
|
|
|
var parseStyleText = cached(function (cssText) {
|
|
var res = {};
|
|
var listDelimiter = /;(?![^(]*\))/g;
|
|
var propertyDelimiter = /:(.+)/;
|
|
cssText.split(listDelimiter).forEach(function (item) {
|
|
if (item) {
|
|
var tmp = item.split(propertyDelimiter);
|
|
tmp.length > 1 && (res[tmp[0].trim()] = tmp[1].trim());
|
|
}
|
|
});
|
|
return res
|
|
});
|
|
|
|
// normalize possible array / string values into Object
|
|
function normalizeStyleBinding (bindingStyle) {
|
|
if (Array.isArray(bindingStyle)) {
|
|
return toObject(bindingStyle)
|
|
}
|
|
if (typeof bindingStyle === 'string') {
|
|
return parseStyleText(bindingStyle)
|
|
}
|
|
return bindingStyle
|
|
}
|
|
|
|
/* */
|
|
|
|
var MP_METHODS = ['createSelectorQuery', 'createIntersectionObserver', 'selectAllComponents', 'selectComponent'];
|
|
|
|
function getTarget(obj, path) {
|
|
var parts = path.split('.');
|
|
var key = parts[0];
|
|
if (key.indexOf('__$n') === 0) { //number index
|
|
key = parseInt(key.replace('__$n', ''));
|
|
}
|
|
if (parts.length === 1) {
|
|
return obj[key]
|
|
}
|
|
return getTarget(obj[key], parts.slice(1).join('.'))
|
|
}
|
|
|
|
function internalMixin(Vue) {
|
|
|
|
Vue.config.errorHandler = function(err, vm, info) {
|
|
Vue.util.warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm);
|
|
console.error(err);
|
|
/* eslint-disable no-undef */
|
|
var app = typeof getApp === 'function' && getApp();
|
|
if (app && app.onError) {
|
|
app.onError(err);
|
|
}
|
|
};
|
|
|
|
var oldEmit = Vue.prototype.$emit;
|
|
|
|
Vue.prototype.$emit = function(event) {
|
|
if (this.$scope && event) {
|
|
var triggerEvent = this.$scope['_triggerEvent'] || this.$scope['triggerEvent'];
|
|
if (triggerEvent) {
|
|
try {
|
|
triggerEvent.call(this.$scope, event, {
|
|
__args__: toArray(arguments, 1)
|
|
});
|
|
} catch (error) {
|
|
|
|
}
|
|
}
|
|
}
|
|
return oldEmit.apply(this, arguments)
|
|
};
|
|
|
|
Vue.prototype.$nextTick = function(fn) {
|
|
return nextTick$1(this, fn)
|
|
};
|
|
|
|
MP_METHODS.forEach(function (method) {
|
|
Vue.prototype[method] = function(args) {
|
|
if (this.$scope && this.$scope[method]) {
|
|
return this.$scope[method](args)
|
|
}
|
|
// mp-alipay
|
|
if (typeof my === 'undefined') {
|
|
return
|
|
}
|
|
if (method === 'createSelectorQuery') {
|
|
/* eslint-disable no-undef */
|
|
return my.createSelectorQuery(args)
|
|
} else if (method === 'createIntersectionObserver') {
|
|
/* eslint-disable no-undef */
|
|
return my.createIntersectionObserver(args)
|
|
}
|
|
// TODO mp-alipay 暂不支持 selectAllComponents,selectComponent
|
|
};
|
|
});
|
|
|
|
Vue.prototype.__init_provide = initProvide;
|
|
|
|
Vue.prototype.__init_injections = initInjections;
|
|
|
|
Vue.prototype.__call_hook = function(hook, args) {
|
|
var vm = this;
|
|
// #7573 disable dep collection when invoking lifecycle hooks
|
|
pushTarget();
|
|
var handlers = vm.$options[hook];
|
|
var info = hook + " hook";
|
|
var ret;
|
|
if (handlers) {
|
|
for (var i = 0, j = handlers.length; i < j; i++) {
|
|
ret = invokeWithErrorHandling(handlers[i], vm, args ? [args] : null, vm, info);
|
|
}
|
|
}
|
|
if (vm._hasHookEvent) {
|
|
vm.$emit('hook:' + hook, args);
|
|
}
|
|
popTarget();
|
|
return ret
|
|
};
|
|
|
|
Vue.prototype.__set_model = function(target, key, value, modifiers) {
|
|
if (Array.isArray(modifiers)) {
|
|
if (modifiers.indexOf('trim') !== -1) {
|
|
value = value.trim();
|
|
}
|
|
if (modifiers.indexOf('number') !== -1) {
|
|
value = this._n(value);
|
|
}
|
|
}
|
|
if (!target) {
|
|
target = this;
|
|
}
|
|
// 解决动态属性添加
|
|
Vue.set(target, key, value);
|
|
};
|
|
|
|
Vue.prototype.__set_sync = function(target, key, value) {
|
|
if (!target) {
|
|
target = this;
|
|
}
|
|
// 解决动态属性添加
|
|
Vue.set(target, key, value);
|
|
};
|
|
|
|
Vue.prototype.__get_orig = function(item) {
|
|
if (isPlainObject(item)) {
|
|
return item['$orig'] || item
|
|
}
|
|
return item
|
|
};
|
|
|
|
Vue.prototype.__get_value = function(dataPath, target) {
|
|
return getTarget(target || this, dataPath)
|
|
};
|
|
|
|
|
|
Vue.prototype.__get_class = function(dynamicClass, staticClass) {
|
|
return renderClass(staticClass, dynamicClass)
|
|
};
|
|
|
|
Vue.prototype.__get_style = function(dynamicStyle, staticStyle) {
|
|
if (!dynamicStyle && !staticStyle) {
|
|
return ''
|
|
}
|
|
var dynamicStyleObj = normalizeStyleBinding(dynamicStyle);
|
|
var styleObj = staticStyle ? extend(staticStyle, dynamicStyleObj) : dynamicStyleObj;
|
|
return Object.keys(styleObj).map(function (name) { return ((hyphenate(name)) + ":" + (styleObj[name])); }).join(';')
|
|
};
|
|
|
|
Vue.prototype.__map = function(val, iteratee) {
|
|
//TODO 暂不考虑 string
|
|
var ret, i, l, keys, key;
|
|
if (Array.isArray(val)) {
|
|
ret = new Array(val.length);
|
|
for (i = 0, l = val.length; i < l; i++) {
|
|
ret[i] = iteratee(val[i], i);
|
|
}
|
|
return ret
|
|
} else if (isObject(val)) {
|
|
keys = Object.keys(val);
|
|
ret = Object.create(null);
|
|
for (i = 0, l = keys.length; i < l; i++) {
|
|
key = keys[i];
|
|
ret[key] = iteratee(val[key], key, i);
|
|
}
|
|
return ret
|
|
} else if (typeof val === 'number') {
|
|
ret = new Array(val);
|
|
for (i = 0, l = val; i < l; i++) {
|
|
// 第一个参数暂时仍和小程序一致
|
|
ret[i] = iteratee(i, i);
|
|
}
|
|
return ret
|
|
}
|
|
return []
|
|
};
|
|
|
|
}
|
|
|
|
/* */
|
|
|
|
var LIFECYCLE_HOOKS$1 = [
|
|
//App
|
|
'onLaunch',
|
|
'onShow',
|
|
'onHide',
|
|
'onUniNViewMessage',
|
|
'onPageNotFound',
|
|
'onThemeChange',
|
|
'onError',
|
|
'onUnhandledRejection',
|
|
//Page
|
|
'onInit',
|
|
'onLoad',
|
|
// 'onShow',
|
|
'onReady',
|
|
// 'onHide',
|
|
'onUnload',
|
|
'onPullDownRefresh',
|
|
'onReachBottom',
|
|
'onTabItemTap',
|
|
'onAddToFavorites',
|
|
'onShareTimeline',
|
|
'onShareAppMessage',
|
|
'onResize',
|
|
'onPageScroll',
|
|
'onNavigationBarButtonTap',
|
|
'onBackPress',
|
|
'onNavigationBarSearchInputChanged',
|
|
'onNavigationBarSearchInputConfirmed',
|
|
'onNavigationBarSearchInputClicked',
|
|
'onUploadDouyinVideo',
|
|
'onNFCReadMessage',
|
|
//Component
|
|
// 'onReady', // 兼容旧版本,应该移除该事件
|
|
'onPageShow',
|
|
'onPageHide',
|
|
'onPageResize'
|
|
];
|
|
function lifecycleMixin$1(Vue) {
|
|
|
|
//fixed vue-class-component
|
|
var oldExtend = Vue.extend;
|
|
Vue.extend = function(extendOptions) {
|
|
extendOptions = extendOptions || {};
|
|
|
|
var methods = extendOptions.methods;
|
|
if (methods) {
|
|
Object.keys(methods).forEach(function (methodName) {
|
|
if (LIFECYCLE_HOOKS$1.indexOf(methodName)!==-1) {
|
|
extendOptions[methodName] = methods[methodName];
|
|
delete methods[methodName];
|
|
}
|
|
});
|
|
}
|
|
|
|
return oldExtend.call(this, extendOptions)
|
|
};
|
|
|
|
var strategies = Vue.config.optionMergeStrategies;
|
|
var mergeHook = strategies.created;
|
|
LIFECYCLE_HOOKS$1.forEach(function (hook) {
|
|
strategies[hook] = mergeHook;
|
|
});
|
|
|
|
Vue.prototype.__lifecycle_hooks__ = LIFECYCLE_HOOKS$1;
|
|
}
|
|
|
|
/* */
|
|
|
|
// install platform patch function
|
|
Vue.prototype.__patch__ = patch;
|
|
|
|
// public mount method
|
|
Vue.prototype.$mount = function(
|
|
el ,
|
|
hydrating
|
|
) {
|
|
return mountComponent$1(this, el, hydrating)
|
|
};
|
|
|
|
lifecycleMixin$1(Vue);
|
|
internalMixin(Vue);
|
|
|
|
/* */
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (Vue);
|
|
|
|
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../../webpack/buildin/global.js */ 3)))
|
|
|
|
/***/ }),
|
|
|
|
/***/ 26:
|
|
/*!***********************************!*\
|
|
!*** D:/工作/zhonglmini/pages.json ***!
|
|
\***********************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 289:
|
|
/*!**************************************************************************!*\
|
|
!*** D:/工作/zhonglmini/components/mpvue-citypicker/city-data/province.js ***!
|
|
\**************************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = void 0;
|
|
/* eslint-disable */
|
|
var provinceData = [
|
|
// {
|
|
// "label": "北京市",
|
|
// "value": "11"
|
|
// },
|
|
// {
|
|
// "label": "天津市",
|
|
// "value": "12"
|
|
// },
|
|
// {
|
|
// "label": "河北省",
|
|
// "value": "13"
|
|
// },
|
|
// {
|
|
// "label": "山西省",
|
|
// "value": "14"
|
|
// },
|
|
// {
|
|
// "label": "内蒙古自治区",
|
|
// "value": "15"
|
|
// },
|
|
// {
|
|
// "label": "辽宁省",
|
|
// "value": "21"
|
|
// },
|
|
// {
|
|
// "label": "吉林省",
|
|
// "value": "22"
|
|
// },
|
|
// {
|
|
// "label": "黑龙江省",
|
|
// "value": "23"
|
|
// },
|
|
// {
|
|
// "label": "上海市",
|
|
// "value": "31"
|
|
// },
|
|
// {
|
|
// "label": "江苏省",
|
|
// "value": "32"
|
|
// },
|
|
// {
|
|
// "label": "浙江省",
|
|
// "value": "33"
|
|
// },
|
|
// {
|
|
// "label": "安徽省",
|
|
// "value": "34"
|
|
// },
|
|
// {
|
|
// "label": "福建省",
|
|
// "value": "35"
|
|
// },
|
|
// {
|
|
// "label": "江西省",
|
|
// "value": "36"
|
|
// },
|
|
// {
|
|
// "label": "山东省",
|
|
// "value": "37"
|
|
// },
|
|
// {
|
|
// "label": "河南省",
|
|
// "value": "41"
|
|
// },
|
|
// {
|
|
// "label": "湖北省",
|
|
// "value": "42"
|
|
// },
|
|
// {
|
|
// "label": "湖南省",
|
|
// "value": "43"
|
|
// },
|
|
{
|
|
"label": "广东省",
|
|
"value": "44"
|
|
}
|
|
//,
|
|
// {
|
|
// "label": "广西壮族自治区",
|
|
// "value": "45"
|
|
// },
|
|
// {
|
|
// "label": "海南省",
|
|
// "value": "46"
|
|
// },
|
|
// {
|
|
// "label": "重庆市",
|
|
// "value": "50"
|
|
// },
|
|
// {
|
|
// "label": "四川省",
|
|
// "value": "51"
|
|
// },
|
|
// {
|
|
// "label": "贵州省",
|
|
// "value": "52"
|
|
// },
|
|
// {
|
|
// "label": "云南省",
|
|
// "value": "53"
|
|
// },
|
|
// {
|
|
// "label": "西藏自治区",
|
|
// "value": "54"
|
|
// },
|
|
// {
|
|
// "label": "陕西省",
|
|
// "value": "61"
|
|
// },
|
|
// {
|
|
// "label": "甘肃省",
|
|
// "value": "62"
|
|
// },
|
|
// {
|
|
// "label": "青海省",
|
|
// "value": "63"
|
|
// },
|
|
// {
|
|
// "label": "宁夏回族自治区",
|
|
// "value": "64"
|
|
// },
|
|
// {
|
|
// "label": "新疆维吾尔自治区",
|
|
// "value": "65"
|
|
// },
|
|
// {
|
|
// "label": "台湾",
|
|
// "value": "66"
|
|
// },
|
|
// {
|
|
// "label": "香港",
|
|
// "value": "67"
|
|
// },
|
|
// {
|
|
// "label": "澳门",
|
|
// "value": "68"
|
|
// }
|
|
];
|
|
var _default = provinceData;
|
|
exports.default = _default;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 290:
|
|
/*!**********************************************************************!*\
|
|
!*** D:/工作/zhonglmini/components/mpvue-citypicker/city-data/city.js ***!
|
|
\**********************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = void 0;
|
|
/* eslint-disable */
|
|
var cityData = [
|
|
// [{
|
|
// "label": "市辖区",
|
|
// "value": "1101"
|
|
// }],
|
|
// [{
|
|
// "label": "市辖区",
|
|
// "value": "1201"
|
|
// }],
|
|
// [{
|
|
// "label": "石家庄市",
|
|
// "value": "1301"
|
|
// },
|
|
// {
|
|
// "label": "唐山市",
|
|
// "value": "1302"
|
|
// },
|
|
// {
|
|
// "label": "秦皇岛市",
|
|
// "value": "1303"
|
|
// },
|
|
// {
|
|
// "label": "邯郸市",
|
|
// "value": "1304"
|
|
// },
|
|
// {
|
|
// "label": "邢台市",
|
|
// "value": "1305"
|
|
// },
|
|
// {
|
|
// "label": "保定市",
|
|
// "value": "1306"
|
|
// },
|
|
// {
|
|
// "label": "张家口市",
|
|
// "value": "1307"
|
|
// },
|
|
// {
|
|
// "label": "承德市",
|
|
// "value": "1308"
|
|
// },
|
|
// {
|
|
// "label": "沧州市",
|
|
// "value": "1309"
|
|
// },
|
|
// {
|
|
// "label": "廊坊市",
|
|
// "value": "1310"
|
|
// },
|
|
// {
|
|
// "label": "衡水市",
|
|
// "value": "1311"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "太原市",
|
|
// "value": "1401"
|
|
// },
|
|
// {
|
|
// "label": "大同市",
|
|
// "value": "1402"
|
|
// },
|
|
// {
|
|
// "label": "阳泉市",
|
|
// "value": "1403"
|
|
// },
|
|
// {
|
|
// "label": "长治市",
|
|
// "value": "1404"
|
|
// },
|
|
// {
|
|
// "label": "晋城市",
|
|
// "value": "1405"
|
|
// },
|
|
// {
|
|
// "label": "朔州市",
|
|
// "value": "1406"
|
|
// },
|
|
// {
|
|
// "label": "晋中市",
|
|
// "value": "1407"
|
|
// },
|
|
// {
|
|
// "label": "运城市",
|
|
// "value": "1408"
|
|
// },
|
|
// {
|
|
// "label": "忻州市",
|
|
// "value": "1409"
|
|
// },
|
|
// {
|
|
// "label": "临汾市",
|
|
// "value": "1410"
|
|
// },
|
|
// {
|
|
// "label": "吕梁市",
|
|
// "value": "1411"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "呼和浩特市",
|
|
// "value": "1501"
|
|
// },
|
|
// {
|
|
// "label": "包头市",
|
|
// "value": "1502"
|
|
// },
|
|
// {
|
|
// "label": "乌海市",
|
|
// "value": "1503"
|
|
// },
|
|
// {
|
|
// "label": "赤峰市",
|
|
// "value": "1504"
|
|
// },
|
|
// {
|
|
// "label": "通辽市",
|
|
// "value": "1505"
|
|
// },
|
|
// {
|
|
// "label": "鄂尔多斯市",
|
|
// "value": "1506"
|
|
// },
|
|
// {
|
|
// "label": "呼伦贝尔市",
|
|
// "value": "1507"
|
|
// },
|
|
// {
|
|
// "label": "巴彦淖尔市",
|
|
// "value": "1508"
|
|
// },
|
|
// {
|
|
// "label": "乌兰察布市",
|
|
// "value": "1509"
|
|
// },
|
|
// {
|
|
// "label": "兴安盟",
|
|
// "value": "1522"
|
|
// },
|
|
// {
|
|
// "label": "锡林郭勒盟",
|
|
// "value": "1525"
|
|
// },
|
|
// {
|
|
// "label": "阿拉善盟",
|
|
// "value": "1529"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "沈阳市",
|
|
// "value": "2101"
|
|
// },
|
|
// {
|
|
// "label": "大连市",
|
|
// "value": "2102"
|
|
// },
|
|
// {
|
|
// "label": "鞍山市",
|
|
// "value": "2103"
|
|
// },
|
|
// {
|
|
// "label": "抚顺市",
|
|
// "value": "2104"
|
|
// },
|
|
// {
|
|
// "label": "本溪市",
|
|
// "value": "2105"
|
|
// },
|
|
// {
|
|
// "label": "丹东市",
|
|
// "value": "2106"
|
|
// },
|
|
// {
|
|
// "label": "锦州市",
|
|
// "value": "2107"
|
|
// },
|
|
// {
|
|
// "label": "营口市",
|
|
// "value": "2108"
|
|
// },
|
|
// {
|
|
// "label": "阜新市",
|
|
// "value": "2109"
|
|
// },
|
|
// {
|
|
// "label": "辽阳市",
|
|
// "value": "2110"
|
|
// },
|
|
// {
|
|
// "label": "盘锦市",
|
|
// "value": "2111"
|
|
// },
|
|
// {
|
|
// "label": "铁岭市",
|
|
// "value": "2112"
|
|
// },
|
|
// {
|
|
// "label": "朝阳市",
|
|
// "value": "2113"
|
|
// },
|
|
// {
|
|
// "label": "葫芦岛市",
|
|
// "value": "2114"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "长春市",
|
|
// "value": "2201"
|
|
// },
|
|
// {
|
|
// "label": "吉林市",
|
|
// "value": "2202"
|
|
// },
|
|
// {
|
|
// "label": "四平市",
|
|
// "value": "2203"
|
|
// },
|
|
// {
|
|
// "label": "辽源市",
|
|
// "value": "2204"
|
|
// },
|
|
// {
|
|
// "label": "通化市",
|
|
// "value": "2205"
|
|
// },
|
|
// {
|
|
// "label": "白山市",
|
|
// "value": "2206"
|
|
// },
|
|
// {
|
|
// "label": "松原市",
|
|
// "value": "2207"
|
|
// },
|
|
// {
|
|
// "label": "白城市",
|
|
// "value": "2208"
|
|
// },
|
|
// {
|
|
// "label": "延边朝鲜族自治州",
|
|
// "value": "2224"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "哈尔滨市",
|
|
// "value": "2301"
|
|
// },
|
|
// {
|
|
// "label": "齐齐哈尔市",
|
|
// "value": "2302"
|
|
// },
|
|
// {
|
|
// "label": "鸡西市",
|
|
// "value": "2303"
|
|
// },
|
|
// {
|
|
// "label": "鹤岗市",
|
|
// "value": "2304"
|
|
// },
|
|
// {
|
|
// "label": "双鸭山市",
|
|
// "value": "2305"
|
|
// },
|
|
// {
|
|
// "label": "大庆市",
|
|
// "value": "2306"
|
|
// },
|
|
// {
|
|
// "label": "伊春市",
|
|
// "value": "2307"
|
|
// },
|
|
// {
|
|
// "label": "佳木斯市",
|
|
// "value": "2308"
|
|
// },
|
|
// {
|
|
// "label": "七台河市",
|
|
// "value": "2309"
|
|
// },
|
|
// {
|
|
// "label": "牡丹江市",
|
|
// "value": "2310"
|
|
// },
|
|
// {
|
|
// "label": "黑河市",
|
|
// "value": "2311"
|
|
// },
|
|
// {
|
|
// "label": "绥化市",
|
|
// "value": "2312"
|
|
// },
|
|
// {
|
|
// "label": "大兴安岭地区",
|
|
// "value": "2327"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "市辖区",
|
|
// "value": "3101"
|
|
// }],
|
|
// [{
|
|
// "label": "南京市",
|
|
// "value": "3201"
|
|
// },
|
|
// {
|
|
// "label": "无锡市",
|
|
// "value": "3202"
|
|
// },
|
|
// {
|
|
// "label": "徐州市",
|
|
// "value": "3203"
|
|
// },
|
|
// {
|
|
// "label": "常州市",
|
|
// "value": "3204"
|
|
// },
|
|
// {
|
|
// "label": "苏州市",
|
|
// "value": "3205"
|
|
// },
|
|
// {
|
|
// "label": "南通市",
|
|
// "value": "3206"
|
|
// },
|
|
// {
|
|
// "label": "连云港市",
|
|
// "value": "3207"
|
|
// },
|
|
// {
|
|
// "label": "淮安市",
|
|
// "value": "3208"
|
|
// },
|
|
// {
|
|
// "label": "盐城市",
|
|
// "value": "3209"
|
|
// },
|
|
// {
|
|
// "label": "扬州市",
|
|
// "value": "3210"
|
|
// },
|
|
// {
|
|
// "label": "镇江市",
|
|
// "value": "3211"
|
|
// },
|
|
// {
|
|
// "label": "泰州市",
|
|
// "value": "3212"
|
|
// },
|
|
// {
|
|
// "label": "宿迁市",
|
|
// "value": "3213"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "杭州市",
|
|
// "value": "3301"
|
|
// },
|
|
// {
|
|
// "label": "宁波市",
|
|
// "value": "3302"
|
|
// },
|
|
// {
|
|
// "label": "温州市",
|
|
// "value": "3303"
|
|
// },
|
|
// {
|
|
// "label": "嘉兴市",
|
|
// "value": "3304"
|
|
// },
|
|
// {
|
|
// "label": "湖州市",
|
|
// "value": "3305"
|
|
// },
|
|
// {
|
|
// "label": "绍兴市",
|
|
// "value": "3306"
|
|
// },
|
|
// {
|
|
// "label": "金华市",
|
|
// "value": "3307"
|
|
// },
|
|
// {
|
|
// "label": "衢州市",
|
|
// "value": "3308"
|
|
// },
|
|
// {
|
|
// "label": "舟山市",
|
|
// "value": "3309"
|
|
// },
|
|
// {
|
|
// "label": "台州市",
|
|
// "value": "3310"
|
|
// },
|
|
// {
|
|
// "label": "丽水市",
|
|
// "value": "3311"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "合肥市",
|
|
// "value": "3401"
|
|
// },
|
|
// {
|
|
// "label": "芜湖市",
|
|
// "value": "3402"
|
|
// },
|
|
// {
|
|
// "label": "蚌埠市",
|
|
// "value": "3403"
|
|
// },
|
|
// {
|
|
// "label": "淮南市",
|
|
// "value": "3404"
|
|
// },
|
|
// {
|
|
// "label": "马鞍山市",
|
|
// "value": "3405"
|
|
// },
|
|
// {
|
|
// "label": "淮北市",
|
|
// "value": "3406"
|
|
// },
|
|
// {
|
|
// "label": "铜陵市",
|
|
// "value": "3407"
|
|
// },
|
|
// {
|
|
// "label": "安庆市",
|
|
// "value": "3408"
|
|
// },
|
|
// {
|
|
// "label": "黄山市",
|
|
// "value": "3410"
|
|
// },
|
|
// {
|
|
// "label": "滁州市",
|
|
// "value": "3411"
|
|
// },
|
|
// {
|
|
// "label": "阜阳市",
|
|
// "value": "3412"
|
|
// },
|
|
// {
|
|
// "label": "宿州市",
|
|
// "value": "3413"
|
|
// },
|
|
// {
|
|
// "label": "六安市",
|
|
// "value": "3415"
|
|
// },
|
|
// {
|
|
// "label": "亳州市",
|
|
// "value": "3416"
|
|
// },
|
|
// {
|
|
// "label": "池州市",
|
|
// "value": "3417"
|
|
// },
|
|
// {
|
|
// "label": "宣城市",
|
|
// "value": "3418"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "福州市",
|
|
// "value": "3501"
|
|
// },
|
|
// {
|
|
// "label": "厦门市",
|
|
// "value": "3502"
|
|
// },
|
|
// {
|
|
// "label": "莆田市",
|
|
// "value": "3503"
|
|
// },
|
|
// {
|
|
// "label": "三明市",
|
|
// "value": "3504"
|
|
// },
|
|
// {
|
|
// "label": "泉州市",
|
|
// "value": "3505"
|
|
// },
|
|
// {
|
|
// "label": "漳州市",
|
|
// "value": "3506"
|
|
// },
|
|
// {
|
|
// "label": "南平市",
|
|
// "value": "3507"
|
|
// },
|
|
// {
|
|
// "label": "龙岩市",
|
|
// "value": "3508"
|
|
// },
|
|
// {
|
|
// "label": "宁德市",
|
|
// "value": "3509"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "南昌市",
|
|
// "value": "3601"
|
|
// },
|
|
// {
|
|
// "label": "景德镇市",
|
|
// "value": "3602"
|
|
// },
|
|
// {
|
|
// "label": "萍乡市",
|
|
// "value": "3603"
|
|
// },
|
|
// {
|
|
// "label": "九江市",
|
|
// "value": "3604"
|
|
// },
|
|
// {
|
|
// "label": "新余市",
|
|
// "value": "3605"
|
|
// },
|
|
// {
|
|
// "label": "鹰潭市",
|
|
// "value": "3606"
|
|
// },
|
|
// {
|
|
// "label": "赣州市",
|
|
// "value": "3607"
|
|
// },
|
|
// {
|
|
// "label": "吉安市",
|
|
// "value": "3608"
|
|
// },
|
|
// {
|
|
// "label": "宜春市",
|
|
// "value": "3609"
|
|
// },
|
|
// {
|
|
// "label": "抚州市",
|
|
// "value": "3610"
|
|
// },
|
|
// {
|
|
// "label": "上饶市",
|
|
// "value": "3611"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "济南市",
|
|
// "value": "3701"
|
|
// },
|
|
// {
|
|
// "label": "青岛市",
|
|
// "value": "3702"
|
|
// },
|
|
// {
|
|
// "label": "淄博市",
|
|
// "value": "3703"
|
|
// },
|
|
// {
|
|
// "label": "枣庄市",
|
|
// "value": "3704"
|
|
// },
|
|
// {
|
|
// "label": "东营市",
|
|
// "value": "3705"
|
|
// },
|
|
// {
|
|
// "label": "烟台市",
|
|
// "value": "3706"
|
|
// },
|
|
// {
|
|
// "label": "潍坊市",
|
|
// "value": "3707"
|
|
// },
|
|
// {
|
|
// "label": "济宁市",
|
|
// "value": "3708"
|
|
// },
|
|
// {
|
|
// "label": "泰安市",
|
|
// "value": "3709"
|
|
// },
|
|
// {
|
|
// "label": "威海市",
|
|
// "value": "3710"
|
|
// },
|
|
// {
|
|
// "label": "日照市",
|
|
// "value": "3711"
|
|
// },
|
|
// {
|
|
// "label": "莱芜市",
|
|
// "value": "3712"
|
|
// },
|
|
// {
|
|
// "label": "临沂市",
|
|
// "value": "3713"
|
|
// },
|
|
// {
|
|
// "label": "德州市",
|
|
// "value": "3714"
|
|
// },
|
|
// {
|
|
// "label": "聊城市",
|
|
// "value": "3715"
|
|
// },
|
|
// {
|
|
// "label": "滨州市",
|
|
// "value": "3716"
|
|
// },
|
|
// {
|
|
// "label": "菏泽市",
|
|
// "value": "3717"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "郑州市",
|
|
// "value": "4101"
|
|
// },
|
|
// {
|
|
// "label": "开封市",
|
|
// "value": "4102"
|
|
// },
|
|
// {
|
|
// "label": "洛阳市",
|
|
// "value": "4103"
|
|
// },
|
|
// {
|
|
// "label": "平顶山市",
|
|
// "value": "4104"
|
|
// },
|
|
// {
|
|
// "label": "安阳市",
|
|
// "value": "4105"
|
|
// },
|
|
// {
|
|
// "label": "鹤壁市",
|
|
// "value": "4106"
|
|
// },
|
|
// {
|
|
// "label": "新乡市",
|
|
// "value": "4107"
|
|
// },
|
|
// {
|
|
// "label": "焦作市",
|
|
// "value": "4108"
|
|
// },
|
|
// {
|
|
// "label": "濮阳市",
|
|
// "value": "4109"
|
|
// },
|
|
// {
|
|
// "label": "许昌市",
|
|
// "value": "4110"
|
|
// },
|
|
// {
|
|
// "label": "漯河市",
|
|
// "value": "4111"
|
|
// },
|
|
// {
|
|
// "label": "三门峡市",
|
|
// "value": "4112"
|
|
// },
|
|
// {
|
|
// "label": "南阳市",
|
|
// "value": "4113"
|
|
// },
|
|
// {
|
|
// "label": "商丘市",
|
|
// "value": "4114"
|
|
// },
|
|
// {
|
|
// "label": "信阳市",
|
|
// "value": "4115"
|
|
// },
|
|
// {
|
|
// "label": "周口市",
|
|
// "value": "4116"
|
|
// },
|
|
// {
|
|
// "label": "驻马店市",
|
|
// "value": "4117"
|
|
// },
|
|
// {
|
|
// "label": "省直辖县级行政区划",
|
|
// "value": "4190"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "武汉市",
|
|
// "value": "4201"
|
|
// },
|
|
// {
|
|
// "label": "黄石市",
|
|
// "value": "4202"
|
|
// },
|
|
// {
|
|
// "label": "十堰市",
|
|
// "value": "4203"
|
|
// },
|
|
// {
|
|
// "label": "宜昌市",
|
|
// "value": "4205"
|
|
// },
|
|
// {
|
|
// "label": "襄阳市",
|
|
// "value": "4206"
|
|
// },
|
|
// {
|
|
// "label": "鄂州市",
|
|
// "value": "4207"
|
|
// },
|
|
// {
|
|
// "label": "荆门市",
|
|
// "value": "4208"
|
|
// },
|
|
// {
|
|
// "label": "孝感市",
|
|
// "value": "4209"
|
|
// },
|
|
// {
|
|
// "label": "荆州市",
|
|
// "value": "4210"
|
|
// },
|
|
// {
|
|
// "label": "黄冈市",
|
|
// "value": "4211"
|
|
// },
|
|
// {
|
|
// "label": "咸宁市",
|
|
// "value": "4212"
|
|
// },
|
|
// {
|
|
// "label": "随州市",
|
|
// "value": "4213"
|
|
// },
|
|
// {
|
|
// "label": "恩施土家族苗族自治州",
|
|
// "value": "4228"
|
|
// },
|
|
// {
|
|
// "label": "省直辖县级行政区划",
|
|
// "value": "4290"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "长沙市",
|
|
// "value": "4301"
|
|
// },
|
|
// {
|
|
// "label": "株洲市",
|
|
// "value": "4302"
|
|
// },
|
|
// {
|
|
// "label": "湘潭市",
|
|
// "value": "4303"
|
|
// },
|
|
// {
|
|
// "label": "衡阳市",
|
|
// "value": "4304"
|
|
// },
|
|
// {
|
|
// "label": "邵阳市",
|
|
// "value": "4305"
|
|
// },
|
|
// {
|
|
// "label": "岳阳市",
|
|
// "value": "4306"
|
|
// },
|
|
// {
|
|
// "label": "常德市",
|
|
// "value": "4307"
|
|
// },
|
|
// {
|
|
// "label": "张家界市",
|
|
// "value": "4308"
|
|
// },
|
|
// {
|
|
// "label": "益阳市",
|
|
// "value": "4309"
|
|
// },
|
|
// {
|
|
// "label": "郴州市",
|
|
// "value": "4310"
|
|
// },
|
|
// {
|
|
// "label": "永州市",
|
|
// "value": "4311"
|
|
// },
|
|
// {
|
|
// "label": "怀化市",
|
|
// "value": "4312"
|
|
// },
|
|
// {
|
|
// "label": "娄底市",
|
|
// "value": "4313"
|
|
// },
|
|
// {
|
|
// "label": "湘西土家族苗族自治州",
|
|
// "value": "4331"
|
|
// }
|
|
// ],
|
|
|
|
[
|
|
// {
|
|
// "label": "广州市",
|
|
// "value": "4401"
|
|
// },
|
|
// {
|
|
// "label": "韶关市",
|
|
// "value": "4402"
|
|
// },
|
|
|
|
{
|
|
"label": "深圳市",
|
|
"value": "4403"
|
|
}
|
|
// ,
|
|
// {
|
|
// "label": "珠海市",
|
|
// "value": "4404"
|
|
// },
|
|
// {
|
|
// "label": "汕头市",
|
|
// "value": "4405"
|
|
// },
|
|
// {
|
|
// "label": "佛山市",
|
|
// "value": "4406"
|
|
// },
|
|
// {
|
|
// "label": "江门市",
|
|
// "value": "4407"
|
|
// },
|
|
// {
|
|
// "label": "湛江市",
|
|
// "value": "4408"
|
|
// },
|
|
// {
|
|
// "label": "茂名市",
|
|
// "value": "4409"
|
|
// },
|
|
// {
|
|
// "label": "肇庆市",
|
|
// "value": "4412"
|
|
// },
|
|
// {
|
|
// "label": "惠州市",
|
|
// "value": "4413"
|
|
// },
|
|
// {
|
|
// "label": "梅州市",
|
|
// "value": "4414"
|
|
// },
|
|
// {
|
|
// "label": "汕尾市",
|
|
// "value": "4415"
|
|
// },
|
|
// {
|
|
// "label": "河源市",
|
|
// "value": "4416"
|
|
// },
|
|
// {
|
|
// "label": "阳江市",
|
|
// "value": "4417"
|
|
// },
|
|
// {
|
|
// "label": "清远市",
|
|
// "value": "4418"
|
|
// },
|
|
// {
|
|
// "label": "东莞市",
|
|
// "value": "4419"
|
|
// },
|
|
// {
|
|
// "label": "中山市",
|
|
// "value": "4420"
|
|
// },
|
|
// {
|
|
// "label": "潮州市",
|
|
// "value": "4451"
|
|
// },
|
|
// {
|
|
// "label": "揭阳市",
|
|
// "value": "4452"
|
|
// },
|
|
// {
|
|
// "label": "云浮市",
|
|
// "value": "4453"
|
|
// }
|
|
]
|
|
// ,
|
|
// [{
|
|
// "label": "南宁市",
|
|
// "value": "4501"
|
|
// },
|
|
// {
|
|
// "label": "柳州市",
|
|
// "value": "4502"
|
|
// },
|
|
// {
|
|
// "label": "桂林市",
|
|
// "value": "4503"
|
|
// },
|
|
// {
|
|
// "label": "梧州市",
|
|
// "value": "4504"
|
|
// },
|
|
// {
|
|
// "label": "北海市",
|
|
// "value": "4505"
|
|
// },
|
|
// {
|
|
// "label": "防城港市",
|
|
// "value": "4506"
|
|
// },
|
|
// {
|
|
// "label": "钦州市",
|
|
// "value": "4507"
|
|
// },
|
|
// {
|
|
// "label": "贵港市",
|
|
// "value": "4508"
|
|
// },
|
|
// {
|
|
// "label": "玉林市",
|
|
// "value": "4509"
|
|
// },
|
|
// {
|
|
// "label": "百色市",
|
|
// "value": "4510"
|
|
// },
|
|
// {
|
|
// "label": "贺州市",
|
|
// "value": "4511"
|
|
// },
|
|
// {
|
|
// "label": "河池市",
|
|
// "value": "4512"
|
|
// },
|
|
// {
|
|
// "label": "来宾市",
|
|
// "value": "4513"
|
|
// },
|
|
// {
|
|
// "label": "崇左市",
|
|
// "value": "4514"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "海口市",
|
|
// "value": "4601"
|
|
// },
|
|
// {
|
|
// "label": "三亚市",
|
|
// "value": "4602"
|
|
// },
|
|
// {
|
|
// "label": "三沙市",
|
|
// "value": "4603"
|
|
// },
|
|
// {
|
|
// "label": "儋州市",
|
|
// "value": "4604"
|
|
// },
|
|
// {
|
|
// "label": "省直辖县级行政区划",
|
|
// "value": "4690"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "市辖区",
|
|
// "value": "5001"
|
|
// },
|
|
// {
|
|
// "label": "县",
|
|
// "value": "5002"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "成都市",
|
|
// "value": "5101"
|
|
// },
|
|
// {
|
|
// "label": "自贡市",
|
|
// "value": "5103"
|
|
// },
|
|
// {
|
|
// "label": "攀枝花市",
|
|
// "value": "5104"
|
|
// },
|
|
// {
|
|
// "label": "泸州市",
|
|
// "value": "5105"
|
|
// },
|
|
// {
|
|
// "label": "德阳市",
|
|
// "value": "5106"
|
|
// },
|
|
// {
|
|
// "label": "绵阳市",
|
|
// "value": "5107"
|
|
// },
|
|
// {
|
|
// "label": "广元市",
|
|
// "value": "5108"
|
|
// },
|
|
// {
|
|
// "label": "遂宁市",
|
|
// "value": "5109"
|
|
// },
|
|
// {
|
|
// "label": "内江市",
|
|
// "value": "5110"
|
|
// },
|
|
// {
|
|
// "label": "乐山市",
|
|
// "value": "5111"
|
|
// },
|
|
// {
|
|
// "label": "南充市",
|
|
// "value": "5113"
|
|
// },
|
|
// {
|
|
// "label": "眉山市",
|
|
// "value": "5114"
|
|
// },
|
|
// {
|
|
// "label": "宜宾市",
|
|
// "value": "5115"
|
|
// },
|
|
// {
|
|
// "label": "广安市",
|
|
// "value": "5116"
|
|
// },
|
|
// {
|
|
// "label": "达州市",
|
|
// "value": "5117"
|
|
// },
|
|
// {
|
|
// "label": "雅安市",
|
|
// "value": "5118"
|
|
// },
|
|
// {
|
|
// "label": "巴中市",
|
|
// "value": "5119"
|
|
// },
|
|
// {
|
|
// "label": "资阳市",
|
|
// "value": "5120"
|
|
// },
|
|
// {
|
|
// "label": "阿坝藏族羌族自治州",
|
|
// "value": "5132"
|
|
// },
|
|
// {
|
|
// "label": "甘孜藏族自治州",
|
|
// "value": "5133"
|
|
// },
|
|
// {
|
|
// "label": "凉山彝族自治州",
|
|
// "value": "5134"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "贵阳市",
|
|
// "value": "5201"
|
|
// },
|
|
// {
|
|
// "label": "六盘水市",
|
|
// "value": "5202"
|
|
// },
|
|
// {
|
|
// "label": "遵义市",
|
|
// "value": "5203"
|
|
// },
|
|
// {
|
|
// "label": "安顺市",
|
|
// "value": "5204"
|
|
// },
|
|
// {
|
|
// "label": "毕节市",
|
|
// "value": "5205"
|
|
// },
|
|
// {
|
|
// "label": "铜仁市",
|
|
// "value": "5206"
|
|
// },
|
|
// {
|
|
// "label": "黔西南布依族苗族自治州",
|
|
// "value": "5223"
|
|
// },
|
|
// {
|
|
// "label": "黔东南苗族侗族自治州",
|
|
// "value": "5226"
|
|
// },
|
|
// {
|
|
// "label": "黔南布依族苗族自治州",
|
|
// "value": "5227"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "昆明市",
|
|
// "value": "5301"
|
|
// },
|
|
// {
|
|
// "label": "曲靖市",
|
|
// "value": "5303"
|
|
// },
|
|
// {
|
|
// "label": "玉溪市",
|
|
// "value": "5304"
|
|
// },
|
|
// {
|
|
// "label": "保山市",
|
|
// "value": "5305"
|
|
// },
|
|
// {
|
|
// "label": "昭通市",
|
|
// "value": "5306"
|
|
// },
|
|
// {
|
|
// "label": "丽江市",
|
|
// "value": "5307"
|
|
// },
|
|
// {
|
|
// "label": "普洱市",
|
|
// "value": "5308"
|
|
// },
|
|
// {
|
|
// "label": "临沧市",
|
|
// "value": "5309"
|
|
// },
|
|
// {
|
|
// "label": "楚雄彝族自治州",
|
|
// "value": "5323"
|
|
// },
|
|
// {
|
|
// "label": "红河哈尼族彝族自治州",
|
|
// "value": "5325"
|
|
// },
|
|
// {
|
|
// "label": "文山壮族苗族自治州",
|
|
// "value": "5326"
|
|
// },
|
|
// {
|
|
// "label": "西双版纳傣族自治州",
|
|
// "value": "5328"
|
|
// },
|
|
// {
|
|
// "label": "大理白族自治州",
|
|
// "value": "5329"
|
|
// },
|
|
// {
|
|
// "label": "德宏傣族景颇族自治州",
|
|
// "value": "5331"
|
|
// },
|
|
// {
|
|
// "label": "怒江傈僳族自治州",
|
|
// "value": "5333"
|
|
// },
|
|
// {
|
|
// "label": "迪庆藏族自治州",
|
|
// "value": "5334"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "拉萨市",
|
|
// "value": "5401"
|
|
// },
|
|
// {
|
|
// "label": "日喀则市",
|
|
// "value": "5402"
|
|
// },
|
|
// {
|
|
// "label": "昌都市",
|
|
// "value": "5403"
|
|
// },
|
|
// {
|
|
// "label": "林芝市",
|
|
// "value": "5404"
|
|
// },
|
|
// {
|
|
// "label": "山南市",
|
|
// "value": "5405"
|
|
// },
|
|
// {
|
|
// "label": "那曲地区",
|
|
// "value": "5424"
|
|
// },
|
|
// {
|
|
// "label": "阿里地区",
|
|
// "value": "5425"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "西安市",
|
|
// "value": "6101"
|
|
// },
|
|
// {
|
|
// "label": "铜川市",
|
|
// "value": "6102"
|
|
// },
|
|
// {
|
|
// "label": "宝鸡市",
|
|
// "value": "6103"
|
|
// },
|
|
// {
|
|
// "label": "咸阳市",
|
|
// "value": "6104"
|
|
// },
|
|
// {
|
|
// "label": "渭南市",
|
|
// "value": "6105"
|
|
// },
|
|
// {
|
|
// "label": "延安市",
|
|
// "value": "6106"
|
|
// },
|
|
// {
|
|
// "label": "汉中市",
|
|
// "value": "6107"
|
|
// },
|
|
// {
|
|
// "label": "榆林市",
|
|
// "value": "6108"
|
|
// },
|
|
// {
|
|
// "label": "安康市",
|
|
// "value": "6109"
|
|
// },
|
|
// {
|
|
// "label": "商洛市",
|
|
// "value": "6110"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "兰州市",
|
|
// "value": "6201"
|
|
// },
|
|
// {
|
|
// "label": "嘉峪关市",
|
|
// "value": "6202"
|
|
// },
|
|
// {
|
|
// "label": "金昌市",
|
|
// "value": "6203"
|
|
// },
|
|
// {
|
|
// "label": "白银市",
|
|
// "value": "6204"
|
|
// },
|
|
// {
|
|
// "label": "天水市",
|
|
// "value": "6205"
|
|
// },
|
|
// {
|
|
// "label": "武威市",
|
|
// "value": "6206"
|
|
// },
|
|
// {
|
|
// "label": "张掖市",
|
|
// "value": "6207"
|
|
// },
|
|
// {
|
|
// "label": "平凉市",
|
|
// "value": "6208"
|
|
// },
|
|
// {
|
|
// "label": "酒泉市",
|
|
// "value": "6209"
|
|
// },
|
|
// {
|
|
// "label": "庆阳市",
|
|
// "value": "6210"
|
|
// },
|
|
// {
|
|
// "label": "定西市",
|
|
// "value": "6211"
|
|
// },
|
|
// {
|
|
// "label": "陇南市",
|
|
// "value": "6212"
|
|
// },
|
|
// {
|
|
// "label": "临夏回族自治州",
|
|
// "value": "6229"
|
|
// },
|
|
// {
|
|
// "label": "甘南藏族自治州",
|
|
// "value": "6230"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "西宁市",
|
|
// "value": "6301"
|
|
// },
|
|
// {
|
|
// "label": "海东市",
|
|
// "value": "6302"
|
|
// },
|
|
// {
|
|
// "label": "海北藏族自治州",
|
|
// "value": "6322"
|
|
// },
|
|
// {
|
|
// "label": "黄南藏族自治州",
|
|
// "value": "6323"
|
|
// },
|
|
// {
|
|
// "label": "海南藏族自治州",
|
|
// "value": "6325"
|
|
// },
|
|
// {
|
|
// "label": "果洛藏族自治州",
|
|
// "value": "6326"
|
|
// },
|
|
// {
|
|
// "label": "玉树藏族自治州",
|
|
// "value": "6327"
|
|
// },
|
|
// {
|
|
// "label": "海西蒙古族藏族自治州",
|
|
// "value": "6328"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "银川市",
|
|
// "value": "6401"
|
|
// },
|
|
// {
|
|
// "label": "石嘴山市",
|
|
// "value": "6402"
|
|
// },
|
|
// {
|
|
// "label": "吴忠市",
|
|
// "value": "6403"
|
|
// },
|
|
// {
|
|
// "label": "固原市",
|
|
// "value": "6404"
|
|
// },
|
|
// {
|
|
// "label": "中卫市",
|
|
// "value": "6405"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "乌鲁木齐市",
|
|
// "value": "6501"
|
|
// },
|
|
// {
|
|
// "label": "克拉玛依市",
|
|
// "value": "6502"
|
|
// },
|
|
// {
|
|
// "label": "吐鲁番市",
|
|
// "value": "6504"
|
|
// },
|
|
// {
|
|
// "label": "哈密市",
|
|
// "value": "6505"
|
|
// },
|
|
// {
|
|
// "label": "昌吉回族自治州",
|
|
// "value": "6523"
|
|
// },
|
|
// {
|
|
// "label": "博尔塔拉蒙古自治州",
|
|
// "value": "6527"
|
|
// },
|
|
// {
|
|
// "label": "巴音郭楞蒙古自治州",
|
|
// "value": "6528"
|
|
// },
|
|
// {
|
|
// "label": "阿克苏地区",
|
|
// "value": "6529"
|
|
// },
|
|
// {
|
|
// "label": "克孜勒苏柯尔克孜自治州",
|
|
// "value": "6530"
|
|
// },
|
|
// {
|
|
// "label": "喀什地区",
|
|
// "value": "6531"
|
|
// },
|
|
// {
|
|
// "label": "和田地区",
|
|
// "value": "6532"
|
|
// },
|
|
// {
|
|
// "label": "伊犁哈萨克自治州",
|
|
// "value": "6540"
|
|
// },
|
|
// {
|
|
// "label": "塔城地区",
|
|
// "value": "6542"
|
|
// },
|
|
// {
|
|
// "label": "阿勒泰地区",
|
|
// "value": "6543"
|
|
// },
|
|
// {
|
|
// "label": "自治区直辖县级行政区划",
|
|
// "value": "6590"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "台北",
|
|
// "value": "6601"
|
|
// },
|
|
// {
|
|
// "label": "高雄",
|
|
// "value": "6602"
|
|
// },
|
|
// {
|
|
// "label": "基隆",
|
|
// "value": "6603"
|
|
// },
|
|
// {
|
|
// "label": "台中",
|
|
// "value": "6604"
|
|
// },
|
|
// {
|
|
// "label": "台南",
|
|
// "value": "6605"
|
|
// },
|
|
// {
|
|
// "label": "新竹",
|
|
// "value": "6606"
|
|
// },
|
|
// {
|
|
// "label": "嘉义",
|
|
// "value": "6607"
|
|
// },
|
|
// {
|
|
// "label": "宜兰",
|
|
// "value": "6608"
|
|
// },
|
|
// {
|
|
// "label": "桃园",
|
|
// "value": "6609"
|
|
// },
|
|
// {
|
|
// "label": "苗栗",
|
|
// "value": "6610"
|
|
// },
|
|
// {
|
|
// "label": "彰化",
|
|
// "value": "6611"
|
|
// },
|
|
// {
|
|
// "label": "南投",
|
|
// "value": "6612"
|
|
// },
|
|
// {
|
|
// "label": "云林",
|
|
// "value": "6613"
|
|
// },
|
|
// {
|
|
// "label": "屏东",
|
|
// "value": "6614"
|
|
// },
|
|
// {
|
|
// "label": "台东",
|
|
// "value": "6615"
|
|
// },
|
|
// {
|
|
// "label": "花莲",
|
|
// "value": "6616"
|
|
// },
|
|
// {
|
|
// "label": "澎湖",
|
|
// "value": "6617"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "香港岛",
|
|
// "value": "6701"
|
|
// },
|
|
// {
|
|
// "label": "九龙",
|
|
// "value": "6702"
|
|
// },
|
|
// {
|
|
// "label": "新界",
|
|
// "value": "6703"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "澳门半岛",
|
|
// "value": "6801"
|
|
// },
|
|
// {
|
|
// "label": "氹仔岛",
|
|
// "value": "6802"
|
|
// },
|
|
// {
|
|
// "label": "路环岛",
|
|
// "value": "6803"
|
|
// },
|
|
// {
|
|
// "label": "路氹城",
|
|
// "value": "6804"
|
|
// }
|
|
// ]
|
|
];
|
|
var _default = cityData;
|
|
exports.default = _default;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 291:
|
|
/*!**********************************************************************!*\
|
|
!*** D:/工作/zhonglmini/components/mpvue-citypicker/city-data/area.js ***!
|
|
\**********************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = void 0;
|
|
// /* eslint-disable */
|
|
var areaData = [
|
|
// [
|
|
// [{
|
|
// "label": "东城区",
|
|
// "value": "110101"
|
|
// },
|
|
// {
|
|
// "label": "西城区",
|
|
// "value": "110102"
|
|
// },
|
|
// {
|
|
// "label": "朝阳区",
|
|
// "value": "110105"
|
|
// },
|
|
// {
|
|
// "label": "丰台区",
|
|
// "value": "110106"
|
|
// },
|
|
// {
|
|
// "label": "石景山区",
|
|
// "value": "110107"
|
|
// },
|
|
// {
|
|
// "label": "海淀区",
|
|
// "value": "110108"
|
|
// },
|
|
// {
|
|
// "label": "门头沟区",
|
|
// "value": "110109"
|
|
// },
|
|
// {
|
|
// "label": "房山区",
|
|
// "value": "110111"
|
|
// },
|
|
// {
|
|
// "label": "通州区",
|
|
// "value": "110112"
|
|
// },
|
|
// {
|
|
// "label": "顺义区",
|
|
// "value": "110113"
|
|
// },
|
|
// {
|
|
// "label": "昌平区",
|
|
// "value": "110114"
|
|
// },
|
|
// {
|
|
// "label": "大兴区",
|
|
// "value": "110115"
|
|
// },
|
|
// {
|
|
// "label": "怀柔区",
|
|
// "value": "110116"
|
|
// },
|
|
// {
|
|
// "label": "平谷区",
|
|
// "value": "110117"
|
|
// },
|
|
// {
|
|
// "label": "密云区",
|
|
// "value": "110118"
|
|
// },
|
|
// {
|
|
// "label": "延庆区",
|
|
// "value": "110119"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "和平区",
|
|
// "value": "120101"
|
|
// },
|
|
// {
|
|
// "label": "河东区",
|
|
// "value": "120102"
|
|
// },
|
|
// {
|
|
// "label": "河西区",
|
|
// "value": "120103"
|
|
// },
|
|
// {
|
|
// "label": "南开区",
|
|
// "value": "120104"
|
|
// },
|
|
// {
|
|
// "label": "河北区",
|
|
// "value": "120105"
|
|
// },
|
|
// {
|
|
// "label": "红桥区",
|
|
// "value": "120106"
|
|
// },
|
|
// {
|
|
// "label": "东丽区",
|
|
// "value": "120110"
|
|
// },
|
|
// {
|
|
// "label": "西青区",
|
|
// "value": "120111"
|
|
// },
|
|
// {
|
|
// "label": "津南区",
|
|
// "value": "120112"
|
|
// },
|
|
// {
|
|
// "label": "北辰区",
|
|
// "value": "120113"
|
|
// },
|
|
// {
|
|
// "label": "武清区",
|
|
// "value": "120114"
|
|
// },
|
|
// {
|
|
// "label": "宝坻区",
|
|
// "value": "120115"
|
|
// },
|
|
// {
|
|
// "label": "滨海新区",
|
|
// "value": "120116"
|
|
// },
|
|
// {
|
|
// "label": "宁河区",
|
|
// "value": "120117"
|
|
// },
|
|
// {
|
|
// "label": "静海区",
|
|
// "value": "120118"
|
|
// },
|
|
// {
|
|
// "label": "蓟州区",
|
|
// "value": "120119"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "长安区",
|
|
// "value": "130102"
|
|
// },
|
|
// {
|
|
// "label": "桥西区",
|
|
// "value": "130104"
|
|
// },
|
|
// {
|
|
// "label": "新华区",
|
|
// "value": "130105"
|
|
// },
|
|
// {
|
|
// "label": "井陉矿区",
|
|
// "value": "130107"
|
|
// },
|
|
// {
|
|
// "label": "裕华区",
|
|
// "value": "130108"
|
|
// },
|
|
// {
|
|
// "label": "藁城区",
|
|
// "value": "130109"
|
|
// },
|
|
// {
|
|
// "label": "鹿泉区",
|
|
// "value": "130110"
|
|
// },
|
|
// {
|
|
// "label": "栾城区",
|
|
// "value": "130111"
|
|
// },
|
|
// {
|
|
// "label": "井陉县",
|
|
// "value": "130121"
|
|
// },
|
|
// {
|
|
// "label": "正定县",
|
|
// "value": "130123"
|
|
// },
|
|
// {
|
|
// "label": "行唐县",
|
|
// "value": "130125"
|
|
// },
|
|
// {
|
|
// "label": "灵寿县",
|
|
// "value": "130126"
|
|
// },
|
|
// {
|
|
// "label": "高邑县",
|
|
// "value": "130127"
|
|
// },
|
|
// {
|
|
// "label": "深泽县",
|
|
// "value": "130128"
|
|
// },
|
|
// {
|
|
// "label": "赞皇县",
|
|
// "value": "130129"
|
|
// },
|
|
// {
|
|
// "label": "无极县",
|
|
// "value": "130130"
|
|
// },
|
|
// {
|
|
// "label": "平山县",
|
|
// "value": "130131"
|
|
// },
|
|
// {
|
|
// "label": "元氏县",
|
|
// "value": "130132"
|
|
// },
|
|
// {
|
|
// "label": "赵县",
|
|
// "value": "130133"
|
|
// },
|
|
// {
|
|
// "label": "石家庄高新技术产业开发区",
|
|
// "value": "130171"
|
|
// },
|
|
// {
|
|
// "label": "石家庄循环化工园区",
|
|
// "value": "130172"
|
|
// },
|
|
// {
|
|
// "label": "辛集市",
|
|
// "value": "130181"
|
|
// },
|
|
// {
|
|
// "label": "晋州市",
|
|
// "value": "130183"
|
|
// },
|
|
// {
|
|
// "label": "新乐市",
|
|
// "value": "130184"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "路南区",
|
|
// "value": "130202"
|
|
// },
|
|
// {
|
|
// "label": "路北区",
|
|
// "value": "130203"
|
|
// },
|
|
// {
|
|
// "label": "古冶区",
|
|
// "value": "130204"
|
|
// },
|
|
// {
|
|
// "label": "开平区",
|
|
// "value": "130205"
|
|
// },
|
|
// {
|
|
// "label": "丰南区",
|
|
// "value": "130207"
|
|
// },
|
|
// {
|
|
// "label": "丰润区",
|
|
// "value": "130208"
|
|
// },
|
|
// {
|
|
// "label": "曹妃甸区",
|
|
// "value": "130209"
|
|
// },
|
|
// {
|
|
// "label": "滦县",
|
|
// "value": "130223"
|
|
// },
|
|
// {
|
|
// "label": "滦南县",
|
|
// "value": "130224"
|
|
// },
|
|
// {
|
|
// "label": "乐亭县",
|
|
// "value": "130225"
|
|
// },
|
|
// {
|
|
// "label": "迁西县",
|
|
// "value": "130227"
|
|
// },
|
|
// {
|
|
// "label": "玉田县",
|
|
// "value": "130229"
|
|
// },
|
|
// {
|
|
// "label": "唐山市芦台经济技术开发区",
|
|
// "value": "130271"
|
|
// },
|
|
// {
|
|
// "label": "唐山市汉沽管理区",
|
|
// "value": "130272"
|
|
// },
|
|
// {
|
|
// "label": "唐山高新技术产业开发区",
|
|
// "value": "130273"
|
|
// },
|
|
// {
|
|
// "label": "河北唐山海港经济开发区",
|
|
// "value": "130274"
|
|
// },
|
|
// {
|
|
// "label": "遵化市",
|
|
// "value": "130281"
|
|
// },
|
|
// {
|
|
// "label": "迁安市",
|
|
// "value": "130283"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "海港区",
|
|
// "value": "130302"
|
|
// },
|
|
// {
|
|
// "label": "山海关区",
|
|
// "value": "130303"
|
|
// },
|
|
// {
|
|
// "label": "北戴河区",
|
|
// "value": "130304"
|
|
// },
|
|
// {
|
|
// "label": "抚宁区",
|
|
// "value": "130306"
|
|
// },
|
|
// {
|
|
// "label": "青龙满族自治县",
|
|
// "value": "130321"
|
|
// },
|
|
// {
|
|
// "label": "昌黎县",
|
|
// "value": "130322"
|
|
// },
|
|
// {
|
|
// "label": "卢龙县",
|
|
// "value": "130324"
|
|
// },
|
|
// {
|
|
// "label": "秦皇岛市经济技术开发区",
|
|
// "value": "130371"
|
|
// },
|
|
// {
|
|
// "label": "北戴河新区",
|
|
// "value": "130372"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "邯山区",
|
|
// "value": "130402"
|
|
// },
|
|
// {
|
|
// "label": "丛台区",
|
|
// "value": "130403"
|
|
// },
|
|
// {
|
|
// "label": "复兴区",
|
|
// "value": "130404"
|
|
// },
|
|
// {
|
|
// "label": "峰峰矿区",
|
|
// "value": "130406"
|
|
// },
|
|
// {
|
|
// "label": "肥乡区",
|
|
// "value": "130407"
|
|
// },
|
|
// {
|
|
// "label": "永年区",
|
|
// "value": "130408"
|
|
// },
|
|
// {
|
|
// "label": "临漳县",
|
|
// "value": "130423"
|
|
// },
|
|
// {
|
|
// "label": "成安县",
|
|
// "value": "130424"
|
|
// },
|
|
// {
|
|
// "label": "大名县",
|
|
// "value": "130425"
|
|
// },
|
|
// {
|
|
// "label": "涉县",
|
|
// "value": "130426"
|
|
// },
|
|
// {
|
|
// "label": "磁县",
|
|
// "value": "130427"
|
|
// },
|
|
// {
|
|
// "label": "邱县",
|
|
// "value": "130430"
|
|
// },
|
|
// {
|
|
// "label": "鸡泽县",
|
|
// "value": "130431"
|
|
// },
|
|
// {
|
|
// "label": "广平县",
|
|
// "value": "130432"
|
|
// },
|
|
// {
|
|
// "label": "馆陶县",
|
|
// "value": "130433"
|
|
// },
|
|
// {
|
|
// "label": "魏县",
|
|
// "value": "130434"
|
|
// },
|
|
// {
|
|
// "label": "曲周县",
|
|
// "value": "130435"
|
|
// },
|
|
// {
|
|
// "label": "邯郸经济技术开发区",
|
|
// "value": "130471"
|
|
// },
|
|
// {
|
|
// "label": "邯郸冀南新区",
|
|
// "value": "130473"
|
|
// },
|
|
// {
|
|
// "label": "武安市",
|
|
// "value": "130481"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "桥东区",
|
|
// "value": "130502"
|
|
// },
|
|
// {
|
|
// "label": "桥西区",
|
|
// "value": "130503"
|
|
// },
|
|
// {
|
|
// "label": "邢台县",
|
|
// "value": "130521"
|
|
// },
|
|
// {
|
|
// "label": "临城县",
|
|
// "value": "130522"
|
|
// },
|
|
// {
|
|
// "label": "内丘县",
|
|
// "value": "130523"
|
|
// },
|
|
// {
|
|
// "label": "柏乡县",
|
|
// "value": "130524"
|
|
// },
|
|
// {
|
|
// "label": "隆尧县",
|
|
// "value": "130525"
|
|
// },
|
|
// {
|
|
// "label": "任县",
|
|
// "value": "130526"
|
|
// },
|
|
// {
|
|
// "label": "南和县",
|
|
// "value": "130527"
|
|
// },
|
|
// {
|
|
// "label": "宁晋县",
|
|
// "value": "130528"
|
|
// },
|
|
// {
|
|
// "label": "巨鹿县",
|
|
// "value": "130529"
|
|
// },
|
|
// {
|
|
// "label": "新河县",
|
|
// "value": "130530"
|
|
// },
|
|
// {
|
|
// "label": "广宗县",
|
|
// "value": "130531"
|
|
// },
|
|
// {
|
|
// "label": "平乡县",
|
|
// "value": "130532"
|
|
// },
|
|
// {
|
|
// "label": "威县",
|
|
// "value": "130533"
|
|
// },
|
|
// {
|
|
// "label": "清河县",
|
|
// "value": "130534"
|
|
// },
|
|
// {
|
|
// "label": "临西县",
|
|
// "value": "130535"
|
|
// },
|
|
// {
|
|
// "label": "河北邢台经济开发区",
|
|
// "value": "130571"
|
|
// },
|
|
// {
|
|
// "label": "南宫市",
|
|
// "value": "130581"
|
|
// },
|
|
// {
|
|
// "label": "沙河市",
|
|
// "value": "130582"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "竞秀区",
|
|
// "value": "130602"
|
|
// },
|
|
// {
|
|
// "label": "莲池区",
|
|
// "value": "130606"
|
|
// },
|
|
// {
|
|
// "label": "满城区",
|
|
// "value": "130607"
|
|
// },
|
|
// {
|
|
// "label": "清苑区",
|
|
// "value": "130608"
|
|
// },
|
|
// {
|
|
// "label": "徐水区",
|
|
// "value": "130609"
|
|
// },
|
|
// {
|
|
// "label": "涞水县",
|
|
// "value": "130623"
|
|
// },
|
|
// {
|
|
// "label": "阜平县",
|
|
// "value": "130624"
|
|
// },
|
|
// {
|
|
// "label": "定兴县",
|
|
// "value": "130626"
|
|
// },
|
|
// {
|
|
// "label": "唐县",
|
|
// "value": "130627"
|
|
// },
|
|
// {
|
|
// "label": "高阳县",
|
|
// "value": "130628"
|
|
// },
|
|
// {
|
|
// "label": "容城县",
|
|
// "value": "130629"
|
|
// },
|
|
// {
|
|
// "label": "涞源县",
|
|
// "value": "130630"
|
|
// },
|
|
// {
|
|
// "label": "望都县",
|
|
// "value": "130631"
|
|
// },
|
|
// {
|
|
// "label": "安新县",
|
|
// "value": "130632"
|
|
// },
|
|
// {
|
|
// "label": "易县",
|
|
// "value": "130633"
|
|
// },
|
|
// {
|
|
// "label": "曲阳县",
|
|
// "value": "130634"
|
|
// },
|
|
// {
|
|
// "label": "蠡县",
|
|
// "value": "130635"
|
|
// },
|
|
// {
|
|
// "label": "顺平县",
|
|
// "value": "130636"
|
|
// },
|
|
// {
|
|
// "label": "博野县",
|
|
// "value": "130637"
|
|
// },
|
|
// {
|
|
// "label": "雄县",
|
|
// "value": "130638"
|
|
// },
|
|
// {
|
|
// "label": "保定高新技术产业开发区",
|
|
// "value": "130671"
|
|
// },
|
|
// {
|
|
// "label": "保定白沟新城",
|
|
// "value": "130672"
|
|
// },
|
|
// {
|
|
// "label": "涿州市",
|
|
// "value": "130681"
|
|
// },
|
|
// {
|
|
// "label": "定州市",
|
|
// "value": "130682"
|
|
// },
|
|
// {
|
|
// "label": "安国市",
|
|
// "value": "130683"
|
|
// },
|
|
// {
|
|
// "label": "高碑店市",
|
|
// "value": "130684"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "桥东区",
|
|
// "value": "130702"
|
|
// },
|
|
// {
|
|
// "label": "桥西区",
|
|
// "value": "130703"
|
|
// },
|
|
// {
|
|
// "label": "宣化区",
|
|
// "value": "130705"
|
|
// },
|
|
// {
|
|
// "label": "下花园区",
|
|
// "value": "130706"
|
|
// },
|
|
// {
|
|
// "label": "万全区",
|
|
// "value": "130708"
|
|
// },
|
|
// {
|
|
// "label": "崇礼区",
|
|
// "value": "130709"
|
|
// },
|
|
// {
|
|
// "label": "张北县",
|
|
// "value": "130722"
|
|
// },
|
|
// {
|
|
// "label": "康保县",
|
|
// "value": "130723"
|
|
// },
|
|
// {
|
|
// "label": "沽源县",
|
|
// "value": "130724"
|
|
// },
|
|
// {
|
|
// "label": "尚义县",
|
|
// "value": "130725"
|
|
// },
|
|
// {
|
|
// "label": "蔚县",
|
|
// "value": "130726"
|
|
// },
|
|
// {
|
|
// "label": "阳原县",
|
|
// "value": "130727"
|
|
// },
|
|
// {
|
|
// "label": "怀安县",
|
|
// "value": "130728"
|
|
// },
|
|
// {
|
|
// "label": "怀来县",
|
|
// "value": "130730"
|
|
// },
|
|
// {
|
|
// "label": "涿鹿县",
|
|
// "value": "130731"
|
|
// },
|
|
// {
|
|
// "label": "赤城县",
|
|
// "value": "130732"
|
|
// },
|
|
// {
|
|
// "label": "张家口市高新技术产业开发区",
|
|
// "value": "130771"
|
|
// },
|
|
// {
|
|
// "label": "张家口市察北管理区",
|
|
// "value": "130772"
|
|
// },
|
|
// {
|
|
// "label": "张家口市塞北管理区",
|
|
// "value": "130773"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "双桥区",
|
|
// "value": "130802"
|
|
// },
|
|
// {
|
|
// "label": "双滦区",
|
|
// "value": "130803"
|
|
// },
|
|
// {
|
|
// "label": "鹰手营子矿区",
|
|
// "value": "130804"
|
|
// },
|
|
// {
|
|
// "label": "承德县",
|
|
// "value": "130821"
|
|
// },
|
|
// {
|
|
// "label": "兴隆县",
|
|
// "value": "130822"
|
|
// },
|
|
// {
|
|
// "label": "滦平县",
|
|
// "value": "130824"
|
|
// },
|
|
// {
|
|
// "label": "隆化县",
|
|
// "value": "130825"
|
|
// },
|
|
// {
|
|
// "label": "丰宁满族自治县",
|
|
// "value": "130826"
|
|
// },
|
|
// {
|
|
// "label": "宽城满族自治县",
|
|
// "value": "130827"
|
|
// },
|
|
// {
|
|
// "label": "围场满族蒙古族自治县",
|
|
// "value": "130828"
|
|
// },
|
|
// {
|
|
// "label": "承德高新技术产业开发区",
|
|
// "value": "130871"
|
|
// },
|
|
// {
|
|
// "label": "平泉市",
|
|
// "value": "130881"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "新华区",
|
|
// "value": "130902"
|
|
// },
|
|
// {
|
|
// "label": "运河区",
|
|
// "value": "130903"
|
|
// },
|
|
// {
|
|
// "label": "沧县",
|
|
// "value": "130921"
|
|
// },
|
|
// {
|
|
// "label": "青县",
|
|
// "value": "130922"
|
|
// },
|
|
// {
|
|
// "label": "东光县",
|
|
// "value": "130923"
|
|
// },
|
|
// {
|
|
// "label": "海兴县",
|
|
// "value": "130924"
|
|
// },
|
|
// {
|
|
// "label": "盐山县",
|
|
// "value": "130925"
|
|
// },
|
|
// {
|
|
// "label": "肃宁县",
|
|
// "value": "130926"
|
|
// },
|
|
// {
|
|
// "label": "南皮县",
|
|
// "value": "130927"
|
|
// },
|
|
// {
|
|
// "label": "吴桥县",
|
|
// "value": "130928"
|
|
// },
|
|
// {
|
|
// "label": "献县",
|
|
// "value": "130929"
|
|
// },
|
|
// {
|
|
// "label": "孟村回族自治县",
|
|
// "value": "130930"
|
|
// },
|
|
// {
|
|
// "label": "河北沧州经济开发区",
|
|
// "value": "130971"
|
|
// },
|
|
// {
|
|
// "label": "沧州高新技术产业开发区",
|
|
// "value": "130972"
|
|
// },
|
|
// {
|
|
// "label": "沧州渤海新区",
|
|
// "value": "130973"
|
|
// },
|
|
// {
|
|
// "label": "泊头市",
|
|
// "value": "130981"
|
|
// },
|
|
// {
|
|
// "label": "任丘市",
|
|
// "value": "130982"
|
|
// },
|
|
// {
|
|
// "label": "黄骅市",
|
|
// "value": "130983"
|
|
// },
|
|
// {
|
|
// "label": "河间市",
|
|
// "value": "130984"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "安次区",
|
|
// "value": "131002"
|
|
// },
|
|
// {
|
|
// "label": "广阳区",
|
|
// "value": "131003"
|
|
// },
|
|
// {
|
|
// "label": "固安县",
|
|
// "value": "131022"
|
|
// },
|
|
// {
|
|
// "label": "永清县",
|
|
// "value": "131023"
|
|
// },
|
|
// {
|
|
// "label": "香河县",
|
|
// "value": "131024"
|
|
// },
|
|
// {
|
|
// "label": "大城县",
|
|
// "value": "131025"
|
|
// },
|
|
// {
|
|
// "label": "文安县",
|
|
// "value": "131026"
|
|
// },
|
|
// {
|
|
// "label": "大厂回族自治县",
|
|
// "value": "131028"
|
|
// },
|
|
// {
|
|
// "label": "廊坊经济技术开发区",
|
|
// "value": "131071"
|
|
// },
|
|
// {
|
|
// "label": "霸州市",
|
|
// "value": "131081"
|
|
// },
|
|
// {
|
|
// "label": "三河市",
|
|
// "value": "131082"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "桃城区",
|
|
// "value": "131102"
|
|
// },
|
|
// {
|
|
// "label": "冀州区",
|
|
// "value": "131103"
|
|
// },
|
|
// {
|
|
// "label": "枣强县",
|
|
// "value": "131121"
|
|
// },
|
|
// {
|
|
// "label": "武邑县",
|
|
// "value": "131122"
|
|
// },
|
|
// {
|
|
// "label": "武强县",
|
|
// "value": "131123"
|
|
// },
|
|
// {
|
|
// "label": "饶阳县",
|
|
// "value": "131124"
|
|
// },
|
|
// {
|
|
// "label": "安平县",
|
|
// "value": "131125"
|
|
// },
|
|
// {
|
|
// "label": "故城县",
|
|
// "value": "131126"
|
|
// },
|
|
// {
|
|
// "label": "景县",
|
|
// "value": "131127"
|
|
// },
|
|
// {
|
|
// "label": "阜城县",
|
|
// "value": "131128"
|
|
// },
|
|
// {
|
|
// "label": "河北衡水经济开发区",
|
|
// "value": "131171"
|
|
// },
|
|
// {
|
|
// "label": "衡水滨湖新区",
|
|
// "value": "131172"
|
|
// },
|
|
// {
|
|
// "label": "深州市",
|
|
// "value": "131182"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "小店区",
|
|
// "value": "140105"
|
|
// },
|
|
// {
|
|
// "label": "迎泽区",
|
|
// "value": "140106"
|
|
// },
|
|
// {
|
|
// "label": "杏花岭区",
|
|
// "value": "140107"
|
|
// },
|
|
// {
|
|
// "label": "尖草坪区",
|
|
// "value": "140108"
|
|
// },
|
|
// {
|
|
// "label": "万柏林区",
|
|
// "value": "140109"
|
|
// },
|
|
// {
|
|
// "label": "晋源区",
|
|
// "value": "140110"
|
|
// },
|
|
// {
|
|
// "label": "清徐县",
|
|
// "value": "140121"
|
|
// },
|
|
// {
|
|
// "label": "阳曲县",
|
|
// "value": "140122"
|
|
// },
|
|
// {
|
|
// "label": "娄烦县",
|
|
// "value": "140123"
|
|
// },
|
|
// {
|
|
// "label": "山西转型综合改革示范区",
|
|
// "value": "140171"
|
|
// },
|
|
// {
|
|
// "label": "古交市",
|
|
// "value": "140181"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "城区",
|
|
// "value": "140202"
|
|
// },
|
|
// {
|
|
// "label": "矿区",
|
|
// "value": "140203"
|
|
// },
|
|
// {
|
|
// "label": "南郊区",
|
|
// "value": "140211"
|
|
// },
|
|
// {
|
|
// "label": "新荣区",
|
|
// "value": "140212"
|
|
// },
|
|
// {
|
|
// "label": "阳高县",
|
|
// "value": "140221"
|
|
// },
|
|
// {
|
|
// "label": "天镇县",
|
|
// "value": "140222"
|
|
// },
|
|
// {
|
|
// "label": "广灵县",
|
|
// "value": "140223"
|
|
// },
|
|
// {
|
|
// "label": "灵丘县",
|
|
// "value": "140224"
|
|
// },
|
|
// {
|
|
// "label": "浑源县",
|
|
// "value": "140225"
|
|
// },
|
|
// {
|
|
// "label": "左云县",
|
|
// "value": "140226"
|
|
// },
|
|
// {
|
|
// "label": "大同县",
|
|
// "value": "140227"
|
|
// },
|
|
// {
|
|
// "label": "山西大同经济开发区",
|
|
// "value": "140271"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "城区",
|
|
// "value": "140302"
|
|
// },
|
|
// {
|
|
// "label": "矿区",
|
|
// "value": "140303"
|
|
// },
|
|
// {
|
|
// "label": "郊区",
|
|
// "value": "140311"
|
|
// },
|
|
// {
|
|
// "label": "平定县",
|
|
// "value": "140321"
|
|
// },
|
|
// {
|
|
// "label": "盂县",
|
|
// "value": "140322"
|
|
// },
|
|
// {
|
|
// "label": "山西阳泉经济开发区",
|
|
// "value": "140371"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "城区",
|
|
// "value": "140402"
|
|
// },
|
|
// {
|
|
// "label": "郊区",
|
|
// "value": "140411"
|
|
// },
|
|
// {
|
|
// "label": "长治县",
|
|
// "value": "140421"
|
|
// },
|
|
// {
|
|
// "label": "襄垣县",
|
|
// "value": "140423"
|
|
// },
|
|
// {
|
|
// "label": "屯留县",
|
|
// "value": "140424"
|
|
// },
|
|
// {
|
|
// "label": "平顺县",
|
|
// "value": "140425"
|
|
// },
|
|
// {
|
|
// "label": "黎城县",
|
|
// "value": "140426"
|
|
// },
|
|
// {
|
|
// "label": "壶关县",
|
|
// "value": "140427"
|
|
// },
|
|
// {
|
|
// "label": "长子县",
|
|
// "value": "140428"
|
|
// },
|
|
// {
|
|
// "label": "武乡县",
|
|
// "value": "140429"
|
|
// },
|
|
// {
|
|
// "label": "沁县",
|
|
// "value": "140430"
|
|
// },
|
|
// {
|
|
// "label": "沁源县",
|
|
// "value": "140431"
|
|
// },
|
|
// {
|
|
// "label": "山西长治高新技术产业园区",
|
|
// "value": "140471"
|
|
// },
|
|
// {
|
|
// "label": "潞城市",
|
|
// "value": "140481"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "城区",
|
|
// "value": "140502"
|
|
// },
|
|
// {
|
|
// "label": "沁水县",
|
|
// "value": "140521"
|
|
// },
|
|
// {
|
|
// "label": "阳城县",
|
|
// "value": "140522"
|
|
// },
|
|
// {
|
|
// "label": "陵川县",
|
|
// "value": "140524"
|
|
// },
|
|
// {
|
|
// "label": "泽州县",
|
|
// "value": "140525"
|
|
// },
|
|
// {
|
|
// "label": "高平市",
|
|
// "value": "140581"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "朔城区",
|
|
// "value": "140602"
|
|
// },
|
|
// {
|
|
// "label": "平鲁区",
|
|
// "value": "140603"
|
|
// },
|
|
// {
|
|
// "label": "山阴县",
|
|
// "value": "140621"
|
|
// },
|
|
// {
|
|
// "label": "应县",
|
|
// "value": "140622"
|
|
// },
|
|
// {
|
|
// "label": "右玉县",
|
|
// "value": "140623"
|
|
// },
|
|
// {
|
|
// "label": "怀仁县",
|
|
// "value": "140624"
|
|
// },
|
|
// {
|
|
// "label": "山西朔州经济开发区",
|
|
// "value": "140671"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "榆次区",
|
|
// "value": "140702"
|
|
// },
|
|
// {
|
|
// "label": "榆社县",
|
|
// "value": "140721"
|
|
// },
|
|
// {
|
|
// "label": "左权县",
|
|
// "value": "140722"
|
|
// },
|
|
// {
|
|
// "label": "和顺县",
|
|
// "value": "140723"
|
|
// },
|
|
// {
|
|
// "label": "昔阳县",
|
|
// "value": "140724"
|
|
// },
|
|
// {
|
|
// "label": "寿阳县",
|
|
// "value": "140725"
|
|
// },
|
|
// {
|
|
// "label": "太谷县",
|
|
// "value": "140726"
|
|
// },
|
|
// {
|
|
// "label": "祁县",
|
|
// "value": "140727"
|
|
// },
|
|
// {
|
|
// "label": "平遥县",
|
|
// "value": "140728"
|
|
// },
|
|
// {
|
|
// "label": "灵石县",
|
|
// "value": "140729"
|
|
// },
|
|
// {
|
|
// "label": "介休市",
|
|
// "value": "140781"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "盐湖区",
|
|
// "value": "140802"
|
|
// },
|
|
// {
|
|
// "label": "临猗县",
|
|
// "value": "140821"
|
|
// },
|
|
// {
|
|
// "label": "万荣县",
|
|
// "value": "140822"
|
|
// },
|
|
// {
|
|
// "label": "闻喜县",
|
|
// "value": "140823"
|
|
// },
|
|
// {
|
|
// "label": "稷山县",
|
|
// "value": "140824"
|
|
// },
|
|
// {
|
|
// "label": "新绛县",
|
|
// "value": "140825"
|
|
// },
|
|
// {
|
|
// "label": "绛县",
|
|
// "value": "140826"
|
|
// },
|
|
// {
|
|
// "label": "垣曲县",
|
|
// "value": "140827"
|
|
// },
|
|
// {
|
|
// "label": "夏县",
|
|
// "value": "140828"
|
|
// },
|
|
// {
|
|
// "label": "平陆县",
|
|
// "value": "140829"
|
|
// },
|
|
// {
|
|
// "label": "芮城县",
|
|
// "value": "140830"
|
|
// },
|
|
// {
|
|
// "label": "永济市",
|
|
// "value": "140881"
|
|
// },
|
|
// {
|
|
// "label": "河津市",
|
|
// "value": "140882"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "忻府区",
|
|
// "value": "140902"
|
|
// },
|
|
// {
|
|
// "label": "定襄县",
|
|
// "value": "140921"
|
|
// },
|
|
// {
|
|
// "label": "五台县",
|
|
// "value": "140922"
|
|
// },
|
|
// {
|
|
// "label": "代县",
|
|
// "value": "140923"
|
|
// },
|
|
// {
|
|
// "label": "繁峙县",
|
|
// "value": "140924"
|
|
// },
|
|
// {
|
|
// "label": "宁武县",
|
|
// "value": "140925"
|
|
// },
|
|
// {
|
|
// "label": "静乐县",
|
|
// "value": "140926"
|
|
// },
|
|
// {
|
|
// "label": "神池县",
|
|
// "value": "140927"
|
|
// },
|
|
// {
|
|
// "label": "五寨县",
|
|
// "value": "140928"
|
|
// },
|
|
// {
|
|
// "label": "岢岚县",
|
|
// "value": "140929"
|
|
// },
|
|
// {
|
|
// "label": "河曲县",
|
|
// "value": "140930"
|
|
// },
|
|
// {
|
|
// "label": "保德县",
|
|
// "value": "140931"
|
|
// },
|
|
// {
|
|
// "label": "偏关县",
|
|
// "value": "140932"
|
|
// },
|
|
// {
|
|
// "label": "五台山风景名胜区",
|
|
// "value": "140971"
|
|
// },
|
|
// {
|
|
// "label": "原平市",
|
|
// "value": "140981"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "尧都区",
|
|
// "value": "141002"
|
|
// },
|
|
// {
|
|
// "label": "曲沃县",
|
|
// "value": "141021"
|
|
// },
|
|
// {
|
|
// "label": "翼城县",
|
|
// "value": "141022"
|
|
// },
|
|
// {
|
|
// "label": "襄汾县",
|
|
// "value": "141023"
|
|
// },
|
|
// {
|
|
// "label": "洪洞县",
|
|
// "value": "141024"
|
|
// },
|
|
// {
|
|
// "label": "古县",
|
|
// "value": "141025"
|
|
// },
|
|
// {
|
|
// "label": "安泽县",
|
|
// "value": "141026"
|
|
// },
|
|
// {
|
|
// "label": "浮山县",
|
|
// "value": "141027"
|
|
// },
|
|
// {
|
|
// "label": "吉县",
|
|
// "value": "141028"
|
|
// },
|
|
// {
|
|
// "label": "乡宁县",
|
|
// "value": "141029"
|
|
// },
|
|
// {
|
|
// "label": "大宁县",
|
|
// "value": "141030"
|
|
// },
|
|
// {
|
|
// "label": "隰县",
|
|
// "value": "141031"
|
|
// },
|
|
// {
|
|
// "label": "永和县",
|
|
// "value": "141032"
|
|
// },
|
|
// {
|
|
// "label": "蒲县",
|
|
// "value": "141033"
|
|
// },
|
|
// {
|
|
// "label": "汾西县",
|
|
// "value": "141034"
|
|
// },
|
|
// {
|
|
// "label": "侯马市",
|
|
// "value": "141081"
|
|
// },
|
|
// {
|
|
// "label": "霍州市",
|
|
// "value": "141082"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "离石区",
|
|
// "value": "141102"
|
|
// },
|
|
// {
|
|
// "label": "文水县",
|
|
// "value": "141121"
|
|
// },
|
|
// {
|
|
// "label": "交城县",
|
|
// "value": "141122"
|
|
// },
|
|
// {
|
|
// "label": "兴县",
|
|
// "value": "141123"
|
|
// },
|
|
// {
|
|
// "label": "临县",
|
|
// "value": "141124"
|
|
// },
|
|
// {
|
|
// "label": "柳林县",
|
|
// "value": "141125"
|
|
// },
|
|
// {
|
|
// "label": "石楼县",
|
|
// "value": "141126"
|
|
// },
|
|
// {
|
|
// "label": "岚县",
|
|
// "value": "141127"
|
|
// },
|
|
// {
|
|
// "label": "方山县",
|
|
// "value": "141128"
|
|
// },
|
|
// {
|
|
// "label": "中阳县",
|
|
// "value": "141129"
|
|
// },
|
|
// {
|
|
// "label": "交口县",
|
|
// "value": "141130"
|
|
// },
|
|
// {
|
|
// "label": "孝义市",
|
|
// "value": "141181"
|
|
// },
|
|
// {
|
|
// "label": "汾阳市",
|
|
// "value": "141182"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "新城区",
|
|
// "value": "150102"
|
|
// },
|
|
// {
|
|
// "label": "回民区",
|
|
// "value": "150103"
|
|
// },
|
|
// {
|
|
// "label": "玉泉区",
|
|
// "value": "150104"
|
|
// },
|
|
// {
|
|
// "label": "赛罕区",
|
|
// "value": "150105"
|
|
// },
|
|
// {
|
|
// "label": "土默特左旗",
|
|
// "value": "150121"
|
|
// },
|
|
// {
|
|
// "label": "托克托县",
|
|
// "value": "150122"
|
|
// },
|
|
// {
|
|
// "label": "和林格尔县",
|
|
// "value": "150123"
|
|
// },
|
|
// {
|
|
// "label": "清水河县",
|
|
// "value": "150124"
|
|
// },
|
|
// {
|
|
// "label": "武川县",
|
|
// "value": "150125"
|
|
// },
|
|
// {
|
|
// "label": "呼和浩特金海工业园区",
|
|
// "value": "150171"
|
|
// },
|
|
// {
|
|
// "label": "呼和浩特经济技术开发区",
|
|
// "value": "150172"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "东河区",
|
|
// "value": "150202"
|
|
// },
|
|
// {
|
|
// "label": "昆都仑区",
|
|
// "value": "150203"
|
|
// },
|
|
// {
|
|
// "label": "青山区",
|
|
// "value": "150204"
|
|
// },
|
|
// {
|
|
// "label": "石拐区",
|
|
// "value": "150205"
|
|
// },
|
|
// {
|
|
// "label": "白云鄂博矿区",
|
|
// "value": "150206"
|
|
// },
|
|
// {
|
|
// "label": "九原区",
|
|
// "value": "150207"
|
|
// },
|
|
// {
|
|
// "label": "土默特右旗",
|
|
// "value": "150221"
|
|
// },
|
|
// {
|
|
// "label": "固阳县",
|
|
// "value": "150222"
|
|
// },
|
|
// {
|
|
// "label": "达尔罕茂明安联合旗",
|
|
// "value": "150223"
|
|
// },
|
|
// {
|
|
// "label": "包头稀土高新技术产业开发区",
|
|
// "value": "150271"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "海勃湾区",
|
|
// "value": "150302"
|
|
// },
|
|
// {
|
|
// "label": "海南区",
|
|
// "value": "150303"
|
|
// },
|
|
// {
|
|
// "label": "乌达区",
|
|
// "value": "150304"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "红山区",
|
|
// "value": "150402"
|
|
// },
|
|
// {
|
|
// "label": "元宝山区",
|
|
// "value": "150403"
|
|
// },
|
|
// {
|
|
// "label": "松山区",
|
|
// "value": "150404"
|
|
// },
|
|
// {
|
|
// "label": "阿鲁科尔沁旗",
|
|
// "value": "150421"
|
|
// },
|
|
// {
|
|
// "label": "巴林左旗",
|
|
// "value": "150422"
|
|
// },
|
|
// {
|
|
// "label": "巴林右旗",
|
|
// "value": "150423"
|
|
// },
|
|
// {
|
|
// "label": "林西县",
|
|
// "value": "150424"
|
|
// },
|
|
// {
|
|
// "label": "克什克腾旗",
|
|
// "value": "150425"
|
|
// },
|
|
// {
|
|
// "label": "翁牛特旗",
|
|
// "value": "150426"
|
|
// },
|
|
// {
|
|
// "label": "喀喇沁旗",
|
|
// "value": "150428"
|
|
// },
|
|
// {
|
|
// "label": "宁城县",
|
|
// "value": "150429"
|
|
// },
|
|
// {
|
|
// "label": "敖汉旗",
|
|
// "value": "150430"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "科尔沁区",
|
|
// "value": "150502"
|
|
// },
|
|
// {
|
|
// "label": "科尔沁左翼中旗",
|
|
// "value": "150521"
|
|
// },
|
|
// {
|
|
// "label": "科尔沁左翼后旗",
|
|
// "value": "150522"
|
|
// },
|
|
// {
|
|
// "label": "开鲁县",
|
|
// "value": "150523"
|
|
// },
|
|
// {
|
|
// "label": "库伦旗",
|
|
// "value": "150524"
|
|
// },
|
|
// {
|
|
// "label": "奈曼旗",
|
|
// "value": "150525"
|
|
// },
|
|
// {
|
|
// "label": "扎鲁特旗",
|
|
// "value": "150526"
|
|
// },
|
|
// {
|
|
// "label": "通辽经济技术开发区",
|
|
// "value": "150571"
|
|
// },
|
|
// {
|
|
// "label": "霍林郭勒市",
|
|
// "value": "150581"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "东胜区",
|
|
// "value": "150602"
|
|
// },
|
|
// {
|
|
// "label": "康巴什区",
|
|
// "value": "150603"
|
|
// },
|
|
// {
|
|
// "label": "达拉特旗",
|
|
// "value": "150621"
|
|
// },
|
|
// {
|
|
// "label": "准格尔旗",
|
|
// "value": "150622"
|
|
// },
|
|
// {
|
|
// "label": "鄂托克前旗",
|
|
// "value": "150623"
|
|
// },
|
|
// {
|
|
// "label": "鄂托克旗",
|
|
// "value": "150624"
|
|
// },
|
|
// {
|
|
// "label": "杭锦旗",
|
|
// "value": "150625"
|
|
// },
|
|
// {
|
|
// "label": "乌审旗",
|
|
// "value": "150626"
|
|
// },
|
|
// {
|
|
// "label": "伊金霍洛旗",
|
|
// "value": "150627"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "海拉尔区",
|
|
// "value": "150702"
|
|
// },
|
|
// {
|
|
// "label": "扎赉诺尔区",
|
|
// "value": "150703"
|
|
// },
|
|
// {
|
|
// "label": "阿荣旗",
|
|
// "value": "150721"
|
|
// },
|
|
// {
|
|
// "label": "莫力达瓦达斡尔族自治旗",
|
|
// "value": "150722"
|
|
// },
|
|
// {
|
|
// "label": "鄂伦春自治旗",
|
|
// "value": "150723"
|
|
// },
|
|
// {
|
|
// "label": "鄂温克族自治旗",
|
|
// "value": "150724"
|
|
// },
|
|
// {
|
|
// "label": "陈巴尔虎旗",
|
|
// "value": "150725"
|
|
// },
|
|
// {
|
|
// "label": "新巴尔虎左旗",
|
|
// "value": "150726"
|
|
// },
|
|
// {
|
|
// "label": "新巴尔虎右旗",
|
|
// "value": "150727"
|
|
// },
|
|
// {
|
|
// "label": "满洲里市",
|
|
// "value": "150781"
|
|
// },
|
|
// {
|
|
// "label": "牙克石市",
|
|
// "value": "150782"
|
|
// },
|
|
// {
|
|
// "label": "扎兰屯市",
|
|
// "value": "150783"
|
|
// },
|
|
// {
|
|
// "label": "额尔古纳市",
|
|
// "value": "150784"
|
|
// },
|
|
// {
|
|
// "label": "根河市",
|
|
// "value": "150785"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "临河区",
|
|
// "value": "150802"
|
|
// },
|
|
// {
|
|
// "label": "五原县",
|
|
// "value": "150821"
|
|
// },
|
|
// {
|
|
// "label": "磴口县",
|
|
// "value": "150822"
|
|
// },
|
|
// {
|
|
// "label": "乌拉特前旗",
|
|
// "value": "150823"
|
|
// },
|
|
// {
|
|
// "label": "乌拉特中旗",
|
|
// "value": "150824"
|
|
// },
|
|
// {
|
|
// "label": "乌拉特后旗",
|
|
// "value": "150825"
|
|
// },
|
|
// {
|
|
// "label": "杭锦后旗",
|
|
// "value": "150826"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "集宁区",
|
|
// "value": "150902"
|
|
// },
|
|
// {
|
|
// "label": "卓资县",
|
|
// "value": "150921"
|
|
// },
|
|
// {
|
|
// "label": "化德县",
|
|
// "value": "150922"
|
|
// },
|
|
// {
|
|
// "label": "商都县",
|
|
// "value": "150923"
|
|
// },
|
|
// {
|
|
// "label": "兴和县",
|
|
// "value": "150924"
|
|
// },
|
|
// {
|
|
// "label": "凉城县",
|
|
// "value": "150925"
|
|
// },
|
|
// {
|
|
// "label": "察哈尔右翼前旗",
|
|
// "value": "150926"
|
|
// },
|
|
// {
|
|
// "label": "察哈尔右翼中旗",
|
|
// "value": "150927"
|
|
// },
|
|
// {
|
|
// "label": "察哈尔右翼后旗",
|
|
// "value": "150928"
|
|
// },
|
|
// {
|
|
// "label": "四子王旗",
|
|
// "value": "150929"
|
|
// },
|
|
// {
|
|
// "label": "丰镇市",
|
|
// "value": "150981"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "乌兰浩特市",
|
|
// "value": "152201"
|
|
// },
|
|
// {
|
|
// "label": "阿尔山市",
|
|
// "value": "152202"
|
|
// },
|
|
// {
|
|
// "label": "科尔沁右翼前旗",
|
|
// "value": "152221"
|
|
// },
|
|
// {
|
|
// "label": "科尔沁右翼中旗",
|
|
// "value": "152222"
|
|
// },
|
|
// {
|
|
// "label": "扎赉特旗",
|
|
// "value": "152223"
|
|
// },
|
|
// {
|
|
// "label": "突泉县",
|
|
// "value": "152224"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "二连浩特市",
|
|
// "value": "152501"
|
|
// },
|
|
// {
|
|
// "label": "锡林浩特市",
|
|
// "value": "152502"
|
|
// },
|
|
// {
|
|
// "label": "阿巴嘎旗",
|
|
// "value": "152522"
|
|
// },
|
|
// {
|
|
// "label": "苏尼特左旗",
|
|
// "value": "152523"
|
|
// },
|
|
// {
|
|
// "label": "苏尼特右旗",
|
|
// "value": "152524"
|
|
// },
|
|
// {
|
|
// "label": "东乌珠穆沁旗",
|
|
// "value": "152525"
|
|
// },
|
|
// {
|
|
// "label": "西乌珠穆沁旗",
|
|
// "value": "152526"
|
|
// },
|
|
// {
|
|
// "label": "太仆寺旗",
|
|
// "value": "152527"
|
|
// },
|
|
// {
|
|
// "label": "镶黄旗",
|
|
// "value": "152528"
|
|
// },
|
|
// {
|
|
// "label": "正镶白旗",
|
|
// "value": "152529"
|
|
// },
|
|
// {
|
|
// "label": "正蓝旗",
|
|
// "value": "152530"
|
|
// },
|
|
// {
|
|
// "label": "多伦县",
|
|
// "value": "152531"
|
|
// },
|
|
// {
|
|
// "label": "乌拉盖管委会",
|
|
// "value": "152571"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "阿拉善左旗",
|
|
// "value": "152921"
|
|
// },
|
|
// {
|
|
// "label": "阿拉善右旗",
|
|
// "value": "152922"
|
|
// },
|
|
// {
|
|
// "label": "额济纳旗",
|
|
// "value": "152923"
|
|
// },
|
|
// {
|
|
// "label": "内蒙古阿拉善经济开发区",
|
|
// "value": "152971"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "和平区",
|
|
// "value": "210102"
|
|
// },
|
|
// {
|
|
// "label": "沈河区",
|
|
// "value": "210103"
|
|
// },
|
|
// {
|
|
// "label": "大东区",
|
|
// "value": "210104"
|
|
// },
|
|
// {
|
|
// "label": "皇姑区",
|
|
// "value": "210105"
|
|
// },
|
|
// {
|
|
// "label": "铁西区",
|
|
// "value": "210106"
|
|
// },
|
|
// {
|
|
// "label": "苏家屯区",
|
|
// "value": "210111"
|
|
// },
|
|
// {
|
|
// "label": "浑南区",
|
|
// "value": "210112"
|
|
// },
|
|
// {
|
|
// "label": "沈北新区",
|
|
// "value": "210113"
|
|
// },
|
|
// {
|
|
// "label": "于洪区",
|
|
// "value": "210114"
|
|
// },
|
|
// {
|
|
// "label": "辽中区",
|
|
// "value": "210115"
|
|
// },
|
|
// {
|
|
// "label": "康平县",
|
|
// "value": "210123"
|
|
// },
|
|
// {
|
|
// "label": "法库县",
|
|
// "value": "210124"
|
|
// },
|
|
// {
|
|
// "label": "新民市",
|
|
// "value": "210181"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "中山区",
|
|
// "value": "210202"
|
|
// },
|
|
// {
|
|
// "label": "西岗区",
|
|
// "value": "210203"
|
|
// },
|
|
// {
|
|
// "label": "沙河口区",
|
|
// "value": "210204"
|
|
// },
|
|
// {
|
|
// "label": "甘井子区",
|
|
// "value": "210211"
|
|
// },
|
|
// {
|
|
// "label": "旅顺口区",
|
|
// "value": "210212"
|
|
// },
|
|
// {
|
|
// "label": "金州区",
|
|
// "value": "210213"
|
|
// },
|
|
// {
|
|
// "label": "普兰店区",
|
|
// "value": "210214"
|
|
// },
|
|
// {
|
|
// "label": "长海县",
|
|
// "value": "210224"
|
|
// },
|
|
// {
|
|
// "label": "瓦房店市",
|
|
// "value": "210281"
|
|
// },
|
|
// {
|
|
// "label": "庄河市",
|
|
// "value": "210283"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "铁东区",
|
|
// "value": "210302"
|
|
// },
|
|
// {
|
|
// "label": "铁西区",
|
|
// "value": "210303"
|
|
// },
|
|
// {
|
|
// "label": "立山区",
|
|
// "value": "210304"
|
|
// },
|
|
// {
|
|
// "label": "千山区",
|
|
// "value": "210311"
|
|
// },
|
|
// {
|
|
// "label": "台安县",
|
|
// "value": "210321"
|
|
// },
|
|
// {
|
|
// "label": "岫岩满族自治县",
|
|
// "value": "210323"
|
|
// },
|
|
// {
|
|
// "label": "海城市",
|
|
// "value": "210381"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "新抚区",
|
|
// "value": "210402"
|
|
// },
|
|
// {
|
|
// "label": "东洲区",
|
|
// "value": "210403"
|
|
// },
|
|
// {
|
|
// "label": "望花区",
|
|
// "value": "210404"
|
|
// },
|
|
// {
|
|
// "label": "顺城区",
|
|
// "value": "210411"
|
|
// },
|
|
// {
|
|
// "label": "抚顺县",
|
|
// "value": "210421"
|
|
// },
|
|
// {
|
|
// "label": "新宾满族自治县",
|
|
// "value": "210422"
|
|
// },
|
|
// {
|
|
// "label": "清原满族自治县",
|
|
// "value": "210423"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "平山区",
|
|
// "value": "210502"
|
|
// },
|
|
// {
|
|
// "label": "溪湖区",
|
|
// "value": "210503"
|
|
// },
|
|
// {
|
|
// "label": "明山区",
|
|
// "value": "210504"
|
|
// },
|
|
// {
|
|
// "label": "南芬区",
|
|
// "value": "210505"
|
|
// },
|
|
// {
|
|
// "label": "本溪满族自治县",
|
|
// "value": "210521"
|
|
// },
|
|
// {
|
|
// "label": "桓仁满族自治县",
|
|
// "value": "210522"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "元宝区",
|
|
// "value": "210602"
|
|
// },
|
|
// {
|
|
// "label": "振兴区",
|
|
// "value": "210603"
|
|
// },
|
|
// {
|
|
// "label": "振安区",
|
|
// "value": "210604"
|
|
// },
|
|
// {
|
|
// "label": "宽甸满族自治县",
|
|
// "value": "210624"
|
|
// },
|
|
// {
|
|
// "label": "东港市",
|
|
// "value": "210681"
|
|
// },
|
|
// {
|
|
// "label": "凤城市",
|
|
// "value": "210682"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "古塔区",
|
|
// "value": "210702"
|
|
// },
|
|
// {
|
|
// "label": "凌河区",
|
|
// "value": "210703"
|
|
// },
|
|
// {
|
|
// "label": "太和区",
|
|
// "value": "210711"
|
|
// },
|
|
// {
|
|
// "label": "黑山县",
|
|
// "value": "210726"
|
|
// },
|
|
// {
|
|
// "label": "义县",
|
|
// "value": "210727"
|
|
// },
|
|
// {
|
|
// "label": "凌海市",
|
|
// "value": "210781"
|
|
// },
|
|
// {
|
|
// "label": "北镇市",
|
|
// "value": "210782"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "站前区",
|
|
// "value": "210802"
|
|
// },
|
|
// {
|
|
// "label": "西市区",
|
|
// "value": "210803"
|
|
// },
|
|
// {
|
|
// "label": "鲅鱼圈区",
|
|
// "value": "210804"
|
|
// },
|
|
// {
|
|
// "label": "老边区",
|
|
// "value": "210811"
|
|
// },
|
|
// {
|
|
// "label": "盖州市",
|
|
// "value": "210881"
|
|
// },
|
|
// {
|
|
// "label": "大石桥市",
|
|
// "value": "210882"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "海州区",
|
|
// "value": "210902"
|
|
// },
|
|
// {
|
|
// "label": "新邱区",
|
|
// "value": "210903"
|
|
// },
|
|
// {
|
|
// "label": "太平区",
|
|
// "value": "210904"
|
|
// },
|
|
// {
|
|
// "label": "清河门区",
|
|
// "value": "210905"
|
|
// },
|
|
// {
|
|
// "label": "细河区",
|
|
// "value": "210911"
|
|
// },
|
|
// {
|
|
// "label": "阜新蒙古族自治县",
|
|
// "value": "210921"
|
|
// },
|
|
// {
|
|
// "label": "彰武县",
|
|
// "value": "210922"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "白塔区",
|
|
// "value": "211002"
|
|
// },
|
|
// {
|
|
// "label": "文圣区",
|
|
// "value": "211003"
|
|
// },
|
|
// {
|
|
// "label": "宏伟区",
|
|
// "value": "211004"
|
|
// },
|
|
// {
|
|
// "label": "弓长岭区",
|
|
// "value": "211005"
|
|
// },
|
|
// {
|
|
// "label": "太子河区",
|
|
// "value": "211011"
|
|
// },
|
|
// {
|
|
// "label": "辽阳县",
|
|
// "value": "211021"
|
|
// },
|
|
// {
|
|
// "label": "灯塔市",
|
|
// "value": "211081"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "双台子区",
|
|
// "value": "211102"
|
|
// },
|
|
// {
|
|
// "label": "兴隆台区",
|
|
// "value": "211103"
|
|
// },
|
|
// {
|
|
// "label": "大洼区",
|
|
// "value": "211104"
|
|
// },
|
|
// {
|
|
// "label": "盘山县",
|
|
// "value": "211122"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "银州区",
|
|
// "value": "211202"
|
|
// },
|
|
// {
|
|
// "label": "清河区",
|
|
// "value": "211204"
|
|
// },
|
|
// {
|
|
// "label": "铁岭县",
|
|
// "value": "211221"
|
|
// },
|
|
// {
|
|
// "label": "西丰县",
|
|
// "value": "211223"
|
|
// },
|
|
// {
|
|
// "label": "昌图县",
|
|
// "value": "211224"
|
|
// },
|
|
// {
|
|
// "label": "调兵山市",
|
|
// "value": "211281"
|
|
// },
|
|
// {
|
|
// "label": "开原市",
|
|
// "value": "211282"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "双塔区",
|
|
// "value": "211302"
|
|
// },
|
|
// {
|
|
// "label": "龙城区",
|
|
// "value": "211303"
|
|
// },
|
|
// {
|
|
// "label": "朝阳县",
|
|
// "value": "211321"
|
|
// },
|
|
// {
|
|
// "label": "建平县",
|
|
// "value": "211322"
|
|
// },
|
|
// {
|
|
// "label": "喀喇沁左翼蒙古族自治县",
|
|
// "value": "211324"
|
|
// },
|
|
// {
|
|
// "label": "北票市",
|
|
// "value": "211381"
|
|
// },
|
|
// {
|
|
// "label": "凌源市",
|
|
// "value": "211382"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "连山区",
|
|
// "value": "211402"
|
|
// },
|
|
// {
|
|
// "label": "龙港区",
|
|
// "value": "211403"
|
|
// },
|
|
// {
|
|
// "label": "南票区",
|
|
// "value": "211404"
|
|
// },
|
|
// {
|
|
// "label": "绥中县",
|
|
// "value": "211421"
|
|
// },
|
|
// {
|
|
// "label": "建昌县",
|
|
// "value": "211422"
|
|
// },
|
|
// {
|
|
// "label": "兴城市",
|
|
// "value": "211481"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "南关区",
|
|
// "value": "220102"
|
|
// },
|
|
// {
|
|
// "label": "宽城区",
|
|
// "value": "220103"
|
|
// },
|
|
// {
|
|
// "label": "朝阳区",
|
|
// "value": "220104"
|
|
// },
|
|
// {
|
|
// "label": "二道区",
|
|
// "value": "220105"
|
|
// },
|
|
// {
|
|
// "label": "绿园区",
|
|
// "value": "220106"
|
|
// },
|
|
// {
|
|
// "label": "双阳区",
|
|
// "value": "220112"
|
|
// },
|
|
// {
|
|
// "label": "九台区",
|
|
// "value": "220113"
|
|
// },
|
|
// {
|
|
// "label": "农安县",
|
|
// "value": "220122"
|
|
// },
|
|
// {
|
|
// "label": "长春经济技术开发区",
|
|
// "value": "220171"
|
|
// },
|
|
// {
|
|
// "label": "长春净月高新技术产业开发区",
|
|
// "value": "220172"
|
|
// },
|
|
// {
|
|
// "label": "长春高新技术产业开发区",
|
|
// "value": "220173"
|
|
// },
|
|
// {
|
|
// "label": "长春汽车经济技术开发区",
|
|
// "value": "220174"
|
|
// },
|
|
// {
|
|
// "label": "榆树市",
|
|
// "value": "220182"
|
|
// },
|
|
// {
|
|
// "label": "德惠市",
|
|
// "value": "220183"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "昌邑区",
|
|
// "value": "220202"
|
|
// },
|
|
// {
|
|
// "label": "龙潭区",
|
|
// "value": "220203"
|
|
// },
|
|
// {
|
|
// "label": "船营区",
|
|
// "value": "220204"
|
|
// },
|
|
// {
|
|
// "label": "丰满区",
|
|
// "value": "220211"
|
|
// },
|
|
// {
|
|
// "label": "永吉县",
|
|
// "value": "220221"
|
|
// },
|
|
// {
|
|
// "label": "吉林经济开发区",
|
|
// "value": "220271"
|
|
// },
|
|
// {
|
|
// "label": "吉林高新技术产业开发区",
|
|
// "value": "220272"
|
|
// },
|
|
// {
|
|
// "label": "吉林中国新加坡食品区",
|
|
// "value": "220273"
|
|
// },
|
|
// {
|
|
// "label": "蛟河市",
|
|
// "value": "220281"
|
|
// },
|
|
// {
|
|
// "label": "桦甸市",
|
|
// "value": "220282"
|
|
// },
|
|
// {
|
|
// "label": "舒兰市",
|
|
// "value": "220283"
|
|
// },
|
|
// {
|
|
// "label": "磐石市",
|
|
// "value": "220284"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "铁西区",
|
|
// "value": "220302"
|
|
// },
|
|
// {
|
|
// "label": "铁东区",
|
|
// "value": "220303"
|
|
// },
|
|
// {
|
|
// "label": "梨树县",
|
|
// "value": "220322"
|
|
// },
|
|
// {
|
|
// "label": "伊通满族自治县",
|
|
// "value": "220323"
|
|
// },
|
|
// {
|
|
// "label": "公主岭市",
|
|
// "value": "220381"
|
|
// },
|
|
// {
|
|
// "label": "双辽市",
|
|
// "value": "220382"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "龙山区",
|
|
// "value": "220402"
|
|
// },
|
|
// {
|
|
// "label": "西安区",
|
|
// "value": "220403"
|
|
// },
|
|
// {
|
|
// "label": "东丰县",
|
|
// "value": "220421"
|
|
// },
|
|
// {
|
|
// "label": "东辽县",
|
|
// "value": "220422"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "东昌区",
|
|
// "value": "220502"
|
|
// },
|
|
// {
|
|
// "label": "二道江区",
|
|
// "value": "220503"
|
|
// },
|
|
// {
|
|
// "label": "通化县",
|
|
// "value": "220521"
|
|
// },
|
|
// {
|
|
// "label": "辉南县",
|
|
// "value": "220523"
|
|
// },
|
|
// {
|
|
// "label": "柳河县",
|
|
// "value": "220524"
|
|
// },
|
|
// {
|
|
// "label": "梅河口市",
|
|
// "value": "220581"
|
|
// },
|
|
// {
|
|
// "label": "集安市",
|
|
// "value": "220582"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "浑江区",
|
|
// "value": "220602"
|
|
// },
|
|
// {
|
|
// "label": "江源区",
|
|
// "value": "220605"
|
|
// },
|
|
// {
|
|
// "label": "抚松县",
|
|
// "value": "220621"
|
|
// },
|
|
// {
|
|
// "label": "靖宇县",
|
|
// "value": "220622"
|
|
// },
|
|
// {
|
|
// "label": "长白朝鲜族自治县",
|
|
// "value": "220623"
|
|
// },
|
|
// {
|
|
// "label": "临江市",
|
|
// "value": "220681"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "宁江区",
|
|
// "value": "220702"
|
|
// },
|
|
// {
|
|
// "label": "前郭尔罗斯蒙古族自治县",
|
|
// "value": "220721"
|
|
// },
|
|
// {
|
|
// "label": "长岭县",
|
|
// "value": "220722"
|
|
// },
|
|
// {
|
|
// "label": "乾安县",
|
|
// "value": "220723"
|
|
// },
|
|
// {
|
|
// "label": "吉林松原经济开发区",
|
|
// "value": "220771"
|
|
// },
|
|
// {
|
|
// "label": "扶余市",
|
|
// "value": "220781"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "洮北区",
|
|
// "value": "220802"
|
|
// },
|
|
// {
|
|
// "label": "镇赉县",
|
|
// "value": "220821"
|
|
// },
|
|
// {
|
|
// "label": "通榆县",
|
|
// "value": "220822"
|
|
// },
|
|
// {
|
|
// "label": "吉林白城经济开发区",
|
|
// "value": "220871"
|
|
// },
|
|
// {
|
|
// "label": "洮南市",
|
|
// "value": "220881"
|
|
// },
|
|
// {
|
|
// "label": "大安市",
|
|
// "value": "220882"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "延吉市",
|
|
// "value": "222401"
|
|
// },
|
|
// {
|
|
// "label": "图们市",
|
|
// "value": "222402"
|
|
// },
|
|
// {
|
|
// "label": "敦化市",
|
|
// "value": "222403"
|
|
// },
|
|
// {
|
|
// "label": "珲春市",
|
|
// "value": "222404"
|
|
// },
|
|
// {
|
|
// "label": "龙井市",
|
|
// "value": "222405"
|
|
// },
|
|
// {
|
|
// "label": "和龙市",
|
|
// "value": "222406"
|
|
// },
|
|
// {
|
|
// "label": "汪清县",
|
|
// "value": "222424"
|
|
// },
|
|
// {
|
|
// "label": "安图县",
|
|
// "value": "222426"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "道里区",
|
|
// "value": "230102"
|
|
// },
|
|
// {
|
|
// "label": "南岗区",
|
|
// "value": "230103"
|
|
// },
|
|
// {
|
|
// "label": "道外区",
|
|
// "value": "230104"
|
|
// },
|
|
// {
|
|
// "label": "平房区",
|
|
// "value": "230108"
|
|
// },
|
|
// {
|
|
// "label": "松北区",
|
|
// "value": "230109"
|
|
// },
|
|
// {
|
|
// "label": "香坊区",
|
|
// "value": "230110"
|
|
// },
|
|
// {
|
|
// "label": "呼兰区",
|
|
// "value": "230111"
|
|
// },
|
|
// {
|
|
// "label": "阿城区",
|
|
// "value": "230112"
|
|
// },
|
|
// {
|
|
// "label": "双城区",
|
|
// "value": "230113"
|
|
// },
|
|
// {
|
|
// "label": "依兰县",
|
|
// "value": "230123"
|
|
// },
|
|
// {
|
|
// "label": "方正县",
|
|
// "value": "230124"
|
|
// },
|
|
// {
|
|
// "label": "宾县",
|
|
// "value": "230125"
|
|
// },
|
|
// {
|
|
// "label": "巴彦县",
|
|
// "value": "230126"
|
|
// },
|
|
// {
|
|
// "label": "木兰县",
|
|
// "value": "230127"
|
|
// },
|
|
// {
|
|
// "label": "通河县",
|
|
// "value": "230128"
|
|
// },
|
|
// {
|
|
// "label": "延寿县",
|
|
// "value": "230129"
|
|
// },
|
|
// {
|
|
// "label": "尚志市",
|
|
// "value": "230183"
|
|
// },
|
|
// {
|
|
// "label": "五常市",
|
|
// "value": "230184"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "龙沙区",
|
|
// "value": "230202"
|
|
// },
|
|
// {
|
|
// "label": "建华区",
|
|
// "value": "230203"
|
|
// },
|
|
// {
|
|
// "label": "铁锋区",
|
|
// "value": "230204"
|
|
// },
|
|
// {
|
|
// "label": "昂昂溪区",
|
|
// "value": "230205"
|
|
// },
|
|
// {
|
|
// "label": "富拉尔基区",
|
|
// "value": "230206"
|
|
// },
|
|
// {
|
|
// "label": "碾子山区",
|
|
// "value": "230207"
|
|
// },
|
|
// {
|
|
// "label": "梅里斯达斡尔族区",
|
|
// "value": "230208"
|
|
// },
|
|
// {
|
|
// "label": "龙江县",
|
|
// "value": "230221"
|
|
// },
|
|
// {
|
|
// "label": "依安县",
|
|
// "value": "230223"
|
|
// },
|
|
// {
|
|
// "label": "泰来县",
|
|
// "value": "230224"
|
|
// },
|
|
// {
|
|
// "label": "甘南县",
|
|
// "value": "230225"
|
|
// },
|
|
// {
|
|
// "label": "富裕县",
|
|
// "value": "230227"
|
|
// },
|
|
// {
|
|
// "label": "克山县",
|
|
// "value": "230229"
|
|
// },
|
|
// {
|
|
// "label": "克东县",
|
|
// "value": "230230"
|
|
// },
|
|
// {
|
|
// "label": "拜泉县",
|
|
// "value": "230231"
|
|
// },
|
|
// {
|
|
// "label": "讷河市",
|
|
// "value": "230281"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "鸡冠区",
|
|
// "value": "230302"
|
|
// },
|
|
// {
|
|
// "label": "恒山区",
|
|
// "value": "230303"
|
|
// },
|
|
// {
|
|
// "label": "滴道区",
|
|
// "value": "230304"
|
|
// },
|
|
// {
|
|
// "label": "梨树区",
|
|
// "value": "230305"
|
|
// },
|
|
// {
|
|
// "label": "城子河区",
|
|
// "value": "230306"
|
|
// },
|
|
// {
|
|
// "label": "麻山区",
|
|
// "value": "230307"
|
|
// },
|
|
// {
|
|
// "label": "鸡东县",
|
|
// "value": "230321"
|
|
// },
|
|
// {
|
|
// "label": "虎林市",
|
|
// "value": "230381"
|
|
// },
|
|
// {
|
|
// "label": "密山市",
|
|
// "value": "230382"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "向阳区",
|
|
// "value": "230402"
|
|
// },
|
|
// {
|
|
// "label": "工农区",
|
|
// "value": "230403"
|
|
// },
|
|
// {
|
|
// "label": "南山区",
|
|
// "value": "230404"
|
|
// },
|
|
// {
|
|
// "label": "兴安区",
|
|
// "value": "230405"
|
|
// },
|
|
// {
|
|
// "label": "东山区",
|
|
// "value": "230406"
|
|
// },
|
|
// {
|
|
// "label": "兴山区",
|
|
// "value": "230407"
|
|
// },
|
|
// {
|
|
// "label": "萝北县",
|
|
// "value": "230421"
|
|
// },
|
|
// {
|
|
// "label": "绥滨县",
|
|
// "value": "230422"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "尖山区",
|
|
// "value": "230502"
|
|
// },
|
|
// {
|
|
// "label": "岭东区",
|
|
// "value": "230503"
|
|
// },
|
|
// {
|
|
// "label": "四方台区",
|
|
// "value": "230505"
|
|
// },
|
|
// {
|
|
// "label": "宝山区",
|
|
// "value": "230506"
|
|
// },
|
|
// {
|
|
// "label": "集贤县",
|
|
// "value": "230521"
|
|
// },
|
|
// {
|
|
// "label": "友谊县",
|
|
// "value": "230522"
|
|
// },
|
|
// {
|
|
// "label": "宝清县",
|
|
// "value": "230523"
|
|
// },
|
|
// {
|
|
// "label": "饶河县",
|
|
// "value": "230524"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "萨尔图区",
|
|
// "value": "230602"
|
|
// },
|
|
// {
|
|
// "label": "龙凤区",
|
|
// "value": "230603"
|
|
// },
|
|
// {
|
|
// "label": "让胡路区",
|
|
// "value": "230604"
|
|
// },
|
|
// {
|
|
// "label": "红岗区",
|
|
// "value": "230605"
|
|
// },
|
|
// {
|
|
// "label": "大同区",
|
|
// "value": "230606"
|
|
// },
|
|
// {
|
|
// "label": "肇州县",
|
|
// "value": "230621"
|
|
// },
|
|
// {
|
|
// "label": "肇源县",
|
|
// "value": "230622"
|
|
// },
|
|
// {
|
|
// "label": "林甸县",
|
|
// "value": "230623"
|
|
// },
|
|
// {
|
|
// "label": "杜尔伯特蒙古族自治县",
|
|
// "value": "230624"
|
|
// },
|
|
// {
|
|
// "label": "大庆高新技术产业开发区",
|
|
// "value": "230671"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "伊春区",
|
|
// "value": "230702"
|
|
// },
|
|
// {
|
|
// "label": "南岔区",
|
|
// "value": "230703"
|
|
// },
|
|
// {
|
|
// "label": "友好区",
|
|
// "value": "230704"
|
|
// },
|
|
// {
|
|
// "label": "西林区",
|
|
// "value": "230705"
|
|
// },
|
|
// {
|
|
// "label": "翠峦区",
|
|
// "value": "230706"
|
|
// },
|
|
// {
|
|
// "label": "新青区",
|
|
// "value": "230707"
|
|
// },
|
|
// {
|
|
// "label": "美溪区",
|
|
// "value": "230708"
|
|
// },
|
|
// {
|
|
// "label": "金山屯区",
|
|
// "value": "230709"
|
|
// },
|
|
// {
|
|
// "label": "五营区",
|
|
// "value": "230710"
|
|
// },
|
|
// {
|
|
// "label": "乌马河区",
|
|
// "value": "230711"
|
|
// },
|
|
// {
|
|
// "label": "汤旺河区",
|
|
// "value": "230712"
|
|
// },
|
|
// {
|
|
// "label": "带岭区",
|
|
// "value": "230713"
|
|
// },
|
|
// {
|
|
// "label": "乌伊岭区",
|
|
// "value": "230714"
|
|
// },
|
|
// {
|
|
// "label": "红星区",
|
|
// "value": "230715"
|
|
// },
|
|
// {
|
|
// "label": "上甘岭区",
|
|
// "value": "230716"
|
|
// },
|
|
// {
|
|
// "label": "嘉荫县",
|
|
// "value": "230722"
|
|
// },
|
|
// {
|
|
// "label": "铁力市",
|
|
// "value": "230781"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "向阳区",
|
|
// "value": "230803"
|
|
// },
|
|
// {
|
|
// "label": "前进区",
|
|
// "value": "230804"
|
|
// },
|
|
// {
|
|
// "label": "东风区",
|
|
// "value": "230805"
|
|
// },
|
|
// {
|
|
// "label": "郊区",
|
|
// "value": "230811"
|
|
// },
|
|
// {
|
|
// "label": "桦南县",
|
|
// "value": "230822"
|
|
// },
|
|
// {
|
|
// "label": "桦川县",
|
|
// "value": "230826"
|
|
// },
|
|
// {
|
|
// "label": "汤原县",
|
|
// "value": "230828"
|
|
// },
|
|
// {
|
|
// "label": "同江市",
|
|
// "value": "230881"
|
|
// },
|
|
// {
|
|
// "label": "富锦市",
|
|
// "value": "230882"
|
|
// },
|
|
// {
|
|
// "label": "抚远市",
|
|
// "value": "230883"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "新兴区",
|
|
// "value": "230902"
|
|
// },
|
|
// {
|
|
// "label": "桃山区",
|
|
// "value": "230903"
|
|
// },
|
|
// {
|
|
// "label": "茄子河区",
|
|
// "value": "230904"
|
|
// },
|
|
// {
|
|
// "label": "勃利县",
|
|
// "value": "230921"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "东安区",
|
|
// "value": "231002"
|
|
// },
|
|
// {
|
|
// "label": "阳明区",
|
|
// "value": "231003"
|
|
// },
|
|
// {
|
|
// "label": "爱民区",
|
|
// "value": "231004"
|
|
// },
|
|
// {
|
|
// "label": "西安区",
|
|
// "value": "231005"
|
|
// },
|
|
// {
|
|
// "label": "林口县",
|
|
// "value": "231025"
|
|
// },
|
|
// {
|
|
// "label": "牡丹江经济技术开发区",
|
|
// "value": "231071"
|
|
// },
|
|
// {
|
|
// "label": "绥芬河市",
|
|
// "value": "231081"
|
|
// },
|
|
// {
|
|
// "label": "海林市",
|
|
// "value": "231083"
|
|
// },
|
|
// {
|
|
// "label": "宁安市",
|
|
// "value": "231084"
|
|
// },
|
|
// {
|
|
// "label": "穆棱市",
|
|
// "value": "231085"
|
|
// },
|
|
// {
|
|
// "label": "东宁市",
|
|
// "value": "231086"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "爱辉区",
|
|
// "value": "231102"
|
|
// },
|
|
// {
|
|
// "label": "嫩江县",
|
|
// "value": "231121"
|
|
// },
|
|
// {
|
|
// "label": "逊克县",
|
|
// "value": "231123"
|
|
// },
|
|
// {
|
|
// "label": "孙吴县",
|
|
// "value": "231124"
|
|
// },
|
|
// {
|
|
// "label": "北安市",
|
|
// "value": "231181"
|
|
// },
|
|
// {
|
|
// "label": "五大连池市",
|
|
// "value": "231182"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "北林区",
|
|
// "value": "231202"
|
|
// },
|
|
// {
|
|
// "label": "望奎县",
|
|
// "value": "231221"
|
|
// },
|
|
// {
|
|
// "label": "兰西县",
|
|
// "value": "231222"
|
|
// },
|
|
// {
|
|
// "label": "青冈县",
|
|
// "value": "231223"
|
|
// },
|
|
// {
|
|
// "label": "庆安县",
|
|
// "value": "231224"
|
|
// },
|
|
// {
|
|
// "label": "明水县",
|
|
// "value": "231225"
|
|
// },
|
|
// {
|
|
// "label": "绥棱县",
|
|
// "value": "231226"
|
|
// },
|
|
// {
|
|
// "label": "安达市",
|
|
// "value": "231281"
|
|
// },
|
|
// {
|
|
// "label": "肇东市",
|
|
// "value": "231282"
|
|
// },
|
|
// {
|
|
// "label": "海伦市",
|
|
// "value": "231283"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "加格达奇区",
|
|
// "value": "232701"
|
|
// },
|
|
// {
|
|
// "label": "松岭区",
|
|
// "value": "232702"
|
|
// },
|
|
// {
|
|
// "label": "新林区",
|
|
// "value": "232703"
|
|
// },
|
|
// {
|
|
// "label": "呼中区",
|
|
// "value": "232704"
|
|
// },
|
|
// {
|
|
// "label": "呼玛县",
|
|
// "value": "232721"
|
|
// },
|
|
// {
|
|
// "label": "塔河县",
|
|
// "value": "232722"
|
|
// },
|
|
// {
|
|
// "label": "漠河县",
|
|
// "value": "232723"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "黄浦区",
|
|
// "value": "310101"
|
|
// },
|
|
// {
|
|
// "label": "徐汇区",
|
|
// "value": "310104"
|
|
// },
|
|
// {
|
|
// "label": "长宁区",
|
|
// "value": "310105"
|
|
// },
|
|
// {
|
|
// "label": "静安区",
|
|
// "value": "310106"
|
|
// },
|
|
// {
|
|
// "label": "普陀区",
|
|
// "value": "310107"
|
|
// },
|
|
// {
|
|
// "label": "虹口区",
|
|
// "value": "310109"
|
|
// },
|
|
// {
|
|
// "label": "杨浦区",
|
|
// "value": "310110"
|
|
// },
|
|
// {
|
|
// "label": "闵行区",
|
|
// "value": "310112"
|
|
// },
|
|
// {
|
|
// "label": "宝山区",
|
|
// "value": "310113"
|
|
// },
|
|
// {
|
|
// "label": "嘉定区",
|
|
// "value": "310114"
|
|
// },
|
|
// {
|
|
// "label": "浦东新区",
|
|
// "value": "310115"
|
|
// },
|
|
// {
|
|
// "label": "金山区",
|
|
// "value": "310116"
|
|
// },
|
|
// {
|
|
// "label": "松江区",
|
|
// "value": "310117"
|
|
// },
|
|
// {
|
|
// "label": "青浦区",
|
|
// "value": "310118"
|
|
// },
|
|
// {
|
|
// "label": "奉贤区",
|
|
// "value": "310120"
|
|
// },
|
|
// {
|
|
// "label": "崇明区",
|
|
// "value": "310151"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "玄武区",
|
|
// "value": "320102"
|
|
// },
|
|
// {
|
|
// "label": "秦淮区",
|
|
// "value": "320104"
|
|
// },
|
|
// {
|
|
// "label": "建邺区",
|
|
// "value": "320105"
|
|
// },
|
|
// {
|
|
// "label": "鼓楼区",
|
|
// "value": "320106"
|
|
// },
|
|
// {
|
|
// "label": "浦口区",
|
|
// "value": "320111"
|
|
// },
|
|
// {
|
|
// "label": "栖霞区",
|
|
// "value": "320113"
|
|
// },
|
|
// {
|
|
// "label": "雨花台区",
|
|
// "value": "320114"
|
|
// },
|
|
// {
|
|
// "label": "江宁区",
|
|
// "value": "320115"
|
|
// },
|
|
// {
|
|
// "label": "六合区",
|
|
// "value": "320116"
|
|
// },
|
|
// {
|
|
// "label": "溧水区",
|
|
// "value": "320117"
|
|
// },
|
|
// {
|
|
// "label": "高淳区",
|
|
// "value": "320118"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "锡山区",
|
|
// "value": "320205"
|
|
// },
|
|
// {
|
|
// "label": "惠山区",
|
|
// "value": "320206"
|
|
// },
|
|
// {
|
|
// "label": "滨湖区",
|
|
// "value": "320211"
|
|
// },
|
|
// {
|
|
// "label": "梁溪区",
|
|
// "value": "320213"
|
|
// },
|
|
// {
|
|
// "label": "新吴区",
|
|
// "value": "320214"
|
|
// },
|
|
// {
|
|
// "label": "江阴市",
|
|
// "value": "320281"
|
|
// },
|
|
// {
|
|
// "label": "宜兴市",
|
|
// "value": "320282"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "鼓楼区",
|
|
// "value": "320302"
|
|
// },
|
|
// {
|
|
// "label": "云龙区",
|
|
// "value": "320303"
|
|
// },
|
|
// {
|
|
// "label": "贾汪区",
|
|
// "value": "320305"
|
|
// },
|
|
// {
|
|
// "label": "泉山区",
|
|
// "value": "320311"
|
|
// },
|
|
// {
|
|
// "label": "铜山区",
|
|
// "value": "320312"
|
|
// },
|
|
// {
|
|
// "label": "丰县",
|
|
// "value": "320321"
|
|
// },
|
|
// {
|
|
// "label": "沛县",
|
|
// "value": "320322"
|
|
// },
|
|
// {
|
|
// "label": "睢宁县",
|
|
// "value": "320324"
|
|
// },
|
|
// {
|
|
// "label": "徐州经济技术开发区",
|
|
// "value": "320371"
|
|
// },
|
|
// {
|
|
// "label": "新沂市",
|
|
// "value": "320381"
|
|
// },
|
|
// {
|
|
// "label": "邳州市",
|
|
// "value": "320382"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "天宁区",
|
|
// "value": "320402"
|
|
// },
|
|
// {
|
|
// "label": "钟楼区",
|
|
// "value": "320404"
|
|
// },
|
|
// {
|
|
// "label": "新北区",
|
|
// "value": "320411"
|
|
// },
|
|
// {
|
|
// "label": "武进区",
|
|
// "value": "320412"
|
|
// },
|
|
// {
|
|
// "label": "金坛区",
|
|
// "value": "320413"
|
|
// },
|
|
// {
|
|
// "label": "溧阳市",
|
|
// "value": "320481"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "虎丘区",
|
|
// "value": "320505"
|
|
// },
|
|
// {
|
|
// "label": "吴中区",
|
|
// "value": "320506"
|
|
// },
|
|
// {
|
|
// "label": "相城区",
|
|
// "value": "320507"
|
|
// },
|
|
// {
|
|
// "label": "姑苏区",
|
|
// "value": "320508"
|
|
// },
|
|
// {
|
|
// "label": "吴江区",
|
|
// "value": "320509"
|
|
// },
|
|
// {
|
|
// "label": "苏州工业园区",
|
|
// "value": "320571"
|
|
// },
|
|
// {
|
|
// "label": "常熟市",
|
|
// "value": "320581"
|
|
// },
|
|
// {
|
|
// "label": "张家港市",
|
|
// "value": "320582"
|
|
// },
|
|
// {
|
|
// "label": "昆山市",
|
|
// "value": "320583"
|
|
// },
|
|
// {
|
|
// "label": "太仓市",
|
|
// "value": "320585"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "崇川区",
|
|
// "value": "320602"
|
|
// },
|
|
// {
|
|
// "label": "港闸区",
|
|
// "value": "320611"
|
|
// },
|
|
// {
|
|
// "label": "通州区",
|
|
// "value": "320612"
|
|
// },
|
|
// {
|
|
// "label": "海安县",
|
|
// "value": "320621"
|
|
// },
|
|
// {
|
|
// "label": "如东县",
|
|
// "value": "320623"
|
|
// },
|
|
// {
|
|
// "label": "南通经济技术开发区",
|
|
// "value": "320671"
|
|
// },
|
|
// {
|
|
// "label": "启东市",
|
|
// "value": "320681"
|
|
// },
|
|
// {
|
|
// "label": "如皋市",
|
|
// "value": "320682"
|
|
// },
|
|
// {
|
|
// "label": "海门市",
|
|
// "value": "320684"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "连云区",
|
|
// "value": "320703"
|
|
// },
|
|
// {
|
|
// "label": "海州区",
|
|
// "value": "320706"
|
|
// },
|
|
// {
|
|
// "label": "赣榆区",
|
|
// "value": "320707"
|
|
// },
|
|
// {
|
|
// "label": "东海县",
|
|
// "value": "320722"
|
|
// },
|
|
// {
|
|
// "label": "灌云县",
|
|
// "value": "320723"
|
|
// },
|
|
// {
|
|
// "label": "灌南县",
|
|
// "value": "320724"
|
|
// },
|
|
// {
|
|
// "label": "连云港经济技术开发区",
|
|
// "value": "320771"
|
|
// },
|
|
// {
|
|
// "label": "连云港高新技术产业开发区",
|
|
// "value": "320772"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "淮安区",
|
|
// "value": "320803"
|
|
// },
|
|
// {
|
|
// "label": "淮阴区",
|
|
// "value": "320804"
|
|
// },
|
|
// {
|
|
// "label": "清江浦区",
|
|
// "value": "320812"
|
|
// },
|
|
// {
|
|
// "label": "洪泽区",
|
|
// "value": "320813"
|
|
// },
|
|
// {
|
|
// "label": "涟水县",
|
|
// "value": "320826"
|
|
// },
|
|
// {
|
|
// "label": "盱眙县",
|
|
// "value": "320830"
|
|
// },
|
|
// {
|
|
// "label": "金湖县",
|
|
// "value": "320831"
|
|
// },
|
|
// {
|
|
// "label": "淮安经济技术开发区",
|
|
// "value": "320871"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "亭湖区",
|
|
// "value": "320902"
|
|
// },
|
|
// {
|
|
// "label": "盐都区",
|
|
// "value": "320903"
|
|
// },
|
|
// {
|
|
// "label": "大丰区",
|
|
// "value": "320904"
|
|
// },
|
|
// {
|
|
// "label": "响水县",
|
|
// "value": "320921"
|
|
// },
|
|
// {
|
|
// "label": "滨海县",
|
|
// "value": "320922"
|
|
// },
|
|
// {
|
|
// "label": "阜宁县",
|
|
// "value": "320923"
|
|
// },
|
|
// {
|
|
// "label": "射阳县",
|
|
// "value": "320924"
|
|
// },
|
|
// {
|
|
// "label": "建湖县",
|
|
// "value": "320925"
|
|
// },
|
|
// {
|
|
// "label": "盐城经济技术开发区",
|
|
// "value": "320971"
|
|
// },
|
|
// {
|
|
// "label": "东台市",
|
|
// "value": "320981"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "广陵区",
|
|
// "value": "321002"
|
|
// },
|
|
// {
|
|
// "label": "邗江区",
|
|
// "value": "321003"
|
|
// },
|
|
// {
|
|
// "label": "江都区",
|
|
// "value": "321012"
|
|
// },
|
|
// {
|
|
// "label": "宝应县",
|
|
// "value": "321023"
|
|
// },
|
|
// {
|
|
// "label": "扬州经济技术开发区",
|
|
// "value": "321071"
|
|
// },
|
|
// {
|
|
// "label": "仪征市",
|
|
// "value": "321081"
|
|
// },
|
|
// {
|
|
// "label": "高邮市",
|
|
// "value": "321084"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "京口区",
|
|
// "value": "321102"
|
|
// },
|
|
// {
|
|
// "label": "润州区",
|
|
// "value": "321111"
|
|
// },
|
|
// {
|
|
// "label": "丹徒区",
|
|
// "value": "321112"
|
|
// },
|
|
// {
|
|
// "label": "镇江新区",
|
|
// "value": "321171"
|
|
// },
|
|
// {
|
|
// "label": "丹阳市",
|
|
// "value": "321181"
|
|
// },
|
|
// {
|
|
// "label": "扬中市",
|
|
// "value": "321182"
|
|
// },
|
|
// {
|
|
// "label": "句容市",
|
|
// "value": "321183"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "海陵区",
|
|
// "value": "321202"
|
|
// },
|
|
// {
|
|
// "label": "高港区",
|
|
// "value": "321203"
|
|
// },
|
|
// {
|
|
// "label": "姜堰区",
|
|
// "value": "321204"
|
|
// },
|
|
// {
|
|
// "label": "泰州医药高新技术产业开发区",
|
|
// "value": "321271"
|
|
// },
|
|
// {
|
|
// "label": "兴化市",
|
|
// "value": "321281"
|
|
// },
|
|
// {
|
|
// "label": "靖江市",
|
|
// "value": "321282"
|
|
// },
|
|
// {
|
|
// "label": "泰兴市",
|
|
// "value": "321283"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "宿城区",
|
|
// "value": "321302"
|
|
// },
|
|
// {
|
|
// "label": "宿豫区",
|
|
// "value": "321311"
|
|
// },
|
|
// {
|
|
// "label": "沭阳县",
|
|
// "value": "321322"
|
|
// },
|
|
// {
|
|
// "label": "泗阳县",
|
|
// "value": "321323"
|
|
// },
|
|
// {
|
|
// "label": "泗洪县",
|
|
// "value": "321324"
|
|
// },
|
|
// {
|
|
// "label": "宿迁经济技术开发区",
|
|
// "value": "321371"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "上城区",
|
|
// "value": "330102"
|
|
// },
|
|
// {
|
|
// "label": "下城区",
|
|
// "value": "330103"
|
|
// },
|
|
// {
|
|
// "label": "江干区",
|
|
// "value": "330104"
|
|
// },
|
|
// {
|
|
// "label": "拱墅区",
|
|
// "value": "330105"
|
|
// },
|
|
// {
|
|
// "label": "西湖区",
|
|
// "value": "330106"
|
|
// },
|
|
// {
|
|
// "label": "滨江区",
|
|
// "value": "330108"
|
|
// },
|
|
// {
|
|
// "label": "萧山区",
|
|
// "value": "330109"
|
|
// },
|
|
// {
|
|
// "label": "余杭区",
|
|
// "value": "330110"
|
|
// },
|
|
// {
|
|
// "label": "富阳区",
|
|
// "value": "330111"
|
|
// },
|
|
// {
|
|
// "label": "临安区",
|
|
// "value": "330112"
|
|
// },
|
|
// {
|
|
// "label": "桐庐县",
|
|
// "value": "330122"
|
|
// },
|
|
// {
|
|
// "label": "淳安县",
|
|
// "value": "330127"
|
|
// },
|
|
// {
|
|
// "label": "建德市",
|
|
// "value": "330182"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "海曙区",
|
|
// "value": "330203"
|
|
// },
|
|
// {
|
|
// "label": "江北区",
|
|
// "value": "330205"
|
|
// },
|
|
// {
|
|
// "label": "北仑区",
|
|
// "value": "330206"
|
|
// },
|
|
// {
|
|
// "label": "镇海区",
|
|
// "value": "330211"
|
|
// },
|
|
// {
|
|
// "label": "鄞州区",
|
|
// "value": "330212"
|
|
// },
|
|
// {
|
|
// "label": "奉化区",
|
|
// "value": "330213"
|
|
// },
|
|
// {
|
|
// "label": "象山县",
|
|
// "value": "330225"
|
|
// },
|
|
// {
|
|
// "label": "宁海县",
|
|
// "value": "330226"
|
|
// },
|
|
// {
|
|
// "label": "余姚市",
|
|
// "value": "330281"
|
|
// },
|
|
// {
|
|
// "label": "慈溪市",
|
|
// "value": "330282"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "鹿城区",
|
|
// "value": "330302"
|
|
// },
|
|
// {
|
|
// "label": "龙湾区",
|
|
// "value": "330303"
|
|
// },
|
|
// {
|
|
// "label": "瓯海区",
|
|
// "value": "330304"
|
|
// },
|
|
// {
|
|
// "label": "洞头区",
|
|
// "value": "330305"
|
|
// },
|
|
// {
|
|
// "label": "永嘉县",
|
|
// "value": "330324"
|
|
// },
|
|
// {
|
|
// "label": "平阳县",
|
|
// "value": "330326"
|
|
// },
|
|
// {
|
|
// "label": "苍南县",
|
|
// "value": "330327"
|
|
// },
|
|
// {
|
|
// "label": "文成县",
|
|
// "value": "330328"
|
|
// },
|
|
// {
|
|
// "label": "泰顺县",
|
|
// "value": "330329"
|
|
// },
|
|
// {
|
|
// "label": "温州经济技术开发区",
|
|
// "value": "330371"
|
|
// },
|
|
// {
|
|
// "label": "瑞安市",
|
|
// "value": "330381"
|
|
// },
|
|
// {
|
|
// "label": "乐清市",
|
|
// "value": "330382"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "南湖区",
|
|
// "value": "330402"
|
|
// },
|
|
// {
|
|
// "label": "秀洲区",
|
|
// "value": "330411"
|
|
// },
|
|
// {
|
|
// "label": "嘉善县",
|
|
// "value": "330421"
|
|
// },
|
|
// {
|
|
// "label": "海盐县",
|
|
// "value": "330424"
|
|
// },
|
|
// {
|
|
// "label": "海宁市",
|
|
// "value": "330481"
|
|
// },
|
|
// {
|
|
// "label": "平湖市",
|
|
// "value": "330482"
|
|
// },
|
|
// {
|
|
// "label": "桐乡市",
|
|
// "value": "330483"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "吴兴区",
|
|
// "value": "330502"
|
|
// },
|
|
// {
|
|
// "label": "南浔区",
|
|
// "value": "330503"
|
|
// },
|
|
// {
|
|
// "label": "德清县",
|
|
// "value": "330521"
|
|
// },
|
|
// {
|
|
// "label": "长兴县",
|
|
// "value": "330522"
|
|
// },
|
|
// {
|
|
// "label": "安吉县",
|
|
// "value": "330523"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "越城区",
|
|
// "value": "330602"
|
|
// },
|
|
// {
|
|
// "label": "柯桥区",
|
|
// "value": "330603"
|
|
// },
|
|
// {
|
|
// "label": "上虞区",
|
|
// "value": "330604"
|
|
// },
|
|
// {
|
|
// "label": "新昌县",
|
|
// "value": "330624"
|
|
// },
|
|
// {
|
|
// "label": "诸暨市",
|
|
// "value": "330681"
|
|
// },
|
|
// {
|
|
// "label": "嵊州市",
|
|
// "value": "330683"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "婺城区",
|
|
// "value": "330702"
|
|
// },
|
|
// {
|
|
// "label": "金东区",
|
|
// "value": "330703"
|
|
// },
|
|
// {
|
|
// "label": "武义县",
|
|
// "value": "330723"
|
|
// },
|
|
// {
|
|
// "label": "浦江县",
|
|
// "value": "330726"
|
|
// },
|
|
// {
|
|
// "label": "磐安县",
|
|
// "value": "330727"
|
|
// },
|
|
// {
|
|
// "label": "兰溪市",
|
|
// "value": "330781"
|
|
// },
|
|
// {
|
|
// "label": "义乌市",
|
|
// "value": "330782"
|
|
// },
|
|
// {
|
|
// "label": "东阳市",
|
|
// "value": "330783"
|
|
// },
|
|
// {
|
|
// "label": "永康市",
|
|
// "value": "330784"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "柯城区",
|
|
// "value": "330802"
|
|
// },
|
|
// {
|
|
// "label": "衢江区",
|
|
// "value": "330803"
|
|
// },
|
|
// {
|
|
// "label": "常山县",
|
|
// "value": "330822"
|
|
// },
|
|
// {
|
|
// "label": "开化县",
|
|
// "value": "330824"
|
|
// },
|
|
// {
|
|
// "label": "龙游县",
|
|
// "value": "330825"
|
|
// },
|
|
// {
|
|
// "label": "江山市",
|
|
// "value": "330881"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "定海区",
|
|
// "value": "330902"
|
|
// },
|
|
// {
|
|
// "label": "普陀区",
|
|
// "value": "330903"
|
|
// },
|
|
// {
|
|
// "label": "岱山县",
|
|
// "value": "330921"
|
|
// },
|
|
// {
|
|
// "label": "嵊泗县",
|
|
// "value": "330922"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "椒江区",
|
|
// "value": "331002"
|
|
// },
|
|
// {
|
|
// "label": "黄岩区",
|
|
// "value": "331003"
|
|
// },
|
|
// {
|
|
// "label": "路桥区",
|
|
// "value": "331004"
|
|
// },
|
|
// {
|
|
// "label": "三门县",
|
|
// "value": "331022"
|
|
// },
|
|
// {
|
|
// "label": "天台县",
|
|
// "value": "331023"
|
|
// },
|
|
// {
|
|
// "label": "仙居县",
|
|
// "value": "331024"
|
|
// },
|
|
// {
|
|
// "label": "温岭市",
|
|
// "value": "331081"
|
|
// },
|
|
// {
|
|
// "label": "临海市",
|
|
// "value": "331082"
|
|
// },
|
|
// {
|
|
// "label": "玉环市",
|
|
// "value": "331083"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "莲都区",
|
|
// "value": "331102"
|
|
// },
|
|
// {
|
|
// "label": "青田县",
|
|
// "value": "331121"
|
|
// },
|
|
// {
|
|
// "label": "缙云县",
|
|
// "value": "331122"
|
|
// },
|
|
// {
|
|
// "label": "遂昌县",
|
|
// "value": "331123"
|
|
// },
|
|
// {
|
|
// "label": "松阳县",
|
|
// "value": "331124"
|
|
// },
|
|
// {
|
|
// "label": "云和县",
|
|
// "value": "331125"
|
|
// },
|
|
// {
|
|
// "label": "庆元县",
|
|
// "value": "331126"
|
|
// },
|
|
// {
|
|
// "label": "景宁畲族自治县",
|
|
// "value": "331127"
|
|
// },
|
|
// {
|
|
// "label": "龙泉市",
|
|
// "value": "331181"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "瑶海区",
|
|
// "value": "340102"
|
|
// },
|
|
// {
|
|
// "label": "庐阳区",
|
|
// "value": "340103"
|
|
// },
|
|
// {
|
|
// "label": "蜀山区",
|
|
// "value": "340104"
|
|
// },
|
|
// {
|
|
// "label": "包河区",
|
|
// "value": "340111"
|
|
// },
|
|
// {
|
|
// "label": "长丰县",
|
|
// "value": "340121"
|
|
// },
|
|
// {
|
|
// "label": "肥东县",
|
|
// "value": "340122"
|
|
// },
|
|
// {
|
|
// "label": "肥西县",
|
|
// "value": "340123"
|
|
// },
|
|
// {
|
|
// "label": "庐江县",
|
|
// "value": "340124"
|
|
// },
|
|
// {
|
|
// "label": "合肥高新技术产业开发区",
|
|
// "value": "340171"
|
|
// },
|
|
// {
|
|
// "label": "合肥经济技术开发区",
|
|
// "value": "340172"
|
|
// },
|
|
// {
|
|
// "label": "合肥新站高新技术产业开发区",
|
|
// "value": "340173"
|
|
// },
|
|
// {
|
|
// "label": "巢湖市",
|
|
// "value": "340181"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "镜湖区",
|
|
// "value": "340202"
|
|
// },
|
|
// {
|
|
// "label": "弋江区",
|
|
// "value": "340203"
|
|
// },
|
|
// {
|
|
// "label": "鸠江区",
|
|
// "value": "340207"
|
|
// },
|
|
// {
|
|
// "label": "三山区",
|
|
// "value": "340208"
|
|
// },
|
|
// {
|
|
// "label": "芜湖县",
|
|
// "value": "340221"
|
|
// },
|
|
// {
|
|
// "label": "繁昌县",
|
|
// "value": "340222"
|
|
// },
|
|
// {
|
|
// "label": "南陵县",
|
|
// "value": "340223"
|
|
// },
|
|
// {
|
|
// "label": "无为县",
|
|
// "value": "340225"
|
|
// },
|
|
// {
|
|
// "label": "芜湖经济技术开发区",
|
|
// "value": "340271"
|
|
// },
|
|
// {
|
|
// "label": "安徽芜湖长江大桥经济开发区",
|
|
// "value": "340272"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "龙子湖区",
|
|
// "value": "340302"
|
|
// },
|
|
// {
|
|
// "label": "蚌山区",
|
|
// "value": "340303"
|
|
// },
|
|
// {
|
|
// "label": "禹会区",
|
|
// "value": "340304"
|
|
// },
|
|
// {
|
|
// "label": "淮上区",
|
|
// "value": "340311"
|
|
// },
|
|
// {
|
|
// "label": "怀远县",
|
|
// "value": "340321"
|
|
// },
|
|
// {
|
|
// "label": "五河县",
|
|
// "value": "340322"
|
|
// },
|
|
// {
|
|
// "label": "固镇县",
|
|
// "value": "340323"
|
|
// },
|
|
// {
|
|
// "label": "蚌埠市高新技术开发区",
|
|
// "value": "340371"
|
|
// },
|
|
// {
|
|
// "label": "蚌埠市经济开发区",
|
|
// "value": "340372"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "大通区",
|
|
// "value": "340402"
|
|
// },
|
|
// {
|
|
// "label": "田家庵区",
|
|
// "value": "340403"
|
|
// },
|
|
// {
|
|
// "label": "谢家集区",
|
|
// "value": "340404"
|
|
// },
|
|
// {
|
|
// "label": "八公山区",
|
|
// "value": "340405"
|
|
// },
|
|
// {
|
|
// "label": "潘集区",
|
|
// "value": "340406"
|
|
// },
|
|
// {
|
|
// "label": "凤台县",
|
|
// "value": "340421"
|
|
// },
|
|
// {
|
|
// "label": "寿县",
|
|
// "value": "340422"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "花山区",
|
|
// "value": "340503"
|
|
// },
|
|
// {
|
|
// "label": "雨山区",
|
|
// "value": "340504"
|
|
// },
|
|
// {
|
|
// "label": "博望区",
|
|
// "value": "340506"
|
|
// },
|
|
// {
|
|
// "label": "当涂县",
|
|
// "value": "340521"
|
|
// },
|
|
// {
|
|
// "label": "含山县",
|
|
// "value": "340522"
|
|
// },
|
|
// {
|
|
// "label": "和县",
|
|
// "value": "340523"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "杜集区",
|
|
// "value": "340602"
|
|
// },
|
|
// {
|
|
// "label": "相山区",
|
|
// "value": "340603"
|
|
// },
|
|
// {
|
|
// "label": "烈山区",
|
|
// "value": "340604"
|
|
// },
|
|
// {
|
|
// "label": "濉溪县",
|
|
// "value": "340621"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "铜官区",
|
|
// "value": "340705"
|
|
// },
|
|
// {
|
|
// "label": "义安区",
|
|
// "value": "340706"
|
|
// },
|
|
// {
|
|
// "label": "郊区",
|
|
// "value": "340711"
|
|
// },
|
|
// {
|
|
// "label": "枞阳县",
|
|
// "value": "340722"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "迎江区",
|
|
// "value": "340802"
|
|
// },
|
|
// {
|
|
// "label": "大观区",
|
|
// "value": "340803"
|
|
// },
|
|
// {
|
|
// "label": "宜秀区",
|
|
// "value": "340811"
|
|
// },
|
|
// {
|
|
// "label": "怀宁县",
|
|
// "value": "340822"
|
|
// },
|
|
// {
|
|
// "label": "潜山县",
|
|
// "value": "340824"
|
|
// },
|
|
// {
|
|
// "label": "太湖县",
|
|
// "value": "340825"
|
|
// },
|
|
// {
|
|
// "label": "宿松县",
|
|
// "value": "340826"
|
|
// },
|
|
// {
|
|
// "label": "望江县",
|
|
// "value": "340827"
|
|
// },
|
|
// {
|
|
// "label": "岳西县",
|
|
// "value": "340828"
|
|
// },
|
|
// {
|
|
// "label": "安徽安庆经济开发区",
|
|
// "value": "340871"
|
|
// },
|
|
// {
|
|
// "label": "桐城市",
|
|
// "value": "340881"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "屯溪区",
|
|
// "value": "341002"
|
|
// },
|
|
// {
|
|
// "label": "黄山区",
|
|
// "value": "341003"
|
|
// },
|
|
// {
|
|
// "label": "徽州区",
|
|
// "value": "341004"
|
|
// },
|
|
// {
|
|
// "label": "歙县",
|
|
// "value": "341021"
|
|
// },
|
|
// {
|
|
// "label": "休宁县",
|
|
// "value": "341022"
|
|
// },
|
|
// {
|
|
// "label": "黟县",
|
|
// "value": "341023"
|
|
// },
|
|
// {
|
|
// "label": "祁门县",
|
|
// "value": "341024"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "琅琊区",
|
|
// "value": "341102"
|
|
// },
|
|
// {
|
|
// "label": "南谯区",
|
|
// "value": "341103"
|
|
// },
|
|
// {
|
|
// "label": "来安县",
|
|
// "value": "341122"
|
|
// },
|
|
// {
|
|
// "label": "全椒县",
|
|
// "value": "341124"
|
|
// },
|
|
// {
|
|
// "label": "定远县",
|
|
// "value": "341125"
|
|
// },
|
|
// {
|
|
// "label": "凤阳县",
|
|
// "value": "341126"
|
|
// },
|
|
// {
|
|
// "label": "苏滁现代产业园",
|
|
// "value": "341171"
|
|
// },
|
|
// {
|
|
// "label": "滁州经济技术开发区",
|
|
// "value": "341172"
|
|
// },
|
|
// {
|
|
// "label": "天长市",
|
|
// "value": "341181"
|
|
// },
|
|
// {
|
|
// "label": "明光市",
|
|
// "value": "341182"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "颍州区",
|
|
// "value": "341202"
|
|
// },
|
|
// {
|
|
// "label": "颍东区",
|
|
// "value": "341203"
|
|
// },
|
|
// {
|
|
// "label": "颍泉区",
|
|
// "value": "341204"
|
|
// },
|
|
// {
|
|
// "label": "临泉县",
|
|
// "value": "341221"
|
|
// },
|
|
// {
|
|
// "label": "太和县",
|
|
// "value": "341222"
|
|
// },
|
|
// {
|
|
// "label": "阜南县",
|
|
// "value": "341225"
|
|
// },
|
|
// {
|
|
// "label": "颍上县",
|
|
// "value": "341226"
|
|
// },
|
|
// {
|
|
// "label": "阜阳合肥现代产业园区",
|
|
// "value": "341271"
|
|
// },
|
|
// {
|
|
// "label": "阜阳经济技术开发区",
|
|
// "value": "341272"
|
|
// },
|
|
// {
|
|
// "label": "界首市",
|
|
// "value": "341282"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "埇桥区",
|
|
// "value": "341302"
|
|
// },
|
|
// {
|
|
// "label": "砀山县",
|
|
// "value": "341321"
|
|
// },
|
|
// {
|
|
// "label": "萧县",
|
|
// "value": "341322"
|
|
// },
|
|
// {
|
|
// "label": "灵璧县",
|
|
// "value": "341323"
|
|
// },
|
|
// {
|
|
// "label": "泗县",
|
|
// "value": "341324"
|
|
// },
|
|
// {
|
|
// "label": "宿州马鞍山现代产业园区",
|
|
// "value": "341371"
|
|
// },
|
|
// {
|
|
// "label": "宿州经济技术开发区",
|
|
// "value": "341372"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "金安区",
|
|
// "value": "341502"
|
|
// },
|
|
// {
|
|
// "label": "裕安区",
|
|
// "value": "341503"
|
|
// },
|
|
// {
|
|
// "label": "叶集区",
|
|
// "value": "341504"
|
|
// },
|
|
// {
|
|
// "label": "霍邱县",
|
|
// "value": "341522"
|
|
// },
|
|
// {
|
|
// "label": "舒城县",
|
|
// "value": "341523"
|
|
// },
|
|
// {
|
|
// "label": "金寨县",
|
|
// "value": "341524"
|
|
// },
|
|
// {
|
|
// "label": "霍山县",
|
|
// "value": "341525"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "谯城区",
|
|
// "value": "341602"
|
|
// },
|
|
// {
|
|
// "label": "涡阳县",
|
|
// "value": "341621"
|
|
// },
|
|
// {
|
|
// "label": "蒙城县",
|
|
// "value": "341622"
|
|
// },
|
|
// {
|
|
// "label": "利辛县",
|
|
// "value": "341623"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "贵池区",
|
|
// "value": "341702"
|
|
// },
|
|
// {
|
|
// "label": "东至县",
|
|
// "value": "341721"
|
|
// },
|
|
// {
|
|
// "label": "石台县",
|
|
// "value": "341722"
|
|
// },
|
|
// {
|
|
// "label": "青阳县",
|
|
// "value": "341723"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "宣州区",
|
|
// "value": "341802"
|
|
// },
|
|
// {
|
|
// "label": "郎溪县",
|
|
// "value": "341821"
|
|
// },
|
|
// {
|
|
// "label": "广德县",
|
|
// "value": "341822"
|
|
// },
|
|
// {
|
|
// "label": "泾县",
|
|
// "value": "341823"
|
|
// },
|
|
// {
|
|
// "label": "绩溪县",
|
|
// "value": "341824"
|
|
// },
|
|
// {
|
|
// "label": "旌德县",
|
|
// "value": "341825"
|
|
// },
|
|
// {
|
|
// "label": "宣城市经济开发区",
|
|
// "value": "341871"
|
|
// },
|
|
// {
|
|
// "label": "宁国市",
|
|
// "value": "341881"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "鼓楼区",
|
|
// "value": "350102"
|
|
// },
|
|
// {
|
|
// "label": "台江区",
|
|
// "value": "350103"
|
|
// },
|
|
// {
|
|
// "label": "仓山区",
|
|
// "value": "350104"
|
|
// },
|
|
// {
|
|
// "label": "马尾区",
|
|
// "value": "350105"
|
|
// },
|
|
// {
|
|
// "label": "晋安区",
|
|
// "value": "350111"
|
|
// },
|
|
// {
|
|
// "label": "闽侯县",
|
|
// "value": "350121"
|
|
// },
|
|
// {
|
|
// "label": "连江县",
|
|
// "value": "350122"
|
|
// },
|
|
// {
|
|
// "label": "罗源县",
|
|
// "value": "350123"
|
|
// },
|
|
// {
|
|
// "label": "闽清县",
|
|
// "value": "350124"
|
|
// },
|
|
// {
|
|
// "label": "永泰县",
|
|
// "value": "350125"
|
|
// },
|
|
// {
|
|
// "label": "平潭县",
|
|
// "value": "350128"
|
|
// },
|
|
// {
|
|
// "label": "福清市",
|
|
// "value": "350181"
|
|
// },
|
|
// {
|
|
// "label": "长乐市",
|
|
// "value": "350182"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "思明区",
|
|
// "value": "350203"
|
|
// },
|
|
// {
|
|
// "label": "海沧区",
|
|
// "value": "350205"
|
|
// },
|
|
// {
|
|
// "label": "湖里区",
|
|
// "value": "350206"
|
|
// },
|
|
// {
|
|
// "label": "集美区",
|
|
// "value": "350211"
|
|
// },
|
|
// {
|
|
// "label": "同安区",
|
|
// "value": "350212"
|
|
// },
|
|
// {
|
|
// "label": "翔安区",
|
|
// "value": "350213"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "城厢区",
|
|
// "value": "350302"
|
|
// },
|
|
// {
|
|
// "label": "涵江区",
|
|
// "value": "350303"
|
|
// },
|
|
// {
|
|
// "label": "荔城区",
|
|
// "value": "350304"
|
|
// },
|
|
// {
|
|
// "label": "秀屿区",
|
|
// "value": "350305"
|
|
// },
|
|
// {
|
|
// "label": "仙游县",
|
|
// "value": "350322"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "梅列区",
|
|
// "value": "350402"
|
|
// },
|
|
// {
|
|
// "label": "三元区",
|
|
// "value": "350403"
|
|
// },
|
|
// {
|
|
// "label": "明溪县",
|
|
// "value": "350421"
|
|
// },
|
|
// {
|
|
// "label": "清流县",
|
|
// "value": "350423"
|
|
// },
|
|
// {
|
|
// "label": "宁化县",
|
|
// "value": "350424"
|
|
// },
|
|
// {
|
|
// "label": "大田县",
|
|
// "value": "350425"
|
|
// },
|
|
// {
|
|
// "label": "尤溪县",
|
|
// "value": "350426"
|
|
// },
|
|
// {
|
|
// "label": "沙县",
|
|
// "value": "350427"
|
|
// },
|
|
// {
|
|
// "label": "将乐县",
|
|
// "value": "350428"
|
|
// },
|
|
// {
|
|
// "label": "泰宁县",
|
|
// "value": "350429"
|
|
// },
|
|
// {
|
|
// "label": "建宁县",
|
|
// "value": "350430"
|
|
// },
|
|
// {
|
|
// "label": "永安市",
|
|
// "value": "350481"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "鲤城区",
|
|
// "value": "350502"
|
|
// },
|
|
// {
|
|
// "label": "丰泽区",
|
|
// "value": "350503"
|
|
// },
|
|
// {
|
|
// "label": "洛江区",
|
|
// "value": "350504"
|
|
// },
|
|
// {
|
|
// "label": "泉港区",
|
|
// "value": "350505"
|
|
// },
|
|
// {
|
|
// "label": "惠安县",
|
|
// "value": "350521"
|
|
// },
|
|
// {
|
|
// "label": "安溪县",
|
|
// "value": "350524"
|
|
// },
|
|
// {
|
|
// "label": "永春县",
|
|
// "value": "350525"
|
|
// },
|
|
// {
|
|
// "label": "德化县",
|
|
// "value": "350526"
|
|
// },
|
|
// {
|
|
// "label": "金门县",
|
|
// "value": "350527"
|
|
// },
|
|
// {
|
|
// "label": "石狮市",
|
|
// "value": "350581"
|
|
// },
|
|
// {
|
|
// "label": "晋江市",
|
|
// "value": "350582"
|
|
// },
|
|
// {
|
|
// "label": "南安市",
|
|
// "value": "350583"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "芗城区",
|
|
// "value": "350602"
|
|
// },
|
|
// {
|
|
// "label": "龙文区",
|
|
// "value": "350603"
|
|
// },
|
|
// {
|
|
// "label": "云霄县",
|
|
// "value": "350622"
|
|
// },
|
|
// {
|
|
// "label": "漳浦县",
|
|
// "value": "350623"
|
|
// },
|
|
// {
|
|
// "label": "诏安县",
|
|
// "value": "350624"
|
|
// },
|
|
// {
|
|
// "label": "长泰县",
|
|
// "value": "350625"
|
|
// },
|
|
// {
|
|
// "label": "东山县",
|
|
// "value": "350626"
|
|
// },
|
|
// {
|
|
// "label": "南靖县",
|
|
// "value": "350627"
|
|
// },
|
|
// {
|
|
// "label": "平和县",
|
|
// "value": "350628"
|
|
// },
|
|
// {
|
|
// "label": "华安县",
|
|
// "value": "350629"
|
|
// },
|
|
// {
|
|
// "label": "龙海市",
|
|
// "value": "350681"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "延平区",
|
|
// "value": "350702"
|
|
// },
|
|
// {
|
|
// "label": "建阳区",
|
|
// "value": "350703"
|
|
// },
|
|
// {
|
|
// "label": "顺昌县",
|
|
// "value": "350721"
|
|
// },
|
|
// {
|
|
// "label": "浦城县",
|
|
// "value": "350722"
|
|
// },
|
|
// {
|
|
// "label": "光泽县",
|
|
// "value": "350723"
|
|
// },
|
|
// {
|
|
// "label": "松溪县",
|
|
// "value": "350724"
|
|
// },
|
|
// {
|
|
// "label": "政和县",
|
|
// "value": "350725"
|
|
// },
|
|
// {
|
|
// "label": "邵武市",
|
|
// "value": "350781"
|
|
// },
|
|
// {
|
|
// "label": "武夷山市",
|
|
// "value": "350782"
|
|
// },
|
|
// {
|
|
// "label": "建瓯市",
|
|
// "value": "350783"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "新罗区",
|
|
// "value": "350802"
|
|
// },
|
|
// {
|
|
// "label": "永定区",
|
|
// "value": "350803"
|
|
// },
|
|
// {
|
|
// "label": "长汀县",
|
|
// "value": "350821"
|
|
// },
|
|
// {
|
|
// "label": "上杭县",
|
|
// "value": "350823"
|
|
// },
|
|
// {
|
|
// "label": "武平县",
|
|
// "value": "350824"
|
|
// },
|
|
// {
|
|
// "label": "连城县",
|
|
// "value": "350825"
|
|
// },
|
|
// {
|
|
// "label": "漳平市",
|
|
// "value": "350881"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "蕉城区",
|
|
// "value": "350902"
|
|
// },
|
|
// {
|
|
// "label": "霞浦县",
|
|
// "value": "350921"
|
|
// },
|
|
// {
|
|
// "label": "古田县",
|
|
// "value": "350922"
|
|
// },
|
|
// {
|
|
// "label": "屏南县",
|
|
// "value": "350923"
|
|
// },
|
|
// {
|
|
// "label": "寿宁县",
|
|
// "value": "350924"
|
|
// },
|
|
// {
|
|
// "label": "周宁县",
|
|
// "value": "350925"
|
|
// },
|
|
// {
|
|
// "label": "柘荣县",
|
|
// "value": "350926"
|
|
// },
|
|
// {
|
|
// "label": "福安市",
|
|
// "value": "350981"
|
|
// },
|
|
// {
|
|
// "label": "福鼎市",
|
|
// "value": "350982"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "东湖区",
|
|
// "value": "360102"
|
|
// },
|
|
// {
|
|
// "label": "西湖区",
|
|
// "value": "360103"
|
|
// },
|
|
// {
|
|
// "label": "青云谱区",
|
|
// "value": "360104"
|
|
// },
|
|
// {
|
|
// "label": "湾里区",
|
|
// "value": "360105"
|
|
// },
|
|
// {
|
|
// "label": "青山湖区",
|
|
// "value": "360111"
|
|
// },
|
|
// {
|
|
// "label": "新建区",
|
|
// "value": "360112"
|
|
// },
|
|
// {
|
|
// "label": "南昌县",
|
|
// "value": "360121"
|
|
// },
|
|
// {
|
|
// "label": "安义县",
|
|
// "value": "360123"
|
|
// },
|
|
// {
|
|
// "label": "进贤县",
|
|
// "value": "360124"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "昌江区",
|
|
// "value": "360202"
|
|
// },
|
|
// {
|
|
// "label": "珠山区",
|
|
// "value": "360203"
|
|
// },
|
|
// {
|
|
// "label": "浮梁县",
|
|
// "value": "360222"
|
|
// },
|
|
// {
|
|
// "label": "乐平市",
|
|
// "value": "360281"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "安源区",
|
|
// "value": "360302"
|
|
// },
|
|
// {
|
|
// "label": "湘东区",
|
|
// "value": "360313"
|
|
// },
|
|
// {
|
|
// "label": "莲花县",
|
|
// "value": "360321"
|
|
// },
|
|
// {
|
|
// "label": "上栗县",
|
|
// "value": "360322"
|
|
// },
|
|
// {
|
|
// "label": "芦溪县",
|
|
// "value": "360323"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "濂溪区",
|
|
// "value": "360402"
|
|
// },
|
|
// {
|
|
// "label": "浔阳区",
|
|
// "value": "360403"
|
|
// },
|
|
// {
|
|
// "label": "柴桑区",
|
|
// "value": "360404"
|
|
// },
|
|
// {
|
|
// "label": "武宁县",
|
|
// "value": "360423"
|
|
// },
|
|
// {
|
|
// "label": "修水县",
|
|
// "value": "360424"
|
|
// },
|
|
// {
|
|
// "label": "永修县",
|
|
// "value": "360425"
|
|
// },
|
|
// {
|
|
// "label": "德安县",
|
|
// "value": "360426"
|
|
// },
|
|
// {
|
|
// "label": "都昌县",
|
|
// "value": "360428"
|
|
// },
|
|
// {
|
|
// "label": "湖口县",
|
|
// "value": "360429"
|
|
// },
|
|
// {
|
|
// "label": "彭泽县",
|
|
// "value": "360430"
|
|
// },
|
|
// {
|
|
// "label": "瑞昌市",
|
|
// "value": "360481"
|
|
// },
|
|
// {
|
|
// "label": "共青城市",
|
|
// "value": "360482"
|
|
// },
|
|
// {
|
|
// "label": "庐山市",
|
|
// "value": "360483"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "渝水区",
|
|
// "value": "360502"
|
|
// },
|
|
// {
|
|
// "label": "分宜县",
|
|
// "value": "360521"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "月湖区",
|
|
// "value": "360602"
|
|
// },
|
|
// {
|
|
// "label": "余江县",
|
|
// "value": "360622"
|
|
// },
|
|
// {
|
|
// "label": "贵溪市",
|
|
// "value": "360681"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "章贡区",
|
|
// "value": "360702"
|
|
// },
|
|
// {
|
|
// "label": "南康区",
|
|
// "value": "360703"
|
|
// },
|
|
// {
|
|
// "label": "赣县区",
|
|
// "value": "360704"
|
|
// },
|
|
// {
|
|
// "label": "信丰县",
|
|
// "value": "360722"
|
|
// },
|
|
// {
|
|
// "label": "大余县",
|
|
// "value": "360723"
|
|
// },
|
|
// {
|
|
// "label": "上犹县",
|
|
// "value": "360724"
|
|
// },
|
|
// {
|
|
// "label": "崇义县",
|
|
// "value": "360725"
|
|
// },
|
|
// {
|
|
// "label": "安远县",
|
|
// "value": "360726"
|
|
// },
|
|
// {
|
|
// "label": "龙南县",
|
|
// "value": "360727"
|
|
// },
|
|
// {
|
|
// "label": "定南县",
|
|
// "value": "360728"
|
|
// },
|
|
// {
|
|
// "label": "全南县",
|
|
// "value": "360729"
|
|
// },
|
|
// {
|
|
// "label": "宁都县",
|
|
// "value": "360730"
|
|
// },
|
|
// {
|
|
// "label": "于都县",
|
|
// "value": "360731"
|
|
// },
|
|
// {
|
|
// "label": "兴国县",
|
|
// "value": "360732"
|
|
// },
|
|
// {
|
|
// "label": "会昌县",
|
|
// "value": "360733"
|
|
// },
|
|
// {
|
|
// "label": "寻乌县",
|
|
// "value": "360734"
|
|
// },
|
|
// {
|
|
// "label": "石城县",
|
|
// "value": "360735"
|
|
// },
|
|
// {
|
|
// "label": "瑞金市",
|
|
// "value": "360781"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "吉州区",
|
|
// "value": "360802"
|
|
// },
|
|
// {
|
|
// "label": "青原区",
|
|
// "value": "360803"
|
|
// },
|
|
// {
|
|
// "label": "吉安县",
|
|
// "value": "360821"
|
|
// },
|
|
// {
|
|
// "label": "吉水县",
|
|
// "value": "360822"
|
|
// },
|
|
// {
|
|
// "label": "峡江县",
|
|
// "value": "360823"
|
|
// },
|
|
// {
|
|
// "label": "新干县",
|
|
// "value": "360824"
|
|
// },
|
|
// {
|
|
// "label": "永丰县",
|
|
// "value": "360825"
|
|
// },
|
|
// {
|
|
// "label": "泰和县",
|
|
// "value": "360826"
|
|
// },
|
|
// {
|
|
// "label": "遂川县",
|
|
// "value": "360827"
|
|
// },
|
|
// {
|
|
// "label": "万安县",
|
|
// "value": "360828"
|
|
// },
|
|
// {
|
|
// "label": "安福县",
|
|
// "value": "360829"
|
|
// },
|
|
// {
|
|
// "label": "永新县",
|
|
// "value": "360830"
|
|
// },
|
|
// {
|
|
// "label": "井冈山市",
|
|
// "value": "360881"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "袁州区",
|
|
// "value": "360902"
|
|
// },
|
|
// {
|
|
// "label": "奉新县",
|
|
// "value": "360921"
|
|
// },
|
|
// {
|
|
// "label": "万载县",
|
|
// "value": "360922"
|
|
// },
|
|
// {
|
|
// "label": "上高县",
|
|
// "value": "360923"
|
|
// },
|
|
// {
|
|
// "label": "宜丰县",
|
|
// "value": "360924"
|
|
// },
|
|
// {
|
|
// "label": "靖安县",
|
|
// "value": "360925"
|
|
// },
|
|
// {
|
|
// "label": "铜鼓县",
|
|
// "value": "360926"
|
|
// },
|
|
// {
|
|
// "label": "丰城市",
|
|
// "value": "360981"
|
|
// },
|
|
// {
|
|
// "label": "樟树市",
|
|
// "value": "360982"
|
|
// },
|
|
// {
|
|
// "label": "高安市",
|
|
// "value": "360983"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "临川区",
|
|
// "value": "361002"
|
|
// },
|
|
// {
|
|
// "label": "东乡区",
|
|
// "value": "361003"
|
|
// },
|
|
// {
|
|
// "label": "南城县",
|
|
// "value": "361021"
|
|
// },
|
|
// {
|
|
// "label": "黎川县",
|
|
// "value": "361022"
|
|
// },
|
|
// {
|
|
// "label": "南丰县",
|
|
// "value": "361023"
|
|
// },
|
|
// {
|
|
// "label": "崇仁县",
|
|
// "value": "361024"
|
|
// },
|
|
// {
|
|
// "label": "乐安县",
|
|
// "value": "361025"
|
|
// },
|
|
// {
|
|
// "label": "宜黄县",
|
|
// "value": "361026"
|
|
// },
|
|
// {
|
|
// "label": "金溪县",
|
|
// "value": "361027"
|
|
// },
|
|
// {
|
|
// "label": "资溪县",
|
|
// "value": "361028"
|
|
// },
|
|
// {
|
|
// "label": "广昌县",
|
|
// "value": "361030"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "信州区",
|
|
// "value": "361102"
|
|
// },
|
|
// {
|
|
// "label": "广丰区",
|
|
// "value": "361103"
|
|
// },
|
|
// {
|
|
// "label": "上饶县",
|
|
// "value": "361121"
|
|
// },
|
|
// {
|
|
// "label": "玉山县",
|
|
// "value": "361123"
|
|
// },
|
|
// {
|
|
// "label": "铅山县",
|
|
// "value": "361124"
|
|
// },
|
|
// {
|
|
// "label": "横峰县",
|
|
// "value": "361125"
|
|
// },
|
|
// {
|
|
// "label": "弋阳县",
|
|
// "value": "361126"
|
|
// },
|
|
// {
|
|
// "label": "余干县",
|
|
// "value": "361127"
|
|
// },
|
|
// {
|
|
// "label": "鄱阳县",
|
|
// "value": "361128"
|
|
// },
|
|
// {
|
|
// "label": "万年县",
|
|
// "value": "361129"
|
|
// },
|
|
// {
|
|
// "label": "婺源县",
|
|
// "value": "361130"
|
|
// },
|
|
// {
|
|
// "label": "德兴市",
|
|
// "value": "361181"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "历下区",
|
|
// "value": "370102"
|
|
// },
|
|
// {
|
|
// "label": "市中区",
|
|
// "value": "370103"
|
|
// },
|
|
// {
|
|
// "label": "槐荫区",
|
|
// "value": "370104"
|
|
// },
|
|
// {
|
|
// "label": "天桥区",
|
|
// "value": "370105"
|
|
// },
|
|
// {
|
|
// "label": "历城区",
|
|
// "value": "370112"
|
|
// },
|
|
// {
|
|
// "label": "长清区",
|
|
// "value": "370113"
|
|
// },
|
|
// {
|
|
// "label": "章丘区",
|
|
// "value": "370114"
|
|
// },
|
|
// {
|
|
// "label": "平阴县",
|
|
// "value": "370124"
|
|
// },
|
|
// {
|
|
// "label": "济阳县",
|
|
// "value": "370125"
|
|
// },
|
|
// {
|
|
// "label": "商河县",
|
|
// "value": "370126"
|
|
// },
|
|
// {
|
|
// "label": "济南高新技术产业开发区",
|
|
// "value": "370171"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "市南区",
|
|
// "value": "370202"
|
|
// },
|
|
// {
|
|
// "label": "市北区",
|
|
// "value": "370203"
|
|
// },
|
|
// {
|
|
// "label": "黄岛区",
|
|
// "value": "370211"
|
|
// },
|
|
// {
|
|
// "label": "崂山区",
|
|
// "value": "370212"
|
|
// },
|
|
// {
|
|
// "label": "李沧区",
|
|
// "value": "370213"
|
|
// },
|
|
// {
|
|
// "label": "城阳区",
|
|
// "value": "370214"
|
|
// },
|
|
// {
|
|
// "label": "即墨区",
|
|
// "value": "370215"
|
|
// },
|
|
// {
|
|
// "label": "青岛高新技术产业开发区",
|
|
// "value": "370271"
|
|
// },
|
|
// {
|
|
// "label": "胶州市",
|
|
// "value": "370281"
|
|
// },
|
|
// {
|
|
// "label": "平度市",
|
|
// "value": "370283"
|
|
// },
|
|
// {
|
|
// "label": "莱西市",
|
|
// "value": "370285"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "淄川区",
|
|
// "value": "370302"
|
|
// },
|
|
// {
|
|
// "label": "张店区",
|
|
// "value": "370303"
|
|
// },
|
|
// {
|
|
// "label": "博山区",
|
|
// "value": "370304"
|
|
// },
|
|
// {
|
|
// "label": "临淄区",
|
|
// "value": "370305"
|
|
// },
|
|
// {
|
|
// "label": "周村区",
|
|
// "value": "370306"
|
|
// },
|
|
// {
|
|
// "label": "桓台县",
|
|
// "value": "370321"
|
|
// },
|
|
// {
|
|
// "label": "高青县",
|
|
// "value": "370322"
|
|
// },
|
|
// {
|
|
// "label": "沂源县",
|
|
// "value": "370323"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "市中区",
|
|
// "value": "370402"
|
|
// },
|
|
// {
|
|
// "label": "薛城区",
|
|
// "value": "370403"
|
|
// },
|
|
// {
|
|
// "label": "峄城区",
|
|
// "value": "370404"
|
|
// },
|
|
// {
|
|
// "label": "台儿庄区",
|
|
// "value": "370405"
|
|
// },
|
|
// {
|
|
// "label": "山亭区",
|
|
// "value": "370406"
|
|
// },
|
|
// {
|
|
// "label": "滕州市",
|
|
// "value": "370481"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "东营区",
|
|
// "value": "370502"
|
|
// },
|
|
// {
|
|
// "label": "河口区",
|
|
// "value": "370503"
|
|
// },
|
|
// {
|
|
// "label": "垦利区",
|
|
// "value": "370505"
|
|
// },
|
|
// {
|
|
// "label": "利津县",
|
|
// "value": "370522"
|
|
// },
|
|
// {
|
|
// "label": "广饶县",
|
|
// "value": "370523"
|
|
// },
|
|
// {
|
|
// "label": "东营经济技术开发区",
|
|
// "value": "370571"
|
|
// },
|
|
// {
|
|
// "label": "东营港经济开发区",
|
|
// "value": "370572"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "芝罘区",
|
|
// "value": "370602"
|
|
// },
|
|
// {
|
|
// "label": "福山区",
|
|
// "value": "370611"
|
|
// },
|
|
// {
|
|
// "label": "牟平区",
|
|
// "value": "370612"
|
|
// },
|
|
// {
|
|
// "label": "莱山区",
|
|
// "value": "370613"
|
|
// },
|
|
// {
|
|
// "label": "长岛县",
|
|
// "value": "370634"
|
|
// },
|
|
// {
|
|
// "label": "烟台高新技术产业开发区",
|
|
// "value": "370671"
|
|
// },
|
|
// {
|
|
// "label": "烟台经济技术开发区",
|
|
// "value": "370672"
|
|
// },
|
|
// {
|
|
// "label": "龙口市",
|
|
// "value": "370681"
|
|
// },
|
|
// {
|
|
// "label": "莱阳市",
|
|
// "value": "370682"
|
|
// },
|
|
// {
|
|
// "label": "莱州市",
|
|
// "value": "370683"
|
|
// },
|
|
// {
|
|
// "label": "蓬莱市",
|
|
// "value": "370684"
|
|
// },
|
|
// {
|
|
// "label": "招远市",
|
|
// "value": "370685"
|
|
// },
|
|
// {
|
|
// "label": "栖霞市",
|
|
// "value": "370686"
|
|
// },
|
|
// {
|
|
// "label": "海阳市",
|
|
// "value": "370687"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "潍城区",
|
|
// "value": "370702"
|
|
// },
|
|
// {
|
|
// "label": "寒亭区",
|
|
// "value": "370703"
|
|
// },
|
|
// {
|
|
// "label": "坊子区",
|
|
// "value": "370704"
|
|
// },
|
|
// {
|
|
// "label": "奎文区",
|
|
// "value": "370705"
|
|
// },
|
|
// {
|
|
// "label": "临朐县",
|
|
// "value": "370724"
|
|
// },
|
|
// {
|
|
// "label": "昌乐县",
|
|
// "value": "370725"
|
|
// },
|
|
// {
|
|
// "label": "潍坊滨海经济技术开发区",
|
|
// "value": "370772"
|
|
// },
|
|
// {
|
|
// "label": "青州市",
|
|
// "value": "370781"
|
|
// },
|
|
// {
|
|
// "label": "诸城市",
|
|
// "value": "370782"
|
|
// },
|
|
// {
|
|
// "label": "寿光市",
|
|
// "value": "370783"
|
|
// },
|
|
// {
|
|
// "label": "安丘市",
|
|
// "value": "370784"
|
|
// },
|
|
// {
|
|
// "label": "高密市",
|
|
// "value": "370785"
|
|
// },
|
|
// {
|
|
// "label": "昌邑市",
|
|
// "value": "370786"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "任城区",
|
|
// "value": "370811"
|
|
// },
|
|
// {
|
|
// "label": "兖州区",
|
|
// "value": "370812"
|
|
// },
|
|
// {
|
|
// "label": "微山县",
|
|
// "value": "370826"
|
|
// },
|
|
// {
|
|
// "label": "鱼台县",
|
|
// "value": "370827"
|
|
// },
|
|
// {
|
|
// "label": "金乡县",
|
|
// "value": "370828"
|
|
// },
|
|
// {
|
|
// "label": "嘉祥县",
|
|
// "value": "370829"
|
|
// },
|
|
// {
|
|
// "label": "汶上县",
|
|
// "value": "370830"
|
|
// },
|
|
// {
|
|
// "label": "泗水县",
|
|
// "value": "370831"
|
|
// },
|
|
// {
|
|
// "label": "梁山县",
|
|
// "value": "370832"
|
|
// },
|
|
// {
|
|
// "label": "济宁高新技术产业开发区",
|
|
// "value": "370871"
|
|
// },
|
|
// {
|
|
// "label": "曲阜市",
|
|
// "value": "370881"
|
|
// },
|
|
// {
|
|
// "label": "邹城市",
|
|
// "value": "370883"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "泰山区",
|
|
// "value": "370902"
|
|
// },
|
|
// {
|
|
// "label": "岱岳区",
|
|
// "value": "370911"
|
|
// },
|
|
// {
|
|
// "label": "宁阳县",
|
|
// "value": "370921"
|
|
// },
|
|
// {
|
|
// "label": "东平县",
|
|
// "value": "370923"
|
|
// },
|
|
// {
|
|
// "label": "新泰市",
|
|
// "value": "370982"
|
|
// },
|
|
// {
|
|
// "label": "肥城市",
|
|
// "value": "370983"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "环翠区",
|
|
// "value": "371002"
|
|
// },
|
|
// {
|
|
// "label": "文登区",
|
|
// "value": "371003"
|
|
// },
|
|
// {
|
|
// "label": "威海火炬高技术产业开发区",
|
|
// "value": "371071"
|
|
// },
|
|
// {
|
|
// "label": "威海经济技术开发区",
|
|
// "value": "371072"
|
|
// },
|
|
// {
|
|
// "label": "威海临港经济技术开发区",
|
|
// "value": "371073"
|
|
// },
|
|
// {
|
|
// "label": "荣成市",
|
|
// "value": "371082"
|
|
// },
|
|
// {
|
|
// "label": "乳山市",
|
|
// "value": "371083"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "东港区",
|
|
// "value": "371102"
|
|
// },
|
|
// {
|
|
// "label": "岚山区",
|
|
// "value": "371103"
|
|
// },
|
|
// {
|
|
// "label": "五莲县",
|
|
// "value": "371121"
|
|
// },
|
|
// {
|
|
// "label": "莒县",
|
|
// "value": "371122"
|
|
// },
|
|
// {
|
|
// "label": "日照经济技术开发区",
|
|
// "value": "371171"
|
|
// },
|
|
// {
|
|
// "label": "日照国际海洋城",
|
|
// "value": "371172"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "莱城区",
|
|
// "value": "371202"
|
|
// },
|
|
// {
|
|
// "label": "钢城区",
|
|
// "value": "371203"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "兰山区",
|
|
// "value": "371302"
|
|
// },
|
|
// {
|
|
// "label": "罗庄区",
|
|
// "value": "371311"
|
|
// },
|
|
// {
|
|
// "label": "河东区",
|
|
// "value": "371312"
|
|
// },
|
|
// {
|
|
// "label": "沂南县",
|
|
// "value": "371321"
|
|
// },
|
|
// {
|
|
// "label": "郯城县",
|
|
// "value": "371322"
|
|
// },
|
|
// {
|
|
// "label": "沂水县",
|
|
// "value": "371323"
|
|
// },
|
|
// {
|
|
// "label": "兰陵县",
|
|
// "value": "371324"
|
|
// },
|
|
// {
|
|
// "label": "费县",
|
|
// "value": "371325"
|
|
// },
|
|
// {
|
|
// "label": "平邑县",
|
|
// "value": "371326"
|
|
// },
|
|
// {
|
|
// "label": "莒南县",
|
|
// "value": "371327"
|
|
// },
|
|
// {
|
|
// "label": "蒙阴县",
|
|
// "value": "371328"
|
|
// },
|
|
// {
|
|
// "label": "临沭县",
|
|
// "value": "371329"
|
|
// },
|
|
// {
|
|
// "label": "临沂高新技术产业开发区",
|
|
// "value": "371371"
|
|
// },
|
|
// {
|
|
// "label": "临沂经济技术开发区",
|
|
// "value": "371372"
|
|
// },
|
|
// {
|
|
// "label": "临沂临港经济开发区",
|
|
// "value": "371373"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "德城区",
|
|
// "value": "371402"
|
|
// },
|
|
// {
|
|
// "label": "陵城区",
|
|
// "value": "371403"
|
|
// },
|
|
// {
|
|
// "label": "宁津县",
|
|
// "value": "371422"
|
|
// },
|
|
// {
|
|
// "label": "庆云县",
|
|
// "value": "371423"
|
|
// },
|
|
// {
|
|
// "label": "临邑县",
|
|
// "value": "371424"
|
|
// },
|
|
// {
|
|
// "label": "齐河县",
|
|
// "value": "371425"
|
|
// },
|
|
// {
|
|
// "label": "平原县",
|
|
// "value": "371426"
|
|
// },
|
|
// {
|
|
// "label": "夏津县",
|
|
// "value": "371427"
|
|
// },
|
|
// {
|
|
// "label": "武城县",
|
|
// "value": "371428"
|
|
// },
|
|
// {
|
|
// "label": "德州经济技术开发区",
|
|
// "value": "371471"
|
|
// },
|
|
// {
|
|
// "label": "德州运河经济开发区",
|
|
// "value": "371472"
|
|
// },
|
|
// {
|
|
// "label": "乐陵市",
|
|
// "value": "371481"
|
|
// },
|
|
// {
|
|
// "label": "禹城市",
|
|
// "value": "371482"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "东昌府区",
|
|
// "value": "371502"
|
|
// },
|
|
// {
|
|
// "label": "阳谷县",
|
|
// "value": "371521"
|
|
// },
|
|
// {
|
|
// "label": "莘县",
|
|
// "value": "371522"
|
|
// },
|
|
// {
|
|
// "label": "茌平县",
|
|
// "value": "371523"
|
|
// },
|
|
// {
|
|
// "label": "东阿县",
|
|
// "value": "371524"
|
|
// },
|
|
// {
|
|
// "label": "冠县",
|
|
// "value": "371525"
|
|
// },
|
|
// {
|
|
// "label": "高唐县",
|
|
// "value": "371526"
|
|
// },
|
|
// {
|
|
// "label": "临清市",
|
|
// "value": "371581"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "滨城区",
|
|
// "value": "371602"
|
|
// },
|
|
// {
|
|
// "label": "沾化区",
|
|
// "value": "371603"
|
|
// },
|
|
// {
|
|
// "label": "惠民县",
|
|
// "value": "371621"
|
|
// },
|
|
// {
|
|
// "label": "阳信县",
|
|
// "value": "371622"
|
|
// },
|
|
// {
|
|
// "label": "无棣县",
|
|
// "value": "371623"
|
|
// },
|
|
// {
|
|
// "label": "博兴县",
|
|
// "value": "371625"
|
|
// },
|
|
// {
|
|
// "label": "邹平县",
|
|
// "value": "371626"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "牡丹区",
|
|
// "value": "371702"
|
|
// },
|
|
// {
|
|
// "label": "定陶区",
|
|
// "value": "371703"
|
|
// },
|
|
// {
|
|
// "label": "曹县",
|
|
// "value": "371721"
|
|
// },
|
|
// {
|
|
// "label": "单县",
|
|
// "value": "371722"
|
|
// },
|
|
// {
|
|
// "label": "成武县",
|
|
// "value": "371723"
|
|
// },
|
|
// {
|
|
// "label": "巨野县",
|
|
// "value": "371724"
|
|
// },
|
|
// {
|
|
// "label": "郓城县",
|
|
// "value": "371725"
|
|
// },
|
|
// {
|
|
// "label": "鄄城县",
|
|
// "value": "371726"
|
|
// },
|
|
// {
|
|
// "label": "东明县",
|
|
// "value": "371728"
|
|
// },
|
|
// {
|
|
// "label": "菏泽经济技术开发区",
|
|
// "value": "371771"
|
|
// },
|
|
// {
|
|
// "label": "菏泽高新技术开发区",
|
|
// "value": "371772"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "中原区",
|
|
// "value": "410102"
|
|
// },
|
|
// {
|
|
// "label": "二七区",
|
|
// "value": "410103"
|
|
// },
|
|
// {
|
|
// "label": "管城回族区",
|
|
// "value": "410104"
|
|
// },
|
|
// {
|
|
// "label": "金水区",
|
|
// "value": "410105"
|
|
// },
|
|
// {
|
|
// "label": "上街区",
|
|
// "value": "410106"
|
|
// },
|
|
// {
|
|
// "label": "惠济区",
|
|
// "value": "410108"
|
|
// },
|
|
// {
|
|
// "label": "中牟县",
|
|
// "value": "410122"
|
|
// },
|
|
// {
|
|
// "label": "郑州经济技术开发区",
|
|
// "value": "410171"
|
|
// },
|
|
// {
|
|
// "label": "郑州高新技术产业开发区",
|
|
// "value": "410172"
|
|
// },
|
|
// {
|
|
// "label": "郑州航空港经济综合实验区",
|
|
// "value": "410173"
|
|
// },
|
|
// {
|
|
// "label": "巩义市",
|
|
// "value": "410181"
|
|
// },
|
|
// {
|
|
// "label": "荥阳市",
|
|
// "value": "410182"
|
|
// },
|
|
// {
|
|
// "label": "新密市",
|
|
// "value": "410183"
|
|
// },
|
|
// {
|
|
// "label": "新郑市",
|
|
// "value": "410184"
|
|
// },
|
|
// {
|
|
// "label": "登封市",
|
|
// "value": "410185"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "龙亭区",
|
|
// "value": "410202"
|
|
// },
|
|
// {
|
|
// "label": "顺河回族区",
|
|
// "value": "410203"
|
|
// },
|
|
// {
|
|
// "label": "鼓楼区",
|
|
// "value": "410204"
|
|
// },
|
|
// {
|
|
// "label": "禹王台区",
|
|
// "value": "410205"
|
|
// },
|
|
// {
|
|
// "label": "祥符区",
|
|
// "value": "410212"
|
|
// },
|
|
// {
|
|
// "label": "杞县",
|
|
// "value": "410221"
|
|
// },
|
|
// {
|
|
// "label": "通许县",
|
|
// "value": "410222"
|
|
// },
|
|
// {
|
|
// "label": "尉氏县",
|
|
// "value": "410223"
|
|
// },
|
|
// {
|
|
// "label": "兰考县",
|
|
// "value": "410225"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "老城区",
|
|
// "value": "410302"
|
|
// },
|
|
// {
|
|
// "label": "西工区",
|
|
// "value": "410303"
|
|
// },
|
|
// {
|
|
// "label": "瀍河回族区",
|
|
// "value": "410304"
|
|
// },
|
|
// {
|
|
// "label": "涧西区",
|
|
// "value": "410305"
|
|
// },
|
|
// {
|
|
// "label": "吉利区",
|
|
// "value": "410306"
|
|
// },
|
|
// {
|
|
// "label": "洛龙区",
|
|
// "value": "410311"
|
|
// },
|
|
// {
|
|
// "label": "孟津县",
|
|
// "value": "410322"
|
|
// },
|
|
// {
|
|
// "label": "新安县",
|
|
// "value": "410323"
|
|
// },
|
|
// {
|
|
// "label": "栾川县",
|
|
// "value": "410324"
|
|
// },
|
|
// {
|
|
// "label": "嵩县",
|
|
// "value": "410325"
|
|
// },
|
|
// {
|
|
// "label": "汝阳县",
|
|
// "value": "410326"
|
|
// },
|
|
// {
|
|
// "label": "宜阳县",
|
|
// "value": "410327"
|
|
// },
|
|
// {
|
|
// "label": "洛宁县",
|
|
// "value": "410328"
|
|
// },
|
|
// {
|
|
// "label": "伊川县",
|
|
// "value": "410329"
|
|
// },
|
|
// {
|
|
// "label": "洛阳高新技术产业开发区",
|
|
// "value": "410371"
|
|
// },
|
|
// {
|
|
// "label": "偃师市",
|
|
// "value": "410381"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "新华区",
|
|
// "value": "410402"
|
|
// },
|
|
// {
|
|
// "label": "卫东区",
|
|
// "value": "410403"
|
|
// },
|
|
// {
|
|
// "label": "石龙区",
|
|
// "value": "410404"
|
|
// },
|
|
// {
|
|
// "label": "湛河区",
|
|
// "value": "410411"
|
|
// },
|
|
// {
|
|
// "label": "宝丰县",
|
|
// "value": "410421"
|
|
// },
|
|
// {
|
|
// "label": "叶县",
|
|
// "value": "410422"
|
|
// },
|
|
// {
|
|
// "label": "鲁山县",
|
|
// "value": "410423"
|
|
// },
|
|
// {
|
|
// "label": "郏县",
|
|
// "value": "410425"
|
|
// },
|
|
// {
|
|
// "label": "平顶山高新技术产业开发区",
|
|
// "value": "410471"
|
|
// },
|
|
// {
|
|
// "label": "平顶山市新城区",
|
|
// "value": "410472"
|
|
// },
|
|
// {
|
|
// "label": "舞钢市",
|
|
// "value": "410481"
|
|
// },
|
|
// {
|
|
// "label": "汝州市",
|
|
// "value": "410482"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "文峰区",
|
|
// "value": "410502"
|
|
// },
|
|
// {
|
|
// "label": "北关区",
|
|
// "value": "410503"
|
|
// },
|
|
// {
|
|
// "label": "殷都区",
|
|
// "value": "410505"
|
|
// },
|
|
// {
|
|
// "label": "龙安区",
|
|
// "value": "410506"
|
|
// },
|
|
// {
|
|
// "label": "安阳县",
|
|
// "value": "410522"
|
|
// },
|
|
// {
|
|
// "label": "汤阴县",
|
|
// "value": "410523"
|
|
// },
|
|
// {
|
|
// "label": "滑县",
|
|
// "value": "410526"
|
|
// },
|
|
// {
|
|
// "label": "内黄县",
|
|
// "value": "410527"
|
|
// },
|
|
// {
|
|
// "label": "安阳高新技术产业开发区",
|
|
// "value": "410571"
|
|
// },
|
|
// {
|
|
// "label": "林州市",
|
|
// "value": "410581"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "鹤山区",
|
|
// "value": "410602"
|
|
// },
|
|
// {
|
|
// "label": "山城区",
|
|
// "value": "410603"
|
|
// },
|
|
// {
|
|
// "label": "淇滨区",
|
|
// "value": "410611"
|
|
// },
|
|
// {
|
|
// "label": "浚县",
|
|
// "value": "410621"
|
|
// },
|
|
// {
|
|
// "label": "淇县",
|
|
// "value": "410622"
|
|
// },
|
|
// {
|
|
// "label": "鹤壁经济技术开发区",
|
|
// "value": "410671"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "红旗区",
|
|
// "value": "410702"
|
|
// },
|
|
// {
|
|
// "label": "卫滨区",
|
|
// "value": "410703"
|
|
// },
|
|
// {
|
|
// "label": "凤泉区",
|
|
// "value": "410704"
|
|
// },
|
|
// {
|
|
// "label": "牧野区",
|
|
// "value": "410711"
|
|
// },
|
|
// {
|
|
// "label": "新乡县",
|
|
// "value": "410721"
|
|
// },
|
|
// {
|
|
// "label": "获嘉县",
|
|
// "value": "410724"
|
|
// },
|
|
// {
|
|
// "label": "原阳县",
|
|
// "value": "410725"
|
|
// },
|
|
// {
|
|
// "label": "延津县",
|
|
// "value": "410726"
|
|
// },
|
|
// {
|
|
// "label": "封丘县",
|
|
// "value": "410727"
|
|
// },
|
|
// {
|
|
// "label": "长垣县",
|
|
// "value": "410728"
|
|
// },
|
|
// {
|
|
// "label": "新乡高新技术产业开发区",
|
|
// "value": "410771"
|
|
// },
|
|
// {
|
|
// "label": "新乡经济技术开发区",
|
|
// "value": "410772"
|
|
// },
|
|
// {
|
|
// "label": "新乡市平原城乡一体化示范区",
|
|
// "value": "410773"
|
|
// },
|
|
// {
|
|
// "label": "卫辉市",
|
|
// "value": "410781"
|
|
// },
|
|
// {
|
|
// "label": "辉县市",
|
|
// "value": "410782"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "解放区",
|
|
// "value": "410802"
|
|
// },
|
|
// {
|
|
// "label": "中站区",
|
|
// "value": "410803"
|
|
// },
|
|
// {
|
|
// "label": "马村区",
|
|
// "value": "410804"
|
|
// },
|
|
// {
|
|
// "label": "山阳区",
|
|
// "value": "410811"
|
|
// },
|
|
// {
|
|
// "label": "修武县",
|
|
// "value": "410821"
|
|
// },
|
|
// {
|
|
// "label": "博爱县",
|
|
// "value": "410822"
|
|
// },
|
|
// {
|
|
// "label": "武陟县",
|
|
// "value": "410823"
|
|
// },
|
|
// {
|
|
// "label": "温县",
|
|
// "value": "410825"
|
|
// },
|
|
// {
|
|
// "label": "焦作城乡一体化示范区",
|
|
// "value": "410871"
|
|
// },
|
|
// {
|
|
// "label": "沁阳市",
|
|
// "value": "410882"
|
|
// },
|
|
// {
|
|
// "label": "孟州市",
|
|
// "value": "410883"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "华龙区",
|
|
// "value": "410902"
|
|
// },
|
|
// {
|
|
// "label": "清丰县",
|
|
// "value": "410922"
|
|
// },
|
|
// {
|
|
// "label": "南乐县",
|
|
// "value": "410923"
|
|
// },
|
|
// {
|
|
// "label": "范县",
|
|
// "value": "410926"
|
|
// },
|
|
// {
|
|
// "label": "台前县",
|
|
// "value": "410927"
|
|
// },
|
|
// {
|
|
// "label": "濮阳县",
|
|
// "value": "410928"
|
|
// },
|
|
// {
|
|
// "label": "河南濮阳工业园区",
|
|
// "value": "410971"
|
|
// },
|
|
// {
|
|
// "label": "濮阳经济技术开发区",
|
|
// "value": "410972"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "魏都区",
|
|
// "value": "411002"
|
|
// },
|
|
// {
|
|
// "label": "建安区",
|
|
// "value": "411003"
|
|
// },
|
|
// {
|
|
// "label": "鄢陵县",
|
|
// "value": "411024"
|
|
// },
|
|
// {
|
|
// "label": "襄城县",
|
|
// "value": "411025"
|
|
// },
|
|
// {
|
|
// "label": "许昌经济技术开发区",
|
|
// "value": "411071"
|
|
// },
|
|
// {
|
|
// "label": "禹州市",
|
|
// "value": "411081"
|
|
// },
|
|
// {
|
|
// "label": "长葛市",
|
|
// "value": "411082"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "源汇区",
|
|
// "value": "411102"
|
|
// },
|
|
// {
|
|
// "label": "郾城区",
|
|
// "value": "411103"
|
|
// },
|
|
// {
|
|
// "label": "召陵区",
|
|
// "value": "411104"
|
|
// },
|
|
// {
|
|
// "label": "舞阳县",
|
|
// "value": "411121"
|
|
// },
|
|
// {
|
|
// "label": "临颍县",
|
|
// "value": "411122"
|
|
// },
|
|
// {
|
|
// "label": "漯河经济技术开发区",
|
|
// "value": "411171"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "湖滨区",
|
|
// "value": "411202"
|
|
// },
|
|
// {
|
|
// "label": "陕州区",
|
|
// "value": "411203"
|
|
// },
|
|
// {
|
|
// "label": "渑池县",
|
|
// "value": "411221"
|
|
// },
|
|
// {
|
|
// "label": "卢氏县",
|
|
// "value": "411224"
|
|
// },
|
|
// {
|
|
// "label": "河南三门峡经济开发区",
|
|
// "value": "411271"
|
|
// },
|
|
// {
|
|
// "label": "义马市",
|
|
// "value": "411281"
|
|
// },
|
|
// {
|
|
// "label": "灵宝市",
|
|
// "value": "411282"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "宛城区",
|
|
// "value": "411302"
|
|
// },
|
|
// {
|
|
// "label": "卧龙区",
|
|
// "value": "411303"
|
|
// },
|
|
// {
|
|
// "label": "南召县",
|
|
// "value": "411321"
|
|
// },
|
|
// {
|
|
// "label": "方城县",
|
|
// "value": "411322"
|
|
// },
|
|
// {
|
|
// "label": "西峡县",
|
|
// "value": "411323"
|
|
// },
|
|
// {
|
|
// "label": "镇平县",
|
|
// "value": "411324"
|
|
// },
|
|
// {
|
|
// "label": "内乡县",
|
|
// "value": "411325"
|
|
// },
|
|
// {
|
|
// "label": "淅川县",
|
|
// "value": "411326"
|
|
// },
|
|
// {
|
|
// "label": "社旗县",
|
|
// "value": "411327"
|
|
// },
|
|
// {
|
|
// "label": "唐河县",
|
|
// "value": "411328"
|
|
// },
|
|
// {
|
|
// "label": "新野县",
|
|
// "value": "411329"
|
|
// },
|
|
// {
|
|
// "label": "桐柏县",
|
|
// "value": "411330"
|
|
// },
|
|
// {
|
|
// "label": "南阳高新技术产业开发区",
|
|
// "value": "411371"
|
|
// },
|
|
// {
|
|
// "label": "南阳市城乡一体化示范区",
|
|
// "value": "411372"
|
|
// },
|
|
// {
|
|
// "label": "邓州市",
|
|
// "value": "411381"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "梁园区",
|
|
// "value": "411402"
|
|
// },
|
|
// {
|
|
// "label": "睢阳区",
|
|
// "value": "411403"
|
|
// },
|
|
// {
|
|
// "label": "民权县",
|
|
// "value": "411421"
|
|
// },
|
|
// {
|
|
// "label": "睢县",
|
|
// "value": "411422"
|
|
// },
|
|
// {
|
|
// "label": "宁陵县",
|
|
// "value": "411423"
|
|
// },
|
|
// {
|
|
// "label": "柘城县",
|
|
// "value": "411424"
|
|
// },
|
|
// {
|
|
// "label": "虞城县",
|
|
// "value": "411425"
|
|
// },
|
|
// {
|
|
// "label": "夏邑县",
|
|
// "value": "411426"
|
|
// },
|
|
// {
|
|
// "label": "豫东综合物流产业聚集区",
|
|
// "value": "411471"
|
|
// },
|
|
// {
|
|
// "label": "河南商丘经济开发区",
|
|
// "value": "411472"
|
|
// },
|
|
// {
|
|
// "label": "永城市",
|
|
// "value": "411481"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "浉河区",
|
|
// "value": "411502"
|
|
// },
|
|
// {
|
|
// "label": "平桥区",
|
|
// "value": "411503"
|
|
// },
|
|
// {
|
|
// "label": "罗山县",
|
|
// "value": "411521"
|
|
// },
|
|
// {
|
|
// "label": "光山县",
|
|
// "value": "411522"
|
|
// },
|
|
// {
|
|
// "label": "新县",
|
|
// "value": "411523"
|
|
// },
|
|
// {
|
|
// "label": "商城县",
|
|
// "value": "411524"
|
|
// },
|
|
// {
|
|
// "label": "固始县",
|
|
// "value": "411525"
|
|
// },
|
|
// {
|
|
// "label": "潢川县",
|
|
// "value": "411526"
|
|
// },
|
|
// {
|
|
// "label": "淮滨县",
|
|
// "value": "411527"
|
|
// },
|
|
// {
|
|
// "label": "息县",
|
|
// "value": "411528"
|
|
// },
|
|
// {
|
|
// "label": "信阳高新技术产业开发区",
|
|
// "value": "411571"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "川汇区",
|
|
// "value": "411602"
|
|
// },
|
|
// {
|
|
// "label": "扶沟县",
|
|
// "value": "411621"
|
|
// },
|
|
// {
|
|
// "label": "西华县",
|
|
// "value": "411622"
|
|
// },
|
|
// {
|
|
// "label": "商水县",
|
|
// "value": "411623"
|
|
// },
|
|
// {
|
|
// "label": "沈丘县",
|
|
// "value": "411624"
|
|
// },
|
|
// {
|
|
// "label": "郸城县",
|
|
// "value": "411625"
|
|
// },
|
|
// {
|
|
// "label": "淮阳县",
|
|
// "value": "411626"
|
|
// },
|
|
// {
|
|
// "label": "太康县",
|
|
// "value": "411627"
|
|
// },
|
|
// {
|
|
// "label": "鹿邑县",
|
|
// "value": "411628"
|
|
// },
|
|
// {
|
|
// "label": "河南周口经济开发区",
|
|
// "value": "411671"
|
|
// },
|
|
// {
|
|
// "label": "项城市",
|
|
// "value": "411681"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "驿城区",
|
|
// "value": "411702"
|
|
// },
|
|
// {
|
|
// "label": "西平县",
|
|
// "value": "411721"
|
|
// },
|
|
// {
|
|
// "label": "上蔡县",
|
|
// "value": "411722"
|
|
// },
|
|
// {
|
|
// "label": "平舆县",
|
|
// "value": "411723"
|
|
// },
|
|
// {
|
|
// "label": "正阳县",
|
|
// "value": "411724"
|
|
// },
|
|
// {
|
|
// "label": "确山县",
|
|
// "value": "411725"
|
|
// },
|
|
// {
|
|
// "label": "泌阳县",
|
|
// "value": "411726"
|
|
// },
|
|
// {
|
|
// "label": "汝南县",
|
|
// "value": "411727"
|
|
// },
|
|
// {
|
|
// "label": "遂平县",
|
|
// "value": "411728"
|
|
// },
|
|
// {
|
|
// "label": "新蔡县",
|
|
// "value": "411729"
|
|
// },
|
|
// {
|
|
// "label": "河南驻马店经济开发区",
|
|
// "value": "411771"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "济源市",
|
|
// "value": "419001"
|
|
// }]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "江岸区",
|
|
// "value": "420102"
|
|
// },
|
|
// {
|
|
// "label": "江汉区",
|
|
// "value": "420103"
|
|
// },
|
|
// {
|
|
// "label": "硚口区",
|
|
// "value": "420104"
|
|
// },
|
|
// {
|
|
// "label": "汉阳区",
|
|
// "value": "420105"
|
|
// },
|
|
// {
|
|
// "label": "武昌区",
|
|
// "value": "420106"
|
|
// },
|
|
// {
|
|
// "label": "青山区",
|
|
// "value": "420107"
|
|
// },
|
|
// {
|
|
// "label": "洪山区",
|
|
// "value": "420111"
|
|
// },
|
|
// {
|
|
// "label": "东西湖区",
|
|
// "value": "420112"
|
|
// },
|
|
// {
|
|
// "label": "汉南区",
|
|
// "value": "420113"
|
|
// },
|
|
// {
|
|
// "label": "蔡甸区",
|
|
// "value": "420114"
|
|
// },
|
|
// {
|
|
// "label": "江夏区",
|
|
// "value": "420115"
|
|
// },
|
|
// {
|
|
// "label": "黄陂区",
|
|
// "value": "420116"
|
|
// },
|
|
// {
|
|
// "label": "新洲区",
|
|
// "value": "420117"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "黄石港区",
|
|
// "value": "420202"
|
|
// },
|
|
// {
|
|
// "label": "西塞山区",
|
|
// "value": "420203"
|
|
// },
|
|
// {
|
|
// "label": "下陆区",
|
|
// "value": "420204"
|
|
// },
|
|
// {
|
|
// "label": "铁山区",
|
|
// "value": "420205"
|
|
// },
|
|
// {
|
|
// "label": "阳新县",
|
|
// "value": "420222"
|
|
// },
|
|
// {
|
|
// "label": "大冶市",
|
|
// "value": "420281"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "茅箭区",
|
|
// "value": "420302"
|
|
// },
|
|
// {
|
|
// "label": "张湾区",
|
|
// "value": "420303"
|
|
// },
|
|
// {
|
|
// "label": "郧阳区",
|
|
// "value": "420304"
|
|
// },
|
|
// {
|
|
// "label": "郧西县",
|
|
// "value": "420322"
|
|
// },
|
|
// {
|
|
// "label": "竹山县",
|
|
// "value": "420323"
|
|
// },
|
|
// {
|
|
// "label": "竹溪县",
|
|
// "value": "420324"
|
|
// },
|
|
// {
|
|
// "label": "房县",
|
|
// "value": "420325"
|
|
// },
|
|
// {
|
|
// "label": "丹江口市",
|
|
// "value": "420381"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "西陵区",
|
|
// "value": "420502"
|
|
// },
|
|
// {
|
|
// "label": "伍家岗区",
|
|
// "value": "420503"
|
|
// },
|
|
// {
|
|
// "label": "点军区",
|
|
// "value": "420504"
|
|
// },
|
|
// {
|
|
// "label": "猇亭区",
|
|
// "value": "420505"
|
|
// },
|
|
// {
|
|
// "label": "夷陵区",
|
|
// "value": "420506"
|
|
// },
|
|
// {
|
|
// "label": "远安县",
|
|
// "value": "420525"
|
|
// },
|
|
// {
|
|
// "label": "兴山县",
|
|
// "value": "420526"
|
|
// },
|
|
// {
|
|
// "label": "秭归县",
|
|
// "value": "420527"
|
|
// },
|
|
// {
|
|
// "label": "长阳土家族自治县",
|
|
// "value": "420528"
|
|
// },
|
|
// {
|
|
// "label": "五峰土家族自治县",
|
|
// "value": "420529"
|
|
// },
|
|
// {
|
|
// "label": "宜都市",
|
|
// "value": "420581"
|
|
// },
|
|
// {
|
|
// "label": "当阳市",
|
|
// "value": "420582"
|
|
// },
|
|
// {
|
|
// "label": "枝江市",
|
|
// "value": "420583"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "襄城区",
|
|
// "value": "420602"
|
|
// },
|
|
// {
|
|
// "label": "樊城区",
|
|
// "value": "420606"
|
|
// },
|
|
// {
|
|
// "label": "襄州区",
|
|
// "value": "420607"
|
|
// },
|
|
// {
|
|
// "label": "南漳县",
|
|
// "value": "420624"
|
|
// },
|
|
// {
|
|
// "label": "谷城县",
|
|
// "value": "420625"
|
|
// },
|
|
// {
|
|
// "label": "保康县",
|
|
// "value": "420626"
|
|
// },
|
|
// {
|
|
// "label": "老河口市",
|
|
// "value": "420682"
|
|
// },
|
|
// {
|
|
// "label": "枣阳市",
|
|
// "value": "420683"
|
|
// },
|
|
// {
|
|
// "label": "宜城市",
|
|
// "value": "420684"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "梁子湖区",
|
|
// "value": "420702"
|
|
// },
|
|
// {
|
|
// "label": "华容区",
|
|
// "value": "420703"
|
|
// },
|
|
// {
|
|
// "label": "鄂城区",
|
|
// "value": "420704"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "东宝区",
|
|
// "value": "420802"
|
|
// },
|
|
// {
|
|
// "label": "掇刀区",
|
|
// "value": "420804"
|
|
// },
|
|
// {
|
|
// "label": "京山县",
|
|
// "value": "420821"
|
|
// },
|
|
// {
|
|
// "label": "沙洋县",
|
|
// "value": "420822"
|
|
// },
|
|
// {
|
|
// "label": "钟祥市",
|
|
// "value": "420881"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "孝南区",
|
|
// "value": "420902"
|
|
// },
|
|
// {
|
|
// "label": "孝昌县",
|
|
// "value": "420921"
|
|
// },
|
|
// {
|
|
// "label": "大悟县",
|
|
// "value": "420922"
|
|
// },
|
|
// {
|
|
// "label": "云梦县",
|
|
// "value": "420923"
|
|
// },
|
|
// {
|
|
// "label": "应城市",
|
|
// "value": "420981"
|
|
// },
|
|
// {
|
|
// "label": "安陆市",
|
|
// "value": "420982"
|
|
// },
|
|
// {
|
|
// "label": "汉川市",
|
|
// "value": "420984"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "沙市区",
|
|
// "value": "421002"
|
|
// },
|
|
// {
|
|
// "label": "荆州区",
|
|
// "value": "421003"
|
|
// },
|
|
// {
|
|
// "label": "公安县",
|
|
// "value": "421022"
|
|
// },
|
|
// {
|
|
// "label": "监利县",
|
|
// "value": "421023"
|
|
// },
|
|
// {
|
|
// "label": "江陵县",
|
|
// "value": "421024"
|
|
// },
|
|
// {
|
|
// "label": "荆州经济技术开发区",
|
|
// "value": "421071"
|
|
// },
|
|
// {
|
|
// "label": "石首市",
|
|
// "value": "421081"
|
|
// },
|
|
// {
|
|
// "label": "洪湖市",
|
|
// "value": "421083"
|
|
// },
|
|
// {
|
|
// "label": "松滋市",
|
|
// "value": "421087"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "黄州区",
|
|
// "value": "421102"
|
|
// },
|
|
// {
|
|
// "label": "团风县",
|
|
// "value": "421121"
|
|
// },
|
|
// {
|
|
// "label": "红安县",
|
|
// "value": "421122"
|
|
// },
|
|
// {
|
|
// "label": "罗田县",
|
|
// "value": "421123"
|
|
// },
|
|
// {
|
|
// "label": "英山县",
|
|
// "value": "421124"
|
|
// },
|
|
// {
|
|
// "label": "浠水县",
|
|
// "value": "421125"
|
|
// },
|
|
// {
|
|
// "label": "蕲春县",
|
|
// "value": "421126"
|
|
// },
|
|
// {
|
|
// "label": "黄梅县",
|
|
// "value": "421127"
|
|
// },
|
|
// {
|
|
// "label": "龙感湖管理区",
|
|
// "value": "421171"
|
|
// },
|
|
// {
|
|
// "label": "麻城市",
|
|
// "value": "421181"
|
|
// },
|
|
// {
|
|
// "label": "武穴市",
|
|
// "value": "421182"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "咸安区",
|
|
// "value": "421202"
|
|
// },
|
|
// {
|
|
// "label": "嘉鱼县",
|
|
// "value": "421221"
|
|
// },
|
|
// {
|
|
// "label": "通城县",
|
|
// "value": "421222"
|
|
// },
|
|
// {
|
|
// "label": "崇阳县",
|
|
// "value": "421223"
|
|
// },
|
|
// {
|
|
// "label": "通山县",
|
|
// "value": "421224"
|
|
// },
|
|
// {
|
|
// "label": "赤壁市",
|
|
// "value": "421281"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "曾都区",
|
|
// "value": "421303"
|
|
// },
|
|
// {
|
|
// "label": "随县",
|
|
// "value": "421321"
|
|
// },
|
|
// {
|
|
// "label": "广水市",
|
|
// "value": "421381"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "恩施市",
|
|
// "value": "422801"
|
|
// },
|
|
// {
|
|
// "label": "利川市",
|
|
// "value": "422802"
|
|
// },
|
|
// {
|
|
// "label": "建始县",
|
|
// "value": "422822"
|
|
// },
|
|
// {
|
|
// "label": "巴东县",
|
|
// "value": "422823"
|
|
// },
|
|
// {
|
|
// "label": "宣恩县",
|
|
// "value": "422825"
|
|
// },
|
|
// {
|
|
// "label": "咸丰县",
|
|
// "value": "422826"
|
|
// },
|
|
// {
|
|
// "label": "来凤县",
|
|
// "value": "422827"
|
|
// },
|
|
// {
|
|
// "label": "鹤峰县",
|
|
// "value": "422828"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "仙桃市",
|
|
// "value": "429004"
|
|
// },
|
|
// {
|
|
// "label": "潜江市",
|
|
// "value": "429005"
|
|
// },
|
|
// {
|
|
// "label": "天门市",
|
|
// "value": "429006"
|
|
// },
|
|
// {
|
|
// "label": "神农架林区",
|
|
// "value": "429021"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "芙蓉区",
|
|
// "value": "430102"
|
|
// },
|
|
// {
|
|
// "label": "天心区",
|
|
// "value": "430103"
|
|
// },
|
|
// {
|
|
// "label": "岳麓区",
|
|
// "value": "430104"
|
|
// },
|
|
// {
|
|
// "label": "开福区",
|
|
// "value": "430105"
|
|
// },
|
|
// {
|
|
// "label": "雨花区",
|
|
// "value": "430111"
|
|
// },
|
|
// {
|
|
// "label": "望城区",
|
|
// "value": "430112"
|
|
// },
|
|
// {
|
|
// "label": "长沙县",
|
|
// "value": "430121"
|
|
// },
|
|
// {
|
|
// "label": "浏阳市",
|
|
// "value": "430181"
|
|
// },
|
|
// {
|
|
// "label": "宁乡市",
|
|
// "value": "430182"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "荷塘区",
|
|
// "value": "430202"
|
|
// },
|
|
// {
|
|
// "label": "芦淞区",
|
|
// "value": "430203"
|
|
// },
|
|
// {
|
|
// "label": "石峰区",
|
|
// "value": "430204"
|
|
// },
|
|
// {
|
|
// "label": "天元区",
|
|
// "value": "430211"
|
|
// },
|
|
// {
|
|
// "label": "株洲县",
|
|
// "value": "430221"
|
|
// },
|
|
// {
|
|
// "label": "攸县",
|
|
// "value": "430223"
|
|
// },
|
|
// {
|
|
// "label": "茶陵县",
|
|
// "value": "430224"
|
|
// },
|
|
// {
|
|
// "label": "炎陵县",
|
|
// "value": "430225"
|
|
// },
|
|
// {
|
|
// "label": "云龙示范区",
|
|
// "value": "430271"
|
|
// },
|
|
// {
|
|
// "label": "醴陵市",
|
|
// "value": "430281"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "雨湖区",
|
|
// "value": "430302"
|
|
// },
|
|
// {
|
|
// "label": "岳塘区",
|
|
// "value": "430304"
|
|
// },
|
|
// {
|
|
// "label": "湘潭县",
|
|
// "value": "430321"
|
|
// },
|
|
// {
|
|
// "label": "湖南湘潭高新技术产业园区",
|
|
// "value": "430371"
|
|
// },
|
|
// {
|
|
// "label": "湘潭昭山示范区",
|
|
// "value": "430372"
|
|
// },
|
|
// {
|
|
// "label": "湘潭九华示范区",
|
|
// "value": "430373"
|
|
// },
|
|
// {
|
|
// "label": "湘乡市",
|
|
// "value": "430381"
|
|
// },
|
|
// {
|
|
// "label": "韶山市",
|
|
// "value": "430382"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "珠晖区",
|
|
// "value": "430405"
|
|
// },
|
|
// {
|
|
// "label": "雁峰区",
|
|
// "value": "430406"
|
|
// },
|
|
// {
|
|
// "label": "石鼓区",
|
|
// "value": "430407"
|
|
// },
|
|
// {
|
|
// "label": "蒸湘区",
|
|
// "value": "430408"
|
|
// },
|
|
// {
|
|
// "label": "南岳区",
|
|
// "value": "430412"
|
|
// },
|
|
// {
|
|
// "label": "衡阳县",
|
|
// "value": "430421"
|
|
// },
|
|
// {
|
|
// "label": "衡南县",
|
|
// "value": "430422"
|
|
// },
|
|
// {
|
|
// "label": "衡山县",
|
|
// "value": "430423"
|
|
// },
|
|
// {
|
|
// "label": "衡东县",
|
|
// "value": "430424"
|
|
// },
|
|
// {
|
|
// "label": "祁东县",
|
|
// "value": "430426"
|
|
// },
|
|
// {
|
|
// "label": "衡阳综合保税区",
|
|
// "value": "430471"
|
|
// },
|
|
// {
|
|
// "label": "湖南衡阳高新技术产业园区",
|
|
// "value": "430472"
|
|
// },
|
|
// {
|
|
// "label": "湖南衡阳松木经济开发区",
|
|
// "value": "430473"
|
|
// },
|
|
// {
|
|
// "label": "耒阳市",
|
|
// "value": "430481"
|
|
// },
|
|
// {
|
|
// "label": "常宁市",
|
|
// "value": "430482"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "双清区",
|
|
// "value": "430502"
|
|
// },
|
|
// {
|
|
// "label": "大祥区",
|
|
// "value": "430503"
|
|
// },
|
|
// {
|
|
// "label": "北塔区",
|
|
// "value": "430511"
|
|
// },
|
|
// {
|
|
// "label": "邵东县",
|
|
// "value": "430521"
|
|
// },
|
|
// {
|
|
// "label": "新邵县",
|
|
// "value": "430522"
|
|
// },
|
|
// {
|
|
// "label": "邵阳县",
|
|
// "value": "430523"
|
|
// },
|
|
// {
|
|
// "label": "隆回县",
|
|
// "value": "430524"
|
|
// },
|
|
// {
|
|
// "label": "洞口县",
|
|
// "value": "430525"
|
|
// },
|
|
// {
|
|
// "label": "绥宁县",
|
|
// "value": "430527"
|
|
// },
|
|
// {
|
|
// "label": "新宁县",
|
|
// "value": "430528"
|
|
// },
|
|
// {
|
|
// "label": "城步苗族自治县",
|
|
// "value": "430529"
|
|
// },
|
|
// {
|
|
// "label": "武冈市",
|
|
// "value": "430581"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "岳阳楼区",
|
|
// "value": "430602"
|
|
// },
|
|
// {
|
|
// "label": "云溪区",
|
|
// "value": "430603"
|
|
// },
|
|
// {
|
|
// "label": "君山区",
|
|
// "value": "430611"
|
|
// },
|
|
// {
|
|
// "label": "岳阳县",
|
|
// "value": "430621"
|
|
// },
|
|
// {
|
|
// "label": "华容县",
|
|
// "value": "430623"
|
|
// },
|
|
// {
|
|
// "label": "湘阴县",
|
|
// "value": "430624"
|
|
// },
|
|
// {
|
|
// "label": "平江县",
|
|
// "value": "430626"
|
|
// },
|
|
// {
|
|
// "label": "岳阳市屈原管理区",
|
|
// "value": "430671"
|
|
// },
|
|
// {
|
|
// "label": "汨罗市",
|
|
// "value": "430681"
|
|
// },
|
|
// {
|
|
// "label": "临湘市",
|
|
// "value": "430682"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "武陵区",
|
|
// "value": "430702"
|
|
// },
|
|
// {
|
|
// "label": "鼎城区",
|
|
// "value": "430703"
|
|
// },
|
|
// {
|
|
// "label": "安乡县",
|
|
// "value": "430721"
|
|
// },
|
|
// {
|
|
// "label": "汉寿县",
|
|
// "value": "430722"
|
|
// },
|
|
// {
|
|
// "label": "澧县",
|
|
// "value": "430723"
|
|
// },
|
|
// {
|
|
// "label": "临澧县",
|
|
// "value": "430724"
|
|
// },
|
|
// {
|
|
// "label": "桃源县",
|
|
// "value": "430725"
|
|
// },
|
|
// {
|
|
// "label": "石门县",
|
|
// "value": "430726"
|
|
// },
|
|
// {
|
|
// "label": "常德市西洞庭管理区",
|
|
// "value": "430771"
|
|
// },
|
|
// {
|
|
// "label": "津市市",
|
|
// "value": "430781"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "永定区",
|
|
// "value": "430802"
|
|
// },
|
|
// {
|
|
// "label": "武陵源区",
|
|
// "value": "430811"
|
|
// },
|
|
// {
|
|
// "label": "慈利县",
|
|
// "value": "430821"
|
|
// },
|
|
// {
|
|
// "label": "桑植县",
|
|
// "value": "430822"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "资阳区",
|
|
// "value": "430902"
|
|
// },
|
|
// {
|
|
// "label": "赫山区",
|
|
// "value": "430903"
|
|
// },
|
|
// {
|
|
// "label": "南县",
|
|
// "value": "430921"
|
|
// },
|
|
// {
|
|
// "label": "桃江县",
|
|
// "value": "430922"
|
|
// },
|
|
// {
|
|
// "label": "安化县",
|
|
// "value": "430923"
|
|
// },
|
|
// {
|
|
// "label": "益阳市大通湖管理区",
|
|
// "value": "430971"
|
|
// },
|
|
// {
|
|
// "label": "湖南益阳高新技术产业园区",
|
|
// "value": "430972"
|
|
// },
|
|
// {
|
|
// "label": "沅江市",
|
|
// "value": "430981"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "北湖区",
|
|
// "value": "431002"
|
|
// },
|
|
// {
|
|
// "label": "苏仙区",
|
|
// "value": "431003"
|
|
// },
|
|
// {
|
|
// "label": "桂阳县",
|
|
// "value": "431021"
|
|
// },
|
|
// {
|
|
// "label": "宜章县",
|
|
// "value": "431022"
|
|
// },
|
|
// {
|
|
// "label": "永兴县",
|
|
// "value": "431023"
|
|
// },
|
|
// {
|
|
// "label": "嘉禾县",
|
|
// "value": "431024"
|
|
// },
|
|
// {
|
|
// "label": "临武县",
|
|
// "value": "431025"
|
|
// },
|
|
// {
|
|
// "label": "汝城县",
|
|
// "value": "431026"
|
|
// },
|
|
// {
|
|
// "label": "桂东县",
|
|
// "value": "431027"
|
|
// },
|
|
// {
|
|
// "label": "安仁县",
|
|
// "value": "431028"
|
|
// },
|
|
// {
|
|
// "label": "资兴市",
|
|
// "value": "431081"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "零陵区",
|
|
// "value": "431102"
|
|
// },
|
|
// {
|
|
// "label": "冷水滩区",
|
|
// "value": "431103"
|
|
// },
|
|
// {
|
|
// "label": "祁阳县",
|
|
// "value": "431121"
|
|
// },
|
|
// {
|
|
// "label": "东安县",
|
|
// "value": "431122"
|
|
// },
|
|
// {
|
|
// "label": "双牌县",
|
|
// "value": "431123"
|
|
// },
|
|
// {
|
|
// "label": "道县",
|
|
// "value": "431124"
|
|
// },
|
|
// {
|
|
// "label": "江永县",
|
|
// "value": "431125"
|
|
// },
|
|
// {
|
|
// "label": "宁远县",
|
|
// "value": "431126"
|
|
// },
|
|
// {
|
|
// "label": "蓝山县",
|
|
// "value": "431127"
|
|
// },
|
|
// {
|
|
// "label": "新田县",
|
|
// "value": "431128"
|
|
// },
|
|
// {
|
|
// "label": "江华瑶族自治县",
|
|
// "value": "431129"
|
|
// },
|
|
// {
|
|
// "label": "永州经济技术开发区",
|
|
// "value": "431171"
|
|
// },
|
|
// {
|
|
// "label": "永州市金洞管理区",
|
|
// "value": "431172"
|
|
// },
|
|
// {
|
|
// "label": "永州市回龙圩管理区",
|
|
// "value": "431173"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "鹤城区",
|
|
// "value": "431202"
|
|
// },
|
|
// {
|
|
// "label": "中方县",
|
|
// "value": "431221"
|
|
// },
|
|
// {
|
|
// "label": "沅陵县",
|
|
// "value": "431222"
|
|
// },
|
|
// {
|
|
// "label": "辰溪县",
|
|
// "value": "431223"
|
|
// },
|
|
// {
|
|
// "label": "溆浦县",
|
|
// "value": "431224"
|
|
// },
|
|
// {
|
|
// "label": "会同县",
|
|
// "value": "431225"
|
|
// },
|
|
// {
|
|
// "label": "麻阳苗族自治县",
|
|
// "value": "431226"
|
|
// },
|
|
// {
|
|
// "label": "新晃侗族自治县",
|
|
// "value": "431227"
|
|
// },
|
|
// {
|
|
// "label": "芷江侗族自治县",
|
|
// "value": "431228"
|
|
// },
|
|
// {
|
|
// "label": "靖州苗族侗族自治县",
|
|
// "value": "431229"
|
|
// },
|
|
// {
|
|
// "label": "通道侗族自治县",
|
|
// "value": "431230"
|
|
// },
|
|
// {
|
|
// "label": "怀化市洪江管理区",
|
|
// "value": "431271"
|
|
// },
|
|
// {
|
|
// "label": "洪江市",
|
|
// "value": "431281"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "娄星区",
|
|
// "value": "431302"
|
|
// },
|
|
// {
|
|
// "label": "双峰县",
|
|
// "value": "431321"
|
|
// },
|
|
// {
|
|
// "label": "新化县",
|
|
// "value": "431322"
|
|
// },
|
|
// {
|
|
// "label": "冷水江市",
|
|
// "value": "431381"
|
|
// },
|
|
// {
|
|
// "label": "涟源市",
|
|
// "value": "431382"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "吉首市",
|
|
// "value": "433101"
|
|
// },
|
|
// {
|
|
// "label": "泸溪县",
|
|
// "value": "433122"
|
|
// },
|
|
// {
|
|
// "label": "凤凰县",
|
|
// "value": "433123"
|
|
// },
|
|
// {
|
|
// "label": "花垣县",
|
|
// "value": "433124"
|
|
// },
|
|
// {
|
|
// "label": "保靖县",
|
|
// "value": "433125"
|
|
// },
|
|
// {
|
|
// "label": "古丈县",
|
|
// "value": "433126"
|
|
// },
|
|
// {
|
|
// "label": "永顺县",
|
|
// "value": "433127"
|
|
// },
|
|
// {
|
|
// "label": "龙山县",
|
|
// "value": "433130"
|
|
// },
|
|
// {
|
|
// "label": "湖南吉首经济开发区",
|
|
// "value": "433172"
|
|
// },
|
|
// {
|
|
// "label": "湖南永顺经济开发区",
|
|
// "value": "433173"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "荔湾区",
|
|
// "value": "440103"
|
|
// },
|
|
// {
|
|
// "label": "越秀区",
|
|
// "value": "440104"
|
|
// },
|
|
// {
|
|
// "label": "海珠区",
|
|
// "value": "440105"
|
|
// },
|
|
// {
|
|
// "label": "天河区",
|
|
// "value": "440106"
|
|
// },
|
|
// {
|
|
// "label": "白云区",
|
|
// "value": "440111"
|
|
// },
|
|
// {
|
|
// "label": "黄埔区",
|
|
// "value": "440112"
|
|
// },
|
|
// {
|
|
// "label": "番禺区",
|
|
// "value": "440113"
|
|
// },
|
|
// {
|
|
// "label": "花都区",
|
|
// "value": "440114"
|
|
// },
|
|
// {
|
|
// "label": "南沙区",
|
|
// "value": "440115"
|
|
// },
|
|
// {
|
|
// "label": "从化区",
|
|
// "value": "440117"
|
|
// },
|
|
// {
|
|
// "label": "增城区",
|
|
// "value": "440118"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "武江区",
|
|
// "value": "440203"
|
|
// },
|
|
// {
|
|
// "label": "浈江区",
|
|
// "value": "440204"
|
|
// },
|
|
// {
|
|
// "label": "曲江区",
|
|
// "value": "440205"
|
|
// },
|
|
// {
|
|
// "label": "始兴县",
|
|
// "value": "440222"
|
|
// },
|
|
// {
|
|
// "label": "仁化县",
|
|
// "value": "440224"
|
|
// },
|
|
// {
|
|
// "label": "翁源县",
|
|
// "value": "440229"
|
|
// },
|
|
// {
|
|
// "label": "乳源瑶族自治县",
|
|
// "value": "440232"
|
|
// },
|
|
// {
|
|
// "label": "新丰县",
|
|
// "value": "440233"
|
|
// },
|
|
// {
|
|
// "label": "乐昌市",
|
|
// "value": "440281"
|
|
// },
|
|
// {
|
|
// "label": "南雄市",
|
|
// "value": "440282"
|
|
// }
|
|
// ],
|
|
[{
|
|
"label": "罗湖区",
|
|
"value": "440303"
|
|
}, {
|
|
"label": "福田区",
|
|
"value": "440304"
|
|
}, {
|
|
"label": "南山区",
|
|
"value": "440305"
|
|
}, {
|
|
"label": "宝安区",
|
|
"value": "440306"
|
|
}, {
|
|
"label": "龙岗区",
|
|
"value": "440307"
|
|
}, {
|
|
"label": "盐田区",
|
|
"value": "440308"
|
|
}, {
|
|
"label": "龙华区",
|
|
"value": "440309"
|
|
}, {
|
|
"label": "坪山区",
|
|
"value": "440310"
|
|
}]
|
|
//,
|
|
// [{
|
|
// "label": "香洲区",
|
|
// "value": "440402"
|
|
// },
|
|
// {
|
|
// "label": "斗门区",
|
|
// "value": "440403"
|
|
// },
|
|
// {
|
|
// "label": "金湾区",
|
|
// "value": "440404"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "龙湖区",
|
|
// "value": "440507"
|
|
// },
|
|
// {
|
|
// "label": "金平区",
|
|
// "value": "440511"
|
|
// },
|
|
// {
|
|
// "label": "濠江区",
|
|
// "value": "440512"
|
|
// },
|
|
// {
|
|
// "label": "潮阳区",
|
|
// "value": "440513"
|
|
// },
|
|
// {
|
|
// "label": "潮南区",
|
|
// "value": "440514"
|
|
// },
|
|
// {
|
|
// "label": "澄海区",
|
|
// "value": "440515"
|
|
// },
|
|
// {
|
|
// "label": "南澳县",
|
|
// "value": "440523"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "禅城区",
|
|
// "value": "440604"
|
|
// },
|
|
// {
|
|
// "label": "南海区",
|
|
// "value": "440605"
|
|
// },
|
|
// {
|
|
// "label": "顺德区",
|
|
// "value": "440606"
|
|
// },
|
|
// {
|
|
// "label": "三水区",
|
|
// "value": "440607"
|
|
// },
|
|
// {
|
|
// "label": "高明区",
|
|
// "value": "440608"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "蓬江区",
|
|
// "value": "440703"
|
|
// },
|
|
// {
|
|
// "label": "江海区",
|
|
// "value": "440704"
|
|
// },
|
|
// {
|
|
// "label": "新会区",
|
|
// "value": "440705"
|
|
// },
|
|
// {
|
|
// "label": "台山市",
|
|
// "value": "440781"
|
|
// },
|
|
// {
|
|
// "label": "开平市",
|
|
// "value": "440783"
|
|
// },
|
|
// {
|
|
// "label": "鹤山市",
|
|
// "value": "440784"
|
|
// },
|
|
// {
|
|
// "label": "恩平市",
|
|
// "value": "440785"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "赤坎区",
|
|
// "value": "440802"
|
|
// },
|
|
// {
|
|
// "label": "霞山区",
|
|
// "value": "440803"
|
|
// },
|
|
// {
|
|
// "label": "坡头区",
|
|
// "value": "440804"
|
|
// },
|
|
// {
|
|
// "label": "麻章区",
|
|
// "value": "440811"
|
|
// },
|
|
// {
|
|
// "label": "遂溪县",
|
|
// "value": "440823"
|
|
// },
|
|
// {
|
|
// "label": "徐闻县",
|
|
// "value": "440825"
|
|
// },
|
|
// {
|
|
// "label": "廉江市",
|
|
// "value": "440881"
|
|
// },
|
|
// {
|
|
// "label": "雷州市",
|
|
// "value": "440882"
|
|
// },
|
|
// {
|
|
// "label": "吴川市",
|
|
// "value": "440883"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "茂南区",
|
|
// "value": "440902"
|
|
// },
|
|
// {
|
|
// "label": "电白区",
|
|
// "value": "440904"
|
|
// },
|
|
// {
|
|
// "label": "高州市",
|
|
// "value": "440981"
|
|
// },
|
|
// {
|
|
// "label": "化州市",
|
|
// "value": "440982"
|
|
// },
|
|
// {
|
|
// "label": "信宜市",
|
|
// "value": "440983"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "端州区",
|
|
// "value": "441202"
|
|
// },
|
|
// {
|
|
// "label": "鼎湖区",
|
|
// "value": "441203"
|
|
// },
|
|
// {
|
|
// "label": "高要区",
|
|
// "value": "441204"
|
|
// },
|
|
// {
|
|
// "label": "广宁县",
|
|
// "value": "441223"
|
|
// },
|
|
// {
|
|
// "label": "怀集县",
|
|
// "value": "441224"
|
|
// },
|
|
// {
|
|
// "label": "封开县",
|
|
// "value": "441225"
|
|
// },
|
|
// {
|
|
// "label": "德庆县",
|
|
// "value": "441226"
|
|
// },
|
|
// {
|
|
// "label": "四会市",
|
|
// "value": "441284"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "惠城区",
|
|
// "value": "441302"
|
|
// },
|
|
// {
|
|
// "label": "惠阳区",
|
|
// "value": "441303"
|
|
// },
|
|
// {
|
|
// "label": "博罗县",
|
|
// "value": "441322"
|
|
// },
|
|
// {
|
|
// "label": "惠东县",
|
|
// "value": "441323"
|
|
// },
|
|
// {
|
|
// "label": "龙门县",
|
|
// "value": "441324"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "梅江区",
|
|
// "value": "441402"
|
|
// },
|
|
// {
|
|
// "label": "梅县区",
|
|
// "value": "441403"
|
|
// },
|
|
// {
|
|
// "label": "大埔县",
|
|
// "value": "441422"
|
|
// },
|
|
// {
|
|
// "label": "丰顺县",
|
|
// "value": "441423"
|
|
// },
|
|
// {
|
|
// "label": "五华县",
|
|
// "value": "441424"
|
|
// },
|
|
// {
|
|
// "label": "平远县",
|
|
// "value": "441426"
|
|
// },
|
|
// {
|
|
// "label": "蕉岭县",
|
|
// "value": "441427"
|
|
// },
|
|
// {
|
|
// "label": "兴宁市",
|
|
// "value": "441481"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "城区",
|
|
// "value": "441502"
|
|
// },
|
|
// {
|
|
// "label": "海丰县",
|
|
// "value": "441521"
|
|
// },
|
|
// {
|
|
// "label": "陆河县",
|
|
// "value": "441523"
|
|
// },
|
|
// {
|
|
// "label": "陆丰市",
|
|
// "value": "441581"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "源城区",
|
|
// "value": "441602"
|
|
// },
|
|
// {
|
|
// "label": "紫金县",
|
|
// "value": "441621"
|
|
// },
|
|
// {
|
|
// "label": "龙川县",
|
|
// "value": "441622"
|
|
// },
|
|
// {
|
|
// "label": "连平县",
|
|
// "value": "441623"
|
|
// },
|
|
// {
|
|
// "label": "和平县",
|
|
// "value": "441624"
|
|
// },
|
|
// {
|
|
// "label": "东源县",
|
|
// "value": "441625"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "江城区",
|
|
// "value": "441702"
|
|
// },
|
|
// {
|
|
// "label": "阳东区",
|
|
// "value": "441704"
|
|
// },
|
|
// {
|
|
// "label": "阳西县",
|
|
// "value": "441721"
|
|
// },
|
|
// {
|
|
// "label": "阳春市",
|
|
// "value": "441781"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "清城区",
|
|
// "value": "441802"
|
|
// },
|
|
// {
|
|
// "label": "清新区",
|
|
// "value": "441803"
|
|
// },
|
|
// {
|
|
// "label": "佛冈县",
|
|
// "value": "441821"
|
|
// },
|
|
// {
|
|
// "label": "阳山县",
|
|
// "value": "441823"
|
|
// },
|
|
// {
|
|
// "label": "连山壮族瑶族自治县",
|
|
// "value": "441825"
|
|
// },
|
|
// {
|
|
// "label": "连南瑶族自治县",
|
|
// "value": "441826"
|
|
// },
|
|
// {
|
|
// "label": "英德市",
|
|
// "value": "441881"
|
|
// },
|
|
// {
|
|
// "label": "连州市",
|
|
// "value": "441882"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "东莞市",
|
|
// "value": "441900"
|
|
// }],
|
|
// [{
|
|
// "label": "中山市",
|
|
// "value": "442000"
|
|
// }],
|
|
// [{
|
|
// "label": "湘桥区",
|
|
// "value": "445102"
|
|
// },
|
|
// {
|
|
// "label": "潮安区",
|
|
// "value": "445103"
|
|
// },
|
|
// {
|
|
// "label": "饶平县",
|
|
// "value": "445122"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "榕城区",
|
|
// "value": "445202"
|
|
// },
|
|
// {
|
|
// "label": "揭东区",
|
|
// "value": "445203"
|
|
// },
|
|
// {
|
|
// "label": "揭西县",
|
|
// "value": "445222"
|
|
// },
|
|
// {
|
|
// "label": "惠来县",
|
|
// "value": "445224"
|
|
// },
|
|
// {
|
|
// "label": "普宁市",
|
|
// "value": "445281"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "云城区",
|
|
// "value": "445302"
|
|
// },
|
|
// {
|
|
// "label": "云安区",
|
|
// "value": "445303"
|
|
// },
|
|
// {
|
|
// "label": "新兴县",
|
|
// "value": "445321"
|
|
// },
|
|
// {
|
|
// "label": "郁南县",
|
|
// "value": "445322"
|
|
// },
|
|
// {
|
|
// "label": "罗定市",
|
|
// "value": "445381"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "兴宁区",
|
|
// "value": "450102"
|
|
// },
|
|
// {
|
|
// "label": "青秀区",
|
|
// "value": "450103"
|
|
// },
|
|
// {
|
|
// "label": "江南区",
|
|
// "value": "450105"
|
|
// },
|
|
// {
|
|
// "label": "西乡塘区",
|
|
// "value": "450107"
|
|
// },
|
|
// {
|
|
// "label": "良庆区",
|
|
// "value": "450108"
|
|
// },
|
|
// {
|
|
// "label": "邕宁区",
|
|
// "value": "450109"
|
|
// },
|
|
// {
|
|
// "label": "武鸣区",
|
|
// "value": "450110"
|
|
// },
|
|
// {
|
|
// "label": "隆安县",
|
|
// "value": "450123"
|
|
// },
|
|
// {
|
|
// "label": "马山县",
|
|
// "value": "450124"
|
|
// },
|
|
// {
|
|
// "label": "上林县",
|
|
// "value": "450125"
|
|
// },
|
|
// {
|
|
// "label": "宾阳县",
|
|
// "value": "450126"
|
|
// },
|
|
// {
|
|
// "label": "横县",
|
|
// "value": "450127"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "城中区",
|
|
// "value": "450202"
|
|
// },
|
|
// {
|
|
// "label": "鱼峰区",
|
|
// "value": "450203"
|
|
// },
|
|
// {
|
|
// "label": "柳南区",
|
|
// "value": "450204"
|
|
// },
|
|
// {
|
|
// "label": "柳北区",
|
|
// "value": "450205"
|
|
// },
|
|
// {
|
|
// "label": "柳江区",
|
|
// "value": "450206"
|
|
// },
|
|
// {
|
|
// "label": "柳城县",
|
|
// "value": "450222"
|
|
// },
|
|
// {
|
|
// "label": "鹿寨县",
|
|
// "value": "450223"
|
|
// },
|
|
// {
|
|
// "label": "融安县",
|
|
// "value": "450224"
|
|
// },
|
|
// {
|
|
// "label": "融水苗族自治县",
|
|
// "value": "450225"
|
|
// },
|
|
// {
|
|
// "label": "三江侗族自治县",
|
|
// "value": "450226"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "秀峰区",
|
|
// "value": "450302"
|
|
// },
|
|
// {
|
|
// "label": "叠彩区",
|
|
// "value": "450303"
|
|
// },
|
|
// {
|
|
// "label": "象山区",
|
|
// "value": "450304"
|
|
// },
|
|
// {
|
|
// "label": "七星区",
|
|
// "value": "450305"
|
|
// },
|
|
// {
|
|
// "label": "雁山区",
|
|
// "value": "450311"
|
|
// },
|
|
// {
|
|
// "label": "临桂区",
|
|
// "value": "450312"
|
|
// },
|
|
// {
|
|
// "label": "阳朔县",
|
|
// "value": "450321"
|
|
// },
|
|
// {
|
|
// "label": "灵川县",
|
|
// "value": "450323"
|
|
// },
|
|
// {
|
|
// "label": "全州县",
|
|
// "value": "450324"
|
|
// },
|
|
// {
|
|
// "label": "兴安县",
|
|
// "value": "450325"
|
|
// },
|
|
// {
|
|
// "label": "永福县",
|
|
// "value": "450326"
|
|
// },
|
|
// {
|
|
// "label": "灌阳县",
|
|
// "value": "450327"
|
|
// },
|
|
// {
|
|
// "label": "龙胜各族自治县",
|
|
// "value": "450328"
|
|
// },
|
|
// {
|
|
// "label": "资源县",
|
|
// "value": "450329"
|
|
// },
|
|
// {
|
|
// "label": "平乐县",
|
|
// "value": "450330"
|
|
// },
|
|
// {
|
|
// "label": "荔浦县",
|
|
// "value": "450331"
|
|
// },
|
|
// {
|
|
// "label": "恭城瑶族自治县",
|
|
// "value": "450332"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "万秀区",
|
|
// "value": "450403"
|
|
// },
|
|
// {
|
|
// "label": "长洲区",
|
|
// "value": "450405"
|
|
// },
|
|
// {
|
|
// "label": "龙圩区",
|
|
// "value": "450406"
|
|
// },
|
|
// {
|
|
// "label": "苍梧县",
|
|
// "value": "450421"
|
|
// },
|
|
// {
|
|
// "label": "藤县",
|
|
// "value": "450422"
|
|
// },
|
|
// {
|
|
// "label": "蒙山县",
|
|
// "value": "450423"
|
|
// },
|
|
// {
|
|
// "label": "岑溪市",
|
|
// "value": "450481"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "海城区",
|
|
// "value": "450502"
|
|
// },
|
|
// {
|
|
// "label": "银海区",
|
|
// "value": "450503"
|
|
// },
|
|
// {
|
|
// "label": "铁山港区",
|
|
// "value": "450512"
|
|
// },
|
|
// {
|
|
// "label": "合浦县",
|
|
// "value": "450521"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "港口区",
|
|
// "value": "450602"
|
|
// },
|
|
// {
|
|
// "label": "防城区",
|
|
// "value": "450603"
|
|
// },
|
|
// {
|
|
// "label": "上思县",
|
|
// "value": "450621"
|
|
// },
|
|
// {
|
|
// "label": "东兴市",
|
|
// "value": "450681"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "钦南区",
|
|
// "value": "450702"
|
|
// },
|
|
// {
|
|
// "label": "钦北区",
|
|
// "value": "450703"
|
|
// },
|
|
// {
|
|
// "label": "灵山县",
|
|
// "value": "450721"
|
|
// },
|
|
// {
|
|
// "label": "浦北县",
|
|
// "value": "450722"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "港北区",
|
|
// "value": "450802"
|
|
// },
|
|
// {
|
|
// "label": "港南区",
|
|
// "value": "450803"
|
|
// },
|
|
// {
|
|
// "label": "覃塘区",
|
|
// "value": "450804"
|
|
// },
|
|
// {
|
|
// "label": "平南县",
|
|
// "value": "450821"
|
|
// },
|
|
// {
|
|
// "label": "桂平市",
|
|
// "value": "450881"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "玉州区",
|
|
// "value": "450902"
|
|
// },
|
|
// {
|
|
// "label": "福绵区",
|
|
// "value": "450903"
|
|
// },
|
|
// {
|
|
// "label": "容县",
|
|
// "value": "450921"
|
|
// },
|
|
// {
|
|
// "label": "陆川县",
|
|
// "value": "450922"
|
|
// },
|
|
// {
|
|
// "label": "博白县",
|
|
// "value": "450923"
|
|
// },
|
|
// {
|
|
// "label": "兴业县",
|
|
// "value": "450924"
|
|
// },
|
|
// {
|
|
// "label": "北流市",
|
|
// "value": "450981"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "右江区",
|
|
// "value": "451002"
|
|
// },
|
|
// {
|
|
// "label": "田阳县",
|
|
// "value": "451021"
|
|
// },
|
|
// {
|
|
// "label": "田东县",
|
|
// "value": "451022"
|
|
// },
|
|
// {
|
|
// "label": "平果县",
|
|
// "value": "451023"
|
|
// },
|
|
// {
|
|
// "label": "德保县",
|
|
// "value": "451024"
|
|
// },
|
|
// {
|
|
// "label": "那坡县",
|
|
// "value": "451026"
|
|
// },
|
|
// {
|
|
// "label": "凌云县",
|
|
// "value": "451027"
|
|
// },
|
|
// {
|
|
// "label": "乐业县",
|
|
// "value": "451028"
|
|
// },
|
|
// {
|
|
// "label": "田林县",
|
|
// "value": "451029"
|
|
// },
|
|
// {
|
|
// "label": "西林县",
|
|
// "value": "451030"
|
|
// },
|
|
// {
|
|
// "label": "隆林各族自治县",
|
|
// "value": "451031"
|
|
// },
|
|
// {
|
|
// "label": "靖西市",
|
|
// "value": "451081"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "八步区",
|
|
// "value": "451102"
|
|
// },
|
|
// {
|
|
// "label": "平桂区",
|
|
// "value": "451103"
|
|
// },
|
|
// {
|
|
// "label": "昭平县",
|
|
// "value": "451121"
|
|
// },
|
|
// {
|
|
// "label": "钟山县",
|
|
// "value": "451122"
|
|
// },
|
|
// {
|
|
// "label": "富川瑶族自治县",
|
|
// "value": "451123"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "金城江区",
|
|
// "value": "451202"
|
|
// },
|
|
// {
|
|
// "label": "宜州区",
|
|
// "value": "451203"
|
|
// },
|
|
// {
|
|
// "label": "南丹县",
|
|
// "value": "451221"
|
|
// },
|
|
// {
|
|
// "label": "天峨县",
|
|
// "value": "451222"
|
|
// },
|
|
// {
|
|
// "label": "凤山县",
|
|
// "value": "451223"
|
|
// },
|
|
// {
|
|
// "label": "东兰县",
|
|
// "value": "451224"
|
|
// },
|
|
// {
|
|
// "label": "罗城仫佬族自治县",
|
|
// "value": "451225"
|
|
// },
|
|
// {
|
|
// "label": "环江毛南族自治县",
|
|
// "value": "451226"
|
|
// },
|
|
// {
|
|
// "label": "巴马瑶族自治县",
|
|
// "value": "451227"
|
|
// },
|
|
// {
|
|
// "label": "都安瑶族自治县",
|
|
// "value": "451228"
|
|
// },
|
|
// {
|
|
// "label": "大化瑶族自治县",
|
|
// "value": "451229"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "兴宾区",
|
|
// "value": "451302"
|
|
// },
|
|
// {
|
|
// "label": "忻城县",
|
|
// "value": "451321"
|
|
// },
|
|
// {
|
|
// "label": "象州县",
|
|
// "value": "451322"
|
|
// },
|
|
// {
|
|
// "label": "武宣县",
|
|
// "value": "451323"
|
|
// },
|
|
// {
|
|
// "label": "金秀瑶族自治县",
|
|
// "value": "451324"
|
|
// },
|
|
// {
|
|
// "label": "合山市",
|
|
// "value": "451381"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "江州区",
|
|
// "value": "451402"
|
|
// },
|
|
// {
|
|
// "label": "扶绥县",
|
|
// "value": "451421"
|
|
// },
|
|
// {
|
|
// "label": "宁明县",
|
|
// "value": "451422"
|
|
// },
|
|
// {
|
|
// "label": "龙州县",
|
|
// "value": "451423"
|
|
// },
|
|
// {
|
|
// "label": "大新县",
|
|
// "value": "451424"
|
|
// },
|
|
// {
|
|
// "label": "天等县",
|
|
// "value": "451425"
|
|
// },
|
|
// {
|
|
// "label": "凭祥市",
|
|
// "value": "451481"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "秀英区",
|
|
// "value": "460105"
|
|
// },
|
|
// {
|
|
// "label": "龙华区",
|
|
// "value": "460106"
|
|
// },
|
|
// {
|
|
// "label": "琼山区",
|
|
// "value": "460107"
|
|
// },
|
|
// {
|
|
// "label": "美兰区",
|
|
// "value": "460108"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "海棠区",
|
|
// "value": "460202"
|
|
// },
|
|
// {
|
|
// "label": "吉阳区",
|
|
// "value": "460203"
|
|
// },
|
|
// {
|
|
// "label": "天涯区",
|
|
// "value": "460204"
|
|
// },
|
|
// {
|
|
// "label": "崖州区",
|
|
// "value": "460205"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "西沙群岛",
|
|
// "value": "460321"
|
|
// },
|
|
// {
|
|
// "label": "南沙群岛",
|
|
// "value": "460322"
|
|
// },
|
|
// {
|
|
// "label": "中沙群岛的岛礁及其海域",
|
|
// "value": "460323"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "儋州市",
|
|
// "value": "460400"
|
|
// }],
|
|
// [{
|
|
// "label": "五指山市",
|
|
// "value": "469001"
|
|
// },
|
|
// {
|
|
// "label": "琼海市",
|
|
// "value": "469002"
|
|
// },
|
|
// {
|
|
// "label": "文昌市",
|
|
// "value": "469005"
|
|
// },
|
|
// {
|
|
// "label": "万宁市",
|
|
// "value": "469006"
|
|
// },
|
|
// {
|
|
// "label": "东方市",
|
|
// "value": "469007"
|
|
// },
|
|
// {
|
|
// "label": "定安县",
|
|
// "value": "469021"
|
|
// },
|
|
// {
|
|
// "label": "屯昌县",
|
|
// "value": "469022"
|
|
// },
|
|
// {
|
|
// "label": "澄迈县",
|
|
// "value": "469023"
|
|
// },
|
|
// {
|
|
// "label": "临高县",
|
|
// "value": "469024"
|
|
// },
|
|
// {
|
|
// "label": "白沙黎族自治县",
|
|
// "value": "469025"
|
|
// },
|
|
// {
|
|
// "label": "昌江黎族自治县",
|
|
// "value": "469026"
|
|
// },
|
|
// {
|
|
// "label": "乐东黎族自治县",
|
|
// "value": "469027"
|
|
// },
|
|
// {
|
|
// "label": "陵水黎族自治县",
|
|
// "value": "469028"
|
|
// },
|
|
// {
|
|
// "label": "保亭黎族苗族自治县",
|
|
// "value": "469029"
|
|
// },
|
|
// {
|
|
// "label": "琼中黎族苗族自治县",
|
|
// "value": "469030"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "万州区",
|
|
// "value": "500101"
|
|
// },
|
|
// {
|
|
// "label": "涪陵区",
|
|
// "value": "500102"
|
|
// },
|
|
// {
|
|
// "label": "渝中区",
|
|
// "value": "500103"
|
|
// },
|
|
// {
|
|
// "label": "大渡口区",
|
|
// "value": "500104"
|
|
// },
|
|
// {
|
|
// "label": "江北区",
|
|
// "value": "500105"
|
|
// },
|
|
// {
|
|
// "label": "沙坪坝区",
|
|
// "value": "500106"
|
|
// },
|
|
// {
|
|
// "label": "九龙坡区",
|
|
// "value": "500107"
|
|
// },
|
|
// {
|
|
// "label": "南岸区",
|
|
// "value": "500108"
|
|
// },
|
|
// {
|
|
// "label": "北碚区",
|
|
// "value": "500109"
|
|
// },
|
|
// {
|
|
// "label": "綦江区",
|
|
// "value": "500110"
|
|
// },
|
|
// {
|
|
// "label": "大足区",
|
|
// "value": "500111"
|
|
// },
|
|
// {
|
|
// "label": "渝北区",
|
|
// "value": "500112"
|
|
// },
|
|
// {
|
|
// "label": "巴南区",
|
|
// "value": "500113"
|
|
// },
|
|
// {
|
|
// "label": "黔江区",
|
|
// "value": "500114"
|
|
// },
|
|
// {
|
|
// "label": "长寿区",
|
|
// "value": "500115"
|
|
// },
|
|
// {
|
|
// "label": "江津区",
|
|
// "value": "500116"
|
|
// },
|
|
// {
|
|
// "label": "合川区",
|
|
// "value": "500117"
|
|
// },
|
|
// {
|
|
// "label": "永川区",
|
|
// "value": "500118"
|
|
// },
|
|
// {
|
|
// "label": "南川区",
|
|
// "value": "500119"
|
|
// },
|
|
// {
|
|
// "label": "璧山区",
|
|
// "value": "500120"
|
|
// },
|
|
// {
|
|
// "label": "铜梁区",
|
|
// "value": "500151"
|
|
// },
|
|
// {
|
|
// "label": "潼南区",
|
|
// "value": "500152"
|
|
// },
|
|
// {
|
|
// "label": "荣昌区",
|
|
// "value": "500153"
|
|
// },
|
|
// {
|
|
// "label": "开州区",
|
|
// "value": "500154"
|
|
// },
|
|
// {
|
|
// "label": "梁平区",
|
|
// "value": "500155"
|
|
// },
|
|
// {
|
|
// "label": "武隆区",
|
|
// "value": "500156"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "城口县",
|
|
// "value": "500229"
|
|
// },
|
|
// {
|
|
// "label": "丰都县",
|
|
// "value": "500230"
|
|
// },
|
|
// {
|
|
// "label": "垫江县",
|
|
// "value": "500231"
|
|
// },
|
|
// {
|
|
// "label": "忠县",
|
|
// "value": "500233"
|
|
// },
|
|
// {
|
|
// "label": "云阳县",
|
|
// "value": "500235"
|
|
// },
|
|
// {
|
|
// "label": "奉节县",
|
|
// "value": "500236"
|
|
// },
|
|
// {
|
|
// "label": "巫山县",
|
|
// "value": "500237"
|
|
// },
|
|
// {
|
|
// "label": "巫溪县",
|
|
// "value": "500238"
|
|
// },
|
|
// {
|
|
// "label": "石柱土家族自治县",
|
|
// "value": "500240"
|
|
// },
|
|
// {
|
|
// "label": "秀山土家族苗族自治县",
|
|
// "value": "500241"
|
|
// },
|
|
// {
|
|
// "label": "酉阳土家族苗族自治县",
|
|
// "value": "500242"
|
|
// },
|
|
// {
|
|
// "label": "彭水苗族土家族自治县",
|
|
// "value": "500243"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "锦江区",
|
|
// "value": "510104"
|
|
// },
|
|
// {
|
|
// "label": "青羊区",
|
|
// "value": "510105"
|
|
// },
|
|
// {
|
|
// "label": "金牛区",
|
|
// "value": "510106"
|
|
// },
|
|
// {
|
|
// "label": "武侯区",
|
|
// "value": "510107"
|
|
// },
|
|
// {
|
|
// "label": "成华区",
|
|
// "value": "510108"
|
|
// },
|
|
// {
|
|
// "label": "龙泉驿区",
|
|
// "value": "510112"
|
|
// },
|
|
// {
|
|
// "label": "青白江区",
|
|
// "value": "510113"
|
|
// },
|
|
// {
|
|
// "label": "新都区",
|
|
// "value": "510114"
|
|
// },
|
|
// {
|
|
// "label": "温江区",
|
|
// "value": "510115"
|
|
// },
|
|
// {
|
|
// "label": "双流区",
|
|
// "value": "510116"
|
|
// },
|
|
// {
|
|
// "label": "郫都区",
|
|
// "value": "510117"
|
|
// },
|
|
// {
|
|
// "label": "金堂县",
|
|
// "value": "510121"
|
|
// },
|
|
// {
|
|
// "label": "大邑县",
|
|
// "value": "510129"
|
|
// },
|
|
// {
|
|
// "label": "蒲江县",
|
|
// "value": "510131"
|
|
// },
|
|
// {
|
|
// "label": "新津县",
|
|
// "value": "510132"
|
|
// },
|
|
// {
|
|
// "label": "都江堰市",
|
|
// "value": "510181"
|
|
// },
|
|
// {
|
|
// "label": "彭州市",
|
|
// "value": "510182"
|
|
// },
|
|
// {
|
|
// "label": "邛崃市",
|
|
// "value": "510183"
|
|
// },
|
|
// {
|
|
// "label": "崇州市",
|
|
// "value": "510184"
|
|
// },
|
|
// {
|
|
// "label": "简阳市",
|
|
// "value": "510185"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "自流井区",
|
|
// "value": "510302"
|
|
// },
|
|
// {
|
|
// "label": "贡井区",
|
|
// "value": "510303"
|
|
// },
|
|
// {
|
|
// "label": "大安区",
|
|
// "value": "510304"
|
|
// },
|
|
// {
|
|
// "label": "沿滩区",
|
|
// "value": "510311"
|
|
// },
|
|
// {
|
|
// "label": "荣县",
|
|
// "value": "510321"
|
|
// },
|
|
// {
|
|
// "label": "富顺县",
|
|
// "value": "510322"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "东区",
|
|
// "value": "510402"
|
|
// },
|
|
// {
|
|
// "label": "西区",
|
|
// "value": "510403"
|
|
// },
|
|
// {
|
|
// "label": "仁和区",
|
|
// "value": "510411"
|
|
// },
|
|
// {
|
|
// "label": "米易县",
|
|
// "value": "510421"
|
|
// },
|
|
// {
|
|
// "label": "盐边县",
|
|
// "value": "510422"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "江阳区",
|
|
// "value": "510502"
|
|
// },
|
|
// {
|
|
// "label": "纳溪区",
|
|
// "value": "510503"
|
|
// },
|
|
// {
|
|
// "label": "龙马潭区",
|
|
// "value": "510504"
|
|
// },
|
|
// {
|
|
// "label": "泸县",
|
|
// "value": "510521"
|
|
// },
|
|
// {
|
|
// "label": "合江县",
|
|
// "value": "510522"
|
|
// },
|
|
// {
|
|
// "label": "叙永县",
|
|
// "value": "510524"
|
|
// },
|
|
// {
|
|
// "label": "古蔺县",
|
|
// "value": "510525"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "旌阳区",
|
|
// "value": "510603"
|
|
// },
|
|
// {
|
|
// "label": "罗江区",
|
|
// "value": "510604"
|
|
// },
|
|
// {
|
|
// "label": "中江县",
|
|
// "value": "510623"
|
|
// },
|
|
// {
|
|
// "label": "广汉市",
|
|
// "value": "510681"
|
|
// },
|
|
// {
|
|
// "label": "什邡市",
|
|
// "value": "510682"
|
|
// },
|
|
// {
|
|
// "label": "绵竹市",
|
|
// "value": "510683"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "涪城区",
|
|
// "value": "510703"
|
|
// },
|
|
// {
|
|
// "label": "游仙区",
|
|
// "value": "510704"
|
|
// },
|
|
// {
|
|
// "label": "安州区",
|
|
// "value": "510705"
|
|
// },
|
|
// {
|
|
// "label": "三台县",
|
|
// "value": "510722"
|
|
// },
|
|
// {
|
|
// "label": "盐亭县",
|
|
// "value": "510723"
|
|
// },
|
|
// {
|
|
// "label": "梓潼县",
|
|
// "value": "510725"
|
|
// },
|
|
// {
|
|
// "label": "北川羌族自治县",
|
|
// "value": "510726"
|
|
// },
|
|
// {
|
|
// "label": "平武县",
|
|
// "value": "510727"
|
|
// },
|
|
// {
|
|
// "label": "江油市",
|
|
// "value": "510781"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "利州区",
|
|
// "value": "510802"
|
|
// },
|
|
// {
|
|
// "label": "昭化区",
|
|
// "value": "510811"
|
|
// },
|
|
// {
|
|
// "label": "朝天区",
|
|
// "value": "510812"
|
|
// },
|
|
// {
|
|
// "label": "旺苍县",
|
|
// "value": "510821"
|
|
// },
|
|
// {
|
|
// "label": "青川县",
|
|
// "value": "510822"
|
|
// },
|
|
// {
|
|
// "label": "剑阁县",
|
|
// "value": "510823"
|
|
// },
|
|
// {
|
|
// "label": "苍溪县",
|
|
// "value": "510824"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "船山区",
|
|
// "value": "510903"
|
|
// },
|
|
// {
|
|
// "label": "安居区",
|
|
// "value": "510904"
|
|
// },
|
|
// {
|
|
// "label": "蓬溪县",
|
|
// "value": "510921"
|
|
// },
|
|
// {
|
|
// "label": "射洪县",
|
|
// "value": "510922"
|
|
// },
|
|
// {
|
|
// "label": "大英县",
|
|
// "value": "510923"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "市中区",
|
|
// "value": "511002"
|
|
// },
|
|
// {
|
|
// "label": "东兴区",
|
|
// "value": "511011"
|
|
// },
|
|
// {
|
|
// "label": "威远县",
|
|
// "value": "511024"
|
|
// },
|
|
// {
|
|
// "label": "资中县",
|
|
// "value": "511025"
|
|
// },
|
|
// {
|
|
// "label": "内江经济开发区",
|
|
// "value": "511071"
|
|
// },
|
|
// {
|
|
// "label": "隆昌市",
|
|
// "value": "511083"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "市中区",
|
|
// "value": "511102"
|
|
// },
|
|
// {
|
|
// "label": "沙湾区",
|
|
// "value": "511111"
|
|
// },
|
|
// {
|
|
// "label": "五通桥区",
|
|
// "value": "511112"
|
|
// },
|
|
// {
|
|
// "label": "金口河区",
|
|
// "value": "511113"
|
|
// },
|
|
// {
|
|
// "label": "犍为县",
|
|
// "value": "511123"
|
|
// },
|
|
// {
|
|
// "label": "井研县",
|
|
// "value": "511124"
|
|
// },
|
|
// {
|
|
// "label": "夹江县",
|
|
// "value": "511126"
|
|
// },
|
|
// {
|
|
// "label": "沐川县",
|
|
// "value": "511129"
|
|
// },
|
|
// {
|
|
// "label": "峨边彝族自治县",
|
|
// "value": "511132"
|
|
// },
|
|
// {
|
|
// "label": "马边彝族自治县",
|
|
// "value": "511133"
|
|
// },
|
|
// {
|
|
// "label": "峨眉山市",
|
|
// "value": "511181"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "顺庆区",
|
|
// "value": "511302"
|
|
// },
|
|
// {
|
|
// "label": "高坪区",
|
|
// "value": "511303"
|
|
// },
|
|
// {
|
|
// "label": "嘉陵区",
|
|
// "value": "511304"
|
|
// },
|
|
// {
|
|
// "label": "南部县",
|
|
// "value": "511321"
|
|
// },
|
|
// {
|
|
// "label": "营山县",
|
|
// "value": "511322"
|
|
// },
|
|
// {
|
|
// "label": "蓬安县",
|
|
// "value": "511323"
|
|
// },
|
|
// {
|
|
// "label": "仪陇县",
|
|
// "value": "511324"
|
|
// },
|
|
// {
|
|
// "label": "西充县",
|
|
// "value": "511325"
|
|
// },
|
|
// {
|
|
// "label": "阆中市",
|
|
// "value": "511381"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "东坡区",
|
|
// "value": "511402"
|
|
// },
|
|
// {
|
|
// "label": "彭山区",
|
|
// "value": "511403"
|
|
// },
|
|
// {
|
|
// "label": "仁寿县",
|
|
// "value": "511421"
|
|
// },
|
|
// {
|
|
// "label": "洪雅县",
|
|
// "value": "511423"
|
|
// },
|
|
// {
|
|
// "label": "丹棱县",
|
|
// "value": "511424"
|
|
// },
|
|
// {
|
|
// "label": "青神县",
|
|
// "value": "511425"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "翠屏区",
|
|
// "value": "511502"
|
|
// },
|
|
// {
|
|
// "label": "南溪区",
|
|
// "value": "511503"
|
|
// },
|
|
// {
|
|
// "label": "宜宾县",
|
|
// "value": "511521"
|
|
// },
|
|
// {
|
|
// "label": "江安县",
|
|
// "value": "511523"
|
|
// },
|
|
// {
|
|
// "label": "长宁县",
|
|
// "value": "511524"
|
|
// },
|
|
// {
|
|
// "label": "高县",
|
|
// "value": "511525"
|
|
// },
|
|
// {
|
|
// "label": "珙县",
|
|
// "value": "511526"
|
|
// },
|
|
// {
|
|
// "label": "筠连县",
|
|
// "value": "511527"
|
|
// },
|
|
// {
|
|
// "label": "兴文县",
|
|
// "value": "511528"
|
|
// },
|
|
// {
|
|
// "label": "屏山县",
|
|
// "value": "511529"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "广安区",
|
|
// "value": "511602"
|
|
// },
|
|
// {
|
|
// "label": "前锋区",
|
|
// "value": "511603"
|
|
// },
|
|
// {
|
|
// "label": "岳池县",
|
|
// "value": "511621"
|
|
// },
|
|
// {
|
|
// "label": "武胜县",
|
|
// "value": "511622"
|
|
// },
|
|
// {
|
|
// "label": "邻水县",
|
|
// "value": "511623"
|
|
// },
|
|
// {
|
|
// "label": "华蓥市",
|
|
// "value": "511681"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "通川区",
|
|
// "value": "511702"
|
|
// },
|
|
// {
|
|
// "label": "达川区",
|
|
// "value": "511703"
|
|
// },
|
|
// {
|
|
// "label": "宣汉县",
|
|
// "value": "511722"
|
|
// },
|
|
// {
|
|
// "label": "开江县",
|
|
// "value": "511723"
|
|
// },
|
|
// {
|
|
// "label": "大竹县",
|
|
// "value": "511724"
|
|
// },
|
|
// {
|
|
// "label": "渠县",
|
|
// "value": "511725"
|
|
// },
|
|
// {
|
|
// "label": "达州经济开发区",
|
|
// "value": "511771"
|
|
// },
|
|
// {
|
|
// "label": "万源市",
|
|
// "value": "511781"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "雨城区",
|
|
// "value": "511802"
|
|
// },
|
|
// {
|
|
// "label": "名山区",
|
|
// "value": "511803"
|
|
// },
|
|
// {
|
|
// "label": "荥经县",
|
|
// "value": "511822"
|
|
// },
|
|
// {
|
|
// "label": "汉源县",
|
|
// "value": "511823"
|
|
// },
|
|
// {
|
|
// "label": "石棉县",
|
|
// "value": "511824"
|
|
// },
|
|
// {
|
|
// "label": "天全县",
|
|
// "value": "511825"
|
|
// },
|
|
// {
|
|
// "label": "芦山县",
|
|
// "value": "511826"
|
|
// },
|
|
// {
|
|
// "label": "宝兴县",
|
|
// "value": "511827"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "巴州区",
|
|
// "value": "511902"
|
|
// },
|
|
// {
|
|
// "label": "恩阳区",
|
|
// "value": "511903"
|
|
// },
|
|
// {
|
|
// "label": "通江县",
|
|
// "value": "511921"
|
|
// },
|
|
// {
|
|
// "label": "南江县",
|
|
// "value": "511922"
|
|
// },
|
|
// {
|
|
// "label": "平昌县",
|
|
// "value": "511923"
|
|
// },
|
|
// {
|
|
// "label": "巴中经济开发区",
|
|
// "value": "511971"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "雁江区",
|
|
// "value": "512002"
|
|
// },
|
|
// {
|
|
// "label": "安岳县",
|
|
// "value": "512021"
|
|
// },
|
|
// {
|
|
// "label": "乐至县",
|
|
// "value": "512022"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "马尔康市",
|
|
// "value": "513201"
|
|
// },
|
|
// {
|
|
// "label": "汶川县",
|
|
// "value": "513221"
|
|
// },
|
|
// {
|
|
// "label": "理县",
|
|
// "value": "513222"
|
|
// },
|
|
// {
|
|
// "label": "茂县",
|
|
// "value": "513223"
|
|
// },
|
|
// {
|
|
// "label": "松潘县",
|
|
// "value": "513224"
|
|
// },
|
|
// {
|
|
// "label": "九寨沟县",
|
|
// "value": "513225"
|
|
// },
|
|
// {
|
|
// "label": "金川县",
|
|
// "value": "513226"
|
|
// },
|
|
// {
|
|
// "label": "小金县",
|
|
// "value": "513227"
|
|
// },
|
|
// {
|
|
// "label": "黑水县",
|
|
// "value": "513228"
|
|
// },
|
|
// {
|
|
// "label": "壤塘县",
|
|
// "value": "513230"
|
|
// },
|
|
// {
|
|
// "label": "阿坝县",
|
|
// "value": "513231"
|
|
// },
|
|
// {
|
|
// "label": "若尔盖县",
|
|
// "value": "513232"
|
|
// },
|
|
// {
|
|
// "label": "红原县",
|
|
// "value": "513233"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "康定市",
|
|
// "value": "513301"
|
|
// },
|
|
// {
|
|
// "label": "泸定县",
|
|
// "value": "513322"
|
|
// },
|
|
// {
|
|
// "label": "丹巴县",
|
|
// "value": "513323"
|
|
// },
|
|
// {
|
|
// "label": "九龙县",
|
|
// "value": "513324"
|
|
// },
|
|
// {
|
|
// "label": "雅江县",
|
|
// "value": "513325"
|
|
// },
|
|
// {
|
|
// "label": "道孚县",
|
|
// "value": "513326"
|
|
// },
|
|
// {
|
|
// "label": "炉霍县",
|
|
// "value": "513327"
|
|
// },
|
|
// {
|
|
// "label": "甘孜县",
|
|
// "value": "513328"
|
|
// },
|
|
// {
|
|
// "label": "新龙县",
|
|
// "value": "513329"
|
|
// },
|
|
// {
|
|
// "label": "德格县",
|
|
// "value": "513330"
|
|
// },
|
|
// {
|
|
// "label": "白玉县",
|
|
// "value": "513331"
|
|
// },
|
|
// {
|
|
// "label": "石渠县",
|
|
// "value": "513332"
|
|
// },
|
|
// {
|
|
// "label": "色达县",
|
|
// "value": "513333"
|
|
// },
|
|
// {
|
|
// "label": "理塘县",
|
|
// "value": "513334"
|
|
// },
|
|
// {
|
|
// "label": "巴塘县",
|
|
// "value": "513335"
|
|
// },
|
|
// {
|
|
// "label": "乡城县",
|
|
// "value": "513336"
|
|
// },
|
|
// {
|
|
// "label": "稻城县",
|
|
// "value": "513337"
|
|
// },
|
|
// {
|
|
// "label": "得荣县",
|
|
// "value": "513338"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "西昌市",
|
|
// "value": "513401"
|
|
// },
|
|
// {
|
|
// "label": "木里藏族自治县",
|
|
// "value": "513422"
|
|
// },
|
|
// {
|
|
// "label": "盐源县",
|
|
// "value": "513423"
|
|
// },
|
|
// {
|
|
// "label": "德昌县",
|
|
// "value": "513424"
|
|
// },
|
|
// {
|
|
// "label": "会理县",
|
|
// "value": "513425"
|
|
// },
|
|
// {
|
|
// "label": "会东县",
|
|
// "value": "513426"
|
|
// },
|
|
// {
|
|
// "label": "宁南县",
|
|
// "value": "513427"
|
|
// },
|
|
// {
|
|
// "label": "普格县",
|
|
// "value": "513428"
|
|
// },
|
|
// {
|
|
// "label": "布拖县",
|
|
// "value": "513429"
|
|
// },
|
|
// {
|
|
// "label": "金阳县",
|
|
// "value": "513430"
|
|
// },
|
|
// {
|
|
// "label": "昭觉县",
|
|
// "value": "513431"
|
|
// },
|
|
// {
|
|
// "label": "喜德县",
|
|
// "value": "513432"
|
|
// },
|
|
// {
|
|
// "label": "冕宁县",
|
|
// "value": "513433"
|
|
// },
|
|
// {
|
|
// "label": "越西县",
|
|
// "value": "513434"
|
|
// },
|
|
// {
|
|
// "label": "甘洛县",
|
|
// "value": "513435"
|
|
// },
|
|
// {
|
|
// "label": "美姑县",
|
|
// "value": "513436"
|
|
// },
|
|
// {
|
|
// "label": "雷波县",
|
|
// "value": "513437"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "南明区",
|
|
// "value": "520102"
|
|
// },
|
|
// {
|
|
// "label": "云岩区",
|
|
// "value": "520103"
|
|
// },
|
|
// {
|
|
// "label": "花溪区",
|
|
// "value": "520111"
|
|
// },
|
|
// {
|
|
// "label": "乌当区",
|
|
// "value": "520112"
|
|
// },
|
|
// {
|
|
// "label": "白云区",
|
|
// "value": "520113"
|
|
// },
|
|
// {
|
|
// "label": "观山湖区",
|
|
// "value": "520115"
|
|
// },
|
|
// {
|
|
// "label": "开阳县",
|
|
// "value": "520121"
|
|
// },
|
|
// {
|
|
// "label": "息烽县",
|
|
// "value": "520122"
|
|
// },
|
|
// {
|
|
// "label": "修文县",
|
|
// "value": "520123"
|
|
// },
|
|
// {
|
|
// "label": "清镇市",
|
|
// "value": "520181"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "钟山区",
|
|
// "value": "520201"
|
|
// },
|
|
// {
|
|
// "label": "六枝特区",
|
|
// "value": "520203"
|
|
// },
|
|
// {
|
|
// "label": "水城县",
|
|
// "value": "520221"
|
|
// },
|
|
// {
|
|
// "label": "盘州市",
|
|
// "value": "520281"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "红花岗区",
|
|
// "value": "520302"
|
|
// },
|
|
// {
|
|
// "label": "汇川区",
|
|
// "value": "520303"
|
|
// },
|
|
// {
|
|
// "label": "播州区",
|
|
// "value": "520304"
|
|
// },
|
|
// {
|
|
// "label": "桐梓县",
|
|
// "value": "520322"
|
|
// },
|
|
// {
|
|
// "label": "绥阳县",
|
|
// "value": "520323"
|
|
// },
|
|
// {
|
|
// "label": "正安县",
|
|
// "value": "520324"
|
|
// },
|
|
// {
|
|
// "label": "道真仡佬族苗族自治县",
|
|
// "value": "520325"
|
|
// },
|
|
// {
|
|
// "label": "务川仡佬族苗族自治县",
|
|
// "value": "520326"
|
|
// },
|
|
// {
|
|
// "label": "凤冈县",
|
|
// "value": "520327"
|
|
// },
|
|
// {
|
|
// "label": "湄潭县",
|
|
// "value": "520328"
|
|
// },
|
|
// {
|
|
// "label": "余庆县",
|
|
// "value": "520329"
|
|
// },
|
|
// {
|
|
// "label": "习水县",
|
|
// "value": "520330"
|
|
// },
|
|
// {
|
|
// "label": "赤水市",
|
|
// "value": "520381"
|
|
// },
|
|
// {
|
|
// "label": "仁怀市",
|
|
// "value": "520382"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "西秀区",
|
|
// "value": "520402"
|
|
// },
|
|
// {
|
|
// "label": "平坝区",
|
|
// "value": "520403"
|
|
// },
|
|
// {
|
|
// "label": "普定县",
|
|
// "value": "520422"
|
|
// },
|
|
// {
|
|
// "label": "镇宁布依族苗族自治县",
|
|
// "value": "520423"
|
|
// },
|
|
// {
|
|
// "label": "关岭布依族苗族自治县",
|
|
// "value": "520424"
|
|
// },
|
|
// {
|
|
// "label": "紫云苗族布依族自治县",
|
|
// "value": "520425"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "七星关区",
|
|
// "value": "520502"
|
|
// },
|
|
// {
|
|
// "label": "大方县",
|
|
// "value": "520521"
|
|
// },
|
|
// {
|
|
// "label": "黔西县",
|
|
// "value": "520522"
|
|
// },
|
|
// {
|
|
// "label": "金沙县",
|
|
// "value": "520523"
|
|
// },
|
|
// {
|
|
// "label": "织金县",
|
|
// "value": "520524"
|
|
// },
|
|
// {
|
|
// "label": "纳雍县",
|
|
// "value": "520525"
|
|
// },
|
|
// {
|
|
// "label": "威宁彝族回族苗族自治县",
|
|
// "value": "520526"
|
|
// },
|
|
// {
|
|
// "label": "赫章县",
|
|
// "value": "520527"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "碧江区",
|
|
// "value": "520602"
|
|
// },
|
|
// {
|
|
// "label": "万山区",
|
|
// "value": "520603"
|
|
// },
|
|
// {
|
|
// "label": "江口县",
|
|
// "value": "520621"
|
|
// },
|
|
// {
|
|
// "label": "玉屏侗族自治县",
|
|
// "value": "520622"
|
|
// },
|
|
// {
|
|
// "label": "石阡县",
|
|
// "value": "520623"
|
|
// },
|
|
// {
|
|
// "label": "思南县",
|
|
// "value": "520624"
|
|
// },
|
|
// {
|
|
// "label": "印江土家族苗族自治县",
|
|
// "value": "520625"
|
|
// },
|
|
// {
|
|
// "label": "德江县",
|
|
// "value": "520626"
|
|
// },
|
|
// {
|
|
// "label": "沿河土家族自治县",
|
|
// "value": "520627"
|
|
// },
|
|
// {
|
|
// "label": "松桃苗族自治县",
|
|
// "value": "520628"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "兴义市",
|
|
// "value": "522301"
|
|
// },
|
|
// {
|
|
// "label": "兴仁县",
|
|
// "value": "522322"
|
|
// },
|
|
// {
|
|
// "label": "普安县",
|
|
// "value": "522323"
|
|
// },
|
|
// {
|
|
// "label": "晴隆县",
|
|
// "value": "522324"
|
|
// },
|
|
// {
|
|
// "label": "贞丰县",
|
|
// "value": "522325"
|
|
// },
|
|
// {
|
|
// "label": "望谟县",
|
|
// "value": "522326"
|
|
// },
|
|
// {
|
|
// "label": "册亨县",
|
|
// "value": "522327"
|
|
// },
|
|
// {
|
|
// "label": "安龙县",
|
|
// "value": "522328"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "凯里市",
|
|
// "value": "522601"
|
|
// },
|
|
// {
|
|
// "label": "黄平县",
|
|
// "value": "522622"
|
|
// },
|
|
// {
|
|
// "label": "施秉县",
|
|
// "value": "522623"
|
|
// },
|
|
// {
|
|
// "label": "三穗县",
|
|
// "value": "522624"
|
|
// },
|
|
// {
|
|
// "label": "镇远县",
|
|
// "value": "522625"
|
|
// },
|
|
// {
|
|
// "label": "岑巩县",
|
|
// "value": "522626"
|
|
// },
|
|
// {
|
|
// "label": "天柱县",
|
|
// "value": "522627"
|
|
// },
|
|
// {
|
|
// "label": "锦屏县",
|
|
// "value": "522628"
|
|
// },
|
|
// {
|
|
// "label": "剑河县",
|
|
// "value": "522629"
|
|
// },
|
|
// {
|
|
// "label": "台江县",
|
|
// "value": "522630"
|
|
// },
|
|
// {
|
|
// "label": "黎平县",
|
|
// "value": "522631"
|
|
// },
|
|
// {
|
|
// "label": "榕江县",
|
|
// "value": "522632"
|
|
// },
|
|
// {
|
|
// "label": "从江县",
|
|
// "value": "522633"
|
|
// },
|
|
// {
|
|
// "label": "雷山县",
|
|
// "value": "522634"
|
|
// },
|
|
// {
|
|
// "label": "麻江县",
|
|
// "value": "522635"
|
|
// },
|
|
// {
|
|
// "label": "丹寨县",
|
|
// "value": "522636"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "都匀市",
|
|
// "value": "522701"
|
|
// },
|
|
// {
|
|
// "label": "福泉市",
|
|
// "value": "522702"
|
|
// },
|
|
// {
|
|
// "label": "荔波县",
|
|
// "value": "522722"
|
|
// },
|
|
// {
|
|
// "label": "贵定县",
|
|
// "value": "522723"
|
|
// },
|
|
// {
|
|
// "label": "瓮安县",
|
|
// "value": "522725"
|
|
// },
|
|
// {
|
|
// "label": "独山县",
|
|
// "value": "522726"
|
|
// },
|
|
// {
|
|
// "label": "平塘县",
|
|
// "value": "522727"
|
|
// },
|
|
// {
|
|
// "label": "罗甸县",
|
|
// "value": "522728"
|
|
// },
|
|
// {
|
|
// "label": "长顺县",
|
|
// "value": "522729"
|
|
// },
|
|
// {
|
|
// "label": "龙里县",
|
|
// "value": "522730"
|
|
// },
|
|
// {
|
|
// "label": "惠水县",
|
|
// "value": "522731"
|
|
// },
|
|
// {
|
|
// "label": "三都水族自治县",
|
|
// "value": "522732"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "五华区",
|
|
// "value": "530102"
|
|
// },
|
|
// {
|
|
// "label": "盘龙区",
|
|
// "value": "530103"
|
|
// },
|
|
// {
|
|
// "label": "官渡区",
|
|
// "value": "530111"
|
|
// },
|
|
// {
|
|
// "label": "西山区",
|
|
// "value": "530112"
|
|
// },
|
|
// {
|
|
// "label": "东川区",
|
|
// "value": "530113"
|
|
// },
|
|
// {
|
|
// "label": "呈贡区",
|
|
// "value": "530114"
|
|
// },
|
|
// {
|
|
// "label": "晋宁区",
|
|
// "value": "530115"
|
|
// },
|
|
// {
|
|
// "label": "富民县",
|
|
// "value": "530124"
|
|
// },
|
|
// {
|
|
// "label": "宜良县",
|
|
// "value": "530125"
|
|
// },
|
|
// {
|
|
// "label": "石林彝族自治县",
|
|
// "value": "530126"
|
|
// },
|
|
// {
|
|
// "label": "嵩明县",
|
|
// "value": "530127"
|
|
// },
|
|
// {
|
|
// "label": "禄劝彝族苗族自治县",
|
|
// "value": "530128"
|
|
// },
|
|
// {
|
|
// "label": "寻甸回族彝族自治县",
|
|
// "value": "530129"
|
|
// },
|
|
// {
|
|
// "label": "安宁市",
|
|
// "value": "530181"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "麒麟区",
|
|
// "value": "530302"
|
|
// },
|
|
// {
|
|
// "label": "沾益区",
|
|
// "value": "530303"
|
|
// },
|
|
// {
|
|
// "label": "马龙县",
|
|
// "value": "530321"
|
|
// },
|
|
// {
|
|
// "label": "陆良县",
|
|
// "value": "530322"
|
|
// },
|
|
// {
|
|
// "label": "师宗县",
|
|
// "value": "530323"
|
|
// },
|
|
// {
|
|
// "label": "罗平县",
|
|
// "value": "530324"
|
|
// },
|
|
// {
|
|
// "label": "富源县",
|
|
// "value": "530325"
|
|
// },
|
|
// {
|
|
// "label": "会泽县",
|
|
// "value": "530326"
|
|
// },
|
|
// {
|
|
// "label": "宣威市",
|
|
// "value": "530381"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "红塔区",
|
|
// "value": "530402"
|
|
// },
|
|
// {
|
|
// "label": "江川区",
|
|
// "value": "530403"
|
|
// },
|
|
// {
|
|
// "label": "澄江县",
|
|
// "value": "530422"
|
|
// },
|
|
// {
|
|
// "label": "通海县",
|
|
// "value": "530423"
|
|
// },
|
|
// {
|
|
// "label": "华宁县",
|
|
// "value": "530424"
|
|
// },
|
|
// {
|
|
// "label": "易门县",
|
|
// "value": "530425"
|
|
// },
|
|
// {
|
|
// "label": "峨山彝族自治县",
|
|
// "value": "530426"
|
|
// },
|
|
// {
|
|
// "label": "新平彝族傣族自治县",
|
|
// "value": "530427"
|
|
// },
|
|
// {
|
|
// "label": "元江哈尼族彝族傣族自治县",
|
|
// "value": "530428"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "隆阳区",
|
|
// "value": "530502"
|
|
// },
|
|
// {
|
|
// "label": "施甸县",
|
|
// "value": "530521"
|
|
// },
|
|
// {
|
|
// "label": "龙陵县",
|
|
// "value": "530523"
|
|
// },
|
|
// {
|
|
// "label": "昌宁县",
|
|
// "value": "530524"
|
|
// },
|
|
// {
|
|
// "label": "腾冲市",
|
|
// "value": "530581"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "昭阳区",
|
|
// "value": "530602"
|
|
// },
|
|
// {
|
|
// "label": "鲁甸县",
|
|
// "value": "530621"
|
|
// },
|
|
// {
|
|
// "label": "巧家县",
|
|
// "value": "530622"
|
|
// },
|
|
// {
|
|
// "label": "盐津县",
|
|
// "value": "530623"
|
|
// },
|
|
// {
|
|
// "label": "大关县",
|
|
// "value": "530624"
|
|
// },
|
|
// {
|
|
// "label": "永善县",
|
|
// "value": "530625"
|
|
// },
|
|
// {
|
|
// "label": "绥江县",
|
|
// "value": "530626"
|
|
// },
|
|
// {
|
|
// "label": "镇雄县",
|
|
// "value": "530627"
|
|
// },
|
|
// {
|
|
// "label": "彝良县",
|
|
// "value": "530628"
|
|
// },
|
|
// {
|
|
// "label": "威信县",
|
|
// "value": "530629"
|
|
// },
|
|
// {
|
|
// "label": "水富县",
|
|
// "value": "530630"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "古城区",
|
|
// "value": "530702"
|
|
// },
|
|
// {
|
|
// "label": "玉龙纳西族自治县",
|
|
// "value": "530721"
|
|
// },
|
|
// {
|
|
// "label": "永胜县",
|
|
// "value": "530722"
|
|
// },
|
|
// {
|
|
// "label": "华坪县",
|
|
// "value": "530723"
|
|
// },
|
|
// {
|
|
// "label": "宁蒗彝族自治县",
|
|
// "value": "530724"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "思茅区",
|
|
// "value": "530802"
|
|
// },
|
|
// {
|
|
// "label": "宁洱哈尼族彝族自治县",
|
|
// "value": "530821"
|
|
// },
|
|
// {
|
|
// "label": "墨江哈尼族自治县",
|
|
// "value": "530822"
|
|
// },
|
|
// {
|
|
// "label": "景东彝族自治县",
|
|
// "value": "530823"
|
|
// },
|
|
// {
|
|
// "label": "景谷傣族彝族自治县",
|
|
// "value": "530824"
|
|
// },
|
|
// {
|
|
// "label": "镇沅彝族哈尼族拉祜族自治县",
|
|
// "value": "530825"
|
|
// },
|
|
// {
|
|
// "label": "江城哈尼族彝族自治县",
|
|
// "value": "530826"
|
|
// },
|
|
// {
|
|
// "label": "孟连傣族拉祜族佤族自治县",
|
|
// "value": "530827"
|
|
// },
|
|
// {
|
|
// "label": "澜沧拉祜族自治县",
|
|
// "value": "530828"
|
|
// },
|
|
// {
|
|
// "label": "西盟佤族自治县",
|
|
// "value": "530829"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "临翔区",
|
|
// "value": "530902"
|
|
// },
|
|
// {
|
|
// "label": "凤庆县",
|
|
// "value": "530921"
|
|
// },
|
|
// {
|
|
// "label": "云县",
|
|
// "value": "530922"
|
|
// },
|
|
// {
|
|
// "label": "永德县",
|
|
// "value": "530923"
|
|
// },
|
|
// {
|
|
// "label": "镇康县",
|
|
// "value": "530924"
|
|
// },
|
|
// {
|
|
// "label": "双江拉祜族佤族布朗族傣族自治县",
|
|
// "value": "530925"
|
|
// },
|
|
// {
|
|
// "label": "耿马傣族佤族自治县",
|
|
// "value": "530926"
|
|
// },
|
|
// {
|
|
// "label": "沧源佤族自治县",
|
|
// "value": "530927"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "楚雄市",
|
|
// "value": "532301"
|
|
// },
|
|
// {
|
|
// "label": "双柏县",
|
|
// "value": "532322"
|
|
// },
|
|
// {
|
|
// "label": "牟定县",
|
|
// "value": "532323"
|
|
// },
|
|
// {
|
|
// "label": "南华县",
|
|
// "value": "532324"
|
|
// },
|
|
// {
|
|
// "label": "姚安县",
|
|
// "value": "532325"
|
|
// },
|
|
// {
|
|
// "label": "大姚县",
|
|
// "value": "532326"
|
|
// },
|
|
// {
|
|
// "label": "永仁县",
|
|
// "value": "532327"
|
|
// },
|
|
// {
|
|
// "label": "元谋县",
|
|
// "value": "532328"
|
|
// },
|
|
// {
|
|
// "label": "武定县",
|
|
// "value": "532329"
|
|
// },
|
|
// {
|
|
// "label": "禄丰县",
|
|
// "value": "532331"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "个旧市",
|
|
// "value": "532501"
|
|
// },
|
|
// {
|
|
// "label": "开远市",
|
|
// "value": "532502"
|
|
// },
|
|
// {
|
|
// "label": "蒙自市",
|
|
// "value": "532503"
|
|
// },
|
|
// {
|
|
// "label": "弥勒市",
|
|
// "value": "532504"
|
|
// },
|
|
// {
|
|
// "label": "屏边苗族自治县",
|
|
// "value": "532523"
|
|
// },
|
|
// {
|
|
// "label": "建水县",
|
|
// "value": "532524"
|
|
// },
|
|
// {
|
|
// "label": "石屏县",
|
|
// "value": "532525"
|
|
// },
|
|
// {
|
|
// "label": "泸西县",
|
|
// "value": "532527"
|
|
// },
|
|
// {
|
|
// "label": "元阳县",
|
|
// "value": "532528"
|
|
// },
|
|
// {
|
|
// "label": "红河县",
|
|
// "value": "532529"
|
|
// },
|
|
// {
|
|
// "label": "金平苗族瑶族傣族自治县",
|
|
// "value": "532530"
|
|
// },
|
|
// {
|
|
// "label": "绿春县",
|
|
// "value": "532531"
|
|
// },
|
|
// {
|
|
// "label": "河口瑶族自治县",
|
|
// "value": "532532"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "文山市",
|
|
// "value": "532601"
|
|
// },
|
|
// {
|
|
// "label": "砚山县",
|
|
// "value": "532622"
|
|
// },
|
|
// {
|
|
// "label": "西畴县",
|
|
// "value": "532623"
|
|
// },
|
|
// {
|
|
// "label": "麻栗坡县",
|
|
// "value": "532624"
|
|
// },
|
|
// {
|
|
// "label": "马关县",
|
|
// "value": "532625"
|
|
// },
|
|
// {
|
|
// "label": "丘北县",
|
|
// "value": "532626"
|
|
// },
|
|
// {
|
|
// "label": "广南县",
|
|
// "value": "532627"
|
|
// },
|
|
// {
|
|
// "label": "富宁县",
|
|
// "value": "532628"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "景洪市",
|
|
// "value": "532801"
|
|
// },
|
|
// {
|
|
// "label": "勐海县",
|
|
// "value": "532822"
|
|
// },
|
|
// {
|
|
// "label": "勐腊县",
|
|
// "value": "532823"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "大理市",
|
|
// "value": "532901"
|
|
// },
|
|
// {
|
|
// "label": "漾濞彝族自治县",
|
|
// "value": "532922"
|
|
// },
|
|
// {
|
|
// "label": "祥云县",
|
|
// "value": "532923"
|
|
// },
|
|
// {
|
|
// "label": "宾川县",
|
|
// "value": "532924"
|
|
// },
|
|
// {
|
|
// "label": "弥渡县",
|
|
// "value": "532925"
|
|
// },
|
|
// {
|
|
// "label": "南涧彝族自治县",
|
|
// "value": "532926"
|
|
// },
|
|
// {
|
|
// "label": "巍山彝族回族自治县",
|
|
// "value": "532927"
|
|
// },
|
|
// {
|
|
// "label": "永平县",
|
|
// "value": "532928"
|
|
// },
|
|
// {
|
|
// "label": "云龙县",
|
|
// "value": "532929"
|
|
// },
|
|
// {
|
|
// "label": "洱源县",
|
|
// "value": "532930"
|
|
// },
|
|
// {
|
|
// "label": "剑川县",
|
|
// "value": "532931"
|
|
// },
|
|
// {
|
|
// "label": "鹤庆县",
|
|
// "value": "532932"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "瑞丽市",
|
|
// "value": "533102"
|
|
// },
|
|
// {
|
|
// "label": "芒市",
|
|
// "value": "533103"
|
|
// },
|
|
// {
|
|
// "label": "梁河县",
|
|
// "value": "533122"
|
|
// },
|
|
// {
|
|
// "label": "盈江县",
|
|
// "value": "533123"
|
|
// },
|
|
// {
|
|
// "label": "陇川县",
|
|
// "value": "533124"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "泸水市",
|
|
// "value": "533301"
|
|
// },
|
|
// {
|
|
// "label": "福贡县",
|
|
// "value": "533323"
|
|
// },
|
|
// {
|
|
// "label": "贡山独龙族怒族自治县",
|
|
// "value": "533324"
|
|
// },
|
|
// {
|
|
// "label": "兰坪白族普米族自治县",
|
|
// "value": "533325"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "香格里拉市",
|
|
// "value": "533401"
|
|
// },
|
|
// {
|
|
// "label": "德钦县",
|
|
// "value": "533422"
|
|
// },
|
|
// {
|
|
// "label": "维西傈僳族自治县",
|
|
// "value": "533423"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "城关区",
|
|
// "value": "540102"
|
|
// },
|
|
// {
|
|
// "label": "堆龙德庆区",
|
|
// "value": "540103"
|
|
// },
|
|
// {
|
|
// "label": "林周县",
|
|
// "value": "540121"
|
|
// },
|
|
// {
|
|
// "label": "当雄县",
|
|
// "value": "540122"
|
|
// },
|
|
// {
|
|
// "label": "尼木县",
|
|
// "value": "540123"
|
|
// },
|
|
// {
|
|
// "label": "曲水县",
|
|
// "value": "540124"
|
|
// },
|
|
// {
|
|
// "label": "达孜县",
|
|
// "value": "540126"
|
|
// },
|
|
// {
|
|
// "label": "墨竹工卡县",
|
|
// "value": "540127"
|
|
// },
|
|
// {
|
|
// "label": "格尔木藏青工业园区",
|
|
// "value": "540171"
|
|
// },
|
|
// {
|
|
// "label": "拉萨经济技术开发区",
|
|
// "value": "540172"
|
|
// },
|
|
// {
|
|
// "label": "西藏文化旅游创意园区",
|
|
// "value": "540173"
|
|
// },
|
|
// {
|
|
// "label": "达孜工业园区",
|
|
// "value": "540174"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "桑珠孜区",
|
|
// "value": "540202"
|
|
// },
|
|
// {
|
|
// "label": "南木林县",
|
|
// "value": "540221"
|
|
// },
|
|
// {
|
|
// "label": "江孜县",
|
|
// "value": "540222"
|
|
// },
|
|
// {
|
|
// "label": "定日县",
|
|
// "value": "540223"
|
|
// },
|
|
// {
|
|
// "label": "萨迦县",
|
|
// "value": "540224"
|
|
// },
|
|
// {
|
|
// "label": "拉孜县",
|
|
// "value": "540225"
|
|
// },
|
|
// {
|
|
// "label": "昂仁县",
|
|
// "value": "540226"
|
|
// },
|
|
// {
|
|
// "label": "谢通门县",
|
|
// "value": "540227"
|
|
// },
|
|
// {
|
|
// "label": "白朗县",
|
|
// "value": "540228"
|
|
// },
|
|
// {
|
|
// "label": "仁布县",
|
|
// "value": "540229"
|
|
// },
|
|
// {
|
|
// "label": "康马县",
|
|
// "value": "540230"
|
|
// },
|
|
// {
|
|
// "label": "定结县",
|
|
// "value": "540231"
|
|
// },
|
|
// {
|
|
// "label": "仲巴县",
|
|
// "value": "540232"
|
|
// },
|
|
// {
|
|
// "label": "亚东县",
|
|
// "value": "540233"
|
|
// },
|
|
// {
|
|
// "label": "吉隆县",
|
|
// "value": "540234"
|
|
// },
|
|
// {
|
|
// "label": "聂拉木县",
|
|
// "value": "540235"
|
|
// },
|
|
// {
|
|
// "label": "萨嘎县",
|
|
// "value": "540236"
|
|
// },
|
|
// {
|
|
// "label": "岗巴县",
|
|
// "value": "540237"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "卡若区",
|
|
// "value": "540302"
|
|
// },
|
|
// {
|
|
// "label": "江达县",
|
|
// "value": "540321"
|
|
// },
|
|
// {
|
|
// "label": "贡觉县",
|
|
// "value": "540322"
|
|
// },
|
|
// {
|
|
// "label": "类乌齐县",
|
|
// "value": "540323"
|
|
// },
|
|
// {
|
|
// "label": "丁青县",
|
|
// "value": "540324"
|
|
// },
|
|
// {
|
|
// "label": "察雅县",
|
|
// "value": "540325"
|
|
// },
|
|
// {
|
|
// "label": "八宿县",
|
|
// "value": "540326"
|
|
// },
|
|
// {
|
|
// "label": "左贡县",
|
|
// "value": "540327"
|
|
// },
|
|
// {
|
|
// "label": "芒康县",
|
|
// "value": "540328"
|
|
// },
|
|
// {
|
|
// "label": "洛隆县",
|
|
// "value": "540329"
|
|
// },
|
|
// {
|
|
// "label": "边坝县",
|
|
// "value": "540330"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "巴宜区",
|
|
// "value": "540402"
|
|
// },
|
|
// {
|
|
// "label": "工布江达县",
|
|
// "value": "540421"
|
|
// },
|
|
// {
|
|
// "label": "米林县",
|
|
// "value": "540422"
|
|
// },
|
|
// {
|
|
// "label": "墨脱县",
|
|
// "value": "540423"
|
|
// },
|
|
// {
|
|
// "label": "波密县",
|
|
// "value": "540424"
|
|
// },
|
|
// {
|
|
// "label": "察隅县",
|
|
// "value": "540425"
|
|
// },
|
|
// {
|
|
// "label": "朗县",
|
|
// "value": "540426"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "乃东区",
|
|
// "value": "540502"
|
|
// },
|
|
// {
|
|
// "label": "扎囊县",
|
|
// "value": "540521"
|
|
// },
|
|
// {
|
|
// "label": "贡嘎县",
|
|
// "value": "540522"
|
|
// },
|
|
// {
|
|
// "label": "桑日县",
|
|
// "value": "540523"
|
|
// },
|
|
// {
|
|
// "label": "琼结县",
|
|
// "value": "540524"
|
|
// },
|
|
// {
|
|
// "label": "曲松县",
|
|
// "value": "540525"
|
|
// },
|
|
// {
|
|
// "label": "措美县",
|
|
// "value": "540526"
|
|
// },
|
|
// {
|
|
// "label": "洛扎县",
|
|
// "value": "540527"
|
|
// },
|
|
// {
|
|
// "label": "加查县",
|
|
// "value": "540528"
|
|
// },
|
|
// {
|
|
// "label": "隆子县",
|
|
// "value": "540529"
|
|
// },
|
|
// {
|
|
// "label": "错那县",
|
|
// "value": "540530"
|
|
// },
|
|
// {
|
|
// "label": "浪卡子县",
|
|
// "value": "540531"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "那曲县",
|
|
// "value": "542421"
|
|
// },
|
|
// {
|
|
// "label": "嘉黎县",
|
|
// "value": "542422"
|
|
// },
|
|
// {
|
|
// "label": "比如县",
|
|
// "value": "542423"
|
|
// },
|
|
// {
|
|
// "label": "聂荣县",
|
|
// "value": "542424"
|
|
// },
|
|
// {
|
|
// "label": "安多县",
|
|
// "value": "542425"
|
|
// },
|
|
// {
|
|
// "label": "申扎县",
|
|
// "value": "542426"
|
|
// },
|
|
// {
|
|
// "label": "索县",
|
|
// "value": "542427"
|
|
// },
|
|
// {
|
|
// "label": "班戈县",
|
|
// "value": "542428"
|
|
// },
|
|
// {
|
|
// "label": "巴青县",
|
|
// "value": "542429"
|
|
// },
|
|
// {
|
|
// "label": "尼玛县",
|
|
// "value": "542430"
|
|
// },
|
|
// {
|
|
// "label": "双湖县",
|
|
// "value": "542431"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "普兰县",
|
|
// "value": "542521"
|
|
// },
|
|
// {
|
|
// "label": "札达县",
|
|
// "value": "542522"
|
|
// },
|
|
// {
|
|
// "label": "噶尔县",
|
|
// "value": "542523"
|
|
// },
|
|
// {
|
|
// "label": "日土县",
|
|
// "value": "542524"
|
|
// },
|
|
// {
|
|
// "label": "革吉县",
|
|
// "value": "542525"
|
|
// },
|
|
// {
|
|
// "label": "改则县",
|
|
// "value": "542526"
|
|
// },
|
|
// {
|
|
// "label": "措勤县",
|
|
// "value": "542527"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "新城区",
|
|
// "value": "610102"
|
|
// },
|
|
// {
|
|
// "label": "碑林区",
|
|
// "value": "610103"
|
|
// },
|
|
// {
|
|
// "label": "莲湖区",
|
|
// "value": "610104"
|
|
// },
|
|
// {
|
|
// "label": "灞桥区",
|
|
// "value": "610111"
|
|
// },
|
|
// {
|
|
// "label": "未央区",
|
|
// "value": "610112"
|
|
// },
|
|
// {
|
|
// "label": "雁塔区",
|
|
// "value": "610113"
|
|
// },
|
|
// {
|
|
// "label": "阎良区",
|
|
// "value": "610114"
|
|
// },
|
|
// {
|
|
// "label": "临潼区",
|
|
// "value": "610115"
|
|
// },
|
|
// {
|
|
// "label": "长安区",
|
|
// "value": "610116"
|
|
// },
|
|
// {
|
|
// "label": "高陵区",
|
|
// "value": "610117"
|
|
// },
|
|
// {
|
|
// "label": "鄠邑区",
|
|
// "value": "610118"
|
|
// },
|
|
// {
|
|
// "label": "蓝田县",
|
|
// "value": "610122"
|
|
// },
|
|
// {
|
|
// "label": "周至县",
|
|
// "value": "610124"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "王益区",
|
|
// "value": "610202"
|
|
// },
|
|
// {
|
|
// "label": "印台区",
|
|
// "value": "610203"
|
|
// },
|
|
// {
|
|
// "label": "耀州区",
|
|
// "value": "610204"
|
|
// },
|
|
// {
|
|
// "label": "宜君县",
|
|
// "value": "610222"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "渭滨区",
|
|
// "value": "610302"
|
|
// },
|
|
// {
|
|
// "label": "金台区",
|
|
// "value": "610303"
|
|
// },
|
|
// {
|
|
// "label": "陈仓区",
|
|
// "value": "610304"
|
|
// },
|
|
// {
|
|
// "label": "凤翔县",
|
|
// "value": "610322"
|
|
// },
|
|
// {
|
|
// "label": "岐山县",
|
|
// "value": "610323"
|
|
// },
|
|
// {
|
|
// "label": "扶风县",
|
|
// "value": "610324"
|
|
// },
|
|
// {
|
|
// "label": "眉县",
|
|
// "value": "610326"
|
|
// },
|
|
// {
|
|
// "label": "陇县",
|
|
// "value": "610327"
|
|
// },
|
|
// {
|
|
// "label": "千阳县",
|
|
// "value": "610328"
|
|
// },
|
|
// {
|
|
// "label": "麟游县",
|
|
// "value": "610329"
|
|
// },
|
|
// {
|
|
// "label": "凤县",
|
|
// "value": "610330"
|
|
// },
|
|
// {
|
|
// "label": "太白县",
|
|
// "value": "610331"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "秦都区",
|
|
// "value": "610402"
|
|
// },
|
|
// {
|
|
// "label": "杨陵区",
|
|
// "value": "610403"
|
|
// },
|
|
// {
|
|
// "label": "渭城区",
|
|
// "value": "610404"
|
|
// },
|
|
// {
|
|
// "label": "三原县",
|
|
// "value": "610422"
|
|
// },
|
|
// {
|
|
// "label": "泾阳县",
|
|
// "value": "610423"
|
|
// },
|
|
// {
|
|
// "label": "乾县",
|
|
// "value": "610424"
|
|
// },
|
|
// {
|
|
// "label": "礼泉县",
|
|
// "value": "610425"
|
|
// },
|
|
// {
|
|
// "label": "永寿县",
|
|
// "value": "610426"
|
|
// },
|
|
// {
|
|
// "label": "彬县",
|
|
// "value": "610427"
|
|
// },
|
|
// {
|
|
// "label": "长武县",
|
|
// "value": "610428"
|
|
// },
|
|
// {
|
|
// "label": "旬邑县",
|
|
// "value": "610429"
|
|
// },
|
|
// {
|
|
// "label": "淳化县",
|
|
// "value": "610430"
|
|
// },
|
|
// {
|
|
// "label": "武功县",
|
|
// "value": "610431"
|
|
// },
|
|
// {
|
|
// "label": "兴平市",
|
|
// "value": "610481"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "临渭区",
|
|
// "value": "610502"
|
|
// },
|
|
// {
|
|
// "label": "华州区",
|
|
// "value": "610503"
|
|
// },
|
|
// {
|
|
// "label": "潼关县",
|
|
// "value": "610522"
|
|
// },
|
|
// {
|
|
// "label": "大荔县",
|
|
// "value": "610523"
|
|
// },
|
|
// {
|
|
// "label": "合阳县",
|
|
// "value": "610524"
|
|
// },
|
|
// {
|
|
// "label": "澄城县",
|
|
// "value": "610525"
|
|
// },
|
|
// {
|
|
// "label": "蒲城县",
|
|
// "value": "610526"
|
|
// },
|
|
// {
|
|
// "label": "白水县",
|
|
// "value": "610527"
|
|
// },
|
|
// {
|
|
// "label": "富平县",
|
|
// "value": "610528"
|
|
// },
|
|
// {
|
|
// "label": "韩城市",
|
|
// "value": "610581"
|
|
// },
|
|
// {
|
|
// "label": "华阴市",
|
|
// "value": "610582"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "宝塔区",
|
|
// "value": "610602"
|
|
// },
|
|
// {
|
|
// "label": "安塞区",
|
|
// "value": "610603"
|
|
// },
|
|
// {
|
|
// "label": "延长县",
|
|
// "value": "610621"
|
|
// },
|
|
// {
|
|
// "label": "延川县",
|
|
// "value": "610622"
|
|
// },
|
|
// {
|
|
// "label": "子长县",
|
|
// "value": "610623"
|
|
// },
|
|
// {
|
|
// "label": "志丹县",
|
|
// "value": "610625"
|
|
// },
|
|
// {
|
|
// "label": "吴起县",
|
|
// "value": "610626"
|
|
// },
|
|
// {
|
|
// "label": "甘泉县",
|
|
// "value": "610627"
|
|
// },
|
|
// {
|
|
// "label": "富县",
|
|
// "value": "610628"
|
|
// },
|
|
// {
|
|
// "label": "洛川县",
|
|
// "value": "610629"
|
|
// },
|
|
// {
|
|
// "label": "宜川县",
|
|
// "value": "610630"
|
|
// },
|
|
// {
|
|
// "label": "黄龙县",
|
|
// "value": "610631"
|
|
// },
|
|
// {
|
|
// "label": "黄陵县",
|
|
// "value": "610632"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "汉台区",
|
|
// "value": "610702"
|
|
// },
|
|
// {
|
|
// "label": "南郑区",
|
|
// "value": "610703"
|
|
// },
|
|
// {
|
|
// "label": "城固县",
|
|
// "value": "610722"
|
|
// },
|
|
// {
|
|
// "label": "洋县",
|
|
// "value": "610723"
|
|
// },
|
|
// {
|
|
// "label": "西乡县",
|
|
// "value": "610724"
|
|
// },
|
|
// {
|
|
// "label": "勉县",
|
|
// "value": "610725"
|
|
// },
|
|
// {
|
|
// "label": "宁强县",
|
|
// "value": "610726"
|
|
// },
|
|
// {
|
|
// "label": "略阳县",
|
|
// "value": "610727"
|
|
// },
|
|
// {
|
|
// "label": "镇巴县",
|
|
// "value": "610728"
|
|
// },
|
|
// {
|
|
// "label": "留坝县",
|
|
// "value": "610729"
|
|
// },
|
|
// {
|
|
// "label": "佛坪县",
|
|
// "value": "610730"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "榆阳区",
|
|
// "value": "610802"
|
|
// },
|
|
// {
|
|
// "label": "横山区",
|
|
// "value": "610803"
|
|
// },
|
|
// {
|
|
// "label": "府谷县",
|
|
// "value": "610822"
|
|
// },
|
|
// {
|
|
// "label": "靖边县",
|
|
// "value": "610824"
|
|
// },
|
|
// {
|
|
// "label": "定边县",
|
|
// "value": "610825"
|
|
// },
|
|
// {
|
|
// "label": "绥德县",
|
|
// "value": "610826"
|
|
// },
|
|
// {
|
|
// "label": "米脂县",
|
|
// "value": "610827"
|
|
// },
|
|
// {
|
|
// "label": "佳县",
|
|
// "value": "610828"
|
|
// },
|
|
// {
|
|
// "label": "吴堡县",
|
|
// "value": "610829"
|
|
// },
|
|
// {
|
|
// "label": "清涧县",
|
|
// "value": "610830"
|
|
// },
|
|
// {
|
|
// "label": "子洲县",
|
|
// "value": "610831"
|
|
// },
|
|
// {
|
|
// "label": "神木市",
|
|
// "value": "610881"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "汉滨区",
|
|
// "value": "610902"
|
|
// },
|
|
// {
|
|
// "label": "汉阴县",
|
|
// "value": "610921"
|
|
// },
|
|
// {
|
|
// "label": "石泉县",
|
|
// "value": "610922"
|
|
// },
|
|
// {
|
|
// "label": "宁陕县",
|
|
// "value": "610923"
|
|
// },
|
|
// {
|
|
// "label": "紫阳县",
|
|
// "value": "610924"
|
|
// },
|
|
// {
|
|
// "label": "岚皋县",
|
|
// "value": "610925"
|
|
// },
|
|
// {
|
|
// "label": "平利县",
|
|
// "value": "610926"
|
|
// },
|
|
// {
|
|
// "label": "镇坪县",
|
|
// "value": "610927"
|
|
// },
|
|
// {
|
|
// "label": "旬阳县",
|
|
// "value": "610928"
|
|
// },
|
|
// {
|
|
// "label": "白河县",
|
|
// "value": "610929"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "商州区",
|
|
// "value": "611002"
|
|
// },
|
|
// {
|
|
// "label": "洛南县",
|
|
// "value": "611021"
|
|
// },
|
|
// {
|
|
// "label": "丹凤县",
|
|
// "value": "611022"
|
|
// },
|
|
// {
|
|
// "label": "商南县",
|
|
// "value": "611023"
|
|
// },
|
|
// {
|
|
// "label": "山阳县",
|
|
// "value": "611024"
|
|
// },
|
|
// {
|
|
// "label": "镇安县",
|
|
// "value": "611025"
|
|
// },
|
|
// {
|
|
// "label": "柞水县",
|
|
// "value": "611026"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "城关区",
|
|
// "value": "620102"
|
|
// },
|
|
// {
|
|
// "label": "七里河区",
|
|
// "value": "620103"
|
|
// },
|
|
// {
|
|
// "label": "西固区",
|
|
// "value": "620104"
|
|
// },
|
|
// {
|
|
// "label": "安宁区",
|
|
// "value": "620105"
|
|
// },
|
|
// {
|
|
// "label": "红古区",
|
|
// "value": "620111"
|
|
// },
|
|
// {
|
|
// "label": "永登县",
|
|
// "value": "620121"
|
|
// },
|
|
// {
|
|
// "label": "皋兰县",
|
|
// "value": "620122"
|
|
// },
|
|
// {
|
|
// "label": "榆中县",
|
|
// "value": "620123"
|
|
// },
|
|
// {
|
|
// "label": "兰州新区",
|
|
// "value": "620171"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "嘉峪关市",
|
|
// "value": "620201"
|
|
// }],
|
|
// [{
|
|
// "label": "金川区",
|
|
// "value": "620302"
|
|
// },
|
|
// {
|
|
// "label": "永昌县",
|
|
// "value": "620321"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "白银区",
|
|
// "value": "620402"
|
|
// },
|
|
// {
|
|
// "label": "平川区",
|
|
// "value": "620403"
|
|
// },
|
|
// {
|
|
// "label": "靖远县",
|
|
// "value": "620421"
|
|
// },
|
|
// {
|
|
// "label": "会宁县",
|
|
// "value": "620422"
|
|
// },
|
|
// {
|
|
// "label": "景泰县",
|
|
// "value": "620423"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "秦州区",
|
|
// "value": "620502"
|
|
// },
|
|
// {
|
|
// "label": "麦积区",
|
|
// "value": "620503"
|
|
// },
|
|
// {
|
|
// "label": "清水县",
|
|
// "value": "620521"
|
|
// },
|
|
// {
|
|
// "label": "秦安县",
|
|
// "value": "620522"
|
|
// },
|
|
// {
|
|
// "label": "甘谷县",
|
|
// "value": "620523"
|
|
// },
|
|
// {
|
|
// "label": "武山县",
|
|
// "value": "620524"
|
|
// },
|
|
// {
|
|
// "label": "张家川回族自治县",
|
|
// "value": "620525"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "凉州区",
|
|
// "value": "620602"
|
|
// },
|
|
// {
|
|
// "label": "民勤县",
|
|
// "value": "620621"
|
|
// },
|
|
// {
|
|
// "label": "古浪县",
|
|
// "value": "620622"
|
|
// },
|
|
// {
|
|
// "label": "天祝藏族自治县",
|
|
// "value": "620623"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "甘州区",
|
|
// "value": "620702"
|
|
// },
|
|
// {
|
|
// "label": "肃南裕固族自治县",
|
|
// "value": "620721"
|
|
// },
|
|
// {
|
|
// "label": "民乐县",
|
|
// "value": "620722"
|
|
// },
|
|
// {
|
|
// "label": "临泽县",
|
|
// "value": "620723"
|
|
// },
|
|
// {
|
|
// "label": "高台县",
|
|
// "value": "620724"
|
|
// },
|
|
// {
|
|
// "label": "山丹县",
|
|
// "value": "620725"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "崆峒区",
|
|
// "value": "620802"
|
|
// },
|
|
// {
|
|
// "label": "泾川县",
|
|
// "value": "620821"
|
|
// },
|
|
// {
|
|
// "label": "灵台县",
|
|
// "value": "620822"
|
|
// },
|
|
// {
|
|
// "label": "崇信县",
|
|
// "value": "620823"
|
|
// },
|
|
// {
|
|
// "label": "华亭县",
|
|
// "value": "620824"
|
|
// },
|
|
// {
|
|
// "label": "庄浪县",
|
|
// "value": "620825"
|
|
// },
|
|
// {
|
|
// "label": "静宁县",
|
|
// "value": "620826"
|
|
// },
|
|
// {
|
|
// "label": "平凉工业园区",
|
|
// "value": "620871"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "肃州区",
|
|
// "value": "620902"
|
|
// },
|
|
// {
|
|
// "label": "金塔县",
|
|
// "value": "620921"
|
|
// },
|
|
// {
|
|
// "label": "瓜州县",
|
|
// "value": "620922"
|
|
// },
|
|
// {
|
|
// "label": "肃北蒙古族自治县",
|
|
// "value": "620923"
|
|
// },
|
|
// {
|
|
// "label": "阿克塞哈萨克族自治县",
|
|
// "value": "620924"
|
|
// },
|
|
// {
|
|
// "label": "玉门市",
|
|
// "value": "620981"
|
|
// },
|
|
// {
|
|
// "label": "敦煌市",
|
|
// "value": "620982"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "西峰区",
|
|
// "value": "621002"
|
|
// },
|
|
// {
|
|
// "label": "庆城县",
|
|
// "value": "621021"
|
|
// },
|
|
// {
|
|
// "label": "环县",
|
|
// "value": "621022"
|
|
// },
|
|
// {
|
|
// "label": "华池县",
|
|
// "value": "621023"
|
|
// },
|
|
// {
|
|
// "label": "合水县",
|
|
// "value": "621024"
|
|
// },
|
|
// {
|
|
// "label": "正宁县",
|
|
// "value": "621025"
|
|
// },
|
|
// {
|
|
// "label": "宁县",
|
|
// "value": "621026"
|
|
// },
|
|
// {
|
|
// "label": "镇原县",
|
|
// "value": "621027"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "安定区",
|
|
// "value": "621102"
|
|
// },
|
|
// {
|
|
// "label": "通渭县",
|
|
// "value": "621121"
|
|
// },
|
|
// {
|
|
// "label": "陇西县",
|
|
// "value": "621122"
|
|
// },
|
|
// {
|
|
// "label": "渭源县",
|
|
// "value": "621123"
|
|
// },
|
|
// {
|
|
// "label": "临洮县",
|
|
// "value": "621124"
|
|
// },
|
|
// {
|
|
// "label": "漳县",
|
|
// "value": "621125"
|
|
// },
|
|
// {
|
|
// "label": "岷县",
|
|
// "value": "621126"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "武都区",
|
|
// "value": "621202"
|
|
// },
|
|
// {
|
|
// "label": "成县",
|
|
// "value": "621221"
|
|
// },
|
|
// {
|
|
// "label": "文县",
|
|
// "value": "621222"
|
|
// },
|
|
// {
|
|
// "label": "宕昌县",
|
|
// "value": "621223"
|
|
// },
|
|
// {
|
|
// "label": "康县",
|
|
// "value": "621224"
|
|
// },
|
|
// {
|
|
// "label": "西和县",
|
|
// "value": "621225"
|
|
// },
|
|
// {
|
|
// "label": "礼县",
|
|
// "value": "621226"
|
|
// },
|
|
// {
|
|
// "label": "徽县",
|
|
// "value": "621227"
|
|
// },
|
|
// {
|
|
// "label": "两当县",
|
|
// "value": "621228"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "临夏市",
|
|
// "value": "622901"
|
|
// },
|
|
// {
|
|
// "label": "临夏县",
|
|
// "value": "622921"
|
|
// },
|
|
// {
|
|
// "label": "康乐县",
|
|
// "value": "622922"
|
|
// },
|
|
// {
|
|
// "label": "永靖县",
|
|
// "value": "622923"
|
|
// },
|
|
// {
|
|
// "label": "广河县",
|
|
// "value": "622924"
|
|
// },
|
|
// {
|
|
// "label": "和政县",
|
|
// "value": "622925"
|
|
// },
|
|
// {
|
|
// "label": "东乡族自治县",
|
|
// "value": "622926"
|
|
// },
|
|
// {
|
|
// "label": "积石山保安族东乡族撒拉族自治县",
|
|
// "value": "622927"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "合作市",
|
|
// "value": "623001"
|
|
// },
|
|
// {
|
|
// "label": "临潭县",
|
|
// "value": "623021"
|
|
// },
|
|
// {
|
|
// "label": "卓尼县",
|
|
// "value": "623022"
|
|
// },
|
|
// {
|
|
// "label": "舟曲县",
|
|
// "value": "623023"
|
|
// },
|
|
// {
|
|
// "label": "迭部县",
|
|
// "value": "623024"
|
|
// },
|
|
// {
|
|
// "label": "玛曲县",
|
|
// "value": "623025"
|
|
// },
|
|
// {
|
|
// "label": "碌曲县",
|
|
// "value": "623026"
|
|
// },
|
|
// {
|
|
// "label": "夏河县",
|
|
// "value": "623027"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "城东区",
|
|
// "value": "630102"
|
|
// },
|
|
// {
|
|
// "label": "城中区",
|
|
// "value": "630103"
|
|
// },
|
|
// {
|
|
// "label": "城西区",
|
|
// "value": "630104"
|
|
// },
|
|
// {
|
|
// "label": "城北区",
|
|
// "value": "630105"
|
|
// },
|
|
// {
|
|
// "label": "大通回族土族自治县",
|
|
// "value": "630121"
|
|
// },
|
|
// {
|
|
// "label": "湟中县",
|
|
// "value": "630122"
|
|
// },
|
|
// {
|
|
// "label": "湟源县",
|
|
// "value": "630123"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "乐都区",
|
|
// "value": "630202"
|
|
// },
|
|
// {
|
|
// "label": "平安区",
|
|
// "value": "630203"
|
|
// },
|
|
// {
|
|
// "label": "民和回族土族自治县",
|
|
// "value": "630222"
|
|
// },
|
|
// {
|
|
// "label": "互助土族自治县",
|
|
// "value": "630223"
|
|
// },
|
|
// {
|
|
// "label": "化隆回族自治县",
|
|
// "value": "630224"
|
|
// },
|
|
// {
|
|
// "label": "循化撒拉族自治县",
|
|
// "value": "630225"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "门源回族自治县",
|
|
// "value": "632221"
|
|
// },
|
|
// {
|
|
// "label": "祁连县",
|
|
// "value": "632222"
|
|
// },
|
|
// {
|
|
// "label": "海晏县",
|
|
// "value": "632223"
|
|
// },
|
|
// {
|
|
// "label": "刚察县",
|
|
// "value": "632224"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "同仁县",
|
|
// "value": "632321"
|
|
// },
|
|
// {
|
|
// "label": "尖扎县",
|
|
// "value": "632322"
|
|
// },
|
|
// {
|
|
// "label": "泽库县",
|
|
// "value": "632323"
|
|
// },
|
|
// {
|
|
// "label": "河南蒙古族自治县",
|
|
// "value": "632324"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "共和县",
|
|
// "value": "632521"
|
|
// },
|
|
// {
|
|
// "label": "同德县",
|
|
// "value": "632522"
|
|
// },
|
|
// {
|
|
// "label": "贵德县",
|
|
// "value": "632523"
|
|
// },
|
|
// {
|
|
// "label": "兴海县",
|
|
// "value": "632524"
|
|
// },
|
|
// {
|
|
// "label": "贵南县",
|
|
// "value": "632525"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "玛沁县",
|
|
// "value": "632621"
|
|
// },
|
|
// {
|
|
// "label": "班玛县",
|
|
// "value": "632622"
|
|
// },
|
|
// {
|
|
// "label": "甘德县",
|
|
// "value": "632623"
|
|
// },
|
|
// {
|
|
// "label": "达日县",
|
|
// "value": "632624"
|
|
// },
|
|
// {
|
|
// "label": "久治县",
|
|
// "value": "632625"
|
|
// },
|
|
// {
|
|
// "label": "玛多县",
|
|
// "value": "632626"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "玉树市",
|
|
// "value": "632701"
|
|
// },
|
|
// {
|
|
// "label": "杂多县",
|
|
// "value": "632722"
|
|
// },
|
|
// {
|
|
// "label": "称多县",
|
|
// "value": "632723"
|
|
// },
|
|
// {
|
|
// "label": "治多县",
|
|
// "value": "632724"
|
|
// },
|
|
// {
|
|
// "label": "囊谦县",
|
|
// "value": "632725"
|
|
// },
|
|
// {
|
|
// "label": "曲麻莱县",
|
|
// "value": "632726"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "格尔木市",
|
|
// "value": "632801"
|
|
// },
|
|
// {
|
|
// "label": "德令哈市",
|
|
// "value": "632802"
|
|
// },
|
|
// {
|
|
// "label": "乌兰县",
|
|
// "value": "632821"
|
|
// },
|
|
// {
|
|
// "label": "都兰县",
|
|
// "value": "632822"
|
|
// },
|
|
// {
|
|
// "label": "天峻县",
|
|
// "value": "632823"
|
|
// },
|
|
// {
|
|
// "label": "大柴旦行政委员会",
|
|
// "value": "632857"
|
|
// },
|
|
// {
|
|
// "label": "冷湖行政委员会",
|
|
// "value": "632858"
|
|
// },
|
|
// {
|
|
// "label": "茫崖行政委员会",
|
|
// "value": "632859"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "兴庆区",
|
|
// "value": "640104"
|
|
// },
|
|
// {
|
|
// "label": "西夏区",
|
|
// "value": "640105"
|
|
// },
|
|
// {
|
|
// "label": "金凤区",
|
|
// "value": "640106"
|
|
// },
|
|
// {
|
|
// "label": "永宁县",
|
|
// "value": "640121"
|
|
// },
|
|
// {
|
|
// "label": "贺兰县",
|
|
// "value": "640122"
|
|
// },
|
|
// {
|
|
// "label": "灵武市",
|
|
// "value": "640181"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "大武口区",
|
|
// "value": "640202"
|
|
// },
|
|
// {
|
|
// "label": "惠农区",
|
|
// "value": "640205"
|
|
// },
|
|
// {
|
|
// "label": "平罗县",
|
|
// "value": "640221"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "利通区",
|
|
// "value": "640302"
|
|
// },
|
|
// {
|
|
// "label": "红寺堡区",
|
|
// "value": "640303"
|
|
// },
|
|
// {
|
|
// "label": "盐池县",
|
|
// "value": "640323"
|
|
// },
|
|
// {
|
|
// "label": "同心县",
|
|
// "value": "640324"
|
|
// },
|
|
// {
|
|
// "label": "青铜峡市",
|
|
// "value": "640381"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "原州区",
|
|
// "value": "640402"
|
|
// },
|
|
// {
|
|
// "label": "西吉县",
|
|
// "value": "640422"
|
|
// },
|
|
// {
|
|
// "label": "隆德县",
|
|
// "value": "640423"
|
|
// },
|
|
// {
|
|
// "label": "泾源县",
|
|
// "value": "640424"
|
|
// },
|
|
// {
|
|
// "label": "彭阳县",
|
|
// "value": "640425"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "沙坡头区",
|
|
// "value": "640502"
|
|
// },
|
|
// {
|
|
// "label": "中宁县",
|
|
// "value": "640521"
|
|
// },
|
|
// {
|
|
// "label": "海原县",
|
|
// "value": "640522"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "天山区",
|
|
// "value": "650102"
|
|
// },
|
|
// {
|
|
// "label": "沙依巴克区",
|
|
// "value": "650103"
|
|
// },
|
|
// {
|
|
// "label": "新市区",
|
|
// "value": "650104"
|
|
// },
|
|
// {
|
|
// "label": "水磨沟区",
|
|
// "value": "650105"
|
|
// },
|
|
// {
|
|
// "label": "头屯河区",
|
|
// "value": "650106"
|
|
// },
|
|
// {
|
|
// "label": "达坂城区",
|
|
// "value": "650107"
|
|
// },
|
|
// {
|
|
// "label": "米东区",
|
|
// "value": "650109"
|
|
// },
|
|
// {
|
|
// "label": "乌鲁木齐县",
|
|
// "value": "650121"
|
|
// },
|
|
// {
|
|
// "label": "乌鲁木齐经济技术开发区",
|
|
// "value": "650171"
|
|
// },
|
|
// {
|
|
// "label": "乌鲁木齐高新技术产业开发区",
|
|
// "value": "650172"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "独山子区",
|
|
// "value": "650202"
|
|
// },
|
|
// {
|
|
// "label": "克拉玛依区",
|
|
// "value": "650203"
|
|
// },
|
|
// {
|
|
// "label": "白碱滩区",
|
|
// "value": "650204"
|
|
// },
|
|
// {
|
|
// "label": "乌尔禾区",
|
|
// "value": "650205"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "高昌区",
|
|
// "value": "650402"
|
|
// },
|
|
// {
|
|
// "label": "鄯善县",
|
|
// "value": "650421"
|
|
// },
|
|
// {
|
|
// "label": "托克逊县",
|
|
// "value": "650422"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "伊州区",
|
|
// "value": "650502"
|
|
// },
|
|
// {
|
|
// "label": "巴里坤哈萨克自治县",
|
|
// "value": "650521"
|
|
// },
|
|
// {
|
|
// "label": "伊吾县",
|
|
// "value": "650522"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "昌吉市",
|
|
// "value": "652301"
|
|
// },
|
|
// {
|
|
// "label": "阜康市",
|
|
// "value": "652302"
|
|
// },
|
|
// {
|
|
// "label": "呼图壁县",
|
|
// "value": "652323"
|
|
// },
|
|
// {
|
|
// "label": "玛纳斯县",
|
|
// "value": "652324"
|
|
// },
|
|
// {
|
|
// "label": "奇台县",
|
|
// "value": "652325"
|
|
// },
|
|
// {
|
|
// "label": "吉木萨尔县",
|
|
// "value": "652327"
|
|
// },
|
|
// {
|
|
// "label": "木垒哈萨克自治县",
|
|
// "value": "652328"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "博乐市",
|
|
// "value": "652701"
|
|
// },
|
|
// {
|
|
// "label": "阿拉山口市",
|
|
// "value": "652702"
|
|
// },
|
|
// {
|
|
// "label": "精河县",
|
|
// "value": "652722"
|
|
// },
|
|
// {
|
|
// "label": "温泉县",
|
|
// "value": "652723"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "库尔勒市",
|
|
// "value": "652801"
|
|
// },
|
|
// {
|
|
// "label": "轮台县",
|
|
// "value": "652822"
|
|
// },
|
|
// {
|
|
// "label": "尉犁县",
|
|
// "value": "652823"
|
|
// },
|
|
// {
|
|
// "label": "若羌县",
|
|
// "value": "652824"
|
|
// },
|
|
// {
|
|
// "label": "且末县",
|
|
// "value": "652825"
|
|
// },
|
|
// {
|
|
// "label": "焉耆回族自治县",
|
|
// "value": "652826"
|
|
// },
|
|
// {
|
|
// "label": "和静县",
|
|
// "value": "652827"
|
|
// },
|
|
// {
|
|
// "label": "和硕县",
|
|
// "value": "652828"
|
|
// },
|
|
// {
|
|
// "label": "博湖县",
|
|
// "value": "652829"
|
|
// },
|
|
// {
|
|
// "label": "库尔勒经济技术开发区",
|
|
// "value": "652871"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "阿克苏市",
|
|
// "value": "652901"
|
|
// },
|
|
// {
|
|
// "label": "温宿县",
|
|
// "value": "652922"
|
|
// },
|
|
// {
|
|
// "label": "库车县",
|
|
// "value": "652923"
|
|
// },
|
|
// {
|
|
// "label": "沙雅县",
|
|
// "value": "652924"
|
|
// },
|
|
// {
|
|
// "label": "新和县",
|
|
// "value": "652925"
|
|
// },
|
|
// {
|
|
// "label": "拜城县",
|
|
// "value": "652926"
|
|
// },
|
|
// {
|
|
// "label": "乌什县",
|
|
// "value": "652927"
|
|
// },
|
|
// {
|
|
// "label": "阿瓦提县",
|
|
// "value": "652928"
|
|
// },
|
|
// {
|
|
// "label": "柯坪县",
|
|
// "value": "652929"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "阿图什市",
|
|
// "value": "653001"
|
|
// },
|
|
// {
|
|
// "label": "阿克陶县",
|
|
// "value": "653022"
|
|
// },
|
|
// {
|
|
// "label": "阿合奇县",
|
|
// "value": "653023"
|
|
// },
|
|
// {
|
|
// "label": "乌恰县",
|
|
// "value": "653024"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "喀什市",
|
|
// "value": "653101"
|
|
// },
|
|
// {
|
|
// "label": "疏附县",
|
|
// "value": "653121"
|
|
// },
|
|
// {
|
|
// "label": "疏勒县",
|
|
// "value": "653122"
|
|
// },
|
|
// {
|
|
// "label": "英吉沙县",
|
|
// "value": "653123"
|
|
// },
|
|
// {
|
|
// "label": "泽普县",
|
|
// "value": "653124"
|
|
// },
|
|
// {
|
|
// "label": "莎车县",
|
|
// "value": "653125"
|
|
// },
|
|
// {
|
|
// "label": "叶城县",
|
|
// "value": "653126"
|
|
// },
|
|
// {
|
|
// "label": "麦盖提县",
|
|
// "value": "653127"
|
|
// },
|
|
// {
|
|
// "label": "岳普湖县",
|
|
// "value": "653128"
|
|
// },
|
|
// {
|
|
// "label": "伽师县",
|
|
// "value": "653129"
|
|
// },
|
|
// {
|
|
// "label": "巴楚县",
|
|
// "value": "653130"
|
|
// },
|
|
// {
|
|
// "label": "塔什库尔干塔吉克自治县",
|
|
// "value": "653131"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "和田市",
|
|
// "value": "653201"
|
|
// },
|
|
// {
|
|
// "label": "和田县",
|
|
// "value": "653221"
|
|
// },
|
|
// {
|
|
// "label": "墨玉县",
|
|
// "value": "653222"
|
|
// },
|
|
// {
|
|
// "label": "皮山县",
|
|
// "value": "653223"
|
|
// },
|
|
// {
|
|
// "label": "洛浦县",
|
|
// "value": "653224"
|
|
// },
|
|
// {
|
|
// "label": "策勒县",
|
|
// "value": "653225"
|
|
// },
|
|
// {
|
|
// "label": "于田县",
|
|
// "value": "653226"
|
|
// },
|
|
// {
|
|
// "label": "民丰县",
|
|
// "value": "653227"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "伊宁市",
|
|
// "value": "654002"
|
|
// },
|
|
// {
|
|
// "label": "奎屯市",
|
|
// "value": "654003"
|
|
// },
|
|
// {
|
|
// "label": "霍尔果斯市",
|
|
// "value": "654004"
|
|
// },
|
|
// {
|
|
// "label": "伊宁县",
|
|
// "value": "654021"
|
|
// },
|
|
// {
|
|
// "label": "察布查尔锡伯自治县",
|
|
// "value": "654022"
|
|
// },
|
|
// {
|
|
// "label": "霍城县",
|
|
// "value": "654023"
|
|
// },
|
|
// {
|
|
// "label": "巩留县",
|
|
// "value": "654024"
|
|
// },
|
|
// {
|
|
// "label": "新源县",
|
|
// "value": "654025"
|
|
// },
|
|
// {
|
|
// "label": "昭苏县",
|
|
// "value": "654026"
|
|
// },
|
|
// {
|
|
// "label": "特克斯县",
|
|
// "value": "654027"
|
|
// },
|
|
// {
|
|
// "label": "尼勒克县",
|
|
// "value": "654028"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "塔城市",
|
|
// "value": "654201"
|
|
// },
|
|
// {
|
|
// "label": "乌苏市",
|
|
// "value": "654202"
|
|
// },
|
|
// {
|
|
// "label": "额敏县",
|
|
// "value": "654221"
|
|
// },
|
|
// {
|
|
// "label": "沙湾县",
|
|
// "value": "654223"
|
|
// },
|
|
// {
|
|
// "label": "托里县",
|
|
// "value": "654224"
|
|
// },
|
|
// {
|
|
// "label": "裕民县",
|
|
// "value": "654225"
|
|
// },
|
|
// {
|
|
// "label": "和布克赛尔蒙古自治县",
|
|
// "value": "654226"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "阿勒泰市",
|
|
// "value": "654301"
|
|
// },
|
|
// {
|
|
// "label": "布尔津县",
|
|
// "value": "654321"
|
|
// },
|
|
// {
|
|
// "label": "富蕴县",
|
|
// "value": "654322"
|
|
// },
|
|
// {
|
|
// "label": "福海县",
|
|
// "value": "654323"
|
|
// },
|
|
// {
|
|
// "label": "哈巴河县",
|
|
// "value": "654324"
|
|
// },
|
|
// {
|
|
// "label": "青河县",
|
|
// "value": "654325"
|
|
// },
|
|
// {
|
|
// "label": "吉木乃县",
|
|
// "value": "654326"
|
|
// }
|
|
// ],
|
|
// [{
|
|
// "label": "石河子市",
|
|
// "value": "659001"
|
|
// },
|
|
// {
|
|
// "label": "阿拉尔市",
|
|
// "value": "659002"
|
|
// },
|
|
// {
|
|
// "label": "图木舒克市",
|
|
// "value": "659003"
|
|
// },
|
|
// {
|
|
// "label": "五家渠市",
|
|
// "value": "659004"
|
|
// },
|
|
// {
|
|
// "label": "铁门关市",
|
|
// "value": "659006"
|
|
// }
|
|
// ]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "台北",
|
|
// "value": "660101"
|
|
// }],
|
|
// [{
|
|
// "label": "高雄",
|
|
// "value": "660201"
|
|
// }],
|
|
// [{
|
|
// "label": "基隆",
|
|
// "value": "660301"
|
|
// }],
|
|
// [{
|
|
// "label": "台中",
|
|
// "value": "660401"
|
|
// }],
|
|
// [{
|
|
// "label": "台南",
|
|
// "value": "660501"
|
|
// }],
|
|
// [{
|
|
// "label": "新竹",
|
|
// "value": "660601"
|
|
// }],
|
|
// [{
|
|
// "label": "嘉义",
|
|
// "value": "660701"
|
|
// }],
|
|
// [{
|
|
// "label": "宜兰",
|
|
// "value": "660801"
|
|
// }],
|
|
// [{
|
|
// "label": "桃园",
|
|
// "value": "660901"
|
|
// }],
|
|
// [{
|
|
// "label": "苗栗",
|
|
// "value": "661001"
|
|
// }],
|
|
// [{
|
|
// "label": "彰化",
|
|
// "value": "661101"
|
|
// }],
|
|
// [{
|
|
// "label": "南投",
|
|
// "value": "661201"
|
|
// }],
|
|
// [{
|
|
// "label": "云林",
|
|
// "value": "661301"
|
|
// }],
|
|
// [{
|
|
// "label": "屏东",
|
|
// "value": "661401"
|
|
// }],
|
|
// [{
|
|
// "label": "台东",
|
|
// "value": "661501"
|
|
// }],
|
|
// [{
|
|
// "label": "花莲",
|
|
// "value": "661601"
|
|
// }],
|
|
// [{
|
|
// "label": "澎湖",
|
|
// "value": "661701"
|
|
// }]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "香港岛",
|
|
// "value": "670101"
|
|
// }],
|
|
// [{
|
|
// "label": "九龙",
|
|
// "value": "670201"
|
|
// }],
|
|
// [{
|
|
// "label": "新界",
|
|
// "value": "670301"
|
|
// }]
|
|
// ],
|
|
// [
|
|
// [{
|
|
// "label": "澳门半岛",
|
|
// "value": "680101"
|
|
// }],
|
|
// [{
|
|
// "label": "氹仔岛",
|
|
// "value": "680201"
|
|
// }],
|
|
// [{
|
|
// "label": "路环岛",
|
|
// "value": "680301"
|
|
// }],
|
|
// [{
|
|
// "label": "路氹城",
|
|
// "value": "680401"
|
|
// }]
|
|
// ]
|
|
];
|
|
var _default = areaData;
|
|
exports.default = _default;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 3:
|
|
/*!***********************************!*\
|
|
!*** (webpack)/buildin/global.js ***!
|
|
\***********************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
var g;
|
|
|
|
// This works in non-strict mode
|
|
g = (function() {
|
|
return this;
|
|
})();
|
|
|
|
try {
|
|
// This works if eval is allowed (see CSP)
|
|
g = g || new Function("return this")();
|
|
} catch (e) {
|
|
// This works if the window reference is available
|
|
if (typeof window === "object") g = window;
|
|
}
|
|
|
|
// g can still be undefined, but nothing to do about it...
|
|
// We return undefined, instead of nothing here, so it's
|
|
// easier to handle this case. if(!global) { ...}
|
|
|
|
module.exports = g;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 32:
|
|
/*!**********************************************************************************************************!*\
|
|
!*** ./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib/runtime/componentNormalizer.js ***!
|
|
\**********************************************************************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return normalizeComponent; });
|
|
/* globals __VUE_SSR_CONTEXT__ */
|
|
|
|
// IMPORTANT: Do NOT use ES2015 features in this file (except for modules).
|
|
// This module is a runtime utility for cleaner component module output and will
|
|
// be included in the final webpack user bundle.
|
|
|
|
function normalizeComponent (
|
|
scriptExports,
|
|
render,
|
|
staticRenderFns,
|
|
functionalTemplate,
|
|
injectStyles,
|
|
scopeId,
|
|
moduleIdentifier, /* server only */
|
|
shadowMode, /* vue-cli only */
|
|
components, // fixed by xxxxxx auto components
|
|
renderjs // fixed by xxxxxx renderjs
|
|
) {
|
|
// Vue.extend constructor export interop
|
|
var options = typeof scriptExports === 'function'
|
|
? scriptExports.options
|
|
: scriptExports
|
|
|
|
// fixed by xxxxxx auto components
|
|
if (components) {
|
|
if (!options.components) {
|
|
options.components = {}
|
|
}
|
|
var hasOwn = Object.prototype.hasOwnProperty
|
|
for (var name in components) {
|
|
if (hasOwn.call(components, name) && !hasOwn.call(options.components, name)) {
|
|
options.components[name] = components[name]
|
|
}
|
|
}
|
|
}
|
|
// fixed by xxxxxx renderjs
|
|
if (renderjs) {
|
|
if(typeof renderjs.beforeCreate === 'function'){
|
|
renderjs.beforeCreate = [renderjs.beforeCreate]
|
|
}
|
|
(renderjs.beforeCreate || (renderjs.beforeCreate = [])).unshift(function() {
|
|
this[renderjs.__module] = this
|
|
});
|
|
(options.mixins || (options.mixins = [])).push(renderjs)
|
|
}
|
|
|
|
// render functions
|
|
if (render) {
|
|
options.render = render
|
|
options.staticRenderFns = staticRenderFns
|
|
options._compiled = true
|
|
}
|
|
|
|
// functional template
|
|
if (functionalTemplate) {
|
|
options.functional = true
|
|
}
|
|
|
|
// scopedId
|
|
if (scopeId) {
|
|
options._scopeId = 'data-v-' + scopeId
|
|
}
|
|
|
|
var hook
|
|
if (moduleIdentifier) { // server build
|
|
hook = function (context) {
|
|
// 2.3 injection
|
|
context =
|
|
context || // cached call
|
|
(this.$vnode && this.$vnode.ssrContext) || // stateful
|
|
(this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional
|
|
// 2.2 with runInNewContext: true
|
|
if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {
|
|
context = __VUE_SSR_CONTEXT__
|
|
}
|
|
// inject component styles
|
|
if (injectStyles) {
|
|
injectStyles.call(this, context)
|
|
}
|
|
// register component module identifier for async chunk inferrence
|
|
if (context && context._registeredComponents) {
|
|
context._registeredComponents.add(moduleIdentifier)
|
|
}
|
|
}
|
|
// used by ssr in case component is cached and beforeCreate
|
|
// never gets called
|
|
options._ssrRegister = hook
|
|
} else if (injectStyles) {
|
|
hook = shadowMode
|
|
? function () { injectStyles.call(this, this.$root.$options.shadowRoot) }
|
|
: injectStyles
|
|
}
|
|
|
|
if (hook) {
|
|
if (options.functional) {
|
|
// for template-only hot-reload because in that case the render fn doesn't
|
|
// go through the normalizer
|
|
options._injectStyles = hook
|
|
// register for functioal component in vue file
|
|
var originalRender = options.render
|
|
options.render = function renderWithStyleInjection (h, context) {
|
|
hook.call(context)
|
|
return originalRender(h, context)
|
|
}
|
|
} else {
|
|
// inject component registration as beforeCreate hook
|
|
var existing = options.beforeCreate
|
|
options.beforeCreate = existing
|
|
? [].concat(existing, hook)
|
|
: [hook]
|
|
}
|
|
}
|
|
|
|
return {
|
|
exports: scriptExports,
|
|
options: options
|
|
}
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 33:
|
|
/*!**************************************!*\
|
|
!*** D:/工作/zhonglmini/common/api.js ***!
|
|
\**************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ 4);
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.wxpay = exports.userinfo = exports.updatepsw = exports.tixlist = exports.sqtuik = exports.sqtuih = exports.sqtixian = exports.sqruzhu = exports.sendcode = exports.register = exports.postyans = exports.postorderjiad = exports.postorder = exports.orderlist2 = exports.orderlist = exports.orderjiad = exports.orderinfo = exports.orderdetail = exports.notice = exports.mycouponlist = exports.login = exports.kdiinfo = exports.jifenlist = exports.gooddetail = exports.getread_recordlsit = exports.getitem = exports.getgoodlist = exports.getdhrq = exports.getcpdesc = exports.getcoupon = exports.getcategory = exports.getbanner = exports.getarealist = exports.getaddress = exports.endtime = exports.editaddress = exports.detaildesc = exports.daochu = exports.czwxpay = exports.couponlist = exports.collectionlist = exports.cleanrecord = exports.checkyqcode = exports.checkruzhu = exports.checkrg = exports.checkorder = exports.checkkc = exports.cancelOrder = exports.baseset = exports.baseinfo = exports.autochooseyhq = exports.addcollection = exports.add_read_record = void 0;
|
|
var _http = _interopRequireDefault(__webpack_require__(/*! ./http */ 34));
|
|
/**
|
|
* 首页相关
|
|
* */
|
|
//轮播图
|
|
var getbanner = function getbanner(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//导航列表
|
|
exports.getbanner = getbanner;
|
|
var getitem = function getitem(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//产品&业务描述
|
|
exports.getitem = getitem;
|
|
var getcpdesc = function getcpdesc(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//分类
|
|
exports.getcpdesc = getcpdesc;
|
|
var getcategory = function getcategory(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//产品列表
|
|
exports.getcategory = getcategory;
|
|
var getgoodlist = function getgoodlist(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//登录接口
|
|
exports.getgoodlist = getgoodlist;
|
|
var login = function login(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//注册接口
|
|
exports.login = login;
|
|
var register = function register(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//修改地址接口
|
|
exports.register = register;
|
|
var editaddress = function editaddress(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//收藏接口
|
|
exports.editaddress = editaddress;
|
|
var addcollection = function addcollection(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//收藏列表
|
|
exports.addcollection = addcollection;
|
|
var collectionlist = function collectionlist(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//加入浏览记录
|
|
exports.collectionlist = collectionlist;
|
|
var add_read_record = function add_read_record(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//浏览历史记录列表
|
|
exports.add_read_record = add_read_record;
|
|
var getread_recordlsit = function getread_recordlsit(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//清空浏览记录
|
|
exports.getread_recordlsit = getread_recordlsit;
|
|
var cleanrecord = function cleanrecord(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//提交订单
|
|
exports.cleanrecord = cleanrecord;
|
|
var postorder = function postorder(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//支付
|
|
exports.postorder = postorder;
|
|
var wxpay = function wxpay(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//订单列表
|
|
exports.wxpay = wxpay;
|
|
var orderlist = function orderlist(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//订单列表2
|
|
exports.orderlist = orderlist;
|
|
var orderlist2 = function orderlist2(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//订单详细
|
|
exports.orderlist2 = orderlist2;
|
|
var orderdetail = function orderdetail(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//取消订单
|
|
exports.orderdetail = orderdetail;
|
|
var cancelOrder = function cancelOrder(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//详细文章
|
|
exports.cancelOrder = cancelOrder;
|
|
var detaildesc = function detaildesc(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//申请退款
|
|
exports.detaildesc = detaildesc;
|
|
var sqtuik = function sqtuik(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//申请退货
|
|
exports.sqtuik = sqtuik;
|
|
var sqtuih = function sqtuih(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//小区列表
|
|
exports.sqtuih = sqtuih;
|
|
var getarealist = function getarealist(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//申请入驻
|
|
exports.getarealist = getarealist;
|
|
var sqruzhu = function sqruzhu(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//检查入驻状态
|
|
exports.sqruzhu = sqruzhu;
|
|
var checkruzhu = function checkruzhu(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//产品详细
|
|
exports.checkruzhu = checkruzhu;
|
|
var gooddetail = function gooddetail(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//根据邀请码获取数据
|
|
exports.gooddetail = gooddetail;
|
|
var checkyqcode = function checkyqcode(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//获取公告
|
|
exports.checkyqcode = checkyqcode;
|
|
var notice = function notice(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//检查入驻按钮,审核作用
|
|
exports.notice = notice;
|
|
var baseset = function baseset(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//获取注册地址列表
|
|
exports.baseset = baseset;
|
|
var getaddress = function getaddress(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//获取基础信息接口
|
|
exports.getaddress = getaddress;
|
|
var baseinfo = function baseinfo(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//获取用户信息
|
|
exports.baseinfo = baseinfo;
|
|
var userinfo = function userinfo(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//充值支付
|
|
exports.userinfo = userinfo;
|
|
var czwxpay = function czwxpay(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//申请提现
|
|
exports.czwxpay = czwxpay;
|
|
var sqtixian = function sqtixian(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//提现记录
|
|
exports.sqtixian = sqtixian;
|
|
var tixlist = function tixlist(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//发送验证码
|
|
exports.tixlist = tixlist;
|
|
var sendcode = function sendcode(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//修改密码
|
|
exports.sendcode = sendcode;
|
|
var updatepsw = function updatepsw(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//积分管理
|
|
exports.updatepsw = updatepsw;
|
|
var jifenlist = function jifenlist(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//查看物流
|
|
exports.jifenlist = jifenlist;
|
|
var kdiinfo = function kdiinfo(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//检查已加购的商品库存是否有效
|
|
exports.kdiinfo = kdiinfo;
|
|
var checkkc = function checkkc(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//优惠券列表
|
|
exports.checkkc = checkkc;
|
|
var couponlist = function couponlist(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//用户优惠券
|
|
exports.couponlist = couponlist;
|
|
var mycouponlist = function mycouponlist(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//领取优惠券
|
|
exports.mycouponlist = mycouponlist;
|
|
var getcoupon = function getcoupon(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//自动选择优惠券
|
|
exports.getcoupon = getcoupon;
|
|
var autochooseyhq = function autochooseyhq(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//检查登录
|
|
exports.autochooseyhq = autochooseyhq;
|
|
var checkrg = function checkrg(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//订单信息
|
|
exports.checkrg = checkrg;
|
|
var orderinfo = function orderinfo(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//提交验收数
|
|
exports.orderinfo = orderinfo;
|
|
var postyans = function postyans(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//获取截单时间
|
|
exports.postyans = postyans;
|
|
var endtime = function endtime(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//获取订单日期
|
|
exports.endtime = endtime;
|
|
var getdhrq = function getdhrq(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//提交订单页面选择日期之后检查价格
|
|
exports.getdhrq = getdhrq;
|
|
var checkorder = function checkorder(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
|
|
//导出订单excel表
|
|
exports.checkorder = checkorder;
|
|
var daochu = function daochu(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//客户加单页面提交订单
|
|
exports.daochu = daochu;
|
|
var postorderjiad = function postorderjiad(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
//客户加单页面提交订单
|
|
exports.postorderjiad = postorderjiad;
|
|
var orderjiad = function orderjiad(data) {
|
|
return (0, _http.default)('', data, {
|
|
token: false,
|
|
loading: false
|
|
});
|
|
};
|
|
/*
|
|
//请求方法
|
|
http(接口地址='', 请求参数={}, 额外配置={})
|
|
//默认配置
|
|
{
|
|
token: true, //携带令牌
|
|
loading: true, //显示加载
|
|
mock: false, //模拟数据
|
|
}
|
|
//调用示例1
|
|
async () => {
|
|
const data = await this.$api.login({
|
|
code: this.code
|
|
})
|
|
//doSomething...
|
|
}
|
|
//调用示例2
|
|
this.$api.login({
|
|
code: this.code
|
|
}).then(res => {
|
|
//doSomething...
|
|
}).catch(err => {
|
|
//doSomething...
|
|
})
|
|
*/
|
|
exports.orderjiad = orderjiad;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 334:
|
|
/*!*************************************************************!*\
|
|
!*** D:/工作/zhonglmini/components/u-parse/libs/html2json.js ***!
|
|
\*************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(wx) {
|
|
|
|
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ 4);
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = void 0;
|
|
var _wxDiscode = _interopRequireDefault(__webpack_require__(/*! ./wxDiscode */ 335));
|
|
var _htmlparser = _interopRequireDefault(__webpack_require__(/*! ./htmlparser */ 336));
|
|
/**
|
|
* html2Json 改造来自: https://github.com/Jxck/html2json
|
|
*
|
|
*
|
|
* author: Di (微信小程序开发工程师)
|
|
* organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
|
|
* 垂直微信小程序开发交流社区
|
|
*
|
|
* github地址: https://github.com/icindy/wxParse
|
|
*
|
|
* for: 微信小程序富文本解析
|
|
* detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
|
|
*/
|
|
|
|
function makeMap(str) {
|
|
var obj = {};
|
|
var items = str.split(',');
|
|
for (var i = 0; i < items.length; i += 1) {
|
|
obj[items[i]] = true;
|
|
}
|
|
return obj;
|
|
}
|
|
|
|
// Block Elements - HTML 5
|
|
var block = makeMap('br,code,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video');
|
|
|
|
// Inline Elements - HTML 5
|
|
var inline = makeMap('a,abbr,acronym,applet,b,basefont,bdo,big,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var');
|
|
|
|
// Elements that you can, intentionally, leave open
|
|
// (and which close themselves)
|
|
var closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr');
|
|
function removeDOCTYPE(html) {
|
|
var isDocument = /<body.*>([^]*)<\/body>/.test(html);
|
|
return isDocument ? RegExp.$1 : html;
|
|
}
|
|
function trimHtml(html) {
|
|
return html.replace(/<!--.*?-->/gi, '').replace(/\/\*.*?\*\//gi, '').replace(/[ ]+</gi, '<').replace(/<script[^]*<\/script>/gi, '').replace(/<style[^]*<\/style>/gi, '');
|
|
}
|
|
function getScreenInfo() {
|
|
var screen = {};
|
|
wx.getSystemInfo({
|
|
success: function success(res) {
|
|
screen.width = res.windowWidth;
|
|
screen.height = res.windowHeight;
|
|
}
|
|
});
|
|
return screen;
|
|
}
|
|
function html2json(html, customHandler, imageProp, host) {
|
|
// 处理字符串
|
|
html = removeDOCTYPE(html);
|
|
html = trimHtml(html);
|
|
html = _wxDiscode.default.strDiscode(html);
|
|
// 生成node节点
|
|
var bufArray = [];
|
|
var results = {
|
|
nodes: [],
|
|
imageUrls: []
|
|
};
|
|
var screen = getScreenInfo();
|
|
function Node(tag) {
|
|
this.node = 'element';
|
|
this.tag = tag;
|
|
this.$screen = screen;
|
|
}
|
|
(0, _htmlparser.default)(html, {
|
|
start: function start(tag, attrs, unary) {
|
|
// node for this element
|
|
var node = new Node(tag);
|
|
if (bufArray.length !== 0) {
|
|
var parent = bufArray[0];
|
|
if (parent.nodes === undefined) {
|
|
parent.nodes = [];
|
|
}
|
|
}
|
|
if (block[tag]) {
|
|
node.tagType = 'block';
|
|
} else if (inline[tag]) {
|
|
node.tagType = 'inline';
|
|
} else if (closeSelf[tag]) {
|
|
node.tagType = 'closeSelf';
|
|
}
|
|
node.attr = attrs.reduce(function (pre, attr) {
|
|
var name = attr.name;
|
|
var value = attr.value;
|
|
if (name === 'class') {
|
|
node.classStr = value;
|
|
}
|
|
// has multi attibutes
|
|
// make it array of attribute
|
|
if (name === 'style') {
|
|
node.styleStr = value;
|
|
}
|
|
if (value.match(/ /)) {
|
|
value = value.split(' ');
|
|
}
|
|
|
|
// if attr already exists
|
|
// merge it
|
|
if (pre[name]) {
|
|
if (Array.isArray(pre[name])) {
|
|
// already array, push to last
|
|
pre[name].push(value);
|
|
} else {
|
|
// single value, make it array
|
|
pre[name] = [pre[name], value];
|
|
}
|
|
} else {
|
|
// not exist, put it
|
|
pre[name] = value;
|
|
}
|
|
return pre;
|
|
}, {});
|
|
|
|
// 优化样式相关属性
|
|
if (node.classStr) {
|
|
node.classStr += " ".concat(node.tag);
|
|
} else {
|
|
node.classStr = node.tag;
|
|
}
|
|
if (node.tagType === 'inline') {
|
|
node.classStr += ' inline';
|
|
}
|
|
|
|
// 对img添加额外数据
|
|
if (node.tag === 'img') {
|
|
var imgUrl = node.attr.src;
|
|
imgUrl = _wxDiscode.default.urlToHttpUrl(imgUrl, imageProp.domain);
|
|
Object.assign(node.attr, imageProp, {
|
|
src: imgUrl || ''
|
|
});
|
|
if (imgUrl) {
|
|
results.imageUrls.push(imgUrl);
|
|
}
|
|
}
|
|
|
|
// 处理a标签属性
|
|
if (node.tag === 'a') {
|
|
node.attr.href = node.attr.href || '';
|
|
}
|
|
|
|
// 处理font标签样式属性
|
|
if (node.tag === 'font') {
|
|
var fontSize = ['x-small', 'small', 'medium', 'large', 'x-large', 'xx-large', '-webkit-xxx-large'];
|
|
var styleAttrs = {
|
|
color: 'color',
|
|
face: 'font-family',
|
|
size: 'font-size'
|
|
};
|
|
if (!node.styleStr) node.styleStr = '';
|
|
Object.keys(styleAttrs).forEach(function (key) {
|
|
if (node.attr[key]) {
|
|
var value = key === 'size' ? fontSize[node.attr[key] - 1] : node.attr[key];
|
|
node.styleStr += "".concat(styleAttrs[key], ": ").concat(value, ";");
|
|
}
|
|
});
|
|
}
|
|
|
|
// 临时记录source资源
|
|
if (node.tag === 'source') {
|
|
results.source = node.attr.src;
|
|
}
|
|
if (customHandler.start) {
|
|
customHandler.start(node, results);
|
|
}
|
|
if (unary) {
|
|
// if this tag doesn't have end tag
|
|
// like <img src="hoge.png"/>
|
|
// add to parents
|
|
var _parent = bufArray[0] || results;
|
|
if (_parent.nodes === undefined) {
|
|
_parent.nodes = [];
|
|
}
|
|
_parent.nodes.push(node);
|
|
} else {
|
|
bufArray.unshift(node);
|
|
}
|
|
},
|
|
end: function end(tag) {
|
|
// merge into parent tag
|
|
var node = bufArray.shift();
|
|
if (node.tag !== tag) {
|
|
console.error('invalid state: mismatch end tag');
|
|
}
|
|
|
|
// 当有缓存source资源时于于video补上src资源
|
|
if (node.tag === 'video' && results.source) {
|
|
node.attr.src = results.source;
|
|
delete results.source;
|
|
}
|
|
if (customHandler.end) {
|
|
customHandler.end(node, results);
|
|
}
|
|
if (bufArray.length === 0) {
|
|
results.nodes.push(node);
|
|
} else {
|
|
var parent = bufArray[0];
|
|
if (!parent.nodes) {
|
|
parent.nodes = [];
|
|
}
|
|
parent.nodes.push(node);
|
|
}
|
|
},
|
|
chars: function chars(text) {
|
|
if (!text.trim()) return;
|
|
var node = {
|
|
node: 'text',
|
|
text: text
|
|
};
|
|
if (customHandler.chars) {
|
|
customHandler.chars(node, results);
|
|
}
|
|
if (bufArray.length === 0) {
|
|
results.nodes.push(node);
|
|
} else {
|
|
var parent = bufArray[0];
|
|
if (parent.nodes === undefined) {
|
|
parent.nodes = [];
|
|
}
|
|
parent.nodes.push(node);
|
|
}
|
|
}
|
|
});
|
|
return results;
|
|
}
|
|
var _default = html2json;
|
|
exports.default = _default;
|
|
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-weixin/dist/wx.js */ 1)["default"]))
|
|
|
|
/***/ }),
|
|
|
|
/***/ 335:
|
|
/*!*************************************************************!*\
|
|
!*** D:/工作/zhonglmini/components/u-parse/libs/wxDiscode.js ***!
|
|
\*************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = void 0;
|
|
// HTML 支持的数学符号
|
|
function strNumDiscode(str) {
|
|
str = str.replace(/∀/g, '∀');
|
|
str = str.replace(/∂/g, '∂');
|
|
str = str.replace(/∃/g, '∃');
|
|
str = str.replace(/∅/g, '∅');
|
|
str = str.replace(/∇/g, '∇');
|
|
str = str.replace(/∈/g, '∈');
|
|
str = str.replace(/∉/g, '∉');
|
|
str = str.replace(/∋/g, '∋');
|
|
str = str.replace(/∏/g, '∏');
|
|
str = str.replace(/∑/g, '∑');
|
|
str = str.replace(/−/g, '−');
|
|
str = str.replace(/∗/g, '∗');
|
|
str = str.replace(/√/g, '√');
|
|
str = str.replace(/∝/g, '∝');
|
|
str = str.replace(/∞/g, '∞');
|
|
str = str.replace(/∠/g, '∠');
|
|
str = str.replace(/∧/g, '∧');
|
|
str = str.replace(/∨/g, '∨');
|
|
str = str.replace(/∩/g, '∩');
|
|
str = str.replace(/∪/g, '∪');
|
|
str = str.replace(/∫/g, '∫');
|
|
str = str.replace(/∴/g, '∴');
|
|
str = str.replace(/∼/g, '∼');
|
|
str = str.replace(/≅/g, '≅');
|
|
str = str.replace(/≈/g, '≈');
|
|
str = str.replace(/≠/g, '≠');
|
|
str = str.replace(/≤/g, '≤');
|
|
str = str.replace(/≥/g, '≥');
|
|
str = str.replace(/⊂/g, '⊂');
|
|
str = str.replace(/⊃/g, '⊃');
|
|
str = str.replace(/⊄/g, '⊄');
|
|
str = str.replace(/⊆/g, '⊆');
|
|
str = str.replace(/⊇/g, '⊇');
|
|
str = str.replace(/⊕/g, '⊕');
|
|
str = str.replace(/⊗/g, '⊗');
|
|
str = str.replace(/⊥/g, '⊥');
|
|
str = str.replace(/⋅/g, '⋅');
|
|
return str;
|
|
}
|
|
|
|
// HTML 支持的希腊字母
|
|
function strGreeceDiscode(str) {
|
|
str = str.replace(/Α/g, 'Α');
|
|
str = str.replace(/Β/g, 'Β');
|
|
str = str.replace(/Γ/g, 'Γ');
|
|
str = str.replace(/Δ/g, 'Δ');
|
|
str = str.replace(/Ε/g, 'Ε');
|
|
str = str.replace(/Ζ/g, 'Ζ');
|
|
str = str.replace(/Η/g, 'Η');
|
|
str = str.replace(/Θ/g, 'Θ');
|
|
str = str.replace(/Ι/g, 'Ι');
|
|
str = str.replace(/Κ/g, 'Κ');
|
|
str = str.replace(/Λ/g, 'Λ');
|
|
str = str.replace(/Μ/g, 'Μ');
|
|
str = str.replace(/Ν/g, 'Ν');
|
|
str = str.replace(/Ξ/g, 'Ν');
|
|
str = str.replace(/Ο/g, 'Ο');
|
|
str = str.replace(/Π/g, 'Π');
|
|
str = str.replace(/Ρ/g, 'Ρ');
|
|
str = str.replace(/Σ/g, 'Σ');
|
|
str = str.replace(/Τ/g, 'Τ');
|
|
str = str.replace(/Υ/g, 'Υ');
|
|
str = str.replace(/Φ/g, 'Φ');
|
|
str = str.replace(/Χ/g, 'Χ');
|
|
str = str.replace(/Ψ/g, 'Ψ');
|
|
str = str.replace(/Ω/g, 'Ω');
|
|
str = str.replace(/α/g, 'α');
|
|
str = str.replace(/β/g, 'β');
|
|
str = str.replace(/γ/g, 'γ');
|
|
str = str.replace(/δ/g, 'δ');
|
|
str = str.replace(/ε/g, 'ε');
|
|
str = str.replace(/ζ/g, 'ζ');
|
|
str = str.replace(/η/g, 'η');
|
|
str = str.replace(/θ/g, 'θ');
|
|
str = str.replace(/ι/g, 'ι');
|
|
str = str.replace(/κ/g, 'κ');
|
|
str = str.replace(/λ/g, 'λ');
|
|
str = str.replace(/μ/g, 'μ');
|
|
str = str.replace(/ν/g, 'ν');
|
|
str = str.replace(/ξ/g, 'ξ');
|
|
str = str.replace(/ο/g, 'ο');
|
|
str = str.replace(/π/g, 'π');
|
|
str = str.replace(/ρ/g, 'ρ');
|
|
str = str.replace(/ς/g, 'ς');
|
|
str = str.replace(/σ/g, 'σ');
|
|
str = str.replace(/τ/g, 'τ');
|
|
str = str.replace(/υ/g, 'υ');
|
|
str = str.replace(/φ/g, 'φ');
|
|
str = str.replace(/χ/g, 'χ');
|
|
str = str.replace(/ψ/g, 'ψ');
|
|
str = str.replace(/ω/g, 'ω');
|
|
str = str.replace(/ϑ/g, 'ϑ');
|
|
str = str.replace(/ϒ/g, 'ϒ');
|
|
str = str.replace(/ϖ/g, 'ϖ');
|
|
str = str.replace(/·/g, '·');
|
|
return str;
|
|
}
|
|
function strcharacterDiscode(str) {
|
|
// 加入常用解析
|
|
str = str.replace(/ /g, ' ');
|
|
str = str.replace(/ /g, ' ');
|
|
str = str.replace(/ /g, ' ');
|
|
str = str.replace(/"/g, "'");
|
|
str = str.replace(/&/g, '&');
|
|
str = str.replace(/</g, '<');
|
|
str = str.replace(/>/g, '>');
|
|
str = str.replace(/•/g, '•');
|
|
return str;
|
|
}
|
|
|
|
// HTML 支持的其他实体
|
|
function strOtherDiscode(str) {
|
|
str = str.replace(/Œ/g, 'Œ');
|
|
str = str.replace(/œ/g, 'œ');
|
|
str = str.replace(/Š/g, 'Š');
|
|
str = str.replace(/š/g, 'š');
|
|
str = str.replace(/Ÿ/g, 'Ÿ');
|
|
str = str.replace(/ƒ/g, 'ƒ');
|
|
str = str.replace(/ˆ/g, 'ˆ');
|
|
str = str.replace(/˜/g, '˜');
|
|
str = str.replace(/ /g, '');
|
|
str = str.replace(/ /g, '');
|
|
str = str.replace(/ /g, '');
|
|
str = str.replace(/‌/g, '');
|
|
str = str.replace(/‍/g, '');
|
|
str = str.replace(/‎/g, '');
|
|
str = str.replace(/‏/g, '');
|
|
str = str.replace(/–/g, '–');
|
|
str = str.replace(/—/g, '—');
|
|
str = str.replace(/‘/g, '‘');
|
|
str = str.replace(/’/g, '’');
|
|
str = str.replace(/‚/g, '‚');
|
|
str = str.replace(/“/g, '“');
|
|
str = str.replace(/”/g, '”');
|
|
str = str.replace(/„/g, '„');
|
|
str = str.replace(/†/g, '†');
|
|
str = str.replace(/‡/g, '‡');
|
|
str = str.replace(/•/g, '•');
|
|
str = str.replace(/…/g, '…');
|
|
str = str.replace(/‰/g, '‰');
|
|
str = str.replace(/′/g, '′');
|
|
str = str.replace(/″/g, '″');
|
|
str = str.replace(/‹/g, '‹');
|
|
str = str.replace(/›/g, '›');
|
|
str = str.replace(/‾/g, '‾');
|
|
str = str.replace(/€/g, '€');
|
|
str = str.replace(/™/g, '™');
|
|
str = str.replace(/←/g, '←');
|
|
str = str.replace(/↑/g, '↑');
|
|
str = str.replace(/→/g, '→');
|
|
str = str.replace(/↓/g, '↓');
|
|
str = str.replace(/↔/g, '↔');
|
|
str = str.replace(/↵/g, '↵');
|
|
str = str.replace(/⌈/g, '⌈');
|
|
str = str.replace(/⌉/g, '⌉');
|
|
str = str.replace(/⌊/g, '⌊');
|
|
str = str.replace(/⌋/g, '⌋');
|
|
str = str.replace(/◊/g, '◊');
|
|
str = str.replace(/♠/g, '♠');
|
|
str = str.replace(/♣/g, '♣');
|
|
str = str.replace(/♥/g, '♥');
|
|
str = str.replace(/♦/g, '♦');
|
|
str = str.replace(/'/g, "'");
|
|
return str;
|
|
}
|
|
function strDiscode(str) {
|
|
str = strNumDiscode(str);
|
|
str = strGreeceDiscode(str);
|
|
str = strcharacterDiscode(str);
|
|
str = strOtherDiscode(str);
|
|
return str;
|
|
}
|
|
function urlToHttpUrl(url, domain) {
|
|
if (/^\/\//.test(url)) {
|
|
return "https:".concat(url);
|
|
} else if (/^\//.test(url)) {
|
|
return "https://".concat(domain).concat(url);
|
|
}
|
|
return url;
|
|
}
|
|
var _default = {
|
|
strDiscode: strDiscode,
|
|
urlToHttpUrl: urlToHttpUrl
|
|
};
|
|
exports.default = _default;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 336:
|
|
/*!**************************************************************!*\
|
|
!*** D:/工作/zhonglmini/components/u-parse/libs/htmlparser.js ***!
|
|
\**************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = void 0;
|
|
/**
|
|
*
|
|
* htmlParser改造自: https://github.com/blowsie/Pure-JavaScript-HTML5-Parser
|
|
*
|
|
* author: Di (微信小程序开发工程师)
|
|
* organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
|
|
* 垂直微信小程序开发交流社区
|
|
*
|
|
* github地址: https://github.com/icindy/wxParse
|
|
*
|
|
* for: 微信小程序富文本解析
|
|
* detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
|
|
*/
|
|
// Regular Expressions for parsing tags and attributes
|
|
|
|
var startTag = /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z0-9_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/;
|
|
var endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/;
|
|
var attr = /([a-zA-Z0-9_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g;
|
|
function makeMap(str) {
|
|
var obj = {};
|
|
var items = str.split(',');
|
|
for (var i = 0; i < items.length; i += 1) {
|
|
obj[items[i]] = true;
|
|
}
|
|
return obj;
|
|
}
|
|
|
|
// Empty Elements - HTML 5
|
|
var empty = makeMap('area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr');
|
|
|
|
// Block Elements - HTML 5
|
|
var block = makeMap('address,code,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video');
|
|
|
|
// Inline Elements - HTML 5
|
|
var inline = makeMap('a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var');
|
|
|
|
// Elements that you can, intentionally, leave open
|
|
// (and which close themselves)
|
|
var closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr');
|
|
|
|
// Attributes that have their values filled in disabled="disabled"
|
|
var fillAttrs = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected');
|
|
function HTMLParser(html, handler) {
|
|
var index;
|
|
var chars;
|
|
var match;
|
|
var last = html;
|
|
var stack = [];
|
|
stack.last = function () {
|
|
return stack[stack.length - 1];
|
|
};
|
|
function parseEndTag(tag, tagName) {
|
|
// If no tag name is provided, clean shop
|
|
var pos;
|
|
if (!tagName) {
|
|
pos = 0;
|
|
} else {
|
|
// Find the closest opened tag of the same type
|
|
tagName = tagName.toLowerCase();
|
|
for (pos = stack.length - 1; pos >= 0; pos -= 1) {
|
|
if (stack[pos] === tagName) break;
|
|
}
|
|
}
|
|
if (pos >= 0) {
|
|
// Close all the open elements, up the stack
|
|
for (var i = stack.length - 1; i >= pos; i -= 1) {
|
|
if (handler.end) handler.end(stack[i]);
|
|
}
|
|
|
|
// Remove the open elements from the stack
|
|
stack.length = pos;
|
|
}
|
|
}
|
|
function parseStartTag(tag, tagName, rest, unary) {
|
|
tagName = tagName.toLowerCase();
|
|
if (block[tagName]) {
|
|
while (stack.last() && inline[stack.last()]) {
|
|
parseEndTag('', stack.last());
|
|
}
|
|
}
|
|
if (closeSelf[tagName] && stack.last() === tagName) {
|
|
parseEndTag('', tagName);
|
|
}
|
|
unary = empty[tagName] || !!unary;
|
|
if (!unary) stack.push(tagName);
|
|
if (handler.start) {
|
|
var attrs = [];
|
|
rest.replace(attr, function genAttr(matches, name) {
|
|
var value = arguments[2] || arguments[3] || arguments[4] || (fillAttrs[name] ? name : '');
|
|
attrs.push({
|
|
name: name,
|
|
value: value,
|
|
escaped: value.replace(/(^|[^\\])"/g, '$1\\"') // "
|
|
});
|
|
});
|
|
|
|
if (handler.start) {
|
|
handler.start(tagName, attrs, unary);
|
|
}
|
|
}
|
|
}
|
|
while (html) {
|
|
chars = true;
|
|
if (html.indexOf('</') === 0) {
|
|
match = html.match(endTag);
|
|
if (match) {
|
|
html = html.substring(match[0].length);
|
|
match[0].replace(endTag, parseEndTag);
|
|
chars = false;
|
|
}
|
|
|
|
// start tag
|
|
} else if (html.indexOf('<') === 0) {
|
|
match = html.match(startTag);
|
|
if (match) {
|
|
html = html.substring(match[0].length);
|
|
match[0].replace(startTag, parseStartTag);
|
|
chars = false;
|
|
}
|
|
}
|
|
if (chars) {
|
|
index = html.indexOf('<');
|
|
var text = '';
|
|
while (index === 0) {
|
|
text += '<';
|
|
html = html.substring(1);
|
|
index = html.indexOf('<');
|
|
}
|
|
text += index < 0 ? html : html.substring(0, index);
|
|
html = index < 0 ? '' : html.substring(index);
|
|
if (handler.chars) handler.chars(text);
|
|
}
|
|
if (html === last) throw new Error("Parse Error: ".concat(html));
|
|
last = html;
|
|
}
|
|
|
|
// Clean up any remaining tags
|
|
parseEndTag();
|
|
}
|
|
var _default = HTMLParser;
|
|
exports.default = _default;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 34:
|
|
/*!***************************************!*\
|
|
!*** D:/工作/zhonglmini/common/http.js ***!
|
|
\***************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(uni) {
|
|
|
|
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ 4);
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = http;
|
|
var _defineProperty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/defineProperty */ 11));
|
|
var _config = _interopRequireDefault(__webpack_require__(/*! ../config */ 35));
|
|
var _util = _interopRequireDefault(__webpack_require__(/*! ./util */ 36));
|
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
function http(url) {
|
|
var _this = this;
|
|
var param = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
var extraConfig = arguments.length > 2 ? arguments[2] : undefined;
|
|
//默认配置
|
|
var defaultConfig = {
|
|
token: true,
|
|
//携带令牌
|
|
loading: true,
|
|
//显示加载
|
|
mock: false //模拟数据
|
|
};
|
|
//请求配置
|
|
var httpConfig = _objectSpread(_objectSpread({}, defaultConfig), extraConfig);
|
|
httpConfig.mock ? httpConfig.config = _config.default.mock : httpConfig.config = _config.default["development"];
|
|
//携带令牌
|
|
var token = uni.getStorageSync('token');
|
|
if (token) {
|
|
param.token = token;
|
|
} else if (httpConfig.token) {
|
|
uni.showModal({
|
|
title: '提示',
|
|
content: '登录后才能操作哦~',
|
|
showCancel: true,
|
|
confirmText: '去登录',
|
|
success: function success(e) {
|
|
if (e.confirm) _this.$util.toast('点击登录');
|
|
}
|
|
});
|
|
return Promise.reject('未登录');
|
|
}
|
|
//显示加载
|
|
httpConfig.loading && _util.default.loading('努力加载中');
|
|
//进行请求
|
|
var baseUrl = httpConfig.config.baseUrl;
|
|
var header = {
|
|
'Content-Type': 'application/x-www-form-urlencoded',
|
|
'Cookie': uni.getStorageSync('cookie') ? "foxphp_ok=".concat(uni.getStorageSync('cookie')) : ''
|
|
};
|
|
return new Promise(function (resolve, reject) {
|
|
uni.request({
|
|
url: "".concat(baseUrl, "/").concat(url),
|
|
data: param,
|
|
header: header,
|
|
method: 'POST',
|
|
// method: Object.keys(param).length ? 'POST' : 'GET',
|
|
success: function success(res) {
|
|
uni.setStorageSync('cookie', res.data.foxphp_ok);
|
|
httpConfig.loading && uni.hideLoading();
|
|
switch (res.statusCode) {
|
|
case 200:
|
|
if (res.data.code == 1) {
|
|
//正常请求
|
|
resolve(res.data);
|
|
} else {
|
|
//其他状况
|
|
if (!res.data.msg == 'notask') {
|
|
res.data.msg && _util.default.toast(res.data.msg);
|
|
}
|
|
resolve(res.data);
|
|
}
|
|
break;
|
|
case 403:
|
|
_util.default.toast('服务器拒绝');
|
|
reject(JSON.stringify(res));
|
|
break;
|
|
case 404:
|
|
_util.default.toast('资源不存在');
|
|
reject(JSON.stringify(res));
|
|
break;
|
|
case 500:
|
|
_util.default.toast('服务器异常');
|
|
reject(JSON.stringify(res));
|
|
break;
|
|
default:
|
|
_util.default.toast('未知错误码');
|
|
reject(JSON.stringify(res));
|
|
}
|
|
},
|
|
fail: function fail(err) {
|
|
httpConfig.loading && uni.hideLoading();
|
|
_util.default.toast('网络异常');
|
|
reject(JSON.stringify(err));
|
|
}
|
|
});
|
|
});
|
|
}
|
|
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-weixin/dist/index.js */ 2)["default"]))
|
|
|
|
/***/ }),
|
|
|
|
/***/ 35:
|
|
/*!**********************************!*\
|
|
!*** D:/工作/zhonglmini/config.js ***!
|
|
\**********************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = void 0;
|
|
var CONFIG = {
|
|
//模拟环境配置
|
|
mock: {
|
|
//baseUrl: 'http://rest.apizza.net/mock/274c6f1a7f44c571792b6e269c07541d',
|
|
},
|
|
//开发环境配置
|
|
development: {
|
|
// baseUrl: 'http://localhost:8888/a9zhongl0810mini/miniapi.php',
|
|
//baseUrl: 'https://zysoft2.dns-dns.cn/mini/a9zhongl0810mini/miniapi2.php',
|
|
baseUrl: 'https://m.chinause.cn/mini/a9zhongl0810mini/miniapi.php'
|
|
},
|
|
//生产环境配置
|
|
production: {
|
|
baseUrl: 'https://m.chinause.cn/mini/a9zhongl0810mini/miniapi.php'
|
|
}
|
|
};
|
|
//运行编译是开发环境,发行打包是生产环境
|
|
var _default = CONFIG;
|
|
/*
|
|
{
|
|
baseUrl: 接口地址
|
|
}
|
|
*/
|
|
exports.default = _default;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 36:
|
|
/*!***************************************!*\
|
|
!*** D:/工作/zhonglmini/common/util.js ***!
|
|
\***************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(uni) {
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.debounce = debounce;
|
|
exports.default = void 0;
|
|
exports.throttle = throttle;
|
|
//防抖 延迟执行
|
|
function debounce(fn) {
|
|
var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 500;
|
|
var timer;
|
|
return function () {
|
|
var _this = this;
|
|
var args = arguments;
|
|
if (timer) clearTimeout(timer);
|
|
timer = setTimeout(function () {
|
|
timer = null;
|
|
fn.apply(_this, args);
|
|
}, delay);
|
|
};
|
|
}
|
|
//节流 首次执行
|
|
function throttle(fn) {
|
|
var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;
|
|
var last = 0;
|
|
return function () {
|
|
var now = new Date();
|
|
if (now - last > delay) {
|
|
fn.apply(this, arguments);
|
|
last = now;
|
|
}
|
|
};
|
|
}
|
|
//提示
|
|
var toast = function toast(msg) {
|
|
var mask = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
var icon = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'none';
|
|
var duration = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1500;
|
|
uni.showToast({
|
|
title: String(msg),
|
|
icon: icon,
|
|
mask: mask,
|
|
duration: duration
|
|
});
|
|
};
|
|
//加载
|
|
var loading = function loading() {
|
|
var msg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '努力加载中';
|
|
var mask = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
uni.showLoading({
|
|
title: String(msg),
|
|
mask: mask
|
|
});
|
|
};
|
|
//json参数转url参数
|
|
var jsonToUrl = function jsonToUrl(path, param) {
|
|
var url = path;
|
|
var arr = [];
|
|
if (param) arr = Object.keys(param);
|
|
if (arr.length && arr.length != 0) {
|
|
var str = arr.map(function (key) {
|
|
return "".concat(key, "=").concat(decodeURIComponent(param[key]));
|
|
}).join('&');
|
|
url = "".concat(path).concat(path ? '?' : '').concat(str);
|
|
}
|
|
return url;
|
|
};
|
|
//url参数转json参数
|
|
var urlToJson = function urlToJson(url) {
|
|
var path = url;
|
|
var param = {};
|
|
if (url.indexOf('?') != -1) {
|
|
path = url.substr(0, url.indexOf('?'));
|
|
var arr = url.split("?")[1].split("&");
|
|
arr.forEach(function (i) {
|
|
if (i.split("=")[1] && i.split("=")[1] != 'undefined') param[i.split("=")[0]] = i.split("=")[1];
|
|
});
|
|
}
|
|
return {
|
|
path: path,
|
|
param: param
|
|
};
|
|
};
|
|
//url获取指定参数
|
|
var getQuery = function getQuery(key) {
|
|
var query = window.location.search.substring(1);
|
|
var vars = query.split("&");
|
|
for (var i = 0; i < vars.length; i++) {
|
|
var pair = vars[i].split("=");
|
|
if (pair[0] == key) {
|
|
return pair[1];
|
|
}
|
|
}
|
|
return false;
|
|
};
|
|
//加法
|
|
Number.prototype.add = function (arg) {
|
|
return (Math.round(this * 100) + Math.round(arg * 100)) / 100;
|
|
};
|
|
//减法
|
|
Number.prototype.sub = function (arg) {
|
|
arg = -arg;
|
|
return (Math.round(this * 100) + Math.round(arg * 100)) / 100;
|
|
};
|
|
//乘法
|
|
Number.prototype.mul = function (arg) {
|
|
return Math.round(this * 100) * Math.round(arg * 100) / 10000;
|
|
};
|
|
//除法
|
|
Number.prototype.div = function (arg) {
|
|
var d1, d2, n1, n2;
|
|
n1 = Number(this.toString().replace(".", ""));
|
|
n2 = Number(arg.toString().replace(".", ""));
|
|
try {
|
|
d1 = this.toString().split(".")[1].length;
|
|
} catch (e) {
|
|
d1 = 0;
|
|
}
|
|
try {
|
|
d2 = arg.toString().split(".")[1].length;
|
|
} catch (e) {
|
|
d2 = 0;
|
|
}
|
|
return toFixed(n1 / n2 * Math.pow(10, d2 - d1), 2);
|
|
};
|
|
//四舍五入保留小数
|
|
function toFixed(arg, n) {
|
|
if (n == 0) {
|
|
return Math.round(arg);
|
|
}
|
|
try {
|
|
var d,
|
|
carryD,
|
|
i,
|
|
ds = arg.toString().split('.'),
|
|
len = ds[1].length,
|
|
b0 = '',
|
|
k = 0;
|
|
if (len > n) {
|
|
while (k < n && ds[1].substring(0, ++k) == '0') {
|
|
b0 += '0';
|
|
}
|
|
d = Number(ds[1].substring(0, n));
|
|
carryD = Math.round(Number('0.' + ds[1].substring(n, len)));
|
|
len = (d + carryD).toString().length;
|
|
if (len > n) {
|
|
return Number(ds[0]) + 1;
|
|
} else if (len == n) {
|
|
return Number(ds[0] + '.' + (d + carryD));
|
|
}
|
|
return Number(ds[0] + '.' + b0 + (d + carryD));
|
|
}
|
|
} catch (e) {}
|
|
return arg;
|
|
}
|
|
//输出
|
|
var _default = {
|
|
toast: toast,
|
|
loading: loading,
|
|
jsonToUrl: jsonToUrl,
|
|
urlToJson: urlToJson,
|
|
getQuery: getQuery
|
|
};
|
|
exports.default = _default;
|
|
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-weixin/dist/index.js */ 2)["default"]))
|
|
|
|
/***/ }),
|
|
|
|
/***/ 363:
|
|
/*!******************************************************!*\
|
|
!*** D:/工作/zhonglmini/components/uni-icons/icons.js ***!
|
|
\******************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = void 0;
|
|
var _default = {
|
|
"pulldown": "\uE588",
|
|
"refreshempty": "\uE461",
|
|
"back": "\uE471",
|
|
"forward": "\uE470",
|
|
"more": "\uE507",
|
|
"more-filled": "\uE537",
|
|
"scan": "\uE612",
|
|
"qq": "\uE264",
|
|
"weibo": "\uE260",
|
|
"weixin": "\uE261",
|
|
"pengyouquan": "\uE262",
|
|
"loop": "\uE565",
|
|
"refresh": "\uE407",
|
|
"refresh-filled": "\uE437",
|
|
"arrowthindown": "\uE585",
|
|
"arrowthinleft": "\uE586",
|
|
"arrowthinright": "\uE587",
|
|
"arrowthinup": "\uE584",
|
|
"undo-filled": "\uE7D6",
|
|
"undo": "\uE406",
|
|
"redo": "\uE405",
|
|
"redo-filled": "\uE7D9",
|
|
"bars": "\uE563",
|
|
"chatboxes": "\uE203",
|
|
"camera": "\uE301",
|
|
"chatboxes-filled": "\uE233",
|
|
"camera-filled": "\uE7EF",
|
|
"cart-filled": "\uE7F4",
|
|
"cart": "\uE7F5",
|
|
"checkbox-filled": "\uE442",
|
|
"checkbox": "\uE7FA",
|
|
"arrowleft": "\uE582",
|
|
"arrowdown": "\uE581",
|
|
"arrowright": "\uE583",
|
|
"smallcircle-filled": "\uE801",
|
|
"arrowup": "\uE580",
|
|
"circle": "\uE411",
|
|
"eye-filled": "\uE568",
|
|
"eye-slash-filled": "\uE822",
|
|
"eye-slash": "\uE823",
|
|
"eye": "\uE824",
|
|
"flag-filled": "\uE825",
|
|
"flag": "\uE508",
|
|
"gear-filled": "\uE532",
|
|
"reload": "\uE462",
|
|
"gear": "\uE502",
|
|
"hand-thumbsdown-filled": "\uE83B",
|
|
"hand-thumbsdown": "\uE83C",
|
|
"hand-thumbsup-filled": "\uE83D",
|
|
"heart-filled": "\uE83E",
|
|
"hand-thumbsup": "\uE83F",
|
|
"heart": "\uE840",
|
|
"home": "\uE500",
|
|
"info": "\uE504",
|
|
"home-filled": "\uE530",
|
|
"info-filled": "\uE534",
|
|
"circle-filled": "\uE441",
|
|
"chat-filled": "\uE847",
|
|
"chat": "\uE263",
|
|
"mail-open-filled": "\uE84D",
|
|
"email-filled": "\uE231",
|
|
"mail-open": "\uE84E",
|
|
"email": "\uE201",
|
|
"checkmarkempty": "\uE472",
|
|
"list": "\uE562",
|
|
"locked-filled": "\uE856",
|
|
"locked": "\uE506",
|
|
"map-filled": "\uE85C",
|
|
"map-pin": "\uE85E",
|
|
"map-pin-ellipse": "\uE864",
|
|
"map": "\uE364",
|
|
"minus-filled": "\uE440",
|
|
"mic-filled": "\uE332",
|
|
"minus": "\uE410",
|
|
"micoff": "\uE360",
|
|
"mic": "\uE302",
|
|
"clear": "\uE434",
|
|
"smallcircle": "\uE868",
|
|
"close": "\uE404",
|
|
"closeempty": "\uE460",
|
|
"paperclip": "\uE567",
|
|
"paperplane": "\uE503",
|
|
"paperplane-filled": "\uE86E",
|
|
"person-filled": "\uE131",
|
|
"contact-filled": "\uE130",
|
|
"person": "\uE101",
|
|
"contact": "\uE100",
|
|
"images-filled": "\uE87A",
|
|
"phone": "\uE200",
|
|
"images": "\uE87B",
|
|
"image": "\uE363",
|
|
"image-filled": "\uE877",
|
|
"location-filled": "\uE333",
|
|
"location": "\uE303",
|
|
"plus-filled": "\uE439",
|
|
"plus": "\uE409",
|
|
"plusempty": "\uE468",
|
|
"help-filled": "\uE535",
|
|
"help": "\uE505",
|
|
"navigate-filled": "\uE884",
|
|
"navigate": "\uE501",
|
|
"mic-slash-filled": "\uE892",
|
|
"search": "\uE466",
|
|
"settings": "\uE560",
|
|
"sound": "\uE590",
|
|
"sound-filled": "\uE8A1",
|
|
"spinner-cycle": "\uE465",
|
|
"download-filled": "\uE8A4",
|
|
"personadd-filled": "\uE132",
|
|
"videocam-filled": "\uE8AF",
|
|
"personadd": "\uE102",
|
|
"upload": "\uE402",
|
|
"upload-filled": "\uE8B1",
|
|
"starhalf": "\uE463",
|
|
"star-filled": "\uE438",
|
|
"star": "\uE408",
|
|
"trash": "\uE401",
|
|
"phone-filled": "\uE230",
|
|
"compose": "\uE400",
|
|
"videocam": "\uE300",
|
|
"trash-filled": "\uE8DC",
|
|
"download": "\uE403",
|
|
"chatbubble-filled": "\uE232",
|
|
"chatbubble": "\uE202",
|
|
"cloud-download": "\uE8E4",
|
|
"cloud-upload-filled": "\uE8E5",
|
|
"cloud-upload": "\uE8E6",
|
|
"cloud-download-filled": "\uE8E9",
|
|
"headphones": "\uE8BF",
|
|
"shop": "\uE609"
|
|
};
|
|
exports.default = _default;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 37:
|
|
/*!********************************!*\
|
|
!*** D:/工作/zhonglmini/Json.js ***!
|
|
\********************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = void 0;
|
|
/* 用户 */
|
|
var userInfo = {
|
|
status: 1,
|
|
data: {
|
|
id: 1,
|
|
mobile: 18888888888,
|
|
nickname: 'Leo yo',
|
|
portrait: 'http://img.61ef.cn/news/201409/28/2014092805595807.jpg'
|
|
},
|
|
msg: '提示'
|
|
};
|
|
/* 首页轮播图 */
|
|
var carouselList = [{
|
|
src: "/static/temp/banner3.jpg",
|
|
background: "rgb(203, 87, 60)"
|
|
}, {
|
|
src: "/static/temp/banner2.jpg",
|
|
background: "rgb(205, 215, 218)"
|
|
}, {
|
|
src: "/static/temp/banner4.jpg",
|
|
background: "rgb(183, 73, 69)"
|
|
}];
|
|
/* 商品列表 */
|
|
var goodsList = [{
|
|
image: "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1553187020783&di=bac9dd78b36fd984502d404d231011c0&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201609%2F26%2F20160926173213_s5adi.jpeg",
|
|
image2: "http://pic.rmb.bdstatic.com/819a044daa66718c2c40a48c1ba971e6.jpeg",
|
|
image3: "http://img001.hc360.cn/y5/M00/1B/45/wKhQUVYFE0uEZ7zVAAAAAMj3H1w418.jpg",
|
|
title: "2019新款韩版宽松",
|
|
price: 179,
|
|
sales: 61
|
|
}, {
|
|
image: "https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=4031878334,2682695508&fm=11&gp=0.jpg",
|
|
image2: "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1554013048&di=a3dc9fd1406dd7bad7fbb97b5489ec04&imgtype=jpg&er=1&src=http%3A%2F%2Fimg009.hc360.cn%2Fhb%2FnKo44ac2656F831c684507E3Da0E3a26841.jpg",
|
|
image3: "http://img.zcool.cn/community/017a4e58b4eab6a801219c77084373.jpg",
|
|
title: "潘歌针织连衣裙",
|
|
price: 78,
|
|
sales: 16
|
|
}, {
|
|
image: "https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1620020012,789258862&fm=26&gp=0.jpg",
|
|
image2: "http://m.360buyimg.com/n12/jfs/t247/42/1078640382/162559/3628a0b/53f5ad09N0dd79894.jpg%21q70.jpg",
|
|
image3: "http://ikids.61kids.com.cn/upload/2018-12-29/1546070626796114.jpg",
|
|
title: "新品新款女装",
|
|
price: 108.8,
|
|
sales: 5
|
|
}, {
|
|
image: "https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=756705744,3505936868&fm=11&gp=0.jpg",
|
|
image2: "http://images.jaadee.com/images/201702/goods_img/30150_d85aed83521.jpg",
|
|
image3: "http://img13.360buyimg.com/popWaterMark/jfs/t865/120/206320620/138889/dcc94caa/550acedcN613e2a9d.jpg",
|
|
title: "私萱连衣裙",
|
|
price: 265,
|
|
sales: 88
|
|
}, {
|
|
image: "https://img13.360buyimg.com/n8/jfs/t1/30343/20/1029/481370/5c449438Ecb46a15b/2b2adccb6dc742fd.jpg",
|
|
image2: "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1553418265666&di=d4a7f7eb0ae3c859edeb921641ee1c3a&imgtype=0&src=http%3A%2F%2Fimg003.hc360.cn%2Fy3%2FM02%2FF8%2F9F%2FwKhQh1TuSkGELIlQAAAAAPuLl4M987.jpg",
|
|
image3: "http://img.ef43.com.cn/product/2016/8/05100204b0c.jpg",
|
|
title: "生潮韩版春夏短",
|
|
price: 422,
|
|
sales: 137
|
|
}, {
|
|
image: "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1553187020783&di=bac9dd78b36fd984502d404d231011c0&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201609%2F26%2F20160926173213_s5adi.jpeg",
|
|
image2: "http://image5.suning.cn/uimg/b2c/newcatentries/0070158827-000000000622091973_2_800x800.jpg",
|
|
image3: "http://img.61ef.cn/news/201903/20/2019032009251784.jpg",
|
|
title: "古黛妃2019新款韩版宽松",
|
|
price: 179,
|
|
sales: 95
|
|
}];
|
|
|
|
/* 购物车 */
|
|
var cartList = [{
|
|
id: 1,
|
|
image: 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1553005139&di=3368549edf9eee769a9bcb3fbbed2504&imgtype=jpg&er=1&src=http%3A%2F%2Fimg002.hc360.cn%2Fy3%2FM01%2F5F%2FDB%2FwKhQh1T7iceEGRdWAAAAADQvqk8733.jpg',
|
|
attr_val: '春装款 L',
|
|
stock: 15,
|
|
title: 'OVBE 长袖风衣',
|
|
price: 278.00,
|
|
number: 1
|
|
}, {
|
|
id: 3,
|
|
image: 'https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=2319343996,1107396922&fm=26&gp=0.jpg',
|
|
attr_val: '激光导航 扫拖一体',
|
|
stock: 3,
|
|
title: '科沃斯 Ecovacs 扫地机器人',
|
|
price: 1348.00,
|
|
number: 5
|
|
}, {
|
|
id: 4,
|
|
image: 'https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2668268226,1765897385&fm=26&gp=0.jpg',
|
|
attr_val: 'XL',
|
|
stock: 55,
|
|
title: '朵绒菲小西装',
|
|
price: 175.88,
|
|
number: 1
|
|
}, {
|
|
id: 5,
|
|
image: 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1552410549432&di=06dd3758053fb6d6362516f30a42d055&imgtype=0&src=http%3A%2F%2Fimgcache.mysodao.com%2Fimg3%2FM0A%2F67%2F42%2FCgAPD1vNSsHNm-TnAAEy61txQb4543_400x400x2.JPG',
|
|
attr_val: '520 #粉红色',
|
|
stock: 15,
|
|
title: '迪奥(Dior)烈艳唇膏',
|
|
price: 1089.00,
|
|
number: 1
|
|
}, {
|
|
id: 6,
|
|
image: 'https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1031875829,2994442603&fm=26&gp=0.jpg',
|
|
attr_val: '樱花味润手霜 30ml',
|
|
stock: 15,
|
|
title: "欧舒丹(L'OCCITANE)乳木果",
|
|
price: 128,
|
|
number: 1
|
|
}, {
|
|
id: 7,
|
|
image: 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1553007107&di=390915aa8a022cf0b03c03340881b0e7&imgtype=jpg&er=1&src=http%3A%2F%2Fimg13.360buyimg.com%2Fn0%2Fjfs%2Ft646%2F285%2F736444951%2F480473%2Faa701c97%2F548176feN10c9ed7b.jpg',
|
|
attr_val: '特级 12个',
|
|
stock: 7,
|
|
title: '新疆阿克苏苹果 特级',
|
|
price: 58.8,
|
|
number: 10
|
|
}, {
|
|
id: 8,
|
|
image: 'https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=2319343996,1107396922&fm=26&gp=0.jpg',
|
|
attr_val: '激光导航 扫拖一体',
|
|
stock: 15,
|
|
title: '科沃斯 Ecovacs 扫地机器人',
|
|
price: 1348.00,
|
|
number: 1
|
|
}, {
|
|
id: 9,
|
|
image: 'https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2668268226,1765897385&fm=26&gp=0.jpg',
|
|
attr_val: 'XL',
|
|
stock: 55,
|
|
title: '朵绒菲小西装',
|
|
price: 175.88,
|
|
number: 1
|
|
}, {
|
|
id: 10,
|
|
image: 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1552410549432&di=06dd3758053fb6d6362516f30a42d055&imgtype=0&src=http%3A%2F%2Fimgcache.mysodao.com%2Fimg3%2FM0A%2F67%2F42%2FCgAPD1vNSsHNm-TnAAEy61txQb4543_400x400x2.JPG',
|
|
attr_val: '520 #粉红色',
|
|
stock: 15,
|
|
title: '迪奥(Dior)烈艳唇膏',
|
|
price: 1089.00,
|
|
number: 1
|
|
}, {
|
|
id: 11,
|
|
image: 'https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1031875829,2994442603&fm=26&gp=0.jpg',
|
|
attr_val: '樱花味润手霜 30ml',
|
|
stock: 15,
|
|
title: "欧舒丹(L'OCCITANE)乳木果",
|
|
price: 128,
|
|
number: 1
|
|
}, {
|
|
id: 12,
|
|
image: 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1553007107&di=390915aa8a022cf0b03c03340881b0e7&imgtype=jpg&er=1&src=http%3A%2F%2Fimg13.360buyimg.com%2Fn0%2Fjfs%2Ft646%2F285%2F736444951%2F480473%2Faa701c97%2F548176feN10c9ed7b.jpg',
|
|
attr_val: '特级 12个',
|
|
stock: 7,
|
|
title: '新疆阿克苏苹果 特级',
|
|
price: 58.8,
|
|
number: 10
|
|
}, {
|
|
id: 13,
|
|
image: 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1552405266625&di=a703f2b2cdb0fe7f3f05f62dd91307ab&imgtype=0&src=http%3A%2F%2Fwww.78.cn%2Fzixun%2Fnews%2Fupload%2F20190214%2F1550114706486250.jpg',
|
|
attr_val: '春装款/m',
|
|
stock: 15,
|
|
title: '女装2019春秋新款',
|
|
price: 420.00,
|
|
number: 1
|
|
}];
|
|
//详情展示页面
|
|
var detailData = {
|
|
title: '纯种金毛幼犬活体有血统证书',
|
|
title2: '拆家小能手 你值得拥有',
|
|
favorite: true,
|
|
imgList: [{
|
|
src: 'http://img0.imgtn.bdimg.com/it/u=2396068252,4277062836&fm=26&gp=0.jpg'
|
|
}, {
|
|
src: 'http://img.pconline.com.cn/images/upload/upc/tx/itbbs/1309/06/c4/25310541_1378426131583.jpg'
|
|
}, {
|
|
src: 'http://img.pconline.com.cn/images/upload/upc/tx/photoblog/1610/26/c4/28926240_1477451226577_mthumb.jpg'
|
|
}, {
|
|
src: 'http://picture.ik123.com/uploads/allimg/190219/12-1Z219105139.jpg'
|
|
}],
|
|
episodeList: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24],
|
|
guessList: [{
|
|
src: 'http://img.52z.com/upload/news/image/20180530/20180530081619_31029.jpg',
|
|
title: '猫眼指甲油',
|
|
title2: '独树一帜的免照灯猫眼指甲'
|
|
}, {
|
|
src: 'http://m.china-7.net/uploads/14778449362891.jpg',
|
|
title: '创意屋',
|
|
title2: '创意屋形上下双层高低床'
|
|
}, {
|
|
src: 'http://www.k73.com/up/allimg/130415/22-130415093527.jpg',
|
|
title: 'MissCandy 指甲油',
|
|
title2: '十分适合喜欢素净的妹纸,尽显淡雅的气质'
|
|
}, {
|
|
src: 'http://img0.imgtn.bdimg.com/it/u=2108933440,2194129200&fm=214&gp=0.jpg ',
|
|
title: 'RMK 2017星空海蓝唇釉',
|
|
title2: '唇釉质地,上唇后很滋润。少女也会心动的蓝色,透明液体形状。'
|
|
}],
|
|
evaList: [{
|
|
src: 'http://gss0.baidu.com/-fo3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/77c6a7efce1b9d1663174705fbdeb48f8d546486.jpg',
|
|
nickname: 'Ranth Allngal',
|
|
time: '09-20 12:54',
|
|
zan: '54',
|
|
content: '评论不要太苛刻,不管什么产品都会有瑕疵,客服也说了可以退货并且商家承担运费,我觉得至少态度就可以给五星。'
|
|
}, {
|
|
src: 'http://img0.imgtn.bdimg.com/it/u=2396068252,4277062836&fm=26&gp=0.jpg',
|
|
nickname: 'Ranth Allngal',
|
|
time: '09-20 12:54',
|
|
zan: '54',
|
|
content: '楼上说的好有道理。'
|
|
}]
|
|
};
|
|
var shareList = [{
|
|
type: 1,
|
|
icon: '/static/temp/share_wechat.png',
|
|
text: '微信好友'
|
|
}, {
|
|
type: 2,
|
|
icon: '/static/temp/share_moment.png',
|
|
text: '朋友圈'
|
|
}, {
|
|
type: 3,
|
|
icon: '/static/temp/share_qq.png',
|
|
text: 'QQ好友'
|
|
}, {
|
|
type: 4,
|
|
icon: '/static/temp/share_qqzone.png',
|
|
text: 'QQ空间'
|
|
}];
|
|
var lazyLoadList = [{
|
|
src: 'http://img0.imgtn.bdimg.com/it/u=2396068252,4277062836&fm=26&gp=0.jpg'
|
|
}, {
|
|
src: 'http://img.pconline.com.cn/images/upload/upc/tx/itbbs/1309/06/c4/25310541_1378426131583.jpg'
|
|
}, {
|
|
src: 'http://img.pconline.com.cn/images/upload/upc/tx/photoblog/1610/26/c4/28926240_1477451226577_mthumb.jpg'
|
|
}, {
|
|
src: 'http://picture.ik123.com/uploads/allimg/190219/12-1Z219105139.jpg'
|
|
}, {
|
|
src: 'http://img5.imgtn.bdimg.com/it/u=2904900134,438461613&fm=26&gp=0.jpg'
|
|
}, {
|
|
src: 'http://img1.imgtn.bdimg.com/it/u=1690475408,2565370337&fm=26&gp=0.jpg'
|
|
}, {
|
|
src: 'http://img.99114.com/group1/M00/7F/99/wKgGS1kVrPGAe5LmAAU2KrJmb3Q923_600_600.jpg'
|
|
}, {
|
|
src: 'http://img4.imgtn.bdimg.com/it/u=261047209,372231813&fm=26&gp=0.jpg'
|
|
}, {
|
|
src: 'http://i2.17173cdn.com/i7mz64/YWxqaGBf/tu17173com/20150107/eMyVMObjlbcvDEv.jpg'
|
|
}, {
|
|
src: 'http://img008.hc360.cn/m4/M02/E7/87/wKhQ6FSrfU6EfUoyAAAAAITAfyc280.jpg'
|
|
}, {
|
|
src: 'http://pic1.win4000.com/wallpaper/d/5991569950166.jpg'
|
|
}, {
|
|
src: 'http://gss0.baidu.com/9fo3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/6f061d950a7b0208f9fe945e60d9f2d3572cc85e.jpg'
|
|
}, {
|
|
src: 'http://pic41.nipic.com/20140429/18169759_125841756000_2.jpg'
|
|
}, {
|
|
src: 'http://www.k73.com/up/allimg/130415/22-130415093527.jpg'
|
|
}, {
|
|
src: 'http://img.52z.com/upload/news/image/20180530/20180530081619_31029.jpg'
|
|
}, {
|
|
src: 'http://b-ssl.duitang.com/uploads/item/201410/02/20141002111638_tXAzU.jpeg'
|
|
}, {
|
|
src: 'http://img2.ph.126.net/C4JW6f57QWSB21-8jh2UGQ==/1762596304262286698.jpg'
|
|
}, {
|
|
src: 'http://att.bbs.duowan.com/forum/201405/17/190257nzcvkkdg6w2e8226.jpg'
|
|
}, {
|
|
src: 'http://attach.bbs.miui.com/forum/201504/10/223644v3intigyvva0vgym.jpg'
|
|
}, {
|
|
src: 'http://pic1.win4000.com/mobile/3/57888a298d61d.jpg'
|
|
}];
|
|
var orderList = [{
|
|
time: '2019-04-06 11:37',
|
|
state: 1,
|
|
goodsList: [{
|
|
image: 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1553187020783&di=bac9dd78b36fd984502d404d231011c0&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201609%2F26%2F20160926173213_s5adi.jpeg'
|
|
}, {
|
|
image: 'https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=4031878334,2682695508&fm=11&gp=0.jpg'
|
|
}, {
|
|
image: 'https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1620020012,789258862&fm=26&gp=0.jpg'
|
|
}, {
|
|
image: 'https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=4031878334,2682695508&fm=11&gp=0.jpg'
|
|
}, {
|
|
image: 'https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1620020012,789258862&fm=26&gp=0.jpg'
|
|
}, {
|
|
image: 'https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=4031878334,2682695508&fm=11&gp=0.jpg'
|
|
}, {
|
|
image: 'https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1620020012,789258862&fm=26&gp=0.jpg'
|
|
}]
|
|
}, {
|
|
time: '2019-04-06 11:37',
|
|
state: 9,
|
|
goodsList: [{
|
|
title: '古黛妃 短袖t恤女 春夏装2019新款韩版宽松',
|
|
price: 179.5,
|
|
image: 'https://img13.360buyimg.com/n8/jfs/t1/30343/20/1029/481370/5c449438Ecb46a15b/2b2adccb6dc742fd.jpg',
|
|
number: 1,
|
|
attr: '珊瑚粉 M'
|
|
}]
|
|
}, {
|
|
time: '2019-04-06 11:37',
|
|
state: 1,
|
|
goodsList: [{
|
|
image: 'https://img.alicdn.com/imgextra/https://img.alicdn.com/imgextra/i2/2120460599/O1CN01LBPS4C1GINkwsOTXS_!!2120460599.jpg_430x430q90.jpg'
|
|
}, {
|
|
image: 'https://img.alicdn.com/imgextra/i2/1069876356/TB2ocTQG4WYBuNjy1zkXXXGGpXa_!!1069876356.jpg_430x430q90.jpg'
|
|
}, {
|
|
image: 'https://img.alicdn.com/imgextra/https://img.alicdn.com/imgextra/i4/2120460599/O1CN01YsmgwZ1GINkv38rkn_!!2120460599.jpg_430x430q90.jpg'
|
|
}]
|
|
}, {
|
|
time: '2019-04-06 11:37',
|
|
state: 1,
|
|
goodsList: [{
|
|
title: '回力女鞋高帮帆布鞋女学生韩版鞋子女2019潮鞋女鞋新款春季板鞋女',
|
|
price: 69,
|
|
image: 'https://img.alicdn.com/imgextra/i3/2128794607/TB2gzzoc41YBuNjy1zcXXbNcXXa_!!2128794607.jpg_430x430q90.jpg',
|
|
number: 1,
|
|
attr: '白色-高帮 39'
|
|
}]
|
|
}, {
|
|
time: '2019-04-06 11:37',
|
|
state: 1,
|
|
goodsList: [{
|
|
image: 'https://img.alicdn.com/imgextra/https://img.alicdn.com/imgextra/i4/3358098495/O1CN01dhYyid2Ccl5MWLDok_!!3358098495.jpg_430x430q90.jpg'
|
|
}, {
|
|
image: 'https://img.alicdn.com/imgextra/https://img.alicdn.com/imgextra/i3/3358098495/O1CN01AWsnFA2Ccl5OzvqsL_!!3358098495.jpg_430x430q90.jpg'
|
|
}]
|
|
}, {
|
|
time: '2019-04-06 11:37',
|
|
state: 1,
|
|
goodsList: [{
|
|
image: 'https://img.alicdn.com/imgextra/i4/3470687433/O1CN0124mMQOSERr18L1h_!!3470687433.jpg_430x430q90.jpg'
|
|
}, {
|
|
image: 'https://img.alicdn.com/imgextra/i3/2888462616/O1CN01ERra5J1VCAbZaKI5n_!!0-item_pic.jpg_430x430q90.jpg'
|
|
}, {
|
|
image: 'https://gd3.alicdn.com/imgextra/i3/819381730/O1CN01YV4mXj1OeNhQIhQlh_!!819381730.jpg_400x400.jpg'
|
|
}]
|
|
}];
|
|
var cateList = [{
|
|
id: 1,
|
|
name: '手机数码'
|
|
}, {
|
|
id: 2,
|
|
name: '礼品鲜花'
|
|
}, {
|
|
id: 3,
|
|
name: '男装女装'
|
|
}, {
|
|
id: 4,
|
|
name: '母婴用品'
|
|
}, {
|
|
id: 5,
|
|
pid: 1,
|
|
name: '手机通讯'
|
|
}, {
|
|
id: 6,
|
|
pid: 1,
|
|
name: '运营商'
|
|
}, {
|
|
id: 8,
|
|
pid: 5,
|
|
name: '全面屏手机',
|
|
picture: '/static/temp/cate2.jpg'
|
|
}, {
|
|
id: 9,
|
|
pid: 5,
|
|
name: '游戏手机',
|
|
picture: '/static/temp/cate3.jpg'
|
|
}, {
|
|
id: 10,
|
|
pid: 5,
|
|
name: '老人机',
|
|
picture: '/static/temp/cate1.jpg'
|
|
}, {
|
|
id: 11,
|
|
pid: 5,
|
|
name: '拍照手机',
|
|
picture: '/static/temp/cate4.jpg'
|
|
}, {
|
|
id: 12,
|
|
pid: 5,
|
|
name: '女性手机',
|
|
picture: '/static/temp/cate5.jpg'
|
|
}, {
|
|
id: 14,
|
|
pid: 6,
|
|
name: '合约机',
|
|
picture: '/static/temp/cate1.jpg'
|
|
}, {
|
|
id: 15,
|
|
pid: 6,
|
|
name: '选好卡',
|
|
picture: '/static/temp/cate4.jpg'
|
|
}, {
|
|
id: 16,
|
|
pid: 6,
|
|
name: '办套餐',
|
|
picture: '/static/temp/cate5.jpg'
|
|
}, {
|
|
id: 17,
|
|
pid: 2,
|
|
name: '礼品'
|
|
}, {
|
|
id: 18,
|
|
pid: 2,
|
|
name: '鲜花'
|
|
}, {
|
|
id: 19,
|
|
pid: 17,
|
|
name: '公益摆件',
|
|
picture: '/static/temp/cate7.jpg'
|
|
}, {
|
|
id: 20,
|
|
pid: 17,
|
|
name: '创意礼品',
|
|
picture: '/static/temp/cate8.jpg'
|
|
}, {
|
|
id: 21,
|
|
pid: 18,
|
|
name: '鲜花',
|
|
picture: '/static/temp/cate9.jpg'
|
|
}, {
|
|
id: 22,
|
|
pid: 18,
|
|
name: '每周一花',
|
|
picture: '/static/temp/cate10.jpg'
|
|
}, {
|
|
id: 23,
|
|
pid: 18,
|
|
name: '卡通花束',
|
|
picture: '/static/temp/cate11.jpg'
|
|
}, {
|
|
id: 24,
|
|
pid: 18,
|
|
name: '永生花',
|
|
picture: '/static/temp/cate12.jpg'
|
|
}, {
|
|
id: 25,
|
|
pid: 3,
|
|
name: '男装'
|
|
}, {
|
|
id: 26,
|
|
pid: 3,
|
|
name: '女装'
|
|
}, {
|
|
id: 27,
|
|
pid: 25,
|
|
name: '男士T恤',
|
|
picture: '/static/temp/cate13.jpg'
|
|
}, {
|
|
id: 28,
|
|
pid: 25,
|
|
name: '男士外套',
|
|
picture: '/static/temp/cate14.jpg'
|
|
}, {
|
|
id: 29,
|
|
pid: 26,
|
|
name: '裙装',
|
|
picture: '/static/temp/cate15.jpg'
|
|
}, {
|
|
id: 30,
|
|
pid: 26,
|
|
name: 'T恤',
|
|
picture: '/static/temp/cate16.jpg'
|
|
}, {
|
|
id: 31,
|
|
pid: 26,
|
|
name: '上装',
|
|
picture: '/static/temp/cate15.jpg'
|
|
}, {
|
|
id: 32,
|
|
pid: 26,
|
|
name: '下装',
|
|
picture: '/static/temp/cate16.jpg'
|
|
}, {
|
|
id: 33,
|
|
pid: 4,
|
|
name: '奶粉'
|
|
}, {
|
|
id: 34,
|
|
pid: 4,
|
|
name: '营养辅食'
|
|
}, {
|
|
id: 35,
|
|
pid: 4,
|
|
name: '童装'
|
|
}, {
|
|
id: 39,
|
|
pid: 4,
|
|
name: '喂养用品'
|
|
}, {
|
|
id: 36,
|
|
pid: 33,
|
|
name: '有机奶粉',
|
|
picture: '/static/temp/cate17.jpg'
|
|
}, {
|
|
id: 37,
|
|
pid: 34,
|
|
name: '果泥/果汁',
|
|
picture: '/static/temp/cate18.jpg'
|
|
}, {
|
|
id: 39,
|
|
pid: 34,
|
|
name: '面条/粥',
|
|
picture: '/static/temp/cate20.jpg'
|
|
}, {
|
|
id: 42,
|
|
pid: 35,
|
|
name: '婴童衣橱',
|
|
picture: '/static/temp/cate19.jpg'
|
|
}, {
|
|
id: 43,
|
|
pid: 39,
|
|
name: '吸奶器',
|
|
picture: '/static/temp/cate21.jpg'
|
|
}, {
|
|
id: 44,
|
|
pid: 39,
|
|
name: '儿童餐具',
|
|
picture: '/static/temp/cate22.jpg'
|
|
}, {
|
|
id: 45,
|
|
pid: 39,
|
|
name: '牙胶安抚',
|
|
picture: '/static/temp/cate23.jpg'
|
|
}, {
|
|
id: 46,
|
|
pid: 39,
|
|
name: '围兜',
|
|
picture: '/static/temp/cate24.jpg'
|
|
}];
|
|
var _default = {
|
|
carouselList: carouselList,
|
|
cartList: cartList,
|
|
detailData: detailData,
|
|
lazyLoadList: lazyLoadList,
|
|
userInfo: userInfo,
|
|
shareList: shareList,
|
|
goodsList: goodsList,
|
|
orderList: orderList,
|
|
cateList: cateList
|
|
};
|
|
exports.default = _default;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 4:
|
|
/*!**********************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/interopRequireDefault.js ***!
|
|
\**********************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
function _interopRequireDefault(obj) {
|
|
return obj && obj.__esModule ? obj : {
|
|
"default": obj
|
|
};
|
|
}
|
|
module.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 44:
|
|
/*!************************************************************************************************!*\
|
|
!*** ./node_modules/@dcloudio/vue-cli-plugin-uni/packages/@babel/runtime/regenerator/index.js ***!
|
|
\************************************************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
// TODO(Babel 8): Remove this file.
|
|
|
|
var runtime = __webpack_require__(/*! @babel/runtime/helpers/regeneratorRuntime */ 45)();
|
|
module.exports = runtime;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 45:
|
|
/*!*******************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/regeneratorRuntime.js ***!
|
|
\*******************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var _typeof = __webpack_require__(/*! ./typeof.js */ 13)["default"];
|
|
function _regeneratorRuntime() {
|
|
"use strict";
|
|
|
|
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
|
|
module.exports = _regeneratorRuntime = function _regeneratorRuntime() {
|
|
return e;
|
|
}, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
var t,
|
|
e = {},
|
|
r = Object.prototype,
|
|
n = r.hasOwnProperty,
|
|
o = Object.defineProperty || function (t, e, r) {
|
|
t[e] = r.value;
|
|
},
|
|
i = "function" == typeof Symbol ? Symbol : {},
|
|
a = i.iterator || "@@iterator",
|
|
c = i.asyncIterator || "@@asyncIterator",
|
|
u = i.toStringTag || "@@toStringTag";
|
|
function define(t, e, r) {
|
|
return Object.defineProperty(t, e, {
|
|
value: r,
|
|
enumerable: !0,
|
|
configurable: !0,
|
|
writable: !0
|
|
}), t[e];
|
|
}
|
|
try {
|
|
define({}, "");
|
|
} catch (t) {
|
|
define = function define(t, e, r) {
|
|
return t[e] = r;
|
|
};
|
|
}
|
|
function wrap(t, e, r, n) {
|
|
var i = e && e.prototype instanceof Generator ? e : Generator,
|
|
a = Object.create(i.prototype),
|
|
c = new Context(n || []);
|
|
return o(a, "_invoke", {
|
|
value: makeInvokeMethod(t, r, c)
|
|
}), a;
|
|
}
|
|
function tryCatch(t, e, r) {
|
|
try {
|
|
return {
|
|
type: "normal",
|
|
arg: t.call(e, r)
|
|
};
|
|
} catch (t) {
|
|
return {
|
|
type: "throw",
|
|
arg: t
|
|
};
|
|
}
|
|
}
|
|
e.wrap = wrap;
|
|
var h = "suspendedStart",
|
|
l = "suspendedYield",
|
|
f = "executing",
|
|
s = "completed",
|
|
y = {};
|
|
function Generator() {}
|
|
function GeneratorFunction() {}
|
|
function GeneratorFunctionPrototype() {}
|
|
var p = {};
|
|
define(p, a, function () {
|
|
return this;
|
|
});
|
|
var d = Object.getPrototypeOf,
|
|
v = d && d(d(values([])));
|
|
v && v !== r && n.call(v, a) && (p = v);
|
|
var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p);
|
|
function defineIteratorMethods(t) {
|
|
["next", "throw", "return"].forEach(function (e) {
|
|
define(t, e, function (t) {
|
|
return this._invoke(e, t);
|
|
});
|
|
});
|
|
}
|
|
function AsyncIterator(t, e) {
|
|
function invoke(r, o, i, a) {
|
|
var c = tryCatch(t[r], t, o);
|
|
if ("throw" !== c.type) {
|
|
var u = c.arg,
|
|
h = u.value;
|
|
return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) {
|
|
invoke("next", t, i, a);
|
|
}, function (t) {
|
|
invoke("throw", t, i, a);
|
|
}) : e.resolve(h).then(function (t) {
|
|
u.value = t, i(u);
|
|
}, function (t) {
|
|
return invoke("throw", t, i, a);
|
|
});
|
|
}
|
|
a(c.arg);
|
|
}
|
|
var r;
|
|
o(this, "_invoke", {
|
|
value: function value(t, n) {
|
|
function callInvokeWithMethodAndArg() {
|
|
return new e(function (e, r) {
|
|
invoke(t, n, e, r);
|
|
});
|
|
}
|
|
return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
|
|
}
|
|
});
|
|
}
|
|
function makeInvokeMethod(e, r, n) {
|
|
var o = h;
|
|
return function (i, a) {
|
|
if (o === f) throw Error("Generator is already running");
|
|
if (o === s) {
|
|
if ("throw" === i) throw a;
|
|
return {
|
|
value: t,
|
|
done: !0
|
|
};
|
|
}
|
|
for (n.method = i, n.arg = a;;) {
|
|
var c = n.delegate;
|
|
if (c) {
|
|
var u = maybeInvokeDelegate(c, n);
|
|
if (u) {
|
|
if (u === y) continue;
|
|
return u;
|
|
}
|
|
}
|
|
if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) {
|
|
if (o === h) throw o = s, n.arg;
|
|
n.dispatchException(n.arg);
|
|
} else "return" === n.method && n.abrupt("return", n.arg);
|
|
o = f;
|
|
var p = tryCatch(e, r, n);
|
|
if ("normal" === p.type) {
|
|
if (o = n.done ? s : l, p.arg === y) continue;
|
|
return {
|
|
value: p.arg,
|
|
done: n.done
|
|
};
|
|
}
|
|
"throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg);
|
|
}
|
|
};
|
|
}
|
|
function maybeInvokeDelegate(e, r) {
|
|
var n = r.method,
|
|
o = e.iterator[n];
|
|
if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y;
|
|
var i = tryCatch(o, e.iterator, r.arg);
|
|
if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y;
|
|
var a = i.arg;
|
|
return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y);
|
|
}
|
|
function pushTryEntry(t) {
|
|
var e = {
|
|
tryLoc: t[0]
|
|
};
|
|
1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e);
|
|
}
|
|
function resetTryEntry(t) {
|
|
var e = t.completion || {};
|
|
e.type = "normal", delete e.arg, t.completion = e;
|
|
}
|
|
function Context(t) {
|
|
this.tryEntries = [{
|
|
tryLoc: "root"
|
|
}], t.forEach(pushTryEntry, this), this.reset(!0);
|
|
}
|
|
function values(e) {
|
|
if (e || "" === e) {
|
|
var r = e[a];
|
|
if (r) return r.call(e);
|
|
if ("function" == typeof e.next) return e;
|
|
if (!isNaN(e.length)) {
|
|
var o = -1,
|
|
i = function next() {
|
|
for (; ++o < e.length;) {
|
|
if (n.call(e, o)) return next.value = e[o], next.done = !1, next;
|
|
}
|
|
return next.value = t, next.done = !0, next;
|
|
};
|
|
return i.next = i;
|
|
}
|
|
}
|
|
throw new TypeError(_typeof(e) + " is not iterable");
|
|
}
|
|
return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", {
|
|
value: GeneratorFunctionPrototype,
|
|
configurable: !0
|
|
}), o(GeneratorFunctionPrototype, "constructor", {
|
|
value: GeneratorFunction,
|
|
configurable: !0
|
|
}), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) {
|
|
var e = "function" == typeof t && t.constructor;
|
|
return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name));
|
|
}, e.mark = function (t) {
|
|
return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t;
|
|
}, e.awrap = function (t) {
|
|
return {
|
|
__await: t
|
|
};
|
|
}, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () {
|
|
return this;
|
|
}), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) {
|
|
void 0 === i && (i = Promise);
|
|
var a = new AsyncIterator(wrap(t, r, n, o), i);
|
|
return e.isGeneratorFunction(r) ? a : a.next().then(function (t) {
|
|
return t.done ? t.value : a.next();
|
|
});
|
|
}, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () {
|
|
return this;
|
|
}), define(g, "toString", function () {
|
|
return "[object Generator]";
|
|
}), e.keys = function (t) {
|
|
var e = Object(t),
|
|
r = [];
|
|
for (var n in e) {
|
|
r.push(n);
|
|
}
|
|
return r.reverse(), function next() {
|
|
for (; r.length;) {
|
|
var t = r.pop();
|
|
if (t in e) return next.value = t, next.done = !1, next;
|
|
}
|
|
return next.done = !0, next;
|
|
};
|
|
}, e.values = values, Context.prototype = {
|
|
constructor: Context,
|
|
reset: function reset(e) {
|
|
if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) {
|
|
"t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t);
|
|
}
|
|
},
|
|
stop: function stop() {
|
|
this.done = !0;
|
|
var t = this.tryEntries[0].completion;
|
|
if ("throw" === t.type) throw t.arg;
|
|
return this.rval;
|
|
},
|
|
dispatchException: function dispatchException(e) {
|
|
if (this.done) throw e;
|
|
var r = this;
|
|
function handle(n, o) {
|
|
return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o;
|
|
}
|
|
for (var o = this.tryEntries.length - 1; o >= 0; --o) {
|
|
var i = this.tryEntries[o],
|
|
a = i.completion;
|
|
if ("root" === i.tryLoc) return handle("end");
|
|
if (i.tryLoc <= this.prev) {
|
|
var c = n.call(i, "catchLoc"),
|
|
u = n.call(i, "finallyLoc");
|
|
if (c && u) {
|
|
if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);
|
|
if (this.prev < i.finallyLoc) return handle(i.finallyLoc);
|
|
} else if (c) {
|
|
if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);
|
|
} else {
|
|
if (!u) throw Error("try statement without catch or finally");
|
|
if (this.prev < i.finallyLoc) return handle(i.finallyLoc);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
abrupt: function abrupt(t, e) {
|
|
for (var r = this.tryEntries.length - 1; r >= 0; --r) {
|
|
var o = this.tryEntries[r];
|
|
if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) {
|
|
var i = o;
|
|
break;
|
|
}
|
|
}
|
|
i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null);
|
|
var a = i ? i.completion : {};
|
|
return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a);
|
|
},
|
|
complete: function complete(t, e) {
|
|
if ("throw" === t.type) throw t.arg;
|
|
return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y;
|
|
},
|
|
finish: function finish(t) {
|
|
for (var e = this.tryEntries.length - 1; e >= 0; --e) {
|
|
var r = this.tryEntries[e];
|
|
if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y;
|
|
}
|
|
},
|
|
"catch": function _catch(t) {
|
|
for (var e = this.tryEntries.length - 1; e >= 0; --e) {
|
|
var r = this.tryEntries[e];
|
|
if (r.tryLoc === t) {
|
|
var n = r.completion;
|
|
if ("throw" === n.type) {
|
|
var o = n.arg;
|
|
resetTryEntry(r);
|
|
}
|
|
return o;
|
|
}
|
|
}
|
|
throw Error("illegal catch attempt");
|
|
},
|
|
delegateYield: function delegateYield(e, r, n) {
|
|
return this.delegate = {
|
|
iterator: values(e),
|
|
resultName: r,
|
|
nextLoc: n
|
|
}, "next" === this.method && (this.arg = t), y;
|
|
}
|
|
}, e;
|
|
}
|
|
module.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 46:
|
|
/*!*****************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/asyncToGenerator.js ***!
|
|
\*****************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
try {
|
|
var info = gen[key](arg);
|
|
var value = info.value;
|
|
} catch (error) {
|
|
reject(error);
|
|
return;
|
|
}
|
|
if (info.done) {
|
|
resolve(value);
|
|
} else {
|
|
Promise.resolve(value).then(_next, _throw);
|
|
}
|
|
}
|
|
function _asyncToGenerator(fn) {
|
|
return function () {
|
|
var self = this,
|
|
args = arguments;
|
|
return new Promise(function (resolve, reject) {
|
|
var gen = fn.apply(self, args);
|
|
function _next(value) {
|
|
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
}
|
|
function _throw(err) {
|
|
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
}
|
|
_next(undefined);
|
|
});
|
|
};
|
|
}
|
|
module.exports = _asyncToGenerator, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 5:
|
|
/*!**************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/slicedToArray.js ***!
|
|
\**************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var arrayWithHoles = __webpack_require__(/*! ./arrayWithHoles.js */ 6);
|
|
var iterableToArrayLimit = __webpack_require__(/*! ./iterableToArrayLimit.js */ 7);
|
|
var unsupportedIterableToArray = __webpack_require__(/*! ./unsupportedIterableToArray.js */ 8);
|
|
var nonIterableRest = __webpack_require__(/*! ./nonIterableRest.js */ 10);
|
|
function _slicedToArray(arr, i) {
|
|
return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();
|
|
}
|
|
module.exports = _slicedToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 6:
|
|
/*!***************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/arrayWithHoles.js ***!
|
|
\***************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
function _arrayWithHoles(arr) {
|
|
if (Array.isArray(arr)) return arr;
|
|
}
|
|
module.exports = _arrayWithHoles, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 7:
|
|
/*!*********************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/iterableToArrayLimit.js ***!
|
|
\*********************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
function _iterableToArrayLimit(r, l) {
|
|
var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
|
|
if (null != t) {
|
|
var e,
|
|
n,
|
|
i,
|
|
u,
|
|
a = [],
|
|
f = !0,
|
|
o = !1;
|
|
try {
|
|
if (i = (t = t.call(r)).next, 0 === l) {
|
|
if (Object(t) !== t) return;
|
|
f = !1;
|
|
} else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0) {
|
|
;
|
|
}
|
|
} catch (r) {
|
|
o = !0, n = r;
|
|
} finally {
|
|
try {
|
|
if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return;
|
|
} finally {
|
|
if (o) throw n;
|
|
}
|
|
}
|
|
return a;
|
|
}
|
|
}
|
|
module.exports = _iterableToArrayLimit, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 71:
|
|
/*!****************************************!*\
|
|
!*** D:/工作/zhonglmini/static/excel.js ***!
|
|
\****************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
/* WEBPACK VAR INJECTION */(function(Buffer, process, wx, uni) {var _toConsumableArray = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ 18);
|
|
var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ 13);
|
|
/*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
|
/* vim: set ts=2: */
|
|
/*exported XLSX */
|
|
/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */
|
|
var XLSX = {};
|
|
var make_xlsx_lib = function make_xlsx_lib(XLSX) {
|
|
XLSX.version = '0.17.5';
|
|
var current_codepage = 1200,
|
|
current_ansi = 1252;
|
|
var VALID_ANSI = [874, 932, 936, 949, 950];
|
|
for (var i = 0; i <= 8; ++i) {
|
|
VALID_ANSI.push(1250 + i);
|
|
}
|
|
/* ECMA-376 Part I 18.4.1 charset to codepage mapping */
|
|
var CS2CP = {
|
|
0: 1252,
|
|
/* ANSI */
|
|
1: 65001,
|
|
/* DEFAULT */
|
|
2: 65001,
|
|
/* SYMBOL */
|
|
77: 10000,
|
|
/* MAC */
|
|
128: 932,
|
|
/* SHIFTJIS */
|
|
129: 949,
|
|
/* HANGUL */
|
|
130: 1361,
|
|
/* JOHAB */
|
|
134: 936,
|
|
/* GB2312 */
|
|
136: 950,
|
|
/* CHINESEBIG5 */
|
|
161: 1253,
|
|
/* GREEK */
|
|
162: 1254,
|
|
/* TURKISH */
|
|
163: 1258,
|
|
/* VIETNAMESE */
|
|
177: 1255,
|
|
/* HEBREW */
|
|
178: 1256,
|
|
/* ARABIC */
|
|
186: 1257,
|
|
/* BALTIC */
|
|
204: 1251,
|
|
/* RUSSIAN */
|
|
222: 874,
|
|
/* THAI */
|
|
238: 1250,
|
|
/* EASTEUROPE */
|
|
255: 1252,
|
|
/* OEM */
|
|
69: 6969 /* MISC */
|
|
};
|
|
|
|
var set_ansi = function set_ansi(cp) {
|
|
if (VALID_ANSI.indexOf(cp) == -1) return;
|
|
current_ansi = CS2CP[0] = cp;
|
|
};
|
|
function reset_ansi() {
|
|
set_ansi(1252);
|
|
}
|
|
var set_cp = function set_cp(cp) {
|
|
current_codepage = cp;
|
|
set_ansi(cp);
|
|
};
|
|
function reset_cp() {
|
|
set_cp(1200);
|
|
reset_ansi();
|
|
}
|
|
function char_codes(data) {
|
|
var o = [];
|
|
for (var i = 0, len = data.length; i < len; ++i) {
|
|
o[i] = data.charCodeAt(i);
|
|
}
|
|
return o;
|
|
}
|
|
function utf16leread(data) {
|
|
var o = [];
|
|
for (var i = 0; i < data.length >> 1; ++i) {
|
|
o[i] = String.fromCharCode(data.charCodeAt(2 * i) + (data.charCodeAt(2 * i + 1) << 8));
|
|
}
|
|
return o.join("");
|
|
}
|
|
function utf16beread(data) {
|
|
var o = [];
|
|
for (var i = 0; i < data.length >> 1; ++i) {
|
|
o[i] = String.fromCharCode(data.charCodeAt(2 * i + 1) + (data.charCodeAt(2 * i) << 8));
|
|
}
|
|
return o.join("");
|
|
}
|
|
var debom = function debom(data) {
|
|
var c1 = data.charCodeAt(0),
|
|
c2 = data.charCodeAt(1);
|
|
if (c1 == 0xFF && c2 == 0xFE) return utf16leread(data.slice(2));
|
|
if (c1 == 0xFE && c2 == 0xFF) return utf16beread(data.slice(2));
|
|
if (c1 == 0xFEFF) return data.slice(1);
|
|
return data;
|
|
};
|
|
var _getchar = function _gc1(x) {
|
|
return String.fromCharCode(x);
|
|
};
|
|
var _getansi = function _ga1(x) {
|
|
return String.fromCharCode(x);
|
|
};
|
|
var DENSE = null;
|
|
var DIF_XL = true;
|
|
var Base64 = function make_b64() {
|
|
var map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
|
|
return {
|
|
encode: function encode(input) {
|
|
var o = "";
|
|
var c1 = 0,
|
|
c2 = 0,
|
|
c3 = 0,
|
|
e1 = 0,
|
|
e2 = 0,
|
|
e3 = 0,
|
|
e4 = 0;
|
|
for (var i = 0; i < input.length;) {
|
|
c1 = input.charCodeAt(i++);
|
|
e1 = c1 >> 2;
|
|
c2 = input.charCodeAt(i++);
|
|
e2 = (c1 & 3) << 4 | c2 >> 4;
|
|
c3 = input.charCodeAt(i++);
|
|
e3 = (c2 & 15) << 2 | c3 >> 6;
|
|
e4 = c3 & 63;
|
|
if (isNaN(c2)) {
|
|
e3 = e4 = 64;
|
|
} else if (isNaN(c3)) {
|
|
e4 = 64;
|
|
}
|
|
o += map.charAt(e1) + map.charAt(e2) + map.charAt(e3) + map.charAt(e4);
|
|
}
|
|
return o;
|
|
},
|
|
decode: function b64_decode(input) {
|
|
var o = "";
|
|
var c1 = 0,
|
|
c2 = 0,
|
|
c3 = 0,
|
|
e1 = 0,
|
|
e2 = 0,
|
|
e3 = 0,
|
|
e4 = 0;
|
|
input = input.replace(/[^\w\+\/\=]/g, "");
|
|
for (var i = 0; i < input.length;) {
|
|
e1 = map.indexOf(input.charAt(i++));
|
|
e2 = map.indexOf(input.charAt(i++));
|
|
c1 = e1 << 2 | e2 >> 4;
|
|
o += String.fromCharCode(c1);
|
|
e3 = map.indexOf(input.charAt(i++));
|
|
c2 = (e2 & 15) << 4 | e3 >> 2;
|
|
if (e3 !== 64) {
|
|
o += String.fromCharCode(c2);
|
|
}
|
|
e4 = map.indexOf(input.charAt(i++));
|
|
c3 = (e3 & 3) << 6 | e4;
|
|
if (e4 !== 64) {
|
|
o += String.fromCharCode(c3);
|
|
}
|
|
}
|
|
return o;
|
|
}
|
|
};
|
|
}();
|
|
var has_buf = typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && !!process.versions.node;
|
|
var Buffer_from = function Buffer_from() {};
|
|
if (typeof Buffer !== 'undefined') {
|
|
var nbfs = !Buffer.from;
|
|
if (!nbfs) try {
|
|
Buffer.from("foo", "utf8");
|
|
} catch (e) {
|
|
nbfs = true;
|
|
}
|
|
Buffer_from = nbfs ? function (buf, enc) {
|
|
return enc ? new Buffer(buf, enc) : new Buffer(buf);
|
|
} : Buffer.from.bind(Buffer);
|
|
// $FlowIgnore
|
|
if (!Buffer.alloc) Buffer.alloc = function (n) {
|
|
return new Buffer(n);
|
|
};
|
|
// $FlowIgnore
|
|
if (!Buffer.allocUnsafe) Buffer.allocUnsafe = function (n) {
|
|
return new Buffer(n);
|
|
};
|
|
}
|
|
function new_raw_buf(len) {
|
|
/* jshint -W056 */
|
|
return has_buf ? Buffer.alloc(len) : new Array(len);
|
|
/* jshint +W056 */
|
|
}
|
|
|
|
function new_unsafe_buf(len) {
|
|
/* jshint -W056 */
|
|
return has_buf ? Buffer.allocUnsafe(len) : new Array(len);
|
|
/* jshint +W056 */
|
|
}
|
|
|
|
var s2a = function s2a(s) {
|
|
if (has_buf) return Buffer_from(s, "binary");
|
|
return s.split("").map(function (x) {
|
|
return x.charCodeAt(0) & 0xff;
|
|
});
|
|
};
|
|
function s2ab(s) {
|
|
if (typeof ArrayBuffer === 'undefined') return s2a(s);
|
|
var buf = new ArrayBuffer(s.length),
|
|
view = new Uint8Array(buf);
|
|
for (var i = 0; i != s.length; ++i) {
|
|
view[i] = s.charCodeAt(i) & 0xFF;
|
|
}
|
|
return buf;
|
|
}
|
|
function a2s(data) {
|
|
if (Array.isArray(data)) return data.map(function (c) {
|
|
return String.fromCharCode(c);
|
|
}).join("");
|
|
var o = [];
|
|
for (var i = 0; i < data.length; ++i) {
|
|
o[i] = String.fromCharCode(data[i]);
|
|
}
|
|
return o.join("");
|
|
}
|
|
function a2u(data) {
|
|
if (typeof Uint8Array === 'undefined') throw new Error("Unsupported");
|
|
return new Uint8Array(data);
|
|
}
|
|
function ab2a(data) {
|
|
if (typeof ArrayBuffer == 'undefined') throw new Error("Unsupported");
|
|
if (data instanceof ArrayBuffer) return ab2a(new Uint8Array(data));
|
|
var o = new Array(data.length);
|
|
for (var i = 0; i < data.length; ++i) {
|
|
o[i] = data[i];
|
|
}
|
|
return o;
|
|
}
|
|
var bconcat = function bconcat(bufs) {
|
|
return [].concat.apply([], bufs);
|
|
};
|
|
var chr0 = /\u0000/g,
|
|
chr1 = /[\u0001-\u0006]/g;
|
|
/* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
|
/*jshint -W041 */
|
|
var SSF = {};
|
|
var make_ssf = function make_ssf(SSF) {
|
|
SSF.version = '0.11.2';
|
|
function _strrev(x) {
|
|
var o = "",
|
|
i = x.length - 1;
|
|
while (i >= 0) {
|
|
o += x.charAt(i--);
|
|
}
|
|
return o;
|
|
}
|
|
function fill(c, l) {
|
|
var o = "";
|
|
while (o.length < l) {
|
|
o += c;
|
|
}
|
|
return o;
|
|
}
|
|
function pad0(v, d) {
|
|
var t = "" + v;
|
|
return t.length >= d ? t : fill('0', d - t.length) + t;
|
|
}
|
|
function pad_(v, d) {
|
|
var t = "" + v;
|
|
return t.length >= d ? t : fill(' ', d - t.length) + t;
|
|
}
|
|
function rpad_(v, d) {
|
|
var t = "" + v;
|
|
return t.length >= d ? t : t + fill(' ', d - t.length);
|
|
}
|
|
function pad0r1(v, d) {
|
|
var t = "" + Math.round(v);
|
|
return t.length >= d ? t : fill('0', d - t.length) + t;
|
|
}
|
|
function pad0r2(v, d) {
|
|
var t = "" + v;
|
|
return t.length >= d ? t : fill('0', d - t.length) + t;
|
|
}
|
|
var p2_32 = Math.pow(2, 32);
|
|
function pad0r(v, d) {
|
|
if (v > p2_32 || v < -p2_32) return pad0r1(v, d);
|
|
var i = Math.round(v);
|
|
return pad0r2(i, d);
|
|
}
|
|
function isgeneral(s, i) {
|
|
i = i || 0;
|
|
return s.length >= 7 + i && (s.charCodeAt(i) | 32) === 103 && (s.charCodeAt(i + 1) | 32) === 101 && (s.charCodeAt(i + 2) | 32) === 110 && (s.charCodeAt(i + 3) | 32) === 101 && (s.charCodeAt(i + 4) | 32) === 114 && (s.charCodeAt(i + 5) | 32) === 97 && (s.charCodeAt(i + 6) | 32) === 108;
|
|
}
|
|
var days = [['Sun', 'Sunday'], ['Mon', 'Monday'], ['Tue', 'Tuesday'], ['Wed', 'Wednesday'], ['Thu', 'Thursday'], ['Fri', 'Friday'], ['Sat', 'Saturday']];
|
|
var months = [['J', 'Jan', 'January'], ['F', 'Feb', 'February'], ['M', 'Mar', 'March'], ['A', 'Apr', 'April'], ['M', 'May', 'May'], ['J', 'Jun', 'June'], ['J', 'Jul', 'July'], ['A', 'Aug', 'August'], ['S', 'Sep', 'September'], ['O', 'Oct', 'October'], ['N', 'Nov', 'November'], ['D', 'Dec', 'December']];
|
|
function init_table(t) {
|
|
t[0] = 'General';
|
|
t[1] = '0';
|
|
t[2] = '0.00';
|
|
t[3] = '#,##0';
|
|
t[4] = '#,##0.00';
|
|
t[9] = '0%';
|
|
t[10] = '0.00%';
|
|
t[11] = '0.00E+00';
|
|
t[12] = '# ?/?';
|
|
t[13] = '# ??/??';
|
|
t[14] = 'm/d/yy';
|
|
t[15] = 'd-mmm-yy';
|
|
t[16] = 'd-mmm';
|
|
t[17] = 'mmm-yy';
|
|
t[18] = 'h:mm AM/PM';
|
|
t[19] = 'h:mm:ss AM/PM';
|
|
t[20] = 'h:mm';
|
|
t[21] = 'h:mm:ss';
|
|
t[22] = 'm/d/yy h:mm';
|
|
t[37] = '#,##0 ;(#,##0)';
|
|
t[38] = '#,##0 ;[Red](#,##0)';
|
|
t[39] = '#,##0.00;(#,##0.00)';
|
|
t[40] = '#,##0.00;[Red](#,##0.00)';
|
|
t[45] = 'mm:ss';
|
|
t[46] = '[h]:mm:ss';
|
|
t[47] = 'mmss.0';
|
|
t[48] = '##0.0E+0';
|
|
t[49] = '@';
|
|
t[56] = '"上午/下午 "hh"時"mm"分"ss"秒 "';
|
|
}
|
|
var table_fmt = {};
|
|
init_table(table_fmt);
|
|
/* Defaults determined by systematically testing in Excel 2019 */
|
|
|
|
/* These formats appear to default to other formats in the table */
|
|
var default_map = [];
|
|
var defi = 0;
|
|
|
|
// 5 -> 37 ... 8 -> 40
|
|
for (defi = 5; defi <= 8; ++defi) {
|
|
default_map[defi] = 32 + defi;
|
|
}
|
|
|
|
// 23 -> 0 ... 26 -> 0
|
|
for (defi = 23; defi <= 26; ++defi) {
|
|
default_map[defi] = 0;
|
|
}
|
|
|
|
// 27 -> 14 ... 31 -> 14
|
|
for (defi = 27; defi <= 31; ++defi) {
|
|
default_map[defi] = 14;
|
|
}
|
|
// 50 -> 14 ... 58 -> 14
|
|
for (defi = 50; defi <= 58; ++defi) {
|
|
default_map[defi] = 14;
|
|
}
|
|
|
|
// 59 -> 1 ... 62 -> 4
|
|
for (defi = 59; defi <= 62; ++defi) {
|
|
default_map[defi] = defi - 58;
|
|
}
|
|
// 67 -> 9 ... 68 -> 10
|
|
for (defi = 67; defi <= 68; ++defi) {
|
|
default_map[defi] = defi - 58;
|
|
}
|
|
// 72 -> 14 ... 75 -> 17
|
|
for (defi = 72; defi <= 75; ++defi) {
|
|
default_map[defi] = defi - 58;
|
|
}
|
|
|
|
// 69 -> 12 ... 71 -> 14
|
|
for (defi = 67; defi <= 68; ++defi) {
|
|
default_map[defi] = defi - 57;
|
|
}
|
|
|
|
// 76 -> 20 ... 78 -> 22
|
|
for (defi = 76; defi <= 78; ++defi) {
|
|
default_map[defi] = defi - 56;
|
|
}
|
|
|
|
// 79 -> 45 ... 81 -> 47
|
|
for (defi = 79; defi <= 81; ++defi) {
|
|
default_map[defi] = defi - 34;
|
|
}
|
|
|
|
// 82 -> 0 ... 65536 -> 0 (omitted)
|
|
|
|
/* These formats technically refer to Accounting formats with no equivalent */
|
|
var default_str = [];
|
|
|
|
// 5 -- Currency, 0 decimal, black negative
|
|
default_str[5] = default_str[63] = '"$"#,##0_);\\("$"#,##0\\)';
|
|
// 6 -- Currency, 0 decimal, red negative
|
|
default_str[6] = default_str[64] = '"$"#,##0_);[Red]\\("$"#,##0\\)';
|
|
// 7 -- Currency, 2 decimal, black negative
|
|
default_str[7] = default_str[65] = '"$"#,##0.00_);\\("$"#,##0.00\\)';
|
|
// 8 -- Currency, 2 decimal, red negative
|
|
default_str[8] = default_str[66] = '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)';
|
|
|
|
// 41 -- Accounting, 0 decimal, No Symbol
|
|
default_str[41] = '_(* #,##0_);_(* \\(#,##0\\);_(* "-"_);_(@_)';
|
|
// 42 -- Accounting, 0 decimal, $ Symbol
|
|
default_str[42] = '_("$"* #,##0_);_("$"* \\(#,##0\\);_("$"* "-"_);_(@_)';
|
|
// 43 -- Accounting, 2 decimal, No Symbol
|
|
default_str[43] = '_(* #,##0.00_);_(* \\(#,##0.00\\);_(* "-"??_);_(@_)';
|
|
// 44 -- Accounting, 2 decimal, $ Symbol
|
|
default_str[44] = '_("$"* #,##0.00_);_("$"* \\(#,##0.00\\);_("$"* "-"??_);_(@_)';
|
|
function frac(x, D, mixed) {
|
|
var sgn = x < 0 ? -1 : 1;
|
|
var B = x * sgn;
|
|
var P_2 = 0,
|
|
P_1 = 1,
|
|
P = 0;
|
|
var Q_2 = 1,
|
|
Q_1 = 0,
|
|
Q = 0;
|
|
var A = Math.floor(B);
|
|
while (Q_1 < D) {
|
|
A = Math.floor(B);
|
|
P = A * P_1 + P_2;
|
|
Q = A * Q_1 + Q_2;
|
|
if (B - A < 0.00000005) break;
|
|
B = 1 / (B - A);
|
|
P_2 = P_1;
|
|
P_1 = P;
|
|
Q_2 = Q_1;
|
|
Q_1 = Q;
|
|
}
|
|
if (Q > D) {
|
|
if (Q_1 > D) {
|
|
Q = Q_2;
|
|
P = P_2;
|
|
} else {
|
|
Q = Q_1;
|
|
P = P_1;
|
|
}
|
|
}
|
|
if (!mixed) return [0, sgn * P, Q];
|
|
var q = Math.floor(sgn * P / Q);
|
|
return [q, sgn * P - q * Q, Q];
|
|
}
|
|
function parse_date_code(v, opts, b2) {
|
|
if (v > 2958465 || v < 0) return null;
|
|
var date = v | 0,
|
|
time = Math.floor(86400 * (v - date)),
|
|
dow = 0;
|
|
var dout = [];
|
|
var out = {
|
|
D: date,
|
|
T: time,
|
|
u: 86400 * (v - date) - time,
|
|
y: 0,
|
|
m: 0,
|
|
d: 0,
|
|
H: 0,
|
|
M: 0,
|
|
S: 0,
|
|
q: 0
|
|
};
|
|
if (Math.abs(out.u) < 1e-6) out.u = 0;
|
|
if (opts && opts.date1904) date += 1462;
|
|
if (out.u > 0.9999) {
|
|
out.u = 0;
|
|
if (++time == 86400) {
|
|
out.T = time = 0;
|
|
++date;
|
|
++out.D;
|
|
}
|
|
}
|
|
if (date === 60) {
|
|
dout = b2 ? [1317, 10, 29] : [1900, 2, 29];
|
|
dow = 3;
|
|
} else if (date === 0) {
|
|
dout = b2 ? [1317, 8, 29] : [1900, 1, 0];
|
|
dow = 6;
|
|
} else {
|
|
if (date > 60) --date;
|
|
/* 1 = Jan 1 1900 in Gregorian */
|
|
var d = new Date(1900, 0, 1);
|
|
d.setDate(d.getDate() + date - 1);
|
|
dout = [d.getFullYear(), d.getMonth() + 1, d.getDate()];
|
|
dow = d.getDay();
|
|
if (date < 60) dow = (dow + 6) % 7;
|
|
if (b2) dow = fix_hijri(d, dout);
|
|
}
|
|
out.y = dout[0];
|
|
out.m = dout[1];
|
|
out.d = dout[2];
|
|
out.S = time % 60;
|
|
time = Math.floor(time / 60);
|
|
out.M = time % 60;
|
|
time = Math.floor(time / 60);
|
|
out.H = time;
|
|
out.q = dow;
|
|
return out;
|
|
}
|
|
SSF.parse_date_code = parse_date_code;
|
|
var basedate = new Date(1899, 11, 31, 0, 0, 0);
|
|
var dnthresh = basedate.getTime();
|
|
var base1904 = new Date(1900, 2, 1, 0, 0, 0);
|
|
function datenum_local(v, date1904) {
|
|
var epoch = v.getTime();
|
|
if (date1904) epoch -= 1461 * 24 * 60 * 60 * 1000;else if (v >= base1904) epoch += 24 * 60 * 60 * 1000;
|
|
return (epoch - (dnthresh + (v.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000)) / (24 * 60 * 60 * 1000);
|
|
}
|
|
/* The longest 32-bit integer text is "-4294967296", exactly 11 chars */
|
|
function general_fmt_int(v) {
|
|
return v.toString(10);
|
|
}
|
|
SSF._general_int = general_fmt_int;
|
|
|
|
/* ECMA-376 18.8.30 numFmt*/
|
|
/* Note: `toPrecision` uses standard form when prec > E and E >= -6 */
|
|
var general_fmt_num = function make_general_fmt_num() {
|
|
var trailing_zeroes_and_decimal = /(?:\.0*|(\.\d*[1-9])0+)$/;
|
|
function strip_decimal(o) {
|
|
return o.indexOf(".") == -1 ? o : o.replace(trailing_zeroes_and_decimal, "$1");
|
|
}
|
|
|
|
/* General Exponential always shows 2 digits exp and trims the mantissa */
|
|
var mantissa_zeroes_and_decimal = /(?:\.0*|(\.\d*[1-9])0+)[Ee]/;
|
|
var exp_with_single_digit = /(E[+-])(\d)$/;
|
|
function normalize_exp(o) {
|
|
if (o.indexOf("E") == -1) return o;
|
|
return o.replace(mantissa_zeroes_and_decimal, "$1E").replace(exp_with_single_digit, "$10$2");
|
|
}
|
|
|
|
/* exponent >= -9 and <= 9 */
|
|
function small_exp(v) {
|
|
var w = v < 0 ? 12 : 11;
|
|
var o = strip_decimal(v.toFixed(12));
|
|
if (o.length <= w) return o;
|
|
o = v.toPrecision(10);
|
|
if (o.length <= w) return o;
|
|
return v.toExponential(5);
|
|
}
|
|
|
|
/* exponent >= 11 or <= -10 likely exponential */
|
|
function large_exp(v) {
|
|
var o = strip_decimal(v.toFixed(11));
|
|
return o.length > (v < 0 ? 12 : 11) || o === "0" || o === "-0" ? v.toPrecision(6) : o;
|
|
}
|
|
function general_fmt_num_base(v) {
|
|
var V = Math.floor(Math.log(Math.abs(v)) * Math.LOG10E),
|
|
o;
|
|
if (V >= -4 && V <= -1) o = v.toPrecision(10 + V);else if (Math.abs(V) <= 9) o = small_exp(v);else if (V === 10) o = v.toFixed(10).substr(0, 12);else o = large_exp(v);
|
|
return strip_decimal(normalize_exp(o.toUpperCase()));
|
|
}
|
|
return general_fmt_num_base;
|
|
}();
|
|
SSF._general_num = general_fmt_num;
|
|
|
|
/*
|
|
"General" rules:
|
|
- text is passed through ("@")
|
|
- booleans are rendered as TRUE/FALSE
|
|
- "up to 11 characters" displayed for numbers
|
|
- Default date format (code 14) used for Dates
|
|
|
|
TODO: technically the display depends on the width of the cell
|
|
*/
|
|
function general_fmt(v, opts) {
|
|
switch (_typeof(v)) {
|
|
case 'string':
|
|
return v;
|
|
case 'boolean':
|
|
return v ? "TRUE" : "FALSE";
|
|
case 'number':
|
|
return (v | 0) === v ? v.toString(10) : general_fmt_num(v);
|
|
case 'undefined':
|
|
return "";
|
|
case 'object':
|
|
if (v == null) return "";
|
|
if (v instanceof Date) return format(14, datenum_local(v, opts && opts.date1904), opts);
|
|
}
|
|
throw new Error("unsupported value in General format: " + v);
|
|
}
|
|
SSF._general = general_fmt;
|
|
function fix_hijri(date, o) {
|
|
/* TODO: properly adjust y/m/d and */
|
|
o[0] -= 581;
|
|
var dow = date.getDay();
|
|
if (date < 60) dow = (dow + 6) % 7;
|
|
return dow;
|
|
}
|
|
//var THAI_DIGITS = "\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57\u0E58\u0E59".split("");
|
|
/*jshint -W086 */
|
|
function write_date(type, fmt, val, ss0) {
|
|
var o = "",
|
|
ss = 0,
|
|
tt = 0,
|
|
y = val.y,
|
|
out,
|
|
outl = 0;
|
|
switch (type) {
|
|
case 98:
|
|
/* 'b' buddhist year */
|
|
y = val.y + 543;
|
|
/* falls through */
|
|
case 121:
|
|
/* 'y' year */
|
|
switch (fmt.length) {
|
|
case 1:
|
|
case 2:
|
|
out = y % 100;
|
|
outl = 2;
|
|
break;
|
|
default:
|
|
out = y % 10000;
|
|
outl = 4;
|
|
break;
|
|
}
|
|
break;
|
|
case 109:
|
|
/* 'm' month */
|
|
switch (fmt.length) {
|
|
case 1:
|
|
case 2:
|
|
out = val.m;
|
|
outl = fmt.length;
|
|
break;
|
|
case 3:
|
|
return months[val.m - 1][1];
|
|
case 5:
|
|
return months[val.m - 1][0];
|
|
default:
|
|
return months[val.m - 1][2];
|
|
}
|
|
break;
|
|
case 100:
|
|
/* 'd' day */
|
|
switch (fmt.length) {
|
|
case 1:
|
|
case 2:
|
|
out = val.d;
|
|
outl = fmt.length;
|
|
break;
|
|
case 3:
|
|
return days[val.q][0];
|
|
default:
|
|
return days[val.q][1];
|
|
}
|
|
break;
|
|
case 104:
|
|
/* 'h' 12-hour */
|
|
switch (fmt.length) {
|
|
case 1:
|
|
case 2:
|
|
out = 1 + (val.H + 11) % 12;
|
|
outl = fmt.length;
|
|
break;
|
|
default:
|
|
throw 'bad hour format: ' + fmt;
|
|
}
|
|
break;
|
|
case 72:
|
|
/* 'H' 24-hour */
|
|
switch (fmt.length) {
|
|
case 1:
|
|
case 2:
|
|
out = val.H;
|
|
outl = fmt.length;
|
|
break;
|
|
default:
|
|
throw 'bad hour format: ' + fmt;
|
|
}
|
|
break;
|
|
case 77:
|
|
/* 'M' minutes */
|
|
switch (fmt.length) {
|
|
case 1:
|
|
case 2:
|
|
out = val.M;
|
|
outl = fmt.length;
|
|
break;
|
|
default:
|
|
throw 'bad minute format: ' + fmt;
|
|
}
|
|
break;
|
|
case 115:
|
|
/* 's' seconds */
|
|
if (fmt != 's' && fmt != 'ss' && fmt != '.0' && fmt != '.00' && fmt != '.000') throw 'bad second format: ' + fmt;
|
|
if (val.u === 0 && (fmt == "s" || fmt == "ss")) return pad0(val.S, fmt.length);
|
|
if (ss0 >= 2) tt = ss0 === 3 ? 1000 : 100;else tt = ss0 === 1 ? 10 : 1;
|
|
ss = Math.round(tt * (val.S + val.u));
|
|
if (ss >= 60 * tt) ss = 0;
|
|
if (fmt === 's') return ss === 0 ? "0" : "" + ss / tt;
|
|
o = pad0(ss, 2 + ss0);
|
|
if (fmt === 'ss') return o.substr(0, 2);
|
|
return "." + o.substr(2, fmt.length - 1);
|
|
case 90:
|
|
/* 'Z' absolute time */
|
|
switch (fmt) {
|
|
case '[h]':
|
|
case '[hh]':
|
|
out = val.D * 24 + val.H;
|
|
break;
|
|
case '[m]':
|
|
case '[mm]':
|
|
out = (val.D * 24 + val.H) * 60 + val.M;
|
|
break;
|
|
case '[s]':
|
|
case '[ss]':
|
|
out = ((val.D * 24 + val.H) * 60 + val.M) * 60 + Math.round(val.S + val.u);
|
|
break;
|
|
default:
|
|
throw 'bad abstime format: ' + fmt;
|
|
}
|
|
outl = fmt.length === 3 ? 1 : 2;
|
|
break;
|
|
case 101:
|
|
/* 'e' era */
|
|
out = y;
|
|
outl = 1;
|
|
break;
|
|
}
|
|
var outstr = outl > 0 ? pad0(out, outl) : "";
|
|
return outstr;
|
|
}
|
|
/*jshint +W086 */
|
|
function commaify(s) {
|
|
var w = 3;
|
|
if (s.length <= w) return s;
|
|
var j = s.length % w,
|
|
o = s.substr(0, j);
|
|
for (; j != s.length; j += w) {
|
|
o += (o.length > 0 ? "," : "") + s.substr(j, w);
|
|
}
|
|
return o;
|
|
}
|
|
var write_num = function make_write_num() {
|
|
var pct1 = /%/g;
|
|
function write_num_pct(type, fmt, val) {
|
|
var sfmt = fmt.replace(pct1, ""),
|
|
mul = fmt.length - sfmt.length;
|
|
return write_num(type, sfmt, val * Math.pow(10, 2 * mul)) + fill("%", mul);
|
|
}
|
|
function write_num_cm(type, fmt, val) {
|
|
var idx = fmt.length - 1;
|
|
while (fmt.charCodeAt(idx - 1) === 44) {
|
|
--idx;
|
|
}
|
|
return write_num(type, fmt.substr(0, idx), val / Math.pow(10, 3 * (fmt.length - idx)));
|
|
}
|
|
function write_num_exp(fmt, val) {
|
|
var o;
|
|
var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1;
|
|
if (fmt.match(/^#+0.0E\+0$/)) {
|
|
if (val == 0) return "0.0E+0";else if (val < 0) return "-" + write_num_exp(fmt, -val);
|
|
var period = fmt.indexOf(".");
|
|
if (period === -1) period = fmt.indexOf('E');
|
|
var ee = Math.floor(Math.log(val) * Math.LOG10E) % period;
|
|
if (ee < 0) ee += period;
|
|
o = (val / Math.pow(10, ee)).toPrecision(idx + 1 + (period + ee) % period);
|
|
if (o.indexOf("e") === -1) {
|
|
var fakee = Math.floor(Math.log(val) * Math.LOG10E);
|
|
if (o.indexOf(".") === -1) o = o.charAt(0) + "." + o.substr(1) + "E+" + (fakee - o.length + ee);else o += "E+" + (fakee - ee);
|
|
while (o.substr(0, 2) === "0.") {
|
|
o = o.charAt(0) + o.substr(2, period) + "." + o.substr(2 + period);
|
|
o = o.replace(/^0+([1-9])/, "$1").replace(/^0+\./, "0.");
|
|
}
|
|
o = o.replace(/\+-/, "-");
|
|
}
|
|
o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/, function ($$, $1, $2, $3) {
|
|
return $1 + $2 + $3.substr(0, (period + ee) % period) + "." + $3.substr(ee) + "E";
|
|
});
|
|
} else o = val.toExponential(idx);
|
|
if (fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0, o.length - 1) + "0" + o.charAt(o.length - 1);
|
|
if (fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/, "e");
|
|
return o.replace("e", "E");
|
|
}
|
|
var frac1 = /# (\?+)( ?)\/( ?)(\d+)/;
|
|
function write_num_f1(r, aval, sign) {
|
|
var den = parseInt(r[4], 10),
|
|
rr = Math.round(aval * den),
|
|
base = Math.floor(rr / den);
|
|
var myn = rr - base * den,
|
|
myd = den;
|
|
return sign + (base === 0 ? "" : "" + base) + " " + (myn === 0 ? fill(" ", r[1].length + 1 + r[4].length) : pad_(myn, r[1].length) + r[2] + "/" + r[3] + pad0(myd, r[4].length));
|
|
}
|
|
function write_num_f2(r, aval, sign) {
|
|
return sign + (aval === 0 ? "" : "" + aval) + fill(" ", r[1].length + 2 + r[4].length);
|
|
}
|
|
var dec1 = /^#*0*\.([0#]+)/;
|
|
var closeparen = /\).*[0#]/;
|
|
var phone = /\(###\) ###\\?-####/;
|
|
function hashq(str) {
|
|
var o = "",
|
|
cc;
|
|
for (var i = 0; i != str.length; ++i) {
|
|
switch (cc = str.charCodeAt(i)) {
|
|
case 35:
|
|
break;
|
|
case 63:
|
|
o += " ";
|
|
break;
|
|
case 48:
|
|
o += "0";
|
|
break;
|
|
default:
|
|
o += String.fromCharCode(cc);
|
|
}
|
|
}
|
|
return o;
|
|
}
|
|
function rnd(val, d) {
|
|
var dd = Math.pow(10, d);
|
|
return "" + Math.round(val * dd) / dd;
|
|
}
|
|
function dec(val, d) {
|
|
var _frac = val - Math.floor(val),
|
|
dd = Math.pow(10, d);
|
|
if (d < ('' + Math.round(_frac * dd)).length) return 0;
|
|
return Math.round(_frac * dd);
|
|
}
|
|
function carry(val, d) {
|
|
if (d < ('' + Math.round((val - Math.floor(val)) * Math.pow(10, d))).length) {
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
function flr(val) {
|
|
if (val < 2147483647 && val > -2147483648) return "" + (val >= 0 ? val | 0 : val - 1 | 0);
|
|
return "" + Math.floor(val);
|
|
}
|
|
function write_num_flt(type, fmt, val) {
|
|
if (type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {
|
|
var ffmt = fmt.replace(/\( */, "").replace(/ \)/, "").replace(/\)/, "");
|
|
if (val >= 0) return write_num_flt('n', ffmt, val);
|
|
return '(' + write_num_flt('n', ffmt, -val) + ')';
|
|
}
|
|
if (fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm(type, fmt, val);
|
|
if (fmt.indexOf('%') !== -1) return write_num_pct(type, fmt, val);
|
|
if (fmt.indexOf('E') !== -1) return write_num_exp(fmt, val);
|
|
if (fmt.charCodeAt(0) === 36) return "$" + write_num_flt(type, fmt.substr(fmt.charAt(1) == ' ' ? 2 : 1), val);
|
|
var o;
|
|
var r,
|
|
ri,
|
|
ff,
|
|
aval = Math.abs(val),
|
|
sign = val < 0 ? "-" : "";
|
|
if (fmt.match(/^00+$/)) return sign + pad0r(aval, fmt.length);
|
|
if (fmt.match(/^[#?]+$/)) {
|
|
o = pad0r(val, 0);
|
|
if (o === "0") o = "";
|
|
return o.length > fmt.length ? o : hashq(fmt.substr(0, fmt.length - o.length)) + o;
|
|
}
|
|
if (r = fmt.match(frac1)) return write_num_f1(r, aval, sign);
|
|
if (fmt.match(/^#+0+$/)) return sign + pad0r(aval, fmt.length - fmt.indexOf("0"));
|
|
if (r = fmt.match(dec1)) {
|
|
o = rnd(val, r[1].length).replace(/^([^\.]+)$/, "$1." + hashq(r[1])).replace(/\.$/, "." + hashq(r[1])).replace(/\.(\d*)$/, function ($$, $1) {
|
|
return "." + $1 + fill("0", hashq(r[1]).length - $1.length);
|
|
});
|
|
return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./, ".");
|
|
}
|
|
fmt = fmt.replace(/^#+([0.])/, "$1");
|
|
if (r = fmt.match(/^(0*)\.(#*)$/)) {
|
|
return sign + rnd(aval, r[2].length).replace(/\.(\d*[1-9])0*$/, ".$1").replace(/^(-?\d*)$/, "$1.").replace(/^0\./, r[1].length ? "0." : ".");
|
|
}
|
|
if (r = fmt.match(/^#{1,3},##0(\.?)$/)) return sign + commaify(pad0r(aval, 0));
|
|
if (r = fmt.match(/^#,##0\.([#0]*0)$/)) {
|
|
return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify("" + (Math.floor(val) + carry(val, r[1].length))) + "." + pad0(dec(val, r[1].length), r[1].length);
|
|
}
|
|
if (r = fmt.match(/^#,#*,#0/)) return write_num_flt(type, fmt.replace(/^#,#*,/, ""), val);
|
|
if (r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/)) {
|
|
o = _strrev(write_num_flt(type, fmt.replace(/[\\-]/g, ""), val));
|
|
ri = 0;
|
|
return _strrev(_strrev(fmt.replace(/\\/g, "")).replace(/[0#]/g, function (x) {
|
|
return ri < o.length ? o.charAt(ri++) : x === '0' ? '0' : "";
|
|
}));
|
|
}
|
|
if (fmt.match(phone)) {
|
|
o = write_num_flt(type, "##########", val);
|
|
return "(" + o.substr(0, 3) + ") " + o.substr(3, 3) + "-" + o.substr(6);
|
|
}
|
|
var oa = "";
|
|
if (r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/)) {
|
|
ri = Math.min(r[4].length, 7);
|
|
ff = frac(aval, Math.pow(10, ri) - 1, false);
|
|
o = "" + sign;
|
|
oa = write_num("n", r[1], ff[1]);
|
|
if (oa.charAt(oa.length - 1) == " ") oa = oa.substr(0, oa.length - 1) + "0";
|
|
o += oa + r[2] + "/" + r[3];
|
|
oa = rpad_(ff[2], ri);
|
|
if (oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length - oa.length)) + oa;
|
|
o += oa;
|
|
return o;
|
|
}
|
|
if (r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/)) {
|
|
ri = Math.min(Math.max(r[1].length, r[4].length), 7);
|
|
ff = frac(aval, Math.pow(10, ri) - 1, true);
|
|
return sign + (ff[0] || (ff[1] ? "" : "0")) + " " + (ff[1] ? pad_(ff[1], ri) + r[2] + "/" + r[3] + rpad_(ff[2], ri) : fill(" ", 2 * ri + 1 + r[2].length + r[3].length));
|
|
}
|
|
if (r = fmt.match(/^[#0?]+$/)) {
|
|
o = pad0r(val, 0);
|
|
if (fmt.length <= o.length) return o;
|
|
return hashq(fmt.substr(0, fmt.length - o.length)) + o;
|
|
}
|
|
if (r = fmt.match(/^([#0?]+)\.([#0]+)$/)) {
|
|
o = "" + val.toFixed(Math.min(r[2].length, 10)).replace(/([^0])0+$/, "$1");
|
|
ri = o.indexOf(".");
|
|
var lres = fmt.indexOf(".") - ri,
|
|
rres = fmt.length - o.length - lres;
|
|
return hashq(fmt.substr(0, lres) + o + fmt.substr(fmt.length - rres));
|
|
}
|
|
if (r = fmt.match(/^00,000\.([#0]*0)$/)) {
|
|
ri = dec(val, r[1].length);
|
|
return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify(flr(val)).replace(/^\d,\d{3}$/, "0$&").replace(/^\d*$/, function ($$) {
|
|
return "00," + ($$.length < 3 ? pad0(0, 3 - $$.length) : "") + $$;
|
|
}) + "." + pad0(ri, r[1].length);
|
|
}
|
|
switch (fmt) {
|
|
case "###,##0.00":
|
|
return write_num_flt(type, "#,##0.00", val);
|
|
case "###,###":
|
|
case "##,###":
|
|
case "#,###":
|
|
var x = commaify(pad0r(aval, 0));
|
|
return x !== "0" ? sign + x : "";
|
|
case "###,###.00":
|
|
return write_num_flt(type, "###,##0.00", val).replace(/^0\./, ".");
|
|
case "#,###.00":
|
|
return write_num_flt(type, "#,##0.00", val).replace(/^0\./, ".");
|
|
default:
|
|
}
|
|
throw new Error("unsupported format |" + fmt + "|");
|
|
}
|
|
function write_num_cm2(type, fmt, val) {
|
|
var idx = fmt.length - 1;
|
|
while (fmt.charCodeAt(idx - 1) === 44) {
|
|
--idx;
|
|
}
|
|
return write_num(type, fmt.substr(0, idx), val / Math.pow(10, 3 * (fmt.length - idx)));
|
|
}
|
|
function write_num_pct2(type, fmt, val) {
|
|
var sfmt = fmt.replace(pct1, ""),
|
|
mul = fmt.length - sfmt.length;
|
|
return write_num(type, sfmt, val * Math.pow(10, 2 * mul)) + fill("%", mul);
|
|
}
|
|
function write_num_exp2(fmt, val) {
|
|
var o;
|
|
var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1;
|
|
if (fmt.match(/^#+0.0E\+0$/)) {
|
|
if (val == 0) return "0.0E+0";else if (val < 0) return "-" + write_num_exp2(fmt, -val);
|
|
var period = fmt.indexOf(".");
|
|
if (period === -1) period = fmt.indexOf('E');
|
|
var ee = Math.floor(Math.log(val) * Math.LOG10E) % period;
|
|
if (ee < 0) ee += period;
|
|
o = (val / Math.pow(10, ee)).toPrecision(idx + 1 + (period + ee) % period);
|
|
if (!o.match(/[Ee]/)) {
|
|
var fakee = Math.floor(Math.log(val) * Math.LOG10E);
|
|
if (o.indexOf(".") === -1) o = o.charAt(0) + "." + o.substr(1) + "E+" + (fakee - o.length + ee);else o += "E+" + (fakee - ee);
|
|
o = o.replace(/\+-/, "-");
|
|
}
|
|
o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/, function ($$, $1, $2, $3) {
|
|
return $1 + $2 + $3.substr(0, (period + ee) % period) + "." + $3.substr(ee) + "E";
|
|
});
|
|
} else o = val.toExponential(idx);
|
|
if (fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0, o.length - 1) + "0" + o.charAt(o.length - 1);
|
|
if (fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/, "e");
|
|
return o.replace("e", "E");
|
|
}
|
|
function write_num_int(type, fmt, val) {
|
|
if (type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {
|
|
var ffmt = fmt.replace(/\( */, "").replace(/ \)/, "").replace(/\)/, "");
|
|
if (val >= 0) return write_num_int('n', ffmt, val);
|
|
return '(' + write_num_int('n', ffmt, -val) + ')';
|
|
}
|
|
if (fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm2(type, fmt, val);
|
|
if (fmt.indexOf('%') !== -1) return write_num_pct2(type, fmt, val);
|
|
if (fmt.indexOf('E') !== -1) return write_num_exp2(fmt, val);
|
|
if (fmt.charCodeAt(0) === 36) return "$" + write_num_int(type, fmt.substr(fmt.charAt(1) == ' ' ? 2 : 1), val);
|
|
var o;
|
|
var r,
|
|
ri,
|
|
ff,
|
|
aval = Math.abs(val),
|
|
sign = val < 0 ? "-" : "";
|
|
if (fmt.match(/^00+$/)) return sign + pad0(aval, fmt.length);
|
|
if (fmt.match(/^[#?]+$/)) {
|
|
o = "" + val;
|
|
if (val === 0) o = "";
|
|
return o.length > fmt.length ? o : hashq(fmt.substr(0, fmt.length - o.length)) + o;
|
|
}
|
|
if (r = fmt.match(frac1)) return write_num_f2(r, aval, sign);
|
|
if (fmt.match(/^#+0+$/)) return sign + pad0(aval, fmt.length - fmt.indexOf("0"));
|
|
if (r = fmt.match(dec1)) {
|
|
o = ("" + val).replace(/^([^\.]+)$/, "$1." + hashq(r[1])).replace(/\.$/, "." + hashq(r[1]));
|
|
o = o.replace(/\.(\d*)$/, function ($$, $1) {
|
|
return "." + $1 + fill("0", hashq(r[1]).length - $1.length);
|
|
});
|
|
return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./, ".");
|
|
}
|
|
fmt = fmt.replace(/^#+([0.])/, "$1");
|
|
if (r = fmt.match(/^(0*)\.(#*)$/)) {
|
|
return sign + ("" + aval).replace(/\.(\d*[1-9])0*$/, ".$1").replace(/^(-?\d*)$/, "$1.").replace(/^0\./, r[1].length ? "0." : ".");
|
|
}
|
|
if (r = fmt.match(/^#{1,3},##0(\.?)$/)) return sign + commaify("" + aval);
|
|
if (r = fmt.match(/^#,##0\.([#0]*0)$/)) {
|
|
return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify("" + val) + "." + fill('0', r[1].length);
|
|
}
|
|
if (r = fmt.match(/^#,#*,#0/)) return write_num_int(type, fmt.replace(/^#,#*,/, ""), val);
|
|
if (r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/)) {
|
|
o = _strrev(write_num_int(type, fmt.replace(/[\\-]/g, ""), val));
|
|
ri = 0;
|
|
return _strrev(_strrev(fmt.replace(/\\/g, "")).replace(/[0#]/g, function (x) {
|
|
return ri < o.length ? o.charAt(ri++) : x === '0' ? '0' : "";
|
|
}));
|
|
}
|
|
if (fmt.match(phone)) {
|
|
o = write_num_int(type, "##########", val);
|
|
return "(" + o.substr(0, 3) + ") " + o.substr(3, 3) + "-" + o.substr(6);
|
|
}
|
|
var oa = "";
|
|
if (r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/)) {
|
|
ri = Math.min(r[4].length, 7);
|
|
ff = frac(aval, Math.pow(10, ri) - 1, false);
|
|
o = "" + sign;
|
|
oa = write_num("n", r[1], ff[1]);
|
|
if (oa.charAt(oa.length - 1) == " ") oa = oa.substr(0, oa.length - 1) + "0";
|
|
o += oa + r[2] + "/" + r[3];
|
|
oa = rpad_(ff[2], ri);
|
|
if (oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length - oa.length)) + oa;
|
|
o += oa;
|
|
return o;
|
|
}
|
|
if (r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/)) {
|
|
ri = Math.min(Math.max(r[1].length, r[4].length), 7);
|
|
ff = frac(aval, Math.pow(10, ri) - 1, true);
|
|
return sign + (ff[0] || (ff[1] ? "" : "0")) + " " + (ff[1] ? pad_(ff[1], ri) + r[2] + "/" + r[3] + rpad_(ff[2], ri) : fill(" ", 2 * ri + 1 + r[2].length + r[3].length));
|
|
}
|
|
if (r = fmt.match(/^[#0?]+$/)) {
|
|
o = "" + val;
|
|
if (fmt.length <= o.length) return o;
|
|
return hashq(fmt.substr(0, fmt.length - o.length)) + o;
|
|
}
|
|
if (r = fmt.match(/^([#0]+)\.([#0]+)$/)) {
|
|
o = "" + val.toFixed(Math.min(r[2].length, 10)).replace(/([^0])0+$/, "$1");
|
|
ri = o.indexOf(".");
|
|
var lres = fmt.indexOf(".") - ri,
|
|
rres = fmt.length - o.length - lres;
|
|
return hashq(fmt.substr(0, lres) + o + fmt.substr(fmt.length - rres));
|
|
}
|
|
if (r = fmt.match(/^00,000\.([#0]*0)$/)) {
|
|
return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify("" + val).replace(/^\d,\d{3}$/, "0$&").replace(/^\d*$/, function ($$) {
|
|
return "00," + ($$.length < 3 ? pad0(0, 3 - $$.length) : "") + $$;
|
|
}) + "." + pad0(0, r[1].length);
|
|
}
|
|
switch (fmt) {
|
|
case "###,###":
|
|
case "##,###":
|
|
case "#,###":
|
|
var x = commaify("" + aval);
|
|
return x !== "0" ? sign + x : "";
|
|
default:
|
|
if (fmt.match(/\.[0#?]*$/)) return write_num_int(type, fmt.slice(0, fmt.lastIndexOf(".")), val) + hashq(fmt.slice(fmt.lastIndexOf(".")));
|
|
}
|
|
throw new Error("unsupported format |" + fmt + "|");
|
|
}
|
|
return function write_num(type, fmt, val) {
|
|
return (val | 0) === val ? write_num_int(type, fmt, val) : write_num_flt(type, fmt, val);
|
|
};
|
|
}();
|
|
function split_fmt(fmt) {
|
|
var out = [];
|
|
var in_str = false /*, cc*/;
|
|
for (var i = 0, j = 0; i < fmt.length; ++i) {
|
|
switch ( /*cc=*/fmt.charCodeAt(i)) {
|
|
case 34:
|
|
/* '"' */
|
|
in_str = !in_str;
|
|
break;
|
|
case 95:
|
|
case 42:
|
|
case 92:
|
|
/* '_' '*' '\\' */
|
|
++i;
|
|
break;
|
|
case 59:
|
|
/* ';' */
|
|
out[out.length] = fmt.substr(j, i - j);
|
|
j = i + 1;
|
|
}
|
|
}
|
|
out[out.length] = fmt.substr(j);
|
|
if (in_str === true) throw new Error("Format |" + fmt + "| unterminated string ");
|
|
return out;
|
|
}
|
|
SSF._split = split_fmt;
|
|
var abstime = /\[[HhMmSs\u0E0A\u0E19\u0E17]*\]/;
|
|
function fmt_is_date(fmt) {
|
|
var i = 0,
|
|
/*cc = 0,*/c = "",
|
|
o = "";
|
|
while (i < fmt.length) {
|
|
switch (c = fmt.charAt(i)) {
|
|
case 'G':
|
|
if (isgeneral(fmt, i)) i += 6;
|
|
i++;
|
|
break;
|
|
case '"':
|
|
for (; /*cc=*/fmt.charCodeAt(++i) !== 34 && i < fmt.length;) {/*empty*/}
|
|
++i;
|
|
break;
|
|
case '\\':
|
|
i += 2;
|
|
break;
|
|
case '_':
|
|
i += 2;
|
|
break;
|
|
case '@':
|
|
++i;
|
|
break;
|
|
case 'B':
|
|
case 'b':
|
|
if (fmt.charAt(i + 1) === "1" || fmt.charAt(i + 1) === "2") return true;
|
|
/* falls through */
|
|
case 'M':
|
|
case 'D':
|
|
case 'Y':
|
|
case 'H':
|
|
case 'S':
|
|
case 'E':
|
|
/* falls through */
|
|
case 'm':
|
|
case 'd':
|
|
case 'y':
|
|
case 'h':
|
|
case 's':
|
|
case 'e':
|
|
case 'g':
|
|
return true;
|
|
case 'A':
|
|
case 'a':
|
|
case '上':
|
|
if (fmt.substr(i, 3).toUpperCase() === "A/P") return true;
|
|
if (fmt.substr(i, 5).toUpperCase() === "AM/PM") return true;
|
|
if (fmt.substr(i, 5).toUpperCase() === "上午/下午") return true;
|
|
++i;
|
|
break;
|
|
case '[':
|
|
o = c;
|
|
while (fmt.charAt(i++) !== ']' && i < fmt.length) {
|
|
o += fmt.charAt(i);
|
|
}
|
|
if (o.match(abstime)) return true;
|
|
break;
|
|
case '.':
|
|
/* falls through */
|
|
case '0':
|
|
case '#':
|
|
while (i < fmt.length && ("0#?.,E+-%".indexOf(c = fmt.charAt(++i)) > -1 || c == '\\' && fmt.charAt(i + 1) == "-" && "0#".indexOf(fmt.charAt(i + 2)) > -1)) {/* empty */}
|
|
break;
|
|
case '?':
|
|
while (fmt.charAt(++i) === c) {/* empty */}
|
|
break;
|
|
case '*':
|
|
++i;
|
|
if (fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i;
|
|
break;
|
|
case '(':
|
|
case ')':
|
|
++i;
|
|
break;
|
|
case '1':
|
|
case '2':
|
|
case '3':
|
|
case '4':
|
|
case '5':
|
|
case '6':
|
|
case '7':
|
|
case '8':
|
|
case '9':
|
|
while (i < fmt.length && "0123456789".indexOf(fmt.charAt(++i)) > -1) {/* empty */}
|
|
break;
|
|
case ' ':
|
|
++i;
|
|
break;
|
|
default:
|
|
++i;
|
|
break;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
SSF.is_date = fmt_is_date;
|
|
function eval_fmt(fmt, v, opts, flen) {
|
|
var out = [],
|
|
o = "",
|
|
i = 0,
|
|
c = "",
|
|
lst = 't',
|
|
dt,
|
|
j,
|
|
cc;
|
|
var hr = 'H';
|
|
/* Tokenize */
|
|
while (i < fmt.length) {
|
|
switch (c = fmt.charAt(i)) {
|
|
case 'G':
|
|
/* General */
|
|
if (!isgeneral(fmt, i)) throw new Error('unrecognized character ' + c + ' in ' + fmt);
|
|
out[out.length] = {
|
|
t: 'G',
|
|
v: 'General'
|
|
};
|
|
i += 7;
|
|
break;
|
|
case '"':
|
|
/* Literal text */
|
|
for (o = ""; (cc = fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) {
|
|
o += String.fromCharCode(cc);
|
|
}
|
|
out[out.length] = {
|
|
t: 't',
|
|
v: o
|
|
};
|
|
++i;
|
|
break;
|
|
case '\\':
|
|
var w = fmt.charAt(++i),
|
|
t = w === "(" || w === ")" ? w : 't';
|
|
out[out.length] = {
|
|
t: t,
|
|
v: w
|
|
};
|
|
++i;
|
|
break;
|
|
case '_':
|
|
out[out.length] = {
|
|
t: 't',
|
|
v: " "
|
|
};
|
|
i += 2;
|
|
break;
|
|
case '@':
|
|
/* Text Placeholder */
|
|
out[out.length] = {
|
|
t: 'T',
|
|
v: v
|
|
};
|
|
++i;
|
|
break;
|
|
case 'B':
|
|
case 'b':
|
|
if (fmt.charAt(i + 1) === "1" || fmt.charAt(i + 1) === "2") {
|
|
if (dt == null) {
|
|
dt = parse_date_code(v, opts, fmt.charAt(i + 1) === "2");
|
|
if (dt == null) return "";
|
|
}
|
|
out[out.length] = {
|
|
t: 'X',
|
|
v: fmt.substr(i, 2)
|
|
};
|
|
lst = c;
|
|
i += 2;
|
|
break;
|
|
}
|
|
/* falls through */
|
|
case 'M':
|
|
case 'D':
|
|
case 'Y':
|
|
case 'H':
|
|
case 'S':
|
|
case 'E':
|
|
c = c.toLowerCase();
|
|
/* falls through */
|
|
case 'm':
|
|
case 'd':
|
|
case 'y':
|
|
case 'h':
|
|
case 's':
|
|
case 'e':
|
|
case 'g':
|
|
if (v < 0) return "";
|
|
if (dt == null) {
|
|
dt = parse_date_code(v, opts);
|
|
if (dt == null) return "";
|
|
}
|
|
o = c;
|
|
while (++i < fmt.length && fmt.charAt(i).toLowerCase() === c) {
|
|
o += c;
|
|
}
|
|
if (c === 'm' && lst.toLowerCase() === 'h') c = 'M';
|
|
if (c === 'h') c = hr;
|
|
out[out.length] = {
|
|
t: c,
|
|
v: o
|
|
};
|
|
lst = c;
|
|
break;
|
|
case 'A':
|
|
case 'a':
|
|
case '上':
|
|
var q = {
|
|
t: c,
|
|
v: c
|
|
};
|
|
if (dt == null) dt = parse_date_code(v, opts);
|
|
if (fmt.substr(i, 3).toUpperCase() === "A/P") {
|
|
if (dt != null) q.v = dt.H >= 12 ? "P" : "A";
|
|
q.t = 'T';
|
|
hr = 'h';
|
|
i += 3;
|
|
} else if (fmt.substr(i, 5).toUpperCase() === "AM/PM") {
|
|
if (dt != null) q.v = dt.H >= 12 ? "PM" : "AM";
|
|
q.t = 'T';
|
|
i += 5;
|
|
hr = 'h';
|
|
} else if (fmt.substr(i, 5).toUpperCase() === "上午/下午") {
|
|
if (dt != null) q.v = dt.H >= 12 ? "下午" : "上午";
|
|
q.t = 'T';
|
|
i += 5;
|
|
hr = 'h';
|
|
} else {
|
|
q.t = "t";
|
|
++i;
|
|
}
|
|
if (dt == null && q.t === 'T') return "";
|
|
out[out.length] = q;
|
|
lst = c;
|
|
break;
|
|
case '[':
|
|
o = c;
|
|
while (fmt.charAt(i++) !== ']' && i < fmt.length) {
|
|
o += fmt.charAt(i);
|
|
}
|
|
if (o.slice(-1) !== ']') throw 'unterminated "[" block: |' + o + '|';
|
|
if (o.match(abstime)) {
|
|
if (dt == null) {
|
|
dt = parse_date_code(v, opts);
|
|
if (dt == null) return "";
|
|
}
|
|
out[out.length] = {
|
|
t: 'Z',
|
|
v: o.toLowerCase()
|
|
};
|
|
lst = o.charAt(1);
|
|
} else if (o.indexOf("$") > -1) {
|
|
o = (o.match(/\$([^-\[\]]*)/) || [])[1] || "$";
|
|
if (!fmt_is_date(fmt)) out[out.length] = {
|
|
t: 't',
|
|
v: o
|
|
};
|
|
}
|
|
break;
|
|
/* Numbers */
|
|
case '.':
|
|
if (dt != null) {
|
|
o = c;
|
|
while (++i < fmt.length && (c = fmt.charAt(i)) === "0") {
|
|
o += c;
|
|
}
|
|
out[out.length] = {
|
|
t: 's',
|
|
v: o
|
|
};
|
|
break;
|
|
}
|
|
/* falls through */
|
|
case '0':
|
|
case '#':
|
|
o = c;
|
|
while (++i < fmt.length && "0#?.,E+-%".indexOf(c = fmt.charAt(i)) > -1) {
|
|
o += c;
|
|
}
|
|
out[out.length] = {
|
|
t: 'n',
|
|
v: o
|
|
};
|
|
break;
|
|
case '?':
|
|
o = c;
|
|
while (fmt.charAt(++i) === c) {
|
|
o += c;
|
|
}
|
|
out[out.length] = {
|
|
t: c,
|
|
v: o
|
|
};
|
|
lst = c;
|
|
break;
|
|
case '*':
|
|
++i;
|
|
if (fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i;
|
|
break;
|
|
// **
|
|
case '(':
|
|
case ')':
|
|
out[out.length] = {
|
|
t: flen === 1 ? 't' : c,
|
|
v: c
|
|
};
|
|
++i;
|
|
break;
|
|
case '1':
|
|
case '2':
|
|
case '3':
|
|
case '4':
|
|
case '5':
|
|
case '6':
|
|
case '7':
|
|
case '8':
|
|
case '9':
|
|
o = c;
|
|
while (i < fmt.length && "0123456789".indexOf(fmt.charAt(++i)) > -1) {
|
|
o += fmt.charAt(i);
|
|
}
|
|
out[out.length] = {
|
|
t: 'D',
|
|
v: o
|
|
};
|
|
break;
|
|
case ' ':
|
|
out[out.length] = {
|
|
t: c,
|
|
v: c
|
|
};
|
|
++i;
|
|
break;
|
|
case '$':
|
|
out[out.length] = {
|
|
t: 't',
|
|
v: '$'
|
|
};
|
|
++i;
|
|
break;
|
|
default:
|
|
if (",$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP".indexOf(c) === -1) throw new Error('unrecognized character ' + c + ' in ' + fmt);
|
|
out[out.length] = {
|
|
t: 't',
|
|
v: c
|
|
};
|
|
++i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* Scan for date/time parts */
|
|
var bt = 0,
|
|
ss0 = 0,
|
|
ssm;
|
|
for (i = out.length - 1, lst = 't'; i >= 0; --i) {
|
|
switch (out[i].t) {
|
|
case 'h':
|
|
case 'H':
|
|
out[i].t = hr;
|
|
lst = 'h';
|
|
if (bt < 1) bt = 1;
|
|
break;
|
|
case 's':
|
|
if (ssm = out[i].v.match(/\.0+$/)) ss0 = Math.max(ss0, ssm[0].length - 1);
|
|
if (bt < 3) bt = 3;
|
|
/* falls through */
|
|
case 'd':
|
|
case 'y':
|
|
case 'M':
|
|
case 'e':
|
|
lst = out[i].t;
|
|
break;
|
|
case 'm':
|
|
if (lst === 's') {
|
|
out[i].t = 'M';
|
|
if (bt < 2) bt = 2;
|
|
}
|
|
break;
|
|
case 'X':
|
|
/*if(out[i].v === "B2");*/
|
|
break;
|
|
case 'Z':
|
|
if (bt < 1 && out[i].v.match(/[Hh]/)) bt = 1;
|
|
if (bt < 2 && out[i].v.match(/[Mm]/)) bt = 2;
|
|
if (bt < 3 && out[i].v.match(/[Ss]/)) bt = 3;
|
|
}
|
|
}
|
|
/* time rounding depends on presence of minute / second / usec fields */
|
|
switch (bt) {
|
|
case 0:
|
|
break;
|
|
case 1:
|
|
if (dt.u >= 0.5) {
|
|
dt.u = 0;
|
|
++dt.S;
|
|
}
|
|
if (dt.S >= 60) {
|
|
dt.S = 0;
|
|
++dt.M;
|
|
}
|
|
if (dt.M >= 60) {
|
|
dt.M = 0;
|
|
++dt.H;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (dt.u >= 0.5) {
|
|
dt.u = 0;
|
|
++dt.S;
|
|
}
|
|
if (dt.S >= 60) {
|
|
dt.S = 0;
|
|
++dt.M;
|
|
}
|
|
break;
|
|
}
|
|
|
|
/* replace fields */
|
|
var nstr = "",
|
|
jj;
|
|
for (i = 0; i < out.length; ++i) {
|
|
switch (out[i].t) {
|
|
case 't':
|
|
case 'T':
|
|
case ' ':
|
|
case 'D':
|
|
break;
|
|
case 'X':
|
|
out[i].v = "";
|
|
out[i].t = ";";
|
|
break;
|
|
case 'd':
|
|
case 'm':
|
|
case 'y':
|
|
case 'h':
|
|
case 'H':
|
|
case 'M':
|
|
case 's':
|
|
case 'e':
|
|
case 'b':
|
|
case 'Z':
|
|
out[i].v = write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0);
|
|
out[i].t = 't';
|
|
break;
|
|
case 'n':
|
|
case '?':
|
|
jj = i + 1;
|
|
while (out[jj] != null && ((c = out[jj].t) === "?" || c === "D" || (c === " " || c === "t") && out[jj + 1] != null && (out[jj + 1].t === '?' || out[jj + 1].t === "t" && out[jj + 1].v === '/') || out[i].t === '(' && (c === ' ' || c === 'n' || c === ')') || c === 't' && (out[jj].v === '/' || out[jj].v === ' ' && out[jj + 1] != null && out[jj + 1].t == '?'))) {
|
|
out[i].v += out[jj].v;
|
|
out[jj] = {
|
|
v: "",
|
|
t: ";"
|
|
};
|
|
++jj;
|
|
}
|
|
nstr += out[i].v;
|
|
i = jj - 1;
|
|
break;
|
|
case 'G':
|
|
out[i].t = 't';
|
|
out[i].v = general_fmt(v, opts);
|
|
break;
|
|
}
|
|
}
|
|
var vv = "",
|
|
myv,
|
|
ostr;
|
|
if (nstr.length > 0) {
|
|
if (nstr.charCodeAt(0) == 40) /* '(' */{
|
|
myv = v < 0 && nstr.charCodeAt(0) === 45 ? -v : v;
|
|
ostr = write_num('n', nstr, myv);
|
|
} else {
|
|
myv = v < 0 && flen > 1 ? -v : v;
|
|
ostr = write_num('n', nstr, myv);
|
|
if (myv < 0 && out[0] && out[0].t == 't') {
|
|
ostr = ostr.substr(1);
|
|
out[0].v = "-" + out[0].v;
|
|
}
|
|
}
|
|
jj = ostr.length - 1;
|
|
var decpt = out.length;
|
|
for (i = 0; i < out.length; ++i) {
|
|
if (out[i] != null && out[i].t != 't' && out[i].v.indexOf(".") > -1) {
|
|
decpt = i;
|
|
break;
|
|
}
|
|
}
|
|
var lasti = out.length;
|
|
if (decpt === out.length && ostr.indexOf("E") === -1) {
|
|
for (i = out.length - 1; i >= 0; --i) {
|
|
if (out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue;
|
|
if (jj >= out[i].v.length - 1) {
|
|
jj -= out[i].v.length;
|
|
out[i].v = ostr.substr(jj + 1, out[i].v.length);
|
|
} else if (jj < 0) out[i].v = "";else {
|
|
out[i].v = ostr.substr(0, jj + 1);
|
|
jj = -1;
|
|
}
|
|
out[i].t = 't';
|
|
lasti = i;
|
|
}
|
|
if (jj >= 0 && lasti < out.length) out[lasti].v = ostr.substr(0, jj + 1) + out[lasti].v;
|
|
} else if (decpt !== out.length && ostr.indexOf("E") === -1) {
|
|
jj = ostr.indexOf(".") - 1;
|
|
for (i = decpt; i >= 0; --i) {
|
|
if (out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue;
|
|
j = out[i].v.indexOf(".") > -1 && i === decpt ? out[i].v.indexOf(".") - 1 : out[i].v.length - 1;
|
|
vv = out[i].v.substr(j + 1);
|
|
for (; j >= 0; --j) {
|
|
if (jj >= 0 && (out[i].v.charAt(j) === "0" || out[i].v.charAt(j) === "#")) vv = ostr.charAt(jj--) + vv;
|
|
}
|
|
out[i].v = vv;
|
|
out[i].t = 't';
|
|
lasti = i;
|
|
}
|
|
if (jj >= 0 && lasti < out.length) out[lasti].v = ostr.substr(0, jj + 1) + out[lasti].v;
|
|
jj = ostr.indexOf(".") + 1;
|
|
for (i = decpt; i < out.length; ++i) {
|
|
if (out[i] == null || 'n?('.indexOf(out[i].t) === -1 && i !== decpt) continue;
|
|
j = out[i].v.indexOf(".") > -1 && i === decpt ? out[i].v.indexOf(".") + 1 : 0;
|
|
vv = out[i].v.substr(0, j);
|
|
for (; j < out[i].v.length; ++j) {
|
|
if (jj < ostr.length) vv += ostr.charAt(jj++);
|
|
}
|
|
out[i].v = vv;
|
|
out[i].t = 't';
|
|
lasti = i;
|
|
}
|
|
}
|
|
}
|
|
for (i = 0; i < out.length; ++i) {
|
|
if (out[i] != null && 'n?'.indexOf(out[i].t) > -1) {
|
|
myv = flen > 1 && v < 0 && i > 0 && out[i - 1].v === "-" ? -v : v;
|
|
out[i].v = write_num(out[i].t, out[i].v, myv);
|
|
out[i].t = 't';
|
|
}
|
|
}
|
|
var retval = "";
|
|
for (i = 0; i !== out.length; ++i) {
|
|
if (out[i] != null) retval += out[i].v;
|
|
}
|
|
return retval;
|
|
}
|
|
SSF._eval = eval_fmt;
|
|
var cfregex = /\[[=<>]/;
|
|
var cfregex2 = /\[(=|>[=]?|<[>=]?)(-?\d+(?:\.\d*)?)\]/;
|
|
function chkcond(v, rr) {
|
|
if (rr == null) return false;
|
|
var thresh = parseFloat(rr[2]);
|
|
switch (rr[1]) {
|
|
case "=":
|
|
if (v == thresh) return true;
|
|
break;
|
|
case ">":
|
|
if (v > thresh) return true;
|
|
break;
|
|
case "<":
|
|
if (v < thresh) return true;
|
|
break;
|
|
case "<>":
|
|
if (v != thresh) return true;
|
|
break;
|
|
case ">=":
|
|
if (v >= thresh) return true;
|
|
break;
|
|
case "<=":
|
|
if (v <= thresh) return true;
|
|
break;
|
|
}
|
|
return false;
|
|
}
|
|
function choose_fmt(f, v) {
|
|
var fmt = split_fmt(f);
|
|
var l = fmt.length,
|
|
lat = fmt[l - 1].indexOf("@");
|
|
if (l < 4 && lat > -1) --l;
|
|
if (fmt.length > 4) throw new Error("cannot find right format for |" + fmt.join("|") + "|");
|
|
if (typeof v !== "number") return [4, fmt.length === 4 || lat > -1 ? fmt[fmt.length - 1] : "@"];
|
|
switch (fmt.length) {
|
|
case 1:
|
|
fmt = lat > -1 ? ["General", "General", "General", fmt[0]] : [fmt[0], fmt[0], fmt[0], "@"];
|
|
break;
|
|
case 2:
|
|
fmt = lat > -1 ? [fmt[0], fmt[0], fmt[0], fmt[1]] : [fmt[0], fmt[1], fmt[0], "@"];
|
|
break;
|
|
case 3:
|
|
fmt = lat > -1 ? [fmt[0], fmt[1], fmt[0], fmt[2]] : [fmt[0], fmt[1], fmt[2], "@"];
|
|
break;
|
|
case 4:
|
|
break;
|
|
}
|
|
var ff = v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2];
|
|
if (fmt[0].indexOf("[") === -1 && fmt[1].indexOf("[") === -1) return [l, ff];
|
|
if (fmt[0].match(cfregex) != null || fmt[1].match(cfregex) != null) {
|
|
var m1 = fmt[0].match(cfregex2);
|
|
var m2 = fmt[1].match(cfregex2);
|
|
return chkcond(v, m1) ? [l, fmt[0]] : chkcond(v, m2) ? [l, fmt[1]] : [l, fmt[m1 != null && m2 != null ? 2 : 1]];
|
|
}
|
|
return [l, ff];
|
|
}
|
|
function format(fmt, v, o) {
|
|
if (o == null) o = {};
|
|
var sfmt = "";
|
|
switch (_typeof(fmt)) {
|
|
case "string":
|
|
if (fmt == "m/d/yy" && o.dateNF) sfmt = o.dateNF;else sfmt = fmt;
|
|
break;
|
|
case "number":
|
|
if (fmt == 14 && o.dateNF) sfmt = o.dateNF;else sfmt = (o.table != null ? o.table : table_fmt)[fmt];
|
|
if (sfmt == null) sfmt = o.table && o.table[default_map[fmt]] || table_fmt[default_map[fmt]];
|
|
if (sfmt == null) sfmt = default_str[fmt] || "General";
|
|
break;
|
|
}
|
|
if (isgeneral(sfmt, 0)) return general_fmt(v, o);
|
|
if (v instanceof Date) v = datenum_local(v, o.date1904);
|
|
var f = choose_fmt(sfmt, v);
|
|
if (isgeneral(f[1])) return general_fmt(v, o);
|
|
if (v === true) v = "TRUE";else if (v === false) v = "FALSE";else if (v === "" || v == null) return "";
|
|
return eval_fmt(f[1], v, o, f[0]);
|
|
}
|
|
function load_entry(fmt, idx) {
|
|
if (typeof idx != 'number') {
|
|
idx = +idx || -1;
|
|
for (var i = 0; i < 0x0188; ++i) {
|
|
if (table_fmt[i] == undefined) {
|
|
if (idx < 0) idx = i;
|
|
continue;
|
|
}
|
|
if (table_fmt[i] == fmt) {
|
|
idx = i;
|
|
break;
|
|
}
|
|
}
|
|
if (idx < 0) idx = 0x187;
|
|
}
|
|
table_fmt[idx] = fmt;
|
|
return idx;
|
|
}
|
|
SSF.load = load_entry;
|
|
SSF._table = table_fmt;
|
|
SSF.get_table = function get_table() {
|
|
return table_fmt;
|
|
};
|
|
SSF.load_table = function load_table(tbl) {
|
|
for (var i = 0; i != 0x0188; ++i) {
|
|
if (tbl[i] !== undefined) load_entry(tbl[i], i);
|
|
}
|
|
};
|
|
SSF.init_table = init_table;
|
|
SSF.format = format;
|
|
};
|
|
make_ssf(SSF);
|
|
/* map from xlml named formats to SSF TODO: localize */
|
|
var XLMLFormatMap /*{[string]:string}*/ = {
|
|
"General Number": "General",
|
|
"General Date": SSF._table[22],
|
|
"Long Date": "dddd, mmmm dd, yyyy",
|
|
"Medium Date": SSF._table[15],
|
|
"Short Date": SSF._table[14],
|
|
"Long Time": SSF._table[19],
|
|
"Medium Time": SSF._table[18],
|
|
"Short Time": SSF._table[20],
|
|
"Currency": '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',
|
|
"Fixed": SSF._table[2],
|
|
"Standard": SSF._table[4],
|
|
"Percent": SSF._table[10],
|
|
"Scientific": SSF._table[11],
|
|
"Yes/No": '"Yes";"Yes";"No";@',
|
|
"True/False": '"True";"True";"False";@',
|
|
"On/Off": '"Yes";"Yes";"No";@'
|
|
};
|
|
var SSFImplicit /*{[number]:string}*/ = {
|
|
"5": '"$"#,##0_);\\("$"#,##0\\)',
|
|
"6": '"$"#,##0_);[Red]\\("$"#,##0\\)',
|
|
"7": '"$"#,##0.00_);\\("$"#,##0.00\\)',
|
|
"8": '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',
|
|
"23": 'General',
|
|
"24": 'General',
|
|
"25": 'General',
|
|
"26": 'General',
|
|
"27": 'm/d/yy',
|
|
"28": 'm/d/yy',
|
|
"29": 'm/d/yy',
|
|
"30": 'm/d/yy',
|
|
"31": 'm/d/yy',
|
|
"32": 'h:mm:ss',
|
|
"33": 'h:mm:ss',
|
|
"34": 'h:mm:ss',
|
|
"35": 'h:mm:ss',
|
|
"36": 'm/d/yy',
|
|
"41": '_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)',
|
|
"42": '_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_)',
|
|
"43": '_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)',
|
|
"44": '_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)',
|
|
"50": 'm/d/yy',
|
|
"51": 'm/d/yy',
|
|
"52": 'm/d/yy',
|
|
"53": 'm/d/yy',
|
|
"54": 'm/d/yy',
|
|
"55": 'm/d/yy',
|
|
"56": 'm/d/yy',
|
|
"57": 'm/d/yy',
|
|
"58": 'm/d/yy',
|
|
"59": '0',
|
|
"60": '0.00',
|
|
"61": '#,##0',
|
|
"62": '#,##0.00',
|
|
"63": '"$"#,##0_);\\("$"#,##0\\)',
|
|
"64": '"$"#,##0_);[Red]\\("$"#,##0\\)',
|
|
"65": '"$"#,##0.00_);\\("$"#,##0.00\\)',
|
|
"66": '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',
|
|
"67": '0%',
|
|
"68": '0.00%',
|
|
"69": '# ?/?',
|
|
"70": '# ??/??',
|
|
"71": 'm/d/yy',
|
|
"72": 'm/d/yy',
|
|
"73": 'd-mmm-yy',
|
|
"74": 'd-mmm',
|
|
"75": 'mmm-yy',
|
|
"76": 'h:mm',
|
|
"77": 'h:mm:ss',
|
|
"78": 'm/d/yy h:mm',
|
|
"79": 'mm:ss',
|
|
"80": '[h]:mm:ss',
|
|
"81": 'mmss.0'
|
|
};
|
|
|
|
/* dateNF parse TODO: move to SSF */
|
|
var dateNFregex = /[dD]+|[mM]+|[yYeE]+|[Hh]+|[Ss]+/g;
|
|
function dateNF_regex(dateNF) {
|
|
var fmt = typeof dateNF == "number" ? SSF._table[dateNF] : dateNF;
|
|
fmt = fmt.replace(dateNFregex, "(\\d+)");
|
|
return new RegExp("^" + fmt + "$");
|
|
}
|
|
function dateNF_fix(str, dateNF, match) {
|
|
var Y = -1,
|
|
m = -1,
|
|
d = -1,
|
|
H = -1,
|
|
M = -1,
|
|
S = -1;
|
|
(dateNF.match(dateNFregex) || []).forEach(function (n, i) {
|
|
var v = parseInt(match[i + 1], 10);
|
|
switch (n.toLowerCase().charAt(0)) {
|
|
case 'y':
|
|
Y = v;
|
|
break;
|
|
case 'd':
|
|
d = v;
|
|
break;
|
|
case 'h':
|
|
H = v;
|
|
break;
|
|
case 's':
|
|
S = v;
|
|
break;
|
|
case 'm':
|
|
if (H >= 0) M = v;else m = v;
|
|
break;
|
|
}
|
|
});
|
|
if (S >= 0 && M == -1 && m >= 0) {
|
|
M = m;
|
|
m = -1;
|
|
}
|
|
var datestr = ("" + (Y >= 0 ? Y : new Date().getFullYear())).slice(-4) + "-" + ("00" + (m >= 1 ? m : 1)).slice(-2) + "-" + ("00" + (d >= 1 ? d : 1)).slice(-2);
|
|
if (datestr.length == 7) datestr = "0" + datestr;
|
|
if (datestr.length == 8) datestr = "20" + datestr;
|
|
var timestr = ("00" + (H >= 0 ? H : 0)).slice(-2) + ":" + ("00" + (M >= 0 ? M : 0)).slice(-2) + ":" + ("00" + (S >= 0 ? S : 0)).slice(-2);
|
|
if (H == -1 && M == -1 && S == -1) return datestr;
|
|
if (Y == -1 && m == -1 && d == -1) return timestr;
|
|
return datestr + "T" + timestr;
|
|
}
|
|
var DO_NOT_EXPORT_CFB = true;
|
|
/* cfb.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
|
/* vim: set ts=2: */
|
|
/*jshint eqnull:true */
|
|
/*exported CFB */
|
|
/*global Uint8Array:false, Uint16Array:false */
|
|
|
|
/* crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */
|
|
/* vim: set ts=2: */
|
|
/*exported CRC32 */
|
|
var CRC32;
|
|
(function (factory) {
|
|
/*jshint ignore:start */
|
|
/*eslint-disable */
|
|
factory(CRC32 = {});
|
|
/*eslint-enable */
|
|
/*jshint ignore:end */
|
|
})(function (CRC32) {
|
|
CRC32.version = '1.2.0';
|
|
/* see perf/crc32table.js */
|
|
/*global Int32Array */
|
|
function signed_crc_table() {
|
|
var c = 0,
|
|
table = new Array(256);
|
|
for (var n = 0; n != 256; ++n) {
|
|
c = n;
|
|
c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1;
|
|
c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1;
|
|
c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1;
|
|
c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1;
|
|
c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1;
|
|
c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1;
|
|
c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1;
|
|
c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1;
|
|
table[n] = c;
|
|
}
|
|
return typeof Int32Array !== 'undefined' ? new Int32Array(table) : table;
|
|
}
|
|
var T = signed_crc_table();
|
|
function crc32_bstr(bstr, seed) {
|
|
var C = seed ^ -1,
|
|
L = bstr.length - 1;
|
|
for (var i = 0; i < L;) {
|
|
C = C >>> 8 ^ T[(C ^ bstr.charCodeAt(i++)) & 0xFF];
|
|
C = C >>> 8 ^ T[(C ^ bstr.charCodeAt(i++)) & 0xFF];
|
|
}
|
|
if (i === L) C = C >>> 8 ^ T[(C ^ bstr.charCodeAt(i)) & 0xFF];
|
|
return C ^ -1;
|
|
}
|
|
function crc32_buf(buf, seed) {
|
|
if (buf.length > 10000) return crc32_buf_8(buf, seed);
|
|
var C = seed ^ -1,
|
|
L = buf.length - 3;
|
|
for (var i = 0; i < L;) {
|
|
C = C >>> 8 ^ T[(C ^ buf[i++]) & 0xFF];
|
|
C = C >>> 8 ^ T[(C ^ buf[i++]) & 0xFF];
|
|
C = C >>> 8 ^ T[(C ^ buf[i++]) & 0xFF];
|
|
C = C >>> 8 ^ T[(C ^ buf[i++]) & 0xFF];
|
|
}
|
|
while (i < L + 3) {
|
|
C = C >>> 8 ^ T[(C ^ buf[i++]) & 0xFF];
|
|
}
|
|
return C ^ -1;
|
|
}
|
|
function crc32_buf_8(buf, seed) {
|
|
var C = seed ^ -1,
|
|
L = buf.length - 7;
|
|
for (var i = 0; i < L;) {
|
|
C = C >>> 8 ^ T[(C ^ buf[i++]) & 0xFF];
|
|
C = C >>> 8 ^ T[(C ^ buf[i++]) & 0xFF];
|
|
C = C >>> 8 ^ T[(C ^ buf[i++]) & 0xFF];
|
|
C = C >>> 8 ^ T[(C ^ buf[i++]) & 0xFF];
|
|
C = C >>> 8 ^ T[(C ^ buf[i++]) & 0xFF];
|
|
C = C >>> 8 ^ T[(C ^ buf[i++]) & 0xFF];
|
|
C = C >>> 8 ^ T[(C ^ buf[i++]) & 0xFF];
|
|
C = C >>> 8 ^ T[(C ^ buf[i++]) & 0xFF];
|
|
}
|
|
while (i < L + 7) {
|
|
C = C >>> 8 ^ T[(C ^ buf[i++]) & 0xFF];
|
|
}
|
|
return C ^ -1;
|
|
}
|
|
function crc32_str(str, seed) {
|
|
var C = seed ^ -1;
|
|
for (var i = 0, L = str.length, c, d; i < L;) {
|
|
c = str.charCodeAt(i++);
|
|
if (c < 0x80) {
|
|
C = C >>> 8 ^ T[(C ^ c) & 0xFF];
|
|
} else if (c < 0x800) {
|
|
C = C >>> 8 ^ T[(C ^ (192 | c >> 6 & 31)) & 0xFF];
|
|
C = C >>> 8 ^ T[(C ^ (128 | c & 63)) & 0xFF];
|
|
} else if (c >= 0xD800 && c < 0xE000) {
|
|
c = (c & 1023) + 64;
|
|
d = str.charCodeAt(i++) & 1023;
|
|
C = C >>> 8 ^ T[(C ^ (240 | c >> 8 & 7)) & 0xFF];
|
|
C = C >>> 8 ^ T[(C ^ (128 | c >> 2 & 63)) & 0xFF];
|
|
C = C >>> 8 ^ T[(C ^ (128 | d >> 6 & 15 | (c & 3) << 4)) & 0xFF];
|
|
C = C >>> 8 ^ T[(C ^ (128 | d & 63)) & 0xFF];
|
|
} else {
|
|
C = C >>> 8 ^ T[(C ^ (224 | c >> 12 & 15)) & 0xFF];
|
|
C = C >>> 8 ^ T[(C ^ (128 | c >> 6 & 63)) & 0xFF];
|
|
C = C >>> 8 ^ T[(C ^ (128 | c & 63)) & 0xFF];
|
|
}
|
|
}
|
|
return C ^ -1;
|
|
}
|
|
CRC32.table = T;
|
|
CRC32.bstr = crc32_bstr;
|
|
CRC32.buf = crc32_buf;
|
|
CRC32.str = crc32_str;
|
|
});
|
|
/* [MS-CFB] v20171201 */
|
|
var CFB = function _CFB() {
|
|
var exports = {};
|
|
exports.version = '1.1.4';
|
|
/* [MS-CFB] 2.6.4 */
|
|
function namecmp(l, r) {
|
|
var L = l.split("/"),
|
|
R = r.split("/");
|
|
for (var i = 0, c = 0, Z = Math.min(L.length, R.length); i < Z; ++i) {
|
|
if (c = L[i].length - R[i].length) return c;
|
|
if (L[i] != R[i]) return L[i] < R[i] ? -1 : 1;
|
|
}
|
|
return L.length - R.length;
|
|
}
|
|
function dirname(p) {
|
|
if (p.charAt(p.length - 1) == "/") return p.slice(0, -1).indexOf("/") === -1 ? p : dirname(p.slice(0, -1));
|
|
var c = p.lastIndexOf("/");
|
|
return c === -1 ? p : p.slice(0, c + 1);
|
|
}
|
|
function filename(p) {
|
|
if (p.charAt(p.length - 1) == "/") return filename(p.slice(0, -1));
|
|
var c = p.lastIndexOf("/");
|
|
return c === -1 ? p : p.slice(c + 1);
|
|
}
|
|
/* -------------------------------------------------------------------------- */
|
|
/* DOS Date format:
|
|
high|YYYYYYYm.mmmddddd.HHHHHMMM.MMMSSSSS|low
|
|
add 1980 to stored year
|
|
stored second should be doubled
|
|
*/
|
|
|
|
/* write JS date to buf as a DOS date */
|
|
function write_dos_date(buf, date) {
|
|
if (typeof date === "string") date = new Date(date);
|
|
var hms = date.getHours();
|
|
hms = hms << 6 | date.getMinutes();
|
|
hms = hms << 5 | date.getSeconds() >>> 1;
|
|
buf.write_shift(2, hms);
|
|
var ymd = date.getFullYear() - 1980;
|
|
ymd = ymd << 4 | date.getMonth() + 1;
|
|
ymd = ymd << 5 | date.getDate();
|
|
buf.write_shift(2, ymd);
|
|
}
|
|
|
|
/* read four bytes from buf and interpret as a DOS date */
|
|
function parse_dos_date(buf) {
|
|
var hms = buf.read_shift(2) & 0xFFFF;
|
|
var ymd = buf.read_shift(2) & 0xFFFF;
|
|
var val = new Date();
|
|
var d = ymd & 0x1F;
|
|
ymd >>>= 5;
|
|
var m = ymd & 0x0F;
|
|
ymd >>>= 4;
|
|
val.setMilliseconds(0);
|
|
val.setFullYear(ymd + 1980);
|
|
val.setMonth(m - 1);
|
|
val.setDate(d);
|
|
var S = hms & 0x1F;
|
|
hms >>>= 5;
|
|
var M = hms & 0x3F;
|
|
hms >>>= 6;
|
|
val.setHours(hms);
|
|
val.setMinutes(M);
|
|
val.setSeconds(S << 1);
|
|
return val;
|
|
}
|
|
function parse_extra_field(blob) {
|
|
prep_blob(blob, 0);
|
|
var o = {};
|
|
var flags = 0;
|
|
while (blob.l <= blob.length - 4) {
|
|
var type = blob.read_shift(2);
|
|
var sz = blob.read_shift(2),
|
|
tgt = blob.l + sz;
|
|
var p = {};
|
|
switch (type) {
|
|
/* UNIX-style Timestamps */
|
|
case 0x5455:
|
|
{
|
|
flags = blob.read_shift(1);
|
|
if (flags & 1) p.mtime = blob.read_shift(4);
|
|
/* for some reason, CD flag corresponds to LFH */
|
|
if (sz > 5) {
|
|
if (flags & 2) p.atime = blob.read_shift(4);
|
|
if (flags & 4) p.ctime = blob.read_shift(4);
|
|
}
|
|
if (p.mtime) p.mt = new Date(p.mtime * 1000);
|
|
}
|
|
break;
|
|
}
|
|
blob.l = tgt;
|
|
o[type] = p;
|
|
}
|
|
return o;
|
|
}
|
|
var fs;
|
|
function get_fs() {
|
|
return fs || (fs = __webpack_require__(/*! fs */ 78));
|
|
}
|
|
function parse(file, options) {
|
|
if (file[0] == 0x50 && file[1] == 0x4b) return parse_zip(file, options);
|
|
if (file.length < 512) throw new Error("CFB file size " + file.length + " < 512");
|
|
var mver = 3;
|
|
var ssz = 512;
|
|
var nmfs = 0; // number of mini FAT sectors
|
|
var difat_sec_cnt = 0;
|
|
var dir_start = 0;
|
|
var minifat_start = 0;
|
|
var difat_start = 0;
|
|
var fat_addrs = []; // locations of FAT sectors
|
|
|
|
/* [MS-CFB] 2.2 Compound File Header */
|
|
var blob = file.slice(0, 512);
|
|
prep_blob(blob, 0);
|
|
|
|
/* major version */
|
|
var mv = check_get_mver(blob);
|
|
mver = mv[0];
|
|
switch (mver) {
|
|
case 3:
|
|
ssz = 512;
|
|
break;
|
|
case 4:
|
|
ssz = 4096;
|
|
break;
|
|
case 0:
|
|
if (mv[1] == 0) return parse_zip(file, options);
|
|
/* falls through */
|
|
default:
|
|
throw new Error("Major Version: Expected 3 or 4 saw " + mver);
|
|
}
|
|
|
|
/* reprocess header */
|
|
if (ssz !== 512) {
|
|
blob = file.slice(0, ssz);
|
|
prep_blob(blob, 28 /* blob.l */);
|
|
}
|
|
/* Save header for final object */
|
|
var header = file.slice(0, ssz);
|
|
check_shifts(blob, mver);
|
|
|
|
// Number of Directory Sectors
|
|
var dir_cnt = blob.read_shift(4, 'i');
|
|
if (mver === 3 && dir_cnt !== 0) throw new Error('# Directory Sectors: Expected 0 saw ' + dir_cnt);
|
|
|
|
// Number of FAT Sectors
|
|
blob.l += 4;
|
|
|
|
// First Directory Sector Location
|
|
dir_start = blob.read_shift(4, 'i');
|
|
|
|
// Transaction Signature
|
|
blob.l += 4;
|
|
|
|
// Mini Stream Cutoff Size
|
|
blob.chk('00100000', 'Mini Stream Cutoff Size: ');
|
|
|
|
// First Mini FAT Sector Location
|
|
minifat_start = blob.read_shift(4, 'i');
|
|
|
|
// Number of Mini FAT Sectors
|
|
nmfs = blob.read_shift(4, 'i');
|
|
|
|
// First DIFAT sector location
|
|
difat_start = blob.read_shift(4, 'i');
|
|
|
|
// Number of DIFAT Sectors
|
|
difat_sec_cnt = blob.read_shift(4, 'i');
|
|
|
|
// Grab FAT Sector Locations
|
|
for (var q = -1, j = 0; j < 109; ++j) {
|
|
/* 109 = (512 - blob.l)>>>2; */
|
|
q = blob.read_shift(4, 'i');
|
|
if (q < 0) break;
|
|
fat_addrs[j] = q;
|
|
}
|
|
|
|
/** Break the file up into sectors */
|
|
var sectors = sectorify(file, ssz);
|
|
sleuth_fat(difat_start, difat_sec_cnt, sectors, ssz, fat_addrs);
|
|
|
|
/** Chains */
|
|
var sector_list = make_sector_list(sectors, dir_start, fat_addrs, ssz);
|
|
sector_list[dir_start].name = "!Directory";
|
|
if (nmfs > 0 && minifat_start !== ENDOFCHAIN) sector_list[minifat_start].name = "!MiniFAT";
|
|
sector_list[fat_addrs[0]].name = "!FAT";
|
|
sector_list.fat_addrs = fat_addrs;
|
|
sector_list.ssz = ssz;
|
|
|
|
/* [MS-CFB] 2.6.1 Compound File Directory Entry */
|
|
var files = {},
|
|
Paths = [],
|
|
FileIndex = [],
|
|
FullPaths = [];
|
|
read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, minifat_start);
|
|
build_full_paths(FileIndex, FullPaths, Paths);
|
|
Paths.shift();
|
|
var o = {
|
|
FileIndex: FileIndex,
|
|
FullPaths: FullPaths
|
|
};
|
|
|
|
// $FlowIgnore
|
|
if (options && options.raw) o.raw = {
|
|
header: header,
|
|
sectors: sectors
|
|
};
|
|
return o;
|
|
} // parse
|
|
|
|
/* [MS-CFB] 2.2 Compound File Header -- read up to major version */
|
|
function check_get_mver(blob) {
|
|
if (blob[blob.l] == 0x50 && blob[blob.l + 1] == 0x4b) return [0, 0];
|
|
// header signature 8
|
|
blob.chk(HEADER_SIGNATURE, 'Header Signature: ');
|
|
|
|
// clsid 16
|
|
//blob.chk(HEADER_CLSID, 'CLSID: ');
|
|
blob.l += 16;
|
|
|
|
// minor version 2
|
|
var mver = blob.read_shift(2, 'u');
|
|
return [blob.read_shift(2, 'u'), mver];
|
|
}
|
|
function check_shifts(blob, mver) {
|
|
var shift = 0x09;
|
|
|
|
// Byte Order
|
|
//blob.chk('feff', 'Byte Order: '); // note: some writers put 0xffff
|
|
blob.l += 2;
|
|
|
|
// Sector Shift
|
|
switch (shift = blob.read_shift(2)) {
|
|
case 0x09:
|
|
if (mver != 3) throw new Error('Sector Shift: Expected 9 saw ' + shift);
|
|
break;
|
|
case 0x0c:
|
|
if (mver != 4) throw new Error('Sector Shift: Expected 12 saw ' + shift);
|
|
break;
|
|
default:
|
|
throw new Error('Sector Shift: Expected 9 or 12 saw ' + shift);
|
|
}
|
|
|
|
// Mini Sector Shift
|
|
blob.chk('0600', 'Mini Sector Shift: ');
|
|
|
|
// Reserved
|
|
blob.chk('000000000000', 'Reserved: ');
|
|
}
|
|
|
|
/** Break the file up into sectors */
|
|
function sectorify(file, ssz) {
|
|
var nsectors = Math.ceil(file.length / ssz) - 1;
|
|
var sectors = [];
|
|
for (var i = 1; i < nsectors; ++i) {
|
|
sectors[i - 1] = file.slice(i * ssz, (i + 1) * ssz);
|
|
}
|
|
sectors[nsectors - 1] = file.slice(nsectors * ssz);
|
|
return sectors;
|
|
}
|
|
|
|
/* [MS-CFB] 2.6.4 Red-Black Tree */
|
|
function build_full_paths(FI, FP, Paths) {
|
|
var i = 0,
|
|
L = 0,
|
|
R = 0,
|
|
C = 0,
|
|
j = 0,
|
|
pl = Paths.length;
|
|
var dad = [],
|
|
q = [];
|
|
for (; i < pl; ++i) {
|
|
dad[i] = q[i] = i;
|
|
FP[i] = Paths[i];
|
|
}
|
|
for (; j < q.length; ++j) {
|
|
i = q[j];
|
|
L = FI[i].L;
|
|
R = FI[i].R;
|
|
C = FI[i].C;
|
|
if (dad[i] === i) {
|
|
if (L !== -1 /*NOSTREAM*/ && dad[L] !== L) dad[i] = dad[L];
|
|
if (R !== -1 && dad[R] !== R) dad[i] = dad[R];
|
|
}
|
|
if (C !== -1 /*NOSTREAM*/) dad[C] = i;
|
|
if (L !== -1 && i != dad[i]) {
|
|
dad[L] = dad[i];
|
|
if (q.lastIndexOf(L) < j) q.push(L);
|
|
}
|
|
if (R !== -1 && i != dad[i]) {
|
|
dad[R] = dad[i];
|
|
if (q.lastIndexOf(R) < j) q.push(R);
|
|
}
|
|
}
|
|
for (i = 1; i < pl; ++i) {
|
|
if (dad[i] === i) {
|
|
if (R !== -1 /*NOSTREAM*/ && dad[R] !== R) dad[i] = dad[R];else if (L !== -1 && dad[L] !== L) dad[i] = dad[L];
|
|
}
|
|
}
|
|
for (i = 1; i < pl; ++i) {
|
|
if (FI[i].type === 0 /* unknown */) continue;
|
|
j = i;
|
|
if (j != dad[j]) do {
|
|
j = dad[j];
|
|
FP[i] = FP[j] + "/" + FP[i];
|
|
} while (j !== 0 && -1 !== dad[j] && j != dad[j]);
|
|
dad[i] = -1;
|
|
}
|
|
FP[0] += "/";
|
|
for (i = 1; i < pl; ++i) {
|
|
if (FI[i].type !== 2 /* stream */) FP[i] += "/";
|
|
}
|
|
}
|
|
function get_mfat_entry(entry, payload, mini) {
|
|
var start = entry.start,
|
|
size = entry.size;
|
|
//return (payload.slice(start*MSSZ, start*MSSZ + size));
|
|
var o = [];
|
|
var idx = start;
|
|
while (mini && size > 0 && idx >= 0) {
|
|
o.push(payload.slice(idx * MSSZ, idx * MSSZ + MSSZ));
|
|
size -= MSSZ;
|
|
idx = __readInt32LE(mini, idx * 4);
|
|
}
|
|
if (o.length === 0) return new_buf(0);
|
|
return bconcat(o).slice(0, entry.size);
|
|
}
|
|
|
|
/** Chase down the rest of the DIFAT chain to build a comprehensive list
|
|
DIFAT chains by storing the next sector number as the last 32 bits */
|
|
function sleuth_fat(idx, cnt, sectors, ssz, fat_addrs) {
|
|
var q = ENDOFCHAIN;
|
|
if (idx === ENDOFCHAIN) {
|
|
if (cnt !== 0) throw new Error("DIFAT chain shorter than expected");
|
|
} else if (idx !== -1 /*FREESECT*/) {
|
|
var sector = sectors[idx],
|
|
m = (ssz >>> 2) - 1;
|
|
if (!sector) return;
|
|
for (var i = 0; i < m; ++i) {
|
|
if ((q = __readInt32LE(sector, i * 4)) === ENDOFCHAIN) break;
|
|
fat_addrs.push(q);
|
|
}
|
|
if (cnt >= 1) sleuth_fat(__readInt32LE(sector, ssz - 4), cnt - 1, sectors, ssz, fat_addrs);
|
|
}
|
|
}
|
|
|
|
/** Follow the linked list of sectors for a given starting point */
|
|
function get_sector_list(sectors, start, fat_addrs, ssz, chkd) {
|
|
var buf = [],
|
|
buf_chain = [];
|
|
if (!chkd) chkd = [];
|
|
var modulus = ssz - 1,
|
|
j = 0,
|
|
jj = 0;
|
|
for (j = start; j >= 0;) {
|
|
chkd[j] = true;
|
|
buf[buf.length] = j;
|
|
buf_chain.push(sectors[j]);
|
|
var addr = fat_addrs[Math.floor(j * 4 / ssz)];
|
|
jj = j * 4 & modulus;
|
|
if (ssz < 4 + jj) throw new Error("FAT boundary crossed: " + j + " 4 " + ssz);
|
|
if (!sectors[addr]) break;
|
|
j = __readInt32LE(sectors[addr], jj);
|
|
}
|
|
return {
|
|
nodes: buf,
|
|
data: __toBuffer([buf_chain])
|
|
};
|
|
}
|
|
|
|
/** Chase down the sector linked lists */
|
|
function make_sector_list(sectors, dir_start, fat_addrs, ssz) {
|
|
var sl = sectors.length,
|
|
sector_list = [];
|
|
var chkd = [],
|
|
buf = [],
|
|
buf_chain = [];
|
|
var modulus = ssz - 1,
|
|
i = 0,
|
|
j = 0,
|
|
k = 0,
|
|
jj = 0;
|
|
for (i = 0; i < sl; ++i) {
|
|
buf = [];
|
|
k = i + dir_start;
|
|
if (k >= sl) k -= sl;
|
|
if (chkd[k]) continue;
|
|
buf_chain = [];
|
|
var seen = [];
|
|
for (j = k; j >= 0;) {
|
|
seen[j] = true;
|
|
chkd[j] = true;
|
|
buf[buf.length] = j;
|
|
buf_chain.push(sectors[j]);
|
|
var addr = fat_addrs[Math.floor(j * 4 / ssz)];
|
|
jj = j * 4 & modulus;
|
|
if (ssz < 4 + jj) throw new Error("FAT boundary crossed: " + j + " 4 " + ssz);
|
|
if (!sectors[addr]) break;
|
|
j = __readInt32LE(sectors[addr], jj);
|
|
if (seen[j]) break;
|
|
}
|
|
sector_list[k] = {
|
|
nodes: buf,
|
|
data: __toBuffer([buf_chain])
|
|
};
|
|
}
|
|
return sector_list;
|
|
}
|
|
|
|
/* [MS-CFB] 2.6.1 Compound File Directory Entry */
|
|
function read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, mini) {
|
|
var minifat_store = 0,
|
|
pl = Paths.length ? 2 : 0;
|
|
var sector = sector_list[dir_start].data;
|
|
var i = 0,
|
|
namelen = 0,
|
|
name;
|
|
for (; i < sector.length; i += 128) {
|
|
var blob = sector.slice(i, i + 128);
|
|
prep_blob(blob, 64);
|
|
namelen = blob.read_shift(2);
|
|
name = __utf16le(blob, 0, namelen - pl);
|
|
Paths.push(name);
|
|
var o = {
|
|
name: name,
|
|
type: blob.read_shift(1),
|
|
color: blob.read_shift(1),
|
|
L: blob.read_shift(4, 'i'),
|
|
R: blob.read_shift(4, 'i'),
|
|
C: blob.read_shift(4, 'i'),
|
|
clsid: blob.read_shift(16),
|
|
state: blob.read_shift(4, 'i'),
|
|
start: 0,
|
|
size: 0
|
|
};
|
|
var ctime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);
|
|
if (ctime !== 0) o.ct = read_date(blob, blob.l - 8);
|
|
var mtime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);
|
|
if (mtime !== 0) o.mt = read_date(blob, blob.l - 8);
|
|
o.start = blob.read_shift(4, 'i');
|
|
o.size = blob.read_shift(4, 'i');
|
|
if (o.size < 0 && o.start < 0) {
|
|
o.size = o.type = 0;
|
|
o.start = ENDOFCHAIN;
|
|
o.name = "";
|
|
}
|
|
if (o.type === 5) {
|
|
/* root */
|
|
minifat_store = o.start;
|
|
if (nmfs > 0 && minifat_store !== ENDOFCHAIN) sector_list[minifat_store].name = "!StreamData";
|
|
/*minifat_size = o.size;*/
|
|
} else if (o.size >= 4096 /* MSCSZ */) {
|
|
o.storage = 'fat';
|
|
if (sector_list[o.start] === undefined) sector_list[o.start] = get_sector_list(sectors, o.start, sector_list.fat_addrs, sector_list.ssz);
|
|
sector_list[o.start].name = o.name;
|
|
o.content = sector_list[o.start].data.slice(0, o.size);
|
|
} else {
|
|
o.storage = 'minifat';
|
|
if (o.size < 0) o.size = 0;else if (minifat_store !== ENDOFCHAIN && o.start !== ENDOFCHAIN && sector_list[minifat_store]) {
|
|
o.content = get_mfat_entry(o, sector_list[minifat_store].data, (sector_list[mini] || {}).data);
|
|
}
|
|
}
|
|
if (o.content) prep_blob(o.content, 0);
|
|
files[name] = o;
|
|
FileIndex.push(o);
|
|
}
|
|
}
|
|
function read_date(blob, offset) {
|
|
return new Date((__readUInt32LE(blob, offset + 4) / 1e7 * Math.pow(2, 32) + __readUInt32LE(blob, offset) / 1e7 - 11644473600) * 1000);
|
|
}
|
|
function read_file(filename, options) {
|
|
get_fs();
|
|
return parse(fs.readFileSync(filename), options);
|
|
}
|
|
function read(blob, options) {
|
|
switch (options && options.type || "base64") {
|
|
case "file":
|
|
return read_file(blob, options);
|
|
case "base64":
|
|
return parse(s2a(Base64.decode(blob)), options);
|
|
case "binary":
|
|
return parse(s2a(blob), options);
|
|
}
|
|
return parse(blob, options);
|
|
}
|
|
function init_cfb(cfb, opts) {
|
|
var o = opts || {},
|
|
root = o.root || "Root Entry";
|
|
if (!cfb.FullPaths) cfb.FullPaths = [];
|
|
if (!cfb.FileIndex) cfb.FileIndex = [];
|
|
if (cfb.FullPaths.length !== cfb.FileIndex.length) throw new Error("inconsistent CFB structure");
|
|
if (cfb.FullPaths.length === 0) {
|
|
cfb.FullPaths[0] = root + "/";
|
|
cfb.FileIndex[0] = {
|
|
name: root,
|
|
type: 5
|
|
};
|
|
}
|
|
if (o.CLSID) cfb.FileIndex[0].clsid = o.CLSID;
|
|
seed_cfb(cfb);
|
|
}
|
|
function seed_cfb(cfb) {
|
|
var nm = "\x01Sh33tJ5";
|
|
if (CFB.find(cfb, "/" + nm)) return;
|
|
var p = new_buf(4);
|
|
p[0] = 55;
|
|
p[1] = p[3] = 50;
|
|
p[2] = 54;
|
|
cfb.FileIndex.push({
|
|
name: nm,
|
|
type: 2,
|
|
content: p,
|
|
size: 4,
|
|
L: 69,
|
|
R: 69,
|
|
C: 69
|
|
});
|
|
cfb.FullPaths.push(cfb.FullPaths[0] + nm);
|
|
rebuild_cfb(cfb);
|
|
}
|
|
function rebuild_cfb(cfb, f) {
|
|
init_cfb(cfb);
|
|
var gc = false,
|
|
s = false;
|
|
for (var i = cfb.FullPaths.length - 1; i >= 0; --i) {
|
|
var _file = cfb.FileIndex[i];
|
|
switch (_file.type) {
|
|
case 0:
|
|
if (s) gc = true;else {
|
|
cfb.FileIndex.pop();
|
|
cfb.FullPaths.pop();
|
|
}
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
case 5:
|
|
s = true;
|
|
if (isNaN(_file.R * _file.L * _file.C)) gc = true;
|
|
if (_file.R > -1 && _file.L > -1 && _file.R == _file.L) gc = true;
|
|
break;
|
|
default:
|
|
gc = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!gc && !f) return;
|
|
var now = new Date(1987, 1, 19),
|
|
j = 0;
|
|
var data = [];
|
|
for (i = 0; i < cfb.FullPaths.length; ++i) {
|
|
if (cfb.FileIndex[i].type === 0) continue;
|
|
data.push([cfb.FullPaths[i], cfb.FileIndex[i]]);
|
|
}
|
|
for (i = 0; i < data.length; ++i) {
|
|
var dad = dirname(data[i][0]);
|
|
s = false;
|
|
for (j = 0; j < data.length; ++j) {
|
|
if (data[j][0] === dad) s = true;
|
|
}
|
|
if (!s) data.push([dad, {
|
|
name: filename(dad).replace("/", ""),
|
|
type: 1,
|
|
clsid: HEADER_CLSID,
|
|
ct: now,
|
|
mt: now,
|
|
content: null
|
|
}]);
|
|
}
|
|
data.sort(function (x, y) {
|
|
return namecmp(x[0], y[0]);
|
|
});
|
|
cfb.FullPaths = [];
|
|
cfb.FileIndex = [];
|
|
for (i = 0; i < data.length; ++i) {
|
|
cfb.FullPaths[i] = data[i][0];
|
|
cfb.FileIndex[i] = data[i][1];
|
|
}
|
|
for (i = 0; i < data.length; ++i) {
|
|
var elt = cfb.FileIndex[i];
|
|
var nm = cfb.FullPaths[i];
|
|
elt.name = filename(nm).replace("/", "");
|
|
elt.L = elt.R = elt.C = -(elt.color = 1);
|
|
elt.size = elt.content ? elt.content.length : 0;
|
|
elt.start = 0;
|
|
elt.clsid = elt.clsid || HEADER_CLSID;
|
|
if (i === 0) {
|
|
elt.C = data.length > 1 ? 1 : -1;
|
|
elt.size = 0;
|
|
elt.type = 5;
|
|
} else if (nm.slice(-1) == "/") {
|
|
for (j = i + 1; j < data.length; ++j) {
|
|
if (dirname(cfb.FullPaths[j]) == nm) break;
|
|
}
|
|
elt.C = j >= data.length ? -1 : j;
|
|
for (j = i + 1; j < data.length; ++j) {
|
|
if (dirname(cfb.FullPaths[j]) == dirname(nm)) break;
|
|
}
|
|
elt.R = j >= data.length ? -1 : j;
|
|
elt.type = 1;
|
|
} else {
|
|
if (dirname(cfb.FullPaths[i + 1] || "") == dirname(nm)) elt.R = i + 1;
|
|
elt.type = 2;
|
|
}
|
|
}
|
|
}
|
|
function _write(cfb, options) {
|
|
var _opts = options || {};
|
|
rebuild_cfb(cfb);
|
|
if (_opts.fileType == 'zip') return write_zip(cfb, _opts);
|
|
var L = function (cfb) {
|
|
var mini_size = 0,
|
|
fat_size = 0;
|
|
for (var i = 0; i < cfb.FileIndex.length; ++i) {
|
|
var file = cfb.FileIndex[i];
|
|
if (!file.content) continue;
|
|
var flen = file.content.length;
|
|
if (flen > 0) {
|
|
if (flen < 0x1000) mini_size += flen + 0x3F >> 6;else fat_size += flen + 0x01FF >> 9;
|
|
}
|
|
}
|
|
var dir_cnt = cfb.FullPaths.length + 3 >> 2;
|
|
var mini_cnt = mini_size + 7 >> 3;
|
|
var mfat_cnt = mini_size + 0x7F >> 7;
|
|
var fat_base = mini_cnt + fat_size + dir_cnt + mfat_cnt;
|
|
var fat_cnt = fat_base + 0x7F >> 7;
|
|
var difat_cnt = fat_cnt <= 109 ? 0 : Math.ceil((fat_cnt - 109) / 0x7F);
|
|
while (fat_base + fat_cnt + difat_cnt + 0x7F >> 7 > fat_cnt) {
|
|
difat_cnt = ++fat_cnt <= 109 ? 0 : Math.ceil((fat_cnt - 109) / 0x7F);
|
|
}
|
|
var L = [1, difat_cnt, fat_cnt, mfat_cnt, dir_cnt, fat_size, mini_size, 0];
|
|
cfb.FileIndex[0].size = mini_size << 6;
|
|
L[7] = (cfb.FileIndex[0].start = L[0] + L[1] + L[2] + L[3] + L[4] + L[5]) + (L[6] + 7 >> 3);
|
|
return L;
|
|
}(cfb);
|
|
var o = new_buf(L[7] << 9);
|
|
var i = 0,
|
|
T = 0;
|
|
{
|
|
for (i = 0; i < 8; ++i) {
|
|
o.write_shift(1, HEADER_SIG[i]);
|
|
}
|
|
for (i = 0; i < 8; ++i) {
|
|
o.write_shift(2, 0);
|
|
}
|
|
o.write_shift(2, 0x003E);
|
|
o.write_shift(2, 0x0003);
|
|
o.write_shift(2, 0xFFFE);
|
|
o.write_shift(2, 0x0009);
|
|
o.write_shift(2, 0x0006);
|
|
for (i = 0; i < 3; ++i) {
|
|
o.write_shift(2, 0);
|
|
}
|
|
o.write_shift(4, 0);
|
|
o.write_shift(4, L[2]);
|
|
o.write_shift(4, L[0] + L[1] + L[2] + L[3] - 1);
|
|
o.write_shift(4, 0);
|
|
o.write_shift(4, 1 << 12);
|
|
o.write_shift(4, L[3] ? L[0] + L[1] + L[2] - 1 : ENDOFCHAIN);
|
|
o.write_shift(4, L[3]);
|
|
o.write_shift(-4, L[1] ? L[0] - 1 : ENDOFCHAIN);
|
|
o.write_shift(4, L[1]);
|
|
for (i = 0; i < 109; ++i) {
|
|
o.write_shift(-4, i < L[2] ? L[1] + i : -1);
|
|
}
|
|
}
|
|
if (L[1]) {
|
|
for (T = 0; T < L[1]; ++T) {
|
|
for (; i < 236 + T * 127; ++i) {
|
|
o.write_shift(-4, i < L[2] ? L[1] + i : -1);
|
|
}
|
|
o.write_shift(-4, T === L[1] - 1 ? ENDOFCHAIN : T + 1);
|
|
}
|
|
}
|
|
var chainit = function chainit(w) {
|
|
for (T += w; i < T - 1; ++i) {
|
|
o.write_shift(-4, i + 1);
|
|
}
|
|
if (w) {
|
|
++i;
|
|
o.write_shift(-4, ENDOFCHAIN);
|
|
}
|
|
};
|
|
T = i = 0;
|
|
for (T += L[1]; i < T; ++i) {
|
|
o.write_shift(-4, consts.DIFSECT);
|
|
}
|
|
for (T += L[2]; i < T; ++i) {
|
|
o.write_shift(-4, consts.FATSECT);
|
|
}
|
|
chainit(L[3]);
|
|
chainit(L[4]);
|
|
var j = 0,
|
|
flen = 0;
|
|
var file = cfb.FileIndex[0];
|
|
for (; j < cfb.FileIndex.length; ++j) {
|
|
file = cfb.FileIndex[j];
|
|
if (!file.content) continue;
|
|
flen = file.content.length;
|
|
if (flen < 0x1000) continue;
|
|
file.start = T;
|
|
chainit(flen + 0x01FF >> 9);
|
|
}
|
|
chainit(L[6] + 7 >> 3);
|
|
while (o.l & 0x1FF) {
|
|
o.write_shift(-4, consts.ENDOFCHAIN);
|
|
}
|
|
T = i = 0;
|
|
for (j = 0; j < cfb.FileIndex.length; ++j) {
|
|
file = cfb.FileIndex[j];
|
|
if (!file.content) continue;
|
|
flen = file.content.length;
|
|
if (!flen || flen >= 0x1000) continue;
|
|
file.start = T;
|
|
chainit(flen + 0x3F >> 6);
|
|
}
|
|
while (o.l & 0x1FF) {
|
|
o.write_shift(-4, consts.ENDOFCHAIN);
|
|
}
|
|
for (i = 0; i < L[4] << 2; ++i) {
|
|
var nm = cfb.FullPaths[i];
|
|
if (!nm || nm.length === 0) {
|
|
for (j = 0; j < 17; ++j) {
|
|
o.write_shift(4, 0);
|
|
}
|
|
for (j = 0; j < 3; ++j) {
|
|
o.write_shift(4, -1);
|
|
}
|
|
for (j = 0; j < 12; ++j) {
|
|
o.write_shift(4, 0);
|
|
}
|
|
continue;
|
|
}
|
|
file = cfb.FileIndex[i];
|
|
if (i === 0) file.start = file.size ? file.start - 1 : ENDOFCHAIN;
|
|
var _nm = i === 0 && _opts.root || file.name;
|
|
flen = 2 * (_nm.length + 1);
|
|
o.write_shift(64, _nm, "utf16le");
|
|
o.write_shift(2, flen);
|
|
o.write_shift(1, file.type);
|
|
o.write_shift(1, file.color);
|
|
o.write_shift(-4, file.L);
|
|
o.write_shift(-4, file.R);
|
|
o.write_shift(-4, file.C);
|
|
if (!file.clsid) for (j = 0; j < 4; ++j) {
|
|
o.write_shift(4, 0);
|
|
} else o.write_shift(16, file.clsid, "hex");
|
|
o.write_shift(4, file.state || 0);
|
|
o.write_shift(4, 0);
|
|
o.write_shift(4, 0);
|
|
o.write_shift(4, 0);
|
|
o.write_shift(4, 0);
|
|
o.write_shift(4, file.start);
|
|
o.write_shift(4, file.size);
|
|
o.write_shift(4, 0);
|
|
}
|
|
for (i = 1; i < cfb.FileIndex.length; ++i) {
|
|
file = cfb.FileIndex[i];
|
|
if (file.size >= 0x1000) {
|
|
o.l = file.start + 1 << 9;
|
|
for (j = 0; j < file.size; ++j) {
|
|
o.write_shift(1, file.content[j]);
|
|
}
|
|
for (; j & 0x1FF; ++j) {
|
|
o.write_shift(1, 0);
|
|
}
|
|
}
|
|
}
|
|
for (i = 1; i < cfb.FileIndex.length; ++i) {
|
|
file = cfb.FileIndex[i];
|
|
if (file.size > 0 && file.size < 0x1000) {
|
|
for (j = 0; j < file.size; ++j) {
|
|
o.write_shift(1, file.content[j]);
|
|
}
|
|
for (; j & 0x3F; ++j) {
|
|
o.write_shift(1, 0);
|
|
}
|
|
}
|
|
}
|
|
while (o.l < o.length) {
|
|
o.write_shift(1, 0);
|
|
}
|
|
return o;
|
|
}
|
|
/* [MS-CFB] 2.6.4 (Unicode 3.0.1 case conversion) */
|
|
function find(cfb, path) {
|
|
var UCFullPaths = cfb.FullPaths.map(function (x) {
|
|
return x.toUpperCase();
|
|
});
|
|
var UCPaths = UCFullPaths.map(function (x) {
|
|
var y = x.split("/");
|
|
return y[y.length - (x.slice(-1) == "/" ? 2 : 1)];
|
|
});
|
|
var k = false;
|
|
if (path.charCodeAt(0) === 47 /* "/" */) {
|
|
k = true;
|
|
path = UCFullPaths[0].slice(0, -1) + path;
|
|
} else k = path.indexOf("/") !== -1;
|
|
var UCPath = path.toUpperCase();
|
|
var w = k === true ? UCFullPaths.indexOf(UCPath) : UCPaths.indexOf(UCPath);
|
|
if (w !== -1) return cfb.FileIndex[w];
|
|
var m = !UCPath.match(chr1);
|
|
UCPath = UCPath.replace(chr0, '');
|
|
if (m) UCPath = UCPath.replace(chr1, '!');
|
|
for (w = 0; w < UCFullPaths.length; ++w) {
|
|
if ((m ? UCFullPaths[w].replace(chr1, '!') : UCFullPaths[w]).replace(chr0, '') == UCPath) return cfb.FileIndex[w];
|
|
if ((m ? UCPaths[w].replace(chr1, '!') : UCPaths[w]).replace(chr0, '') == UCPath) return cfb.FileIndex[w];
|
|
}
|
|
return null;
|
|
}
|
|
/** CFB Constants */
|
|
var MSSZ = 64; /* Mini Sector Size = 1<<6 */
|
|
//var MSCSZ = 4096; /* Mini Stream Cutoff Size */
|
|
/* 2.1 Compound File Sector Numbers and Types */
|
|
var ENDOFCHAIN = -2;
|
|
/* 2.2 Compound File Header */
|
|
var HEADER_SIGNATURE = 'd0cf11e0a1b11ae1';
|
|
var HEADER_SIG = [0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1];
|
|
var HEADER_CLSID = '00000000000000000000000000000000';
|
|
var consts = {
|
|
/* 2.1 Compund File Sector Numbers and Types */
|
|
MAXREGSECT: -6,
|
|
DIFSECT: -4,
|
|
FATSECT: -3,
|
|
ENDOFCHAIN: ENDOFCHAIN,
|
|
FREESECT: -1,
|
|
/* 2.2 Compound File Header */
|
|
HEADER_SIGNATURE: HEADER_SIGNATURE,
|
|
HEADER_MINOR_VERSION: '3e00',
|
|
MAXREGSID: -6,
|
|
NOSTREAM: -1,
|
|
HEADER_CLSID: HEADER_CLSID,
|
|
/* 2.6.1 Compound File Directory Entry */
|
|
EntryTypes: ['unknown', 'storage', 'stream', 'lockbytes', 'property', 'root']
|
|
};
|
|
function write_file(cfb, filename, options) {
|
|
get_fs();
|
|
var o = _write(cfb, options);
|
|
fs.writeFileSync(filename, o);
|
|
}
|
|
function a2s(o) {
|
|
var out = new Array(o.length);
|
|
for (var i = 0; i < o.length; ++i) {
|
|
out[i] = String.fromCharCode(o[i]);
|
|
}
|
|
return out.join("");
|
|
}
|
|
function write(cfb, options) {
|
|
var o = _write(cfb, options);
|
|
switch (options && options.type) {
|
|
case "file":
|
|
get_fs();
|
|
fs.writeFileSync(options.filename, o);
|
|
return o;
|
|
case "binary":
|
|
return a2s(o);
|
|
case "base64":
|
|
return Base64.encode(a2s(o));
|
|
}
|
|
return o;
|
|
}
|
|
/* node < 8.1 zlib does not expose bytesRead, so default to pure JS */
|
|
var _zlib;
|
|
function use_zlib(zlib) {
|
|
try {
|
|
var InflateRaw = zlib.InflateRaw;
|
|
var InflRaw = new InflateRaw();
|
|
InflRaw._processChunk(new Uint8Array([3, 0]), InflRaw._finishFlushFlag);
|
|
if (InflRaw.bytesRead) _zlib = zlib;else throw new Error("zlib does not expose bytesRead");
|
|
} catch (e) {
|
|
console.error("cannot use native zlib: " + (e.message || e));
|
|
}
|
|
}
|
|
function _inflateRawSync(payload, usz) {
|
|
if (!_zlib) return _inflate(payload, usz);
|
|
var InflateRaw = _zlib.InflateRaw;
|
|
var InflRaw = new InflateRaw();
|
|
var out = InflRaw._processChunk(payload.slice(payload.l), InflRaw._finishFlushFlag);
|
|
payload.l += InflRaw.bytesRead;
|
|
return out;
|
|
}
|
|
function _deflateRawSync(payload) {
|
|
return _zlib ? _zlib.deflateRawSync(payload) : _deflate(payload);
|
|
}
|
|
var CLEN_ORDER = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
|
|
|
|
/* LEN_ID = [ 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285 ]; */
|
|
var LEN_LN = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258];
|
|
|
|
/* DST_ID = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 ]; */
|
|
var DST_LN = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577];
|
|
function bit_swap_8(n) {
|
|
var t = (n << 1 | n << 11) & 0x22110 | (n << 5 | n << 15) & 0x88440;
|
|
return (t >> 16 | t >> 8 | t) & 0xFF;
|
|
}
|
|
var use_typed_arrays = typeof Uint8Array !== 'undefined';
|
|
var bitswap8 = use_typed_arrays ? new Uint8Array(1 << 8) : [];
|
|
for (var q = 0; q < 1 << 8; ++q) {
|
|
bitswap8[q] = bit_swap_8(q);
|
|
}
|
|
function bit_swap_n(n, b) {
|
|
var rev = bitswap8[n & 0xFF];
|
|
if (b <= 8) return rev >>> 8 - b;
|
|
rev = rev << 8 | bitswap8[n >> 8 & 0xFF];
|
|
if (b <= 16) return rev >>> 16 - b;
|
|
rev = rev << 8 | bitswap8[n >> 16 & 0xFF];
|
|
return rev >>> 24 - b;
|
|
}
|
|
|
|
/* helpers for unaligned bit reads */
|
|
function read_bits_2(buf, bl) {
|
|
var w = bl & 7,
|
|
h = bl >>> 3;
|
|
return (buf[h] | (w <= 6 ? 0 : buf[h + 1] << 8)) >>> w & 0x03;
|
|
}
|
|
function read_bits_3(buf, bl) {
|
|
var w = bl & 7,
|
|
h = bl >>> 3;
|
|
return (buf[h] | (w <= 5 ? 0 : buf[h + 1] << 8)) >>> w & 0x07;
|
|
}
|
|
function read_bits_4(buf, bl) {
|
|
var w = bl & 7,
|
|
h = bl >>> 3;
|
|
return (buf[h] | (w <= 4 ? 0 : buf[h + 1] << 8)) >>> w & 0x0F;
|
|
}
|
|
function read_bits_5(buf, bl) {
|
|
var w = bl & 7,
|
|
h = bl >>> 3;
|
|
return (buf[h] | (w <= 3 ? 0 : buf[h + 1] << 8)) >>> w & 0x1F;
|
|
}
|
|
function read_bits_7(buf, bl) {
|
|
var w = bl & 7,
|
|
h = bl >>> 3;
|
|
return (buf[h] | (w <= 1 ? 0 : buf[h + 1] << 8)) >>> w & 0x7F;
|
|
}
|
|
|
|
/* works up to n = 3 * 8 + 1 = 25 */
|
|
function read_bits_n(buf, bl, n) {
|
|
var w = bl & 7,
|
|
h = bl >>> 3,
|
|
f = (1 << n) - 1;
|
|
var v = buf[h] >>> w;
|
|
if (n < 8 - w) return v & f;
|
|
v |= buf[h + 1] << 8 - w;
|
|
if (n < 16 - w) return v & f;
|
|
v |= buf[h + 2] << 16 - w;
|
|
if (n < 24 - w) return v & f;
|
|
v |= buf[h + 3] << 24 - w;
|
|
return v & f;
|
|
}
|
|
|
|
/* until ArrayBuffer#realloc is a thing, fake a realloc */
|
|
function realloc(b, sz) {
|
|
var L = b.length,
|
|
M = 2 * L > sz ? 2 * L : sz + 5,
|
|
i = 0;
|
|
if (L >= sz) return b;
|
|
if (has_buf) {
|
|
var o = new_unsafe_buf(M);
|
|
// $FlowIgnore
|
|
if (b.copy) b.copy(o);else for (; i < b.length; ++i) {
|
|
o[i] = b[i];
|
|
}
|
|
return o;
|
|
} else if (use_typed_arrays) {
|
|
var a = new Uint8Array(M);
|
|
if (a.set) a.set(b);else for (; i < b.length; ++i) {
|
|
a[i] = b[i];
|
|
}
|
|
return a;
|
|
}
|
|
b.length = M;
|
|
return b;
|
|
}
|
|
|
|
/* zero-filled arrays for older browsers */
|
|
function zero_fill_array(n) {
|
|
var o = new Array(n);
|
|
for (var i = 0; i < n; ++i) {
|
|
o[i] = 0;
|
|
}
|
|
return o;
|
|
}
|
|
var _deflate = function () {
|
|
var _deflateRaw = function () {
|
|
return function deflateRaw(data, out) {
|
|
var boff = 0;
|
|
while (boff < data.length) {
|
|
var L = Math.min(0xFFFF, data.length - boff);
|
|
var h = boff + L == data.length;
|
|
/* TODO: this is only type 0 stored */
|
|
out.write_shift(1, +h);
|
|
out.write_shift(2, L);
|
|
out.write_shift(2, ~L & 0xFFFF);
|
|
while (L-- > 0) {
|
|
out[out.l++] = data[boff++];
|
|
}
|
|
}
|
|
return out.l;
|
|
};
|
|
}();
|
|
return function (data) {
|
|
var buf = new_buf(50 + Math.floor(data.length * 1.1));
|
|
var off = _deflateRaw(data, buf);
|
|
return buf.slice(0, off);
|
|
};
|
|
}();
|
|
/* modified inflate function also moves original read head */
|
|
|
|
/* build tree (used for literals and lengths) */
|
|
function build_tree(clens, cmap, MAX) {
|
|
var maxlen = 1,
|
|
w = 0,
|
|
i = 0,
|
|
j = 0,
|
|
ccode = 0,
|
|
L = clens.length;
|
|
var bl_count = use_typed_arrays ? new Uint16Array(32) : zero_fill_array(32);
|
|
for (i = 0; i < 32; ++i) {
|
|
bl_count[i] = 0;
|
|
}
|
|
for (i = L; i < MAX; ++i) {
|
|
clens[i] = 0;
|
|
}
|
|
L = clens.length;
|
|
var ctree = use_typed_arrays ? new Uint16Array(L) : zero_fill_array(L); // []
|
|
|
|
/* build code tree */
|
|
for (i = 0; i < L; ++i) {
|
|
bl_count[w = clens[i]]++;
|
|
if (maxlen < w) maxlen = w;
|
|
ctree[i] = 0;
|
|
}
|
|
bl_count[0] = 0;
|
|
for (i = 1; i <= maxlen; ++i) {
|
|
bl_count[i + 16] = ccode = ccode + bl_count[i - 1] << 1;
|
|
}
|
|
for (i = 0; i < L; ++i) {
|
|
ccode = clens[i];
|
|
if (ccode != 0) ctree[i] = bl_count[ccode + 16]++;
|
|
}
|
|
|
|
/* cmap[maxlen + 4 bits] = (off&15) + (lit<<4) reverse mapping */
|
|
var cleni = 0;
|
|
for (i = 0; i < L; ++i) {
|
|
cleni = clens[i];
|
|
if (cleni != 0) {
|
|
ccode = bit_swap_n(ctree[i], maxlen) >> maxlen - cleni;
|
|
for (j = (1 << maxlen + 4 - cleni) - 1; j >= 0; --j) {
|
|
cmap[ccode | j << cleni] = cleni & 15 | i << 4;
|
|
}
|
|
}
|
|
}
|
|
return maxlen;
|
|
}
|
|
var fix_lmap = use_typed_arrays ? new Uint16Array(512) : zero_fill_array(512);
|
|
var fix_dmap = use_typed_arrays ? new Uint16Array(32) : zero_fill_array(32);
|
|
if (!use_typed_arrays) {
|
|
for (var i = 0; i < 512; ++i) {
|
|
fix_lmap[i] = 0;
|
|
}
|
|
for (i = 0; i < 32; ++i) {
|
|
fix_dmap[i] = 0;
|
|
}
|
|
}
|
|
(function () {
|
|
var dlens = [];
|
|
var i = 0;
|
|
for (; i < 32; i++) {
|
|
dlens.push(5);
|
|
}
|
|
build_tree(dlens, fix_dmap, 32);
|
|
var clens = [];
|
|
i = 0;
|
|
for (; i <= 143; i++) {
|
|
clens.push(8);
|
|
}
|
|
for (; i <= 255; i++) {
|
|
clens.push(9);
|
|
}
|
|
for (; i <= 279; i++) {
|
|
clens.push(7);
|
|
}
|
|
for (; i <= 287; i++) {
|
|
clens.push(8);
|
|
}
|
|
build_tree(clens, fix_lmap, 288);
|
|
})();
|
|
var dyn_lmap = use_typed_arrays ? new Uint16Array(32768) : zero_fill_array(32768);
|
|
var dyn_dmap = use_typed_arrays ? new Uint16Array(32768) : zero_fill_array(32768);
|
|
var dyn_cmap = use_typed_arrays ? new Uint16Array(128) : zero_fill_array(128);
|
|
var dyn_len_1 = 1,
|
|
dyn_len_2 = 1;
|
|
|
|
/* 5.5.3 Expanding Huffman Codes */
|
|
function dyn(data, boff) {
|
|
/* nomenclature from RFC1951 refers to bit values; these are offset by the implicit constant */
|
|
var _HLIT = read_bits_5(data, boff) + 257;
|
|
boff += 5;
|
|
var _HDIST = read_bits_5(data, boff) + 1;
|
|
boff += 5;
|
|
var _HCLEN = read_bits_4(data, boff) + 4;
|
|
boff += 4;
|
|
var w = 0;
|
|
|
|
/* grab and store code lengths */
|
|
var clens = use_typed_arrays ? new Uint8Array(19) : zero_fill_array(19);
|
|
var ctree = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
|
var maxlen = 1;
|
|
var bl_count = use_typed_arrays ? new Uint8Array(8) : zero_fill_array(8);
|
|
var next_code = use_typed_arrays ? new Uint8Array(8) : zero_fill_array(8);
|
|
var L = clens.length; /* 19 */
|
|
for (var i = 0; i < _HCLEN; ++i) {
|
|
clens[CLEN_ORDER[i]] = w = read_bits_3(data, boff);
|
|
if (maxlen < w) maxlen = w;
|
|
bl_count[w]++;
|
|
boff += 3;
|
|
}
|
|
|
|
/* build code tree */
|
|
var ccode = 0;
|
|
bl_count[0] = 0;
|
|
for (i = 1; i <= maxlen; ++i) {
|
|
next_code[i] = ccode = ccode + bl_count[i - 1] << 1;
|
|
}
|
|
for (i = 0; i < L; ++i) {
|
|
if ((ccode = clens[i]) != 0) ctree[i] = next_code[ccode]++;
|
|
}
|
|
/* cmap[7 bits from stream] = (off&7) + (lit<<3) */
|
|
var cleni = 0;
|
|
for (i = 0; i < L; ++i) {
|
|
cleni = clens[i];
|
|
if (cleni != 0) {
|
|
ccode = bitswap8[ctree[i]] >> 8 - cleni;
|
|
for (var j = (1 << 7 - cleni) - 1; j >= 0; --j) {
|
|
dyn_cmap[ccode | j << cleni] = cleni & 7 | i << 3;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* read literal and dist codes at once */
|
|
var hcodes = [];
|
|
maxlen = 1;
|
|
for (; hcodes.length < _HLIT + _HDIST;) {
|
|
ccode = dyn_cmap[read_bits_7(data, boff)];
|
|
boff += ccode & 7;
|
|
switch (ccode >>>= 3) {
|
|
case 16:
|
|
w = 3 + read_bits_2(data, boff);
|
|
boff += 2;
|
|
ccode = hcodes[hcodes.length - 1];
|
|
while (w-- > 0) {
|
|
hcodes.push(ccode);
|
|
}
|
|
break;
|
|
case 17:
|
|
w = 3 + read_bits_3(data, boff);
|
|
boff += 3;
|
|
while (w-- > 0) {
|
|
hcodes.push(0);
|
|
}
|
|
break;
|
|
case 18:
|
|
w = 11 + read_bits_7(data, boff);
|
|
boff += 7;
|
|
while (w-- > 0) {
|
|
hcodes.push(0);
|
|
}
|
|
break;
|
|
default:
|
|
hcodes.push(ccode);
|
|
if (maxlen < ccode) maxlen = ccode;
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* build literal / length trees */
|
|
var h1 = hcodes.slice(0, _HLIT),
|
|
h2 = hcodes.slice(_HLIT);
|
|
for (i = _HLIT; i < 286; ++i) {
|
|
h1[i] = 0;
|
|
}
|
|
for (i = _HDIST; i < 30; ++i) {
|
|
h2[i] = 0;
|
|
}
|
|
dyn_len_1 = build_tree(h1, dyn_lmap, 286);
|
|
dyn_len_2 = build_tree(h2, dyn_dmap, 30);
|
|
return boff;
|
|
}
|
|
|
|
/* return [ data, bytesRead ] */
|
|
function inflate(data, usz) {
|
|
/* shortcircuit for empty buffer [0x03, 0x00] */
|
|
if (data[0] == 3 && !(data[1] & 0x3)) {
|
|
return [new_raw_buf(usz), 2];
|
|
}
|
|
|
|
/* bit offset */
|
|
var boff = 0;
|
|
|
|
/* header includes final bit and type bits */
|
|
var header = 0;
|
|
var outbuf = new_unsafe_buf(usz ? usz : 1 << 18);
|
|
var woff = 0;
|
|
var OL = outbuf.length >>> 0;
|
|
var max_len_1 = 0,
|
|
max_len_2 = 0;
|
|
while ((header & 1) == 0) {
|
|
header = read_bits_3(data, boff);
|
|
boff += 3;
|
|
if (header >>> 1 == 0) {
|
|
/* Stored block */
|
|
if (boff & 7) boff += 8 - (boff & 7);
|
|
/* 2 bytes sz, 2 bytes bit inverse */
|
|
var sz = data[boff >>> 3] | data[(boff >>> 3) + 1] << 8;
|
|
boff += 32;
|
|
/* push sz bytes */
|
|
if (!usz && OL < woff + sz) {
|
|
outbuf = realloc(outbuf, woff + sz);
|
|
OL = outbuf.length;
|
|
}
|
|
if (typeof data.copy === 'function') {
|
|
// $FlowIgnore
|
|
data.copy(outbuf, woff, boff >>> 3, (boff >>> 3) + sz);
|
|
woff += sz;
|
|
boff += 8 * sz;
|
|
} else while (sz-- > 0) {
|
|
outbuf[woff++] = data[boff >>> 3];
|
|
boff += 8;
|
|
}
|
|
continue;
|
|
} else if (header >>> 1 == 1) {
|
|
/* Fixed Huffman */
|
|
max_len_1 = 9;
|
|
max_len_2 = 5;
|
|
} else {
|
|
/* Dynamic Huffman */
|
|
boff = dyn(data, boff);
|
|
max_len_1 = dyn_len_1;
|
|
max_len_2 = dyn_len_2;
|
|
}
|
|
if (!usz && OL < woff + 32767) {
|
|
outbuf = realloc(outbuf, woff + 32767);
|
|
OL = outbuf.length;
|
|
}
|
|
for (;;) {
|
|
// while(true) is apparently out of vogue in modern JS circles
|
|
/* ingest code and move read head */
|
|
var bits = read_bits_n(data, boff, max_len_1);
|
|
var code = header >>> 1 == 1 ? fix_lmap[bits] : dyn_lmap[bits];
|
|
boff += code & 15;
|
|
code >>>= 4;
|
|
/* 0-255 are literals, 256 is end of block token, 257+ are copy tokens */
|
|
if ((code >>> 8 & 0xFF) === 0) outbuf[woff++] = code;else if (code == 256) break;else {
|
|
code -= 257;
|
|
var len_eb = code < 8 ? 0 : code - 4 >> 2;
|
|
if (len_eb > 5) len_eb = 0;
|
|
var tgt = woff + LEN_LN[code];
|
|
/* length extra bits */
|
|
if (len_eb > 0) {
|
|
tgt += read_bits_n(data, boff, len_eb);
|
|
boff += len_eb;
|
|
}
|
|
|
|
/* dist code */
|
|
bits = read_bits_n(data, boff, max_len_2);
|
|
code = header >>> 1 == 1 ? fix_dmap[bits] : dyn_dmap[bits];
|
|
boff += code & 15;
|
|
code >>>= 4;
|
|
var dst_eb = code < 4 ? 0 : code - 2 >> 1;
|
|
var dst = DST_LN[code];
|
|
/* dist extra bits */
|
|
if (dst_eb > 0) {
|
|
dst += read_bits_n(data, boff, dst_eb);
|
|
boff += dst_eb;
|
|
}
|
|
|
|
/* in the common case, manual byte copy is faster than TA set / Buffer copy */
|
|
if (!usz && OL < tgt) {
|
|
outbuf = realloc(outbuf, tgt);
|
|
OL = outbuf.length;
|
|
}
|
|
while (woff < tgt) {
|
|
outbuf[woff] = outbuf[woff - dst];
|
|
++woff;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return [usz ? outbuf : outbuf.slice(0, woff), boff + 7 >>> 3];
|
|
}
|
|
function _inflate(payload, usz) {
|
|
var data = payload.slice(payload.l || 0);
|
|
var out = inflate(data, usz);
|
|
payload.l += out[1];
|
|
return out[0];
|
|
}
|
|
function warn_or_throw(wrn, msg) {
|
|
if (wrn) {
|
|
if (typeof console !== 'undefined') console.error(msg);
|
|
} else throw new Error(msg);
|
|
}
|
|
function parse_zip(file, options) {
|
|
var blob = file;
|
|
prep_blob(blob, 0);
|
|
var FileIndex = [],
|
|
FullPaths = [];
|
|
var o = {
|
|
FileIndex: FileIndex,
|
|
FullPaths: FullPaths
|
|
};
|
|
init_cfb(o, {
|
|
root: options.root
|
|
});
|
|
|
|
/* find end of central directory, start just after signature */
|
|
var i = blob.length - 4;
|
|
while ((blob[i] != 0x50 || blob[i + 1] != 0x4b || blob[i + 2] != 0x05 || blob[i + 3] != 0x06) && i >= 0) {
|
|
--i;
|
|
}
|
|
blob.l = i + 4;
|
|
|
|
/* parse end of central directory */
|
|
blob.l += 4;
|
|
var fcnt = blob.read_shift(2);
|
|
blob.l += 6;
|
|
var start_cd = blob.read_shift(4);
|
|
|
|
/* parse central directory */
|
|
blob.l = start_cd;
|
|
for (i = 0; i < fcnt; ++i) {
|
|
/* trust local file header instead of CD entry */
|
|
blob.l += 20;
|
|
var csz = blob.read_shift(4);
|
|
var usz = blob.read_shift(4);
|
|
var namelen = blob.read_shift(2);
|
|
var efsz = blob.read_shift(2);
|
|
var fcsz = blob.read_shift(2);
|
|
blob.l += 8;
|
|
var offset = blob.read_shift(4);
|
|
var EF = parse_extra_field(blob.slice(blob.l + namelen, blob.l + namelen + efsz));
|
|
blob.l += namelen + efsz + fcsz;
|
|
var L = blob.l;
|
|
blob.l = offset + 4;
|
|
parse_local_file(blob, csz, usz, o, EF);
|
|
blob.l = L;
|
|
}
|
|
return o;
|
|
}
|
|
|
|
/* head starts just after local file header signature */
|
|
function parse_local_file(blob, csz, usz, o, EF) {
|
|
/* [local file header] */
|
|
blob.l += 2;
|
|
var flags = blob.read_shift(2);
|
|
var meth = blob.read_shift(2);
|
|
var date = parse_dos_date(blob);
|
|
if (flags & 0x2041) throw new Error("Unsupported ZIP encryption");
|
|
var crc32 = blob.read_shift(4);
|
|
var _csz = blob.read_shift(4);
|
|
var _usz = blob.read_shift(4);
|
|
var namelen = blob.read_shift(2);
|
|
var efsz = blob.read_shift(2);
|
|
|
|
// TODO: flags & (1<<11) // UTF8
|
|
var name = "";
|
|
for (var i = 0; i < namelen; ++i) {
|
|
name += String.fromCharCode(blob[blob.l++]);
|
|
}
|
|
if (efsz) {
|
|
var ef = parse_extra_field(blob.slice(blob.l, blob.l + efsz));
|
|
if ((ef[0x5455] || {}).mt) date = ef[0x5455].mt;
|
|
if (((EF || {})[0x5455] || {}).mt) date = EF[0x5455].mt;
|
|
}
|
|
blob.l += efsz;
|
|
|
|
/* [encryption header] */
|
|
|
|
/* [file data] */
|
|
var data = blob.slice(blob.l, blob.l + _csz);
|
|
switch (meth) {
|
|
case 8:
|
|
data = _inflateRawSync(blob, _usz);
|
|
break;
|
|
case 0:
|
|
break;
|
|
default:
|
|
throw new Error("Unsupported ZIP Compression method " + meth);
|
|
}
|
|
|
|
/* [data descriptor] */
|
|
var wrn = false;
|
|
if (flags & 8) {
|
|
crc32 = blob.read_shift(4);
|
|
if (crc32 == 0x08074b50) {
|
|
crc32 = blob.read_shift(4);
|
|
wrn = true;
|
|
}
|
|
_csz = blob.read_shift(4);
|
|
_usz = blob.read_shift(4);
|
|
}
|
|
if (_csz != csz) warn_or_throw(wrn, "Bad compressed size: " + csz + " != " + _csz);
|
|
if (_usz != usz) warn_or_throw(wrn, "Bad uncompressed size: " + usz + " != " + _usz);
|
|
var _crc32 = CRC32.buf(data, 0);
|
|
if (crc32 >> 0 != _crc32 >> 0) warn_or_throw(wrn, "Bad CRC32 checksum: " + crc32 + " != " + _crc32);
|
|
cfb_add(o, name, data, {
|
|
unsafe: true,
|
|
mt: date
|
|
});
|
|
}
|
|
function write_zip(cfb, options) {
|
|
var _opts = options || {};
|
|
var out = [],
|
|
cdirs = [];
|
|
var o = new_buf(1);
|
|
var method = _opts.compression ? 8 : 0,
|
|
flags = 0;
|
|
var desc = false;
|
|
if (desc) flags |= 8;
|
|
var i = 0,
|
|
j = 0;
|
|
var start_cd = 0,
|
|
fcnt = 0;
|
|
var root = cfb.FullPaths[0],
|
|
fp = root,
|
|
fi = cfb.FileIndex[0];
|
|
var crcs = [];
|
|
var sz_cd = 0;
|
|
for (i = 1; i < cfb.FullPaths.length; ++i) {
|
|
fp = cfb.FullPaths[i].slice(root.length);
|
|
fi = cfb.FileIndex[i];
|
|
if (!fi.size || !fi.content || fp == "\x01Sh33tJ5") continue;
|
|
var start = start_cd;
|
|
|
|
/* TODO: CP437 filename */
|
|
var namebuf = new_buf(fp.length);
|
|
for (j = 0; j < fp.length; ++j) {
|
|
namebuf.write_shift(1, fp.charCodeAt(j) & 0x7F);
|
|
}
|
|
namebuf = namebuf.slice(0, namebuf.l);
|
|
crcs[fcnt] = CRC32.buf(fi.content, 0);
|
|
var outbuf = fi.content;
|
|
if (method == 8) outbuf = _deflateRawSync(outbuf);
|
|
|
|
/* local file header */
|
|
o = new_buf(30);
|
|
o.write_shift(4, 0x04034b50);
|
|
o.write_shift(2, 20);
|
|
o.write_shift(2, flags);
|
|
o.write_shift(2, method);
|
|
/* TODO: last mod file time/date */
|
|
if (fi.mt) write_dos_date(o, fi.mt);else o.write_shift(4, 0);
|
|
o.write_shift(-4, flags & 8 ? 0 : crcs[fcnt]);
|
|
o.write_shift(4, flags & 8 ? 0 : outbuf.length);
|
|
o.write_shift(4, flags & 8 ? 0 : fi.content.length);
|
|
o.write_shift(2, namebuf.length);
|
|
o.write_shift(2, 0);
|
|
start_cd += o.length;
|
|
out.push(o);
|
|
start_cd += namebuf.length;
|
|
out.push(namebuf);
|
|
|
|
/* TODO: encryption header ? */
|
|
start_cd += outbuf.length;
|
|
out.push(outbuf);
|
|
|
|
/* data descriptor */
|
|
if (flags & 8) {
|
|
o = new_buf(12);
|
|
o.write_shift(-4, crcs[fcnt]);
|
|
o.write_shift(4, outbuf.length);
|
|
o.write_shift(4, fi.content.length);
|
|
start_cd += o.l;
|
|
out.push(o);
|
|
}
|
|
|
|
/* central directory */
|
|
o = new_buf(46);
|
|
o.write_shift(4, 0x02014b50);
|
|
o.write_shift(2, 0);
|
|
o.write_shift(2, 20);
|
|
o.write_shift(2, flags);
|
|
o.write_shift(2, method);
|
|
o.write_shift(4, 0); /* TODO: last mod file time/date */
|
|
o.write_shift(-4, crcs[fcnt]);
|
|
o.write_shift(4, outbuf.length);
|
|
o.write_shift(4, fi.content.length);
|
|
o.write_shift(2, namebuf.length);
|
|
o.write_shift(2, 0);
|
|
o.write_shift(2, 0);
|
|
o.write_shift(2, 0);
|
|
o.write_shift(2, 0);
|
|
o.write_shift(4, 0);
|
|
o.write_shift(4, start);
|
|
sz_cd += o.l;
|
|
cdirs.push(o);
|
|
sz_cd += namebuf.length;
|
|
cdirs.push(namebuf);
|
|
++fcnt;
|
|
}
|
|
|
|
/* end of central directory */
|
|
o = new_buf(22);
|
|
o.write_shift(4, 0x06054b50);
|
|
o.write_shift(2, 0);
|
|
o.write_shift(2, 0);
|
|
o.write_shift(2, fcnt);
|
|
o.write_shift(2, fcnt);
|
|
o.write_shift(4, sz_cd);
|
|
o.write_shift(4, start_cd);
|
|
o.write_shift(2, 0);
|
|
return bconcat([bconcat(out), bconcat(cdirs), o]);
|
|
}
|
|
function cfb_new(opts) {
|
|
var o = {};
|
|
init_cfb(o, opts);
|
|
return o;
|
|
}
|
|
function cfb_add(cfb, name, content, opts) {
|
|
var unsafe = opts && opts.unsafe;
|
|
if (!unsafe) init_cfb(cfb);
|
|
var file = !unsafe && CFB.find(cfb, name);
|
|
if (!file) {
|
|
var fpath = cfb.FullPaths[0];
|
|
if (name.slice(0, fpath.length) == fpath) fpath = name;else {
|
|
if (fpath.slice(-1) != "/") fpath += "/";
|
|
fpath = (fpath + name).replace("//", "/");
|
|
}
|
|
file = {
|
|
name: filename(name),
|
|
type: 2
|
|
};
|
|
cfb.FileIndex.push(file);
|
|
cfb.FullPaths.push(fpath);
|
|
if (!unsafe) CFB.utils.cfb_gc(cfb);
|
|
}
|
|
file.content = content;
|
|
file.size = content ? content.length : 0;
|
|
if (opts) {
|
|
if (opts.CLSID) file.clsid = opts.CLSID;
|
|
if (opts.mt) file.mt = opts.mt;
|
|
if (opts.ct) file.ct = opts.ct;
|
|
}
|
|
return file;
|
|
}
|
|
function cfb_del(cfb, name) {
|
|
init_cfb(cfb);
|
|
var file = CFB.find(cfb, name);
|
|
if (file) for (var j = 0; j < cfb.FileIndex.length; ++j) {
|
|
if (cfb.FileIndex[j] == file) {
|
|
cfb.FileIndex.splice(j, 1);
|
|
cfb.FullPaths.splice(j, 1);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function cfb_mov(cfb, old_name, new_name) {
|
|
init_cfb(cfb);
|
|
var file = CFB.find(cfb, old_name);
|
|
if (file) for (var j = 0; j < cfb.FileIndex.length; ++j) {
|
|
if (cfb.FileIndex[j] == file) {
|
|
cfb.FileIndex[j].name = filename(new_name);
|
|
cfb.FullPaths[j] = new_name;
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function cfb_gc(cfb) {
|
|
rebuild_cfb(cfb, true);
|
|
}
|
|
exports.find = find;
|
|
exports.read = read;
|
|
exports.parse = parse;
|
|
exports.write = write;
|
|
exports.writeFile = write_file;
|
|
exports.utils = {
|
|
cfb_new: cfb_new,
|
|
cfb_add: cfb_add,
|
|
cfb_del: cfb_del,
|
|
cfb_mov: cfb_mov,
|
|
cfb_gc: cfb_gc,
|
|
ReadShift: ReadShift,
|
|
CheckField: CheckField,
|
|
prep_blob: prep_blob,
|
|
bconcat: bconcat,
|
|
use_zlib: use_zlib,
|
|
_deflateRaw: _deflate,
|
|
_inflateRaw: _inflate,
|
|
consts: consts
|
|
};
|
|
return exports;
|
|
}();
|
|
if ( true && typeof DO_NOT_EXPORT_CFB === 'undefined') {
|
|
module.exports = CFB;
|
|
}
|
|
var _fs;
|
|
if (true) try {
|
|
_fs = __webpack_require__(/*! fs */ 78);
|
|
} catch (e) {}
|
|
|
|
/* normalize data for blob ctor */
|
|
function blobify(data) {
|
|
if (typeof data === "string") return s2ab(data);
|
|
if (Array.isArray(data)) return a2u(data);
|
|
return data;
|
|
}
|
|
/* write or download file */
|
|
function write_dl(fname, payload, enc) {
|
|
/*global IE_SaveFile, Blob, navigator, saveAs, document, File, chrome */
|
|
if (typeof _fs !== 'undefined' && _fs.writeFileSync) return enc ? _fs.writeFileSync(fname, payload, enc) : _fs.writeFileSync(fname, payload);
|
|
var data = enc == "utf8" ? utf8write(payload) : payload;
|
|
if (typeof IE_SaveFile !== 'undefined') return IE_SaveFile(data, fname);
|
|
if (typeof Blob !== 'undefined') {
|
|
var blob = new Blob([blobify(data)], {
|
|
type: "application/octet-stream"
|
|
});
|
|
if (typeof navigator !== 'undefined' && navigator.msSaveBlob) return navigator.msSaveBlob(blob, fname);
|
|
if (typeof saveAs !== 'undefined') return saveAs(blob, fname);
|
|
if (typeof URL !== 'undefined' && typeof document !== 'undefined' && document.createElement && URL.createObjectURL) {
|
|
var url = URL.createObjectURL(blob);
|
|
if ((typeof chrome === "undefined" ? "undefined" : _typeof(chrome)) === 'object' && typeof (chrome.downloads || {}).download == "function") {
|
|
if (URL.revokeObjectURL && typeof setTimeout !== 'undefined') setTimeout(function () {
|
|
URL.revokeObjectURL(url);
|
|
}, 60000);
|
|
return chrome.downloads.download({
|
|
url: url,
|
|
filename: fname,
|
|
saveAs: true
|
|
});
|
|
}
|
|
var a = document.createElement("a");
|
|
if (a.download != null) {
|
|
a.download = fname;
|
|
a.href = url;
|
|
document.body.appendChild(a);
|
|
a.click();
|
|
document.body.removeChild(a);
|
|
if (URL.revokeObjectURL && typeof setTimeout !== 'undefined') setTimeout(function () {
|
|
URL.revokeObjectURL(url);
|
|
}, 60000);
|
|
return url;
|
|
}
|
|
}
|
|
}
|
|
// $FlowIgnore
|
|
if (typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try {
|
|
// extendscript
|
|
// $FlowIgnore
|
|
var out = File(fname);
|
|
out.open("w");
|
|
out.encoding = "binary";
|
|
if (Array.isArray(payload)) payload = a2s(payload);
|
|
out.write(payload);
|
|
out.close();
|
|
return payload;
|
|
} catch (e) {
|
|
if (!e.message || !e.message.match(/onstruct/)) throw e;
|
|
}
|
|
throw new Error("cannot save file " + fname);
|
|
}
|
|
|
|
/* read binary data from file */
|
|
function read_binary(path) {
|
|
if (typeof _fs !== 'undefined') return _fs.readFileSync(path);
|
|
// $FlowIgnore
|
|
if (typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try {
|
|
// extendscript
|
|
// $FlowIgnore
|
|
var infile = File(path);
|
|
infile.open("r");
|
|
infile.encoding = "binary";
|
|
var data = infile.read();
|
|
infile.close();
|
|
return data;
|
|
} catch (e) {
|
|
if (!e.message || !e.message.match(/onstruct/)) throw e;
|
|
}
|
|
throw new Error("Cannot access file " + path);
|
|
}
|
|
function keys(o) {
|
|
var ks = Object.keys(o),
|
|
o2 = [];
|
|
for (var i = 0; i < ks.length; ++i) {
|
|
if (Object.prototype.hasOwnProperty.call(o, ks[i])) o2.push(ks[i]);
|
|
}
|
|
return o2;
|
|
}
|
|
function evert_key(obj, key) {
|
|
var o = [],
|
|
K = keys(obj);
|
|
for (var i = 0; i !== K.length; ++i) {
|
|
if (o[obj[K[i]][key]] == null) o[obj[K[i]][key]] = K[i];
|
|
}
|
|
return o;
|
|
}
|
|
function evert(obj) {
|
|
var o = [],
|
|
K = keys(obj);
|
|
for (var i = 0; i !== K.length; ++i) {
|
|
o[obj[K[i]]] = K[i];
|
|
}
|
|
return o;
|
|
}
|
|
function evert_num(obj) {
|
|
var o = [],
|
|
K = keys(obj);
|
|
for (var i = 0; i !== K.length; ++i) {
|
|
o[obj[K[i]]] = parseInt(K[i], 10);
|
|
}
|
|
return o;
|
|
}
|
|
function evert_arr(obj) {
|
|
var o = [],
|
|
K = keys(obj);
|
|
for (var i = 0; i !== K.length; ++i) {
|
|
if (o[obj[K[i]]] == null) o[obj[K[i]]] = [];
|
|
o[obj[K[i]]].push(K[i]);
|
|
}
|
|
return o;
|
|
}
|
|
var basedate = new Date(1899, 11, 30, 0, 0, 0); // 2209161600000
|
|
function datenum(v, date1904) {
|
|
var epoch = v.getTime();
|
|
if (date1904) epoch -= 1462 * 24 * 60 * 60 * 1000;
|
|
var dnthresh = basedate.getTime() + (v.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000;
|
|
return (epoch - dnthresh) / (24 * 60 * 60 * 1000);
|
|
}
|
|
var refdate = new Date();
|
|
var dnthresh = basedate.getTime() + (refdate.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000;
|
|
var refoffset = refdate.getTimezoneOffset();
|
|
function numdate(v) {
|
|
var out = new Date();
|
|
out.setTime(v * 24 * 60 * 60 * 1000 + dnthresh);
|
|
if (out.getTimezoneOffset() !== refoffset) {
|
|
out.setTime(out.getTime() + (out.getTimezoneOffset() - refoffset) * 60000);
|
|
}
|
|
return out;
|
|
}
|
|
|
|
/* ISO 8601 Duration */
|
|
function parse_isodur(s) {
|
|
var sec = 0,
|
|
mt = 0,
|
|
time = false;
|
|
var m = s.match(/P([0-9\.]+Y)?([0-9\.]+M)?([0-9\.]+D)?T([0-9\.]+H)?([0-9\.]+M)?([0-9\.]+S)?/);
|
|
if (!m) throw new Error("|" + s + "| is not an ISO8601 Duration");
|
|
for (var i = 1; i != m.length; ++i) {
|
|
if (!m[i]) continue;
|
|
mt = 1;
|
|
if (i > 3) time = true;
|
|
switch (m[i].slice(m[i].length - 1)) {
|
|
case 'Y':
|
|
throw new Error("Unsupported ISO Duration Field: " + m[i].slice(m[i].length - 1));
|
|
case 'D':
|
|
mt *= 24;
|
|
/* falls through */
|
|
case 'H':
|
|
mt *= 60;
|
|
/* falls through */
|
|
case 'M':
|
|
if (!time) throw new Error("Unsupported ISO Duration Field: M");else mt *= 60;
|
|
/* falls through */
|
|
case 'S':
|
|
break;
|
|
}
|
|
sec += mt * parseInt(m[i], 10);
|
|
}
|
|
return sec;
|
|
}
|
|
var good_pd_date = new Date('2017-02-19T19:06:09.000Z');
|
|
if (isNaN(good_pd_date.getFullYear())) good_pd_date = new Date('2/19/17');
|
|
var good_pd = good_pd_date.getFullYear() == 2017;
|
|
/* parses a date as a local date */
|
|
function parseDate(str, fixdate) {
|
|
var d = new Date(str);
|
|
if (good_pd) {
|
|
if (fixdate > 0) d.setTime(d.getTime() + d.getTimezoneOffset() * 60 * 1000);else if (fixdate < 0) d.setTime(d.getTime() - d.getTimezoneOffset() * 60 * 1000);
|
|
return d;
|
|
}
|
|
if (str instanceof Date) return str;
|
|
if (good_pd_date.getFullYear() == 1917 && !isNaN(d.getFullYear())) {
|
|
var s = d.getFullYear();
|
|
if (str.indexOf("" + s) > -1) return d;
|
|
d.setFullYear(d.getFullYear() + 100);
|
|
return d;
|
|
}
|
|
var n = str.match(/\d+/g) || ["2017", "2", "19", "0", "0", "0"];
|
|
var out = new Date(+n[0], +n[1] - 1, +n[2], +n[3] || 0, +n[4] || 0, +n[5] || 0);
|
|
if (str.indexOf("Z") > -1) out = new Date(out.getTime() - out.getTimezoneOffset() * 60 * 1000);
|
|
return out;
|
|
}
|
|
function cc2str(arr) {
|
|
var o = "";
|
|
for (var i = 0; i != arr.length; ++i) {
|
|
o += String.fromCharCode(arr[i]);
|
|
}
|
|
return o;
|
|
}
|
|
function dup(o) {
|
|
if (typeof JSON != 'undefined' && !Array.isArray(o)) return JSON.parse(JSON.stringify(o));
|
|
if (_typeof(o) != 'object' || o == null) return o;
|
|
if (o instanceof Date) return new Date(o.getTime());
|
|
var out = {};
|
|
for (var k in o) {
|
|
if (Object.prototype.hasOwnProperty.call(o, k)) out[k] = dup(o[k]);
|
|
}
|
|
return out;
|
|
}
|
|
function fill(c, l) {
|
|
var o = "";
|
|
while (o.length < l) {
|
|
o += c;
|
|
}
|
|
return o;
|
|
}
|
|
|
|
/* TODO: stress test */
|
|
function fuzzynum(s) {
|
|
var v = Number(s);
|
|
if (isFinite(v)) return v;
|
|
if (!isNaN(v)) return NaN;
|
|
if (!/\d/.test(s)) return v;
|
|
var wt = 1;
|
|
var ss = s.replace(/([\d]),([\d])/g, "$1$2").replace(/[$]/g, "").replace(/[%]/g, function () {
|
|
wt *= 100;
|
|
return "";
|
|
});
|
|
if (!isNaN(v = Number(ss))) return v / wt;
|
|
ss = ss.replace(/[(](.*)[)]/, function ($$, $1) {
|
|
wt = -wt;
|
|
return $1;
|
|
});
|
|
if (!isNaN(v = Number(ss))) return v / wt;
|
|
return v;
|
|
}
|
|
function fuzzydate(s) {
|
|
var o = new Date(s),
|
|
n = new Date(NaN);
|
|
var y = o.getYear(),
|
|
m = o.getMonth(),
|
|
d = o.getDate();
|
|
if (isNaN(d)) return n;
|
|
if (y < 0 || y > 8099) return n;
|
|
if ((m > 0 || d > 1) && y != 101) return o;
|
|
if (s.toLowerCase().match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/)) return o;
|
|
if (s.match(/[^-0-9:,\/\\]/)) return n;
|
|
return o;
|
|
}
|
|
var safe_split_regex = "abacaba".split(/(:?b)/i).length == 5;
|
|
function split_regex(str, re, def) {
|
|
if (safe_split_regex || typeof re == "string") return str.split(re);
|
|
var p = str.split(re),
|
|
o = [p[0]];
|
|
for (var i = 1; i < p.length; ++i) {
|
|
o.push(def);
|
|
o.push(p[i]);
|
|
}
|
|
return o;
|
|
}
|
|
function getdatastr(data) {
|
|
if (!data) return null;
|
|
if (data.data) return debom(data.data);
|
|
if (data.asNodeBuffer && has_buf) return debom(data.asNodeBuffer().toString('binary'));
|
|
if (data.asBinary) return debom(data.asBinary());
|
|
if (data._data && data._data.getContent) return debom(cc2str(Array.prototype.slice.call(data._data.getContent(), 0)));
|
|
if (data.content && data.type) return debom(cc2str(data.content));
|
|
return null;
|
|
}
|
|
function getdatabin(data) {
|
|
if (!data) return null;
|
|
if (data.data) return char_codes(data.data);
|
|
if (data.asNodeBuffer && has_buf) return data.asNodeBuffer();
|
|
if (data._data && data._data.getContent) {
|
|
var o = data._data.getContent();
|
|
if (typeof o == "string") return char_codes(o);
|
|
return Array.prototype.slice.call(o);
|
|
}
|
|
if (data.content && data.type) return data.content;
|
|
return null;
|
|
}
|
|
function getdata(data) {
|
|
return data && data.name.slice(-4) === ".bin" ? getdatabin(data) : getdatastr(data);
|
|
}
|
|
|
|
/* Part 2 Section 10.1.2 "Mapping Content Types" Names are case-insensitive */
|
|
/* OASIS does not comment on filename case sensitivity */
|
|
function safegetzipfile(zip, file) {
|
|
var k = zip.FullPaths || keys(zip.files);
|
|
var f = file.toLowerCase().replace(/[\/]/g, '\\'),
|
|
g = f.replace(/\\/g, '\/');
|
|
for (var i = 0; i < k.length; ++i) {
|
|
var n = k[i].replace(/^Root Entry[\/]/, "").toLowerCase();
|
|
if (f == n || g == n) return zip.files ? zip.files[k[i]] : zip.FileIndex[i];
|
|
}
|
|
return null;
|
|
}
|
|
function getzipfile(zip, file) {
|
|
var o = safegetzipfile(zip, file);
|
|
if (o == null) throw new Error("Cannot find file " + file + " in zip");
|
|
return o;
|
|
}
|
|
function getzipdata(zip, file, safe) {
|
|
if (!safe) return getdata(getzipfile(zip, file));
|
|
if (!file) return null;
|
|
try {
|
|
return getzipdata(zip, file);
|
|
} catch (e) {
|
|
return null;
|
|
}
|
|
}
|
|
function getzipstr(zip, file, safe) {
|
|
if (!safe) return getdatastr(getzipfile(zip, file));
|
|
if (!file) return null;
|
|
try {
|
|
return getzipstr(zip, file);
|
|
} catch (e) {
|
|
return null;
|
|
}
|
|
}
|
|
function zipentries(zip) {
|
|
var k = zip.FullPaths || keys(zip.files),
|
|
o = [];
|
|
for (var i = 0; i < k.length; ++i) {
|
|
if (k[i].slice(-1) != '/') o.push(k[i].replace(/^Root Entry[\/]/, ""));
|
|
}
|
|
return o.sort();
|
|
}
|
|
function zip_add_file(zip, path, content) {
|
|
if (zip.FullPaths) CFB.utils.cfb_add(zip, path, typeof content == "string" ? has_buf ? Buffer_from(content) : s2a(utf8write(content)) : content);else zip.file(path, content);
|
|
}
|
|
var jszip;
|
|
function zip_new() {
|
|
return CFB.utils.cfb_new();
|
|
}
|
|
function zip_read(d, o) {
|
|
var zip;
|
|
switch (o.type) {
|
|
case "base64":
|
|
zip = CFB.read(d, {
|
|
type: "base64"
|
|
});
|
|
break;
|
|
case "binary":
|
|
zip = CFB.read(d, {
|
|
type: "binary"
|
|
});
|
|
break;
|
|
case "buffer":
|
|
case "array":
|
|
zip = CFB.read(d, {
|
|
type: "buffer"
|
|
});
|
|
break;
|
|
default:
|
|
throw new Error("Unrecognized type " + o.type);
|
|
}
|
|
return zip;
|
|
}
|
|
function resolve_path(path, base) {
|
|
if (path.charAt(0) == "/") return path.slice(1);
|
|
var result = base.split('/');
|
|
if (base.slice(-1) != "/") result.pop(); // folder path
|
|
var target = path.split('/');
|
|
while (target.length !== 0) {
|
|
var step = target.shift();
|
|
if (step === '..') result.pop();else if (step !== '.') result.push(step);
|
|
}
|
|
return result.join('/');
|
|
}
|
|
var XML_HEADER = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n';
|
|
var attregexg = /([^"\s?>\/]+)\s*=\s*((?:")([^"]*)(?:")|(?:')([^']*)(?:')|([^'">\s]+))/g;
|
|
var tagregex = /<[\/\?]?[a-zA-Z0-9:_-]+(?:\s+[^"\s?>\/]+\s*=\s*(?:"[^"]*"|'[^']*'|[^'">\s=]+))*\s*[\/\?]?>/mg;
|
|
if (!XML_HEADER.match(tagregex)) tagregex = /<[^>]*>/g;
|
|
var nsregex = /<\w*:/,
|
|
nsregex2 = /<(\/?)\w+:/;
|
|
function parsexmltag(tag, skip_root, skip_LC) {
|
|
var z = {};
|
|
var eq = 0,
|
|
c = 0;
|
|
for (; eq !== tag.length; ++eq) {
|
|
if ((c = tag.charCodeAt(eq)) === 32 || c === 10 || c === 13) break;
|
|
}
|
|
if (!skip_root) z[0] = tag.slice(0, eq);
|
|
if (eq === tag.length) return z;
|
|
var m = tag.match(attregexg),
|
|
j = 0,
|
|
v = "",
|
|
i = 0,
|
|
q = "",
|
|
cc = "",
|
|
quot = 1;
|
|
if (m) for (i = 0; i != m.length; ++i) {
|
|
cc = m[i];
|
|
for (c = 0; c != cc.length; ++c) {
|
|
if (cc.charCodeAt(c) === 61) break;
|
|
}
|
|
q = cc.slice(0, c).trim();
|
|
while (cc.charCodeAt(c + 1) == 32) {
|
|
++c;
|
|
}
|
|
quot = (eq = cc.charCodeAt(c + 1)) == 34 || eq == 39 ? 1 : 0;
|
|
v = cc.slice(c + 1 + quot, cc.length - quot);
|
|
for (j = 0; j != q.length; ++j) {
|
|
if (q.charCodeAt(j) === 58) break;
|
|
}
|
|
if (j === q.length) {
|
|
if (q.indexOf("_") > 0) q = q.slice(0, q.indexOf("_")); // from ods
|
|
z[q] = v;
|
|
if (!skip_LC) z[q.toLowerCase()] = v;
|
|
} else {
|
|
var k = (j === 5 && q.slice(0, 5) === "xmlns" ? "xmlns" : "") + q.slice(j + 1);
|
|
if (z[k] && q.slice(j - 3, j) == "ext") continue; // from ods
|
|
z[k] = v;
|
|
if (!skip_LC) z[k.toLowerCase()] = v;
|
|
}
|
|
}
|
|
return z;
|
|
}
|
|
function strip_ns(x) {
|
|
return x.replace(nsregex2, "<$1");
|
|
}
|
|
var encodings = {
|
|
'"': '"',
|
|
''': "'",
|
|
'>': '>',
|
|
'<': '<',
|
|
'&': '&'
|
|
};
|
|
var rencoding = evert(encodings);
|
|
//var rencstr = "&<>'\"".split("");
|
|
|
|
// TODO: CP remap (need to read file version to determine OS)
|
|
var unescapexml = function () {
|
|
/* 22.4.2.4 bstr (Basic String) */
|
|
var encregex = /&(?:quot|apos|gt|lt|amp|#x?([\da-fA-F]+));/ig,
|
|
coderegex = /_x([\da-fA-F]{4})_/ig;
|
|
return function unescapexml(text) {
|
|
var s = text + '',
|
|
i = s.indexOf("<![CDATA[");
|
|
if (i == -1) return s.replace(encregex, function ($$, $1) {
|
|
return encodings[$$] || String.fromCharCode(parseInt($1, $$.indexOf("x") > -1 ? 16 : 10)) || $$;
|
|
}).replace(coderegex, function (m, c) {
|
|
return String.fromCharCode(parseInt(c, 16));
|
|
});
|
|
var j = s.indexOf("]]>");
|
|
return unescapexml(s.slice(0, i)) + s.slice(i + 9, j) + unescapexml(s.slice(j + 3));
|
|
};
|
|
}();
|
|
var decregex = /[&<>'"]/g,
|
|
charegex = /[\u0000-\u0008\u000b-\u001f]/g;
|
|
function escapexml(text) {
|
|
var s = text + '';
|
|
return s.replace(decregex, function (y) {
|
|
return rencoding[y];
|
|
}).replace(charegex, function (s) {
|
|
return "_x" + ("000" + s.charCodeAt(0).toString(16)).slice(-4) + "_";
|
|
});
|
|
}
|
|
function escapexmltag(text) {
|
|
return escapexml(text).replace(/ /g, "_x0020_");
|
|
}
|
|
var htmlcharegex = /[\u0000-\u001f]/g;
|
|
function escapehtml(text) {
|
|
var s = text + '';
|
|
return s.replace(decregex, function (y) {
|
|
return rencoding[y];
|
|
}).replace(/\n/g, "<br/>").replace(htmlcharegex, function (s) {
|
|
return "&#x" + ("000" + s.charCodeAt(0).toString(16)).slice(-4) + ";";
|
|
});
|
|
}
|
|
function escapexlml(text) {
|
|
var s = text + '';
|
|
return s.replace(decregex, function (y) {
|
|
return rencoding[y];
|
|
}).replace(htmlcharegex, function (s) {
|
|
return "&#x" + s.charCodeAt(0).toString(16).toUpperCase() + ";";
|
|
});
|
|
}
|
|
|
|
/* TODO: handle codepages */
|
|
var xlml_fixstr = function () {
|
|
var entregex = /&#(\d+);/g;
|
|
function entrepl($$, $1) {
|
|
return String.fromCharCode(parseInt($1, 10));
|
|
}
|
|
return function xlml_fixstr(str) {
|
|
return str.replace(entregex, entrepl);
|
|
};
|
|
}();
|
|
var xlml_unfixstr = function () {
|
|
return function xlml_unfixstr(str) {
|
|
return str.replace(/(\r\n|[\r\n])/g, "\ ");
|
|
};
|
|
}();
|
|
function parsexmlbool(value) {
|
|
switch (value) {
|
|
case 1:
|
|
case true:
|
|
case '1':
|
|
case 'true':
|
|
case 'TRUE':
|
|
return true;
|
|
/* case '0': case 'false': case 'FALSE':*/
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
var utf8read = function utf8reada(orig) {
|
|
var out = "",
|
|
i = 0,
|
|
c = 0,
|
|
d = 0,
|
|
e = 0,
|
|
f = 0,
|
|
w = 0;
|
|
while (i < orig.length) {
|
|
c = orig.charCodeAt(i++);
|
|
if (c < 128) {
|
|
out += String.fromCharCode(c);
|
|
continue;
|
|
}
|
|
d = orig.charCodeAt(i++);
|
|
if (c > 191 && c < 224) {
|
|
f = (c & 31) << 6;
|
|
f |= d & 63;
|
|
out += String.fromCharCode(f);
|
|
continue;
|
|
}
|
|
e = orig.charCodeAt(i++);
|
|
if (c < 240) {
|
|
out += String.fromCharCode((c & 15) << 12 | (d & 63) << 6 | e & 63);
|
|
continue;
|
|
}
|
|
f = orig.charCodeAt(i++);
|
|
w = ((c & 7) << 18 | (d & 63) << 12 | (e & 63) << 6 | f & 63) - 65536;
|
|
out += String.fromCharCode(0xD800 + (w >>> 10 & 1023));
|
|
out += String.fromCharCode(0xDC00 + (w & 1023));
|
|
}
|
|
return out;
|
|
};
|
|
var utf8write = function utf8write(orig) {
|
|
var out = [],
|
|
i = 0,
|
|
c = 0,
|
|
d = 0;
|
|
while (i < orig.length) {
|
|
c = orig.charCodeAt(i++);
|
|
switch (true) {
|
|
case c < 128:
|
|
out.push(String.fromCharCode(c));
|
|
break;
|
|
case c < 2048:
|
|
out.push(String.fromCharCode(192 + (c >> 6)));
|
|
out.push(String.fromCharCode(128 + (c & 63)));
|
|
break;
|
|
case c >= 55296 && c < 57344:
|
|
c -= 55296;
|
|
d = orig.charCodeAt(i++) - 56320 + (c << 10);
|
|
out.push(String.fromCharCode(240 + (d >> 18 & 7)));
|
|
out.push(String.fromCharCode(144 + (d >> 12 & 63)));
|
|
out.push(String.fromCharCode(128 + (d >> 6 & 63)));
|
|
out.push(String.fromCharCode(128 + (d & 63)));
|
|
break;
|
|
default:
|
|
out.push(String.fromCharCode(224 + (c >> 12)));
|
|
out.push(String.fromCharCode(128 + (c >> 6 & 63)));
|
|
out.push(String.fromCharCode(128 + (c & 63)));
|
|
}
|
|
}
|
|
return out.join("");
|
|
};
|
|
if (has_buf) {
|
|
var utf8readb = function utf8readb(data) {
|
|
var out = Buffer.alloc(2 * data.length),
|
|
w,
|
|
i,
|
|
j = 1,
|
|
k = 0,
|
|
ww = 0,
|
|
c;
|
|
for (i = 0; i < data.length; i += j) {
|
|
j = 1;
|
|
if ((c = data.charCodeAt(i)) < 128) w = c;else if (c < 224) {
|
|
w = (c & 31) * 64 + (data.charCodeAt(i + 1) & 63);
|
|
j = 2;
|
|
} else if (c < 240) {
|
|
w = (c & 15) * 4096 + (data.charCodeAt(i + 1) & 63) * 64 + (data.charCodeAt(i + 2) & 63);
|
|
j = 3;
|
|
} else {
|
|
j = 4;
|
|
w = (c & 7) * 262144 + (data.charCodeAt(i + 1) & 63) * 4096 + (data.charCodeAt(i + 2) & 63) * 64 + (data.charCodeAt(i + 3) & 63);
|
|
w -= 65536;
|
|
ww = 0xD800 + (w >>> 10 & 1023);
|
|
w = 0xDC00 + (w & 1023);
|
|
}
|
|
if (ww !== 0) {
|
|
out[k++] = ww & 255;
|
|
out[k++] = ww >>> 8;
|
|
ww = 0;
|
|
}
|
|
out[k++] = w % 256;
|
|
out[k++] = w >>> 8;
|
|
}
|
|
return out.slice(0, k).toString('ucs2');
|
|
};
|
|
var corpus = "foo bar baz\xE2\x98\x83\xF0\x9F\x8D\xA3";
|
|
if (utf8read(corpus) == utf8readb(corpus)) utf8read = utf8readb;
|
|
var utf8readc = function utf8readc(data) {
|
|
return Buffer_from(data, 'binary').toString('utf8');
|
|
};
|
|
if (utf8read(corpus) == utf8readc(corpus)) utf8read = utf8readc;
|
|
utf8write = function utf8write(data) {
|
|
return Buffer_from(data, 'utf8').toString("binary");
|
|
};
|
|
}
|
|
|
|
// matches <foo>...</foo> extracts content
|
|
var matchtag = function () {
|
|
var mtcache = {};
|
|
return function matchtag(f, g) {
|
|
var t = f + "|" + (g || "");
|
|
if (mtcache[t]) return mtcache[t];
|
|
return mtcache[t] = new RegExp('<(?:\\w+:)?' + f + '(?: xml:space="preserve")?(?:[^>]*)>([\\s\\S]*?)</(?:\\w+:)?' + f + '>', g || "");
|
|
};
|
|
}();
|
|
var htmldecode = function () {
|
|
var entities = [['nbsp', ' '], ['middot', '·'], ['quot', '"'], ['apos', "'"], ['gt', '>'], ['lt', '<'], ['amp', '&']].map(function (x) {
|
|
return [new RegExp('&' + x[0] + ';', "ig"), x[1]];
|
|
});
|
|
return function htmldecode(str) {
|
|
var o = str
|
|
// Remove new lines and spaces from start of content
|
|
.replace(/^[\t\n\r ]+/, "")
|
|
// Remove new lines and spaces from end of content
|
|
.replace(/[\t\n\r ]+$/, "")
|
|
// Added line which removes any white space characters after and before html tags
|
|
.replace(/>\s+/g, ">").replace(/\s+</g, "<")
|
|
// Replace remaining new lines and spaces with space
|
|
.replace(/[\t\n\r ]+/g, " ")
|
|
// Replace <br> tags with new lines
|
|
.replace(/<\s*[bB][rR]\s*\/?>/g, "\n")
|
|
// Strip HTML elements
|
|
.replace(/<[^>]*>/g, "");
|
|
for (var i = 0; i < entities.length; ++i) {
|
|
o = o.replace(entities[i][0], entities[i][1]);
|
|
}
|
|
return o;
|
|
};
|
|
}();
|
|
var vtregex = function () {
|
|
var vt_cache = {};
|
|
return function vt_regex(bt) {
|
|
if (vt_cache[bt] !== undefined) return vt_cache[bt];
|
|
return vt_cache[bt] = new RegExp("<(?:vt:)?" + bt + ">([\\s\\S]*?)</(?:vt:)?" + bt + ">", 'g');
|
|
};
|
|
}();
|
|
var vtvregex = /<\/?(?:vt:)?variant>/g,
|
|
vtmregex = /<(?:vt:)([^>]*)>([\s\S]*)</;
|
|
function parseVector(data, opts) {
|
|
var h = parsexmltag(data);
|
|
var matches = data.match(vtregex(h.baseType)) || [];
|
|
var res = [];
|
|
if (matches.length != h.size) {
|
|
if (opts.WTF) throw new Error("unexpected vector length " + matches.length + " != " + h.size);
|
|
return res;
|
|
}
|
|
matches.forEach(function (x) {
|
|
var v = x.replace(vtvregex, "").match(vtmregex);
|
|
if (v) res.push({
|
|
v: utf8read(v[2]),
|
|
t: v[1]
|
|
});
|
|
});
|
|
return res;
|
|
}
|
|
var wtregex = /(^\s|\s$|\n)/;
|
|
function writetag(f, g) {
|
|
return '<' + f + (g.match(wtregex) ? ' xml:space="preserve"' : "") + '>' + g + '</' + f + '>';
|
|
}
|
|
function wxt_helper(h) {
|
|
return keys(h).map(function (k) {
|
|
return " " + k + '="' + h[k] + '"';
|
|
}).join("");
|
|
}
|
|
function writextag(f, g, h) {
|
|
return '<' + f + (h != null ? wxt_helper(h) : "") + (g != null ? (g.match(wtregex) ? ' xml:space="preserve"' : "") + '>' + g + '</' + f : "/") + '>';
|
|
}
|
|
function write_w3cdtf(d, t) {
|
|
try {
|
|
return d.toISOString().replace(/\.\d*/, "");
|
|
} catch (e) {
|
|
if (t) throw e;
|
|
}
|
|
return "";
|
|
}
|
|
function write_vt(s, xlsx) {
|
|
switch (_typeof(s)) {
|
|
case 'string':
|
|
var o = writextag('vt:lpwstr', escapexml(s));
|
|
if (xlsx) o = o.replace(/"/g, "_x0022_");
|
|
return o;
|
|
case 'number':
|
|
return writextag((s | 0) == s ? 'vt:i4' : 'vt:r8', escapexml(String(s)));
|
|
case 'boolean':
|
|
return writextag('vt:bool', s ? 'true' : 'false');
|
|
}
|
|
if (s instanceof Date) return writextag('vt:filetime', write_w3cdtf(s));
|
|
throw new Error("Unable to serialize " + s);
|
|
}
|
|
var XMLNS = {
|
|
'dc': 'http://purl.org/dc/elements/1.1/',
|
|
'dcterms': 'http://purl.org/dc/terms/',
|
|
'dcmitype': 'http://purl.org/dc/dcmitype/',
|
|
'mx': 'http://schemas.microsoft.com/office/mac/excel/2008/main',
|
|
'r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
|
|
'sjs': 'http://schemas.openxmlformats.org/package/2006/sheetjs/core-properties',
|
|
'vt': 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes',
|
|
'xsi': 'http://www.w3.org/2001/XMLSchema-instance',
|
|
'xsd': 'http://www.w3.org/2001/XMLSchema'
|
|
};
|
|
XMLNS.main = ['http://schemas.openxmlformats.org/spreadsheetml/2006/main', 'http://purl.oclc.org/ooxml/spreadsheetml/main', 'http://schemas.microsoft.com/office/excel/2006/main', 'http://schemas.microsoft.com/office/excel/2006/2'];
|
|
var XLMLNS = {
|
|
'o': 'urn:schemas-microsoft-com:office:office',
|
|
'x': 'urn:schemas-microsoft-com:office:excel',
|
|
'ss': 'urn:schemas-microsoft-com:office:spreadsheet',
|
|
'dt': 'uuid:C2F41010-65B3-11d1-A29F-00AA00C14882',
|
|
'mv': 'http://macVmlSchemaUri',
|
|
'v': 'urn:schemas-microsoft-com:vml',
|
|
'html': 'http://www.w3.org/TR/REC-html40'
|
|
};
|
|
function read_double_le(b, idx) {
|
|
var s = 1 - 2 * (b[idx + 7] >>> 7);
|
|
var e = ((b[idx + 7] & 0x7f) << 4) + (b[idx + 6] >>> 4 & 0x0f);
|
|
var m = b[idx + 6] & 0x0f;
|
|
for (var i = 5; i >= 0; --i) {
|
|
m = m * 256 + b[idx + i];
|
|
}
|
|
if (e == 0x7ff) return m == 0 ? s * Infinity : NaN;
|
|
if (e == 0) e = -1022;else {
|
|
e -= 1023;
|
|
m += Math.pow(2, 52);
|
|
}
|
|
return s * Math.pow(2, e - 52) * m;
|
|
}
|
|
function write_double_le(b, v, idx) {
|
|
var bs = (v < 0 || 1 / v == -Infinity ? 1 : 0) << 7,
|
|
e = 0,
|
|
m = 0;
|
|
var av = bs ? -v : v;
|
|
if (!isFinite(av)) {
|
|
e = 0x7ff;
|
|
m = isNaN(v) ? 0x6969 : 0;
|
|
} else if (av == 0) e = m = 0;else {
|
|
e = Math.floor(Math.log(av) / Math.LN2);
|
|
m = av * Math.pow(2, 52 - e);
|
|
if (e <= -1023 && (!isFinite(m) || m < Math.pow(2, 52))) {
|
|
e = -1022;
|
|
} else {
|
|
m -= Math.pow(2, 52);
|
|
e += 1023;
|
|
}
|
|
}
|
|
for (var i = 0; i <= 5; ++i, m /= 256) {
|
|
b[idx + i] = m & 0xff;
|
|
}
|
|
b[idx + 6] = (e & 0x0f) << 4 | m & 0xf;
|
|
b[idx + 7] = e >> 4 | bs;
|
|
}
|
|
var __toBuffer = function __toBuffer(bufs) {
|
|
var x = [],
|
|
w = 10240;
|
|
for (var i = 0; i < bufs[0].length; ++i) {
|
|
if (bufs[0][i]) for (var j = 0, L = bufs[0][i].length; j < L; j += w) {
|
|
x.push.apply(x, bufs[0][i].slice(j, j + w));
|
|
}
|
|
}
|
|
return x;
|
|
};
|
|
var ___toBuffer = __toBuffer;
|
|
var __utf16le = function __utf16le(b, s, e) {
|
|
var ss = [];
|
|
for (var i = s; i < e; i += 2) {
|
|
ss.push(String.fromCharCode(__readUInt16LE(b, i)));
|
|
}
|
|
return ss.join("").replace(chr0, '');
|
|
};
|
|
var ___utf16le = __utf16le;
|
|
var __hexlify = function __hexlify(b, s, l) {
|
|
var ss = [];
|
|
for (var i = s; i < s + l; ++i) {
|
|
ss.push(("0" + b[i].toString(16)).slice(-2));
|
|
}
|
|
return ss.join("");
|
|
};
|
|
var ___hexlify = __hexlify;
|
|
var __utf8 = function __utf8(b, s, e) {
|
|
var ss = [];
|
|
for (var i = s; i < e; i++) {
|
|
ss.push(String.fromCharCode(__readUInt8(b, i)));
|
|
}
|
|
return ss.join("");
|
|
};
|
|
var ___utf8 = __utf8;
|
|
var __lpstr = function __lpstr(b, i) {
|
|
var len = __readUInt32LE(b, i);
|
|
return len > 0 ? __utf8(b, i + 4, i + 4 + len - 1) : "";
|
|
};
|
|
var ___lpstr = __lpstr;
|
|
var __cpstr = function __cpstr(b, i) {
|
|
var len = __readUInt32LE(b, i);
|
|
return len > 0 ? __utf8(b, i + 4, i + 4 + len - 1) : "";
|
|
};
|
|
var ___cpstr = __cpstr;
|
|
var __lpwstr = function __lpwstr(b, i) {
|
|
var len = 2 * __readUInt32LE(b, i);
|
|
return len > 0 ? __utf8(b, i + 4, i + 4 + len - 1) : "";
|
|
};
|
|
var ___lpwstr = __lpwstr;
|
|
var __lpp4, ___lpp4;
|
|
__lpp4 = ___lpp4 = function lpp4_(b, i) {
|
|
var len = __readUInt32LE(b, i);
|
|
return len > 0 ? __utf16le(b, i + 4, i + 4 + len) : "";
|
|
};
|
|
var __8lpp4 = function __8lpp4(b, i) {
|
|
var len = __readUInt32LE(b, i);
|
|
return len > 0 ? __utf8(b, i + 4, i + 4 + len) : "";
|
|
};
|
|
var ___8lpp4 = __8lpp4;
|
|
var __double, ___double;
|
|
__double = ___double = function ___double(b, idx) {
|
|
return read_double_le(b, idx);
|
|
};
|
|
var is_buf = function is_buf_a(a) {
|
|
return Array.isArray(a);
|
|
};
|
|
if (has_buf) {
|
|
__utf16le = function __utf16le(b, s, e) {
|
|
if (!Buffer.isBuffer(b)) return ___utf16le(b, s, e);
|
|
return b.toString('utf16le', s, e).replace(chr0, '') /*.replace(chr1,'!')*/;
|
|
};
|
|
__hexlify = function __hexlify(b, s, l) {
|
|
return Buffer.isBuffer(b) ? b.toString('hex', s, s + l) : ___hexlify(b, s, l);
|
|
};
|
|
__lpstr = function lpstr_b(b, i) {
|
|
if (!Buffer.isBuffer(b)) return ___lpstr(b, i);
|
|
var len = b.readUInt32LE(i);
|
|
return len > 0 ? b.toString('utf8', i + 4, i + 4 + len - 1) : "";
|
|
};
|
|
__cpstr = function cpstr_b(b, i) {
|
|
if (!Buffer.isBuffer(b)) return ___cpstr(b, i);
|
|
var len = b.readUInt32LE(i);
|
|
return len > 0 ? b.toString('utf8', i + 4, i + 4 + len - 1) : "";
|
|
};
|
|
__lpwstr = function lpwstr_b(b, i) {
|
|
if (!Buffer.isBuffer(b)) return ___lpwstr(b, i);
|
|
var len = 2 * b.readUInt32LE(i);
|
|
return b.toString('utf16le', i + 4, i + 4 + len - 1);
|
|
};
|
|
__lpp4 = function lpp4_b(b, i) {
|
|
if (!Buffer.isBuffer(b)) return ___lpp4(b, i);
|
|
var len = b.readUInt32LE(i);
|
|
return b.toString('utf16le', i + 4, i + 4 + len);
|
|
};
|
|
__8lpp4 = function lpp4_8b(b, i) {
|
|
if (!Buffer.isBuffer(b)) return ___8lpp4(b, i);
|
|
var len = b.readUInt32LE(i);
|
|
return b.toString('utf8', i + 4, i + 4 + len);
|
|
};
|
|
__utf8 = function utf8_b(b, s, e) {
|
|
return Buffer.isBuffer(b) ? b.toString('utf8', s, e) : ___utf8(b, s, e);
|
|
};
|
|
__toBuffer = function __toBuffer(bufs) {
|
|
return bufs[0].length > 0 && Buffer.isBuffer(bufs[0][0]) ? Buffer.concat(bufs[0]) : ___toBuffer(bufs);
|
|
};
|
|
bconcat = function bconcat(bufs) {
|
|
return Buffer.isBuffer(bufs[0]) ? Buffer.concat(bufs) : [].concat.apply([], bufs);
|
|
};
|
|
__double = function double_(b, i) {
|
|
if (Buffer.isBuffer(b)) return b.readDoubleLE(i);
|
|
return ___double(b, i);
|
|
};
|
|
is_buf = function is_buf_b(a) {
|
|
return Buffer.isBuffer(a) || Array.isArray(a);
|
|
};
|
|
}
|
|
|
|
/* from js-xls */
|
|
if (typeof cptable !== 'undefined') {
|
|
__utf16le = function __utf16le(b, s, e) {
|
|
return cptable.utils.decode(1200, b.slice(s, e)).replace(chr0, '');
|
|
};
|
|
__utf8 = function __utf8(b, s, e) {
|
|
return cptable.utils.decode(65001, b.slice(s, e));
|
|
};
|
|
__lpstr = function __lpstr(b, i) {
|
|
var len = __readUInt32LE(b, i);
|
|
return len > 0 ? cptable.utils.decode(current_ansi, b.slice(i + 4, i + 4 + len - 1)) : "";
|
|
};
|
|
__cpstr = function __cpstr(b, i) {
|
|
var len = __readUInt32LE(b, i);
|
|
return len > 0 ? cptable.utils.decode(current_codepage, b.slice(i + 4, i + 4 + len - 1)) : "";
|
|
};
|
|
__lpwstr = function __lpwstr(b, i) {
|
|
var len = 2 * __readUInt32LE(b, i);
|
|
return len > 0 ? cptable.utils.decode(1200, b.slice(i + 4, i + 4 + len - 1)) : "";
|
|
};
|
|
__lpp4 = function __lpp4(b, i) {
|
|
var len = __readUInt32LE(b, i);
|
|
return len > 0 ? cptable.utils.decode(1200, b.slice(i + 4, i + 4 + len)) : "";
|
|
};
|
|
__8lpp4 = function __8lpp4(b, i) {
|
|
var len = __readUInt32LE(b, i);
|
|
return len > 0 ? cptable.utils.decode(65001, b.slice(i + 4, i + 4 + len)) : "";
|
|
};
|
|
}
|
|
var __readUInt8 = function __readUInt8(b, idx) {
|
|
return b[idx];
|
|
};
|
|
var __readUInt16LE = function __readUInt16LE(b, idx) {
|
|
return b[idx + 1] * (1 << 8) + b[idx];
|
|
};
|
|
var __readInt16LE = function __readInt16LE(b, idx) {
|
|
var u = b[idx + 1] * (1 << 8) + b[idx];
|
|
return u < 0x8000 ? u : (0xffff - u + 1) * -1;
|
|
};
|
|
var __readUInt32LE = function __readUInt32LE(b, idx) {
|
|
return b[idx + 3] * (1 << 24) + (b[idx + 2] << 16) + (b[idx + 1] << 8) + b[idx];
|
|
};
|
|
var __readInt32LE = function __readInt32LE(b, idx) {
|
|
return b[idx + 3] << 24 | b[idx + 2] << 16 | b[idx + 1] << 8 | b[idx];
|
|
};
|
|
var __readInt32BE = function __readInt32BE(b, idx) {
|
|
return b[idx] << 24 | b[idx + 1] << 16 | b[idx + 2] << 8 | b[idx + 3];
|
|
};
|
|
function ReadShift(size, t) {
|
|
var o = "",
|
|
oI,
|
|
oR,
|
|
oo = [],
|
|
w,
|
|
vv,
|
|
i,
|
|
loc;
|
|
switch (t) {
|
|
case 'dbcs':
|
|
loc = this.l;
|
|
if (has_buf && Buffer.isBuffer(this)) o = this.slice(this.l, this.l + 2 * size).toString("utf16le");else for (i = 0; i < size; ++i) {
|
|
o += String.fromCharCode(__readUInt16LE(this, loc));
|
|
loc += 2;
|
|
}
|
|
size *= 2;
|
|
break;
|
|
case 'utf8':
|
|
o = __utf8(this, this.l, this.l + size);
|
|
break;
|
|
case 'utf16le':
|
|
size *= 2;
|
|
o = __utf16le(this, this.l, this.l + size);
|
|
break;
|
|
case 'wstr':
|
|
if (typeof cptable !== 'undefined') o = cptable.utils.decode(current_codepage, this.slice(this.l, this.l + 2 * size));else return ReadShift.call(this, size, 'dbcs');
|
|
size = 2 * size;
|
|
break;
|
|
|
|
/* [MS-OLEDS] 2.1.4 LengthPrefixedAnsiString */
|
|
case 'lpstr-ansi':
|
|
o = __lpstr(this, this.l);
|
|
size = 4 + __readUInt32LE(this, this.l);
|
|
break;
|
|
case 'lpstr-cp':
|
|
o = __cpstr(this, this.l);
|
|
size = 4 + __readUInt32LE(this, this.l);
|
|
break;
|
|
/* [MS-OLEDS] 2.1.5 LengthPrefixedUnicodeString */
|
|
case 'lpwstr':
|
|
o = __lpwstr(this, this.l);
|
|
size = 4 + 2 * __readUInt32LE(this, this.l);
|
|
break;
|
|
/* [MS-OFFCRYPTO] 2.1.2 Length-Prefixed Padded Unicode String (UNICODE-LP-P4) */
|
|
case 'lpp4':
|
|
size = 4 + __readUInt32LE(this, this.l);
|
|
o = __lpp4(this, this.l);
|
|
if (size & 0x02) size += 2;
|
|
break;
|
|
/* [MS-OFFCRYPTO] 2.1.3 Length-Prefixed UTF-8 String (UTF-8-LP-P4) */
|
|
case '8lpp4':
|
|
size = 4 + __readUInt32LE(this, this.l);
|
|
o = __8lpp4(this, this.l);
|
|
if (size & 0x03) size += 4 - (size & 0x03);
|
|
break;
|
|
case 'cstr':
|
|
size = 0;
|
|
o = "";
|
|
while ((w = __readUInt8(this, this.l + size++)) !== 0) {
|
|
oo.push(_getchar(w));
|
|
}
|
|
o = oo.join("");
|
|
break;
|
|
case '_wstr':
|
|
size = 0;
|
|
o = "";
|
|
while ((w = __readUInt16LE(this, this.l + size)) !== 0) {
|
|
oo.push(_getchar(w));
|
|
size += 2;
|
|
}
|
|
size += 2;
|
|
o = oo.join("");
|
|
break;
|
|
|
|
/* sbcs and dbcs support continue records in the SST way TODO codepages */
|
|
case 'dbcs-cont':
|
|
o = "";
|
|
loc = this.l;
|
|
for (i = 0; i < size; ++i) {
|
|
if (this.lens && this.lens.indexOf(loc) !== -1) {
|
|
w = __readUInt8(this, loc);
|
|
this.l = loc + 1;
|
|
vv = ReadShift.call(this, size - i, w ? 'dbcs-cont' : 'sbcs-cont');
|
|
return oo.join("") + vv;
|
|
}
|
|
oo.push(_getchar(__readUInt16LE(this, loc)));
|
|
loc += 2;
|
|
}
|
|
o = oo.join("");
|
|
size *= 2;
|
|
break;
|
|
case 'cpstr':
|
|
if (typeof cptable !== 'undefined') {
|
|
o = cptable.utils.decode(current_codepage, this.slice(this.l, this.l + size));
|
|
break;
|
|
}
|
|
/* falls through */
|
|
case 'sbcs-cont':
|
|
o = "";
|
|
loc = this.l;
|
|
for (i = 0; i != size; ++i) {
|
|
if (this.lens && this.lens.indexOf(loc) !== -1) {
|
|
w = __readUInt8(this, loc);
|
|
this.l = loc + 1;
|
|
vv = ReadShift.call(this, size - i, w ? 'dbcs-cont' : 'sbcs-cont');
|
|
return oo.join("") + vv;
|
|
}
|
|
oo.push(_getchar(__readUInt8(this, loc)));
|
|
loc += 1;
|
|
}
|
|
o = oo.join("");
|
|
break;
|
|
default:
|
|
switch (size) {
|
|
case 1:
|
|
oI = __readUInt8(this, this.l);
|
|
this.l++;
|
|
return oI;
|
|
case 2:
|
|
oI = (t === 'i' ? __readInt16LE : __readUInt16LE)(this, this.l);
|
|
this.l += 2;
|
|
return oI;
|
|
case 4:
|
|
case -4:
|
|
if (t === 'i' || (this[this.l + 3] & 0x80) === 0) {
|
|
oI = (size > 0 ? __readInt32LE : __readInt32BE)(this, this.l);
|
|
this.l += 4;
|
|
return oI;
|
|
} else {
|
|
oR = __readUInt32LE(this, this.l);
|
|
this.l += 4;
|
|
}
|
|
return oR;
|
|
case 8:
|
|
case -8:
|
|
if (t === 'f') {
|
|
if (size == 8) oR = __double(this, this.l);else oR = __double([this[this.l + 7], this[this.l + 6], this[this.l + 5], this[this.l + 4], this[this.l + 3], this[this.l + 2], this[this.l + 1], this[this.l + 0]], 0);
|
|
this.l += 8;
|
|
return oR;
|
|
} else size = 8;
|
|
/* falls through */
|
|
case 16:
|
|
o = __hexlify(this, this.l, size);
|
|
break;
|
|
}
|
|
}
|
|
this.l += size;
|
|
return o;
|
|
}
|
|
var __writeUInt32LE = function __writeUInt32LE(b, val, idx) {
|
|
b[idx] = val & 0xFF;
|
|
b[idx + 1] = val >>> 8 & 0xFF;
|
|
b[idx + 2] = val >>> 16 & 0xFF;
|
|
b[idx + 3] = val >>> 24 & 0xFF;
|
|
};
|
|
var __writeInt32LE = function __writeInt32LE(b, val, idx) {
|
|
b[idx] = val & 0xFF;
|
|
b[idx + 1] = val >> 8 & 0xFF;
|
|
b[idx + 2] = val >> 16 & 0xFF;
|
|
b[idx + 3] = val >> 24 & 0xFF;
|
|
};
|
|
var __writeUInt16LE = function __writeUInt16LE(b, val, idx) {
|
|
b[idx] = val & 0xFF;
|
|
b[idx + 1] = val >>> 8 & 0xFF;
|
|
};
|
|
function WriteShift(t, val, f) {
|
|
var size = 0,
|
|
i = 0;
|
|
if (f === 'dbcs') {
|
|
for (i = 0; i != val.length; ++i) {
|
|
__writeUInt16LE(this, val.charCodeAt(i), this.l + 2 * i);
|
|
}
|
|
size = 2 * val.length;
|
|
} else if (f === 'sbcs') {
|
|
if (typeof cptable !== 'undefined' && current_ansi == 874) {
|
|
/* TODO: use tables directly, don't encode */
|
|
for (i = 0; i != val.length; ++i) {
|
|
var cppayload = cptable.utils.encode(current_ansi, val.charAt(i));
|
|
this[this.l + i] = cppayload[0];
|
|
}
|
|
} else {
|
|
val = val.replace(/[^\x00-\x7F]/g, "_");
|
|
for (i = 0; i != val.length; ++i) {
|
|
this[this.l + i] = val.charCodeAt(i) & 0xFF;
|
|
}
|
|
}
|
|
size = val.length;
|
|
} else if (f === 'hex') {
|
|
for (; i < t; ++i) {
|
|
this[this.l++] = parseInt(val.slice(2 * i, 2 * i + 2), 16) || 0;
|
|
}
|
|
return this;
|
|
} else if (f === 'utf16le') {
|
|
var end = Math.min(this.l + t, this.length);
|
|
for (i = 0; i < Math.min(val.length, t); ++i) {
|
|
var cc = val.charCodeAt(i);
|
|
this[this.l++] = cc & 0xff;
|
|
this[this.l++] = cc >> 8;
|
|
}
|
|
while (this.l < end) {
|
|
this[this.l++] = 0;
|
|
}
|
|
return this;
|
|
} else switch (t) {
|
|
case 1:
|
|
size = 1;
|
|
this[this.l] = val & 0xFF;
|
|
break;
|
|
case 2:
|
|
size = 2;
|
|
this[this.l] = val & 0xFF;
|
|
val >>>= 8;
|
|
this[this.l + 1] = val & 0xFF;
|
|
break;
|
|
case 3:
|
|
size = 3;
|
|
this[this.l] = val & 0xFF;
|
|
val >>>= 8;
|
|
this[this.l + 1] = val & 0xFF;
|
|
val >>>= 8;
|
|
this[this.l + 2] = val & 0xFF;
|
|
break;
|
|
case 4:
|
|
size = 4;
|
|
__writeUInt32LE(this, val, this.l);
|
|
break;
|
|
case 8:
|
|
size = 8;
|
|
if (f === 'f') {
|
|
write_double_le(this, val, this.l);
|
|
break;
|
|
}
|
|
/* falls through */
|
|
case 16:
|
|
break;
|
|
case -4:
|
|
size = 4;
|
|
__writeInt32LE(this, val, this.l);
|
|
break;
|
|
}
|
|
this.l += size;
|
|
return this;
|
|
}
|
|
function CheckField(hexstr, fld) {
|
|
var m = __hexlify(this, this.l, hexstr.length >> 1);
|
|
if (m !== hexstr) throw new Error(fld + 'Expected ' + hexstr + ' saw ' + m);
|
|
this.l += hexstr.length >> 1;
|
|
}
|
|
function prep_blob(blob, pos) {
|
|
blob.l = pos;
|
|
blob.read_shift = ReadShift;
|
|
blob.chk = CheckField;
|
|
blob.write_shift = WriteShift;
|
|
}
|
|
function parsenoop(blob, length) {
|
|
blob.l += length;
|
|
}
|
|
function new_buf(sz) {
|
|
var o = new_raw_buf(sz);
|
|
prep_blob(o, 0);
|
|
return o;
|
|
}
|
|
|
|
/* [MS-XLSB] 2.1.4 Record */
|
|
function recordhopper(data, cb, opts) {
|
|
if (!data) return;
|
|
var tmpbyte, cntbyte, length;
|
|
prep_blob(data, data.l || 0);
|
|
var L = data.length,
|
|
RT = 0,
|
|
tgt = 0;
|
|
while (data.l < L) {
|
|
RT = data.read_shift(1);
|
|
if (RT & 0x80) RT = (RT & 0x7F) + ((data.read_shift(1) & 0x7F) << 7);
|
|
var R = XLSBRecordEnum[RT] || XLSBRecordEnum[0xFFFF];
|
|
tmpbyte = data.read_shift(1);
|
|
length = tmpbyte & 0x7F;
|
|
for (cntbyte = 1; cntbyte < 4 && tmpbyte & 0x80; ++cntbyte) {
|
|
length += ((tmpbyte = data.read_shift(1)) & 0x7F) << 7 * cntbyte;
|
|
}
|
|
tgt = data.l + length;
|
|
var d = R.f && R.f(data, length, opts);
|
|
data.l = tgt;
|
|
if (cb(d, R.n, RT)) return;
|
|
}
|
|
}
|
|
|
|
/* control buffer usage for fixed-length buffers */
|
|
function buf_array() {
|
|
var bufs = [],
|
|
blksz = has_buf ? 256 : 2048;
|
|
var newblk = function ba_newblk(sz) {
|
|
var o = new_buf(sz);
|
|
prep_blob(o, 0);
|
|
return o;
|
|
};
|
|
var curbuf = newblk(blksz);
|
|
var endbuf = function ba_endbuf() {
|
|
if (!curbuf) return;
|
|
if (curbuf.length > curbuf.l) {
|
|
curbuf = curbuf.slice(0, curbuf.l);
|
|
curbuf.l = curbuf.length;
|
|
}
|
|
if (curbuf.length > 0) bufs.push(curbuf);
|
|
curbuf = null;
|
|
};
|
|
var next = function ba_next(sz) {
|
|
if (curbuf && sz < curbuf.length - curbuf.l) return curbuf;
|
|
endbuf();
|
|
return curbuf = newblk(Math.max(sz + 1, blksz));
|
|
};
|
|
var end = function ba_end() {
|
|
endbuf();
|
|
return __toBuffer([bufs]);
|
|
};
|
|
var push = function ba_push(buf) {
|
|
endbuf();
|
|
curbuf = buf;
|
|
if (curbuf.l == null) curbuf.l = curbuf.length;
|
|
next(blksz);
|
|
};
|
|
return {
|
|
next: next,
|
|
push: push,
|
|
end: end,
|
|
_bufs: bufs
|
|
};
|
|
}
|
|
function write_record(ba, type, payload, length) {
|
|
var t = +XLSBRE[type],
|
|
l;
|
|
if (isNaN(t)) return; // TODO: throw something here?
|
|
if (!length) length = XLSBRecordEnum[t].p || (payload || []).length || 0;
|
|
l = 1 + (t >= 0x80 ? 1 : 0) + 1 /* + length*/;
|
|
if (length >= 0x80) ++l;
|
|
if (length >= 0x4000) ++l;
|
|
if (length >= 0x200000) ++l;
|
|
var o = ba.next(l);
|
|
if (t <= 0x7F) o.write_shift(1, t);else {
|
|
o.write_shift(1, (t & 0x7F) + 0x80);
|
|
o.write_shift(1, t >> 7);
|
|
}
|
|
for (var i = 0; i != 4; ++i) {
|
|
if (length >= 0x80) {
|
|
o.write_shift(1, (length & 0x7F) + 0x80);
|
|
length >>= 7;
|
|
} else {
|
|
o.write_shift(1, length);
|
|
break;
|
|
}
|
|
}
|
|
if (length > 0 && is_buf(payload)) ba.push(payload);
|
|
}
|
|
/* XLS ranges enforced */
|
|
function shift_cell_xls(cell, tgt, opts) {
|
|
var out = dup(cell);
|
|
if (tgt.s) {
|
|
if (out.cRel) out.c += tgt.s.c;
|
|
if (out.rRel) out.r += tgt.s.r;
|
|
} else {
|
|
if (out.cRel) out.c += tgt.c;
|
|
if (out.rRel) out.r += tgt.r;
|
|
}
|
|
if (!opts || opts.biff < 12) {
|
|
while (out.c >= 0x100) {
|
|
out.c -= 0x100;
|
|
}
|
|
while (out.r >= 0x10000) {
|
|
out.r -= 0x10000;
|
|
}
|
|
}
|
|
return out;
|
|
}
|
|
function shift_range_xls(cell, range, opts) {
|
|
var out = dup(cell);
|
|
out.s = shift_cell_xls(out.s, range.s, opts);
|
|
out.e = shift_cell_xls(out.e, range.s, opts);
|
|
return out;
|
|
}
|
|
function encode_cell_xls(c, biff) {
|
|
if (c.cRel && c.c < 0) {
|
|
c = dup(c);
|
|
while (c.c < 0) {
|
|
c.c += biff > 8 ? 0x4000 : 0x100;
|
|
}
|
|
}
|
|
if (c.rRel && c.r < 0) {
|
|
c = dup(c);
|
|
while (c.r < 0) {
|
|
c.r += biff > 8 ? 0x100000 : biff > 5 ? 0x10000 : 0x4000;
|
|
}
|
|
}
|
|
var s = encode_cell(c);
|
|
if (!c.cRel && c.cRel != null) s = fix_col(s);
|
|
if (!c.rRel && c.rRel != null) s = fix_row(s);
|
|
return s;
|
|
}
|
|
function encode_range_xls(r, opts) {
|
|
if (r.s.r == 0 && !r.s.rRel) {
|
|
if (r.e.r == (opts.biff >= 12 ? 0xFFFFF : opts.biff >= 8 ? 0x10000 : 0x4000) && !r.e.rRel) {
|
|
return (r.s.cRel ? "" : "$") + encode_col(r.s.c) + ":" + (r.e.cRel ? "" : "$") + encode_col(r.e.c);
|
|
}
|
|
}
|
|
if (r.s.c == 0 && !r.s.cRel) {
|
|
if (r.e.c == (opts.biff >= 12 ? 0x3FFF : 0xFF) && !r.e.cRel) {
|
|
return (r.s.rRel ? "" : "$") + encode_row(r.s.r) + ":" + (r.e.rRel ? "" : "$") + encode_row(r.e.r);
|
|
}
|
|
}
|
|
return encode_cell_xls(r.s, opts.biff) + ":" + encode_cell_xls(r.e, opts.biff);
|
|
}
|
|
function decode_row(rowstr) {
|
|
return parseInt(unfix_row(rowstr), 10) - 1;
|
|
}
|
|
function encode_row(row) {
|
|
return "" + (row + 1);
|
|
}
|
|
function fix_row(cstr) {
|
|
return cstr.replace(/([A-Z]|^)(\d+)$/, "$1$$$2");
|
|
}
|
|
function unfix_row(cstr) {
|
|
return cstr.replace(/\$(\d+)$/, "$1");
|
|
}
|
|
function decode_col(colstr) {
|
|
var c = unfix_col(colstr),
|
|
d = 0,
|
|
i = 0;
|
|
for (; i !== c.length; ++i) {
|
|
d = 26 * d + c.charCodeAt(i) - 64;
|
|
}
|
|
return d - 1;
|
|
}
|
|
function encode_col(col) {
|
|
if (col < 0) throw new Error("invalid column " + col);
|
|
var s = "";
|
|
for (++col; col; col = Math.floor((col - 1) / 26)) {
|
|
s = String.fromCharCode((col - 1) % 26 + 65) + s;
|
|
}
|
|
return s;
|
|
}
|
|
function fix_col(cstr) {
|
|
return cstr.replace(/^([A-Z])/, "$$$1");
|
|
}
|
|
function unfix_col(cstr) {
|
|
return cstr.replace(/^\$([A-Z])/, "$1");
|
|
}
|
|
function split_cell(cstr) {
|
|
return cstr.replace(/(\$?[A-Z]*)(\$?\d*)/, "$1,$2").split(",");
|
|
}
|
|
//function decode_cell(cstr) { var splt = split_cell(cstr); return { c:decode_col(splt[0]), r:decode_row(splt[1]) }; }
|
|
function decode_cell(cstr) {
|
|
var R = 0,
|
|
C = 0;
|
|
for (var i = 0; i < cstr.length; ++i) {
|
|
var cc = cstr.charCodeAt(i);
|
|
if (cc >= 48 && cc <= 57) R = 10 * R + (cc - 48);else if (cc >= 65 && cc <= 90) C = 26 * C + (cc - 64);
|
|
}
|
|
return {
|
|
c: C - 1,
|
|
r: R - 1
|
|
};
|
|
}
|
|
//function encode_cell(cell) { return encode_col(cell.c) + encode_row(cell.r); }
|
|
function encode_cell(cell) {
|
|
var col = cell.c + 1;
|
|
var s = "";
|
|
for (; col; col = (col - 1) / 26 | 0) {
|
|
s = String.fromCharCode((col - 1) % 26 + 65) + s;
|
|
}
|
|
return s + (cell.r + 1);
|
|
}
|
|
function decode_range(range) {
|
|
var idx = range.indexOf(":");
|
|
if (idx == -1) return {
|
|
s: decode_cell(range),
|
|
e: decode_cell(range)
|
|
};
|
|
return {
|
|
s: decode_cell(range.slice(0, idx)),
|
|
e: decode_cell(range.slice(idx + 1))
|
|
};
|
|
}
|
|
function encode_range(cs, ce) {
|
|
if (typeof ce === 'undefined' || typeof ce === 'number') {
|
|
return encode_range(cs.s, cs.e);
|
|
}
|
|
if (typeof cs !== 'string') cs = encode_cell(cs);
|
|
if (typeof ce !== 'string') ce = encode_cell(ce);
|
|
return cs == ce ? cs : cs + ":" + ce;
|
|
}
|
|
function safe_decode_range(range) {
|
|
var o = {
|
|
s: {
|
|
c: 0,
|
|
r: 0
|
|
},
|
|
e: {
|
|
c: 0,
|
|
r: 0
|
|
}
|
|
};
|
|
var idx = 0,
|
|
i = 0,
|
|
cc = 0;
|
|
var len = range.length;
|
|
for (idx = 0; i < len; ++i) {
|
|
if ((cc = range.charCodeAt(i) - 64) < 1 || cc > 26) break;
|
|
idx = 26 * idx + cc;
|
|
}
|
|
o.s.c = --idx;
|
|
for (idx = 0; i < len; ++i) {
|
|
if ((cc = range.charCodeAt(i) - 48) < 0 || cc > 9) break;
|
|
idx = 10 * idx + cc;
|
|
}
|
|
o.s.r = --idx;
|
|
if (i === len || cc != 10) {
|
|
o.e.c = o.s.c;
|
|
o.e.r = o.s.r;
|
|
return o;
|
|
}
|
|
++i;
|
|
for (idx = 0; i != len; ++i) {
|
|
if ((cc = range.charCodeAt(i) - 64) < 1 || cc > 26) break;
|
|
idx = 26 * idx + cc;
|
|
}
|
|
o.e.c = --idx;
|
|
for (idx = 0; i != len; ++i) {
|
|
if ((cc = range.charCodeAt(i) - 48) < 0 || cc > 9) break;
|
|
idx = 10 * idx + cc;
|
|
}
|
|
o.e.r = --idx;
|
|
return o;
|
|
}
|
|
function safe_format_cell(cell, v) {
|
|
var q = cell.t == 'd' && v instanceof Date;
|
|
if (cell.z != null) try {
|
|
return cell.w = SSF.format(cell.z, q ? datenum(v) : v);
|
|
} catch (e) {}
|
|
try {
|
|
return cell.w = SSF.format((cell.XF || {}).numFmtId || (q ? 14 : 0), q ? datenum(v) : v);
|
|
} catch (e) {
|
|
return '' + v;
|
|
}
|
|
}
|
|
function format_cell(cell, v, o) {
|
|
if (cell == null || cell.t == null || cell.t == 'z') return "";
|
|
if (cell.w !== undefined) return cell.w;
|
|
if (cell.t == 'd' && !cell.z && o && o.dateNF) cell.z = o.dateNF;
|
|
if (cell.t == "e") return BErr[cell.v] || cell.v;
|
|
if (v == undefined) return safe_format_cell(cell, cell.v);
|
|
return safe_format_cell(cell, v);
|
|
}
|
|
function sheet_to_workbook(sheet, opts) {
|
|
var n = opts && opts.sheet ? opts.sheet : "Sheet1";
|
|
var sheets = {};
|
|
sheets[n] = sheet;
|
|
return {
|
|
SheetNames: [n],
|
|
Sheets: sheets
|
|
};
|
|
}
|
|
function sheet_add_aoa(_ws, data, opts) {
|
|
var o = opts || {};
|
|
var dense = _ws ? Array.isArray(_ws) : o.dense;
|
|
if (DENSE != null && dense == null) dense = DENSE;
|
|
var ws = _ws || (dense ? [] : {});
|
|
var _R = 0,
|
|
_C = 0;
|
|
if (ws && o.origin != null) {
|
|
if (typeof o.origin == 'number') _R = o.origin;else {
|
|
var _origin = typeof o.origin == "string" ? decode_cell(o.origin) : o.origin;
|
|
_R = _origin.r;
|
|
_C = _origin.c;
|
|
}
|
|
if (!ws["!ref"]) ws["!ref"] = "A1:A1";
|
|
}
|
|
var range = {
|
|
s: {
|
|
c: 10000000,
|
|
r: 10000000
|
|
},
|
|
e: {
|
|
c: 0,
|
|
r: 0
|
|
}
|
|
};
|
|
if (ws['!ref']) {
|
|
var _range = safe_decode_range(ws['!ref']);
|
|
range.s.c = _range.s.c;
|
|
range.s.r = _range.s.r;
|
|
range.e.c = Math.max(range.e.c, _range.e.c);
|
|
range.e.r = Math.max(range.e.r, _range.e.r);
|
|
if (_R == -1) range.e.r = _R = _range.e.r + 1;
|
|
}
|
|
for (var R = 0; R != data.length; ++R) {
|
|
if (!data[R]) continue;
|
|
if (!Array.isArray(data[R])) throw new Error("aoa_to_sheet expects an array of arrays");
|
|
for (var C = 0; C != data[R].length; ++C) {
|
|
if (typeof data[R][C] === 'undefined') continue;
|
|
var cell = {
|
|
v: data[R][C]
|
|
};
|
|
var __R = _R + R,
|
|
__C = _C + C;
|
|
if (range.s.r > __R) range.s.r = __R;
|
|
if (range.s.c > __C) range.s.c = __C;
|
|
if (range.e.r < __R) range.e.r = __R;
|
|
if (range.e.c < __C) range.e.c = __C;
|
|
if (data[R][C] && _typeof(data[R][C]) === 'object' && !Array.isArray(data[R][C]) && !(data[R][C] instanceof Date)) cell = data[R][C];else {
|
|
if (Array.isArray(cell.v)) {
|
|
cell.f = data[R][C][1];
|
|
cell.v = cell.v[0];
|
|
}
|
|
if (cell.v === null) {
|
|
if (cell.f) cell.t = 'n';else if (o.nullError) {
|
|
cell.t = 'e';
|
|
cell.v = 0;
|
|
} else if (!o.sheetStubs) continue;else cell.t = 'z';
|
|
} else if (typeof cell.v === 'number') cell.t = 'n';else if (typeof cell.v === 'boolean') cell.t = 'b';else if (cell.v instanceof Date) {
|
|
cell.z = o.dateNF || SSF._table[14];
|
|
if (o.cellDates) {
|
|
cell.t = 'd';
|
|
cell.w = SSF.format(cell.z, datenum(cell.v));
|
|
} else {
|
|
cell.t = 'n';
|
|
cell.v = datenum(cell.v);
|
|
cell.w = SSF.format(cell.z, cell.v);
|
|
}
|
|
} else cell.t = 's';
|
|
}
|
|
if (dense) {
|
|
if (!ws[__R]) ws[__R] = [];
|
|
if (ws[__R][__C] && ws[__R][__C].z) cell.z = ws[__R][__C].z;
|
|
ws[__R][__C] = cell;
|
|
} else {
|
|
var cell_ref = encode_cell({
|
|
c: __C,
|
|
r: __R
|
|
});
|
|
if (ws[cell_ref] && ws[cell_ref].z) cell.z = ws[cell_ref].z;
|
|
ws[cell_ref] = cell;
|
|
}
|
|
}
|
|
}
|
|
if (range.s.c < 10000000) ws['!ref'] = encode_range(range);
|
|
return ws;
|
|
}
|
|
function aoa_to_sheet(data, opts) {
|
|
return sheet_add_aoa(null, data, opts);
|
|
}
|
|
|
|
/* [MS-OLEPS] 2.2 PropertyType */
|
|
//var VT_EMPTY = 0x0000;
|
|
//var VT_NULL = 0x0001;
|
|
var VT_I2 = 0x0002;
|
|
var VT_I4 = 0x0003;
|
|
//var VT_R4 = 0x0004;
|
|
//var VT_R8 = 0x0005;
|
|
//var VT_CY = 0x0006;
|
|
//var VT_DATE = 0x0007;
|
|
//var VT_BSTR = 0x0008;
|
|
//var VT_ERROR = 0x000A;
|
|
var VT_BOOL = 0x000B;
|
|
var VT_VARIANT = 0x000C;
|
|
//var VT_DECIMAL = 0x000E;
|
|
//var VT_I1 = 0x0010;
|
|
//var VT_UI1 = 0x0011;
|
|
//var VT_UI2 = 0x0012;
|
|
var VT_UI4 = 0x0013;
|
|
//var VT_I8 = 0x0014;
|
|
//var VT_UI8 = 0x0015;
|
|
//var VT_INT = 0x0016;
|
|
//var VT_UINT = 0x0017;
|
|
var VT_LPSTR = 0x001E;
|
|
//var VT_LPWSTR = 0x001F;
|
|
var VT_FILETIME = 0x0040;
|
|
var VT_BLOB = 0x0041;
|
|
//var VT_STREAM = 0x0042;
|
|
//var VT_STORAGE = 0x0043;
|
|
//var VT_STREAMED_Object = 0x0044;
|
|
//var VT_STORED_Object = 0x0045;
|
|
//var VT_BLOB_Object = 0x0046;
|
|
var VT_CF = 0x0047;
|
|
//var VT_CLSID = 0x0048;
|
|
//var VT_VERSIONED_STREAM = 0x0049;
|
|
var VT_VECTOR = 0x1000;
|
|
//var VT_ARRAY = 0x2000;
|
|
|
|
var VT_STRING = 0x0050; // 2.3.3.1.11 VtString
|
|
var VT_USTR = 0x0051; // 2.3.3.1.12 VtUnalignedString
|
|
var VT_CUSTOM = [VT_STRING, VT_USTR];
|
|
|
|
/* [MS-OSHARED] 2.3.3.2.2.1 Document Summary Information PIDDSI */
|
|
var DocSummaryPIDDSI = {
|
|
0x01: {
|
|
n: 'CodePage',
|
|
t: VT_I2
|
|
},
|
|
0x02: {
|
|
n: 'Category',
|
|
t: VT_STRING
|
|
},
|
|
0x03: {
|
|
n: 'PresentationFormat',
|
|
t: VT_STRING
|
|
},
|
|
0x04: {
|
|
n: 'ByteCount',
|
|
t: VT_I4
|
|
},
|
|
0x05: {
|
|
n: 'LineCount',
|
|
t: VT_I4
|
|
},
|
|
0x06: {
|
|
n: 'ParagraphCount',
|
|
t: VT_I4
|
|
},
|
|
0x07: {
|
|
n: 'SlideCount',
|
|
t: VT_I4
|
|
},
|
|
0x08: {
|
|
n: 'NoteCount',
|
|
t: VT_I4
|
|
},
|
|
0x09: {
|
|
n: 'HiddenCount',
|
|
t: VT_I4
|
|
},
|
|
0x0a: {
|
|
n: 'MultimediaClipCount',
|
|
t: VT_I4
|
|
},
|
|
0x0b: {
|
|
n: 'ScaleCrop',
|
|
t: VT_BOOL
|
|
},
|
|
0x0c: {
|
|
n: 'HeadingPairs',
|
|
t: VT_VECTOR | VT_VARIANT
|
|
},
|
|
0x0d: {
|
|
n: 'TitlesOfParts',
|
|
t: VT_VECTOR | VT_LPSTR
|
|
},
|
|
0x0e: {
|
|
n: 'Manager',
|
|
t: VT_STRING
|
|
},
|
|
0x0f: {
|
|
n: 'Company',
|
|
t: VT_STRING
|
|
},
|
|
0x10: {
|
|
n: 'LinksUpToDate',
|
|
t: VT_BOOL
|
|
},
|
|
0x11: {
|
|
n: 'CharacterCount',
|
|
t: VT_I4
|
|
},
|
|
0x13: {
|
|
n: 'SharedDoc',
|
|
t: VT_BOOL
|
|
},
|
|
0x16: {
|
|
n: 'HyperlinksChanged',
|
|
t: VT_BOOL
|
|
},
|
|
0x17: {
|
|
n: 'AppVersion',
|
|
t: VT_I4,
|
|
p: 'version'
|
|
},
|
|
0x18: {
|
|
n: 'DigSig',
|
|
t: VT_BLOB
|
|
},
|
|
0x1A: {
|
|
n: 'ContentType',
|
|
t: VT_STRING
|
|
},
|
|
0x1B: {
|
|
n: 'ContentStatus',
|
|
t: VT_STRING
|
|
},
|
|
0x1C: {
|
|
n: 'Language',
|
|
t: VT_STRING
|
|
},
|
|
0x1D: {
|
|
n: 'Version',
|
|
t: VT_STRING
|
|
},
|
|
0xFF: {},
|
|
/* [MS-OLEPS] 2.18 */
|
|
0x80000000: {
|
|
n: 'Locale',
|
|
t: VT_UI4
|
|
},
|
|
0x80000003: {
|
|
n: 'Behavior',
|
|
t: VT_UI4
|
|
},
|
|
0x72627262: {}
|
|
};
|
|
|
|
/* [MS-OSHARED] 2.3.3.2.1.1 Summary Information Property Set PIDSI */
|
|
var SummaryPIDSI = {
|
|
0x01: {
|
|
n: 'CodePage',
|
|
t: VT_I2
|
|
},
|
|
0x02: {
|
|
n: 'Title',
|
|
t: VT_STRING
|
|
},
|
|
0x03: {
|
|
n: 'Subject',
|
|
t: VT_STRING
|
|
},
|
|
0x04: {
|
|
n: 'Author',
|
|
t: VT_STRING
|
|
},
|
|
0x05: {
|
|
n: 'Keywords',
|
|
t: VT_STRING
|
|
},
|
|
0x06: {
|
|
n: 'Comments',
|
|
t: VT_STRING
|
|
},
|
|
0x07: {
|
|
n: 'Template',
|
|
t: VT_STRING
|
|
},
|
|
0x08: {
|
|
n: 'LastAuthor',
|
|
t: VT_STRING
|
|
},
|
|
0x09: {
|
|
n: 'RevNumber',
|
|
t: VT_STRING
|
|
},
|
|
0x0A: {
|
|
n: 'EditTime',
|
|
t: VT_FILETIME
|
|
},
|
|
0x0B: {
|
|
n: 'LastPrinted',
|
|
t: VT_FILETIME
|
|
},
|
|
0x0C: {
|
|
n: 'CreatedDate',
|
|
t: VT_FILETIME
|
|
},
|
|
0x0D: {
|
|
n: 'ModifiedDate',
|
|
t: VT_FILETIME
|
|
},
|
|
0x0E: {
|
|
n: 'PageCount',
|
|
t: VT_I4
|
|
},
|
|
0x0F: {
|
|
n: 'WordCount',
|
|
t: VT_I4
|
|
},
|
|
0x10: {
|
|
n: 'CharCount',
|
|
t: VT_I4
|
|
},
|
|
0x11: {
|
|
n: 'Thumbnail',
|
|
t: VT_CF
|
|
},
|
|
0x12: {
|
|
n: 'Application',
|
|
t: VT_STRING
|
|
},
|
|
0x13: {
|
|
n: 'DocSecurity',
|
|
t: VT_I4
|
|
},
|
|
0xFF: {},
|
|
/* [MS-OLEPS] 2.18 */
|
|
0x80000000: {
|
|
n: 'Locale',
|
|
t: VT_UI4
|
|
},
|
|
0x80000003: {
|
|
n: 'Behavior',
|
|
t: VT_UI4
|
|
},
|
|
0x72627262: {}
|
|
};
|
|
var DocSummaryRE = evert_key(DocSummaryPIDDSI, "n");
|
|
var SummaryRE = evert_key(SummaryPIDSI, "n");
|
|
|
|
/* [MS-XLS] 2.4.63 Country/Region codes */
|
|
var CountryEnum = {
|
|
0x0001: "US",
|
|
// United States
|
|
0x0002: "CA",
|
|
// Canada
|
|
0x0003: "",
|
|
// Latin America (except Brazil)
|
|
0x0007: "RU",
|
|
// Russia
|
|
0x0014: "EG",
|
|
// Egypt
|
|
0x001E: "GR",
|
|
// Greece
|
|
0x001F: "NL",
|
|
// Netherlands
|
|
0x0020: "BE",
|
|
// Belgium
|
|
0x0021: "FR",
|
|
// France
|
|
0x0022: "ES",
|
|
// Spain
|
|
0x0024: "HU",
|
|
// Hungary
|
|
0x0027: "IT",
|
|
// Italy
|
|
0x0029: "CH",
|
|
// Switzerland
|
|
0x002B: "AT",
|
|
// Austria
|
|
0x002C: "GB",
|
|
// United Kingdom
|
|
0x002D: "DK",
|
|
// Denmark
|
|
0x002E: "SE",
|
|
// Sweden
|
|
0x002F: "NO",
|
|
// Norway
|
|
0x0030: "PL",
|
|
// Poland
|
|
0x0031: "DE",
|
|
// Germany
|
|
0x0034: "MX",
|
|
// Mexico
|
|
0x0037: "BR",
|
|
// Brazil
|
|
0x003d: "AU",
|
|
// Australia
|
|
0x0040: "NZ",
|
|
// New Zealand
|
|
0x0042: "TH",
|
|
// Thailand
|
|
0x0051: "JP",
|
|
// Japan
|
|
0x0052: "KR",
|
|
// Korea
|
|
0x0054: "VN",
|
|
// Viet Nam
|
|
0x0056: "CN",
|
|
// China
|
|
0x005A: "TR",
|
|
// Turkey
|
|
0x0069: "JS",
|
|
// Ramastan
|
|
0x00D5: "DZ",
|
|
// Algeria
|
|
0x00D8: "MA",
|
|
// Morocco
|
|
0x00DA: "LY",
|
|
// Libya
|
|
0x015F: "PT",
|
|
// Portugal
|
|
0x0162: "IS",
|
|
// Iceland
|
|
0x0166: "FI",
|
|
// Finland
|
|
0x01A4: "CZ",
|
|
// Czech Republic
|
|
0x0376: "TW",
|
|
// Taiwan
|
|
0x03C1: "LB",
|
|
// Lebanon
|
|
0x03C2: "JO",
|
|
// Jordan
|
|
0x03C3: "SY",
|
|
// Syria
|
|
0x03C4: "IQ",
|
|
// Iraq
|
|
0x03C5: "KW",
|
|
// Kuwait
|
|
0x03C6: "SA",
|
|
// Saudi Arabia
|
|
0x03CB: "AE",
|
|
// United Arab Emirates
|
|
0x03CC: "IL",
|
|
// Israel
|
|
0x03CE: "QA",
|
|
// Qatar
|
|
0x03D5: "IR",
|
|
// Iran
|
|
0xFFFF: "US" // United States
|
|
};
|
|
|
|
/* [MS-XLS] 2.5.127 */
|
|
var XLSFillPattern = [null, 'solid', 'mediumGray', 'darkGray', 'lightGray', 'darkHorizontal', 'darkVertical', 'darkDown', 'darkUp', 'darkGrid', 'darkTrellis', 'lightHorizontal', 'lightVertical', 'lightDown', 'lightUp', 'lightGrid', 'lightTrellis', 'gray125', 'gray0625'];
|
|
function rgbify(arr) {
|
|
return arr.map(function (x) {
|
|
return [x >> 16 & 255, x >> 8 & 255, x & 255];
|
|
});
|
|
}
|
|
|
|
/* [MS-XLS] 2.5.161 */
|
|
/* [MS-XLSB] 2.5.75 Icv */
|
|
var _XLSIcv = rgbify([/* Color Constants */
|
|
0x000000, 0xFFFFFF, 0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF, /* Overridable Defaults */
|
|
0x000000, 0xFFFFFF, 0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF, 0x800000, 0x008000, 0x000080, 0x808000, 0x800080, 0x008080, 0xC0C0C0, 0x808080, 0x9999FF, 0x993366, 0xFFFFCC, 0xCCFFFF, 0x660066, 0xFF8080, 0x0066CC, 0xCCCCFF, 0x000080, 0xFF00FF, 0xFFFF00, 0x00FFFF, 0x800080, 0x800000, 0x008080, 0x0000FF, 0x00CCFF, 0xCCFFFF, 0xCCFFCC, 0xFFFF99, 0x99CCFF, 0xFF99CC, 0xCC99FF, 0xFFCC99, 0x3366FF, 0x33CCCC, 0x99CC00, 0xFFCC00, 0xFF9900, 0xFF6600, 0x666699, 0x969696, 0x003366, 0x339966, 0x003300, 0x333300, 0x993300, 0x993366, 0x333399, 0x333333, /* Other entries to appease BIFF8/12 */
|
|
0xFFFFFF, /* 0x40 icvForeground ?? */
|
|
0x000000, /* 0x41 icvBackground ?? */
|
|
0x000000, /* 0x42 icvFrame ?? */
|
|
0x000000, /* 0x43 icv3D ?? */
|
|
0x000000, /* 0x44 icv3DText ?? */
|
|
0x000000, /* 0x45 icv3DHilite ?? */
|
|
0x000000, /* 0x46 icv3DShadow ?? */
|
|
0x000000, /* 0x47 icvHilite ?? */
|
|
0x000000, /* 0x48 icvCtlText ?? */
|
|
0x000000, /* 0x49 icvCtlScrl ?? */
|
|
0x000000, /* 0x4A icvCtlInv ?? */
|
|
0x000000, /* 0x4B icvCtlBody ?? */
|
|
0x000000, /* 0x4C icvCtlFrame ?? */
|
|
0x000000, /* 0x4D icvCtlFore ?? */
|
|
0x000000, /* 0x4E icvCtlBack ?? */
|
|
0x000000, /* 0x4F icvCtlNeutral */
|
|
0x000000, /* 0x50 icvInfoBk ?? */
|
|
0x000000 /* 0x51 icvInfoText ?? */]);
|
|
|
|
var XLSIcv = dup(_XLSIcv);
|
|
|
|
/* [MS-XLSB] 2.5.97.2 */
|
|
var BErr = {
|
|
0x00: "#NULL!",
|
|
0x07: "#DIV/0!",
|
|
0x0F: "#VALUE!",
|
|
0x17: "#REF!",
|
|
0x1D: "#NAME?",
|
|
0x24: "#NUM!",
|
|
0x2A: "#N/A",
|
|
0x2B: "#GETTING_DATA",
|
|
0xFF: "#WTF?"
|
|
};
|
|
var RBErr = evert_num(BErr);
|
|
/* Parts enumerated in OPC spec, MS-XLSB and MS-XLSX */
|
|
/* 12.3 Part Summary <SpreadsheetML> */
|
|
/* 14.2 Part Summary <DrawingML> */
|
|
/* [MS-XLSX] 2.1 Part Enumerations ; [MS-XLSB] 2.1.7 Part Enumeration */
|
|
var ct2type /*{[string]:string}*/ = {
|
|
/* Workbook */
|
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": "workbooks",
|
|
/* Worksheet */
|
|
"application/vnd.ms-excel.binIndexWs": "TODO",
|
|
/* Binary Index */
|
|
|
|
/* Macrosheet */
|
|
"application/vnd.ms-excel.intlmacrosheet": "TODO",
|
|
"application/vnd.ms-excel.binIndexMs": "TODO",
|
|
/* Binary Index */
|
|
|
|
/* File Properties */
|
|
"application/vnd.openxmlformats-package.core-properties+xml": "coreprops",
|
|
"application/vnd.openxmlformats-officedocument.custom-properties+xml": "custprops",
|
|
"application/vnd.openxmlformats-officedocument.extended-properties+xml": "extprops",
|
|
/* Custom Data Properties */
|
|
"application/vnd.openxmlformats-officedocument.customXmlProperties+xml": "TODO",
|
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.customProperty": "TODO",
|
|
/* PivotTable */
|
|
"application/vnd.ms-excel.pivotTable": "TODO",
|
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml": "TODO",
|
|
/* Chart Objects */
|
|
"application/vnd.openxmlformats-officedocument.drawingml.chart+xml": "TODO",
|
|
/* Chart Colors */
|
|
"application/vnd.ms-office.chartcolorstyle+xml": "TODO",
|
|
/* Chart Style */
|
|
"application/vnd.ms-office.chartstyle+xml": "TODO",
|
|
/* Chart Advanced */
|
|
"application/vnd.ms-office.chartex+xml": "TODO",
|
|
/* Calculation Chain */
|
|
"application/vnd.ms-excel.calcChain": "calcchains",
|
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml": "calcchains",
|
|
/* Printer Settings */
|
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings": "TODO",
|
|
/* ActiveX */
|
|
"application/vnd.ms-office.activeX": "TODO",
|
|
"application/vnd.ms-office.activeX+xml": "TODO",
|
|
/* Custom Toolbars */
|
|
"application/vnd.ms-excel.attachedToolbars": "TODO",
|
|
/* External Data Connections */
|
|
"application/vnd.ms-excel.connections": "TODO",
|
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": "TODO",
|
|
/* External Links */
|
|
"application/vnd.ms-excel.externalLink": "links",
|
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml": "links",
|
|
/* Metadata */
|
|
"application/vnd.ms-excel.sheetMetadata": "TODO",
|
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml": "TODO",
|
|
/* PivotCache */
|
|
"application/vnd.ms-excel.pivotCacheDefinition": "TODO",
|
|
"application/vnd.ms-excel.pivotCacheRecords": "TODO",
|
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml": "TODO",
|
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml": "TODO",
|
|
/* Query Table */
|
|
"application/vnd.ms-excel.queryTable": "TODO",
|
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml": "TODO",
|
|
/* Shared Workbook */
|
|
"application/vnd.ms-excel.userNames": "TODO",
|
|
"application/vnd.ms-excel.revisionHeaders": "TODO",
|
|
"application/vnd.ms-excel.revisionLog": "TODO",
|
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml": "TODO",
|
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml": "TODO",
|
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml": "TODO",
|
|
/* Single Cell Table */
|
|
"application/vnd.ms-excel.tableSingleCells": "TODO",
|
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml": "TODO",
|
|
/* Slicer */
|
|
"application/vnd.ms-excel.slicer": "TODO",
|
|
"application/vnd.ms-excel.slicerCache": "TODO",
|
|
"application/vnd.ms-excel.slicer+xml": "TODO",
|
|
"application/vnd.ms-excel.slicerCache+xml": "TODO",
|
|
/* Sort Map */
|
|
"application/vnd.ms-excel.wsSortMap": "TODO",
|
|
/* Table */
|
|
"application/vnd.ms-excel.table": "TODO",
|
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": "TODO",
|
|
/* Themes */
|
|
"application/vnd.openxmlformats-officedocument.theme+xml": "themes",
|
|
/* Theme Override */
|
|
"application/vnd.openxmlformats-officedocument.themeOverride+xml": "TODO",
|
|
/* Timeline */
|
|
"application/vnd.ms-excel.Timeline+xml": "TODO",
|
|
/* verify */
|
|
"application/vnd.ms-excel.TimelineCache+xml": "TODO",
|
|
/* verify */
|
|
|
|
/* VBA */
|
|
"application/vnd.ms-office.vbaProject": "vba",
|
|
"application/vnd.ms-office.vbaProjectSignature": "vba",
|
|
/* Volatile Dependencies */
|
|
"application/vnd.ms-office.volatileDependencies": "TODO",
|
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml": "TODO",
|
|
/* Control Properties */
|
|
"application/vnd.ms-excel.controlproperties+xml": "TODO",
|
|
/* Data Model */
|
|
"application/vnd.openxmlformats-officedocument.model+data": "TODO",
|
|
/* Survey */
|
|
"application/vnd.ms-excel.Survey+xml": "TODO",
|
|
/* Drawing */
|
|
"application/vnd.openxmlformats-officedocument.drawing+xml": "drawings",
|
|
"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": "TODO",
|
|
"application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml": "TODO",
|
|
"application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml": "TODO",
|
|
"application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml": "TODO",
|
|
"application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml": "TODO",
|
|
/* VML */
|
|
"application/vnd.openxmlformats-officedocument.vmlDrawing": "TODO",
|
|
"application/vnd.openxmlformats-package.relationships+xml": "rels",
|
|
"application/vnd.openxmlformats-officedocument.oleObject": "TODO",
|
|
/* Image */
|
|
"image/png": "TODO",
|
|
"sheet": "js"
|
|
};
|
|
var CT_LIST = function () {
|
|
var o = {
|
|
workbooks: {
|
|
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
|
|
xlsm: "application/vnd.ms-excel.sheet.macroEnabled.main+xml",
|
|
xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.main",
|
|
xlam: "application/vnd.ms-excel.addin.macroEnabled.main+xml",
|
|
xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml"
|
|
},
|
|
strs: {
|
|
/* Shared Strings */
|
|
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml",
|
|
xlsb: "application/vnd.ms-excel.sharedStrings"
|
|
},
|
|
comments: {
|
|
/* Comments */
|
|
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml",
|
|
xlsb: "application/vnd.ms-excel.comments"
|
|
},
|
|
sheets: {
|
|
/* Worksheet */
|
|
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",
|
|
xlsb: "application/vnd.ms-excel.worksheet"
|
|
},
|
|
charts: {
|
|
/* Chartsheet */
|
|
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml",
|
|
xlsb: "application/vnd.ms-excel.chartsheet"
|
|
},
|
|
dialogs: {
|
|
/* Dialogsheet */
|
|
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml",
|
|
xlsb: "application/vnd.ms-excel.dialogsheet"
|
|
},
|
|
macros: {
|
|
/* Macrosheet (Excel 4.0 Macros) */
|
|
xlsx: "application/vnd.ms-excel.macrosheet+xml",
|
|
xlsb: "application/vnd.ms-excel.macrosheet"
|
|
},
|
|
styles: {
|
|
/* Styles */
|
|
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml",
|
|
xlsb: "application/vnd.ms-excel.styles"
|
|
}
|
|
};
|
|
keys(o).forEach(function (k) {
|
|
["xlsm", "xlam"].forEach(function (v) {
|
|
if (!o[k][v]) o[k][v] = o[k].xlsx;
|
|
});
|
|
});
|
|
keys(o).forEach(function (k) {
|
|
keys(o[k]).forEach(function (v) {
|
|
ct2type[o[k][v]] = k;
|
|
});
|
|
});
|
|
return o;
|
|
}();
|
|
var type2ct /*{[string]:Array<string>}*/ = evert_arr(ct2type);
|
|
XMLNS.CT = 'http://schemas.openxmlformats.org/package/2006/content-types';
|
|
function new_ct() {
|
|
return {
|
|
workbooks: [],
|
|
sheets: [],
|
|
charts: [],
|
|
dialogs: [],
|
|
macros: [],
|
|
rels: [],
|
|
strs: [],
|
|
comments: [],
|
|
links: [],
|
|
coreprops: [],
|
|
extprops: [],
|
|
custprops: [],
|
|
themes: [],
|
|
styles: [],
|
|
calcchains: [],
|
|
vba: [],
|
|
drawings: [],
|
|
TODO: [],
|
|
xmlns: ""
|
|
};
|
|
}
|
|
function parse_ct(data) {
|
|
var ct = new_ct();
|
|
if (!data || !data.match) return ct;
|
|
var ctext = {};
|
|
(data.match(tagregex) || []).forEach(function (x) {
|
|
var y = parsexmltag(x);
|
|
switch (y[0].replace(nsregex, "<")) {
|
|
case '<?xml':
|
|
break;
|
|
case '<Types':
|
|
ct.xmlns = y['xmlns' + (y[0].match(/<(\w+):/) || ["", ""])[1]];
|
|
break;
|
|
case '<Default':
|
|
ctext[y.Extension] = y.ContentType;
|
|
break;
|
|
case '<Override':
|
|
if (ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName);
|
|
break;
|
|
}
|
|
});
|
|
if (ct.xmlns !== XMLNS.CT) throw new Error("Unknown Namespace: " + ct.xmlns);
|
|
ct.calcchain = ct.calcchains.length > 0 ? ct.calcchains[0] : "";
|
|
ct.sst = ct.strs.length > 0 ? ct.strs[0] : "";
|
|
ct.style = ct.styles.length > 0 ? ct.styles[0] : "";
|
|
ct.defaults = ctext;
|
|
delete ct.calcchains;
|
|
return ct;
|
|
}
|
|
var CTYPE_XML_ROOT = writextag('Types', null, {
|
|
'xmlns': XMLNS.CT,
|
|
'xmlns:xsd': XMLNS.xsd,
|
|
'xmlns:xsi': XMLNS.xsi
|
|
});
|
|
var CTYPE_DEFAULTS = [['xml', 'application/xml'], ['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'], ['vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'], ['data', 'application/vnd.openxmlformats-officedocument.model+data'], /* from test files */
|
|
['bmp', 'image/bmp'], ['png', 'image/png'], ['gif', 'image/gif'], ['emf', 'image/x-emf'], ['wmf', 'image/x-wmf'], ['jpg', 'image/jpeg'], ['jpeg', 'image/jpeg'], ['tif', 'image/tiff'], ['tiff', 'image/tiff'], ['pdf', 'application/pdf'], ['rels', type2ct.rels[0]]].map(function (x) {
|
|
return writextag('Default', null, {
|
|
'Extension': x[0],
|
|
'ContentType': x[1]
|
|
});
|
|
});
|
|
function write_ct(ct, opts) {
|
|
var o = [],
|
|
v;
|
|
o[o.length] = XML_HEADER;
|
|
o[o.length] = CTYPE_XML_ROOT;
|
|
o = o.concat(CTYPE_DEFAULTS);
|
|
|
|
/* only write first instance */
|
|
var f1 = function f1(w) {
|
|
if (ct[w] && ct[w].length > 0) {
|
|
v = ct[w][0];
|
|
o[o.length] = writextag('Override', null, {
|
|
'PartName': (v[0] == '/' ? "" : "/") + v,
|
|
'ContentType': CT_LIST[w][opts.bookType || 'xlsx']
|
|
});
|
|
}
|
|
};
|
|
|
|
/* book type-specific */
|
|
var f2 = function f2(w) {
|
|
(ct[w] || []).forEach(function (v) {
|
|
o[o.length] = writextag('Override', null, {
|
|
'PartName': (v[0] == '/' ? "" : "/") + v,
|
|
'ContentType': CT_LIST[w][opts.bookType || 'xlsx']
|
|
});
|
|
});
|
|
};
|
|
|
|
/* standard type */
|
|
var f3 = function f3(t) {
|
|
(ct[t] || []).forEach(function (v) {
|
|
o[o.length] = writextag('Override', null, {
|
|
'PartName': (v[0] == '/' ? "" : "/") + v,
|
|
'ContentType': type2ct[t][0]
|
|
});
|
|
});
|
|
};
|
|
f1('workbooks');
|
|
f2('sheets');
|
|
f2('charts');
|
|
f3('themes');
|
|
['strs', 'styles'].forEach(f1);
|
|
['coreprops', 'extprops', 'custprops'].forEach(f3);
|
|
f3('vba');
|
|
f3('comments');
|
|
f3('drawings');
|
|
if (o.length > 2) {
|
|
o[o.length] = '</Types>';
|
|
o[1] = o[1].replace("/>", ">");
|
|
}
|
|
return o.join("");
|
|
}
|
|
/* 9.3 Relationships */
|
|
var RELS = {
|
|
WB: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument",
|
|
SHEET: "http://sheetjs.openxmlformats.org/officeDocument/2006/relationships/officeDocument",
|
|
HLINK: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink",
|
|
VML: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing",
|
|
XPATH: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLinkPath",
|
|
XMISS: "http://schemas.microsoft.com/office/2006/relationships/xlExternalLinkPath/xlPathMissing",
|
|
XLINK: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLink",
|
|
CXML: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml",
|
|
CXMLP: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps",
|
|
VBA: "http://schemas.microsoft.com/office/2006/relationships/vbaProject"
|
|
};
|
|
|
|
/* 9.3.3 Representing Relationships */
|
|
function get_rels_path(file) {
|
|
var n = file.lastIndexOf("/");
|
|
return file.slice(0, n + 1) + '_rels/' + file.slice(n + 1) + ".rels";
|
|
}
|
|
function parse_rels(data, currentFilePath) {
|
|
var rels = {
|
|
"!id": {}
|
|
};
|
|
if (!data) return rels;
|
|
if (currentFilePath.charAt(0) !== '/') {
|
|
currentFilePath = '/' + currentFilePath;
|
|
}
|
|
var hash = {};
|
|
(data.match(tagregex) || []).forEach(function (x) {
|
|
var y = parsexmltag(x);
|
|
/* 9.3.2.2 OPC_Relationships */
|
|
if (y[0] === '<Relationship') {
|
|
var rel = {};
|
|
rel.Type = y.Type;
|
|
rel.Target = y.Target;
|
|
rel.Id = y.Id;
|
|
if (y.TargetMode) rel.TargetMode = y.TargetMode;
|
|
var canonictarget = y.TargetMode === 'External' ? y.Target : resolve_path(y.Target, currentFilePath);
|
|
rels[canonictarget] = rel;
|
|
hash[y.Id] = rel;
|
|
}
|
|
});
|
|
rels["!id"] = hash;
|
|
return rels;
|
|
}
|
|
XMLNS.RELS = 'http://schemas.openxmlformats.org/package/2006/relationships';
|
|
var RELS_ROOT = writextag('Relationships', null, {
|
|
//'xmlns:ns0': XMLNS.RELS,
|
|
'xmlns': XMLNS.RELS
|
|
});
|
|
|
|
/* TODO */
|
|
function write_rels(rels) {
|
|
var o = [XML_HEADER, RELS_ROOT];
|
|
keys(rels['!id']).forEach(function (rid) {
|
|
o[o.length] = writextag('Relationship', null, rels['!id'][rid]);
|
|
});
|
|
if (o.length > 2) {
|
|
o[o.length] = '</Relationships>';
|
|
o[1] = o[1].replace("/>", ">");
|
|
}
|
|
return o.join("");
|
|
}
|
|
var RELS_EXTERN = [RELS.HLINK, RELS.XPATH, RELS.XMISS];
|
|
function add_rels(rels, rId, f, type, relobj, targetmode) {
|
|
if (!relobj) relobj = {};
|
|
if (!rels['!id']) rels['!id'] = {};
|
|
if (rId < 0) for (rId = 1; rels['!id']['rId' + rId]; ++rId) {/* empty */}
|
|
relobj.Id = 'rId' + rId;
|
|
relobj.Type = type;
|
|
relobj.Target = f;
|
|
if (targetmode) relobj.TargetMode = targetmode;else if (RELS_EXTERN.indexOf(relobj.Type) > -1) relobj.TargetMode = "External";
|
|
if (rels['!id'][relobj.Id]) throw new Error("Cannot rewrite rId " + rId);
|
|
rels['!id'][relobj.Id] = relobj;
|
|
rels[('/' + relobj.Target).replace("//", "/")] = relobj;
|
|
return rId;
|
|
}
|
|
/* ECMA-376 Part II 11.1 Core Properties Part */
|
|
/* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */
|
|
var CORE_PROPS = [["cp:category", "Category"], ["cp:contentStatus", "ContentStatus"], ["cp:keywords", "Keywords"], ["cp:lastModifiedBy", "LastAuthor"], ["cp:lastPrinted", "LastPrinted"], ["cp:revision", "RevNumber"], ["cp:version", "Version"], ["dc:creator", "Author"], ["dc:description", "Comments"], ["dc:identifier", "Identifier"], ["dc:language", "Language"], ["dc:subject", "Subject"], ["dc:title", "Title"], ["dcterms:created", "CreatedDate", 'date'], ["dcterms:modified", "ModifiedDate", 'date']];
|
|
XMLNS.CORE_PROPS = "http://schemas.openxmlformats.org/package/2006/metadata/core-properties";
|
|
RELS.CORE_PROPS = 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties';
|
|
var CORE_PROPS_REGEX = function () {
|
|
var r = new Array(CORE_PROPS.length);
|
|
for (var i = 0; i < CORE_PROPS.length; ++i) {
|
|
var f = CORE_PROPS[i];
|
|
var g = "(?:" + f[0].slice(0, f[0].indexOf(":")) + ":)" + f[0].slice(f[0].indexOf(":") + 1);
|
|
r[i] = new RegExp("<" + g + "[^>]*>([\\s\\S]*?)<\/" + g + ">");
|
|
}
|
|
return r;
|
|
}();
|
|
function parse_core_props(data) {
|
|
var p = {};
|
|
data = utf8read(data);
|
|
for (var i = 0; i < CORE_PROPS.length; ++i) {
|
|
var f = CORE_PROPS[i],
|
|
cur = data.match(CORE_PROPS_REGEX[i]);
|
|
if (cur != null && cur.length > 0) p[f[1]] = unescapexml(cur[1]);
|
|
if (f[2] === 'date' && p[f[1]]) p[f[1]] = parseDate(p[f[1]]);
|
|
}
|
|
return p;
|
|
}
|
|
var CORE_PROPS_XML_ROOT = writextag('cp:coreProperties', null, {
|
|
//'xmlns': XMLNS.CORE_PROPS,
|
|
'xmlns:cp': XMLNS.CORE_PROPS,
|
|
'xmlns:dc': XMLNS.dc,
|
|
'xmlns:dcterms': XMLNS.dcterms,
|
|
'xmlns:dcmitype': XMLNS.dcmitype,
|
|
'xmlns:xsi': XMLNS.xsi
|
|
});
|
|
function cp_doit(f, g, h, o, p) {
|
|
if (p[f] != null || g == null || g === "") return;
|
|
p[f] = g;
|
|
g = escapexml(g);
|
|
o[o.length] = h ? writextag(f, g, h) : writetag(f, g);
|
|
}
|
|
function write_core_props(cp, _opts) {
|
|
var opts = _opts || {};
|
|
var o = [XML_HEADER, CORE_PROPS_XML_ROOT],
|
|
p = {};
|
|
if (!cp && !opts.Props) return o.join("");
|
|
if (cp) {
|
|
if (cp.CreatedDate != null) cp_doit("dcterms:created", typeof cp.CreatedDate === "string" ? cp.CreatedDate : write_w3cdtf(cp.CreatedDate, opts.WTF), {
|
|
"xsi:type": "dcterms:W3CDTF"
|
|
}, o, p);
|
|
if (cp.ModifiedDate != null) cp_doit("dcterms:modified", typeof cp.ModifiedDate === "string" ? cp.ModifiedDate : write_w3cdtf(cp.ModifiedDate, opts.WTF), {
|
|
"xsi:type": "dcterms:W3CDTF"
|
|
}, o, p);
|
|
}
|
|
for (var i = 0; i != CORE_PROPS.length; ++i) {
|
|
var f = CORE_PROPS[i];
|
|
var v = opts.Props && opts.Props[f[1]] != null ? opts.Props[f[1]] : cp ? cp[f[1]] : null;
|
|
if (v === true) v = "1";else if (v === false) v = "0";else if (typeof v == "number") v = String(v);
|
|
if (v != null) cp_doit(f[0], v, null, o, p);
|
|
}
|
|
if (o.length > 2) {
|
|
o[o.length] = '</cp:coreProperties>';
|
|
o[1] = o[1].replace("/>", ">");
|
|
}
|
|
return o.join("");
|
|
}
|
|
/* 15.2.12.3 Extended File Properties Part */
|
|
/* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */
|
|
var EXT_PROPS = [["Application", "Application", "string"], ["AppVersion", "AppVersion", "string"], ["Company", "Company", "string"], ["DocSecurity", "DocSecurity", "string"], ["Manager", "Manager", "string"], ["HyperlinksChanged", "HyperlinksChanged", "bool"], ["SharedDoc", "SharedDoc", "bool"], ["LinksUpToDate", "LinksUpToDate", "bool"], ["ScaleCrop", "ScaleCrop", "bool"], ["HeadingPairs", "HeadingPairs", "raw"], ["TitlesOfParts", "TitlesOfParts", "raw"]];
|
|
XMLNS.EXT_PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties";
|
|
RELS.EXT_PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties';
|
|
var PseudoPropsPairs = ["Worksheets", "SheetNames", "NamedRanges", "DefinedNames", "Chartsheets", "ChartNames"];
|
|
function load_props_pairs(HP, TOP, props, opts) {
|
|
var v = [];
|
|
if (typeof HP == "string") v = parseVector(HP, opts);else for (var j = 0; j < HP.length; ++j) {
|
|
v = v.concat(HP[j].map(function (hp) {
|
|
return {
|
|
v: hp
|
|
};
|
|
}));
|
|
}
|
|
var parts = typeof TOP == "string" ? parseVector(TOP, opts).map(function (x) {
|
|
return x.v;
|
|
}) : TOP;
|
|
var idx = 0,
|
|
len = 0;
|
|
if (parts.length > 0) for (var i = 0; i !== v.length; i += 2) {
|
|
len = +v[i + 1].v;
|
|
switch (v[i].v) {
|
|
case "Worksheets":
|
|
case "工作表":
|
|
case "Листы":
|
|
case "أوراق العمل":
|
|
case "ワークシート":
|
|
case "גליונות עבודה":
|
|
case "Arbeitsblätter":
|
|
case "Çalışma Sayfaları":
|
|
case "Feuilles de calcul":
|
|
case "Fogli di lavoro":
|
|
case "Folhas de cálculo":
|
|
case "Planilhas":
|
|
case "Regneark":
|
|
case "Hojas de cálculo":
|
|
case "Werkbladen":
|
|
props.Worksheets = len;
|
|
props.SheetNames = parts.slice(idx, idx + len);
|
|
break;
|
|
case "Named Ranges":
|
|
case "Rangos con nombre":
|
|
case "名前付き一覧":
|
|
case "Benannte Bereiche":
|
|
case "Navngivne områder":
|
|
props.NamedRanges = len;
|
|
props.DefinedNames = parts.slice(idx, idx + len);
|
|
break;
|
|
case "Charts":
|
|
case "Diagramme":
|
|
props.Chartsheets = len;
|
|
props.ChartNames = parts.slice(idx, idx + len);
|
|
break;
|
|
}
|
|
idx += len;
|
|
}
|
|
}
|
|
function parse_ext_props(data, p, opts) {
|
|
var q = {};
|
|
if (!p) p = {};
|
|
data = utf8read(data);
|
|
EXT_PROPS.forEach(function (f) {
|
|
var xml = (data.match(matchtag(f[0])) || [])[1];
|
|
switch (f[2]) {
|
|
case "string":
|
|
if (xml) p[f[1]] = unescapexml(xml);
|
|
break;
|
|
case "bool":
|
|
p[f[1]] = xml === "true";
|
|
break;
|
|
case "raw":
|
|
var cur = data.match(new RegExp("<" + f[0] + "[^>]*>([\\s\\S]*?)<\/" + f[0] + ">"));
|
|
if (cur && cur.length > 0) q[f[1]] = cur[1];
|
|
break;
|
|
}
|
|
});
|
|
if (q.HeadingPairs && q.TitlesOfParts) load_props_pairs(q.HeadingPairs, q.TitlesOfParts, p, opts);
|
|
return p;
|
|
}
|
|
var EXT_PROPS_XML_ROOT = writextag('Properties', null, {
|
|
'xmlns': XMLNS.EXT_PROPS,
|
|
'xmlns:vt': XMLNS.vt
|
|
});
|
|
function write_ext_props(cp) {
|
|
var o = [],
|
|
W = writextag;
|
|
if (!cp) cp = {};
|
|
cp.Application = "SheetJS";
|
|
o[o.length] = XML_HEADER;
|
|
o[o.length] = EXT_PROPS_XML_ROOT;
|
|
EXT_PROPS.forEach(function (f) {
|
|
if (cp[f[1]] === undefined) return;
|
|
var v;
|
|
switch (f[2]) {
|
|
case 'string':
|
|
v = escapexml(String(cp[f[1]]));
|
|
break;
|
|
case 'bool':
|
|
v = cp[f[1]] ? 'true' : 'false';
|
|
break;
|
|
}
|
|
if (v !== undefined) o[o.length] = W(f[0], v);
|
|
});
|
|
|
|
/* TODO: HeadingPairs, TitlesOfParts */
|
|
o[o.length] = W('HeadingPairs', W('vt:vector', W('vt:variant', '<vt:lpstr>Worksheets</vt:lpstr>') + W('vt:variant', W('vt:i4', String(cp.Worksheets))), {
|
|
size: 2,
|
|
baseType: "variant"
|
|
}));
|
|
o[o.length] = W('TitlesOfParts', W('vt:vector', cp.SheetNames.map(function (s) {
|
|
return "<vt:lpstr>" + escapexml(s) + "</vt:lpstr>";
|
|
}).join(""), {
|
|
size: cp.Worksheets,
|
|
baseType: "lpstr"
|
|
}));
|
|
if (o.length > 2) {
|
|
o[o.length] = '</Properties>';
|
|
o[1] = o[1].replace("/>", ">");
|
|
}
|
|
return o.join("");
|
|
}
|
|
/* 15.2.12.2 Custom File Properties Part */
|
|
XMLNS.CUST_PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties";
|
|
RELS.CUST_PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties';
|
|
var custregex = /<[^>]+>[^<]*/g;
|
|
function parse_cust_props(data, opts) {
|
|
var p = {},
|
|
name = "";
|
|
var m = data.match(custregex);
|
|
if (m) for (var i = 0; i != m.length; ++i) {
|
|
var x = m[i],
|
|
y = parsexmltag(x);
|
|
switch (y[0]) {
|
|
case '<?xml':
|
|
break;
|
|
case '<Properties':
|
|
break;
|
|
case '<property':
|
|
name = unescapexml(y.name);
|
|
break;
|
|
case '</property>':
|
|
name = null;
|
|
break;
|
|
default:
|
|
if (x.indexOf('<vt:') === 0) {
|
|
var toks = x.split('>');
|
|
var type = toks[0].slice(4),
|
|
text = toks[1];
|
|
/* 22.4.2.32 (CT_Variant). Omit the binary types from 22.4 (Variant Types) */
|
|
switch (type) {
|
|
case 'lpstr':
|
|
case 'bstr':
|
|
case 'lpwstr':
|
|
p[name] = unescapexml(text);
|
|
break;
|
|
case 'bool':
|
|
p[name] = parsexmlbool(text);
|
|
break;
|
|
case 'i1':
|
|
case 'i2':
|
|
case 'i4':
|
|
case 'i8':
|
|
case 'int':
|
|
case 'uint':
|
|
p[name] = parseInt(text, 10);
|
|
break;
|
|
case 'r4':
|
|
case 'r8':
|
|
case 'decimal':
|
|
p[name] = parseFloat(text);
|
|
break;
|
|
case 'filetime':
|
|
case 'date':
|
|
p[name] = parseDate(text);
|
|
break;
|
|
case 'cy':
|
|
case 'error':
|
|
p[name] = unescapexml(text);
|
|
break;
|
|
default:
|
|
if (type.slice(-1) == '/') break;
|
|
if (opts.WTF && typeof console !== 'undefined') console.warn('Unexpected', x, type, toks);
|
|
}
|
|
} else if (x.slice(0, 2) === "</") {/* empty */
|
|
} else if (opts.WTF) throw new Error(x);
|
|
}
|
|
}
|
|
return p;
|
|
}
|
|
var CUST_PROPS_XML_ROOT = writextag('Properties', null, {
|
|
'xmlns': XMLNS.CUST_PROPS,
|
|
'xmlns:vt': XMLNS.vt
|
|
});
|
|
function write_cust_props(cp) {
|
|
var o = [XML_HEADER, CUST_PROPS_XML_ROOT];
|
|
if (!cp) return o.join("");
|
|
var pid = 1;
|
|
keys(cp).forEach(function custprop(k) {
|
|
++pid;
|
|
o[o.length] = writextag('property', write_vt(cp[k], true), {
|
|
'fmtid': '{D5CDD505-2E9C-101B-9397-08002B2CF9AE}',
|
|
'pid': pid,
|
|
'name': escapexml(k)
|
|
});
|
|
});
|
|
if (o.length > 2) {
|
|
o[o.length] = '</Properties>';
|
|
o[1] = o[1].replace("/>", ">");
|
|
}
|
|
return o.join("");
|
|
}
|
|
/* from js-harb (C) 2014-present SheetJS */
|
|
var DBF = function () {
|
|
var dbf_codepage_map = {
|
|
/* Code Pages Supported by Visual FoxPro */
|
|
0x01: 437,
|
|
0x02: 850,
|
|
0x03: 1252,
|
|
0x04: 10000,
|
|
0x64: 852,
|
|
0x65: 866,
|
|
0x66: 865,
|
|
0x67: 861,
|
|
0x68: 895,
|
|
0x69: 620,
|
|
0x6A: 737,
|
|
0x6B: 857,
|
|
0x78: 950,
|
|
0x79: 949,
|
|
0x7A: 936,
|
|
0x7B: 932,
|
|
0x7C: 874,
|
|
0x7D: 1255,
|
|
0x7E: 1256,
|
|
0x96: 10007,
|
|
0x97: 10029,
|
|
0x98: 10006,
|
|
0xC8: 1250,
|
|
0xC9: 1251,
|
|
0xCA: 1254,
|
|
0xCB: 1253,
|
|
/* shapefile DBF extension */
|
|
0x00: 20127,
|
|
0x08: 865,
|
|
0x09: 437,
|
|
0x0A: 850,
|
|
0x0B: 437,
|
|
0x0D: 437,
|
|
0x0E: 850,
|
|
0x0F: 437,
|
|
0x10: 850,
|
|
0x11: 437,
|
|
0x12: 850,
|
|
0x13: 932,
|
|
0x14: 850,
|
|
0x15: 437,
|
|
0x16: 850,
|
|
0x17: 865,
|
|
0x18: 437,
|
|
0x19: 437,
|
|
0x1A: 850,
|
|
0x1B: 437,
|
|
0x1C: 863,
|
|
0x1D: 850,
|
|
0x1F: 852,
|
|
0x22: 852,
|
|
0x23: 852,
|
|
0x24: 860,
|
|
0x25: 850,
|
|
0x26: 866,
|
|
0x37: 850,
|
|
0x40: 852,
|
|
0x4D: 936,
|
|
0x4E: 949,
|
|
0x4F: 950,
|
|
0x50: 874,
|
|
0x57: 1252,
|
|
0x58: 1252,
|
|
0x59: 1252,
|
|
0x6C: 863,
|
|
0x86: 737,
|
|
0x87: 852,
|
|
0x88: 857,
|
|
0xCC: 1257,
|
|
0xFF: 16969
|
|
};
|
|
var dbf_reverse_map = evert({
|
|
0x01: 437,
|
|
0x02: 850,
|
|
0x03: 1252,
|
|
0x04: 10000,
|
|
0x64: 852,
|
|
0x65: 866,
|
|
0x66: 865,
|
|
0x67: 861,
|
|
0x68: 895,
|
|
0x69: 620,
|
|
0x6A: 737,
|
|
0x6B: 857,
|
|
0x78: 950,
|
|
0x79: 949,
|
|
0x7A: 936,
|
|
0x7B: 932,
|
|
0x7C: 874,
|
|
0x7D: 1255,
|
|
0x7E: 1256,
|
|
0x96: 10007,
|
|
0x97: 10029,
|
|
0x98: 10006,
|
|
0xC8: 1250,
|
|
0xC9: 1251,
|
|
0xCA: 1254,
|
|
0xCB: 1253,
|
|
0x00: 20127
|
|
});
|
|
var DBF_SUPPORTED_VERSIONS = [0x02, 0x03, 0x30, 0x31, 0x83, 0x8B, 0x8C, 0xF5];
|
|
/* TODO: find an actual specification */
|
|
function dbf_to_aoa(buf, opts) {
|
|
var out = [];
|
|
var d = new_raw_buf(1);
|
|
switch (opts.type) {
|
|
case 'base64':
|
|
d = s2a(Base64.decode(buf));
|
|
break;
|
|
case 'binary':
|
|
d = s2a(buf);
|
|
break;
|
|
case 'buffer':
|
|
case 'array':
|
|
d = buf;
|
|
break;
|
|
}
|
|
prep_blob(d, 0);
|
|
|
|
/* header */
|
|
var ft = d.read_shift(1);
|
|
var memo = !!(ft & 0x88);
|
|
var vfp = false,
|
|
l7 = false;
|
|
switch (ft) {
|
|
case 0x02:
|
|
break;
|
|
// dBASE II
|
|
case 0x03:
|
|
break;
|
|
// dBASE III
|
|
case 0x30:
|
|
vfp = true;
|
|
memo = true;
|
|
break;
|
|
// VFP
|
|
case 0x31:
|
|
vfp = true;
|
|
memo = true;
|
|
break;
|
|
// VFP with autoincrement
|
|
// 0x43 dBASE IV SQL table files
|
|
// 0x63 dBASE IV SQL system files
|
|
case 0x83:
|
|
break;
|
|
// dBASE III with memo
|
|
case 0x8B:
|
|
break;
|
|
// dBASE IV with memo
|
|
case 0x8C:
|
|
l7 = true;
|
|
break;
|
|
// dBASE Level 7 with memo
|
|
// case 0xCB dBASE IV SQL table files with memo
|
|
case 0xF5:
|
|
break;
|
|
// FoxPro 2.x with memo
|
|
// case 0xFB FoxBASE
|
|
default:
|
|
throw new Error("DBF Unsupported Version: " + ft.toString(16));
|
|
}
|
|
var nrow = 0,
|
|
fpos = 0x0209;
|
|
if (ft == 0x02) nrow = d.read_shift(2);
|
|
d.l += 3; // dBASE II stores DDMMYY date, others use YYMMDD
|
|
if (ft != 0x02) nrow = d.read_shift(4);
|
|
if (nrow > 1048576) nrow = 1e6;
|
|
if (ft != 0x02) fpos = d.read_shift(2); // header length
|
|
var rlen = d.read_shift(2); // record length
|
|
|
|
var /*flags = 0,*/current_cp = opts.codepage || 1252;
|
|
if (ft != 0x02) {
|
|
// 20 reserved bytes
|
|
d.l += 16;
|
|
/*flags = */
|
|
d.read_shift(1);
|
|
//if(memo && ((flags & 0x02) === 0)) throw new Error("DBF Flags " + flags.toString(16) + " ft " + ft.toString(16));
|
|
|
|
/* codepage present in FoxPro and dBASE Level 7 */
|
|
if (d[d.l] !== 0) current_cp = dbf_codepage_map[d[d.l]];
|
|
d.l += 1;
|
|
d.l += 2;
|
|
}
|
|
if (l7) d.l += 36; // Level 7: 32 byte "Language driver name", 4 byte reserved
|
|
|
|
var fields = [],
|
|
field = {};
|
|
var hend = Math.min(d.length, ft == 0x02 ? 0x209 : fpos - 10 - (vfp ? 264 : 0));
|
|
var ww = l7 ? 32 : 11;
|
|
while (d.l < hend && d[d.l] != 0x0d) {
|
|
field = {};
|
|
field.name = cptable.utils.decode(current_cp, d.slice(d.l, d.l + ww)).replace(/[\u0000\r\n].*$/g, "");
|
|
d.l += ww;
|
|
field.type = String.fromCharCode(d.read_shift(1));
|
|
if (ft != 0x02 && !l7) field.offset = d.read_shift(4);
|
|
field.len = d.read_shift(1);
|
|
if (ft == 0x02) field.offset = d.read_shift(2);
|
|
field.dec = d.read_shift(1);
|
|
if (field.name.length) fields.push(field);
|
|
if (ft != 0x02) d.l += l7 ? 13 : 14;
|
|
switch (field.type) {
|
|
case 'B':
|
|
// Double (VFP) / Binary (dBASE L7)
|
|
if ((!vfp || field.len != 8) && opts.WTF) console.log('Skipping ' + field.name + ':' + field.type);
|
|
break;
|
|
case 'G': // General (FoxPro and dBASE L7)
|
|
case 'P':
|
|
// Picture (FoxPro and dBASE L7)
|
|
if (opts.WTF) console.log('Skipping ' + field.name + ':' + field.type);
|
|
break;
|
|
case '+': // Autoincrement (dBASE L7 only)
|
|
case '0': // _NullFlags (VFP only)
|
|
case '@': // Timestamp (dBASE L7 only)
|
|
case 'C': // Character (dBASE II)
|
|
case 'D': // Date (dBASE III)
|
|
case 'F': // Float (dBASE IV)
|
|
case 'I': // Long (VFP and dBASE L7)
|
|
case 'L': // Logical (dBASE II)
|
|
case 'M': // Memo (dBASE III)
|
|
case 'N': // Number (dBASE II)
|
|
case 'O': // Double (dBASE L7 only)
|
|
case 'T': // Datetime (VFP only)
|
|
case 'Y':
|
|
// Currency (VFP only)
|
|
break;
|
|
default:
|
|
throw new Error('Unknown Field Type: ' + field.type);
|
|
}
|
|
}
|
|
if (d[d.l] !== 0x0D) d.l = fpos - 1;
|
|
if (d.read_shift(1) !== 0x0D) throw new Error("DBF Terminator not found " + d.l + " " + d[d.l]);
|
|
d.l = fpos;
|
|
|
|
/* data */
|
|
var R = 0,
|
|
C = 0;
|
|
out[0] = [];
|
|
for (C = 0; C != fields.length; ++C) {
|
|
out[0][C] = fields[C].name;
|
|
}
|
|
while (nrow-- > 0) {
|
|
if (d[d.l] === 0x2A) {
|
|
// TODO: record marked as deleted -- create a hidden row?
|
|
d.l += rlen;
|
|
continue;
|
|
}
|
|
++d.l;
|
|
out[++R] = [];
|
|
C = 0;
|
|
for (C = 0; C != fields.length; ++C) {
|
|
var dd = d.slice(d.l, d.l + fields[C].len);
|
|
d.l += fields[C].len;
|
|
prep_blob(dd, 0);
|
|
var s = cptable.utils.decode(current_cp, dd);
|
|
switch (fields[C].type) {
|
|
case 'C':
|
|
// NOTE: it is conventional to write ' / / ' for empty dates
|
|
if (s.trim().length) out[R][C] = s.replace(/\s+$/, "");
|
|
break;
|
|
case 'D':
|
|
if (s.length === 8) out[R][C] = new Date(+s.slice(0, 4), +s.slice(4, 6) - 1, +s.slice(6, 8));else out[R][C] = s;
|
|
break;
|
|
case 'F':
|
|
out[R][C] = parseFloat(s.trim());
|
|
break;
|
|
case '+':
|
|
case 'I':
|
|
out[R][C] = l7 ? dd.read_shift(-4, 'i') ^ 0x80000000 : dd.read_shift(4, 'i');
|
|
break;
|
|
case 'L':
|
|
switch (s.trim().toUpperCase()) {
|
|
case 'Y':
|
|
case 'T':
|
|
out[R][C] = true;
|
|
break;
|
|
case 'N':
|
|
case 'F':
|
|
out[R][C] = false;
|
|
break;
|
|
case '':
|
|
case '?':
|
|
break;
|
|
default:
|
|
throw new Error("DBF Unrecognized L:|" + s + "|");
|
|
}
|
|
break;
|
|
case 'M':
|
|
/* TODO: handle memo files */
|
|
if (!memo) throw new Error("DBF Unexpected MEMO for type " + ft.toString(16));
|
|
out[R][C] = "##MEMO##" + (l7 ? parseInt(s.trim(), 10) : dd.read_shift(4));
|
|
break;
|
|
case 'N':
|
|
s = s.replace(/\u0000/g, "").trim();
|
|
// NOTE: dBASE II interprets " . " as 0
|
|
if (s && s != ".") out[R][C] = +s || 0;
|
|
break;
|
|
case '@':
|
|
// NOTE: dBASE specs appear to be incorrect
|
|
out[R][C] = new Date(dd.read_shift(-8, 'f') - 0x388317533400);
|
|
break;
|
|
case 'T':
|
|
out[R][C] = new Date((dd.read_shift(4) - 0x253D8C) * 0x5265C00 + dd.read_shift(4));
|
|
break;
|
|
case 'Y':
|
|
out[R][C] = dd.read_shift(4, 'i') / 1e4;
|
|
break;
|
|
case 'O':
|
|
out[R][C] = -dd.read_shift(-8, 'f');
|
|
break;
|
|
case 'B':
|
|
if (vfp && fields[C].len == 8) {
|
|
out[R][C] = dd.read_shift(8, 'f');
|
|
break;
|
|
}
|
|
/* falls through */
|
|
case 'G':
|
|
case 'P':
|
|
dd.l += fields[C].len;
|
|
break;
|
|
case '0':
|
|
if (fields[C].name === '_NullFlags') break;
|
|
/* falls through */
|
|
default:
|
|
throw new Error("DBF Unsupported data type " + fields[C].type);
|
|
}
|
|
}
|
|
}
|
|
if (ft != 0x02) if (d.l < d.length && d[d.l++] != 0x1A) throw new Error("DBF EOF Marker missing " + (d.l - 1) + " of " + d.length + " " + d[d.l - 1].toString(16));
|
|
if (opts && opts.sheetRows) out = out.slice(0, opts.sheetRows);
|
|
return out;
|
|
}
|
|
function dbf_to_sheet(buf, opts) {
|
|
var o = opts || {};
|
|
if (!o.dateNF) o.dateNF = "yyyymmdd";
|
|
return aoa_to_sheet(dbf_to_aoa(buf, o), o);
|
|
}
|
|
function dbf_to_workbook(buf, opts) {
|
|
try {
|
|
return sheet_to_workbook(dbf_to_sheet(buf, opts), opts);
|
|
} catch (e) {
|
|
if (opts && opts.WTF) throw e;
|
|
}
|
|
return {
|
|
SheetNames: [],
|
|
Sheets: {}
|
|
};
|
|
}
|
|
var _RLEN = {
|
|
'B': 8,
|
|
'C': 250,
|
|
'L': 1,
|
|
'D': 8,
|
|
'?': 0,
|
|
'': 0
|
|
};
|
|
function sheet_to_dbf(ws, opts) {
|
|
var o = opts || {};
|
|
if (+o.codepage >= 0) set_cp(+o.codepage);
|
|
if (o.type == "string") throw new Error("Cannot write DBF to JS string");
|
|
var ba = buf_array();
|
|
var aoa = sheet_to_json(ws, {
|
|
header: 1,
|
|
raw: true,
|
|
cellDates: true
|
|
});
|
|
var headers = aoa[0],
|
|
data = aoa.slice(1);
|
|
var i = 0,
|
|
j = 0,
|
|
hcnt = 0,
|
|
rlen = 1;
|
|
for (i = 0; i < headers.length; ++i) {
|
|
if (i == null) continue;
|
|
++hcnt;
|
|
if (typeof headers[i] === 'number') headers[i] = headers[i].toString(10);
|
|
if (typeof headers[i] !== 'string') throw new Error("DBF Invalid column name " + headers[i] + " |" + _typeof(headers[i]) + "|");
|
|
if (headers.indexOf(headers[i]) !== i) for (j = 0; j < 1024; ++j) {
|
|
if (headers.indexOf(headers[i] + "_" + j) == -1) {
|
|
headers[i] += "_" + j;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
var range = safe_decode_range(ws['!ref']);
|
|
var coltypes = [];
|
|
for (i = 0; i <= range.e.c - range.s.c; ++i) {
|
|
var col = [];
|
|
for (j = 0; j < data.length; ++j) {
|
|
if (data[j][i] != null) col.push(data[j][i]);
|
|
}
|
|
if (col.length == 0 || headers[i] == null) {
|
|
coltypes[i] = '?';
|
|
continue;
|
|
}
|
|
var guess = '',
|
|
_guess = '';
|
|
for (j = 0; j < col.length; ++j) {
|
|
switch (_typeof(col[j])) {
|
|
/* TODO: check if L2 compat is desired */
|
|
case 'number':
|
|
_guess = 'B';
|
|
break;
|
|
case 'string':
|
|
_guess = 'C';
|
|
break;
|
|
case 'boolean':
|
|
_guess = 'L';
|
|
break;
|
|
case 'object':
|
|
_guess = col[j] instanceof Date ? 'D' : 'C';
|
|
break;
|
|
default:
|
|
_guess = 'C';
|
|
}
|
|
guess = guess && guess != _guess ? 'C' : _guess;
|
|
if (guess == 'C') break;
|
|
}
|
|
rlen += _RLEN[guess] || 0;
|
|
coltypes[i] = guess;
|
|
}
|
|
var h = ba.next(32);
|
|
h.write_shift(4, 0x13021130);
|
|
h.write_shift(4, data.length);
|
|
h.write_shift(2, 296 + 32 * hcnt);
|
|
h.write_shift(2, rlen);
|
|
for (i = 0; i < 4; ++i) {
|
|
h.write_shift(4, 0);
|
|
}
|
|
h.write_shift(4, 0x00000000 | (+dbf_reverse_map[current_ansi] || 0x03) << 8);
|
|
for (i = 0, j = 0; i < headers.length; ++i) {
|
|
if (headers[i] == null) continue;
|
|
var hf = ba.next(32);
|
|
var _f = (headers[i].slice(-10) + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00").slice(0, 11);
|
|
hf.write_shift(1, _f, "sbcs");
|
|
hf.write_shift(1, coltypes[i] == '?' ? 'C' : coltypes[i], "sbcs");
|
|
hf.write_shift(4, j);
|
|
hf.write_shift(1, _RLEN[coltypes[i]] || 0);
|
|
hf.write_shift(1, 0);
|
|
hf.write_shift(1, 0x02);
|
|
hf.write_shift(4, 0);
|
|
hf.write_shift(1, 0);
|
|
hf.write_shift(4, 0);
|
|
hf.write_shift(4, 0);
|
|
j += _RLEN[coltypes[i]] || 0;
|
|
}
|
|
var hb = ba.next(264);
|
|
hb.write_shift(4, 0x0000000D);
|
|
for (i = 0; i < 65; ++i) {
|
|
hb.write_shift(4, 0x00000000);
|
|
}
|
|
for (i = 0; i < data.length; ++i) {
|
|
var rout = ba.next(rlen);
|
|
rout.write_shift(1, 0);
|
|
for (j = 0; j < headers.length; ++j) {
|
|
if (headers[j] == null) continue;
|
|
switch (coltypes[j]) {
|
|
case 'L':
|
|
rout.write_shift(1, data[i][j] == null ? 0x3F : data[i][j] ? 0x54 : 0x46);
|
|
break;
|
|
case 'B':
|
|
rout.write_shift(8, data[i][j] || 0, 'f');
|
|
break;
|
|
case 'D':
|
|
if (!data[i][j]) rout.write_shift(8, "00000000", "sbcs");else {
|
|
rout.write_shift(4, ("0000" + data[i][j].getFullYear()).slice(-4), "sbcs");
|
|
rout.write_shift(2, ("00" + (data[i][j].getMonth() + 1)).slice(-2), "sbcs");
|
|
rout.write_shift(2, ("00" + data[i][j].getDate()).slice(-2), "sbcs");
|
|
}
|
|
break;
|
|
case 'C':
|
|
var _s = String(data[i][j] || "");
|
|
rout.write_shift(1, _s, "sbcs");
|
|
for (hcnt = 0; hcnt < 250 - _s.length; ++hcnt) {
|
|
rout.write_shift(1, 0x20);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
// data
|
|
}
|
|
|
|
ba.next(1).write_shift(1, 0x1A);
|
|
return ba.end();
|
|
}
|
|
return {
|
|
versions: DBF_SUPPORTED_VERSIONS,
|
|
to_workbook: dbf_to_workbook,
|
|
to_sheet: dbf_to_sheet,
|
|
from_sheet: sheet_to_dbf
|
|
};
|
|
}();
|
|
var SYLK = function () {
|
|
/* TODO: stress test sequences */
|
|
var sylk_escapes = {
|
|
AA: 'À',
|
|
BA: 'Á',
|
|
CA: 'Â',
|
|
DA: 195,
|
|
HA: 'Ä',
|
|
JA: 197,
|
|
AE: 'È',
|
|
BE: 'É',
|
|
CE: 'Ê',
|
|
HE: 'Ë',
|
|
AI: 'Ì',
|
|
BI: 'Í',
|
|
CI: 'Î',
|
|
HI: 'Ï',
|
|
AO: 'Ò',
|
|
BO: 'Ó',
|
|
CO: 'Ô',
|
|
DO: 213,
|
|
HO: 'Ö',
|
|
AU: 'Ù',
|
|
BU: 'Ú',
|
|
CU: 'Û',
|
|
HU: 'Ü',
|
|
Aa: 'à',
|
|
Ba: 'á',
|
|
Ca: 'â',
|
|
Da: 227,
|
|
Ha: 'ä',
|
|
Ja: 229,
|
|
Ae: 'è',
|
|
Be: 'é',
|
|
Ce: 'ê',
|
|
He: 'ë',
|
|
Ai: 'ì',
|
|
Bi: 'í',
|
|
Ci: 'î',
|
|
Hi: 'ï',
|
|
Ao: 'ò',
|
|
Bo: 'ó',
|
|
Co: 'ô',
|
|
Do: 245,
|
|
Ho: 'ö',
|
|
Au: 'ù',
|
|
Bu: 'ú',
|
|
Cu: 'û',
|
|
Hu: 'ü',
|
|
KC: 'Ç',
|
|
Kc: 'ç',
|
|
q: 'æ',
|
|
z: 'œ',
|
|
a: 'Æ',
|
|
j: 'Œ',
|
|
DN: 209,
|
|
Dn: 241,
|
|
Hy: 255,
|
|
S: 169,
|
|
c: 170,
|
|
R: 174,
|
|
"B ": 180,
|
|
0: 176,
|
|
1: 177,
|
|
2: 178,
|
|
3: 179,
|
|
5: 181,
|
|
6: 182,
|
|
7: 183,
|
|
Q: 185,
|
|
k: 186,
|
|
b: 208,
|
|
i: 216,
|
|
l: 222,
|
|
s: 240,
|
|
y: 248,
|
|
"!": 161,
|
|
'"': 162,
|
|
"#": 163,
|
|
"(": 164,
|
|
"%": 165,
|
|
"'": 167,
|
|
"H ": 168,
|
|
"+": 171,
|
|
";": 187,
|
|
"<": 188,
|
|
"=": 189,
|
|
">": 190,
|
|
"?": 191,
|
|
"{": 223
|
|
};
|
|
var sylk_char_regex = new RegExp("\x1BN(" + keys(sylk_escapes).join("|").replace(/\|\|\|/, "|\\||").replace(/([?()+])/g, "\\$1") + "|\\|)", "gm");
|
|
var sylk_char_fn = function sylk_char_fn(_, $1) {
|
|
var o = sylk_escapes[$1];
|
|
return typeof o == "number" ? _getansi(o) : o;
|
|
};
|
|
var decode_sylk_char = function decode_sylk_char($$, $1, $2) {
|
|
var newcc = $1.charCodeAt(0) - 0x20 << 4 | $2.charCodeAt(0) - 0x30;
|
|
return newcc == 59 ? $$ : _getansi(newcc);
|
|
};
|
|
sylk_escapes["|"] = 254;
|
|
/* TODO: find an actual specification */
|
|
function sylk_to_aoa(d, opts) {
|
|
switch (opts.type) {
|
|
case 'base64':
|
|
return sylk_to_aoa_str(Base64.decode(d), opts);
|
|
case 'binary':
|
|
return sylk_to_aoa_str(d, opts);
|
|
case 'buffer':
|
|
return sylk_to_aoa_str(has_buf && Buffer.isBuffer(d) ? d.toString('binary') : a2s(d), opts);
|
|
case 'array':
|
|
return sylk_to_aoa_str(cc2str(d), opts);
|
|
}
|
|
throw new Error("Unrecognized type " + opts.type);
|
|
}
|
|
function sylk_to_aoa_str(str, opts) {
|
|
var records = str.split(/[\n\r]+/),
|
|
R = -1,
|
|
C = -1,
|
|
ri = 0,
|
|
rj = 0,
|
|
arr = [];
|
|
var formats = [];
|
|
var next_cell_format = null;
|
|
var sht = {},
|
|
rowinfo = [],
|
|
colinfo = [],
|
|
cw = [];
|
|
var Mval = 0,
|
|
j;
|
|
if (+opts.codepage >= 0) set_cp(+opts.codepage);
|
|
for (; ri !== records.length; ++ri) {
|
|
Mval = 0;
|
|
var rstr = records[ri].trim().replace(/\x1B([\x20-\x2F])([\x30-\x3F])/g, decode_sylk_char).replace(sylk_char_regex, sylk_char_fn);
|
|
var record = rstr.replace(/;;/g, "\0").split(";").map(function (x) {
|
|
return x.replace(/\u0000/g, ";");
|
|
});
|
|
var RT = record[0],
|
|
val;
|
|
if (rstr.length > 0) switch (RT) {
|
|
case 'ID':
|
|
break;
|
|
/* header */
|
|
case 'E':
|
|
break;
|
|
/* EOF */
|
|
case 'B':
|
|
break;
|
|
/* dimensions */
|
|
case 'O':
|
|
break;
|
|
/* options? */
|
|
case 'W':
|
|
break;
|
|
/* window? */
|
|
case 'P':
|
|
if (record[1].charAt(0) == 'P') formats.push(rstr.slice(3).replace(/;;/g, ";"));
|
|
break;
|
|
case 'C':
|
|
var C_seen_K = false,
|
|
C_seen_X = false,
|
|
C_seen_S = false,
|
|
C_seen_E = false,
|
|
_R = -1,
|
|
_C = -1;
|
|
for (rj = 1; rj < record.length; ++rj) {
|
|
switch (record[rj].charAt(0)) {
|
|
case 'A':
|
|
break;
|
|
// TODO: comment
|
|
case 'X':
|
|
C = parseInt(record[rj].slice(1)) - 1;
|
|
C_seen_X = true;
|
|
break;
|
|
case 'Y':
|
|
R = parseInt(record[rj].slice(1)) - 1;
|
|
if (!C_seen_X) C = 0;
|
|
for (j = arr.length; j <= R; ++j) {
|
|
arr[j] = [];
|
|
}
|
|
break;
|
|
case 'K':
|
|
val = record[rj].slice(1);
|
|
if (val.charAt(0) === '"') val = val.slice(1, val.length - 1);else if (val === 'TRUE') val = true;else if (val === 'FALSE') val = false;else if (!isNaN(fuzzynum(val))) {
|
|
val = fuzzynum(val);
|
|
if (next_cell_format !== null && SSF.is_date(next_cell_format)) val = numdate(val);
|
|
} else if (!isNaN(fuzzydate(val).getDate())) {
|
|
val = parseDate(val);
|
|
}
|
|
if (typeof cptable !== 'undefined' && typeof val == "string" && (opts || {}).type != "string" && (opts || {}).codepage) val = cptable.utils.decode(opts.codepage, val);
|
|
C_seen_K = true;
|
|
break;
|
|
case 'E':
|
|
C_seen_E = true;
|
|
var formula = rc_to_a1(record[rj].slice(1), {
|
|
r: R,
|
|
c: C
|
|
});
|
|
arr[R][C] = [arr[R][C], formula];
|
|
break;
|
|
case 'S':
|
|
C_seen_S = true;
|
|
arr[R][C] = [arr[R][C], "S5S"];
|
|
break;
|
|
case 'G':
|
|
break;
|
|
// unknown
|
|
case 'R':
|
|
_R = parseInt(record[rj].slice(1)) - 1;
|
|
break;
|
|
case 'C':
|
|
_C = parseInt(record[rj].slice(1)) - 1;
|
|
break;
|
|
default:
|
|
if (opts && opts.WTF) throw new Error("SYLK bad record " + rstr);
|
|
}
|
|
}
|
|
if (C_seen_K) {
|
|
if (arr[R][C] && arr[R][C].length == 2) arr[R][C][0] = val;else arr[R][C] = val;
|
|
next_cell_format = null;
|
|
}
|
|
if (C_seen_S) {
|
|
if (C_seen_E) throw new Error("SYLK shared formula cannot have own formula");
|
|
var shrbase = _R > -1 && arr[_R][_C];
|
|
if (!shrbase || !shrbase[1]) throw new Error("SYLK shared formula cannot find base");
|
|
arr[R][C][1] = shift_formula_str(shrbase[1], {
|
|
r: R - _R,
|
|
c: C - _C
|
|
});
|
|
}
|
|
break;
|
|
case 'F':
|
|
var F_seen = 0;
|
|
for (rj = 1; rj < record.length; ++rj) {
|
|
switch (record[rj].charAt(0)) {
|
|
case 'X':
|
|
C = parseInt(record[rj].slice(1)) - 1;
|
|
++F_seen;
|
|
break;
|
|
case 'Y':
|
|
R = parseInt(record[rj].slice(1)) - 1; /*C = 0;*/
|
|
for (j = arr.length; j <= R; ++j) {
|
|
arr[j] = [];
|
|
}
|
|
break;
|
|
case 'M':
|
|
Mval = parseInt(record[rj].slice(1)) / 20;
|
|
break;
|
|
case 'F':
|
|
break;
|
|
/* ??? */
|
|
case 'G':
|
|
break;
|
|
/* hide grid */
|
|
case 'P':
|
|
next_cell_format = formats[parseInt(record[rj].slice(1))];
|
|
break;
|
|
case 'S':
|
|
break;
|
|
/* cell style */
|
|
case 'D':
|
|
break;
|
|
/* column */
|
|
case 'N':
|
|
break;
|
|
/* font */
|
|
case 'W':
|
|
cw = record[rj].slice(1).split(" ");
|
|
for (j = parseInt(cw[0], 10); j <= parseInt(cw[1], 10); ++j) {
|
|
Mval = parseInt(cw[2], 10);
|
|
colinfo[j - 1] = Mval === 0 ? {
|
|
hidden: true
|
|
} : {
|
|
wch: Mval
|
|
};
|
|
process_col(colinfo[j - 1]);
|
|
}
|
|
break;
|
|
case 'C':
|
|
/* default column format */
|
|
C = parseInt(record[rj].slice(1)) - 1;
|
|
if (!colinfo[C]) colinfo[C] = {};
|
|
break;
|
|
case 'R':
|
|
/* row properties */
|
|
R = parseInt(record[rj].slice(1)) - 1;
|
|
if (!rowinfo[R]) rowinfo[R] = {};
|
|
if (Mval > 0) {
|
|
rowinfo[R].hpt = Mval;
|
|
rowinfo[R].hpx = pt2px(Mval);
|
|
} else if (Mval === 0) rowinfo[R].hidden = true;
|
|
break;
|
|
default:
|
|
if (opts && opts.WTF) throw new Error("SYLK bad record " + rstr);
|
|
}
|
|
}
|
|
if (F_seen < 1) next_cell_format = null;
|
|
break;
|
|
default:
|
|
if (opts && opts.WTF) throw new Error("SYLK bad record " + rstr);
|
|
}
|
|
}
|
|
if (rowinfo.length > 0) sht['!rows'] = rowinfo;
|
|
if (colinfo.length > 0) sht['!cols'] = colinfo;
|
|
if (opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
|
|
return [arr, sht];
|
|
}
|
|
function sylk_to_sheet(d, opts) {
|
|
var aoasht = sylk_to_aoa(d, opts);
|
|
var aoa = aoasht[0],
|
|
ws = aoasht[1];
|
|
var o = aoa_to_sheet(aoa, opts);
|
|
keys(ws).forEach(function (k) {
|
|
o[k] = ws[k];
|
|
});
|
|
return o;
|
|
}
|
|
function sylk_to_workbook(d, opts) {
|
|
return sheet_to_workbook(sylk_to_sheet(d, opts), opts);
|
|
}
|
|
function write_ws_cell_sylk(cell, ws, R, C) {
|
|
var o = "C;Y" + (R + 1) + ";X" + (C + 1) + ";K";
|
|
switch (cell.t) {
|
|
case 'n':
|
|
o += cell.v || 0;
|
|
if (cell.f && !cell.F) o += ";E" + a1_to_rc(cell.f, {
|
|
r: R,
|
|
c: C
|
|
});
|
|
break;
|
|
case 'b':
|
|
o += cell.v ? "TRUE" : "FALSE";
|
|
break;
|
|
case 'e':
|
|
o += cell.w || cell.v;
|
|
break;
|
|
case 'd':
|
|
o += '"' + (cell.w || cell.v) + '"';
|
|
break;
|
|
case 's':
|
|
o += '"' + cell.v.replace(/"/g, "") + '"';
|
|
break;
|
|
}
|
|
return o;
|
|
}
|
|
function write_ws_cols_sylk(out, cols) {
|
|
cols.forEach(function (col, i) {
|
|
var rec = "F;W" + (i + 1) + " " + (i + 1) + " ";
|
|
if (col.hidden) rec += "0";else {
|
|
if (typeof col.width == 'number' && !col.wpx) col.wpx = width2px(col.width);
|
|
if (typeof col.wpx == 'number' && !col.wch) col.wch = px2char(col.wpx);
|
|
if (typeof col.wch == 'number') rec += Math.round(col.wch);
|
|
}
|
|
if (rec.charAt(rec.length - 1) != " ") out.push(rec);
|
|
});
|
|
}
|
|
function write_ws_rows_sylk(out, rows) {
|
|
rows.forEach(function (row, i) {
|
|
var rec = "F;";
|
|
if (row.hidden) rec += "M0;";else if (row.hpt) rec += "M" + 20 * row.hpt + ";";else if (row.hpx) rec += "M" + 20 * px2pt(row.hpx) + ";";
|
|
if (rec.length > 2) out.push(rec + "R" + (i + 1));
|
|
});
|
|
}
|
|
function sheet_to_sylk(ws, opts) {
|
|
var preamble = ["ID;PWXL;N;E"],
|
|
o = [];
|
|
var r = safe_decode_range(ws['!ref']),
|
|
cell;
|
|
var dense = Array.isArray(ws);
|
|
var RS = "\r\n";
|
|
preamble.push("P;PGeneral");
|
|
preamble.push("F;P0;DG0G8;M255");
|
|
if (ws['!cols']) write_ws_cols_sylk(preamble, ws['!cols']);
|
|
if (ws['!rows']) write_ws_rows_sylk(preamble, ws['!rows']);
|
|
preamble.push("B;Y" + (r.e.r - r.s.r + 1) + ";X" + (r.e.c - r.s.c + 1) + ";D" + [r.s.c, r.s.r, r.e.c, r.e.r].join(" "));
|
|
for (var R = r.s.r; R <= r.e.r; ++R) {
|
|
for (var C = r.s.c; C <= r.e.c; ++C) {
|
|
var coord = encode_cell({
|
|
r: R,
|
|
c: C
|
|
});
|
|
cell = dense ? (ws[R] || [])[C] : ws[coord];
|
|
if (!cell || cell.v == null && (!cell.f || cell.F)) continue;
|
|
o.push(write_ws_cell_sylk(cell, ws, R, C, opts));
|
|
}
|
|
}
|
|
return preamble.join(RS) + RS + o.join(RS) + RS + "E" + RS;
|
|
}
|
|
return {
|
|
to_workbook: sylk_to_workbook,
|
|
to_sheet: sylk_to_sheet,
|
|
from_sheet: sheet_to_sylk
|
|
};
|
|
}();
|
|
var DIF = function () {
|
|
function dif_to_aoa(d, opts) {
|
|
switch (opts.type) {
|
|
case 'base64':
|
|
return dif_to_aoa_str(Base64.decode(d), opts);
|
|
case 'binary':
|
|
return dif_to_aoa_str(d, opts);
|
|
case 'buffer':
|
|
return dif_to_aoa_str(has_buf && Buffer.isBuffer(d) ? d.toString('binary') : a2s(d), opts);
|
|
case 'array':
|
|
return dif_to_aoa_str(cc2str(d), opts);
|
|
}
|
|
throw new Error("Unrecognized type " + opts.type);
|
|
}
|
|
function dif_to_aoa_str(str, opts) {
|
|
var records = str.split('\n'),
|
|
R = -1,
|
|
C = -1,
|
|
ri = 0,
|
|
arr = [];
|
|
for (; ri !== records.length; ++ri) {
|
|
if (records[ri].trim() === 'BOT') {
|
|
arr[++R] = [];
|
|
C = 0;
|
|
continue;
|
|
}
|
|
if (R < 0) continue;
|
|
var metadata = records[ri].trim().split(",");
|
|
var type = metadata[0],
|
|
value = metadata[1];
|
|
++ri;
|
|
var data = records[ri] || "";
|
|
while ((data.match(/["]/g) || []).length & 1 && ri < records.length - 1) {
|
|
data += "\n" + records[++ri];
|
|
}
|
|
data = data.trim();
|
|
switch (+type) {
|
|
case -1:
|
|
if (data === 'BOT') {
|
|
arr[++R] = [];
|
|
C = 0;
|
|
continue;
|
|
} else if (data !== 'EOD') throw new Error("Unrecognized DIF special command " + data);
|
|
break;
|
|
case 0:
|
|
if (data === 'TRUE') arr[R][C] = true;else if (data === 'FALSE') arr[R][C] = false;else if (!isNaN(fuzzynum(value))) arr[R][C] = fuzzynum(value);else if (!isNaN(fuzzydate(value).getDate())) arr[R][C] = parseDate(value);else arr[R][C] = value;
|
|
++C;
|
|
break;
|
|
case 1:
|
|
data = data.slice(1, data.length - 1);
|
|
data = data.replace(/""/g, '"');
|
|
if (DIF_XL && data && data.match(/^=".*"$/)) data = data.slice(2, -1);
|
|
arr[R][C++] = data !== '' ? data : null;
|
|
break;
|
|
}
|
|
if (data === 'EOD') break;
|
|
}
|
|
if (opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
|
|
return arr;
|
|
}
|
|
function dif_to_sheet(str, opts) {
|
|
return aoa_to_sheet(dif_to_aoa(str, opts), opts);
|
|
}
|
|
function dif_to_workbook(str, opts) {
|
|
return sheet_to_workbook(dif_to_sheet(str, opts), opts);
|
|
}
|
|
var sheet_to_dif = function () {
|
|
var push_field = function pf(o, topic, v, n, s) {
|
|
o.push(topic);
|
|
o.push(v + "," + n);
|
|
o.push('"' + s.replace(/"/g, '""') + '"');
|
|
};
|
|
var push_value = function po(o, type, v, s) {
|
|
o.push(type + "," + v);
|
|
o.push(type == 1 ? '"' + s.replace(/"/g, '""') + '"' : s);
|
|
};
|
|
return function sheet_to_dif(ws) {
|
|
var o = [];
|
|
var r = safe_decode_range(ws['!ref']),
|
|
cell;
|
|
var dense = Array.isArray(ws);
|
|
push_field(o, "TABLE", 0, 1, "sheetjs");
|
|
push_field(o, "VECTORS", 0, r.e.r - r.s.r + 1, "");
|
|
push_field(o, "TUPLES", 0, r.e.c - r.s.c + 1, "");
|
|
push_field(o, "DATA", 0, 0, "");
|
|
for (var R = r.s.r; R <= r.e.r; ++R) {
|
|
push_value(o, -1, 0, "BOT");
|
|
for (var C = r.s.c; C <= r.e.c; ++C) {
|
|
var coord = encode_cell({
|
|
r: R,
|
|
c: C
|
|
});
|
|
cell = dense ? (ws[R] || [])[C] : ws[coord];
|
|
if (!cell) {
|
|
push_value(o, 1, 0, "");
|
|
continue;
|
|
}
|
|
switch (cell.t) {
|
|
case 'n':
|
|
var val = DIF_XL ? cell.w : cell.v;
|
|
if (!val && cell.v != null) val = cell.v;
|
|
if (val == null) {
|
|
if (DIF_XL && cell.f && !cell.F) push_value(o, 1, 0, "=" + cell.f);else push_value(o, 1, 0, "");
|
|
} else push_value(o, 0, val, "V");
|
|
break;
|
|
case 'b':
|
|
push_value(o, 0, cell.v ? 1 : 0, cell.v ? "TRUE" : "FALSE");
|
|
break;
|
|
case 's':
|
|
push_value(o, 1, 0, !DIF_XL || isNaN(cell.v) ? cell.v : '="' + cell.v + '"');
|
|
break;
|
|
case 'd':
|
|
if (!cell.w) cell.w = SSF.format(cell.z || SSF._table[14], datenum(parseDate(cell.v)));
|
|
if (DIF_XL) push_value(o, 0, cell.w, "V");else push_value(o, 1, 0, cell.w);
|
|
break;
|
|
default:
|
|
push_value(o, 1, 0, "");
|
|
}
|
|
}
|
|
}
|
|
push_value(o, -1, 0, "EOD");
|
|
var RS = "\r\n";
|
|
var oo = o.join(RS);
|
|
//while((oo.length & 0x7F) != 0) oo += "\0";
|
|
return oo;
|
|
};
|
|
}();
|
|
return {
|
|
to_workbook: dif_to_workbook,
|
|
to_sheet: dif_to_sheet,
|
|
from_sheet: sheet_to_dif
|
|
};
|
|
}();
|
|
var ETH = function () {
|
|
function decode(s) {
|
|
return s.replace(/\\b/g, "\\").replace(/\\c/g, ":").replace(/\\n/g, "\n");
|
|
}
|
|
function encode(s) {
|
|
return s.replace(/\\/g, "\\b").replace(/:/g, "\\c").replace(/\n/g, "\\n");
|
|
}
|
|
function eth_to_aoa(str, opts) {
|
|
var records = str.split('\n'),
|
|
R = -1,
|
|
C = -1,
|
|
ri = 0,
|
|
arr = [];
|
|
for (; ri !== records.length; ++ri) {
|
|
var record = records[ri].trim().split(":");
|
|
if (record[0] !== 'cell') continue;
|
|
var addr = decode_cell(record[1]);
|
|
if (arr.length <= addr.r) for (R = arr.length; R <= addr.r; ++R) {
|
|
if (!arr[R]) arr[R] = [];
|
|
}
|
|
R = addr.r;
|
|
C = addr.c;
|
|
switch (record[2]) {
|
|
case 't':
|
|
arr[R][C] = decode(record[3]);
|
|
break;
|
|
case 'v':
|
|
arr[R][C] = +record[3];
|
|
break;
|
|
case 'vtf':
|
|
var _f = record[record.length - 1];
|
|
/* falls through */
|
|
case 'vtc':
|
|
switch (record[3]) {
|
|
case 'nl':
|
|
arr[R][C] = +record[4] ? true : false;
|
|
break;
|
|
default:
|
|
arr[R][C] = +record[4];
|
|
break;
|
|
}
|
|
if (record[2] == 'vtf') arr[R][C] = [arr[R][C], _f];
|
|
}
|
|
}
|
|
if (opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
|
|
return arr;
|
|
}
|
|
function eth_to_sheet(d, opts) {
|
|
return aoa_to_sheet(eth_to_aoa(d, opts), opts);
|
|
}
|
|
function eth_to_workbook(d, opts) {
|
|
return sheet_to_workbook(eth_to_sheet(d, opts), opts);
|
|
}
|
|
var header = ["socialcalc:version:1.5", "MIME-Version: 1.0", "Content-Type: multipart/mixed; boundary=SocialCalcSpreadsheetControlSave"].join("\n");
|
|
var sep = ["--SocialCalcSpreadsheetControlSave", "Content-type: text/plain; charset=UTF-8"].join("\n") + "\n";
|
|
|
|
/* TODO: the other parts */
|
|
var meta = ["# SocialCalc Spreadsheet Control Save", "part:sheet"].join("\n");
|
|
var end = "--SocialCalcSpreadsheetControlSave--";
|
|
function sheet_to_eth_data(ws) {
|
|
if (!ws || !ws['!ref']) return "";
|
|
var o = [],
|
|
oo = [],
|
|
cell,
|
|
coord = "";
|
|
var r = decode_range(ws['!ref']);
|
|
var dense = Array.isArray(ws);
|
|
for (var R = r.s.r; R <= r.e.r; ++R) {
|
|
for (var C = r.s.c; C <= r.e.c; ++C) {
|
|
coord = encode_cell({
|
|
r: R,
|
|
c: C
|
|
});
|
|
cell = dense ? (ws[R] || [])[C] : ws[coord];
|
|
if (!cell || cell.v == null || cell.t === 'z') continue;
|
|
oo = ["cell", coord, 't'];
|
|
switch (cell.t) {
|
|
case 's':
|
|
case 'str':
|
|
oo.push(encode(cell.v));
|
|
break;
|
|
case 'n':
|
|
if (!cell.f) {
|
|
oo[2] = 'v';
|
|
oo[3] = cell.v;
|
|
} else {
|
|
oo[2] = 'vtf';
|
|
oo[3] = 'n';
|
|
oo[4] = cell.v;
|
|
oo[5] = encode(cell.f);
|
|
}
|
|
break;
|
|
case 'b':
|
|
oo[2] = 'vt' + (cell.f ? 'f' : 'c');
|
|
oo[3] = 'nl';
|
|
oo[4] = cell.v ? "1" : "0";
|
|
oo[5] = encode(cell.f || (cell.v ? 'TRUE' : 'FALSE'));
|
|
break;
|
|
case 'd':
|
|
var t = datenum(parseDate(cell.v));
|
|
oo[2] = 'vtc';
|
|
oo[3] = 'nd';
|
|
oo[4] = "" + t;
|
|
oo[5] = cell.w || SSF.format(cell.z || SSF._table[14], t);
|
|
break;
|
|
case 'e':
|
|
continue;
|
|
}
|
|
o.push(oo.join(":"));
|
|
}
|
|
}
|
|
o.push("sheet:c:" + (r.e.c - r.s.c + 1) + ":r:" + (r.e.r - r.s.r + 1) + ":tvf:1");
|
|
o.push("valueformat:1:text-wiki");
|
|
//o.push("copiedfrom:" + ws['!ref']); // clipboard only
|
|
return o.join("\n");
|
|
}
|
|
function sheet_to_eth(ws) {
|
|
return [header, sep, meta, sep, sheet_to_eth_data(ws), end].join("\n");
|
|
// return ["version:1.5", sheet_to_eth_data(ws)].join("\n"); // clipboard form
|
|
}
|
|
|
|
return {
|
|
to_workbook: eth_to_workbook,
|
|
to_sheet: eth_to_sheet,
|
|
from_sheet: sheet_to_eth
|
|
};
|
|
}();
|
|
var PRN = function () {
|
|
function set_text_arr(data, arr, R, C, o) {
|
|
if (o.raw) arr[R][C] = data;else if (data === "") {/* empty */} else if (data === 'TRUE') arr[R][C] = true;else if (data === 'FALSE') arr[R][C] = false;else if (!isNaN(fuzzynum(data))) arr[R][C] = fuzzynum(data);else if (!isNaN(fuzzydate(data).getDate())) arr[R][C] = parseDate(data);else arr[R][C] = data;
|
|
}
|
|
function prn_to_aoa_str(f, opts) {
|
|
var o = opts || {};
|
|
var arr = [];
|
|
if (!f || f.length === 0) return arr;
|
|
var lines = f.split(/[\r\n]/);
|
|
var L = lines.length - 1;
|
|
while (L >= 0 && lines[L].length === 0) {
|
|
--L;
|
|
}
|
|
var start = 10,
|
|
idx = 0;
|
|
var R = 0;
|
|
for (; R <= L; ++R) {
|
|
idx = lines[R].indexOf(" ");
|
|
if (idx == -1) idx = lines[R].length;else idx++;
|
|
start = Math.max(start, idx);
|
|
}
|
|
for (R = 0; R <= L; ++R) {
|
|
arr[R] = [];
|
|
/* TODO: confirm that widths are always 10 */
|
|
var C = 0;
|
|
set_text_arr(lines[R].slice(0, start).trim(), arr, R, C, o);
|
|
for (C = 1; C <= (lines[R].length - start) / 10 + 1; ++C) {
|
|
set_text_arr(lines[R].slice(start + (C - 1) * 10, start + C * 10).trim(), arr, R, C, o);
|
|
}
|
|
}
|
|
if (o.sheetRows) arr = arr.slice(0, o.sheetRows);
|
|
return arr;
|
|
}
|
|
|
|
// List of accepted CSV separators
|
|
var guess_seps = {
|
|
0x2C: ',',
|
|
0x09: "\t",
|
|
0x3B: ';',
|
|
0x7C: '|'
|
|
};
|
|
|
|
// CSV separator weights to be used in case of equal numbers
|
|
var guess_sep_weights = {
|
|
0x2C: 3,
|
|
0x09: 2,
|
|
0x3B: 1,
|
|
0x7C: 0
|
|
};
|
|
function guess_sep(str) {
|
|
var cnt = {},
|
|
instr = false,
|
|
end = 0,
|
|
cc = 0;
|
|
for (; end < str.length; ++end) {
|
|
if ((cc = str.charCodeAt(end)) == 0x22) instr = !instr;else if (!instr && cc in guess_seps) cnt[cc] = (cnt[cc] || 0) + 1;
|
|
}
|
|
cc = [];
|
|
for (end in cnt) {
|
|
if (Object.prototype.hasOwnProperty.call(cnt, end)) {
|
|
cc.push([cnt[end], end]);
|
|
}
|
|
}
|
|
if (!cc.length) {
|
|
cnt = guess_sep_weights;
|
|
for (end in cnt) {
|
|
if (Object.prototype.hasOwnProperty.call(cnt, end)) {
|
|
cc.push([cnt[end], end]);
|
|
}
|
|
}
|
|
}
|
|
cc.sort(function (a, b) {
|
|
return a[0] - b[0] || guess_sep_weights[a[1]] - guess_sep_weights[b[1]];
|
|
});
|
|
return guess_seps[cc.pop()[1]] || 0x2C;
|
|
}
|
|
function dsv_to_sheet_str(str, opts) {
|
|
var o = opts || {};
|
|
var sep = "";
|
|
if (DENSE != null && o.dense == null) o.dense = DENSE;
|
|
var ws = o.dense ? [] : {};
|
|
var range = {
|
|
s: {
|
|
c: 0,
|
|
r: 0
|
|
},
|
|
e: {
|
|
c: 0,
|
|
r: 0
|
|
}
|
|
};
|
|
if (str.slice(0, 4) == "sep=") {
|
|
// If the line ends in \r\n
|
|
if (str.charCodeAt(5) == 13 && str.charCodeAt(6) == 10) {
|
|
sep = str.charAt(4);
|
|
str = str.slice(7);
|
|
}
|
|
// If line ends in \r OR \n
|
|
else if (str.charCodeAt(5) == 13 || str.charCodeAt(5) == 10) {
|
|
sep = str.charAt(4);
|
|
str = str.slice(6);
|
|
} else sep = guess_sep(str.slice(0, 1024));
|
|
} else if (o && o.FS) sep = o.FS;else sep = guess_sep(str.slice(0, 1024));
|
|
var R = 0,
|
|
C = 0,
|
|
v = 0;
|
|
var start = 0,
|
|
end = 0,
|
|
sepcc = sep.charCodeAt(0),
|
|
instr = false,
|
|
cc = 0,
|
|
startcc = str.charCodeAt(0);
|
|
str = str.replace(/\r\n/mg, "\n");
|
|
var _re = o.dateNF != null ? dateNF_regex(o.dateNF) : null;
|
|
function finish_cell() {
|
|
var s = str.slice(start, end);
|
|
var cell = {};
|
|
if (s.charAt(0) == '"' && s.charAt(s.length - 1) == '"') s = s.slice(1, -1).replace(/""/g, '"');
|
|
if (s.length === 0) cell.t = 'z';else if (o.raw) {
|
|
cell.t = 's';
|
|
cell.v = s;
|
|
} else if (s.trim().length === 0) {
|
|
cell.t = 's';
|
|
cell.v = s;
|
|
} else if (s.charCodeAt(0) == 0x3D) {
|
|
if (s.charCodeAt(1) == 0x22 && s.charCodeAt(s.length - 1) == 0x22) {
|
|
cell.t = 's';
|
|
cell.v = s.slice(2, -1).replace(/""/g, '"');
|
|
} else if (fuzzyfmla(s)) {
|
|
cell.t = 'n';
|
|
cell.f = s.slice(1);
|
|
} else {
|
|
cell.t = 's';
|
|
cell.v = s;
|
|
}
|
|
} else if (s == "TRUE") {
|
|
cell.t = 'b';
|
|
cell.v = true;
|
|
} else if (s == "FALSE") {
|
|
cell.t = 'b';
|
|
cell.v = false;
|
|
} else if (!isNaN(v = fuzzynum(s))) {
|
|
cell.t = 'n';
|
|
if (o.cellText !== false) cell.w = s;
|
|
cell.v = v;
|
|
} else if (!isNaN(fuzzydate(s).getDate()) || _re && s.match(_re)) {
|
|
cell.z = o.dateNF || SSF._table[14];
|
|
var k = 0;
|
|
if (_re && s.match(_re)) {
|
|
s = dateNF_fix(s, o.dateNF, s.match(_re) || []);
|
|
k = 1;
|
|
}
|
|
if (o.cellDates) {
|
|
cell.t = 'd';
|
|
cell.v = parseDate(s, k);
|
|
} else {
|
|
cell.t = 'n';
|
|
cell.v = datenum(parseDate(s, k));
|
|
}
|
|
if (o.cellText !== false) cell.w = SSF.format(cell.z, cell.v instanceof Date ? datenum(cell.v) : cell.v);
|
|
if (!o.cellNF) delete cell.z;
|
|
} else {
|
|
cell.t = 's';
|
|
cell.v = s;
|
|
}
|
|
if (cell.t == 'z') {} else if (o.dense) {
|
|
if (!ws[R]) ws[R] = [];
|
|
ws[R][C] = cell;
|
|
} else ws[encode_cell({
|
|
c: C,
|
|
r: R
|
|
})] = cell;
|
|
start = end + 1;
|
|
startcc = str.charCodeAt(start);
|
|
if (range.e.c < C) range.e.c = C;
|
|
if (range.e.r < R) range.e.r = R;
|
|
if (cc == sepcc) ++C;else {
|
|
C = 0;
|
|
++R;
|
|
if (o.sheetRows && o.sheetRows <= R) return true;
|
|
}
|
|
}
|
|
outer: for (; end < str.length; ++end) {
|
|
switch (cc = str.charCodeAt(end)) {
|
|
case 0x22:
|
|
if (startcc === 0x22) instr = !instr;
|
|
break;
|
|
case sepcc:
|
|
case 0x0a:
|
|
case 0x0d:
|
|
if (!instr && finish_cell()) break outer;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
if (end - start > 0) finish_cell();
|
|
ws['!ref'] = encode_range(range);
|
|
return ws;
|
|
}
|
|
function prn_to_sheet_str(str, opts) {
|
|
if (!(opts && opts.PRN)) return dsv_to_sheet_str(str, opts);
|
|
if (opts.FS) return dsv_to_sheet_str(str, opts);
|
|
if (str.slice(0, 4) == "sep=") return dsv_to_sheet_str(str, opts);
|
|
if (str.indexOf("\t") >= 0 || str.indexOf(",") >= 0 || str.indexOf(";") >= 0) return dsv_to_sheet_str(str, opts);
|
|
return aoa_to_sheet(prn_to_aoa_str(str, opts), opts);
|
|
}
|
|
function prn_to_sheet(d, opts) {
|
|
var str = "",
|
|
bytes = opts.type == 'string' ? [0, 0, 0, 0] : firstbyte(d, opts);
|
|
switch (opts.type) {
|
|
case 'base64':
|
|
str = Base64.decode(d);
|
|
break;
|
|
case 'binary':
|
|
str = d;
|
|
break;
|
|
case 'buffer':
|
|
if (opts.codepage == 65001) str = d.toString('utf8'); // TODO: test if buf
|
|
else if (opts.codepage && typeof cptable !== 'undefined') str = cptable.utils.decode(opts.codepage, d);else str = has_buf && Buffer.isBuffer(d) ? d.toString('binary') : a2s(d);
|
|
break;
|
|
case 'array':
|
|
str = cc2str(d);
|
|
break;
|
|
case 'string':
|
|
str = d;
|
|
break;
|
|
default:
|
|
throw new Error("Unrecognized type " + opts.type);
|
|
}
|
|
if (bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) str = utf8read(str.slice(3));else if (opts.type != 'string' && opts.codepage == 65001) str = utf8read(str);else if (opts.type == 'binary' && typeof cptable !== 'undefined' && opts.codepage) str = cptable.utils.decode(opts.codepage, cptable.utils.encode(28591, str));
|
|
if (str.slice(0, 19) == "socialcalc:version:") return ETH.to_sheet(opts.type == 'string' ? str : utf8read(str), opts);
|
|
return prn_to_sheet_str(str, opts);
|
|
}
|
|
function prn_to_workbook(d, opts) {
|
|
return sheet_to_workbook(prn_to_sheet(d, opts), opts);
|
|
}
|
|
function sheet_to_prn(ws) {
|
|
var o = [];
|
|
var r = safe_decode_range(ws['!ref']),
|
|
cell;
|
|
var dense = Array.isArray(ws);
|
|
for (var R = r.s.r; R <= r.e.r; ++R) {
|
|
var oo = [];
|
|
for (var C = r.s.c; C <= r.e.c; ++C) {
|
|
var coord = encode_cell({
|
|
r: R,
|
|
c: C
|
|
});
|
|
cell = dense ? (ws[R] || [])[C] : ws[coord];
|
|
if (!cell || cell.v == null) {
|
|
oo.push(" ");
|
|
continue;
|
|
}
|
|
var w = (cell.w || (format_cell(cell), cell.w) || "").slice(0, 10);
|
|
while (w.length < 10) {
|
|
w += " ";
|
|
}
|
|
oo.push(w + (C === 0 ? " " : ""));
|
|
}
|
|
o.push(oo.join(""));
|
|
}
|
|
return o.join("\n");
|
|
}
|
|
return {
|
|
to_workbook: prn_to_workbook,
|
|
to_sheet: prn_to_sheet,
|
|
from_sheet: sheet_to_prn
|
|
};
|
|
}();
|
|
|
|
/* Excel defaults to SYLK but warns if data is not valid */
|
|
function read_wb_ID(d, opts) {
|
|
var o = opts || {},
|
|
OLD_WTF = !!o.WTF;
|
|
o.WTF = true;
|
|
try {
|
|
var out = SYLK.to_workbook(d, o);
|
|
o.WTF = OLD_WTF;
|
|
return out;
|
|
} catch (e) {
|
|
o.WTF = OLD_WTF;
|
|
if (!e.message.match(/SYLK bad record ID/) && OLD_WTF) throw e;
|
|
return PRN.to_workbook(d, opts);
|
|
}
|
|
}
|
|
|
|
/* 18.4.7 rPr CT_RPrElt */
|
|
function parse_rpr(rpr) {
|
|
var font = {},
|
|
m = rpr.match(tagregex),
|
|
i = 0;
|
|
var pass = false;
|
|
if (m) for (; i != m.length; ++i) {
|
|
var y = parsexmltag(m[i]);
|
|
switch (y[0].replace(/\w*:/g, "")) {
|
|
/* 18.8.12 condense CT_BooleanProperty */
|
|
/* ** not required . */
|
|
case '<condense':
|
|
break;
|
|
/* 18.8.17 extend CT_BooleanProperty */
|
|
/* ** not required . */
|
|
case '<extend':
|
|
break;
|
|
/* 18.8.36 shadow CT_BooleanProperty */
|
|
/* ** not required . */
|
|
case '<shadow':
|
|
if (!y.val) break;
|
|
/* falls through */
|
|
case '<shadow>':
|
|
case '<shadow/>':
|
|
font.shadow = 1;
|
|
break;
|
|
case '</shadow>':
|
|
break;
|
|
|
|
/* 18.4.1 charset CT_IntProperty TODO */
|
|
case '<charset':
|
|
if (y.val == '1') break;
|
|
font.cp = CS2CP[parseInt(y.val, 10)];
|
|
break;
|
|
|
|
/* 18.4.2 outline CT_BooleanProperty TODO */
|
|
case '<outline':
|
|
if (!y.val) break;
|
|
/* falls through */
|
|
case '<outline>':
|
|
case '<outline/>':
|
|
font.outline = 1;
|
|
break;
|
|
case '</outline>':
|
|
break;
|
|
|
|
/* 18.4.5 rFont CT_FontName */
|
|
case '<rFont':
|
|
font.name = y.val;
|
|
break;
|
|
|
|
/* 18.4.11 sz CT_FontSize */
|
|
case '<sz':
|
|
font.sz = y.val;
|
|
break;
|
|
|
|
/* 18.4.10 strike CT_BooleanProperty */
|
|
case '<strike':
|
|
if (!y.val) break;
|
|
/* falls through */
|
|
case '<strike>':
|
|
case '<strike/>':
|
|
font.strike = 1;
|
|
break;
|
|
case '</strike>':
|
|
break;
|
|
|
|
/* 18.4.13 u CT_UnderlineProperty */
|
|
case '<u':
|
|
if (!y.val) break;
|
|
switch (y.val) {
|
|
case 'double':
|
|
font.uval = "double";
|
|
break;
|
|
case 'singleAccounting':
|
|
font.uval = "single-accounting";
|
|
break;
|
|
case 'doubleAccounting':
|
|
font.uval = "double-accounting";
|
|
break;
|
|
}
|
|
/* falls through */
|
|
case '<u>':
|
|
case '<u/>':
|
|
font.u = 1;
|
|
break;
|
|
case '</u>':
|
|
break;
|
|
|
|
/* 18.8.2 b */
|
|
case '<b':
|
|
if (y.val == '0') break;
|
|
/* falls through */
|
|
case '<b>':
|
|
case '<b/>':
|
|
font.b = 1;
|
|
break;
|
|
case '</b>':
|
|
break;
|
|
|
|
/* 18.8.26 i */
|
|
case '<i':
|
|
if (y.val == '0') break;
|
|
/* falls through */
|
|
case '<i>':
|
|
case '<i/>':
|
|
font.i = 1;
|
|
break;
|
|
case '</i>':
|
|
break;
|
|
|
|
/* 18.3.1.15 color CT_Color TODO: tint, theme, auto, indexed */
|
|
case '<color':
|
|
if (y.rgb) font.color = y.rgb.slice(2, 8);
|
|
break;
|
|
|
|
/* 18.8.18 family ST_FontFamily */
|
|
case '<family':
|
|
font.family = y.val;
|
|
break;
|
|
|
|
/* 18.4.14 vertAlign CT_VerticalAlignFontProperty TODO */
|
|
case '<vertAlign':
|
|
font.valign = y.val;
|
|
break;
|
|
|
|
/* 18.8.35 scheme CT_FontScheme TODO */
|
|
case '<scheme':
|
|
break;
|
|
|
|
/* 18.2.10 extLst CT_ExtensionList ? */
|
|
case '<extLst':
|
|
case '<extLst>':
|
|
case '</extLst>':
|
|
break;
|
|
case '<ext':
|
|
pass = true;
|
|
break;
|
|
case '</ext>':
|
|
pass = false;
|
|
break;
|
|
default:
|
|
if (y[0].charCodeAt(1) !== 47 && !pass) throw new Error('Unrecognized rich format ' + y[0]);
|
|
}
|
|
}
|
|
return font;
|
|
}
|
|
var parse_rs = function () {
|
|
var tregex = matchtag("t"),
|
|
rpregex = matchtag("rPr");
|
|
/* 18.4.4 r CT_RElt */
|
|
function parse_r(r) {
|
|
/* 18.4.12 t ST_Xstring */
|
|
var t = r.match(tregex) /*, cp = 65001*/;
|
|
if (!t) return {
|
|
t: "s",
|
|
v: ""
|
|
};
|
|
var o = {
|
|
t: 's',
|
|
v: unescapexml(t[1])
|
|
};
|
|
var rpr = r.match(rpregex);
|
|
if (rpr) o.s = parse_rpr(rpr[1]);
|
|
return o;
|
|
}
|
|
var rregex = /<(?:\w+:)?r>/g,
|
|
rend = /<\/(?:\w+:)?r>/;
|
|
return function parse_rs(rs) {
|
|
return rs.replace(rregex, "").split(rend).map(parse_r).filter(function (r) {
|
|
return r.v;
|
|
});
|
|
};
|
|
}();
|
|
|
|
/* Parse a list of <r> tags */
|
|
var rs_to_html = function parse_rs_factory() {
|
|
var nlregex = /(\r\n|\n)/g;
|
|
function parse_rpr2(font, intro, outro) {
|
|
var style = [];
|
|
if (font.u) style.push("text-decoration: underline;");
|
|
if (font.uval) style.push("text-underline-style:" + font.uval + ";");
|
|
if (font.sz) style.push("font-size:" + font.sz + "pt;");
|
|
if (font.outline) style.push("text-effect: outline;");
|
|
if (font.shadow) style.push("text-shadow: auto;");
|
|
intro.push('<span style="' + style.join("") + '">');
|
|
if (font.b) {
|
|
intro.push("<b>");
|
|
outro.push("</b>");
|
|
}
|
|
if (font.i) {
|
|
intro.push("<i>");
|
|
outro.push("</i>");
|
|
}
|
|
if (font.strike) {
|
|
intro.push("<s>");
|
|
outro.push("</s>");
|
|
}
|
|
var align = font.valign || "";
|
|
if (align == "superscript" || align == "super") align = "sup";else if (align == "subscript") align = "sub";
|
|
if (align != "") {
|
|
intro.push("<" + align + ">");
|
|
outro.push("</" + align + ">");
|
|
}
|
|
outro.push("</span>");
|
|
return font;
|
|
}
|
|
|
|
/* 18.4.4 r CT_RElt */
|
|
function r_to_html(r) {
|
|
var terms = [[], r.v, []];
|
|
if (!r.v) return "";
|
|
if (r.s) parse_rpr2(r.s, terms[0], terms[2]);
|
|
return terms[0].join("") + terms[1].replace(nlregex, '<br/>') + terms[2].join("");
|
|
}
|
|
return function parse_rs(rs) {
|
|
return rs.map(r_to_html).join("");
|
|
};
|
|
}();
|
|
|
|
/* 18.4.8 si CT_Rst */
|
|
var sitregex = /<(?:\w+:)?t[^>]*>([^<]*)<\/(?:\w+:)?t>/g,
|
|
sirregex = /<(?:\w+:)?r>/;
|
|
var sirphregex = /<(?:\w+:)?rPh.*?>([\s\S]*?)<\/(?:\w+:)?rPh>/g;
|
|
function parse_si(x, opts) {
|
|
var html = opts ? opts.cellHTML : true;
|
|
var z = {};
|
|
if (!x) return {
|
|
t: ""
|
|
};
|
|
//var y;
|
|
/* 18.4.12 t ST_Xstring (Plaintext String) */
|
|
// TODO: is whitespace actually valid here?
|
|
if (x.match(/^\s*<(?:\w+:)?t[^>]*>/)) {
|
|
z.t = unescapexml(utf8read(x.slice(x.indexOf(">") + 1).split(/<\/(?:\w+:)?t>/)[0] || ""));
|
|
z.r = utf8read(x);
|
|
if (html) z.h = escapehtml(z.t);
|
|
}
|
|
/* 18.4.4 r CT_RElt (Rich Text Run) */else if ( /*y = */x.match(sirregex)) {
|
|
z.r = utf8read(x);
|
|
z.t = unescapexml(utf8read((x.replace(sirphregex, '').match(sitregex) || []).join("").replace(tagregex, "")));
|
|
if (html) z.h = rs_to_html(parse_rs(z.r));
|
|
}
|
|
/* 18.4.3 phoneticPr CT_PhoneticPr (TODO: needed for Asian support) */
|
|
/* 18.4.6 rPh CT_PhoneticRun (TODO: needed for Asian support) */
|
|
return z;
|
|
}
|
|
|
|
/* 18.4 Shared String Table */
|
|
var sstr0 = /<(?:\w+:)?sst([^>]*)>([\s\S]*)<\/(?:\w+:)?sst>/;
|
|
var sstr1 = /<(?:\w+:)?(?:si|sstItem)>/g;
|
|
var sstr2 = /<\/(?:\w+:)?(?:si|sstItem)>/;
|
|
function parse_sst_xml(data, opts) {
|
|
var s = [],
|
|
ss = "";
|
|
if (!data) return s;
|
|
/* 18.4.9 sst CT_Sst */
|
|
var sst = data.match(sstr0);
|
|
if (sst) {
|
|
ss = sst[2].replace(sstr1, "").split(sstr2);
|
|
for (var i = 0; i != ss.length; ++i) {
|
|
var o = parse_si(ss[i].trim(), opts);
|
|
if (o != null) s[s.length] = o;
|
|
}
|
|
sst = parsexmltag(sst[1]);
|
|
s.Count = sst.count;
|
|
s.Unique = sst.uniqueCount;
|
|
}
|
|
return s;
|
|
}
|
|
RELS.SST = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings";
|
|
var straywsregex = /^\s|\s$|[\t\n\r]/;
|
|
function write_sst_xml(sst, opts) {
|
|
if (!opts.bookSST) return "";
|
|
var o = [XML_HEADER];
|
|
o[o.length] = writextag('sst', null, {
|
|
xmlns: XMLNS.main[0],
|
|
count: sst.Count,
|
|
uniqueCount: sst.Unique
|
|
});
|
|
for (var i = 0; i != sst.length; ++i) {
|
|
if (sst[i] == null) continue;
|
|
var s = sst[i];
|
|
var sitag = "<si>";
|
|
if (s.r) sitag += s.r;else {
|
|
sitag += "<t";
|
|
if (!s.t) s.t = "";
|
|
if (s.t.match(straywsregex)) sitag += ' xml:space="preserve"';
|
|
sitag += ">" + escapexml(s.t) + "</t>";
|
|
}
|
|
sitag += "</si>";
|
|
o[o.length] = sitag;
|
|
}
|
|
if (o.length > 2) {
|
|
o[o.length] = '</sst>';
|
|
o[1] = o[1].replace("/>", ">");
|
|
}
|
|
return o.join("");
|
|
}
|
|
function hex2RGB(h) {
|
|
var o = h.slice(h[0] === "#" ? 1 : 0).slice(0, 6);
|
|
return [parseInt(o.slice(0, 2), 16), parseInt(o.slice(2, 4), 16), parseInt(o.slice(4, 6), 16)];
|
|
}
|
|
function rgb2Hex(rgb) {
|
|
for (var i = 0, o = 1; i != 3; ++i) {
|
|
o = o * 256 + (rgb[i] > 255 ? 255 : rgb[i] < 0 ? 0 : rgb[i]);
|
|
}
|
|
return o.toString(16).toUpperCase().slice(1);
|
|
}
|
|
function rgb2HSL(rgb) {
|
|
var R = rgb[0] / 255,
|
|
G = rgb[1] / 255,
|
|
B = rgb[2] / 255;
|
|
var M = Math.max(R, G, B),
|
|
m = Math.min(R, G, B),
|
|
C = M - m;
|
|
if (C === 0) return [0, 0, R];
|
|
var H6 = 0,
|
|
S = 0,
|
|
L2 = M + m;
|
|
S = C / (L2 > 1 ? 2 - L2 : L2);
|
|
switch (M) {
|
|
case R:
|
|
H6 = ((G - B) / C + 6) % 6;
|
|
break;
|
|
case G:
|
|
H6 = (B - R) / C + 2;
|
|
break;
|
|
case B:
|
|
H6 = (R - G) / C + 4;
|
|
break;
|
|
}
|
|
return [H6 / 6, S, L2 / 2];
|
|
}
|
|
function hsl2RGB(hsl) {
|
|
var H = hsl[0],
|
|
S = hsl[1],
|
|
L = hsl[2];
|
|
var C = S * 2 * (L < 0.5 ? L : 1 - L),
|
|
m = L - C / 2;
|
|
var rgb = [m, m, m],
|
|
h6 = 6 * H;
|
|
var X;
|
|
if (S !== 0) switch (h6 | 0) {
|
|
case 0:
|
|
case 6:
|
|
X = C * h6;
|
|
rgb[0] += C;
|
|
rgb[1] += X;
|
|
break;
|
|
case 1:
|
|
X = C * (2 - h6);
|
|
rgb[0] += X;
|
|
rgb[1] += C;
|
|
break;
|
|
case 2:
|
|
X = C * (h6 - 2);
|
|
rgb[1] += C;
|
|
rgb[2] += X;
|
|
break;
|
|
case 3:
|
|
X = C * (4 - h6);
|
|
rgb[1] += X;
|
|
rgb[2] += C;
|
|
break;
|
|
case 4:
|
|
X = C * (h6 - 4);
|
|
rgb[2] += C;
|
|
rgb[0] += X;
|
|
break;
|
|
case 5:
|
|
X = C * (6 - h6);
|
|
rgb[2] += X;
|
|
rgb[0] += C;
|
|
break;
|
|
}
|
|
for (var i = 0; i != 3; ++i) {
|
|
rgb[i] = Math.round(rgb[i] * 255);
|
|
}
|
|
return rgb;
|
|
}
|
|
|
|
/* 18.8.3 bgColor tint algorithm */
|
|
function rgb_tint(hex, tint) {
|
|
if (tint === 0) return hex;
|
|
var hsl = rgb2HSL(hex2RGB(hex));
|
|
if (tint < 0) hsl[2] = hsl[2] * (1 + tint);else hsl[2] = 1 - (1 - hsl[2]) * (1 - tint);
|
|
return rgb2Hex(hsl2RGB(hsl));
|
|
}
|
|
|
|
/* 18.3.1.13 width calculations */
|
|
/* [MS-OI29500] 2.1.595 Column Width & Formatting */
|
|
var DEF_MDW = 6,
|
|
MAX_MDW = 15,
|
|
MIN_MDW = 1,
|
|
MDW = DEF_MDW;
|
|
function width2px(width) {
|
|
return Math.floor((width + Math.round(128 / MDW) / 256) * MDW);
|
|
}
|
|
function px2char(px) {
|
|
return Math.floor((px - 5) / MDW * 100 + 0.5) / 100;
|
|
}
|
|
function char2width(chr) {
|
|
return Math.round((chr * MDW + 5) / MDW * 256) / 256;
|
|
}
|
|
//function px2char_(px) { return (((px - 5)/MDW * 100 + 0.5))/100; }
|
|
//function char2width_(chr) { return (((chr * MDW + 5)/MDW*256))/256; }
|
|
function cycle_width(collw) {
|
|
return char2width(px2char(width2px(collw)));
|
|
}
|
|
/* XLSX/XLSB/XLS specify width in units of MDW */
|
|
function find_mdw_colw(collw) {
|
|
var delta = Math.abs(collw - cycle_width(collw)),
|
|
_MDW = MDW;
|
|
if (delta > 0.005) for (MDW = MIN_MDW; MDW < MAX_MDW; ++MDW) {
|
|
if (Math.abs(collw - cycle_width(collw)) <= delta) {
|
|
delta = Math.abs(collw - cycle_width(collw));
|
|
_MDW = MDW;
|
|
}
|
|
}
|
|
MDW = _MDW;
|
|
}
|
|
/* XLML specifies width in terms of pixels */
|
|
/*function find_mdw_wpx(wpx) {
|
|
var delta = Infinity, guess = 0, _MDW = MIN_MDW;
|
|
for(MDW=MIN_MDW; MDW<MAX_MDW; ++MDW) {
|
|
guess = char2width_(px2char_(wpx))*256;
|
|
guess = (guess) % 1;
|
|
if(guess > 0.5) guess--;
|
|
if(Math.abs(guess) < delta) { delta = Math.abs(guess); _MDW = MDW; }
|
|
}
|
|
MDW = _MDW;
|
|
}*/
|
|
|
|
function process_col(coll) {
|
|
if (coll.width) {
|
|
coll.wpx = width2px(coll.width);
|
|
coll.wch = px2char(coll.wpx);
|
|
coll.MDW = MDW;
|
|
} else if (coll.wpx) {
|
|
coll.wch = px2char(coll.wpx);
|
|
coll.width = char2width(coll.wch);
|
|
coll.MDW = MDW;
|
|
} else if (typeof coll.wch == 'number') {
|
|
coll.width = char2width(coll.wch);
|
|
coll.wpx = width2px(coll.width);
|
|
coll.MDW = MDW;
|
|
}
|
|
if (coll.customWidth) delete coll.customWidth;
|
|
}
|
|
var DEF_PPI = 96,
|
|
PPI = DEF_PPI;
|
|
function px2pt(px) {
|
|
return px * 96 / PPI;
|
|
}
|
|
function pt2px(pt) {
|
|
return pt * PPI / 96;
|
|
}
|
|
|
|
/* [MS-EXSPXML3] 2.4.54 ST_enmPattern */
|
|
var XLMLPatternTypeMap = {
|
|
"None": "none",
|
|
"Solid": "solid",
|
|
"Gray50": "mediumGray",
|
|
"Gray75": "darkGray",
|
|
"Gray25": "lightGray",
|
|
"HorzStripe": "darkHorizontal",
|
|
"VertStripe": "darkVertical",
|
|
"ReverseDiagStripe": "darkDown",
|
|
"DiagStripe": "darkUp",
|
|
"DiagCross": "darkGrid",
|
|
"ThickDiagCross": "darkTrellis",
|
|
"ThinHorzStripe": "lightHorizontal",
|
|
"ThinVertStripe": "lightVertical",
|
|
"ThinReverseDiagStripe": "lightDown",
|
|
"ThinHorzCross": "lightGrid"
|
|
};
|
|
|
|
/* 18.8.5 borders CT_Borders */
|
|
function parse_borders(t, styles, themes, opts) {
|
|
styles.Borders = [];
|
|
var border = {};
|
|
var pass = false;
|
|
(t[0].match(tagregex) || []).forEach(function (x) {
|
|
var y = parsexmltag(x);
|
|
switch (strip_ns(y[0])) {
|
|
case '<borders':
|
|
case '<borders>':
|
|
case '</borders>':
|
|
break;
|
|
|
|
/* 18.8.4 border CT_Border */
|
|
case '<border':
|
|
case '<border>':
|
|
case '<border/>':
|
|
border = {};
|
|
if (y.diagonalUp) border.diagonalUp = parsexmlbool(y.diagonalUp);
|
|
if (y.diagonalDown) border.diagonalDown = parsexmlbool(y.diagonalDown);
|
|
styles.Borders.push(border);
|
|
break;
|
|
case '</border>':
|
|
break;
|
|
|
|
/* note: not in spec, appears to be CT_BorderPr */
|
|
case '<left/>':
|
|
break;
|
|
case '<left':
|
|
case '<left>':
|
|
break;
|
|
case '</left>':
|
|
break;
|
|
|
|
/* note: not in spec, appears to be CT_BorderPr */
|
|
case '<right/>':
|
|
break;
|
|
case '<right':
|
|
case '<right>':
|
|
break;
|
|
case '</right>':
|
|
break;
|
|
|
|
/* 18.8.43 top CT_BorderPr */
|
|
case '<top/>':
|
|
break;
|
|
case '<top':
|
|
case '<top>':
|
|
break;
|
|
case '</top>':
|
|
break;
|
|
|
|
/* 18.8.6 bottom CT_BorderPr */
|
|
case '<bottom/>':
|
|
break;
|
|
case '<bottom':
|
|
case '<bottom>':
|
|
break;
|
|
case '</bottom>':
|
|
break;
|
|
|
|
/* 18.8.13 diagonal CT_BorderPr */
|
|
case '<diagonal':
|
|
case '<diagonal>':
|
|
case '<diagonal/>':
|
|
break;
|
|
case '</diagonal>':
|
|
break;
|
|
|
|
/* 18.8.25 horizontal CT_BorderPr */
|
|
case '<horizontal':
|
|
case '<horizontal>':
|
|
case '<horizontal/>':
|
|
break;
|
|
case '</horizontal>':
|
|
break;
|
|
|
|
/* 18.8.44 vertical CT_BorderPr */
|
|
case '<vertical':
|
|
case '<vertical>':
|
|
case '<vertical/>':
|
|
break;
|
|
case '</vertical>':
|
|
break;
|
|
|
|
/* 18.8.37 start CT_BorderPr */
|
|
case '<start':
|
|
case '<start>':
|
|
case '<start/>':
|
|
break;
|
|
case '</start>':
|
|
break;
|
|
|
|
/* 18.8.16 end CT_BorderPr */
|
|
case '<end':
|
|
case '<end>':
|
|
case '<end/>':
|
|
break;
|
|
case '</end>':
|
|
break;
|
|
|
|
/* 18.8.? color CT_Color */
|
|
case '<color':
|
|
case '<color>':
|
|
break;
|
|
case '<color/>':
|
|
case '</color>':
|
|
break;
|
|
|
|
/* 18.2.10 extLst CT_ExtensionList ? */
|
|
case '<extLst':
|
|
case '<extLst>':
|
|
case '</extLst>':
|
|
break;
|
|
case '<ext':
|
|
pass = true;
|
|
break;
|
|
case '</ext>':
|
|
pass = false;
|
|
break;
|
|
default:
|
|
if (opts && opts.WTF) {
|
|
if (!pass) throw new Error('unrecognized ' + y[0] + ' in borders');
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
/* 18.8.21 fills CT_Fills */
|
|
function parse_fills(t, styles, themes, opts) {
|
|
styles.Fills = [];
|
|
var fill = {};
|
|
var pass = false;
|
|
(t[0].match(tagregex) || []).forEach(function (x) {
|
|
var y = parsexmltag(x);
|
|
switch (strip_ns(y[0])) {
|
|
case '<fills':
|
|
case '<fills>':
|
|
case '</fills>':
|
|
break;
|
|
|
|
/* 18.8.20 fill CT_Fill */
|
|
case '<fill>':
|
|
case '<fill':
|
|
case '<fill/>':
|
|
fill = {};
|
|
styles.Fills.push(fill);
|
|
break;
|
|
case '</fill>':
|
|
break;
|
|
|
|
/* 18.8.24 gradientFill CT_GradientFill */
|
|
case '<gradientFill>':
|
|
break;
|
|
case '<gradientFill':
|
|
case '</gradientFill>':
|
|
styles.Fills.push(fill);
|
|
fill = {};
|
|
break;
|
|
|
|
/* 18.8.32 patternFill CT_PatternFill */
|
|
case '<patternFill':
|
|
case '<patternFill>':
|
|
if (y.patternType) fill.patternType = y.patternType;
|
|
break;
|
|
case '<patternFill/>':
|
|
case '</patternFill>':
|
|
break;
|
|
|
|
/* 18.8.3 bgColor CT_Color */
|
|
case '<bgColor':
|
|
if (!fill.bgColor) fill.bgColor = {};
|
|
if (y.indexed) fill.bgColor.indexed = parseInt(y.indexed, 10);
|
|
if (y.theme) fill.bgColor.theme = parseInt(y.theme, 10);
|
|
if (y.tint) fill.bgColor.tint = parseFloat(y.tint);
|
|
/* Excel uses ARGB strings */
|
|
if (y.rgb) fill.bgColor.rgb = y.rgb.slice(-6);
|
|
break;
|
|
case '<bgColor/>':
|
|
case '</bgColor>':
|
|
break;
|
|
|
|
/* 18.8.19 fgColor CT_Color */
|
|
case '<fgColor':
|
|
if (!fill.fgColor) fill.fgColor = {};
|
|
if (y.theme) fill.fgColor.theme = parseInt(y.theme, 10);
|
|
if (y.tint) fill.fgColor.tint = parseFloat(y.tint);
|
|
/* Excel uses ARGB strings */
|
|
if (y.rgb != null) fill.fgColor.rgb = y.rgb.slice(-6);
|
|
break;
|
|
case '<fgColor/>':
|
|
case '</fgColor>':
|
|
break;
|
|
|
|
/* 18.8.38 stop CT_GradientStop */
|
|
case '<stop':
|
|
case '<stop/>':
|
|
break;
|
|
case '</stop>':
|
|
break;
|
|
|
|
/* 18.8.? color CT_Color */
|
|
case '<color':
|
|
case '<color/>':
|
|
break;
|
|
case '</color>':
|
|
break;
|
|
|
|
/* 18.2.10 extLst CT_ExtensionList ? */
|
|
case '<extLst':
|
|
case '<extLst>':
|
|
case '</extLst>':
|
|
break;
|
|
case '<ext':
|
|
pass = true;
|
|
break;
|
|
case '</ext>':
|
|
pass = false;
|
|
break;
|
|
default:
|
|
if (opts && opts.WTF) {
|
|
if (!pass) throw new Error('unrecognized ' + y[0] + ' in fills');
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
/* 18.8.23 fonts CT_Fonts */
|
|
function parse_fonts(t, styles, themes, opts) {
|
|
styles.Fonts = [];
|
|
var font = {};
|
|
var pass = false;
|
|
(t[0].match(tagregex) || []).forEach(function (x) {
|
|
var y = parsexmltag(x);
|
|
switch (strip_ns(y[0])) {
|
|
case '<fonts':
|
|
case '<fonts>':
|
|
case '</fonts>':
|
|
break;
|
|
|
|
/* 18.8.22 font CT_Font */
|
|
case '<font':
|
|
case '<font>':
|
|
break;
|
|
case '</font>':
|
|
case '<font/>':
|
|
styles.Fonts.push(font);
|
|
font = {};
|
|
break;
|
|
|
|
/* 18.8.29 name CT_FontName */
|
|
case '<name':
|
|
if (y.val) font.name = utf8read(y.val);
|
|
break;
|
|
case '<name/>':
|
|
case '</name>':
|
|
break;
|
|
|
|
/* 18.8.2 b CT_BooleanProperty */
|
|
case '<b':
|
|
font.bold = y.val ? parsexmlbool(y.val) : 1;
|
|
break;
|
|
case '<b/>':
|
|
font.bold = 1;
|
|
break;
|
|
|
|
/* 18.8.26 i CT_BooleanProperty */
|
|
case '<i':
|
|
font.italic = y.val ? parsexmlbool(y.val) : 1;
|
|
break;
|
|
case '<i/>':
|
|
font.italic = 1;
|
|
break;
|
|
|
|
/* 18.4.13 u CT_UnderlineProperty */
|
|
case '<u':
|
|
switch (y.val) {
|
|
case "none":
|
|
font.underline = 0x00;
|
|
break;
|
|
case "single":
|
|
font.underline = 0x01;
|
|
break;
|
|
case "double":
|
|
font.underline = 0x02;
|
|
break;
|
|
case "singleAccounting":
|
|
font.underline = 0x21;
|
|
break;
|
|
case "doubleAccounting":
|
|
font.underline = 0x22;
|
|
break;
|
|
}
|
|
break;
|
|
case '<u/>':
|
|
font.underline = 1;
|
|
break;
|
|
|
|
/* 18.4.10 strike CT_BooleanProperty */
|
|
case '<strike':
|
|
font.strike = y.val ? parsexmlbool(y.val) : 1;
|
|
break;
|
|
case '<strike/>':
|
|
font.strike = 1;
|
|
break;
|
|
|
|
/* 18.4.2 outline CT_BooleanProperty */
|
|
case '<outline':
|
|
font.outline = y.val ? parsexmlbool(y.val) : 1;
|
|
break;
|
|
case '<outline/>':
|
|
font.outline = 1;
|
|
break;
|
|
|
|
/* 18.8.36 shadow CT_BooleanProperty */
|
|
case '<shadow':
|
|
font.shadow = y.val ? parsexmlbool(y.val) : 1;
|
|
break;
|
|
case '<shadow/>':
|
|
font.shadow = 1;
|
|
break;
|
|
|
|
/* 18.8.12 condense CT_BooleanProperty */
|
|
case '<condense':
|
|
font.condense = y.val ? parsexmlbool(y.val) : 1;
|
|
break;
|
|
case '<condense/>':
|
|
font.condense = 1;
|
|
break;
|
|
|
|
/* 18.8.17 extend CT_BooleanProperty */
|
|
case '<extend':
|
|
font.extend = y.val ? parsexmlbool(y.val) : 1;
|
|
break;
|
|
case '<extend/>':
|
|
font.extend = 1;
|
|
break;
|
|
|
|
/* 18.4.11 sz CT_FontSize */
|
|
case '<sz':
|
|
if (y.val) font.sz = +y.val;
|
|
break;
|
|
case '<sz/>':
|
|
case '</sz>':
|
|
break;
|
|
|
|
/* 18.4.14 vertAlign CT_VerticalAlignFontProperty */
|
|
case '<vertAlign':
|
|
if (y.val) font.vertAlign = y.val;
|
|
break;
|
|
case '<vertAlign/>':
|
|
case '</vertAlign>':
|
|
break;
|
|
|
|
/* 18.8.18 family CT_FontFamily */
|
|
case '<family':
|
|
if (y.val) font.family = parseInt(y.val, 10);
|
|
break;
|
|
case '<family/>':
|
|
case '</family>':
|
|
break;
|
|
|
|
/* 18.8.35 scheme CT_FontScheme */
|
|
case '<scheme':
|
|
if (y.val) font.scheme = y.val;
|
|
break;
|
|
case '<scheme/>':
|
|
case '</scheme>':
|
|
break;
|
|
|
|
/* 18.4.1 charset CT_IntProperty */
|
|
case '<charset':
|
|
if (y.val == '1') break;
|
|
y.codepage = CS2CP[parseInt(y.val, 10)];
|
|
break;
|
|
|
|
/* 18.?.? color CT_Color */
|
|
case '<color':
|
|
if (!font.color) font.color = {};
|
|
if (y.auto) font.color.auto = parsexmlbool(y.auto);
|
|
if (y.rgb) font.color.rgb = y.rgb.slice(-6);else if (y.indexed) {
|
|
font.color.index = parseInt(y.indexed, 10);
|
|
var icv = XLSIcv[font.color.index];
|
|
if (font.color.index == 81) icv = XLSIcv[1];
|
|
if (!icv) icv = XLSIcv[1]; //throw new Error(x); // note: 206 is valid
|
|
font.color.rgb = icv[0].toString(16) + icv[1].toString(16) + icv[2].toString(16);
|
|
} else if (y.theme) {
|
|
font.color.theme = parseInt(y.theme, 10);
|
|
if (y.tint) font.color.tint = parseFloat(y.tint);
|
|
if (y.theme && themes.themeElements && themes.themeElements.clrScheme) {
|
|
font.color.rgb = rgb_tint(themes.themeElements.clrScheme[font.color.theme].rgb, font.color.tint || 0);
|
|
}
|
|
}
|
|
break;
|
|
case '<color/>':
|
|
case '</color>':
|
|
break;
|
|
|
|
/* note: sometimes mc:AlternateContent appears bare */
|
|
case '<AlternateContent':
|
|
pass = true;
|
|
break;
|
|
case '</AlternateContent>':
|
|
pass = false;
|
|
break;
|
|
|
|
/* 18.2.10 extLst CT_ExtensionList ? */
|
|
case '<extLst':
|
|
case '<extLst>':
|
|
case '</extLst>':
|
|
break;
|
|
case '<ext':
|
|
pass = true;
|
|
break;
|
|
case '</ext>':
|
|
pass = false;
|
|
break;
|
|
default:
|
|
if (opts && opts.WTF) {
|
|
if (!pass) throw new Error('unrecognized ' + y[0] + ' in fonts');
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
/* 18.8.31 numFmts CT_NumFmts */
|
|
function parse_numFmts(t, styles, opts) {
|
|
styles.NumberFmt = [];
|
|
var k /*Array<number>*/ = keys(SSF._table);
|
|
for (var i = 0; i < k.length; ++i) {
|
|
styles.NumberFmt[k[i]] = SSF._table[k[i]];
|
|
}
|
|
var m = t[0].match(tagregex);
|
|
if (!m) return;
|
|
for (i = 0; i < m.length; ++i) {
|
|
var y = parsexmltag(m[i]);
|
|
switch (strip_ns(y[0])) {
|
|
case '<numFmts':
|
|
case '</numFmts>':
|
|
case '<numFmts/>':
|
|
case '<numFmts>':
|
|
break;
|
|
case '<numFmt':
|
|
{
|
|
var f = unescapexml(utf8read(y.formatCode)),
|
|
j = parseInt(y.numFmtId, 10);
|
|
styles.NumberFmt[j] = f;
|
|
if (j > 0) {
|
|
if (j > 0x188) {
|
|
for (j = 0x188; j > 0x3c; --j) {
|
|
if (styles.NumberFmt[j] == null) break;
|
|
}
|
|
styles.NumberFmt[j] = f;
|
|
}
|
|
SSF.load(f, j);
|
|
}
|
|
}
|
|
break;
|
|
case '</numFmt>':
|
|
break;
|
|
default:
|
|
if (opts.WTF) throw new Error('unrecognized ' + y[0] + ' in numFmts');
|
|
}
|
|
}
|
|
}
|
|
function write_numFmts(NF) {
|
|
var o = ["<numFmts>"];
|
|
[[5, 8], [23, 26], [41, 44], [/*63*/50, /*66],[164,*/392]].forEach(function (r) {
|
|
for (var i = r[0]; i <= r[1]; ++i) {
|
|
if (NF[i] != null) o[o.length] = writextag('numFmt', null, {
|
|
numFmtId: i,
|
|
formatCode: escapexml(NF[i])
|
|
});
|
|
}
|
|
});
|
|
if (o.length === 1) return "";
|
|
o[o.length] = "</numFmts>";
|
|
o[0] = writextag('numFmts', null, {
|
|
count: o.length - 2
|
|
}).replace("/>", ">");
|
|
return o.join("");
|
|
}
|
|
|
|
/* 18.8.10 cellXfs CT_CellXfs */
|
|
var cellXF_uint = ["numFmtId", "fillId", "fontId", "borderId", "xfId"];
|
|
var cellXF_bool = ["applyAlignment", "applyBorder", "applyFill", "applyFont", "applyNumberFormat", "applyProtection", "pivotButton", "quotePrefix"];
|
|
function parse_cellXfs(t, styles, opts) {
|
|
styles.CellXf = [];
|
|
var xf;
|
|
var pass = false;
|
|
(t[0].match(tagregex) || []).forEach(function (x) {
|
|
var y = parsexmltag(x),
|
|
i = 0;
|
|
switch (strip_ns(y[0])) {
|
|
case '<cellXfs':
|
|
case '<cellXfs>':
|
|
case '<cellXfs/>':
|
|
case '</cellXfs>':
|
|
break;
|
|
|
|
/* 18.8.45 xf CT_Xf */
|
|
case '<xf':
|
|
case '<xf/>':
|
|
xf = y;
|
|
delete xf[0];
|
|
for (i = 0; i < cellXF_uint.length; ++i) {
|
|
if (xf[cellXF_uint[i]]) xf[cellXF_uint[i]] = parseInt(xf[cellXF_uint[i]], 10);
|
|
}
|
|
for (i = 0; i < cellXF_bool.length; ++i) {
|
|
if (xf[cellXF_bool[i]]) xf[cellXF_bool[i]] = parsexmlbool(xf[cellXF_bool[i]]);
|
|
}
|
|
if (styles.NumberFmt && xf.numFmtId > 0x188) {
|
|
for (i = 0x188; i > 0x3c; --i) {
|
|
if (styles.NumberFmt[xf.numFmtId] == styles.NumberFmt[i]) {
|
|
xf.numFmtId = i;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
styles.CellXf.push(xf);
|
|
break;
|
|
case '</xf>':
|
|
break;
|
|
|
|
/* 18.8.1 alignment CT_CellAlignment */
|
|
case '<alignment':
|
|
case '<alignment/>':
|
|
var alignment = {};
|
|
if (y.vertical) alignment.vertical = y.vertical;
|
|
if (y.horizontal) alignment.horizontal = y.horizontal;
|
|
if (y.textRotation != null) alignment.textRotation = y.textRotation;
|
|
if (y.indent) alignment.indent = y.indent;
|
|
if (y.wrapText) alignment.wrapText = parsexmlbool(y.wrapText);
|
|
xf.alignment = alignment;
|
|
break;
|
|
case '</alignment>':
|
|
break;
|
|
|
|
/* 18.8.33 protection CT_CellProtection */
|
|
case '<protection':
|
|
break;
|
|
case '</protection>':
|
|
case '<protection/>':
|
|
break;
|
|
|
|
/* note: sometimes mc:AlternateContent appears bare */
|
|
case '<AlternateContent':
|
|
pass = true;
|
|
break;
|
|
case '</AlternateContent>':
|
|
pass = false;
|
|
break;
|
|
|
|
/* 18.2.10 extLst CT_ExtensionList ? */
|
|
case '<extLst':
|
|
case '<extLst>':
|
|
case '</extLst>':
|
|
break;
|
|
case '<ext':
|
|
pass = true;
|
|
break;
|
|
case '</ext>':
|
|
pass = false;
|
|
break;
|
|
default:
|
|
if (opts && opts.WTF) {
|
|
if (!pass) throw new Error('unrecognized ' + y[0] + ' in cellXfs');
|
|
}
|
|
}
|
|
});
|
|
}
|
|
function write_cellXfs(cellXfs) {
|
|
var o = [];
|
|
o[o.length] = writextag('cellXfs', null);
|
|
cellXfs.forEach(function (c) {
|
|
o[o.length] = writextag('xf', null, c);
|
|
});
|
|
o[o.length] = "</cellXfs>";
|
|
if (o.length === 2) return "";
|
|
o[0] = writextag('cellXfs', null, {
|
|
count: o.length - 2
|
|
}).replace("/>", ">");
|
|
return o.join("");
|
|
}
|
|
|
|
/* 18.8 Styles CT_Stylesheet*/
|
|
var parse_sty_xml = function make_pstyx() {
|
|
var numFmtRegex = /<(?:\w+:)?numFmts([^>]*)>[\S\s]*?<\/(?:\w+:)?numFmts>/;
|
|
var cellXfRegex = /<(?:\w+:)?cellXfs([^>]*)>[\S\s]*?<\/(?:\w+:)?cellXfs>/;
|
|
var fillsRegex = /<(?:\w+:)?fills([^>]*)>[\S\s]*?<\/(?:\w+:)?fills>/;
|
|
var fontsRegex = /<(?:\w+:)?fonts([^>]*)>[\S\s]*?<\/(?:\w+:)?fonts>/;
|
|
var bordersRegex = /<(?:\w+:)?borders([^>]*)>[\S\s]*?<\/(?:\w+:)?borders>/;
|
|
return function parse_sty_xml(data, themes, opts) {
|
|
var styles = {};
|
|
if (!data) return styles;
|
|
data = data.replace(/<!--([\s\S]*?)-->/mg, "").replace(/<!DOCTYPE[^\[]*\[[^\]]*\]>/gm, "");
|
|
/* 18.8.39 styleSheet CT_Stylesheet */
|
|
var t;
|
|
|
|
/* 18.8.31 numFmts CT_NumFmts ? */
|
|
if (t = data.match(numFmtRegex)) parse_numFmts(t, styles, opts);
|
|
|
|
/* 18.8.23 fonts CT_Fonts ? */
|
|
if (t = data.match(fontsRegex)) parse_fonts(t, styles, themes, opts);
|
|
|
|
/* 18.8.21 fills CT_Fills ? */
|
|
if (t = data.match(fillsRegex)) parse_fills(t, styles, themes, opts);
|
|
|
|
/* 18.8.5 borders CT_Borders ? */
|
|
if (t = data.match(bordersRegex)) parse_borders(t, styles, themes, opts);
|
|
|
|
/* 18.8.9 cellStyleXfs CT_CellStyleXfs ? */
|
|
/* 18.8.8 cellStyles CT_CellStyles ? */
|
|
|
|
/* 18.8.10 cellXfs CT_CellXfs ? */
|
|
if (t = data.match(cellXfRegex)) parse_cellXfs(t, styles, opts);
|
|
|
|
/* 18.8.15 dxfs CT_Dxfs ? */
|
|
/* 18.8.42 tableStyles CT_TableStyles ? */
|
|
/* 18.8.11 colors CT_Colors ? */
|
|
/* 18.2.10 extLst CT_ExtensionList ? */
|
|
|
|
return styles;
|
|
};
|
|
}();
|
|
var STYLES_XML_ROOT = writextag('styleSheet', null, {
|
|
'xmlns': XMLNS.main[0],
|
|
'xmlns:vt': XMLNS.vt
|
|
});
|
|
RELS.STY = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles";
|
|
function write_sty_xml(wb, opts) {
|
|
var o = [XML_HEADER, STYLES_XML_ROOT],
|
|
w;
|
|
if (wb.SSF && (w = write_numFmts(wb.SSF)) != null) o[o.length] = w;
|
|
o[o.length] = '<fonts count="1"><font><sz val="12"/><color theme="1"/><name val="Calibri"/><family val="2"/><scheme val="minor"/></font></fonts>';
|
|
o[o.length] = '<fills count="2"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill></fills>';
|
|
o[o.length] = '<borders count="1"><border><left/><right/><top/><bottom/><diagonal/></border></borders>';
|
|
o[o.length] = '<cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"/></cellStyleXfs>';
|
|
if (w = write_cellXfs(opts.cellXfs)) o[o.length] = w;
|
|
o[o.length] = '<cellStyles count="1"><cellStyle name="Normal" xfId="0" builtinId="0"/></cellStyles>';
|
|
o[o.length] = '<dxfs count="0"/>';
|
|
o[o.length] = '<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleMedium4"/>';
|
|
if (o.length > 2) {
|
|
o[o.length] = '</styleSheet>';
|
|
o[1] = o[1].replace("/>", ">");
|
|
}
|
|
return o.join("");
|
|
}
|
|
RELS.THEME = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme";
|
|
|
|
/* Even though theme layout is dk1 lt1 dk2 lt2, true order is lt1 dk1 lt2 dk2 */
|
|
var XLSXThemeClrScheme = ['</a:lt1>', '</a:dk1>', '</a:lt2>', '</a:dk2>', '</a:accent1>', '</a:accent2>', '</a:accent3>', '</a:accent4>', '</a:accent5>', '</a:accent6>', '</a:hlink>', '</a:folHlink>'];
|
|
/* 20.1.6.2 clrScheme CT_ColorScheme */
|
|
function parse_clrScheme(t, themes, opts) {
|
|
themes.themeElements.clrScheme = [];
|
|
var color = {};
|
|
(t[0].match(tagregex) || []).forEach(function (x) {
|
|
var y = parsexmltag(x);
|
|
switch (y[0]) {
|
|
/* 20.1.6.2 clrScheme (Color Scheme) CT_ColorScheme */
|
|
case '<a:clrScheme':
|
|
case '</a:clrScheme>':
|
|
break;
|
|
|
|
/* 20.1.2.3.32 srgbClr CT_SRgbColor */
|
|
case '<a:srgbClr':
|
|
color.rgb = y.val;
|
|
break;
|
|
|
|
/* 20.1.2.3.33 sysClr CT_SystemColor */
|
|
case '<a:sysClr':
|
|
color.rgb = y.lastClr;
|
|
break;
|
|
|
|
/* 20.1.4.1.1 accent1 (Accent 1) */
|
|
/* 20.1.4.1.2 accent2 (Accent 2) */
|
|
/* 20.1.4.1.3 accent3 (Accent 3) */
|
|
/* 20.1.4.1.4 accent4 (Accent 4) */
|
|
/* 20.1.4.1.5 accent5 (Accent 5) */
|
|
/* 20.1.4.1.6 accent6 (Accent 6) */
|
|
/* 20.1.4.1.9 dk1 (Dark 1) */
|
|
/* 20.1.4.1.10 dk2 (Dark 2) */
|
|
/* 20.1.4.1.15 folHlink (Followed Hyperlink) */
|
|
/* 20.1.4.1.19 hlink (Hyperlink) */
|
|
/* 20.1.4.1.22 lt1 (Light 1) */
|
|
/* 20.1.4.1.23 lt2 (Light 2) */
|
|
case '<a:dk1>':
|
|
case '</a:dk1>':
|
|
case '<a:lt1>':
|
|
case '</a:lt1>':
|
|
case '<a:dk2>':
|
|
case '</a:dk2>':
|
|
case '<a:lt2>':
|
|
case '</a:lt2>':
|
|
case '<a:accent1>':
|
|
case '</a:accent1>':
|
|
case '<a:accent2>':
|
|
case '</a:accent2>':
|
|
case '<a:accent3>':
|
|
case '</a:accent3>':
|
|
case '<a:accent4>':
|
|
case '</a:accent4>':
|
|
case '<a:accent5>':
|
|
case '</a:accent5>':
|
|
case '<a:accent6>':
|
|
case '</a:accent6>':
|
|
case '<a:hlink>':
|
|
case '</a:hlink>':
|
|
case '<a:folHlink>':
|
|
case '</a:folHlink>':
|
|
if (y[0].charAt(1) === '/') {
|
|
themes.themeElements.clrScheme[XLSXThemeClrScheme.indexOf(y[0])] = color;
|
|
color = {};
|
|
} else {
|
|
color.name = y[0].slice(3, y[0].length - 1);
|
|
}
|
|
break;
|
|
default:
|
|
if (opts && opts.WTF) throw new Error('Unrecognized ' + y[0] + ' in clrScheme');
|
|
}
|
|
});
|
|
}
|
|
|
|
/* 20.1.4.1.18 fontScheme CT_FontScheme */
|
|
function parse_fontScheme() {}
|
|
|
|
/* 20.1.4.1.15 fmtScheme CT_StyleMatrix */
|
|
function parse_fmtScheme() {}
|
|
var clrsregex = /<a:clrScheme([^>]*)>[\s\S]*<\/a:clrScheme>/;
|
|
var fntsregex = /<a:fontScheme([^>]*)>[\s\S]*<\/a:fontScheme>/;
|
|
var fmtsregex = /<a:fmtScheme([^>]*)>[\s\S]*<\/a:fmtScheme>/;
|
|
|
|
/* 20.1.6.10 themeElements CT_BaseStyles */
|
|
function parse_themeElements(data, themes, opts) {
|
|
themes.themeElements = {};
|
|
var t;
|
|
[/* clrScheme CT_ColorScheme */
|
|
['clrScheme', clrsregex, parse_clrScheme], /* fontScheme CT_FontScheme */
|
|
['fontScheme', fntsregex, parse_fontScheme], /* fmtScheme CT_StyleMatrix */
|
|
['fmtScheme', fmtsregex, parse_fmtScheme]].forEach(function (m) {
|
|
if (!(t = data.match(m[1]))) throw new Error(m[0] + ' not found in themeElements');
|
|
m[2](t, themes, opts);
|
|
});
|
|
}
|
|
var themeltregex = /<a:themeElements([^>]*)>[\s\S]*<\/a:themeElements>/;
|
|
|
|
/* 14.2.7 Theme Part */
|
|
function parse_theme_xml(data, opts) {
|
|
/* 20.1.6.9 theme CT_OfficeStyleSheet */
|
|
if (!data || data.length === 0) return parse_theme_xml(write_theme());
|
|
var t;
|
|
var themes = {};
|
|
|
|
/* themeElements CT_BaseStyles */
|
|
if (!(t = data.match(themeltregex))) throw new Error('themeElements not found in theme');
|
|
parse_themeElements(t[0], themes, opts);
|
|
themes.raw = data;
|
|
return themes;
|
|
}
|
|
function write_theme(Themes, opts) {
|
|
if (opts && opts.themeXLSX) return opts.themeXLSX;
|
|
if (Themes && typeof Themes.raw == "string") return Themes.raw;
|
|
var o = [XML_HEADER];
|
|
o[o.length] = '<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme">';
|
|
o[o.length] = '<a:themeElements>';
|
|
o[o.length] = '<a:clrScheme name="Office">';
|
|
o[o.length] = '<a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1>';
|
|
o[o.length] = '<a:lt1><a:sysClr val="window" lastClr="FFFFFF"/></a:lt1>';
|
|
o[o.length] = '<a:dk2><a:srgbClr val="1F497D"/></a:dk2>';
|
|
o[o.length] = '<a:lt2><a:srgbClr val="EEECE1"/></a:lt2>';
|
|
o[o.length] = '<a:accent1><a:srgbClr val="4F81BD"/></a:accent1>';
|
|
o[o.length] = '<a:accent2><a:srgbClr val="C0504D"/></a:accent2>';
|
|
o[o.length] = '<a:accent3><a:srgbClr val="9BBB59"/></a:accent3>';
|
|
o[o.length] = '<a:accent4><a:srgbClr val="8064A2"/></a:accent4>';
|
|
o[o.length] = '<a:accent5><a:srgbClr val="4BACC6"/></a:accent5>';
|
|
o[o.length] = '<a:accent6><a:srgbClr val="F79646"/></a:accent6>';
|
|
o[o.length] = '<a:hlink><a:srgbClr val="0000FF"/></a:hlink>';
|
|
o[o.length] = '<a:folHlink><a:srgbClr val="800080"/></a:folHlink>';
|
|
o[o.length] = '</a:clrScheme>';
|
|
o[o.length] = '<a:fontScheme name="Office">';
|
|
o[o.length] = '<a:majorFont>';
|
|
o[o.length] = '<a:latin typeface="Cambria"/>';
|
|
o[o.length] = '<a:ea typeface=""/>';
|
|
o[o.length] = '<a:cs typeface=""/>';
|
|
o[o.length] = '<a:font script="Jpan" typeface="MS Pゴシック"/>';
|
|
o[o.length] = '<a:font script="Hang" typeface="맑은 고딕"/>';
|
|
o[o.length] = '<a:font script="Hans" typeface="宋体"/>';
|
|
o[o.length] = '<a:font script="Hant" typeface="新細明體"/>';
|
|
o[o.length] = '<a:font script="Arab" typeface="Times New Roman"/>';
|
|
o[o.length] = '<a:font script="Hebr" typeface="Times New Roman"/>';
|
|
o[o.length] = '<a:font script="Thai" typeface="Tahoma"/>';
|
|
o[o.length] = '<a:font script="Ethi" typeface="Nyala"/>';
|
|
o[o.length] = '<a:font script="Beng" typeface="Vrinda"/>';
|
|
o[o.length] = '<a:font script="Gujr" typeface="Shruti"/>';
|
|
o[o.length] = '<a:font script="Khmr" typeface="MoolBoran"/>';
|
|
o[o.length] = '<a:font script="Knda" typeface="Tunga"/>';
|
|
o[o.length] = '<a:font script="Guru" typeface="Raavi"/>';
|
|
o[o.length] = '<a:font script="Cans" typeface="Euphemia"/>';
|
|
o[o.length] = '<a:font script="Cher" typeface="Plantagenet Cherokee"/>';
|
|
o[o.length] = '<a:font script="Yiii" typeface="Microsoft Yi Baiti"/>';
|
|
o[o.length] = '<a:font script="Tibt" typeface="Microsoft Himalaya"/>';
|
|
o[o.length] = '<a:font script="Thaa" typeface="MV Boli"/>';
|
|
o[o.length] = '<a:font script="Deva" typeface="Mangal"/>';
|
|
o[o.length] = '<a:font script="Telu" typeface="Gautami"/>';
|
|
o[o.length] = '<a:font script="Taml" typeface="Latha"/>';
|
|
o[o.length] = '<a:font script="Syrc" typeface="Estrangelo Edessa"/>';
|
|
o[o.length] = '<a:font script="Orya" typeface="Kalinga"/>';
|
|
o[o.length] = '<a:font script="Mlym" typeface="Kartika"/>';
|
|
o[o.length] = '<a:font script="Laoo" typeface="DokChampa"/>';
|
|
o[o.length] = '<a:font script="Sinh" typeface="Iskoola Pota"/>';
|
|
o[o.length] = '<a:font script="Mong" typeface="Mongolian Baiti"/>';
|
|
o[o.length] = '<a:font script="Viet" typeface="Times New Roman"/>';
|
|
o[o.length] = '<a:font script="Uigh" typeface="Microsoft Uighur"/>';
|
|
o[o.length] = '<a:font script="Geor" typeface="Sylfaen"/>';
|
|
o[o.length] = '</a:majorFont>';
|
|
o[o.length] = '<a:minorFont>';
|
|
o[o.length] = '<a:latin typeface="Calibri"/>';
|
|
o[o.length] = '<a:ea typeface=""/>';
|
|
o[o.length] = '<a:cs typeface=""/>';
|
|
o[o.length] = '<a:font script="Jpan" typeface="MS Pゴシック"/>';
|
|
o[o.length] = '<a:font script="Hang" typeface="맑은 고딕"/>';
|
|
o[o.length] = '<a:font script="Hans" typeface="宋体"/>';
|
|
o[o.length] = '<a:font script="Hant" typeface="新細明體"/>';
|
|
o[o.length] = '<a:font script="Arab" typeface="Arial"/>';
|
|
o[o.length] = '<a:font script="Hebr" typeface="Arial"/>';
|
|
o[o.length] = '<a:font script="Thai" typeface="Tahoma"/>';
|
|
o[o.length] = '<a:font script="Ethi" typeface="Nyala"/>';
|
|
o[o.length] = '<a:font script="Beng" typeface="Vrinda"/>';
|
|
o[o.length] = '<a:font script="Gujr" typeface="Shruti"/>';
|
|
o[o.length] = '<a:font script="Khmr" typeface="DaunPenh"/>';
|
|
o[o.length] = '<a:font script="Knda" typeface="Tunga"/>';
|
|
o[o.length] = '<a:font script="Guru" typeface="Raavi"/>';
|
|
o[o.length] = '<a:font script="Cans" typeface="Euphemia"/>';
|
|
o[o.length] = '<a:font script="Cher" typeface="Plantagenet Cherokee"/>';
|
|
o[o.length] = '<a:font script="Yiii" typeface="Microsoft Yi Baiti"/>';
|
|
o[o.length] = '<a:font script="Tibt" typeface="Microsoft Himalaya"/>';
|
|
o[o.length] = '<a:font script="Thaa" typeface="MV Boli"/>';
|
|
o[o.length] = '<a:font script="Deva" typeface="Mangal"/>';
|
|
o[o.length] = '<a:font script="Telu" typeface="Gautami"/>';
|
|
o[o.length] = '<a:font script="Taml" typeface="Latha"/>';
|
|
o[o.length] = '<a:font script="Syrc" typeface="Estrangelo Edessa"/>';
|
|
o[o.length] = '<a:font script="Orya" typeface="Kalinga"/>';
|
|
o[o.length] = '<a:font script="Mlym" typeface="Kartika"/>';
|
|
o[o.length] = '<a:font script="Laoo" typeface="DokChampa"/>';
|
|
o[o.length] = '<a:font script="Sinh" typeface="Iskoola Pota"/>';
|
|
o[o.length] = '<a:font script="Mong" typeface="Mongolian Baiti"/>';
|
|
o[o.length] = '<a:font script="Viet" typeface="Arial"/>';
|
|
o[o.length] = '<a:font script="Uigh" typeface="Microsoft Uighur"/>';
|
|
o[o.length] = '<a:font script="Geor" typeface="Sylfaen"/>';
|
|
o[o.length] = '</a:minorFont>';
|
|
o[o.length] = '</a:fontScheme>';
|
|
o[o.length] = '<a:fmtScheme name="Office">';
|
|
o[o.length] = '<a:fillStyleLst>';
|
|
o[o.length] = '<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>';
|
|
o[o.length] = '<a:gradFill rotWithShape="1">';
|
|
o[o.length] = '<a:gsLst>';
|
|
o[o.length] = '<a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs>';
|
|
o[o.length] = '<a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod val="300000"/></a:schemeClr></a:gs>';
|
|
o[o.length] = '<a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs>';
|
|
o[o.length] = '</a:gsLst>';
|
|
o[o.length] = '<a:lin ang="16200000" scaled="1"/>';
|
|
o[o.length] = '</a:gradFill>';
|
|
o[o.length] = '<a:gradFill rotWithShape="1">';
|
|
o[o.length] = '<a:gsLst>';
|
|
o[o.length] = '<a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="100000"/><a:shade val="100000"/><a:satMod val="130000"/></a:schemeClr></a:gs>';
|
|
o[o.length] = '<a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="50000"/><a:shade val="100000"/><a:satMod val="350000"/></a:schemeClr></a:gs>';
|
|
o[o.length] = '</a:gsLst>';
|
|
o[o.length] = '<a:lin ang="16200000" scaled="0"/>';
|
|
o[o.length] = '</a:gradFill>';
|
|
o[o.length] = '</a:fillStyleLst>';
|
|
o[o.length] = '<a:lnStyleLst>';
|
|
o[o.length] = '<a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln>';
|
|
o[o.length] = '<a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln>';
|
|
o[o.length] = '<a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln>';
|
|
o[o.length] = '</a:lnStyleLst>';
|
|
o[o.length] = '<a:effectStyleLst>';
|
|
o[o.length] = '<a:effectStyle>';
|
|
o[o.length] = '<a:effectLst>';
|
|
o[o.length] = '<a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw>';
|
|
o[o.length] = '</a:effectLst>';
|
|
o[o.length] = '</a:effectStyle>';
|
|
o[o.length] = '<a:effectStyle>';
|
|
o[o.length] = '<a:effectLst>';
|
|
o[o.length] = '<a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw>';
|
|
o[o.length] = '</a:effectLst>';
|
|
o[o.length] = '</a:effectStyle>';
|
|
o[o.length] = '<a:effectStyle>';
|
|
o[o.length] = '<a:effectLst>';
|
|
o[o.length] = '<a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw>';
|
|
o[o.length] = '</a:effectLst>';
|
|
o[o.length] = '<a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d>';
|
|
o[o.length] = '<a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d>';
|
|
o[o.length] = '</a:effectStyle>';
|
|
o[o.length] = '</a:effectStyleLst>';
|
|
o[o.length] = '<a:bgFillStyleLst>';
|
|
o[o.length] = '<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>';
|
|
o[o.length] = '<a:gradFill rotWithShape="1">';
|
|
o[o.length] = '<a:gsLst>';
|
|
o[o.length] = '<a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs>';
|
|
o[o.length] = '<a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs>';
|
|
o[o.length] = '<a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs>';
|
|
o[o.length] = '</a:gsLst>';
|
|
o[o.length] = '<a:path path="circle"><a:fillToRect l="50000" t="-80000" r="50000" b="180000"/></a:path>';
|
|
o[o.length] = '</a:gradFill>';
|
|
o[o.length] = '<a:gradFill rotWithShape="1">';
|
|
o[o.length] = '<a:gsLst>';
|
|
o[o.length] = '<a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs>';
|
|
o[o.length] = '<a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs>';
|
|
o[o.length] = '</a:gsLst>';
|
|
o[o.length] = '<a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path>';
|
|
o[o.length] = '</a:gradFill>';
|
|
o[o.length] = '</a:bgFillStyleLst>';
|
|
o[o.length] = '</a:fmtScheme>';
|
|
o[o.length] = '</a:themeElements>';
|
|
o[o.length] = '<a:objectDefaults>';
|
|
o[o.length] = '<a:spDef>';
|
|
o[o.length] = '<a:spPr/><a:bodyPr/><a:lstStyle/><a:style><a:lnRef idx="1"><a:schemeClr val="accent1"/></a:lnRef><a:fillRef idx="3"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="2"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="lt1"/></a:fontRef></a:style>';
|
|
o[o.length] = '</a:spDef>';
|
|
o[o.length] = '<a:lnDef>';
|
|
o[o.length] = '<a:spPr/><a:bodyPr/><a:lstStyle/><a:style><a:lnRef idx="2"><a:schemeClr val="accent1"/></a:lnRef><a:fillRef idx="0"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="1"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="tx1"/></a:fontRef></a:style>';
|
|
o[o.length] = '</a:lnDef>';
|
|
o[o.length] = '</a:objectDefaults>';
|
|
o[o.length] = '<a:extraClrSchemeLst/>';
|
|
o[o.length] = '</a:theme>';
|
|
return o.join("");
|
|
}
|
|
/* 18.14 Supplementary Workbook Data */
|
|
function parse_xlink_xml() {
|
|
//var opts = _opts || {};
|
|
//if(opts.WTF) throw "XLSX External Link";
|
|
}
|
|
|
|
/* [MS-XLSB] 2.1.7.25 External Link */
|
|
function parse_xlink_bin(data, rel, name, _opts) {
|
|
if (!data) return data;
|
|
var opts = _opts || {};
|
|
var pass = false,
|
|
end = false;
|
|
recordhopper(data, function xlink_parse(val, R_n, RT) {
|
|
if (end) return;
|
|
switch (RT) {
|
|
case 0x0167: /* 'BrtSupTabs' */
|
|
case 0x016B: /* 'BrtExternTableStart' */
|
|
case 0x016C: /* 'BrtExternTableEnd' */
|
|
case 0x016E: /* 'BrtExternRowHdr' */
|
|
case 0x016F: /* 'BrtExternCellBlank' */
|
|
case 0x0170: /* 'BrtExternCellReal' */
|
|
case 0x0171: /* 'BrtExternCellBool' */
|
|
case 0x0172: /* 'BrtExternCellError' */
|
|
case 0x0173: /* 'BrtExternCellString' */
|
|
case 0x01D8: /* 'BrtExternValueMeta' */
|
|
case 0x0241: /* 'BrtSupNameStart' */
|
|
case 0x0242: /* 'BrtSupNameValueStart' */
|
|
case 0x0243: /* 'BrtSupNameValueEnd' */
|
|
case 0x0244: /* 'BrtSupNameNum' */
|
|
case 0x0245: /* 'BrtSupNameErr' */
|
|
case 0x0246: /* 'BrtSupNameSt' */
|
|
case 0x0247: /* 'BrtSupNameNil' */
|
|
case 0x0248: /* 'BrtSupNameBool' */
|
|
case 0x0249: /* 'BrtSupNameFmla' */
|
|
case 0x024A: /* 'BrtSupNameBits' */
|
|
case 0x024B:
|
|
/* 'BrtSupNameEnd' */
|
|
break;
|
|
case 0x0023:
|
|
/* 'BrtFRTBegin' */
|
|
pass = true;
|
|
break;
|
|
case 0x0024:
|
|
/* 'BrtFRTEnd' */
|
|
pass = false;
|
|
break;
|
|
default:
|
|
if ((R_n || "").indexOf("Begin") > 0) {/* empty */} else if ((R_n || "").indexOf("End") > 0) {/* empty */} else if (!pass || opts.WTF) throw new Error("Unexpected record " + RT.toString(16) + " " + R_n);
|
|
}
|
|
}, opts);
|
|
}
|
|
/* 20.5 DrawingML - SpreadsheetML Drawing */
|
|
RELS.IMG = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image";
|
|
RELS.DRAW = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing";
|
|
|
|
/* 20.5.2.35 wsDr CT_Drawing */
|
|
function parse_drawing(data, rels) {
|
|
if (!data) return "??";
|
|
/*
|
|
Chartsheet Drawing:
|
|
- 20.5.2.35 wsDr CT_Drawing
|
|
- 20.5.2.1 absoluteAnchor CT_AbsoluteAnchor
|
|
- 20.5.2.16 graphicFrame CT_GraphicalObjectFrame
|
|
- 20.1.2.2.16 graphic CT_GraphicalObject
|
|
- 20.1.2.2.17 graphicData CT_GraphicalObjectData
|
|
- chart reference
|
|
the actual type is based on the URI of the graphicData
|
|
TODO: handle embedded charts and other types of graphics
|
|
*/
|
|
var id = (data.match(/<c:chart [^>]*r:id="([^"]*)"/) || ["", ""])[1];
|
|
return rels['!id'][id].Target;
|
|
}
|
|
|
|
/* L.5.5.2 SpreadsheetML Comments + VML Schema */
|
|
var _shapeid = 1024;
|
|
function write_comments_vml(rId, comments) {
|
|
var csize = [21600, 21600];
|
|
/* L.5.2.1.2 Path Attribute */
|
|
var bbox = ["m0,0l0", csize[1], csize[0], csize[1], csize[0], "0xe"].join(",");
|
|
var o = [writextag("xml", null, {
|
|
'xmlns:v': XLMLNS.v,
|
|
'xmlns:o': XLMLNS.o,
|
|
'xmlns:x': XLMLNS.x,
|
|
'xmlns:mv': XLMLNS.mv
|
|
}).replace(/\/>/, ">"), writextag("o:shapelayout", writextag("o:idmap", null, {
|
|
'v:ext': "edit",
|
|
'data': rId
|
|
}), {
|
|
'v:ext': "edit"
|
|
}), writextag("v:shapetype", [writextag("v:stroke", null, {
|
|
joinstyle: "miter"
|
|
}), writextag("v:path", null, {
|
|
gradientshapeok: "t",
|
|
'o:connecttype': "rect"
|
|
})].join(""), {
|
|
id: "_x0000_t202",
|
|
'o:spt': 202,
|
|
coordsize: csize.join(","),
|
|
path: bbox
|
|
})];
|
|
while (_shapeid < rId * 1000) {
|
|
_shapeid += 1000;
|
|
}
|
|
comments.forEach(function (x) {
|
|
var c = decode_cell(x[0]);
|
|
var fillopts = {
|
|
'color2': "#BEFF82",
|
|
'type': "gradient"
|
|
};
|
|
if (fillopts.type == "gradient") fillopts.angle = "-180";
|
|
var fillparm = fillopts.type == "gradient" ? writextag("o:fill", null, {
|
|
type: "gradientUnscaled",
|
|
'v:ext': "view"
|
|
}) : null;
|
|
var fillxml = writextag('v:fill', fillparm, fillopts);
|
|
var shadata = {
|
|
on: "t",
|
|
'obscured': "t"
|
|
};
|
|
++_shapeid;
|
|
o = o.concat(['<v:shape' + wxt_helper({
|
|
id: '_x0000_s' + _shapeid,
|
|
type: "#_x0000_t202",
|
|
style: "position:absolute; margin-left:80pt;margin-top:5pt;width:104pt;height:64pt;z-index:10" + (x[1].hidden ? ";visibility:hidden" : ""),
|
|
fillcolor: "#ECFAD4",
|
|
strokecolor: "#edeaa1"
|
|
}) + '>', fillxml, writextag("v:shadow", null, shadata), writextag("v:path", null, {
|
|
'o:connecttype': "none"
|
|
}), '<v:textbox><div style="text-align:left"></div></v:textbox>', '<x:ClientData ObjectType="Note">', '<x:MoveWithCells/>', '<x:SizeWithCells/>', /* Part 4 19.4.2.3 Anchor (Anchor) */
|
|
writetag('x:Anchor', [c.c + 1, 0, c.r + 1, 0, c.c + 3, 20, c.r + 5, 20].join(",")), writetag('x:AutoFill', "False"), writetag('x:Row', String(c.r)), writetag('x:Column', String(c.c)), x[1].hidden ? '' : '<x:Visible/>', '</x:ClientData>', '</v:shape>']);
|
|
});
|
|
o.push('</xml>');
|
|
return o.join("");
|
|
}
|
|
RELS.CMNT = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments";
|
|
function sheet_insert_comments(sheet, comments) {
|
|
var dense = Array.isArray(sheet);
|
|
var cell;
|
|
comments.forEach(function (comment) {
|
|
var r = decode_cell(comment.ref);
|
|
if (dense) {
|
|
if (!sheet[r.r]) sheet[r.r] = [];
|
|
cell = sheet[r.r][r.c];
|
|
} else cell = sheet[comment.ref];
|
|
if (!cell) {
|
|
cell = {
|
|
t: "z"
|
|
};
|
|
if (dense) sheet[r.r][r.c] = cell;else sheet[comment.ref] = cell;
|
|
var range = safe_decode_range(sheet["!ref"] || "BDWGO1000001:A1");
|
|
if (range.s.r > r.r) range.s.r = r.r;
|
|
if (range.e.r < r.r) range.e.r = r.r;
|
|
if (range.s.c > r.c) range.s.c = r.c;
|
|
if (range.e.c < r.c) range.e.c = r.c;
|
|
var encoded = encode_range(range);
|
|
if (encoded !== sheet["!ref"]) sheet["!ref"] = encoded;
|
|
}
|
|
if (!cell.c) cell.c = [];
|
|
var o = {
|
|
a: comment.author,
|
|
t: comment.t,
|
|
r: comment.r
|
|
};
|
|
if (comment.h) o.h = comment.h;
|
|
cell.c.push(o);
|
|
});
|
|
}
|
|
|
|
/* 18.7 Comments */
|
|
function parse_comments_xml(data, opts) {
|
|
/* 18.7.6 CT_Comments */
|
|
if (data.match(/<(?:\w+:)?comments *\/>/)) return [];
|
|
var authors = [];
|
|
var commentList = [];
|
|
var authtag = data.match(/<(?:\w+:)?authors>([\s\S]*)<\/(?:\w+:)?authors>/);
|
|
if (authtag && authtag[1]) authtag[1].split(/<\/\w*:?author>/).forEach(function (x) {
|
|
if (x === "" || x.trim() === "") return;
|
|
var a = x.match(/<(?:\w+:)?author[^>]*>(.*)/);
|
|
if (a) authors.push(a[1]);
|
|
});
|
|
var cmnttag = data.match(/<(?:\w+:)?commentList>([\s\S]*)<\/(?:\w+:)?commentList>/);
|
|
if (cmnttag && cmnttag[1]) cmnttag[1].split(/<\/\w*:?comment>/).forEach(function (x) {
|
|
if (x === "" || x.trim() === "") return;
|
|
var cm = x.match(/<(?:\w+:)?comment[^>]*>/);
|
|
if (!cm) return;
|
|
var y = parsexmltag(cm[0]);
|
|
var comment = {
|
|
author: y.authorId && authors[y.authorId] || "sheetjsghost",
|
|
ref: y.ref,
|
|
guid: y.guid
|
|
};
|
|
var cell = decode_cell(y.ref);
|
|
if (opts.sheetRows && opts.sheetRows <= cell.r) return;
|
|
var textMatch = x.match(/<(?:\w+:)?text>([\s\S]*)<\/(?:\w+:)?text>/);
|
|
var rt = !!textMatch && !!textMatch[1] && parse_si(textMatch[1]) || {
|
|
r: "",
|
|
t: "",
|
|
h: ""
|
|
};
|
|
comment.r = rt.r;
|
|
if (rt.r == "<t></t>") rt.t = rt.h = "";
|
|
comment.t = (rt.t || "").replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
if (opts.cellHTML) comment.h = rt.h;
|
|
commentList.push(comment);
|
|
});
|
|
return commentList;
|
|
}
|
|
var CMNT_XML_ROOT = writextag('comments', null, {
|
|
'xmlns': XMLNS.main[0]
|
|
});
|
|
function write_comments_xml(data) {
|
|
var o = [XML_HEADER, CMNT_XML_ROOT];
|
|
var iauthor = [];
|
|
o.push("<authors>");
|
|
data.forEach(function (x) {
|
|
x[1].forEach(function (w) {
|
|
var a = escapexml(w.a);
|
|
if (iauthor.indexOf(a) > -1) return;
|
|
iauthor.push(a);
|
|
o.push("<author>" + a + "</author>");
|
|
});
|
|
});
|
|
o.push("</authors>");
|
|
o.push("<commentList>");
|
|
data.forEach(function (d) {
|
|
d[1].forEach(function (c) {
|
|
/* 18.7.3 CT_Comment */
|
|
o.push('<comment ref="' + d[0] + '" authorId="' + iauthor.indexOf(escapexml(c.a)) + '"><text>');
|
|
o.push(writetag("t", c.t == null ? "" : escapexml(c.t)));
|
|
o.push('</text></comment>');
|
|
});
|
|
});
|
|
o.push("</commentList>");
|
|
if (o.length > 2) {
|
|
o[o.length] = '</comments>';
|
|
o[1] = o[1].replace("/>", ">");
|
|
}
|
|
return o.join("");
|
|
}
|
|
var CT_VBA = "application/vnd.ms-office.vbaProject";
|
|
function make_vba_xls(cfb) {
|
|
var newcfb = CFB.utils.cfb_new({
|
|
root: "R"
|
|
});
|
|
cfb.FullPaths.forEach(function (p, i) {
|
|
if (p.slice(-1) === "/" || !p.match(/_VBA_PROJECT_CUR/)) return;
|
|
var newpath = p.replace(/^[^\/]*/, "R").replace(/\/_VBA_PROJECT_CUR\u0000*/, "");
|
|
CFB.utils.cfb_add(newcfb, newpath, cfb.FileIndex[i].content);
|
|
});
|
|
return CFB.write(newcfb);
|
|
}
|
|
function fill_vba_xls(cfb, vba) {
|
|
vba.FullPaths.forEach(function (p, i) {
|
|
if (i == 0) return;
|
|
var newpath = p.replace(/[^\/]*[\/]/, "/_VBA_PROJECT_CUR/");
|
|
if (newpath.slice(-1) !== "/") CFB.utils.cfb_add(cfb, newpath, vba.FileIndex[i].content);
|
|
});
|
|
}
|
|
var VBAFMTS = ["xlsb", "xlsm", "xlam", "biff8", "xla"];
|
|
RELS.DS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/dialogsheet";
|
|
RELS.MS = "http://schemas.microsoft.com/office/2006/relationships/xlMacrosheet";
|
|
|
|
/* macro and dialog sheet stubs */
|
|
function parse_ds_bin() {
|
|
return {
|
|
'!type': 'dialog'
|
|
};
|
|
}
|
|
function parse_ds_xml() {
|
|
return {
|
|
'!type': 'dialog'
|
|
};
|
|
}
|
|
function parse_ms_bin() {
|
|
return {
|
|
'!type': 'macro'
|
|
};
|
|
}
|
|
function parse_ms_xml() {
|
|
return {
|
|
'!type': 'macro'
|
|
};
|
|
}
|
|
/* TODO: it will be useful to parse the function str */
|
|
var rc_to_a1 = function () {
|
|
var rcregex = /(^|[^A-Za-z_])R(\[?-?\d+\]|[1-9]\d*|)C(\[?-?\d+\]|[1-9]\d*|)(?![A-Za-z0-9_])/g;
|
|
var rcbase = {
|
|
r: 0,
|
|
c: 0
|
|
};
|
|
function rcfunc($$, $1, $2, $3) {
|
|
var cRel = false,
|
|
rRel = false;
|
|
if ($2.length == 0) rRel = true;else if ($2.charAt(0) == "[") {
|
|
rRel = true;
|
|
$2 = $2.slice(1, -1);
|
|
}
|
|
if ($3.length == 0) cRel = true;else if ($3.charAt(0) == "[") {
|
|
cRel = true;
|
|
$3 = $3.slice(1, -1);
|
|
}
|
|
var R = $2.length > 0 ? parseInt($2, 10) | 0 : 0,
|
|
C = $3.length > 0 ? parseInt($3, 10) | 0 : 0;
|
|
if (cRel) C += rcbase.c;else --C;
|
|
if (rRel) R += rcbase.r;else --R;
|
|
return $1 + (cRel ? "" : "$") + encode_col(C) + (rRel ? "" : "$") + encode_row(R);
|
|
}
|
|
return function rc_to_a1(fstr, base) {
|
|
rcbase = base;
|
|
return fstr.replace(rcregex, rcfunc);
|
|
};
|
|
}();
|
|
var crefregex = /(^|[^._A-Z0-9])([$]?)([A-Z]{1,2}|[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D])([$]?)(10[0-3]\d{4}|104[0-7]\d{3}|1048[0-4]\d{2}|10485[0-6]\d|104857[0-6]|[1-9]\d{0,5})(?![_.\(A-Za-z0-9])/g;
|
|
var a1_to_rc = function () {
|
|
return function a1_to_rc(fstr, base) {
|
|
return fstr.replace(crefregex, function ($0, $1, $2, $3, $4, $5) {
|
|
var c = decode_col($3) - ($2 ? 0 : base.c);
|
|
var r = decode_row($5) - ($4 ? 0 : base.r);
|
|
var R = r == 0 ? "" : !$4 ? "[" + r + "]" : r + 1;
|
|
var C = c == 0 ? "" : !$2 ? "[" + c + "]" : c + 1;
|
|
return $1 + "R" + R + "C" + C;
|
|
});
|
|
};
|
|
}();
|
|
|
|
/* no defined name can collide with a valid cell address A1:XFD1048576 ... except LOG10! */
|
|
function shift_formula_str(f, delta) {
|
|
return f.replace(crefregex, function ($0, $1, $2, $3, $4, $5) {
|
|
return $1 + ($2 == "$" ? $2 + $3 : encode_col(decode_col($3) + delta.c)) + ($4 == "$" ? $4 + $5 : encode_row(decode_row($5) + delta.r));
|
|
});
|
|
}
|
|
function shift_formula_xlsx(f, range, cell) {
|
|
var r = decode_range(range),
|
|
s = r.s,
|
|
c = decode_cell(cell);
|
|
var delta = {
|
|
r: c.r - s.r,
|
|
c: c.c - s.c
|
|
};
|
|
return shift_formula_str(f, delta);
|
|
}
|
|
|
|
/* TODO: parse formula */
|
|
function fuzzyfmla(f) {
|
|
if (f.length == 1) return false;
|
|
return true;
|
|
}
|
|
function _xlfn(f) {
|
|
return f.replace(/_xlfn\./g, "");
|
|
}
|
|
var strs = {}; // shared strings
|
|
var _ssfopts = {}; // spreadsheet formatting options
|
|
|
|
RELS.WS = ["http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet", "http://purl.oclc.org/ooxml/officeDocument/relationships/worksheet"];
|
|
|
|
/*global Map */
|
|
var browser_has_Map = typeof Map !== 'undefined';
|
|
function get_sst_id(sst, str, rev) {
|
|
var i = 0,
|
|
len = sst.length;
|
|
if (rev) {
|
|
if (browser_has_Map ? rev.has(str) : Object.prototype.hasOwnProperty.call(rev, str)) {
|
|
var revarr = browser_has_Map ? rev.get(str) : rev[str];
|
|
for (; i < revarr.length; ++i) {
|
|
if (sst[revarr[i]].t === str) {
|
|
sst.Count++;
|
|
return revarr[i];
|
|
}
|
|
}
|
|
}
|
|
} else for (; i < len; ++i) {
|
|
if (sst[i].t === str) {
|
|
sst.Count++;
|
|
return i;
|
|
}
|
|
}
|
|
sst[len] = {
|
|
t: str
|
|
};
|
|
sst.Count++;
|
|
sst.Unique++;
|
|
if (rev) {
|
|
if (browser_has_Map) {
|
|
if (!rev.has(str)) rev.set(str, []);
|
|
rev.get(str).push(len);
|
|
} else {
|
|
if (!Object.prototype.hasOwnProperty.call(rev, str)) rev[str] = [];
|
|
rev[str].push(len);
|
|
}
|
|
}
|
|
return len;
|
|
}
|
|
function col_obj_w(C, col) {
|
|
var p = {
|
|
min: C + 1,
|
|
max: C + 1
|
|
};
|
|
/* wch (chars), wpx (pixels) */
|
|
var wch = -1;
|
|
if (col.MDW) MDW = col.MDW;
|
|
if (col.width != null) p.customWidth = 1;else if (col.wpx != null) wch = px2char(col.wpx);else if (col.wch != null) wch = col.wch;
|
|
if (wch > -1) {
|
|
p.width = char2width(wch);
|
|
p.customWidth = 1;
|
|
} else if (col.width != null) p.width = col.width;
|
|
if (col.hidden) p.hidden = true;
|
|
if (col.level != null) {
|
|
p.outlineLevel = p.level = col.level;
|
|
}
|
|
return p;
|
|
}
|
|
function default_margins(margins, mode) {
|
|
if (!margins) return;
|
|
var defs = [0.7, 0.7, 0.75, 0.75, 0.3, 0.3];
|
|
if (mode == 'xlml') defs = [1, 1, 1, 1, 0.5, 0.5];
|
|
if (margins.left == null) margins.left = defs[0];
|
|
if (margins.right == null) margins.right = defs[1];
|
|
if (margins.top == null) margins.top = defs[2];
|
|
if (margins.bottom == null) margins.bottom = defs[3];
|
|
if (margins.header == null) margins.header = defs[4];
|
|
if (margins.footer == null) margins.footer = defs[5];
|
|
}
|
|
function get_cell_style(styles, cell, opts) {
|
|
var z = opts.revssf[cell.z != null ? cell.z : "General"];
|
|
var i = 0x3c,
|
|
len = styles.length;
|
|
if (z == null && opts.ssf) {
|
|
for (; i < 0x188; ++i) {
|
|
if (opts.ssf[i] == null) {
|
|
SSF.load(cell.z, i);
|
|
// $FlowIgnore
|
|
opts.ssf[i] = cell.z;
|
|
opts.revssf[cell.z] = z = i;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
for (i = 0; i != len; ++i) {
|
|
if (styles[i].numFmtId === z) return i;
|
|
}
|
|
styles[len] = {
|
|
numFmtId: z,
|
|
fontId: 0,
|
|
fillId: 0,
|
|
borderId: 0,
|
|
xfId: 0,
|
|
applyNumberFormat: 1
|
|
};
|
|
return len;
|
|
}
|
|
function safe_format(p, fmtid, fillid, opts, themes, styles) {
|
|
try {
|
|
if (opts.cellNF) p.z = SSF._table[fmtid];
|
|
} catch (e) {
|
|
if (opts.WTF) throw e;
|
|
}
|
|
if (p.t === 'z' && !opts.cellStyles) return;
|
|
if (p.t === 'd' && typeof p.v === 'string') p.v = parseDate(p.v);
|
|
if ((!opts || opts.cellText !== false) && p.t !== 'z') try {
|
|
if (SSF._table[fmtid] == null) SSF.load(SSFImplicit[fmtid] || "General", fmtid);
|
|
if (p.t === 'e') p.w = p.w || BErr[p.v];else if (fmtid === 0) {
|
|
if (p.t === 'n') {
|
|
if ((p.v | 0) === p.v) p.w = SSF._general_int(p.v);else p.w = SSF._general_num(p.v);
|
|
} else if (p.t === 'd') {
|
|
var dd = datenum(p.v);
|
|
if ((dd | 0) === dd) p.w = SSF._general_int(dd);else p.w = SSF._general_num(dd);
|
|
} else if (p.v === undefined) return "";else p.w = SSF._general(p.v, _ssfopts);
|
|
} else if (p.t === 'd') p.w = SSF.format(fmtid, datenum(p.v), _ssfopts);else p.w = SSF.format(fmtid, p.v, _ssfopts);
|
|
} catch (e) {
|
|
if (opts.WTF) throw e;
|
|
}
|
|
if (!opts.cellStyles) return;
|
|
if (fillid != null) try {
|
|
p.s = styles.Fills[fillid];
|
|
if (p.s.fgColor && p.s.fgColor.theme && !p.s.fgColor.rgb) {
|
|
p.s.fgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.fgColor.theme].rgb, p.s.fgColor.tint || 0);
|
|
if (opts.WTF) p.s.fgColor.raw_rgb = themes.themeElements.clrScheme[p.s.fgColor.theme].rgb;
|
|
}
|
|
if (p.s.bgColor && p.s.bgColor.theme) {
|
|
p.s.bgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.bgColor.theme].rgb, p.s.bgColor.tint || 0);
|
|
if (opts.WTF) p.s.bgColor.raw_rgb = themes.themeElements.clrScheme[p.s.bgColor.theme].rgb;
|
|
}
|
|
} catch (e) {
|
|
if (opts.WTF && styles.Fills) throw e;
|
|
}
|
|
}
|
|
function check_ws(ws, sname, i) {
|
|
if (ws && ws['!ref']) {
|
|
var range = safe_decode_range(ws['!ref']);
|
|
if (range.e.c < range.s.c || range.e.r < range.s.r) throw new Error("Bad range (" + i + "): " + ws['!ref']);
|
|
}
|
|
}
|
|
function parse_ws_xml_dim(ws, s) {
|
|
var d = safe_decode_range(s);
|
|
if (d.s.r <= d.e.r && d.s.c <= d.e.c && d.s.r >= 0 && d.s.c >= 0) ws["!ref"] = encode_range(d);
|
|
}
|
|
var mergecregex = /<(?:\w:)?mergeCell ref="[A-Z0-9:]+"\s*[\/]?>/g;
|
|
var sheetdataregex = /<(?:\w+:)?sheetData[^>]*>([\s\S]*)<\/(?:\w+:)?sheetData>/;
|
|
var hlinkregex = /<(?:\w:)?hyperlink [^>]*>/mg;
|
|
var dimregex = /"(\w*:\w*)"/;
|
|
var colregex = /<(?:\w:)?col\b[^>]*[\/]?>/g;
|
|
var afregex = /<(?:\w:)?autoFilter[^>]*([\/]|>([\s\S]*)<\/(?:\w:)?autoFilter)>/g;
|
|
var marginregex = /<(?:\w:)?pageMargins[^>]*\/>/g;
|
|
var sheetprregex = /<(?:\w:)?sheetPr\b(?:[^>a-z][^>]*)?\/>/;
|
|
var sheetprregex2 = /<(?:\w:)?sheetPr[^>]*(?:[\/]|>([\s\S]*)<\/(?:\w:)?sheetPr)>/;
|
|
var svsregex = /<(?:\w:)?sheetViews[^>]*(?:[\/]|>([\s\S]*)<\/(?:\w:)?sheetViews)>/;
|
|
|
|
/* 18.3 Worksheets */
|
|
function parse_ws_xml(data, opts, idx, rels, wb, themes, styles) {
|
|
if (!data) return data;
|
|
if (!rels) rels = {
|
|
'!id': {}
|
|
};
|
|
if (DENSE != null && opts.dense == null) opts.dense = DENSE;
|
|
|
|
/* 18.3.1.99 worksheet CT_Worksheet */
|
|
var s = opts.dense ? [] : {};
|
|
var refguess = {
|
|
s: {
|
|
r: 2000000,
|
|
c: 2000000
|
|
},
|
|
e: {
|
|
r: 0,
|
|
c: 0
|
|
}
|
|
};
|
|
var data1 = "",
|
|
data2 = "";
|
|
var mtch = data.match(sheetdataregex);
|
|
if (mtch) {
|
|
data1 = data.slice(0, mtch.index);
|
|
data2 = data.slice(mtch.index + mtch[0].length);
|
|
} else data1 = data2 = data;
|
|
|
|
/* 18.3.1.82 sheetPr CT_SheetPr */
|
|
var sheetPr = data1.match(sheetprregex);
|
|
if (sheetPr) parse_ws_xml_sheetpr(sheetPr[0], s, wb, idx);else if (sheetPr = data1.match(sheetprregex2)) parse_ws_xml_sheetpr2(sheetPr[0], sheetPr[1] || "", s, wb, idx, styles, themes);
|
|
|
|
/* 18.3.1.35 dimension CT_SheetDimension */
|
|
var ridx = (data1.match(/<(?:\w*:)?dimension/) || {
|
|
index: -1
|
|
}).index;
|
|
if (ridx > 0) {
|
|
var ref = data1.slice(ridx, ridx + 50).match(dimregex);
|
|
if (ref) parse_ws_xml_dim(s, ref[1]);
|
|
}
|
|
|
|
/* 18.3.1.88 sheetViews CT_SheetViews */
|
|
var svs = data1.match(svsregex);
|
|
if (svs && svs[1]) parse_ws_xml_sheetviews(svs[1], wb);
|
|
|
|
/* 18.3.1.17 cols CT_Cols */
|
|
var columns = [];
|
|
if (opts.cellStyles) {
|
|
/* 18.3.1.13 col CT_Col */
|
|
var cols = data1.match(colregex);
|
|
if (cols) parse_ws_xml_cols(columns, cols);
|
|
}
|
|
|
|
/* 18.3.1.80 sheetData CT_SheetData ? */
|
|
if (mtch) parse_ws_xml_data(mtch[1], s, opts, refguess, themes, styles);
|
|
|
|
/* 18.3.1.2 autoFilter CT_AutoFilter */
|
|
var afilter = data2.match(afregex);
|
|
if (afilter) s['!autofilter'] = parse_ws_xml_autofilter(afilter[0]);
|
|
|
|
/* 18.3.1.55 mergeCells CT_MergeCells */
|
|
var merges = [];
|
|
var _merge = data2.match(mergecregex);
|
|
if (_merge) for (ridx = 0; ridx != _merge.length; ++ridx) {
|
|
merges[ridx] = safe_decode_range(_merge[ridx].slice(_merge[ridx].indexOf("\"") + 1));
|
|
}
|
|
|
|
/* 18.3.1.48 hyperlinks CT_Hyperlinks */
|
|
var hlink = data2.match(hlinkregex);
|
|
if (hlink) parse_ws_xml_hlinks(s, hlink, rels);
|
|
|
|
/* 18.3.1.62 pageMargins CT_PageMargins */
|
|
var margins = data2.match(marginregex);
|
|
if (margins) s['!margins'] = parse_ws_xml_margins(parsexmltag(margins[0]));
|
|
if (!s["!ref"] && refguess.e.c >= refguess.s.c && refguess.e.r >= refguess.s.r) s["!ref"] = encode_range(refguess);
|
|
if (opts.sheetRows > 0 && s["!ref"]) {
|
|
var tmpref = safe_decode_range(s["!ref"]);
|
|
if (opts.sheetRows <= +tmpref.e.r) {
|
|
tmpref.e.r = opts.sheetRows - 1;
|
|
if (tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;
|
|
if (tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;
|
|
if (tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c;
|
|
if (tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c;
|
|
s["!fullref"] = s["!ref"];
|
|
s["!ref"] = encode_range(tmpref);
|
|
}
|
|
}
|
|
if (columns.length > 0) s["!cols"] = columns;
|
|
if (merges.length > 0) s["!merges"] = merges;
|
|
return s;
|
|
}
|
|
function write_ws_xml_merges(merges) {
|
|
if (merges.length === 0) return "";
|
|
var o = '<mergeCells count="' + merges.length + '">';
|
|
for (var i = 0; i != merges.length; ++i) {
|
|
o += '<mergeCell ref="' + encode_range(merges[i]) + '"/>';
|
|
}
|
|
return o + '</mergeCells>';
|
|
}
|
|
|
|
/* 18.3.1.82-3 sheetPr CT_ChartsheetPr / CT_SheetPr */
|
|
function parse_ws_xml_sheetpr(sheetPr, s, wb, idx) {
|
|
var data = parsexmltag(sheetPr);
|
|
if (!wb.Sheets[idx]) wb.Sheets[idx] = {};
|
|
if (data.codeName) wb.Sheets[idx].CodeName = unescapexml(utf8read(data.codeName));
|
|
}
|
|
function parse_ws_xml_sheetpr2(sheetPr, body, s, wb, idx, styles, themes) {
|
|
parse_ws_xml_sheetpr(sheetPr.slice(0, sheetPr.indexOf(">")), s, wb, idx);
|
|
}
|
|
function write_ws_xml_sheetpr(ws, wb, idx, opts, o) {
|
|
var needed = false;
|
|
var props = {},
|
|
payload = null;
|
|
if (opts.bookType !== 'xlsx' && wb.vbaraw) {
|
|
var cname = wb.SheetNames[idx];
|
|
try {
|
|
if (wb.Workbook) cname = wb.Workbook.Sheets[idx].CodeName || cname;
|
|
} catch (e) {}
|
|
needed = true;
|
|
props.codeName = utf8write(escapexml(cname));
|
|
}
|
|
if (ws && ws["!outline"]) {
|
|
var outlineprops = {
|
|
summaryBelow: 1,
|
|
summaryRight: 1
|
|
};
|
|
if (ws["!outline"].above) outlineprops.summaryBelow = 0;
|
|
if (ws["!outline"].left) outlineprops.summaryRight = 0;
|
|
payload = (payload || "") + writextag('outlinePr', null, outlineprops);
|
|
}
|
|
if (!needed && !payload) return;
|
|
o[o.length] = writextag('sheetPr', payload, props);
|
|
}
|
|
|
|
/* 18.3.1.85 sheetProtection CT_SheetProtection */
|
|
var sheetprot_deffalse = ["objects", "scenarios", "selectLockedCells", "selectUnlockedCells"];
|
|
var sheetprot_deftrue = ["formatColumns", "formatRows", "formatCells", "insertColumns", "insertRows", "insertHyperlinks", "deleteColumns", "deleteRows", "sort", "autoFilter", "pivotTables"];
|
|
function write_ws_xml_protection(sp) {
|
|
// algorithmName, hashValue, saltValue, spinCount
|
|
var o = {
|
|
sheet: 1
|
|
};
|
|
sheetprot_deffalse.forEach(function (n) {
|
|
if (sp[n] != null && sp[n]) o[n] = "1";
|
|
});
|
|
sheetprot_deftrue.forEach(function (n) {
|
|
if (sp[n] != null && !sp[n]) o[n] = "0";
|
|
});
|
|
/* TODO: algorithm */
|
|
if (sp.password) o.password = crypto_CreatePasswordVerifier_Method1(sp.password).toString(16).toUpperCase();
|
|
return writextag('sheetProtection', null, o);
|
|
}
|
|
function parse_ws_xml_hlinks(s, data, rels) {
|
|
var dense = Array.isArray(s);
|
|
for (var i = 0; i != data.length; ++i) {
|
|
var val = parsexmltag(utf8read(data[i]), true);
|
|
if (!val.ref) return;
|
|
var rel = ((rels || {})['!id'] || [])[val.id];
|
|
if (rel) {
|
|
val.Target = rel.Target;
|
|
if (val.location) val.Target += "#" + unescapexml(val.location);
|
|
} else {
|
|
val.Target = "#" + unescapexml(val.location);
|
|
rel = {
|
|
Target: val.Target,
|
|
TargetMode: 'Internal'
|
|
};
|
|
}
|
|
val.Rel = rel;
|
|
if (val.tooltip) {
|
|
val.Tooltip = val.tooltip;
|
|
delete val.tooltip;
|
|
}
|
|
var rng = safe_decode_range(val.ref);
|
|
for (var R = rng.s.r; R <= rng.e.r; ++R) {
|
|
for (var C = rng.s.c; C <= rng.e.c; ++C) {
|
|
var addr = encode_cell({
|
|
c: C,
|
|
r: R
|
|
});
|
|
if (dense) {
|
|
if (!s[R]) s[R] = [];
|
|
if (!s[R][C]) s[R][C] = {
|
|
t: "z",
|
|
v: undefined
|
|
};
|
|
s[R][C].l = val;
|
|
} else {
|
|
if (!s[addr]) s[addr] = {
|
|
t: "z",
|
|
v: undefined
|
|
};
|
|
s[addr].l = val;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function parse_ws_xml_margins(margin) {
|
|
var o = {};
|
|
["left", "right", "top", "bottom", "header", "footer"].forEach(function (k) {
|
|
if (margin[k]) o[k] = parseFloat(margin[k]);
|
|
});
|
|
return o;
|
|
}
|
|
function write_ws_xml_margins(margin) {
|
|
default_margins(margin);
|
|
return writextag('pageMargins', null, margin);
|
|
}
|
|
function parse_ws_xml_cols(columns, cols) {
|
|
var seencol = false;
|
|
for (var coli = 0; coli != cols.length; ++coli) {
|
|
var coll = parsexmltag(cols[coli], true);
|
|
if (coll.hidden) coll.hidden = parsexmlbool(coll.hidden);
|
|
var colm = parseInt(coll.min, 10) - 1,
|
|
colM = parseInt(coll.max, 10) - 1;
|
|
if (coll.outlineLevel) coll.level = +coll.outlineLevel || 0;
|
|
delete coll.min;
|
|
delete coll.max;
|
|
coll.width = +coll.width;
|
|
if (!seencol && coll.width) {
|
|
seencol = true;
|
|
find_mdw_colw(coll.width);
|
|
}
|
|
process_col(coll);
|
|
while (colm <= colM) {
|
|
columns[colm++] = dup(coll);
|
|
}
|
|
}
|
|
}
|
|
function write_ws_xml_cols(ws, cols) {
|
|
var o = ["<cols>"],
|
|
col;
|
|
for (var i = 0; i != cols.length; ++i) {
|
|
if (!(col = cols[i])) continue;
|
|
o[o.length] = writextag('col', null, col_obj_w(i, col));
|
|
}
|
|
o[o.length] = "</cols>";
|
|
return o.join("");
|
|
}
|
|
function parse_ws_xml_autofilter(data) {
|
|
var o = {
|
|
ref: (data.match(/ref="([^"]*)"/) || [])[1]
|
|
};
|
|
return o;
|
|
}
|
|
function write_ws_xml_autofilter(data, ws, wb, idx) {
|
|
var ref = typeof data.ref == "string" ? data.ref : encode_range(data.ref);
|
|
if (!wb.Workbook) wb.Workbook = {
|
|
Sheets: []
|
|
};
|
|
if (!wb.Workbook.Names) wb.Workbook.Names = [];
|
|
var names = wb.Workbook.Names;
|
|
var range = decode_range(ref);
|
|
if (range.s.r == range.e.r) {
|
|
range.e.r = decode_range(ws["!ref"]).e.r;
|
|
ref = encode_range(range);
|
|
}
|
|
for (var i = 0; i < names.length; ++i) {
|
|
var name = names[i];
|
|
if (name.Name != '_xlnm._FilterDatabase') continue;
|
|
if (name.Sheet != idx) continue;
|
|
name.Ref = "'" + wb.SheetNames[idx] + "'!" + ref;
|
|
break;
|
|
}
|
|
if (i == names.length) names.push({
|
|
Name: '_xlnm._FilterDatabase',
|
|
Sheet: idx,
|
|
Ref: "'" + wb.SheetNames[idx] + "'!" + ref
|
|
});
|
|
return writextag("autoFilter", null, {
|
|
ref: ref
|
|
});
|
|
}
|
|
|
|
/* 18.3.1.88 sheetViews CT_SheetViews */
|
|
/* 18.3.1.87 sheetView CT_SheetView */
|
|
var sviewregex = /<(?:\w:)?sheetView(?:[^>a-z][^>]*)?\/?>/;
|
|
function parse_ws_xml_sheetviews(data, wb) {
|
|
if (!wb.Views) wb.Views = [{}];
|
|
(data.match(sviewregex) || []).forEach(function (r, i) {
|
|
var tag = parsexmltag(r);
|
|
// $FlowIgnore
|
|
if (!wb.Views[i]) wb.Views[i] = {};
|
|
// $FlowIgnore
|
|
if (+tag.zoomScale) wb.Views[i].zoom = +tag.zoomScale;
|
|
// $FlowIgnore
|
|
if (parsexmlbool(tag.rightToLeft)) wb.Views[i].RTL = true;
|
|
});
|
|
}
|
|
function write_ws_xml_sheetviews(ws, opts, idx, wb) {
|
|
var sview = {
|
|
workbookViewId: "0"
|
|
};
|
|
// $FlowIgnore
|
|
if ((((wb || {}).Workbook || {}).Views || [])[0]) sview.rightToLeft = wb.Workbook.Views[0].RTL ? "1" : "0";
|
|
return writextag("sheetViews", writextag("sheetView", null, sview), {});
|
|
}
|
|
function write_ws_xml_cell(cell, ref, ws, opts) {
|
|
if (cell.v === undefined && typeof cell.f !== "string" || cell.t === 'z') return "";
|
|
var vv = "";
|
|
var oldt = cell.t,
|
|
oldv = cell.v;
|
|
if (cell.t !== "z") switch (cell.t) {
|
|
case 'b':
|
|
vv = cell.v ? "1" : "0";
|
|
break;
|
|
case 'n':
|
|
vv = '' + cell.v;
|
|
break;
|
|
case 'e':
|
|
vv = BErr[cell.v];
|
|
break;
|
|
case 'd':
|
|
if (opts && opts.cellDates) vv = parseDate(cell.v, -1).toISOString();else {
|
|
cell = dup(cell);
|
|
cell.t = 'n';
|
|
vv = '' + (cell.v = datenum(parseDate(cell.v)));
|
|
}
|
|
if (typeof cell.z === 'undefined') cell.z = SSF._table[14];
|
|
break;
|
|
default:
|
|
vv = cell.v;
|
|
break;
|
|
}
|
|
var v = writetag('v', escapexml(vv)),
|
|
o = {
|
|
r: ref
|
|
};
|
|
/* TODO: cell style */
|
|
var os = get_cell_style(opts.cellXfs, cell, opts);
|
|
if (os !== 0) o.s = os;
|
|
switch (cell.t) {
|
|
case 'n':
|
|
break;
|
|
case 'd':
|
|
o.t = "d";
|
|
break;
|
|
case 'b':
|
|
o.t = "b";
|
|
break;
|
|
case 'e':
|
|
o.t = "e";
|
|
break;
|
|
case 'z':
|
|
break;
|
|
default:
|
|
if (cell.v == null) {
|
|
delete cell.t;
|
|
break;
|
|
}
|
|
if (cell.v.length > 32767) throw new Error("Text length must not exceed 32767 characters");
|
|
if (opts && opts.bookSST) {
|
|
v = writetag('v', '' + get_sst_id(opts.Strings, cell.v, opts.revStrings));
|
|
o.t = "s";
|
|
break;
|
|
}
|
|
o.t = "str";
|
|
break;
|
|
}
|
|
if (cell.t != oldt) {
|
|
cell.t = oldt;
|
|
cell.v = oldv;
|
|
}
|
|
if (typeof cell.f == "string" && cell.f) {
|
|
var ff = cell.F && cell.F.slice(0, ref.length) == ref ? {
|
|
t: "array",
|
|
ref: cell.F
|
|
} : null;
|
|
v = writextag('f', escapexml(cell.f), ff) + (cell.v != null ? v : "");
|
|
}
|
|
if (cell.l) ws['!links'].push([ref, cell.l]);
|
|
if (cell.c) ws['!comments'].push([ref, cell.c]);
|
|
return writextag('c', v, o);
|
|
}
|
|
var parse_ws_xml_data = function () {
|
|
var cellregex = /<(?:\w+:)?c[ \/>]/,
|
|
rowregex = /<\/(?:\w+:)?row>/;
|
|
var rregex = /r=["']([^"']*)["']/,
|
|
isregex = /<(?:\w+:)?is>([\S\s]*?)<\/(?:\w+:)?is>/;
|
|
var refregex = /ref=["']([^"']*)["']/;
|
|
var match_v = matchtag("v"),
|
|
match_f = matchtag("f");
|
|
return function parse_ws_xml_data(sdata, s, opts, guess, themes, styles) {
|
|
var ri = 0,
|
|
x = "",
|
|
cells = [],
|
|
cref = [],
|
|
idx = 0,
|
|
i = 0,
|
|
cc = 0,
|
|
d = "",
|
|
p;
|
|
var tag,
|
|
tagr = 0,
|
|
tagc = 0;
|
|
var sstr, ftag;
|
|
var fmtid = 0,
|
|
fillid = 0;
|
|
var do_format = Array.isArray(styles.CellXf),
|
|
cf;
|
|
var arrayf = [];
|
|
var sharedf = [];
|
|
var dense = Array.isArray(s);
|
|
var rows = [],
|
|
rowobj = {},
|
|
rowrite = false;
|
|
var sheetStubs = !!opts.sheetStubs;
|
|
for (var marr = sdata.split(rowregex), mt = 0, marrlen = marr.length; mt != marrlen; ++mt) {
|
|
x = marr[mt].trim();
|
|
var xlen = x.length;
|
|
if (xlen === 0) continue;
|
|
|
|
/* 18.3.1.73 row CT_Row */
|
|
var rstarti = 0;
|
|
outa: for (ri = 0; ri < xlen; ++ri) {
|
|
switch ( /*x.charCodeAt(ri)*/x[ri]) {
|
|
case ">" /*62*/:
|
|
if ( /*x.charCodeAt(ri-1) != 47*/x[ri - 1] != "/") {
|
|
++ri;
|
|
break outa;
|
|
}
|
|
if (opts && opts.cellStyles) {
|
|
// TODO: avoid duplication
|
|
tag = parsexmltag(x.slice(rstarti, ri), true);
|
|
tagr = tag.r != null ? parseInt(tag.r, 10) : tagr + 1;
|
|
tagc = -1;
|
|
if (opts.sheetRows && opts.sheetRows < tagr) continue;
|
|
rowobj = {};
|
|
rowrite = false;
|
|
if (tag.ht) {
|
|
rowrite = true;
|
|
rowobj.hpt = parseFloat(tag.ht);
|
|
rowobj.hpx = pt2px(rowobj.hpt);
|
|
}
|
|
if (tag.hidden == "1") {
|
|
rowrite = true;
|
|
rowobj.hidden = true;
|
|
}
|
|
if (tag.outlineLevel != null) {
|
|
rowrite = true;
|
|
rowobj.level = +tag.outlineLevel;
|
|
}
|
|
if (rowrite) rows[tagr - 1] = rowobj;
|
|
}
|
|
break;
|
|
case "<" /*60*/:
|
|
rstarti = ri;
|
|
break;
|
|
}
|
|
}
|
|
if (rstarti >= ri) break;
|
|
tag = parsexmltag(x.slice(rstarti, ri), true);
|
|
tagr = tag.r != null ? parseInt(tag.r, 10) : tagr + 1;
|
|
tagc = -1;
|
|
if (opts.sheetRows && opts.sheetRows < tagr) continue;
|
|
if (guess.s.r > tagr - 1) guess.s.r = tagr - 1;
|
|
if (guess.e.r < tagr - 1) guess.e.r = tagr - 1;
|
|
if (opts && opts.cellStyles) {
|
|
rowobj = {};
|
|
rowrite = false;
|
|
if (tag.ht) {
|
|
rowrite = true;
|
|
rowobj.hpt = parseFloat(tag.ht);
|
|
rowobj.hpx = pt2px(rowobj.hpt);
|
|
}
|
|
if (tag.hidden == "1") {
|
|
rowrite = true;
|
|
rowobj.hidden = true;
|
|
}
|
|
if (tag.outlineLevel != null) {
|
|
rowrite = true;
|
|
rowobj.level = +tag.outlineLevel;
|
|
}
|
|
if (rowrite) rows[tagr - 1] = rowobj;
|
|
}
|
|
|
|
/* 18.3.1.4 c CT_Cell */
|
|
cells = x.slice(ri).split(cellregex);
|
|
for (var rslice = 0; rslice != cells.length; ++rslice) {
|
|
if (cells[rslice].trim().charAt(0) != "<") break;
|
|
}
|
|
cells = cells.slice(rslice);
|
|
for (ri = 0; ri != cells.length; ++ri) {
|
|
x = cells[ri].trim();
|
|
if (x.length === 0) continue;
|
|
cref = x.match(rregex);
|
|
idx = ri;
|
|
i = 0;
|
|
cc = 0;
|
|
x = "<c " + (x.slice(0, 1) == "<" ? ">" : "") + x;
|
|
if (cref != null && cref.length === 2) {
|
|
idx = 0;
|
|
d = cref[1];
|
|
for (i = 0; i != d.length; ++i) {
|
|
if ((cc = d.charCodeAt(i) - 64) < 1 || cc > 26) break;
|
|
idx = 26 * idx + cc;
|
|
}
|
|
--idx;
|
|
tagc = idx;
|
|
} else ++tagc;
|
|
for (i = 0; i != x.length; ++i) {
|
|
if (x.charCodeAt(i) === 62) break;
|
|
}
|
|
++i;
|
|
tag = parsexmltag(x.slice(0, i), true);
|
|
if (!tag.r) tag.r = encode_cell({
|
|
r: tagr - 1,
|
|
c: tagc
|
|
});
|
|
d = x.slice(i);
|
|
p = {
|
|
t: ""
|
|
};
|
|
if ((cref = d.match(match_v)) != null && cref[1] !== '') p.v = unescapexml(cref[1]);
|
|
if (opts.cellFormula) {
|
|
if ((cref = d.match(match_f)) != null && cref[1] !== '') {
|
|
/* TODO: match against XLSXFutureFunctions */
|
|
p.f = unescapexml(utf8read(cref[1])).replace(/\r\n/g, "\n");
|
|
if (!opts.xlfn) p.f = _xlfn(p.f);
|
|
if (cref[0].indexOf('t="array"') > -1) {
|
|
p.F = (d.match(refregex) || [])[1];
|
|
if (p.F.indexOf(":") > -1) arrayf.push([safe_decode_range(p.F), p.F]);
|
|
} else if (cref[0].indexOf('t="shared"') > -1) {
|
|
// TODO: parse formula
|
|
ftag = parsexmltag(cref[0]);
|
|
var ___f = unescapexml(utf8read(cref[1]));
|
|
if (!opts.xlfn) ___f = _xlfn(___f);
|
|
sharedf[parseInt(ftag.si, 10)] = [ftag, ___f, tag.r];
|
|
}
|
|
} else if (cref = d.match(/<f[^>]*\/>/)) {
|
|
ftag = parsexmltag(cref[0]);
|
|
if (sharedf[ftag.si]) p.f = shift_formula_xlsx(sharedf[ftag.si][1], sharedf[ftag.si][2] /*[0].ref*/, tag.r);
|
|
}
|
|
/* TODO: factor out contains logic */
|
|
var _tag = decode_cell(tag.r);
|
|
for (i = 0; i < arrayf.length; ++i) {
|
|
if (_tag.r >= arrayf[i][0].s.r && _tag.r <= arrayf[i][0].e.r) if (_tag.c >= arrayf[i][0].s.c && _tag.c <= arrayf[i][0].e.c) p.F = arrayf[i][1];
|
|
}
|
|
}
|
|
if (tag.t == null && p.v === undefined) {
|
|
if (p.f || p.F) {
|
|
p.v = 0;
|
|
p.t = "n";
|
|
} else if (!sheetStubs) continue;else p.t = "z";
|
|
} else p.t = tag.t || "n";
|
|
if (guess.s.c > tagc) guess.s.c = tagc;
|
|
if (guess.e.c < tagc) guess.e.c = tagc;
|
|
/* 18.18.11 t ST_CellType */
|
|
switch (p.t) {
|
|
case 'n':
|
|
if (p.v == "" || p.v == null) {
|
|
if (!sheetStubs) continue;
|
|
p.t = 'z';
|
|
} else p.v = parseFloat(p.v);
|
|
break;
|
|
case 's':
|
|
if (typeof p.v == 'undefined') {
|
|
if (!sheetStubs) continue;
|
|
p.t = 'z';
|
|
} else {
|
|
sstr = strs[parseInt(p.v, 10)];
|
|
p.v = sstr.t;
|
|
p.r = sstr.r;
|
|
if (opts.cellHTML) p.h = sstr.h;
|
|
}
|
|
break;
|
|
case 'str':
|
|
p.t = "s";
|
|
p.v = p.v != null ? utf8read(p.v) : '';
|
|
if (opts.cellHTML) p.h = escapehtml(p.v);
|
|
break;
|
|
case 'inlineStr':
|
|
cref = d.match(isregex);
|
|
p.t = 's';
|
|
if (cref != null && (sstr = parse_si(cref[1]))) {
|
|
p.v = sstr.t;
|
|
if (opts.cellHTML) p.h = sstr.h;
|
|
} else p.v = "";
|
|
break;
|
|
case 'b':
|
|
p.v = parsexmlbool(p.v);
|
|
break;
|
|
case 'd':
|
|
if (opts.cellDates) p.v = parseDate(p.v, 1);else {
|
|
p.v = datenum(parseDate(p.v, 1));
|
|
p.t = 'n';
|
|
}
|
|
break;
|
|
/* error string in .w, number in .v */
|
|
case 'e':
|
|
if (!opts || opts.cellText !== false) p.w = p.v;
|
|
p.v = RBErr[p.v];
|
|
break;
|
|
}
|
|
/* formatting */
|
|
fmtid = fillid = 0;
|
|
cf = null;
|
|
if (do_format && tag.s !== undefined) {
|
|
cf = styles.CellXf[tag.s];
|
|
if (cf != null) {
|
|
if (cf.numFmtId != null) fmtid = cf.numFmtId;
|
|
if (opts.cellStyles) {
|
|
if (cf.fillId != null) fillid = cf.fillId;
|
|
}
|
|
}
|
|
}
|
|
safe_format(p, fmtid, fillid, opts, themes, styles);
|
|
if (opts.cellDates && do_format && p.t == 'n' && SSF.is_date(SSF._table[fmtid])) {
|
|
p.t = 'd';
|
|
p.v = numdate(p.v);
|
|
}
|
|
if (dense) {
|
|
var _r = decode_cell(tag.r);
|
|
if (!s[_r.r]) s[_r.r] = [];
|
|
s[_r.r][_r.c] = p;
|
|
} else s[tag.r] = p;
|
|
}
|
|
}
|
|
if (rows.length > 0) s['!rows'] = rows;
|
|
};
|
|
}();
|
|
function write_ws_xml_data(ws, opts, idx, wb) {
|
|
var o = [],
|
|
r = [],
|
|
range = safe_decode_range(ws['!ref']),
|
|
cell = "",
|
|
ref,
|
|
rr = "",
|
|
cols = [],
|
|
R = 0,
|
|
C = 0,
|
|
rows = ws['!rows'];
|
|
var dense = Array.isArray(ws);
|
|
var params = {
|
|
r: rr
|
|
},
|
|
row,
|
|
height = -1;
|
|
for (C = range.s.c; C <= range.e.c; ++C) {
|
|
cols[C] = encode_col(C);
|
|
}
|
|
for (R = range.s.r; R <= range.e.r; ++R) {
|
|
r = [];
|
|
rr = encode_row(R);
|
|
for (C = range.s.c; C <= range.e.c; ++C) {
|
|
ref = cols[C] + rr;
|
|
var _cell = dense ? (ws[R] || [])[C] : ws[ref];
|
|
if (_cell === undefined) continue;
|
|
if ((cell = write_ws_xml_cell(_cell, ref, ws, opts, idx, wb)) != null) r.push(cell);
|
|
}
|
|
if (r.length > 0 || rows && rows[R]) {
|
|
params = {
|
|
r: rr
|
|
};
|
|
if (rows && rows[R]) {
|
|
row = rows[R];
|
|
if (row.hidden) params.hidden = 1;
|
|
height = -1;
|
|
if (row.hpx) height = px2pt(row.hpx);else if (row.hpt) height = row.hpt;
|
|
if (height > -1) {
|
|
params.ht = height;
|
|
params.customHeight = 1;
|
|
}
|
|
if (row.level) {
|
|
params.outlineLevel = row.level;
|
|
}
|
|
}
|
|
o[o.length] = writextag('row', r.join(""), params);
|
|
}
|
|
}
|
|
if (rows) for (; R < rows.length; ++R) {
|
|
if (rows && rows[R]) {
|
|
params = {
|
|
r: R + 1
|
|
};
|
|
row = rows[R];
|
|
if (row.hidden) params.hidden = 1;
|
|
height = -1;
|
|
if (row.hpx) height = px2pt(row.hpx);else if (row.hpt) height = row.hpt;
|
|
if (height > -1) {
|
|
params.ht = height;
|
|
params.customHeight = 1;
|
|
}
|
|
if (row.level) {
|
|
params.outlineLevel = row.level;
|
|
}
|
|
o[o.length] = writextag('row', "", params);
|
|
}
|
|
}
|
|
return o.join("");
|
|
}
|
|
var WS_XML_ROOT = writextag('worksheet', null, {
|
|
'xmlns': XMLNS.main[0],
|
|
'xmlns:r': XMLNS.r
|
|
});
|
|
function write_ws_xml(idx, opts, wb, rels) {
|
|
var o = [XML_HEADER, WS_XML_ROOT];
|
|
var s = wb.SheetNames[idx],
|
|
sidx = 0,
|
|
rdata = "";
|
|
var ws = wb.Sheets[s];
|
|
if (ws == null) ws = {};
|
|
var ref = ws['!ref'] || 'A1';
|
|
var range = safe_decode_range(ref);
|
|
if (range.e.c > 0x3FFF || range.e.r > 0xFFFFF) {
|
|
if (opts.WTF) throw new Error("Range " + ref + " exceeds format limit A1:XFD1048576");
|
|
range.e.c = Math.min(range.e.c, 0x3FFF);
|
|
range.e.r = Math.min(range.e.c, 0xFFFFF);
|
|
ref = encode_range(range);
|
|
}
|
|
if (!rels) rels = {};
|
|
ws['!comments'] = [];
|
|
var _drawing = [];
|
|
write_ws_xml_sheetpr(ws, wb, idx, opts, o);
|
|
o[o.length] = writextag('dimension', null, {
|
|
'ref': ref
|
|
});
|
|
o[o.length] = write_ws_xml_sheetviews(ws, opts, idx, wb);
|
|
|
|
/* TODO: store in WB, process styles */
|
|
if (opts.sheetFormat) o[o.length] = writextag('sheetFormatPr', null, {
|
|
defaultRowHeight: opts.sheetFormat.defaultRowHeight || '16',
|
|
baseColWidth: opts.sheetFormat.baseColWidth || '10',
|
|
outlineLevelRow: opts.sheetFormat.outlineLevelRow || '7'
|
|
});
|
|
if (ws['!cols'] != null && ws['!cols'].length > 0) o[o.length] = write_ws_xml_cols(ws, ws['!cols']);
|
|
o[sidx = o.length] = '<sheetData/>';
|
|
ws['!links'] = [];
|
|
if (ws['!ref'] != null) {
|
|
rdata = write_ws_xml_data(ws, opts, idx, wb, rels);
|
|
if (rdata.length > 0) o[o.length] = rdata;
|
|
}
|
|
if (o.length > sidx + 1) {
|
|
o[o.length] = '</sheetData>';
|
|
o[sidx] = o[sidx].replace("/>", ">");
|
|
}
|
|
|
|
/* sheetCalcPr */
|
|
|
|
if (ws['!protect']) o[o.length] = write_ws_xml_protection(ws['!protect']);
|
|
|
|
/* protectedRanges */
|
|
/* scenarios */
|
|
|
|
if (ws['!autofilter'] != null) o[o.length] = write_ws_xml_autofilter(ws['!autofilter'], ws, wb, idx);
|
|
|
|
/* sortState */
|
|
/* dataConsolidate */
|
|
/* customSheetViews */
|
|
|
|
if (ws['!merges'] != null && ws['!merges'].length > 0) o[o.length] = write_ws_xml_merges(ws['!merges']);
|
|
|
|
/* phoneticPr */
|
|
/* conditionalFormatting */
|
|
/* dataValidations */
|
|
|
|
var relc = -1,
|
|
rel,
|
|
rId = -1;
|
|
if (ws['!links'].length > 0) {
|
|
o[o.length] = "<hyperlinks>";
|
|
ws['!links'].forEach(function (l) {
|
|
if (!l[1].Target) return;
|
|
rel = {
|
|
"ref": l[0]
|
|
};
|
|
if (l[1].Target.charAt(0) != "#") {
|
|
rId = add_rels(rels, -1, escapexml(l[1].Target).replace(/#.*$/, ""), RELS.HLINK);
|
|
rel["r:id"] = "rId" + rId;
|
|
}
|
|
if ((relc = l[1].Target.indexOf("#")) > -1) rel.location = escapexml(l[1].Target.slice(relc + 1));
|
|
if (l[1].Tooltip) rel.tooltip = escapexml(l[1].Tooltip);
|
|
o[o.length] = writextag("hyperlink", null, rel);
|
|
});
|
|
o[o.length] = "</hyperlinks>";
|
|
}
|
|
delete ws['!links'];
|
|
|
|
/* printOptions */
|
|
|
|
if (ws['!margins'] != null) o[o.length] = write_ws_xml_margins(ws['!margins']);
|
|
|
|
/* pageSetup */
|
|
/* headerFooter */
|
|
/* rowBreaks */
|
|
/* colBreaks */
|
|
/* customProperties */
|
|
/* cellWatches */
|
|
|
|
if (!opts || opts.ignoreEC || opts.ignoreEC == void 0) o[o.length] = writetag("ignoredErrors", writextag("ignoredError", null, {
|
|
numberStoredAsText: 1,
|
|
sqref: ref
|
|
}));
|
|
|
|
/* smartTags */
|
|
|
|
if (_drawing.length > 0) {
|
|
rId = add_rels(rels, -1, "../drawings/drawing" + (idx + 1) + ".xml", RELS.DRAW);
|
|
o[o.length] = writextag("drawing", null, {
|
|
"r:id": "rId" + rId
|
|
});
|
|
ws['!drawing'] = _drawing;
|
|
}
|
|
if (ws['!comments'].length > 0) {
|
|
rId = add_rels(rels, -1, "../drawings/vmlDrawing" + (idx + 1) + ".vml", RELS.VML);
|
|
o[o.length] = writextag("legacyDrawing", null, {
|
|
"r:id": "rId" + rId
|
|
});
|
|
ws['!legacy'] = rId;
|
|
}
|
|
|
|
/* legacyDrawingHF */
|
|
/* picture */
|
|
/* oleObjects */
|
|
/* controls */
|
|
/* webPublishItems */
|
|
/* tableParts */
|
|
/* extLst */
|
|
|
|
if (o.length > 1) {
|
|
o[o.length] = '</worksheet>';
|
|
o[1] = o[1].replace("/>", ">");
|
|
}
|
|
return o.join("");
|
|
}
|
|
RELS.CHART = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart";
|
|
RELS.CHARTEX = "http://schemas.microsoft.com/office/2014/relationships/chartEx";
|
|
function parse_Cache(data) {
|
|
var col = [];
|
|
var num = data.match(/^<c:numCache>/);
|
|
var f;
|
|
|
|
/* 21.2.2.150 pt CT_NumVal */
|
|
(data.match(/<c:pt idx="(\d*)">(.*?)<\/c:pt>/mg) || []).forEach(function (pt) {
|
|
var q = pt.match(/<c:pt idx="(\d*?)"><c:v>(.*)<\/c:v><\/c:pt>/);
|
|
if (!q) return;
|
|
col[+q[1]] = num ? +q[2] : q[2];
|
|
});
|
|
|
|
/* 21.2.2.71 formatCode CT_Xstring */
|
|
var nf = unescapexml((data.match(/<c:formatCode>([\s\S]*?)<\/c:formatCode>/) || ["", "General"])[1]);
|
|
(data.match(/<c:f>(.*?)<\/c:f>/mg) || []).forEach(function (F) {
|
|
f = F.replace(/<.*?>/g, "");
|
|
});
|
|
return [col, nf, f];
|
|
}
|
|
|
|
/* 21.2 DrawingML - Charts */
|
|
function parse_chart(data, name, opts, rels, wb, csheet) {
|
|
var cs = csheet || {
|
|
"!type": "chart"
|
|
};
|
|
if (!data) return csheet;
|
|
/* 21.2.2.27 chart CT_Chart */
|
|
|
|
var C = 0,
|
|
R = 0,
|
|
col = "A";
|
|
var refguess = {
|
|
s: {
|
|
r: 2000000,
|
|
c: 2000000
|
|
},
|
|
e: {
|
|
r: 0,
|
|
c: 0
|
|
}
|
|
};
|
|
|
|
/* 21.2.2.120 numCache CT_NumData */
|
|
(data.match(/<c:numCache>[\s\S]*?<\/c:numCache>/gm) || []).forEach(function (nc) {
|
|
var cache = parse_Cache(nc);
|
|
refguess.s.r = refguess.s.c = 0;
|
|
refguess.e.c = C;
|
|
col = encode_col(C);
|
|
cache[0].forEach(function (n, i) {
|
|
cs[col + encode_row(i)] = {
|
|
t: 'n',
|
|
v: n,
|
|
z: cache[1]
|
|
};
|
|
R = i;
|
|
});
|
|
if (refguess.e.r < R) refguess.e.r = R;
|
|
++C;
|
|
});
|
|
if (C > 0) cs["!ref"] = encode_range(refguess);
|
|
return cs;
|
|
}
|
|
RELS.CS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet";
|
|
var CS_XML_ROOT = writextag('chartsheet', null, {
|
|
'xmlns': XMLNS.main[0],
|
|
'xmlns:r': XMLNS.r
|
|
});
|
|
|
|
/* 18.3 Worksheets also covers Chartsheets */
|
|
function parse_cs_xml(data, opts, idx, rels, wb) {
|
|
if (!data) return data;
|
|
/* 18.3.1.12 chartsheet CT_ChartSheet */
|
|
if (!rels) rels = {
|
|
'!id': {}
|
|
};
|
|
var s = {
|
|
'!type': "chart",
|
|
'!drawel': null,
|
|
'!rel': ""
|
|
};
|
|
var m;
|
|
|
|
/* 18.3.1.83 sheetPr CT_ChartsheetPr */
|
|
var sheetPr = data.match(sheetprregex);
|
|
if (sheetPr) parse_ws_xml_sheetpr(sheetPr[0], s, wb, idx);
|
|
|
|
/* 18.3.1.36 drawing CT_Drawing */
|
|
if (m = data.match(/drawing r:id="(.*?)"/)) s['!rel'] = m[1];
|
|
if (rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];
|
|
return s;
|
|
}
|
|
function write_cs_xml(idx, opts, wb, rels) {
|
|
var o = [XML_HEADER, CS_XML_ROOT];
|
|
o[o.length] = writextag("drawing", null, {
|
|
"r:id": "rId1"
|
|
});
|
|
add_rels(rels, -1, "../drawings/drawing" + (idx + 1) + ".xml", RELS.DRAW);
|
|
if (o.length > 2) {
|
|
o[o.length] = '</chartsheet>';
|
|
o[1] = o[1].replace("/>", ">");
|
|
}
|
|
return o.join("");
|
|
}
|
|
|
|
/* [MS-XLSB] 2.4.331 BrtCsProp */
|
|
function parse_BrtCsProp(data, length) {
|
|
data.l += 10;
|
|
var name = parse_XLWideString(data, length - 10);
|
|
return {
|
|
name: name
|
|
};
|
|
}
|
|
|
|
/* [MS-XLSB] 2.1.7.7 Chart Sheet */
|
|
function parse_cs_bin(data, opts, idx, rels, wb) {
|
|
if (!data) return data;
|
|
if (!rels) rels = {
|
|
'!id': {}
|
|
};
|
|
var s = {
|
|
'!type': "chart",
|
|
'!drawel': null,
|
|
'!rel': ""
|
|
};
|
|
var state = [];
|
|
var pass = false;
|
|
recordhopper(data, function cs_parse(val, R_n, RT) {
|
|
switch (RT) {
|
|
case 0x0226:
|
|
/* 'BrtDrawing' */
|
|
s['!rel'] = val;
|
|
break;
|
|
case 0x028B:
|
|
/* 'BrtCsProp' */
|
|
if (!wb.Sheets[idx]) wb.Sheets[idx] = {};
|
|
if (val.name) wb.Sheets[idx].CodeName = val.name;
|
|
break;
|
|
case 0x0232: /* 'BrtBkHim' */
|
|
case 0x028C: /* 'BrtCsPageSetup' */
|
|
case 0x029D: /* 'BrtCsProtection' */
|
|
case 0x02A7: /* 'BrtCsProtectionIso' */
|
|
case 0x0227: /* 'BrtLegacyDrawing' */
|
|
case 0x0228: /* 'BrtLegacyDrawingHF' */
|
|
case 0x01DC: /* 'BrtMargins' */
|
|
case 0x0C00:
|
|
/* 'BrtUid' */
|
|
break;
|
|
case 0x0023:
|
|
/* 'BrtFRTBegin' */
|
|
pass = true;
|
|
break;
|
|
case 0x0024:
|
|
/* 'BrtFRTEnd' */
|
|
pass = false;
|
|
break;
|
|
case 0x0025:
|
|
/* 'BrtACBegin' */
|
|
state.push(R_n);
|
|
break;
|
|
case 0x0026:
|
|
/* 'BrtACEnd' */
|
|
state.pop();
|
|
break;
|
|
default:
|
|
if ((R_n || "").indexOf("Begin") > 0) state.push(R_n);else if ((R_n || "").indexOf("End") > 0) state.pop();else if (!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R_n);
|
|
}
|
|
}, opts);
|
|
if (rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];
|
|
return s;
|
|
}
|
|
function write_cs_bin() {
|
|
var ba = buf_array();
|
|
write_record(ba, "BrtBeginSheet");
|
|
/* [BrtCsProp] */
|
|
/* CSVIEWS */
|
|
/* [[BrtCsProtectionIso] BrtCsProtection] */
|
|
/* [USERCSVIEWS] */
|
|
/* [BrtMargins] */
|
|
/* [BrtCsPageSetup] */
|
|
/* [HEADERFOOTER] */
|
|
/* BrtDrawing */
|
|
/* [BrtLegacyDrawing] */
|
|
/* [BrtLegacyDrawingHF] */
|
|
/* [BrtBkHim] */
|
|
/* [WEBPUBITEMS] */
|
|
/* FRTCHARTSHEET */
|
|
write_record(ba, "BrtEndSheet");
|
|
return ba.end();
|
|
}
|
|
/* 18.2.28 (CT_WorkbookProtection) Defaults */
|
|
var WBPropsDef = [['allowRefreshQuery', false, "bool"], ['autoCompressPictures', true, "bool"], ['backupFile', false, "bool"], ['checkCompatibility', false, "bool"], ['CodeName', ''], ['date1904', false, "bool"], ['defaultThemeVersion', 0, "int"], ['filterPrivacy', false, "bool"], ['hidePivotFieldList', false, "bool"], ['promptedSolutions', false, "bool"], ['publishItems', false, "bool"], ['refreshAllConnections', false, "bool"], ['saveExternalLinkValues', true, "bool"], ['showBorderUnselectedTables', true, "bool"], ['showInkAnnotation', true, "bool"], ['showObjects', 'all'], ['showPivotChartFilter', false, "bool"], ['updateLinks', 'userSet']];
|
|
|
|
/* 18.2.30 (CT_BookView) Defaults */
|
|
var WBViewDef = [['activeTab', 0, "int"], ['autoFilterDateGrouping', true, "bool"], ['firstSheet', 0, "int"], ['minimized', false, "bool"], ['showHorizontalScroll', true, "bool"], ['showSheetTabs', true, "bool"], ['showVerticalScroll', true, "bool"], ['tabRatio', 600, "int"], ['visibility', 'visible']
|
|
//window{Height,Width}, {x,y}Window
|
|
];
|
|
|
|
/* 18.2.19 (CT_Sheet) Defaults */
|
|
var SheetDef = [
|
|
//['state', 'visible']
|
|
];
|
|
|
|
/* 18.2.2 (CT_CalcPr) Defaults */
|
|
var CalcPrDef = [['calcCompleted', 'true'], ['calcMode', 'auto'], ['calcOnSave', 'true'], ['concurrentCalc', 'true'], ['fullCalcOnLoad', 'false'], ['fullPrecision', 'true'], ['iterate', 'false'], ['iterateCount', '100'], ['iterateDelta', '0.001'], ['refMode', 'A1']];
|
|
|
|
/* 18.2.3 (CT_CustomWorkbookView) Defaults */
|
|
/*var CustomWBViewDef = [
|
|
['autoUpdate', 'false'],
|
|
['changesSavedWin', 'false'],
|
|
['includeHiddenRowCol', 'true'],
|
|
['includePrintSettings', 'true'],
|
|
['maximized', 'false'],
|
|
['minimized', 'false'],
|
|
['onlySync', 'false'],
|
|
['personalView', 'false'],
|
|
['showComments', 'commIndicator'],
|
|
['showFormulaBar', 'true'],
|
|
['showHorizontalScroll', 'true'],
|
|
['showObjects', 'all'],
|
|
['showSheetTabs', 'true'],
|
|
['showStatusbar', 'true'],
|
|
['showVerticalScroll', 'true'],
|
|
['tabRatio', '600'],
|
|
['xWindow', '0'],
|
|
['yWindow', '0']
|
|
];*/
|
|
|
|
function push_defaults_array(target, defaults) {
|
|
for (var j = 0; j != target.length; ++j) {
|
|
var w = target[j];
|
|
for (var i = 0; i != defaults.length; ++i) {
|
|
var z = defaults[i];
|
|
if (w[z[0]] == null) w[z[0]] = z[1];else switch (z[2]) {
|
|
case "bool":
|
|
if (typeof w[z[0]] == "string") w[z[0]] = parsexmlbool(w[z[0]]);
|
|
break;
|
|
case "int":
|
|
if (typeof w[z[0]] == "string") w[z[0]] = parseInt(w[z[0]], 10);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function push_defaults(target, defaults) {
|
|
for (var i = 0; i != defaults.length; ++i) {
|
|
var z = defaults[i];
|
|
if (target[z[0]] == null) target[z[0]] = z[1];else switch (z[2]) {
|
|
case "bool":
|
|
if (typeof target[z[0]] == "string") target[z[0]] = parsexmlbool(target[z[0]]);
|
|
break;
|
|
case "int":
|
|
if (typeof target[z[0]] == "string") target[z[0]] = parseInt(target[z[0]], 10);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
function parse_wb_defaults(wb) {
|
|
push_defaults(wb.WBProps, WBPropsDef);
|
|
push_defaults(wb.CalcPr, CalcPrDef);
|
|
push_defaults_array(wb.WBView, WBViewDef);
|
|
push_defaults_array(wb.Sheets, SheetDef);
|
|
_ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904);
|
|
}
|
|
function safe1904(wb) {
|
|
/* TODO: store date1904 somewhere else */
|
|
if (!wb.Workbook) return "false";
|
|
if (!wb.Workbook.WBProps) return "false";
|
|
return parsexmlbool(wb.Workbook.WBProps.date1904) ? "true" : "false";
|
|
}
|
|
var badchars = "][*?\/\\".split("");
|
|
function check_ws_name(n, safe) {
|
|
if (n.length > 31) {
|
|
if (safe) return false;
|
|
throw new Error("Sheet names cannot exceed 31 chars");
|
|
}
|
|
var _good = true;
|
|
badchars.forEach(function (c) {
|
|
if (n.indexOf(c) == -1) return;
|
|
if (!safe) throw new Error("Sheet name cannot contain : \\ / ? * [ ]");
|
|
_good = false;
|
|
});
|
|
return _good;
|
|
}
|
|
function check_wb_names(N, S, codes) {
|
|
N.forEach(function (n, i) {
|
|
check_ws_name(n);
|
|
for (var j = 0; j < i; ++j) {
|
|
if (n == N[j]) throw new Error("Duplicate Sheet Name: " + n);
|
|
}
|
|
if (codes) {
|
|
var cn = S && S[i] && S[i].CodeName || n;
|
|
if (cn.charCodeAt(0) == 95 && cn.length > 22) throw new Error("Bad Code Name: Worksheet" + cn);
|
|
}
|
|
});
|
|
}
|
|
function check_wb(wb) {
|
|
if (!wb || !wb.SheetNames || !wb.Sheets) throw new Error("Invalid Workbook");
|
|
if (!wb.SheetNames.length) throw new Error("Workbook is empty");
|
|
var Sheets = wb.Workbook && wb.Workbook.Sheets || [];
|
|
check_wb_names(wb.SheetNames, Sheets, !!wb.vbaraw);
|
|
for (var i = 0; i < wb.SheetNames.length; ++i) {
|
|
check_ws(wb.Sheets[wb.SheetNames[i]], wb.SheetNames[i], i);
|
|
}
|
|
/* TODO: validate workbook */
|
|
}
|
|
/* 18.2 Workbook */
|
|
var wbnsregex = /<\w+:workbook/;
|
|
function parse_wb_xml(data, opts) {
|
|
if (!data) throw new Error("Could not find file");
|
|
var wb = {
|
|
AppVersion: {},
|
|
WBProps: {},
|
|
WBView: [],
|
|
Sheets: [],
|
|
CalcPr: {},
|
|
Names: [],
|
|
xmlns: ""
|
|
};
|
|
var pass = false,
|
|
xmlns = "xmlns";
|
|
var dname = {},
|
|
dnstart = 0;
|
|
data.replace(tagregex, function xml_wb(x, idx) {
|
|
var y = parsexmltag(x);
|
|
switch (strip_ns(y[0])) {
|
|
case '<?xml':
|
|
break;
|
|
|
|
/* 18.2.27 workbook CT_Workbook 1 */
|
|
case '<workbook':
|
|
if (x.match(wbnsregex)) xmlns = "xmlns" + x.match(/<(\w+):/)[1];
|
|
wb.xmlns = y[xmlns];
|
|
break;
|
|
case '</workbook>':
|
|
break;
|
|
|
|
/* 18.2.13 fileVersion CT_FileVersion ? */
|
|
case '<fileVersion':
|
|
delete y[0];
|
|
wb.AppVersion = y;
|
|
break;
|
|
case '<fileVersion/>':
|
|
case '</fileVersion>':
|
|
break;
|
|
|
|
/* 18.2.12 fileSharing CT_FileSharing ? */
|
|
case '<fileSharing':
|
|
break;
|
|
case '<fileSharing/>':
|
|
break;
|
|
|
|
/* 18.2.28 workbookPr CT_WorkbookPr ? */
|
|
case '<workbookPr':
|
|
case '<workbookPr/>':
|
|
WBPropsDef.forEach(function (w) {
|
|
if (y[w[0]] == null) return;
|
|
switch (w[2]) {
|
|
case "bool":
|
|
wb.WBProps[w[0]] = parsexmlbool(y[w[0]]);
|
|
break;
|
|
case "int":
|
|
wb.WBProps[w[0]] = parseInt(y[w[0]], 10);
|
|
break;
|
|
default:
|
|
wb.WBProps[w[0]] = y[w[0]];
|
|
}
|
|
});
|
|
if (y.codeName) wb.WBProps.CodeName = utf8read(y.codeName);
|
|
break;
|
|
case '</workbookPr>':
|
|
break;
|
|
|
|
/* 18.2.29 workbookProtection CT_WorkbookProtection ? */
|
|
case '<workbookProtection':
|
|
break;
|
|
case '<workbookProtection/>':
|
|
break;
|
|
|
|
/* 18.2.1 bookViews CT_BookViews ? */
|
|
case '<bookViews':
|
|
case '<bookViews>':
|
|
case '</bookViews>':
|
|
break;
|
|
/* 18.2.30 workbookView CT_BookView + */
|
|
case '<workbookView':
|
|
case '<workbookView/>':
|
|
delete y[0];
|
|
wb.WBView.push(y);
|
|
break;
|
|
case '</workbookView>':
|
|
break;
|
|
|
|
/* 18.2.20 sheets CT_Sheets 1 */
|
|
case '<sheets':
|
|
case '<sheets>':
|
|
case '</sheets>':
|
|
break;
|
|
// aggregate sheet
|
|
/* 18.2.19 sheet CT_Sheet + */
|
|
case '<sheet':
|
|
switch (y.state) {
|
|
case "hidden":
|
|
y.Hidden = 1;
|
|
break;
|
|
case "veryHidden":
|
|
y.Hidden = 2;
|
|
break;
|
|
default:
|
|
y.Hidden = 0;
|
|
}
|
|
delete y.state;
|
|
y.name = unescapexml(utf8read(y.name));
|
|
delete y[0];
|
|
wb.Sheets.push(y);
|
|
break;
|
|
case '</sheet>':
|
|
break;
|
|
|
|
/* 18.2.15 functionGroups CT_FunctionGroups ? */
|
|
case '<functionGroups':
|
|
case '<functionGroups/>':
|
|
break;
|
|
/* 18.2.14 functionGroup CT_FunctionGroup + */
|
|
case '<functionGroup':
|
|
break;
|
|
|
|
/* 18.2.9 externalReferences CT_ExternalReferences ? */
|
|
case '<externalReferences':
|
|
case '</externalReferences>':
|
|
case '<externalReferences>':
|
|
break;
|
|
/* 18.2.8 externalReference CT_ExternalReference + */
|
|
case '<externalReference':
|
|
break;
|
|
|
|
/* 18.2.6 definedNames CT_DefinedNames ? */
|
|
case '<definedNames/>':
|
|
break;
|
|
case '<definedNames>':
|
|
case '<definedNames':
|
|
pass = true;
|
|
break;
|
|
case '</definedNames>':
|
|
pass = false;
|
|
break;
|
|
/* 18.2.5 definedName CT_DefinedName + */
|
|
case '<definedName':
|
|
{
|
|
dname = {};
|
|
dname.Name = utf8read(y.name);
|
|
if (y.comment) dname.Comment = y.comment;
|
|
if (y.localSheetId) dname.Sheet = +y.localSheetId;
|
|
if (parsexmlbool(y.hidden || "0")) dname.Hidden = true;
|
|
dnstart = idx + x.length;
|
|
}
|
|
break;
|
|
case '</definedName>':
|
|
{
|
|
dname.Ref = unescapexml(utf8read(data.slice(dnstart, idx)));
|
|
wb.Names.push(dname);
|
|
}
|
|
break;
|
|
case '<definedName/>':
|
|
break;
|
|
|
|
/* 18.2.2 calcPr CT_CalcPr ? */
|
|
case '<calcPr':
|
|
delete y[0];
|
|
wb.CalcPr = y;
|
|
break;
|
|
case '<calcPr/>':
|
|
delete y[0];
|
|
wb.CalcPr = y;
|
|
break;
|
|
case '</calcPr>':
|
|
break;
|
|
|
|
/* 18.2.16 oleSize CT_OleSize ? (ref required) */
|
|
case '<oleSize':
|
|
break;
|
|
|
|
/* 18.2.4 customWorkbookViews CT_CustomWorkbookViews ? */
|
|
case '<customWorkbookViews>':
|
|
case '</customWorkbookViews>':
|
|
case '<customWorkbookViews':
|
|
break;
|
|
/* 18.2.3 customWorkbookView CT_CustomWorkbookView + */
|
|
case '<customWorkbookView':
|
|
case '</customWorkbookView>':
|
|
break;
|
|
|
|
/* 18.2.18 pivotCaches CT_PivotCaches ? */
|
|
case '<pivotCaches>':
|
|
case '</pivotCaches>':
|
|
case '<pivotCaches':
|
|
break;
|
|
/* 18.2.17 pivotCache CT_PivotCache ? */
|
|
case '<pivotCache':
|
|
break;
|
|
|
|
/* 18.2.21 smartTagPr CT_SmartTagPr ? */
|
|
case '<smartTagPr':
|
|
case '<smartTagPr/>':
|
|
break;
|
|
|
|
/* 18.2.23 smartTagTypes CT_SmartTagTypes ? */
|
|
case '<smartTagTypes':
|
|
case '<smartTagTypes>':
|
|
case '</smartTagTypes>':
|
|
break;
|
|
/* 18.2.22 smartTagType CT_SmartTagType ? */
|
|
case '<smartTagType':
|
|
break;
|
|
|
|
/* 18.2.24 webPublishing CT_WebPublishing ? */
|
|
case '<webPublishing':
|
|
case '<webPublishing/>':
|
|
break;
|
|
|
|
/* 18.2.11 fileRecoveryPr CT_FileRecoveryPr ? */
|
|
case '<fileRecoveryPr':
|
|
case '<fileRecoveryPr/>':
|
|
break;
|
|
|
|
/* 18.2.26 webPublishObjects CT_WebPublishObjects ? */
|
|
case '<webPublishObjects>':
|
|
case '<webPublishObjects':
|
|
case '</webPublishObjects>':
|
|
break;
|
|
/* 18.2.25 webPublishObject CT_WebPublishObject ? */
|
|
case '<webPublishObject':
|
|
break;
|
|
|
|
/* 18.2.10 extLst CT_ExtensionList ? */
|
|
case '<extLst':
|
|
case '<extLst>':
|
|
case '</extLst>':
|
|
case '<extLst/>':
|
|
break;
|
|
/* 18.2.7 ext CT_Extension + */
|
|
case '<ext':
|
|
pass = true;
|
|
break;
|
|
//TODO: check with versions of excel
|
|
case '</ext>':
|
|
pass = false;
|
|
break;
|
|
|
|
/* Others */
|
|
case '<ArchID':
|
|
break;
|
|
case '<AlternateContent':
|
|
case '<AlternateContent>':
|
|
pass = true;
|
|
break;
|
|
case '</AlternateContent>':
|
|
pass = false;
|
|
break;
|
|
|
|
/* TODO */
|
|
case '<revisionPtr':
|
|
break;
|
|
default:
|
|
if (!pass && opts.WTF) throw new Error('unrecognized ' + y[0] + ' in workbook');
|
|
}
|
|
return x;
|
|
});
|
|
if (XMLNS.main.indexOf(wb.xmlns) === -1) throw new Error("Unknown Namespace: " + wb.xmlns);
|
|
parse_wb_defaults(wb);
|
|
return wb;
|
|
}
|
|
var WB_XML_ROOT = writextag('workbook', null, {
|
|
'xmlns': XMLNS.main[0],
|
|
//'xmlns:mx': XMLNS.mx,
|
|
//'xmlns:s': XMLNS.main[0],
|
|
'xmlns:r': XMLNS.r
|
|
});
|
|
function write_wb_xml(wb) {
|
|
var o = [XML_HEADER];
|
|
o[o.length] = WB_XML_ROOT;
|
|
var write_names = wb.Workbook && (wb.Workbook.Names || []).length > 0;
|
|
|
|
/* fileVersion */
|
|
/* fileSharing */
|
|
|
|
var workbookPr = {
|
|
codeName: "ThisWorkbook"
|
|
};
|
|
if (wb.Workbook && wb.Workbook.WBProps) {
|
|
WBPropsDef.forEach(function (x) {
|
|
if (wb.Workbook.WBProps[x[0]] == null) return;
|
|
if (wb.Workbook.WBProps[x[0]] == x[1]) return;
|
|
workbookPr[x[0]] = wb.Workbook.WBProps[x[0]];
|
|
});
|
|
if (wb.Workbook.WBProps.CodeName) {
|
|
workbookPr.codeName = wb.Workbook.WBProps.CodeName;
|
|
delete workbookPr.CodeName;
|
|
}
|
|
}
|
|
o[o.length] = writextag('workbookPr', null, workbookPr);
|
|
|
|
/* workbookProtection */
|
|
|
|
var sheets = wb.Workbook && wb.Workbook.Sheets || [];
|
|
var i = 0;
|
|
|
|
/* bookViews only written if first worksheet is hidden */
|
|
if (sheets && sheets[0] && !!sheets[0].Hidden) {
|
|
o[o.length] = "<bookViews>";
|
|
for (i = 0; i != wb.SheetNames.length; ++i) {
|
|
if (!sheets[i]) break;
|
|
if (!sheets[i].Hidden) break;
|
|
}
|
|
if (i == wb.SheetNames.length) i = 0;
|
|
o[o.length] = '<workbookView firstSheet="' + i + '" activeTab="' + i + '"/>';
|
|
o[o.length] = "</bookViews>";
|
|
}
|
|
o[o.length] = "<sheets>";
|
|
for (i = 0; i != wb.SheetNames.length; ++i) {
|
|
var sht = {
|
|
name: escapexml(wb.SheetNames[i].slice(0, 31))
|
|
};
|
|
sht.sheetId = "" + (i + 1);
|
|
sht["r:id"] = "rId" + (i + 1);
|
|
if (sheets[i]) switch (sheets[i].Hidden) {
|
|
case 1:
|
|
sht.state = "hidden";
|
|
break;
|
|
case 2:
|
|
sht.state = "veryHidden";
|
|
break;
|
|
}
|
|
o[o.length] = writextag('sheet', null, sht);
|
|
}
|
|
o[o.length] = "</sheets>";
|
|
|
|
/* functionGroups */
|
|
/* externalReferences */
|
|
|
|
if (write_names) {
|
|
o[o.length] = "<definedNames>";
|
|
if (wb.Workbook && wb.Workbook.Names) wb.Workbook.Names.forEach(function (n) {
|
|
var d = {
|
|
name: n.Name
|
|
};
|
|
if (n.Comment) d.comment = n.Comment;
|
|
if (n.Sheet != null) d.localSheetId = "" + n.Sheet;
|
|
if (n.Hidden) d.hidden = "1";
|
|
if (!n.Ref) return;
|
|
o[o.length] = writextag('definedName', escapexml(n.Ref), d);
|
|
});
|
|
o[o.length] = "</definedNames>";
|
|
}
|
|
|
|
/* calcPr */
|
|
/* oleSize */
|
|
/* customWorkbookViews */
|
|
/* pivotCaches */
|
|
/* smartTagPr */
|
|
/* smartTagTypes */
|
|
/* webPublishing */
|
|
/* fileRecoveryPr */
|
|
/* webPublishObjects */
|
|
/* extLst */
|
|
|
|
if (o.length > 2) {
|
|
o[o.length] = '</workbook>';
|
|
o[1] = o[1].replace("/>", ">");
|
|
}
|
|
return o.join("");
|
|
}
|
|
function parse_wb(data, name, opts) {
|
|
if (name.slice(-4) === ".bin") return parse_wb_bin(data, opts);
|
|
return parse_wb_xml(data, opts);
|
|
}
|
|
function parse_ws(data, name, idx, opts, rels, wb, themes, styles) {
|
|
if (name.slice(-4) === ".bin") return parse_ws_bin(data, opts, idx, rels, wb, themes, styles);
|
|
return parse_ws_xml(data, opts, idx, rels, wb, themes, styles);
|
|
}
|
|
function parse_cs(data, name, idx, opts, rels, wb, themes, styles) {
|
|
if (name.slice(-4) === ".bin") return parse_cs_bin(data, opts, idx, rels, wb, themes, styles);
|
|
return parse_cs_xml(data, opts, idx, rels, wb, themes, styles);
|
|
}
|
|
function parse_ms(data, name, idx, opts, rels, wb, themes, styles) {
|
|
if (name.slice(-4) === ".bin") return parse_ms_bin(data, opts, idx, rels, wb, themes, styles);
|
|
return parse_ms_xml(data, opts, idx, rels, wb, themes, styles);
|
|
}
|
|
function parse_ds(data, name, idx, opts, rels, wb, themes, styles) {
|
|
if (name.slice(-4) === ".bin") return parse_ds_bin(data, opts, idx, rels, wb, themes, styles);
|
|
return parse_ds_xml(data, opts, idx, rels, wb, themes, styles);
|
|
}
|
|
function parse_sty(data, name, themes, opts) {
|
|
if (name.slice(-4) === ".bin") return parse_sty_bin(data, themes, opts);
|
|
return parse_sty_xml(data, themes, opts);
|
|
}
|
|
function parse_theme(data, name, opts) {
|
|
return parse_theme_xml(data, opts);
|
|
}
|
|
function parse_sst(data, name, opts) {
|
|
if (name.slice(-4) === ".bin") return parse_sst_bin(data, opts);
|
|
return parse_sst_xml(data, opts);
|
|
}
|
|
function parse_cmnt(data, name, opts) {
|
|
if (name.slice(-4) === ".bin") return parse_comments_bin(data, opts);
|
|
return parse_comments_xml(data, opts);
|
|
}
|
|
function parse_cc(data, name, opts) {
|
|
if (name.slice(-4) === ".bin") return parse_cc_bin(data, name, opts);
|
|
return parse_cc_xml(data, name, opts);
|
|
}
|
|
function parse_xlink(data, rel, name, opts) {
|
|
if (name.slice(-4) === ".bin") return parse_xlink_bin(data, rel, name, opts);
|
|
return parse_xlink_xml(data, rel, name, opts);
|
|
}
|
|
function write_wb(wb, name, opts) {
|
|
return (name.slice(-4) === ".bin" ? write_wb_bin : write_wb_xml)(wb, opts);
|
|
}
|
|
function write_ws(data, name, opts, wb, rels) {
|
|
return (name.slice(-4) === ".bin" ? write_ws_bin : write_ws_xml)(data, opts, wb, rels);
|
|
}
|
|
|
|
// eslint-disable-next-line no-unused-vars
|
|
function write_cs(data, name, opts, wb, rels) {
|
|
return (name.slice(-4) === ".bin" ? write_cs_bin : write_cs_xml)(data, opts, wb, rels);
|
|
}
|
|
function write_sty(data, name, opts) {
|
|
return (name.slice(-4) === ".bin" ? write_sty_bin : write_sty_xml)(data, opts);
|
|
}
|
|
function write_sst(data, name, opts) {
|
|
return (name.slice(-4) === ".bin" ? write_sst_bin : write_sst_xml)(data, opts);
|
|
}
|
|
function write_cmnt(data, name, opts) {
|
|
return (name.slice(-4) === ".bin" ? write_comments_bin : write_comments_xml)(data, opts);
|
|
}
|
|
/*
|
|
function write_cc(data, name:string, opts) {
|
|
return (name.slice(-4)===".bin" ? write_cc_bin : write_cc_xml)(data, opts);
|
|
}
|
|
*/
|
|
/* note: browser DOM element cannot see mso- style attrs, must parse */
|
|
var HTML_ = function () {
|
|
function html_to_sheet(str, _opts) {
|
|
var opts = _opts || {};
|
|
if (DENSE != null && opts.dense == null) opts.dense = DENSE;
|
|
var ws = opts.dense ? [] : {};
|
|
str = str.replace(/<!--.*?-->/g, "");
|
|
var mtch = str.match(/<table/i);
|
|
if (!mtch) throw new Error("Invalid HTML: could not find <table>");
|
|
var mtch2 = str.match(/<\/table/i);
|
|
var i = mtch.index,
|
|
j = mtch2 && mtch2.index || str.length;
|
|
var rows = split_regex(str.slice(i, j), /(:?<tr[^>]*>)/i, "<tr>");
|
|
var R = -1,
|
|
C = 0,
|
|
RS = 0,
|
|
CS = 0;
|
|
var range = {
|
|
s: {
|
|
r: 10000000,
|
|
c: 10000000
|
|
},
|
|
e: {
|
|
r: 0,
|
|
c: 0
|
|
}
|
|
};
|
|
var merges = [];
|
|
for (i = 0; i < rows.length; ++i) {
|
|
var row = rows[i].trim();
|
|
var hd = row.slice(0, 3).toLowerCase();
|
|
if (hd == "<tr") {
|
|
++R;
|
|
if (opts.sheetRows && opts.sheetRows <= R) {
|
|
--R;
|
|
break;
|
|
}
|
|
C = 0;
|
|
continue;
|
|
}
|
|
if (hd != "<td" && hd != "<th") continue;
|
|
var cells = row.split(/<\/t[dh]>/i);
|
|
for (j = 0; j < cells.length; ++j) {
|
|
var cell = cells[j].trim();
|
|
if (!cell.match(/<t[dh]/i)) continue;
|
|
var m = cell,
|
|
cc = 0;
|
|
/* TODO: parse styles etc */
|
|
while (m.charAt(0) == "<" && (cc = m.indexOf(">")) > -1) {
|
|
m = m.slice(cc + 1);
|
|
}
|
|
for (var midx = 0; midx < merges.length; ++midx) {
|
|
var _merge = merges[midx];
|
|
if (_merge.s.c == C && _merge.s.r < R && R <= _merge.e.r) {
|
|
C = _merge.e.c + 1;
|
|
midx = -1;
|
|
}
|
|
}
|
|
var tag = parsexmltag(cell.slice(0, cell.indexOf(">")));
|
|
CS = tag.colspan ? +tag.colspan : 1;
|
|
if ((RS = +tag.rowspan) > 1 || CS > 1) merges.push({
|
|
s: {
|
|
r: R,
|
|
c: C
|
|
},
|
|
e: {
|
|
r: R + (RS || 1) - 1,
|
|
c: C + CS - 1
|
|
}
|
|
});
|
|
var _t = tag.t || tag["data-t"] || "";
|
|
/* TODO: generate stub cells */
|
|
if (!m.length) {
|
|
C += CS;
|
|
continue;
|
|
}
|
|
m = htmldecode(m);
|
|
if (range.s.r > R) range.s.r = R;
|
|
if (range.e.r < R) range.e.r = R;
|
|
if (range.s.c > C) range.s.c = C;
|
|
if (range.e.c < C) range.e.c = C;
|
|
if (!m.length) continue;
|
|
var o = {
|
|
t: 's',
|
|
v: m
|
|
};
|
|
if (opts.raw || !m.trim().length || _t == 's') {} else if (m === 'TRUE') o = {
|
|
t: 'b',
|
|
v: true
|
|
};else if (m === 'FALSE') o = {
|
|
t: 'b',
|
|
v: false
|
|
};else if (!isNaN(fuzzynum(m))) o = {
|
|
t: 'n',
|
|
v: fuzzynum(m)
|
|
};else if (!isNaN(fuzzydate(m).getDate())) {
|
|
o = {
|
|
t: 'd',
|
|
v: parseDate(m)
|
|
};
|
|
if (!opts.cellDates) o = {
|
|
t: 'n',
|
|
v: datenum(o.v)
|
|
};
|
|
o.z = opts.dateNF || SSF._table[14];
|
|
}
|
|
if (opts.dense) {
|
|
if (!ws[R]) ws[R] = [];
|
|
ws[R][C] = o;
|
|
} else ws[encode_cell({
|
|
r: R,
|
|
c: C
|
|
})] = o;
|
|
C += CS;
|
|
}
|
|
}
|
|
ws['!ref'] = encode_range(range);
|
|
if (merges.length) ws["!merges"] = merges;
|
|
return ws;
|
|
}
|
|
function html_to_book(str, opts) {
|
|
var mtch = str.match(/<table.*?>[\s\S]*?<\/table>/gi);
|
|
if (!mtch || mtch.length == 0) throw new Error("Invalid HTML: could not find <table>");
|
|
if (mtch.length == 1) return sheet_to_workbook(html_to_sheet(mtch[0], opts), opts);
|
|
var wb = utils.book_new();
|
|
mtch.forEach(function (s, idx) {
|
|
utils.book_append_sheet(wb, html_to_sheet(s, opts), "Sheet" + (idx + 1));
|
|
});
|
|
return wb;
|
|
}
|
|
function make_html_row(ws, r, R, o) {
|
|
var M = ws['!merges'] || [];
|
|
var oo = [];
|
|
for (var C = r.s.c; C <= r.e.c; ++C) {
|
|
var RS = 0,
|
|
CS = 0;
|
|
for (var j = 0; j < M.length; ++j) {
|
|
if (M[j].s.r > R || M[j].s.c > C) continue;
|
|
if (M[j].e.r < R || M[j].e.c < C) continue;
|
|
if (M[j].s.r < R || M[j].s.c < C) {
|
|
RS = -1;
|
|
break;
|
|
}
|
|
RS = M[j].e.r - M[j].s.r + 1;
|
|
CS = M[j].e.c - M[j].s.c + 1;
|
|
break;
|
|
}
|
|
if (RS < 0) continue;
|
|
var coord = encode_cell({
|
|
r: R,
|
|
c: C
|
|
});
|
|
var cell = o.dense ? (ws[R] || [])[C] : ws[coord];
|
|
/* TODO: html entities */
|
|
var w = cell && cell.v != null && (cell.h || escapehtml(cell.w || (format_cell(cell), cell.w) || "")) || "";
|
|
var sp = {};
|
|
if (RS > 1) sp.rowspan = RS;
|
|
if (CS > 1) sp.colspan = CS;
|
|
if (o.editable) w = '<span contenteditable="true">' + w + '</span>';else if (cell) {
|
|
sp["data-t"] = cell && cell.t || 'z';
|
|
if (cell.v != null) sp["data-v"] = cell.v;
|
|
if (cell.z != null) sp["data-z"] = cell.z;
|
|
if (cell.l && (cell.l.Target || "#").charAt(0) != "#") w = '<a href="' + cell.l.Target + '">' + w + '</a>';
|
|
}
|
|
sp.id = (o.id || "sjs") + "-" + coord;
|
|
oo.push(writextag('td', w, sp));
|
|
}
|
|
var preamble = "<tr>";
|
|
return preamble + oo.join("") + "</tr>";
|
|
}
|
|
function make_html_preamble(ws, R, o) {
|
|
var out = [];
|
|
return out.join("") + '<table' + (o && o.id ? ' id="' + o.id + '"' : "") + '>';
|
|
}
|
|
var _BEGIN = '<html><head><meta charset="utf-8"/><title>SheetJS Table Export</title></head><body>';
|
|
var _END = '</body></html>';
|
|
function sheet_to_html(ws, opts /*, wb:?Workbook*/) {
|
|
var o = opts || {};
|
|
var header = o.header != null ? o.header : _BEGIN;
|
|
var footer = o.footer != null ? o.footer : _END;
|
|
var out = [header];
|
|
var r = decode_range(ws['!ref']);
|
|
o.dense = Array.isArray(ws);
|
|
out.push(make_html_preamble(ws, r, o));
|
|
for (var R = r.s.r; R <= r.e.r; ++R) {
|
|
out.push(make_html_row(ws, r, R, o));
|
|
}
|
|
out.push("</table>" + footer);
|
|
return out.join("");
|
|
}
|
|
return {
|
|
to_workbook: html_to_book,
|
|
to_sheet: html_to_sheet,
|
|
_row: make_html_row,
|
|
BEGIN: _BEGIN,
|
|
END: _END,
|
|
_preamble: make_html_preamble,
|
|
from_sheet: sheet_to_html
|
|
};
|
|
}();
|
|
function sheet_add_dom(ws, table, _opts) {
|
|
var opts = _opts || {};
|
|
if (DENSE != null) opts.dense = DENSE;
|
|
var or_R = 0,
|
|
or_C = 0;
|
|
if (opts.origin != null) {
|
|
if (typeof opts.origin == 'number') or_R = opts.origin;else {
|
|
var _origin = typeof opts.origin == "string" ? decode_cell(opts.origin) : opts.origin;
|
|
or_R = _origin.r;
|
|
or_C = _origin.c;
|
|
}
|
|
}
|
|
var rows = table.getElementsByTagName('tr');
|
|
var sheetRows = Math.min(opts.sheetRows || 10000000, rows.length);
|
|
var range = {
|
|
s: {
|
|
r: 0,
|
|
c: 0
|
|
},
|
|
e: {
|
|
r: or_R,
|
|
c: or_C
|
|
}
|
|
};
|
|
if (ws["!ref"]) {
|
|
var _range = decode_range(ws["!ref"]);
|
|
range.s.r = Math.min(range.s.r, _range.s.r);
|
|
range.s.c = Math.min(range.s.c, _range.s.c);
|
|
range.e.r = Math.max(range.e.r, _range.e.r);
|
|
range.e.c = Math.max(range.e.c, _range.e.c);
|
|
if (or_R == -1) range.e.r = or_R = _range.e.r + 1;
|
|
}
|
|
var merges = [],
|
|
midx = 0;
|
|
var rowinfo = ws["!rows"] || (ws["!rows"] = []);
|
|
var _R = 0,
|
|
R = 0,
|
|
_C = 0,
|
|
C = 0,
|
|
RS = 0,
|
|
CS = 0;
|
|
if (!ws["!cols"]) ws['!cols'] = [];
|
|
for (; _R < rows.length && R < sheetRows; ++_R) {
|
|
var row = rows[_R];
|
|
if (is_dom_element_hidden(row)) {
|
|
if (opts.display) continue;
|
|
rowinfo[R] = {
|
|
hidden: true
|
|
};
|
|
}
|
|
var elts = row.children;
|
|
for (_C = C = 0; _C < elts.length; ++_C) {
|
|
var elt = elts[_C];
|
|
if (opts.display && is_dom_element_hidden(elt)) continue;
|
|
var v = elt.hasAttribute('data-v') ? elt.getAttribute('data-v') : elt.hasAttribute('v') ? elt.getAttribute('v') : htmldecode(elt.innerHTML);
|
|
var z = elt.getAttribute('data-z') || elt.getAttribute('z');
|
|
for (midx = 0; midx < merges.length; ++midx) {
|
|
var m = merges[midx];
|
|
if (m.s.c == C + or_C && m.s.r < R + or_R && R + or_R <= m.e.r) {
|
|
C = m.e.c + 1 - or_C;
|
|
midx = -1;
|
|
}
|
|
}
|
|
/* TODO: figure out how to extract nonstandard mso- style */
|
|
CS = +elt.getAttribute("colspan") || 1;
|
|
if ((RS = +elt.getAttribute("rowspan") || 1) > 1 || CS > 1) merges.push({
|
|
s: {
|
|
r: R + or_R,
|
|
c: C + or_C
|
|
},
|
|
e: {
|
|
r: R + or_R + (RS || 1) - 1,
|
|
c: C + or_C + (CS || 1) - 1
|
|
}
|
|
});
|
|
var o = {
|
|
t: 's',
|
|
v: v
|
|
};
|
|
var _t = elt.getAttribute("data-t") || elt.getAttribute("t") || "";
|
|
if (v != null) {
|
|
if (v.length == 0) o.t = _t || 'z';else if (opts.raw || v.trim().length == 0 || _t == "s") {} else if (v === 'TRUE') o = {
|
|
t: 'b',
|
|
v: true
|
|
};else if (v === 'FALSE') o = {
|
|
t: 'b',
|
|
v: false
|
|
};else if (!isNaN(fuzzynum(v))) o = {
|
|
t: 'n',
|
|
v: fuzzynum(v)
|
|
};else if (!isNaN(fuzzydate(v).getDate())) {
|
|
o = {
|
|
t: 'd',
|
|
v: parseDate(v)
|
|
};
|
|
if (!opts.cellDates) o = {
|
|
t: 'n',
|
|
v: datenum(o.v)
|
|
};
|
|
o.z = opts.dateNF || SSF._table[14];
|
|
}
|
|
}
|
|
if (o.z === undefined && z != null) o.z = z;
|
|
/* The first link is used. Links are assumed to be fully specified.
|
|
* TODO: The right way to process relative links is to make a new <a> */
|
|
var l = "",
|
|
Aelts = elt.getElementsByTagName("A");
|
|
if (Aelts && Aelts.length) for (var Aelti = 0; Aelti < Aelts.length; ++Aelti) {
|
|
if (Aelts[Aelti].hasAttribute("href")) {
|
|
l = Aelts[Aelti].getAttribute("href");
|
|
if (l.charAt(0) != "#") break;
|
|
}
|
|
}
|
|
if (l && l.charAt(0) != "#") o.l = {
|
|
Target: l
|
|
};
|
|
if (opts.dense) {
|
|
if (!ws[R + or_R]) ws[R + or_R] = [];
|
|
ws[R + or_R][C + or_C] = o;
|
|
} else ws[encode_cell({
|
|
c: C + or_C,
|
|
r: R + or_R
|
|
})] = o;
|
|
if (range.e.c < C + or_C) range.e.c = C + or_C;
|
|
C += CS;
|
|
}
|
|
++R;
|
|
}
|
|
if (merges.length) ws['!merges'] = (ws["!merges"] || []).concat(merges);
|
|
range.e.r = Math.max(range.e.r, R - 1 + or_R);
|
|
ws['!ref'] = encode_range(range);
|
|
if (R >= sheetRows) ws['!fullref'] = encode_range((range.e.r = rows.length - _R + R - 1 + or_R, range)); // We can count the real number of rows to parse but we don't to improve the performance
|
|
return ws;
|
|
}
|
|
function parse_dom_table(table, _opts) {
|
|
var opts = _opts || {};
|
|
var ws = opts.dense ? [] : {};
|
|
return sheet_add_dom(ws, table, _opts);
|
|
}
|
|
function table_to_book(table, opts) {
|
|
return sheet_to_workbook(parse_dom_table(table, opts), opts);
|
|
}
|
|
function is_dom_element_hidden(element) {
|
|
var display = '';
|
|
var get_computed_style = get_get_computed_style_function(element);
|
|
if (get_computed_style) display = get_computed_style(element).getPropertyValue('display');
|
|
if (!display) display = element.style.display; // Fallback for cases when getComputedStyle is not available (e.g. an old browser or some Node.js environments) or doesn't work (e.g. if the element is not inserted to a document)
|
|
return display === 'none';
|
|
}
|
|
|
|
/* global getComputedStyle */
|
|
function get_get_computed_style_function(element) {
|
|
// The proper getComputedStyle implementation is the one defined in the element window
|
|
if (element.ownerDocument.defaultView && typeof element.ownerDocument.defaultView.getComputedStyle === 'function') return element.ownerDocument.defaultView.getComputedStyle;
|
|
// If it is not available, try to get one from the global namespace
|
|
if (typeof getComputedStyle === 'function') return getComputedStyle;
|
|
return null;
|
|
}
|
|
/* OpenDocument */
|
|
var parse_content_xml = function () {
|
|
var parse_text_p = function parse_text_p(text) {
|
|
/* 6.1.2 White Space Characters */
|
|
var fixed = text.replace(/[\t\r\n]/g, " ").trim().replace(/ +/g, " ").replace(/<text:s\/>/g, " ").replace(/<text:s text:c="(\d+)"\/>/g, function ($$, $1) {
|
|
return Array(parseInt($1, 10) + 1).join(" ");
|
|
}).replace(/<text:tab[^>]*\/>/g, "\t").replace(/<text:line-break\/>/g, "\n");
|
|
var v = unescapexml(fixed.replace(/<[^>]*>/g, ""));
|
|
return [v];
|
|
};
|
|
var number_formats = {
|
|
/* ods name: [short ssf fmt, long ssf fmt] */
|
|
day: ["d", "dd"],
|
|
month: ["m", "mm"],
|
|
year: ["y", "yy"],
|
|
hours: ["h", "hh"],
|
|
minutes: ["m", "mm"],
|
|
seconds: ["s", "ss"],
|
|
"am-pm": ["A/P", "AM/PM"],
|
|
"day-of-week": ["ddd", "dddd"],
|
|
era: ["e", "ee"],
|
|
/* there is no native representation of LO "Q" format */
|
|
quarter: ["\\Qm", "m\\\"th quarter\""]
|
|
};
|
|
return function pcx(d, _opts) {
|
|
var opts = _opts || {};
|
|
if (DENSE != null && opts.dense == null) opts.dense = DENSE;
|
|
var str = xlml_normalize(d);
|
|
var state = [],
|
|
tmp;
|
|
var tag;
|
|
var NFtag = {
|
|
name: ""
|
|
},
|
|
NF = "",
|
|
pidx = 0;
|
|
var sheetag;
|
|
var rowtag;
|
|
var Sheets = {},
|
|
SheetNames = [];
|
|
var ws = opts.dense ? [] : {};
|
|
var Rn, q;
|
|
var ctag = {
|
|
value: ""
|
|
};
|
|
var textp = "",
|
|
textpidx = 0,
|
|
textptag;
|
|
var textR = [];
|
|
var R = -1,
|
|
C = -1,
|
|
range = {
|
|
s: {
|
|
r: 1000000,
|
|
c: 10000000
|
|
},
|
|
e: {
|
|
r: 0,
|
|
c: 0
|
|
}
|
|
};
|
|
var row_ol = 0;
|
|
var number_format_map = {};
|
|
var merges = [],
|
|
mrange = {},
|
|
mR = 0,
|
|
mC = 0;
|
|
var rowinfo = [],
|
|
rowpeat = 1,
|
|
colpeat = 1;
|
|
var arrayf = [];
|
|
var WB = {
|
|
Names: []
|
|
};
|
|
var atag = {};
|
|
var _Ref = ["", ""];
|
|
var comments = [],
|
|
comment = {};
|
|
var creator = "",
|
|
creatoridx = 0;
|
|
var isstub = false,
|
|
intable = false;
|
|
var i = 0;
|
|
xlmlregex.lastIndex = 0;
|
|
str = str.replace(/<!--([\s\S]*?)-->/mg, "").replace(/<!DOCTYPE[^\[]*\[[^\]]*\]>/gm, "");
|
|
while (Rn = xlmlregex.exec(str)) {
|
|
switch (Rn[3] = Rn[3].replace(/_.*$/, "")) {
|
|
case 'table':
|
|
case '工作表':
|
|
// 9.1.2 <table:table>
|
|
if (Rn[1] === '/') {
|
|
if (range.e.c >= range.s.c && range.e.r >= range.s.r) ws['!ref'] = encode_range(range);else ws['!ref'] = "A1:A1";
|
|
if (opts.sheetRows > 0 && opts.sheetRows <= range.e.r) {
|
|
ws['!fullref'] = ws['!ref'];
|
|
range.e.r = opts.sheetRows - 1;
|
|
ws['!ref'] = encode_range(range);
|
|
}
|
|
if (merges.length) ws['!merges'] = merges;
|
|
if (rowinfo.length) ws["!rows"] = rowinfo;
|
|
sheetag.name = sheetag['名称'] || sheetag.name;
|
|
if (typeof JSON !== 'undefined') JSON.stringify(sheetag);
|
|
SheetNames.push(sheetag.name);
|
|
Sheets[sheetag.name] = ws;
|
|
intable = false;
|
|
} else if (Rn[0].charAt(Rn[0].length - 2) !== '/') {
|
|
sheetag = parsexmltag(Rn[0], false);
|
|
R = C = -1;
|
|
range.s.r = range.s.c = 10000000;
|
|
range.e.r = range.e.c = 0;
|
|
ws = opts.dense ? [] : {};
|
|
merges = [];
|
|
rowinfo = [];
|
|
intable = true;
|
|
}
|
|
break;
|
|
case 'table-row-group':
|
|
// 9.1.9 <table:table-row-group>
|
|
if (Rn[1] === "/") --row_ol;else ++row_ol;
|
|
break;
|
|
case 'table-row':
|
|
case '行':
|
|
// 9.1.3 <table:table-row>
|
|
if (Rn[1] === '/') {
|
|
R += rowpeat;
|
|
rowpeat = 1;
|
|
break;
|
|
}
|
|
rowtag = parsexmltag(Rn[0], false);
|
|
if (rowtag['行号']) R = rowtag['行号'] - 1;else if (R == -1) R = 0;
|
|
rowpeat = +rowtag['number-rows-repeated'] || 1;
|
|
/* TODO: remove magic */
|
|
if (rowpeat < 10) for (i = 0; i < rowpeat; ++i) {
|
|
if (row_ol > 0) rowinfo[R + i] = {
|
|
level: row_ol
|
|
};
|
|
}
|
|
C = -1;
|
|
break;
|
|
case 'covered-table-cell':
|
|
// 9.1.5 <table:covered-table-cell>
|
|
if (Rn[1] !== '/') ++C;
|
|
if (opts.sheetStubs) {
|
|
if (opts.dense) {
|
|
if (!ws[R]) ws[R] = [];
|
|
ws[R][C] = {
|
|
t: 'z'
|
|
};
|
|
} else ws[encode_cell({
|
|
r: R,
|
|
c: C
|
|
})] = {
|
|
t: 'z'
|
|
};
|
|
}
|
|
textp = "";
|
|
textR = [];
|
|
break;
|
|
/* stub */
|
|
case 'table-cell':
|
|
case '数据':
|
|
if (Rn[0].charAt(Rn[0].length - 2) === '/') {
|
|
++C;
|
|
ctag = parsexmltag(Rn[0], false);
|
|
colpeat = parseInt(ctag['number-columns-repeated'] || "1", 10);
|
|
q = {
|
|
t: 'z',
|
|
v: null
|
|
};
|
|
if (ctag.formula && opts.cellFormula != false) q.f = ods_to_csf_formula(unescapexml(ctag.formula));
|
|
if ((ctag['数据类型'] || ctag['value-type']) == "string") {
|
|
q.t = "s";
|
|
q.v = unescapexml(ctag['string-value'] || "");
|
|
if (opts.dense) {
|
|
if (!ws[R]) ws[R] = [];
|
|
ws[R][C] = q;
|
|
} else {
|
|
ws[encode_cell({
|
|
r: R,
|
|
c: C
|
|
})] = q;
|
|
}
|
|
}
|
|
C += colpeat - 1;
|
|
} else if (Rn[1] !== '/') {
|
|
++C;
|
|
textp = "";
|
|
textpidx = 0;
|
|
textR = [];
|
|
colpeat = 1;
|
|
var rptR = rowpeat ? R + rowpeat - 1 : R;
|
|
if (C > range.e.c) range.e.c = C;
|
|
if (C < range.s.c) range.s.c = C;
|
|
if (R < range.s.r) range.s.r = R;
|
|
if (rptR > range.e.r) range.e.r = rptR;
|
|
ctag = parsexmltag(Rn[0], false);
|
|
comments = [];
|
|
comment = {};
|
|
q = {
|
|
t: ctag['数据类型'] || ctag['value-type'],
|
|
v: null
|
|
};
|
|
if (opts.cellFormula) {
|
|
if (ctag.formula) ctag.formula = unescapexml(ctag.formula);
|
|
if (ctag['number-matrix-columns-spanned'] && ctag['number-matrix-rows-spanned']) {
|
|
mR = parseInt(ctag['number-matrix-rows-spanned'], 10) || 0;
|
|
mC = parseInt(ctag['number-matrix-columns-spanned'], 10) || 0;
|
|
mrange = {
|
|
s: {
|
|
r: R,
|
|
c: C
|
|
},
|
|
e: {
|
|
r: R + mR - 1,
|
|
c: C + mC - 1
|
|
}
|
|
};
|
|
q.F = encode_range(mrange);
|
|
arrayf.push([mrange, q.F]);
|
|
}
|
|
if (ctag.formula) q.f = ods_to_csf_formula(ctag.formula);else for (i = 0; i < arrayf.length; ++i) {
|
|
if (R >= arrayf[i][0].s.r && R <= arrayf[i][0].e.r) if (C >= arrayf[i][0].s.c && C <= arrayf[i][0].e.c) q.F = arrayf[i][1];
|
|
}
|
|
}
|
|
if (ctag['number-columns-spanned'] || ctag['number-rows-spanned']) {
|
|
mR = parseInt(ctag['number-rows-spanned'], 10) || 0;
|
|
mC = parseInt(ctag['number-columns-spanned'], 10) || 0;
|
|
mrange = {
|
|
s: {
|
|
r: R,
|
|
c: C
|
|
},
|
|
e: {
|
|
r: R + mR - 1,
|
|
c: C + mC - 1
|
|
}
|
|
};
|
|
merges.push(mrange);
|
|
}
|
|
|
|
/* 19.675.2 table:number-columns-repeated */
|
|
if (ctag['number-columns-repeated']) colpeat = parseInt(ctag['number-columns-repeated'], 10);
|
|
|
|
/* 19.385 office:value-type */
|
|
switch (q.t) {
|
|
case 'boolean':
|
|
q.t = 'b';
|
|
q.v = parsexmlbool(ctag['boolean-value']);
|
|
break;
|
|
case 'float':
|
|
q.t = 'n';
|
|
q.v = parseFloat(ctag.value);
|
|
break;
|
|
case 'percentage':
|
|
q.t = 'n';
|
|
q.v = parseFloat(ctag.value);
|
|
break;
|
|
case 'currency':
|
|
q.t = 'n';
|
|
q.v = parseFloat(ctag.value);
|
|
break;
|
|
case 'date':
|
|
q.t = 'd';
|
|
q.v = parseDate(ctag['date-value']);
|
|
if (!opts.cellDates) {
|
|
q.t = 'n';
|
|
q.v = datenum(q.v);
|
|
}
|
|
q.z = 'm/d/yy';
|
|
break;
|
|
case 'time':
|
|
q.t = 'n';
|
|
q.v = parse_isodur(ctag['time-value']) / 86400;
|
|
if (opts.cellDates) {
|
|
q.t = 'd';
|
|
q.v = numdate(q.v);
|
|
}
|
|
q.z = 'HH:MM:SS';
|
|
break;
|
|
case 'number':
|
|
q.t = 'n';
|
|
q.v = parseFloat(ctag['数据数值']);
|
|
break;
|
|
default:
|
|
if (q.t === 'string' || q.t === 'text' || !q.t) {
|
|
q.t = 's';
|
|
if (ctag['string-value'] != null) {
|
|
textp = unescapexml(ctag['string-value']);
|
|
textR = [];
|
|
}
|
|
} else throw new Error('Unsupported value type ' + q.t);
|
|
}
|
|
} else {
|
|
isstub = false;
|
|
if (q.t === 's') {
|
|
q.v = textp || '';
|
|
if (textR.length) q.R = textR;
|
|
isstub = textpidx == 0;
|
|
}
|
|
if (atag.Target) q.l = atag;
|
|
if (comments.length > 0) {
|
|
q.c = comments;
|
|
comments = [];
|
|
}
|
|
if (textp && opts.cellText !== false) q.w = textp;
|
|
if (isstub) {
|
|
q.t = "z";
|
|
delete q.v;
|
|
}
|
|
if (!isstub || opts.sheetStubs) {
|
|
if (!(opts.sheetRows && opts.sheetRows <= R)) {
|
|
for (var rpt = 0; rpt < rowpeat; ++rpt) {
|
|
colpeat = parseInt(ctag['number-columns-repeated'] || "1", 10);
|
|
if (opts.dense) {
|
|
if (!ws[R + rpt]) ws[R + rpt] = [];
|
|
ws[R + rpt][C] = rpt == 0 ? q : dup(q);
|
|
while (--colpeat > 0) {
|
|
ws[R + rpt][C + colpeat] = dup(q);
|
|
}
|
|
} else {
|
|
ws[encode_cell({
|
|
r: R + rpt,
|
|
c: C
|
|
})] = q;
|
|
while (--colpeat > 0) {
|
|
ws[encode_cell({
|
|
r: R + rpt,
|
|
c: C + colpeat
|
|
})] = dup(q);
|
|
}
|
|
}
|
|
if (range.e.c <= C) range.e.c = C;
|
|
}
|
|
}
|
|
}
|
|
colpeat = parseInt(ctag['number-columns-repeated'] || "1", 10);
|
|
C += colpeat - 1;
|
|
colpeat = 0;
|
|
q = {};
|
|
textp = "";
|
|
textR = [];
|
|
}
|
|
atag = {};
|
|
break;
|
|
// 9.1.4 <table:table-cell>
|
|
|
|
/* pure state */
|
|
case 'document': // TODO: <office:document> is the root for FODS
|
|
case 'document-content':
|
|
case '电子表格文档': // 3.1.3.2 <office:document-content>
|
|
case 'spreadsheet':
|
|
case '主体': // 3.7 <office:spreadsheet>
|
|
case 'scripts': // 3.12 <office:scripts>
|
|
case 'styles': // TODO <office:styles>
|
|
case 'font-face-decls': // 3.14 <office:font-face-decls>
|
|
case 'master-styles':
|
|
// 3.15.4 <office:master-styles> -- relevant for FODS
|
|
if (Rn[1] === '/') {
|
|
if ((tmp = state.pop())[0] !== Rn[3]) throw "Bad state: " + tmp;
|
|
} else if (Rn[0].charAt(Rn[0].length - 2) !== '/') state.push([Rn[3], true]);
|
|
break;
|
|
case 'annotation':
|
|
// 14.1 <office:annotation>
|
|
if (Rn[1] === '/') {
|
|
if ((tmp = state.pop())[0] !== Rn[3]) throw "Bad state: " + tmp;
|
|
comment.t = textp;
|
|
if (textR.length) comment.R = textR;
|
|
comment.a = creator;
|
|
comments.push(comment);
|
|
} else if (Rn[0].charAt(Rn[0].length - 2) !== '/') {
|
|
state.push([Rn[3], false]);
|
|
}
|
|
creator = "";
|
|
creatoridx = 0;
|
|
textp = "";
|
|
textpidx = 0;
|
|
textR = [];
|
|
break;
|
|
case 'creator':
|
|
// 4.3.2.7 <dc:creator>
|
|
if (Rn[1] === '/') {
|
|
creator = str.slice(creatoridx, Rn.index);
|
|
} else creatoridx = Rn.index + Rn[0].length;
|
|
break;
|
|
|
|
/* ignore state */
|
|
case 'meta':
|
|
case '元数据': // TODO: <office:meta> <uof:元数据> FODS/UOF
|
|
case 'settings': // TODO: <office:settings>
|
|
case 'config-item-set': // TODO: <office:config-item-set>
|
|
case 'config-item-map-indexed': // TODO: <office:config-item-map-indexed>
|
|
case 'config-item-map-entry': // TODO: <office:config-item-map-entry>
|
|
case 'config-item-map-named': // TODO: <office:config-item-map-entry>
|
|
case 'shapes': // 9.2.8 <table:shapes>
|
|
case 'frame': // 10.4.2 <draw:frame>
|
|
case 'text-box': // 10.4.3 <draw:text-box>
|
|
case 'image': // 10.4.4 <draw:image>
|
|
case 'data-pilot-tables': // 9.6.2 <table:data-pilot-tables>
|
|
case 'list-style': // 16.30 <text:list-style>
|
|
case 'form': // 13.13 <form:form>
|
|
case 'dde-links': // 9.8 <table:dde-links>
|
|
case 'event-listeners': // TODO
|
|
case 'chart':
|
|
// TODO
|
|
if (Rn[1] === '/') {
|
|
if ((tmp = state.pop())[0] !== Rn[3]) throw "Bad state: " + tmp;
|
|
} else if (Rn[0].charAt(Rn[0].length - 2) !== '/') state.push([Rn[3], false]);
|
|
textp = "";
|
|
textpidx = 0;
|
|
textR = [];
|
|
break;
|
|
case 'scientific-number':
|
|
// TODO: <number:scientific-number>
|
|
break;
|
|
case 'currency-symbol':
|
|
// TODO: <number:currency-symbol>
|
|
break;
|
|
case 'currency-style':
|
|
// TODO: <number:currency-style>
|
|
break;
|
|
case 'number-style': // 16.27.2 <number:number-style>
|
|
case 'percentage-style': // 16.27.9 <number:percentage-style>
|
|
case 'date-style': // 16.27.10 <number:date-style>
|
|
case 'time-style':
|
|
// 16.27.18 <number:time-style>
|
|
if (Rn[1] === '/') {
|
|
number_format_map[NFtag.name] = NF;
|
|
if ((tmp = state.pop())[0] !== Rn[3]) throw "Bad state: " + tmp;
|
|
} else if (Rn[0].charAt(Rn[0].length - 2) !== '/') {
|
|
NF = "";
|
|
NFtag = parsexmltag(Rn[0], false);
|
|
state.push([Rn[3], true]);
|
|
}
|
|
break;
|
|
case 'script':
|
|
break;
|
|
// 3.13 <office:script>
|
|
case 'libraries':
|
|
break;
|
|
// TODO: <ooo:libraries>
|
|
case 'automatic-styles':
|
|
break;
|
|
// 3.15.3 <office:automatic-styles>
|
|
|
|
case 'default-style': // TODO: <style:default-style>
|
|
case 'page-layout':
|
|
break;
|
|
// TODO: <style:page-layout>
|
|
case 'style':
|
|
// 16.2 <style:style>
|
|
break;
|
|
case 'map':
|
|
break;
|
|
// 16.3 <style:map>
|
|
case 'font-face':
|
|
break;
|
|
// 16.21 <style:font-face>
|
|
|
|
case 'paragraph-properties':
|
|
break;
|
|
// 17.6 <style:paragraph-properties>
|
|
case 'table-properties':
|
|
break;
|
|
// 17.15 <style:table-properties>
|
|
case 'table-column-properties':
|
|
break;
|
|
// 17.16 <style:table-column-properties>
|
|
case 'table-row-properties':
|
|
break;
|
|
// 17.17 <style:table-row-properties>
|
|
case 'table-cell-properties':
|
|
break;
|
|
// 17.18 <style:table-cell-properties>
|
|
|
|
case 'number':
|
|
// 16.27.3 <number:number>
|
|
switch (state[state.length - 1][0]) {
|
|
case 'time-style':
|
|
case 'date-style':
|
|
tag = parsexmltag(Rn[0], false);
|
|
NF += number_formats[Rn[3]][tag.style === 'long' ? 1 : 0];
|
|
break;
|
|
}
|
|
break;
|
|
case 'fraction':
|
|
break;
|
|
// TODO 16.27.6 <number:fraction>
|
|
|
|
case 'day': // 16.27.11 <number:day>
|
|
case 'month': // 16.27.12 <number:month>
|
|
case 'year': // 16.27.13 <number:year>
|
|
case 'era': // 16.27.14 <number:era>
|
|
case 'day-of-week': // 16.27.15 <number:day-of-week>
|
|
case 'week-of-year': // 16.27.16 <number:week-of-year>
|
|
case 'quarter': // 16.27.17 <number:quarter>
|
|
case 'hours': // 16.27.19 <number:hours>
|
|
case 'minutes': // 16.27.20 <number:minutes>
|
|
case 'seconds': // 16.27.21 <number:seconds>
|
|
case 'am-pm':
|
|
// 16.27.22 <number:am-pm>
|
|
switch (state[state.length - 1][0]) {
|
|
case 'time-style':
|
|
case 'date-style':
|
|
tag = parsexmltag(Rn[0], false);
|
|
NF += number_formats[Rn[3]][tag.style === 'long' ? 1 : 0];
|
|
break;
|
|
}
|
|
break;
|
|
case 'boolean-style':
|
|
break;
|
|
// 16.27.23 <number:boolean-style>
|
|
case 'boolean':
|
|
break;
|
|
// 16.27.24 <number:boolean>
|
|
case 'text-style':
|
|
break;
|
|
// 16.27.25 <number:text-style>
|
|
case 'text':
|
|
// 16.27.26 <number:text>
|
|
if (Rn[0].slice(-2) === "/>") break;else if (Rn[1] === "/") switch (state[state.length - 1][0]) {
|
|
case 'number-style':
|
|
case 'date-style':
|
|
case 'time-style':
|
|
NF += str.slice(pidx, Rn.index);
|
|
break;
|
|
} else pidx = Rn.index + Rn[0].length;
|
|
break;
|
|
case 'named-range':
|
|
// 9.4.12 <table:named-range>
|
|
tag = parsexmltag(Rn[0], false);
|
|
_Ref = ods_to_csf_3D(tag['cell-range-address']);
|
|
var nrange = {
|
|
Name: tag.name,
|
|
Ref: _Ref[0] + '!' + _Ref[1]
|
|
};
|
|
if (intable) nrange.Sheet = SheetNames.length;
|
|
WB.Names.push(nrange);
|
|
break;
|
|
case 'text-content':
|
|
break;
|
|
// 16.27.27 <number:text-content>
|
|
case 'text-properties':
|
|
break;
|
|
// 16.27.27 <style:text-properties>
|
|
case 'embedded-text':
|
|
break;
|
|
// 16.27.4 <number:embedded-text>
|
|
|
|
case 'body':
|
|
case '电子表格':
|
|
break;
|
|
// 3.3 16.9.6 19.726.3
|
|
|
|
case 'forms':
|
|
break;
|
|
// 12.25.2 13.2
|
|
case 'table-column':
|
|
break;
|
|
// 9.1.6 <table:table-column>
|
|
case 'table-header-rows':
|
|
break;
|
|
// 9.1.7 <table:table-header-rows>
|
|
case 'table-rows':
|
|
break;
|
|
// 9.1.12 <table:table-rows>
|
|
/* TODO: outline levels */
|
|
case 'table-column-group':
|
|
break;
|
|
// 9.1.10 <table:table-column-group>
|
|
case 'table-header-columns':
|
|
break;
|
|
// 9.1.11 <table:table-header-columns>
|
|
case 'table-columns':
|
|
break;
|
|
// 9.1.12 <table:table-columns>
|
|
|
|
case 'null-date':
|
|
break;
|
|
// 9.4.2 <table:null-date> TODO: date1904
|
|
|
|
case 'graphic-properties':
|
|
break;
|
|
// 17.21 <style:graphic-properties>
|
|
case 'calculation-settings':
|
|
break;
|
|
// 9.4.1 <table:calculation-settings>
|
|
case 'named-expressions':
|
|
break;
|
|
// 9.4.11 <table:named-expressions>
|
|
case 'label-range':
|
|
break;
|
|
// 9.4.9 <table:label-range>
|
|
case 'label-ranges':
|
|
break;
|
|
// 9.4.10 <table:label-ranges>
|
|
case 'named-expression':
|
|
break;
|
|
// 9.4.13 <table:named-expression>
|
|
case 'sort':
|
|
break;
|
|
// 9.4.19 <table:sort>
|
|
case 'sort-by':
|
|
break;
|
|
// 9.4.20 <table:sort-by>
|
|
case 'sort-groups':
|
|
break;
|
|
// 9.4.22 <table:sort-groups>
|
|
|
|
case 'tab':
|
|
break;
|
|
// 6.1.4 <text:tab>
|
|
case 'line-break':
|
|
break;
|
|
// 6.1.5 <text:line-break>
|
|
case 'span':
|
|
break;
|
|
// 6.1.7 <text:span>
|
|
case 'p':
|
|
case '文本串':
|
|
// 5.1.3 <text:p>
|
|
if (['master-styles'].indexOf(state[state.length - 1][0]) > -1) break;
|
|
if (Rn[1] === '/' && (!ctag || !ctag['string-value'])) {
|
|
var ptp = parse_text_p(str.slice(textpidx, Rn.index), textptag);
|
|
textp = (textp.length > 0 ? textp + "\n" : "") + ptp[0];
|
|
} else {
|
|
textptag = parsexmltag(Rn[0], false);
|
|
textpidx = Rn.index + Rn[0].length;
|
|
}
|
|
break;
|
|
// <text:p>
|
|
case 's':
|
|
break;
|
|
// <text:s>
|
|
|
|
case 'database-range':
|
|
// 9.4.15 <table:database-range>
|
|
if (Rn[1] === '/') break;
|
|
try {
|
|
_Ref = ods_to_csf_3D(parsexmltag(Rn[0])['target-range-address']);
|
|
Sheets[_Ref[0]]['!autofilter'] = {
|
|
ref: _Ref[1]
|
|
};
|
|
} catch (e) {/* empty */}
|
|
break;
|
|
case 'date':
|
|
break;
|
|
// <*:date>
|
|
|
|
case 'object':
|
|
break;
|
|
// 10.4.6.2 <draw:object>
|
|
case 'title':
|
|
case '标题':
|
|
break;
|
|
// <*:title> OR <uof:标题>
|
|
case 'desc':
|
|
break;
|
|
// <*:desc>
|
|
case 'binary-data':
|
|
break;
|
|
// 10.4.5 TODO: b64 blob
|
|
|
|
/* 9.2 Advanced Tables */
|
|
case 'table-source':
|
|
break;
|
|
// 9.2.6
|
|
case 'scenario':
|
|
break;
|
|
// 9.2.6
|
|
|
|
case 'iteration':
|
|
break;
|
|
// 9.4.3 <table:iteration>
|
|
case 'content-validations':
|
|
break;
|
|
// 9.4.4 <table:
|
|
case 'content-validation':
|
|
break;
|
|
// 9.4.5 <table:
|
|
case 'help-message':
|
|
break;
|
|
// 9.4.6 <table:
|
|
case 'error-message':
|
|
break;
|
|
// 9.4.7 <table:
|
|
case 'database-ranges':
|
|
break;
|
|
// 9.4.14 <table:database-ranges>
|
|
case 'filter':
|
|
break;
|
|
// 9.5.2 <table:filter>
|
|
case 'filter-and':
|
|
break;
|
|
// 9.5.3 <table:filter-and>
|
|
case 'filter-or':
|
|
break;
|
|
// 9.5.4 <table:filter-or>
|
|
case 'filter-condition':
|
|
break;
|
|
// 9.5.5 <table:filter-condition>
|
|
|
|
case 'list-level-style-bullet':
|
|
break;
|
|
// 16.31 <text:
|
|
case 'list-level-style-number':
|
|
break;
|
|
// 16.32 <text:
|
|
case 'list-level-properties':
|
|
break;
|
|
// 17.19 <style:
|
|
|
|
/* 7.3 Document Fields */
|
|
case 'sender-firstname': // 7.3.6.2
|
|
case 'sender-lastname': // 7.3.6.3
|
|
case 'sender-initials': // 7.3.6.4
|
|
case 'sender-title': // 7.3.6.5
|
|
case 'sender-position': // 7.3.6.6
|
|
case 'sender-email': // 7.3.6.7
|
|
case 'sender-phone-private': // 7.3.6.8
|
|
case 'sender-fax': // 7.3.6.9
|
|
case 'sender-company': // 7.3.6.10
|
|
case 'sender-phone-work': // 7.3.6.11
|
|
case 'sender-street': // 7.3.6.12
|
|
case 'sender-city': // 7.3.6.13
|
|
case 'sender-postal-code': // 7.3.6.14
|
|
case 'sender-country': // 7.3.6.15
|
|
case 'sender-state-or-province': // 7.3.6.16
|
|
case 'author-name': // 7.3.7.1
|
|
case 'author-initials': // 7.3.7.2
|
|
case 'chapter': // 7.3.8
|
|
case 'file-name': // 7.3.9
|
|
case 'template-name': // 7.3.9
|
|
case 'sheet-name':
|
|
// 7.3.9
|
|
break;
|
|
case 'event-listener':
|
|
break;
|
|
/* TODO: FODS Properties */
|
|
case 'initial-creator':
|
|
case 'creation-date':
|
|
case 'print-date':
|
|
case 'generator':
|
|
case 'document-statistic':
|
|
case 'user-defined':
|
|
case 'editing-duration':
|
|
case 'editing-cycles':
|
|
break;
|
|
|
|
/* TODO: FODS Config */
|
|
case 'config-item':
|
|
break;
|
|
|
|
/* TODO: style tokens */
|
|
case 'page-number':
|
|
break;
|
|
// TODO <text:page-number>
|
|
case 'page-count':
|
|
break;
|
|
// TODO <text:page-count>
|
|
case 'time':
|
|
break;
|
|
// TODO <text:time>
|
|
|
|
/* 9.3 Advanced Table Cells */
|
|
case 'cell-range-source':
|
|
break;
|
|
// 9.3.1 <table:
|
|
case 'detective':
|
|
break;
|
|
// 9.3.2 <table:
|
|
case 'operation':
|
|
break;
|
|
// 9.3.3 <table:
|
|
case 'highlighted-range':
|
|
break;
|
|
// 9.3.4 <table:
|
|
|
|
/* 9.6 Data Pilot Tables <table: */
|
|
case 'data-pilot-table': // 9.6.3
|
|
case 'source-cell-range': // 9.6.5
|
|
case 'source-service': // 9.6.6
|
|
case 'data-pilot-field': // 9.6.7
|
|
case 'data-pilot-level': // 9.6.8
|
|
case 'data-pilot-subtotals': // 9.6.9
|
|
case 'data-pilot-subtotal': // 9.6.10
|
|
case 'data-pilot-members': // 9.6.11
|
|
case 'data-pilot-member': // 9.6.12
|
|
case 'data-pilot-display-info': // 9.6.13
|
|
case 'data-pilot-sort-info': // 9.6.14
|
|
case 'data-pilot-layout-info': // 9.6.15
|
|
case 'data-pilot-field-reference': // 9.6.16
|
|
case 'data-pilot-groups': // 9.6.17
|
|
case 'data-pilot-group': // 9.6.18
|
|
case 'data-pilot-group-member':
|
|
// 9.6.19
|
|
break;
|
|
|
|
/* 10.3 Drawing Shapes */
|
|
case 'rect':
|
|
// 10.3.2
|
|
break;
|
|
|
|
/* 14.6 DDE Connections */
|
|
case 'dde-connection-decls': // 14.6.2 <text:
|
|
case 'dde-connection-decl': // 14.6.3 <text:
|
|
case 'dde-link': // 14.6.4 <table:
|
|
case 'dde-source':
|
|
// 14.6.5 <office:
|
|
break;
|
|
case 'properties':
|
|
break;
|
|
// 13.7 <form:properties>
|
|
case 'property':
|
|
break;
|
|
// 13.8 <form:property>
|
|
|
|
case 'a':
|
|
// 6.1.8 hyperlink
|
|
if (Rn[1] !== '/') {
|
|
atag = parsexmltag(Rn[0], false);
|
|
if (!atag.href) break;
|
|
atag.Target = unescapexml(atag.href);
|
|
delete atag.href;
|
|
if (atag.Target.charAt(0) == "#" && atag.Target.indexOf(".") > -1) {
|
|
_Ref = ods_to_csf_3D(atag.Target.slice(1));
|
|
atag.Target = "#" + _Ref[0] + "!" + _Ref[1];
|
|
} else if (atag.Target.match(/^\.\.[\\\/]/)) atag.Target = atag.Target.slice(3);
|
|
}
|
|
break;
|
|
|
|
/* non-standard */
|
|
case 'table-protection':
|
|
break;
|
|
case 'data-pilot-grand-total':
|
|
break;
|
|
// <table:
|
|
case 'office-document-common-attrs':
|
|
break;
|
|
// bare
|
|
default:
|
|
switch (Rn[2]) {
|
|
case 'dc:': // TODO: properties
|
|
case 'calcext:': // ignore undocumented extensions
|
|
case 'loext:': // ignore undocumented extensions
|
|
case 'ooo:': // ignore undocumented extensions
|
|
case 'chartooo:': // ignore undocumented extensions
|
|
case 'draw:': // TODO: drawing
|
|
case 'style:': // TODO: styles
|
|
case 'chart:': // TODO: charts
|
|
case 'form:': // TODO: forms
|
|
case 'uof:': // TODO: uof
|
|
case '表:': // TODO: uof
|
|
case '字:':
|
|
// TODO: uof
|
|
break;
|
|
default:
|
|
if (opts.WTF) throw new Error(Rn);
|
|
}
|
|
}
|
|
}
|
|
var out = {
|
|
Sheets: Sheets,
|
|
SheetNames: SheetNames,
|
|
Workbook: WB
|
|
};
|
|
if (opts.bookSheets) delete out.Sheets;
|
|
return out;
|
|
};
|
|
}();
|
|
function parse_ods(zip, opts) {
|
|
opts = opts || {};
|
|
if (safegetzipfile(zip, 'META-INF/manifest.xml')) parse_manifest(getzipdata(zip, 'META-INF/manifest.xml'), opts);
|
|
var content = getzipstr(zip, 'content.xml');
|
|
if (!content) throw new Error("Missing content.xml in ODS / UOF file");
|
|
var wb = parse_content_xml(utf8read(content), opts);
|
|
if (safegetzipfile(zip, 'meta.xml')) wb.Props = parse_core_props(getzipdata(zip, 'meta.xml'));
|
|
return wb;
|
|
}
|
|
function parse_fods(data, opts) {
|
|
return parse_content_xml(data, opts);
|
|
}
|
|
|
|
/* OpenDocument */
|
|
var write_styles_ods = function () {
|
|
var master_styles = ['<office:master-styles>', '<style:master-page style:name="mp1" style:page-layout-name="mp1">', '<style:header/>', '<style:header-left style:display="false"/>', '<style:footer/>', '<style:footer-left style:display="false"/>', '</style:master-page>', '</office:master-styles>'].join("");
|
|
var payload = '<office:document-styles ' + wxt_helper({
|
|
'xmlns:office': "urn:oasis:names:tc:opendocument:xmlns:office:1.0",
|
|
'xmlns:table': "urn:oasis:names:tc:opendocument:xmlns:table:1.0",
|
|
'xmlns:style': "urn:oasis:names:tc:opendocument:xmlns:style:1.0",
|
|
'xmlns:text': "urn:oasis:names:tc:opendocument:xmlns:text:1.0",
|
|
'xmlns:draw': "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",
|
|
'xmlns:fo': "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0",
|
|
'xmlns:xlink': "http://www.w3.org/1999/xlink",
|
|
'xmlns:dc': "http://purl.org/dc/elements/1.1/",
|
|
'xmlns:number': "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0",
|
|
'xmlns:svg': "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0",
|
|
'xmlns:of': "urn:oasis:names:tc:opendocument:xmlns:of:1.2",
|
|
'office:version': "1.2"
|
|
}) + '>' + master_styles + '</office:document-styles>';
|
|
return function wso() {
|
|
return XML_HEADER + payload;
|
|
};
|
|
}();
|
|
var write_content_ods = function () {
|
|
/* 6.1.2 White Space Characters */
|
|
var write_text_p = function write_text_p(text) {
|
|
return escapexml(text).replace(/ +/g, function ($$) {
|
|
return '<text:s text:c="' + $$.length + '"/>';
|
|
}).replace(/\t/g, "<text:tab/>").replace(/\n/g, "</text:p><text:p>").replace(/^ /, "<text:s/>").replace(/ $/, "<text:s/>");
|
|
};
|
|
var null_cell_xml = ' <table:table-cell />\n';
|
|
var covered_cell_xml = ' <table:covered-table-cell/>\n';
|
|
var write_ws = function write_ws(ws, wb, i) {
|
|
/* Section 9 Tables */
|
|
var o = [];
|
|
o.push(' <table:table table:name="' + escapexml(wb.SheetNames[i]) + '" table:style-name="ta1">\n');
|
|
var R = 0,
|
|
C = 0,
|
|
range = decode_range(ws['!ref'] || "A1");
|
|
var marr = ws['!merges'] || [],
|
|
mi = 0;
|
|
var dense = Array.isArray(ws);
|
|
if (ws["!cols"]) {
|
|
for (C = 0; C <= range.e.c; ++C) {
|
|
o.push(' <table:table-column' + (ws["!cols"][C] ? ' table:style-name="co' + ws["!cols"][C].ods + '"' : '') + '></table:table-column>\n');
|
|
}
|
|
}
|
|
var H = "",
|
|
ROWS = ws["!rows"] || [];
|
|
for (R = 0; R < range.s.r; ++R) {
|
|
H = ROWS[R] ? ' table:style-name="ro' + ROWS[R].ods + '"' : "";
|
|
o.push(' <table:table-row' + H + '></table:table-row>\n');
|
|
}
|
|
for (; R <= range.e.r; ++R) {
|
|
H = ROWS[R] ? ' table:style-name="ro' + ROWS[R].ods + '"' : "";
|
|
o.push(' <table:table-row' + H + '>\n');
|
|
for (C = 0; C < range.s.c; ++C) {
|
|
o.push(null_cell_xml);
|
|
}
|
|
for (; C <= range.e.c; ++C) {
|
|
var skip = false,
|
|
ct = {},
|
|
textp = "";
|
|
for (mi = 0; mi != marr.length; ++mi) {
|
|
if (marr[mi].s.c > C) continue;
|
|
if (marr[mi].s.r > R) continue;
|
|
if (marr[mi].e.c < C) continue;
|
|
if (marr[mi].e.r < R) continue;
|
|
if (marr[mi].s.c != C || marr[mi].s.r != R) skip = true;
|
|
ct['table:number-columns-spanned'] = marr[mi].e.c - marr[mi].s.c + 1;
|
|
ct['table:number-rows-spanned'] = marr[mi].e.r - marr[mi].s.r + 1;
|
|
break;
|
|
}
|
|
if (skip) {
|
|
o.push(covered_cell_xml);
|
|
continue;
|
|
}
|
|
var ref = encode_cell({
|
|
r: R,
|
|
c: C
|
|
}),
|
|
cell = dense ? (ws[R] || [])[C] : ws[ref];
|
|
if (cell && cell.f) {
|
|
ct['table:formula'] = escapexml(csf_to_ods_formula(cell.f));
|
|
if (cell.F) {
|
|
if (cell.F.slice(0, ref.length) == ref) {
|
|
var _Fref = decode_range(cell.F);
|
|
ct['table:number-matrix-columns-spanned'] = _Fref.e.c - _Fref.s.c + 1;
|
|
ct['table:number-matrix-rows-spanned'] = _Fref.e.r - _Fref.s.r + 1;
|
|
}
|
|
}
|
|
}
|
|
if (!cell) {
|
|
o.push(null_cell_xml);
|
|
continue;
|
|
}
|
|
switch (cell.t) {
|
|
case 'b':
|
|
textp = cell.v ? 'TRUE' : 'FALSE';
|
|
ct['office:value-type'] = "boolean";
|
|
ct['office:boolean-value'] = cell.v ? 'true' : 'false';
|
|
break;
|
|
case 'n':
|
|
textp = cell.w || String(cell.v || 0);
|
|
ct['office:value-type'] = "float";
|
|
ct['office:value'] = cell.v || 0;
|
|
break;
|
|
case 's':
|
|
case 'str':
|
|
textp = cell.v == null ? "" : cell.v;
|
|
ct['office:value-type'] = "string";
|
|
break;
|
|
case 'd':
|
|
textp = cell.w || parseDate(cell.v).toISOString();
|
|
ct['office:value-type'] = "date";
|
|
ct['office:date-value'] = parseDate(cell.v).toISOString();
|
|
ct['table:style-name'] = "ce1";
|
|
break;
|
|
//case 'e':
|
|
default:
|
|
o.push(null_cell_xml);
|
|
continue;
|
|
}
|
|
var text_p = write_text_p(textp);
|
|
if (cell.l && cell.l.Target) {
|
|
var _tgt = cell.l.Target;
|
|
_tgt = _tgt.charAt(0) == "#" ? "#" + csf_to_ods_3D(_tgt.slice(1)) : _tgt;
|
|
// TODO: choose correct parent path format based on link delimiters
|
|
if (_tgt.charAt(0) != "#" && !_tgt.match(/^\w+:/)) _tgt = '../' + _tgt;
|
|
text_p = writextag('text:a', text_p, {
|
|
'xlink:href': _tgt.replace(/&/g, "&")
|
|
});
|
|
}
|
|
o.push(' ' + writextag('table:table-cell', writextag('text:p', text_p, {}), ct) + '\n');
|
|
}
|
|
o.push(' </table:table-row>\n');
|
|
}
|
|
o.push(' </table:table>\n');
|
|
return o.join("");
|
|
};
|
|
var write_automatic_styles_ods = function write_automatic_styles_ods(o, wb) {
|
|
o.push(' <office:automatic-styles>\n');
|
|
o.push(' <number:date-style style:name="N37" number:automatic-order="true">\n');
|
|
o.push(' <number:month number:style="long"/>\n');
|
|
o.push(' <number:text>/</number:text>\n');
|
|
o.push(' <number:day number:style="long"/>\n');
|
|
o.push(' <number:text>/</number:text>\n');
|
|
o.push(' <number:year/>\n');
|
|
o.push(' </number:date-style>\n');
|
|
|
|
/* column styles */
|
|
var cidx = 0;
|
|
wb.SheetNames.map(function (n) {
|
|
return wb.Sheets[n];
|
|
}).forEach(function (ws) {
|
|
if (!ws) return;
|
|
if (ws["!cols"]) {
|
|
for (var C = 0; C < ws["!cols"].length; ++C) {
|
|
if (ws["!cols"][C]) {
|
|
var colobj = ws["!cols"][C];
|
|
if (colobj.width == null && colobj.wpx == null && colobj.wch == null) continue;
|
|
process_col(colobj);
|
|
colobj.ods = cidx;
|
|
var w = ws["!cols"][C].wpx + "px";
|
|
o.push(' <style:style style:name="co' + cidx + '" style:family="table-column">\n');
|
|
o.push(' <style:table-column-properties fo:break-before="auto" style:column-width="' + w + '"/>\n');
|
|
o.push(' </style:style>\n');
|
|
++cidx;
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
/* row styles */
|
|
var ridx = 0;
|
|
wb.SheetNames.map(function (n) {
|
|
return wb.Sheets[n];
|
|
}).forEach(function (ws) {
|
|
if (!ws) return;
|
|
if (ws["!rows"]) {
|
|
for (var R = 0; R < ws["!rows"].length; ++R) {
|
|
if (ws["!rows"][R]) {
|
|
ws["!rows"][R].ods = ridx;
|
|
var h = ws["!rows"][R].hpx + "px";
|
|
o.push(' <style:style style:name="ro' + ridx + '" style:family="table-row">\n');
|
|
o.push(' <style:table-row-properties fo:break-before="auto" style:row-height="' + h + '"/>\n');
|
|
o.push(' </style:style>\n');
|
|
++ridx;
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
/* table */
|
|
o.push(' <style:style style:name="ta1" style:family="table" style:master-page-name="mp1">\n');
|
|
o.push(' <style:table-properties table:display="true" style:writing-mode="lr-tb"/>\n');
|
|
o.push(' </style:style>\n');
|
|
|
|
/* table cells, text */
|
|
o.push(' <style:style style:name="ce1" style:family="table-cell" style:parent-style-name="Default" style:data-style-name="N37"/>\n');
|
|
|
|
/* page-layout */
|
|
|
|
o.push(' </office:automatic-styles>\n');
|
|
};
|
|
return function wcx(wb, opts) {
|
|
var o = [XML_HEADER];
|
|
/* 3.1.3.2 */
|
|
var attr = wxt_helper({
|
|
'xmlns:office': "urn:oasis:names:tc:opendocument:xmlns:office:1.0",
|
|
'xmlns:table': "urn:oasis:names:tc:opendocument:xmlns:table:1.0",
|
|
'xmlns:style': "urn:oasis:names:tc:opendocument:xmlns:style:1.0",
|
|
'xmlns:text': "urn:oasis:names:tc:opendocument:xmlns:text:1.0",
|
|
'xmlns:draw': "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",
|
|
'xmlns:fo': "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0",
|
|
'xmlns:xlink': "http://www.w3.org/1999/xlink",
|
|
'xmlns:dc': "http://purl.org/dc/elements/1.1/",
|
|
'xmlns:meta': "urn:oasis:names:tc:opendocument:xmlns:meta:1.0",
|
|
'xmlns:number': "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0",
|
|
'xmlns:presentation': "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",
|
|
'xmlns:svg': "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0",
|
|
'xmlns:chart': "urn:oasis:names:tc:opendocument:xmlns:chart:1.0",
|
|
'xmlns:dr3d': "urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0",
|
|
'xmlns:math': "http://www.w3.org/1998/Math/MathML",
|
|
'xmlns:form': "urn:oasis:names:tc:opendocument:xmlns:form:1.0",
|
|
'xmlns:script': "urn:oasis:names:tc:opendocument:xmlns:script:1.0",
|
|
'xmlns:ooo': "http://openoffice.org/2004/office",
|
|
'xmlns:ooow': "http://openoffice.org/2004/writer",
|
|
'xmlns:oooc': "http://openoffice.org/2004/calc",
|
|
'xmlns:dom': "http://www.w3.org/2001/xml-events",
|
|
'xmlns:xforms': "http://www.w3.org/2002/xforms",
|
|
'xmlns:xsd': "http://www.w3.org/2001/XMLSchema",
|
|
'xmlns:xsi': "http://www.w3.org/2001/XMLSchema-instance",
|
|
'xmlns:sheet': "urn:oasis:names:tc:opendocument:sh33tjs:1.0",
|
|
'xmlns:rpt': "http://openoffice.org/2005/report",
|
|
'xmlns:of': "urn:oasis:names:tc:opendocument:xmlns:of:1.2",
|
|
'xmlns:xhtml': "http://www.w3.org/1999/xhtml",
|
|
'xmlns:grddl': "http://www.w3.org/2003/g/data-view#",
|
|
'xmlns:tableooo': "http://openoffice.org/2009/table",
|
|
'xmlns:drawooo': "http://openoffice.org/2010/draw",
|
|
'xmlns:calcext': "urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0",
|
|
'xmlns:loext': "urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0",
|
|
'xmlns:field': "urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0",
|
|
'xmlns:formx': "urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0",
|
|
'xmlns:css3t': "http://www.w3.org/TR/css3-text/",
|
|
'office:version': "1.2"
|
|
});
|
|
var fods = wxt_helper({
|
|
'xmlns:config': "urn:oasis:names:tc:opendocument:xmlns:config:1.0",
|
|
'office:mimetype': "application/vnd.oasis.opendocument.spreadsheet"
|
|
});
|
|
if (opts.bookType == "fods") {
|
|
o.push('<office:document' + attr + fods + '>\n');
|
|
o.push(write_meta_ods().replace(/office:document-meta/g, "office:meta"));
|
|
// TODO: settings (equiv of settings.xml for ODS)
|
|
} else o.push('<office:document-content' + attr + '>\n');
|
|
// o.push(' <office:scripts/>\n');
|
|
write_automatic_styles_ods(o, wb);
|
|
o.push(' <office:body>\n');
|
|
o.push(' <office:spreadsheet>\n');
|
|
for (var i = 0; i != wb.SheetNames.length; ++i) {
|
|
o.push(write_ws(wb.Sheets[wb.SheetNames[i]], wb, i, opts));
|
|
}
|
|
o.push(' </office:spreadsheet>\n');
|
|
o.push(' </office:body>\n');
|
|
if (opts.bookType == "fods") o.push('</office:document>');else o.push('</office:document-content>');
|
|
return o.join("");
|
|
};
|
|
}();
|
|
function write_ods(wb, opts) {
|
|
if (opts.bookType == "fods") return write_content_ods(wb, opts);
|
|
var zip = zip_new();
|
|
var f = "";
|
|
var manifest = [];
|
|
var rdf = [];
|
|
|
|
/* Part 3 Section 3.3 MIME Media Type */
|
|
f = "mimetype";
|
|
zip_add_file(zip, f, "application/vnd.oasis.opendocument.spreadsheet");
|
|
|
|
/* Part 1 Section 2.2 Documents */
|
|
f = "content.xml";
|
|
zip_add_file(zip, f, write_content_ods(wb, opts));
|
|
manifest.push([f, "text/xml"]);
|
|
rdf.push([f, "ContentFile"]);
|
|
|
|
/* TODO: these are hard-coded styles to satiate excel */
|
|
f = "styles.xml";
|
|
zip_add_file(zip, f, write_styles_ods(wb, opts));
|
|
manifest.push([f, "text/xml"]);
|
|
rdf.push([f, "StylesFile"]);
|
|
|
|
/* TODO: this is hard-coded to satiate excel */
|
|
f = "meta.xml";
|
|
zip_add_file(zip, f, XML_HEADER + write_meta_ods());
|
|
manifest.push([f, "text/xml"]);
|
|
rdf.push([f, "MetadataFile"]);
|
|
|
|
/* Part 3 Section 6 Metadata Manifest File */
|
|
f = "manifest.rdf";
|
|
zip_add_file(zip, f, write_rdf(rdf /*, opts*/));
|
|
manifest.push([f, "application/rdf+xml"]);
|
|
|
|
/* Part 3 Section 4 Manifest File */
|
|
f = "META-INF/manifest.xml";
|
|
zip_add_file(zip, f, write_manifest(manifest /*, opts*/));
|
|
|
|
return zip;
|
|
}
|
|
function write_sheet_index(wb, sheet) {
|
|
if (!sheet) return 0;
|
|
var idx = wb.SheetNames.indexOf(sheet);
|
|
if (idx == -1) throw new Error("Sheet not found: " + sheet);
|
|
return idx;
|
|
}
|
|
function write_obj_str(factory) {
|
|
return function write_str(wb, o) {
|
|
var idx = write_sheet_index(wb, o.sheet);
|
|
return factory.from_sheet(wb.Sheets[wb.SheetNames[idx]], o, wb);
|
|
};
|
|
}
|
|
var write_htm_str = write_obj_str(HTML_);
|
|
var write_csv_str = write_obj_str({
|
|
from_sheet: sheet_to_csv
|
|
});
|
|
var write_slk_str = write_obj_str(typeof SYLK !== "undefined" ? SYLK : {});
|
|
var write_dif_str = write_obj_str(typeof DIF !== "undefined" ? DIF : {});
|
|
var write_prn_str = write_obj_str(typeof PRN !== "undefined" ? PRN : {});
|
|
var write_rtf_str = write_obj_str(typeof RTF !== "undefined" ? RTF : {});
|
|
var write_txt_str = write_obj_str({
|
|
from_sheet: sheet_to_txt
|
|
});
|
|
var write_dbf_buf = write_obj_str(typeof DBF !== "undefined" ? DBF : {});
|
|
var write_eth_str = write_obj_str(typeof ETH !== "undefined" ? ETH : {});
|
|
var write_wk1_buf = write_obj_str(typeof WK_ !== "undefined" ? {
|
|
from_sheet: WK_.sheet_to_wk1
|
|
} : {});
|
|
function fix_opts_func(defaults) {
|
|
return function fix_opts(opts) {
|
|
for (var i = 0; i != defaults.length; ++i) {
|
|
var d = defaults[i];
|
|
if (opts[d[0]] === undefined) opts[d[0]] = d[1];
|
|
if (d[2] === 'n') opts[d[0]] = Number(opts[d[0]]);
|
|
}
|
|
};
|
|
}
|
|
var fix_read_opts = function fix_read_opts(opts) {
|
|
fix_opts_func([['cellNF', false], /* emit cell number format string as .z */
|
|
['cellHTML', true], /* emit html string as .h */
|
|
['cellFormula', true], /* emit formulae as .f */
|
|
['cellStyles', false], /* emits style/theme as .s */
|
|
['cellText', true], /* emit formatted text as .w */
|
|
['cellDates', false], /* emit date cells with type `d` */
|
|
|
|
['sheetStubs', false], /* emit empty cells */
|
|
['sheetRows', 0, 'n'], /* read n rows (0 = read all rows) */
|
|
|
|
['bookDeps', false], /* parse calculation chains */
|
|
['bookSheets', false], /* only try to get sheet names (no Sheets) */
|
|
['bookProps', false], /* only try to get properties (no Sheets) */
|
|
['bookFiles', false], /* include raw file structure (keys, files, cfb) */
|
|
['bookVBA', false], /* include vba raw data (vbaraw) */
|
|
|
|
['password', ''], /* password */
|
|
['WTF', false] /* WTF mode (throws errors) */])(opts);
|
|
};
|
|
var fix_write_opts = fix_opts_func([['cellDates', false], /* write date cells with type `d` */
|
|
|
|
['bookSST', false], /* Generate Shared String Table */
|
|
|
|
['bookType', 'xlsx'], /* Type of workbook (xlsx/m/b) */
|
|
|
|
['compression', false], /* Use file compression */
|
|
|
|
['WTF', false] /* WTF mode (throws errors) */]);
|
|
|
|
function get_sheet_type(n) {
|
|
if (RELS.WS.indexOf(n) > -1) return "sheet";
|
|
if (RELS.CS && n == RELS.CS) return "chart";
|
|
if (RELS.DS && n == RELS.DS) return "dialog";
|
|
if (RELS.MS && n == RELS.MS) return "macro";
|
|
return n && n.length ? n : "sheet";
|
|
}
|
|
function safe_parse_wbrels(wbrels, sheets) {
|
|
if (!wbrels) return 0;
|
|
try {
|
|
wbrels = sheets.map(function pwbr(w) {
|
|
if (!w.id) w.id = w.strRelID;
|
|
return [w.name, wbrels['!id'][w.id].Target, get_sheet_type(wbrels['!id'][w.id].Type)];
|
|
});
|
|
} catch (e) {
|
|
return null;
|
|
}
|
|
return !wbrels || wbrels.length === 0 ? null : wbrels;
|
|
}
|
|
function safe_parse_sheet(zip, path, relsPath, sheet, idx, sheetRels, sheets, stype, opts, wb, themes, styles) {
|
|
try {
|
|
sheetRels[sheet] = parse_rels(getzipstr(zip, relsPath, true), path);
|
|
var data = getzipdata(zip, path);
|
|
var _ws;
|
|
switch (stype) {
|
|
case 'sheet':
|
|
_ws = parse_ws(data, path, idx, opts, sheetRels[sheet], wb, themes, styles);
|
|
break;
|
|
case 'chart':
|
|
_ws = parse_cs(data, path, idx, opts, sheetRels[sheet], wb, themes, styles);
|
|
if (!_ws || !_ws['!drawel']) break;
|
|
var dfile = resolve_path(_ws['!drawel'].Target, path);
|
|
var drelsp = get_rels_path(dfile);
|
|
var draw = parse_drawing(getzipstr(zip, dfile, true), parse_rels(getzipstr(zip, drelsp, true), dfile));
|
|
var chartp = resolve_path(draw, dfile);
|
|
var crelsp = get_rels_path(chartp);
|
|
_ws = parse_chart(getzipstr(zip, chartp, true), chartp, opts, parse_rels(getzipstr(zip, crelsp, true), chartp), wb, _ws);
|
|
break;
|
|
case 'macro':
|
|
_ws = parse_ms(data, path, idx, opts, sheetRels[sheet], wb, themes, styles);
|
|
break;
|
|
case 'dialog':
|
|
_ws = parse_ds(data, path, idx, opts, sheetRels[sheet], wb, themes, styles);
|
|
break;
|
|
default:
|
|
throw new Error("Unrecognized sheet type " + stype);
|
|
}
|
|
sheets[sheet] = _ws;
|
|
|
|
/* scan rels for comments */
|
|
var comments = [];
|
|
if (sheetRels && sheetRels[sheet]) keys(sheetRels[sheet]).forEach(function (n) {
|
|
if (sheetRels[sheet][n].Type == RELS.CMNT) {
|
|
var dfile = resolve_path(sheetRels[sheet][n].Target, path);
|
|
comments = parse_cmnt(getzipdata(zip, dfile, true), dfile, opts);
|
|
if (!comments || !comments.length) return;
|
|
sheet_insert_comments(_ws, comments);
|
|
}
|
|
});
|
|
} catch (e) {
|
|
if (opts.WTF) throw e;
|
|
}
|
|
}
|
|
function strip_front_slash(x) {
|
|
return x.charAt(0) == '/' ? x.slice(1) : x;
|
|
}
|
|
function parse_zip(zip, opts) {
|
|
make_ssf(SSF);
|
|
opts = opts || {};
|
|
fix_read_opts(opts);
|
|
|
|
/* OpenDocument Part 3 Section 2.2.1 OpenDocument Package */
|
|
if (safegetzipfile(zip, 'META-INF/manifest.xml')) return parse_ods(zip, opts);
|
|
/* UOC */
|
|
if (safegetzipfile(zip, 'objectdata.xml')) return parse_ods(zip, opts);
|
|
/* Numbers */
|
|
if (safegetzipfile(zip, 'Index/Document.iwa')) throw new Error('Unsupported NUMBERS file');
|
|
if (!safegetzipfile(zip, '[Content_Types].xml')) {
|
|
if (safegetzipfile(zip, 'index.xml.gz')) throw new Error('Unsupported NUMBERS 08 file');
|
|
if (safegetzipfile(zip, 'index.xml')) throw new Error('Unsupported NUMBERS 09 file');
|
|
throw new Error('Unsupported ZIP file');
|
|
}
|
|
var entries = zipentries(zip);
|
|
var dir = parse_ct(getzipstr(zip, '[Content_Types].xml'));
|
|
var xlsb = false;
|
|
var sheets, binname;
|
|
if (dir.workbooks.length === 0) {
|
|
binname = "xl/workbook.xml";
|
|
if (getzipdata(zip, binname, true)) dir.workbooks.push(binname);
|
|
}
|
|
if (dir.workbooks.length === 0) {
|
|
binname = "xl/workbook.bin";
|
|
if (!getzipdata(zip, binname, true)) throw new Error("Could not find workbook");
|
|
dir.workbooks.push(binname);
|
|
xlsb = true;
|
|
}
|
|
if (dir.workbooks[0].slice(-3) == "bin") xlsb = true;
|
|
var themes = {};
|
|
var styles = {};
|
|
if (!opts.bookSheets && !opts.bookProps) {
|
|
strs = [];
|
|
if (dir.sst) try {
|
|
strs = parse_sst(getzipdata(zip, strip_front_slash(dir.sst)), dir.sst, opts);
|
|
} catch (e) {
|
|
if (opts.WTF) throw e;
|
|
}
|
|
if (opts.cellStyles && dir.themes.length) themes = parse_theme(getzipstr(zip, dir.themes[0].replace(/^\//, ''), true) || "", dir.themes[0], opts);
|
|
if (dir.style) styles = parse_sty(getzipdata(zip, strip_front_slash(dir.style)), dir.style, themes, opts);
|
|
}
|
|
|
|
/*var externbooks = */
|
|
dir.links.map(function (link) {
|
|
try {
|
|
var rels = parse_rels(getzipstr(zip, get_rels_path(strip_front_slash(link))), link);
|
|
return parse_xlink(getzipdata(zip, strip_front_slash(link)), rels, link, opts);
|
|
} catch (e) {}
|
|
});
|
|
var wb = parse_wb(getzipdata(zip, strip_front_slash(dir.workbooks[0])), dir.workbooks[0], opts);
|
|
var props = {},
|
|
propdata = "";
|
|
if (dir.coreprops.length) {
|
|
propdata = getzipdata(zip, strip_front_slash(dir.coreprops[0]), true);
|
|
if (propdata) props = parse_core_props(propdata);
|
|
if (dir.extprops.length !== 0) {
|
|
propdata = getzipdata(zip, strip_front_slash(dir.extprops[0]), true);
|
|
if (propdata) parse_ext_props(propdata, props, opts);
|
|
}
|
|
}
|
|
var custprops = {};
|
|
if (!opts.bookSheets || opts.bookProps) {
|
|
if (dir.custprops.length !== 0) {
|
|
propdata = getzipstr(zip, strip_front_slash(dir.custprops[0]), true);
|
|
if (propdata) custprops = parse_cust_props(propdata, opts);
|
|
}
|
|
}
|
|
var out = {};
|
|
if (opts.bookSheets || opts.bookProps) {
|
|
if (wb.Sheets) sheets = wb.Sheets.map(function pluck(x) {
|
|
return x.name;
|
|
});else if (props.Worksheets && props.SheetNames.length > 0) sheets = props.SheetNames;
|
|
if (opts.bookProps) {
|
|
out.Props = props;
|
|
out.Custprops = custprops;
|
|
}
|
|
if (opts.bookSheets && typeof sheets !== 'undefined') out.SheetNames = sheets;
|
|
if (opts.bookSheets ? out.SheetNames : opts.bookProps) return out;
|
|
}
|
|
sheets = {};
|
|
var deps = {};
|
|
if (opts.bookDeps && dir.calcchain) deps = parse_cc(getzipdata(zip, strip_front_slash(dir.calcchain)), dir.calcchain, opts);
|
|
var i = 0;
|
|
var sheetRels = {};
|
|
var path, relsPath;
|
|
{
|
|
var wbsheets = wb.Sheets;
|
|
props.Worksheets = wbsheets.length;
|
|
props.SheetNames = [];
|
|
for (var j = 0; j != wbsheets.length; ++j) {
|
|
props.SheetNames[j] = wbsheets[j].name;
|
|
}
|
|
}
|
|
var wbext = xlsb ? "bin" : "xml";
|
|
var wbrelsi = dir.workbooks[0].lastIndexOf("/");
|
|
var wbrelsfile = (dir.workbooks[0].slice(0, wbrelsi + 1) + "_rels/" + dir.workbooks[0].slice(wbrelsi + 1) + ".rels").replace(/^\//, "");
|
|
if (!safegetzipfile(zip, wbrelsfile)) wbrelsfile = 'xl/_rels/workbook.' + wbext + '.rels';
|
|
var wbrels = parse_rels(getzipstr(zip, wbrelsfile, true), wbrelsfile);
|
|
if (wbrels) wbrels = safe_parse_wbrels(wbrels, wb.Sheets);
|
|
|
|
/* Numbers iOS hack */
|
|
var nmode = getzipdata(zip, "xl/worksheets/sheet.xml", true) ? 1 : 0;
|
|
wsloop: for (i = 0; i != props.Worksheets; ++i) {
|
|
var stype = "sheet";
|
|
if (wbrels && wbrels[i]) {
|
|
path = 'xl/' + wbrels[i][1].replace(/[\/]?xl\//, "");
|
|
if (!safegetzipfile(zip, path)) path = wbrels[i][1];
|
|
if (!safegetzipfile(zip, path)) path = wbrelsfile.replace(/_rels\/.*$/, "") + wbrels[i][1];
|
|
stype = wbrels[i][2];
|
|
} else {
|
|
path = 'xl/worksheets/sheet' + (i + 1 - nmode) + "." + wbext;
|
|
path = path.replace(/sheet0\./, "sheet.");
|
|
}
|
|
relsPath = path.replace(/^(.*)(\/)([^\/]*)$/, "$1/_rels/$3.rels");
|
|
if (opts && opts.sheets != null) switch (_typeof(opts.sheets)) {
|
|
case "number":
|
|
if (i != opts.sheets) continue wsloop;
|
|
break;
|
|
case "string":
|
|
if (props.SheetNames[i].toLowerCase() != opts.sheets.toLowerCase()) continue wsloop;
|
|
break;
|
|
default:
|
|
if (Array.isArray && Array.isArray(opts.sheets)) {
|
|
var snjseen = false;
|
|
for (var snj = 0; snj != opts.sheets.length; ++snj) {
|
|
if (typeof opts.sheets[snj] == "number" && opts.sheets[snj] == i) snjseen = 1;
|
|
if (typeof opts.sheets[snj] == "string" && opts.sheets[snj].toLowerCase() == props.SheetNames[i].toLowerCase()) snjseen = 1;
|
|
}
|
|
if (!snjseen) continue wsloop;
|
|
}
|
|
}
|
|
safe_parse_sheet(zip, path, relsPath, props.SheetNames[i], i, sheetRels, sheets, stype, opts, wb, themes, styles);
|
|
}
|
|
out = {
|
|
Directory: dir,
|
|
Workbook: wb,
|
|
Props: props,
|
|
Custprops: custprops,
|
|
Deps: deps,
|
|
Sheets: sheets,
|
|
SheetNames: props.SheetNames,
|
|
Strings: strs,
|
|
Styles: styles,
|
|
Themes: themes,
|
|
SSF: SSF.get_table()
|
|
};
|
|
if (opts && opts.bookFiles) {
|
|
if (zip.files) {
|
|
out.keys = entries;
|
|
out.files = zip.files;
|
|
} else {
|
|
out.keys = [];
|
|
out.files = {};
|
|
zip.FullPaths.forEach(function (p, idx) {
|
|
p = p.replace(/^Root Entry[\/]/, "");
|
|
out.keys.push(p);
|
|
out.files[p] = zip.FileIndex[idx];
|
|
});
|
|
}
|
|
}
|
|
if (opts && opts.bookVBA) {
|
|
if (dir.vba.length > 0) out.vbaraw = getzipdata(zip, strip_front_slash(dir.vba[0]), true);else if (dir.defaults && dir.defaults.bin === CT_VBA) out.vbaraw = getzipdata(zip, 'xl/vbaProject.bin', true);
|
|
}
|
|
return out;
|
|
}
|
|
|
|
/* [MS-OFFCRYPTO] 2.1.1 */
|
|
function parse_xlsxcfb(cfb, _opts) {
|
|
var opts = _opts || {};
|
|
var f = 'Workbook',
|
|
data = CFB.find(cfb, f);
|
|
try {
|
|
f = '/!DataSpaces/Version';
|
|
data = CFB.find(cfb, f);
|
|
if (!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f);
|
|
/*var version = */
|
|
parse_DataSpaceVersionInfo(data.content);
|
|
|
|
/* 2.3.4.1 */
|
|
f = '/!DataSpaces/DataSpaceMap';
|
|
data = CFB.find(cfb, f);
|
|
if (!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f);
|
|
var dsm = parse_DataSpaceMap(data.content);
|
|
if (dsm.length !== 1 || dsm[0].comps.length !== 1 || dsm[0].comps[0].t !== 0 || dsm[0].name !== "StrongEncryptionDataSpace" || dsm[0].comps[0].v !== "EncryptedPackage") throw new Error("ECMA-376 Encrypted file bad " + f);
|
|
|
|
/* 2.3.4.2 */
|
|
f = '/!DataSpaces/DataSpaceInfo/StrongEncryptionDataSpace';
|
|
data = CFB.find(cfb, f);
|
|
if (!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f);
|
|
var seds = parse_DataSpaceDefinition(data.content);
|
|
if (seds.length != 1 || seds[0] != "StrongEncryptionTransform") throw new Error("ECMA-376 Encrypted file bad " + f);
|
|
|
|
/* 2.3.4.3 */
|
|
f = '/!DataSpaces/TransformInfo/StrongEncryptionTransform/!Primary';
|
|
data = CFB.find(cfb, f);
|
|
if (!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f);
|
|
/*var hdr = */
|
|
parse_Primary(data.content);
|
|
} catch (e) {}
|
|
f = '/EncryptionInfo';
|
|
data = CFB.find(cfb, f);
|
|
if (!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f);
|
|
var einfo = parse_EncryptionInfo(data.content);
|
|
|
|
/* 2.3.4.4 */
|
|
f = '/EncryptedPackage';
|
|
data = CFB.find(cfb, f);
|
|
if (!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f);
|
|
|
|
/*global decrypt_agile */
|
|
if (einfo[0] == 0x04 && typeof decrypt_agile !== 'undefined') return decrypt_agile(einfo[1], data.content, opts.password || "", opts);
|
|
/*global decrypt_std76 */
|
|
if (einfo[0] == 0x02 && typeof decrypt_std76 !== 'undefined') return decrypt_std76(einfo[1], data.content, opts.password || "", opts);
|
|
throw new Error("File is password-protected");
|
|
}
|
|
function write_zip(wb, opts) {
|
|
_shapeid = 1024;
|
|
if (opts.bookType == "ods") return write_ods(wb, opts);
|
|
if (wb && !wb.SSF) {
|
|
wb.SSF = SSF.get_table();
|
|
}
|
|
if (wb && wb.SSF) {
|
|
make_ssf(SSF);
|
|
SSF.load_table(wb.SSF);
|
|
// $FlowIgnore
|
|
opts.revssf = evert_num(wb.SSF);
|
|
opts.revssf[wb.SSF[65535]] = 0;
|
|
opts.ssf = wb.SSF;
|
|
}
|
|
opts.rels = {};
|
|
opts.wbrels = {};
|
|
opts.Strings = [];
|
|
opts.Strings.Count = 0;
|
|
opts.Strings.Unique = 0;
|
|
if (browser_has_Map) opts.revStrings = new Map();else {
|
|
opts.revStrings = {};
|
|
opts.revStrings.foo = [];
|
|
delete opts.revStrings.foo;
|
|
}
|
|
var wbext = opts.bookType == "xlsb" ? "bin" : "xml";
|
|
var vbafmt = VBAFMTS.indexOf(opts.bookType) > -1;
|
|
var ct = new_ct();
|
|
fix_write_opts(opts = opts || {});
|
|
var zip = zip_new();
|
|
var f = "",
|
|
rId = 0;
|
|
opts.cellXfs = [];
|
|
get_cell_style(opts.cellXfs, {}, {
|
|
revssf: {
|
|
"General": 0
|
|
}
|
|
});
|
|
if (!wb.Props) wb.Props = {};
|
|
f = "docProps/core.xml";
|
|
zip_add_file(zip, f, write_core_props(wb.Props, opts));
|
|
ct.coreprops.push(f);
|
|
add_rels(opts.rels, 2, f, RELS.CORE_PROPS);
|
|
f = "docProps/app.xml";
|
|
if (wb.Props && wb.Props.SheetNames) {/* empty */} else if (!wb.Workbook || !wb.Workbook.Sheets) wb.Props.SheetNames = wb.SheetNames;else {
|
|
var _sn = [];
|
|
for (var _i = 0; _i < wb.SheetNames.length; ++_i) {
|
|
if ((wb.Workbook.Sheets[_i] || {}).Hidden != 2) _sn.push(wb.SheetNames[_i]);
|
|
}
|
|
wb.Props.SheetNames = _sn;
|
|
}
|
|
wb.Props.Worksheets = wb.Props.SheetNames.length;
|
|
zip_add_file(zip, f, write_ext_props(wb.Props, opts));
|
|
ct.extprops.push(f);
|
|
add_rels(opts.rels, 3, f, RELS.EXT_PROPS);
|
|
if (wb.Custprops !== wb.Props && keys(wb.Custprops || {}).length > 0) {
|
|
f = "docProps/custom.xml";
|
|
zip_add_file(zip, f, write_cust_props(wb.Custprops, opts));
|
|
ct.custprops.push(f);
|
|
add_rels(opts.rels, 4, f, RELS.CUST_PROPS);
|
|
}
|
|
for (rId = 1; rId <= wb.SheetNames.length; ++rId) {
|
|
var wsrels = {
|
|
'!id': {}
|
|
};
|
|
var ws = wb.Sheets[wb.SheetNames[rId - 1]];
|
|
var _type = (ws || {})["!type"] || "sheet";
|
|
switch (_type) {
|
|
case "chart":
|
|
/* falls through */
|
|
default:
|
|
f = "xl/worksheets/sheet" + rId + "." + wbext;
|
|
zip_add_file(zip, f, write_ws(rId - 1, f, opts, wb, wsrels));
|
|
ct.sheets.push(f);
|
|
add_rels(opts.wbrels, -1, "worksheets/sheet" + rId + "." + wbext, RELS.WS[0]);
|
|
}
|
|
if (ws) {
|
|
var comments = ws['!comments'];
|
|
var need_vml = false;
|
|
if (comments && comments.length > 0) {
|
|
var cf = "xl/comments" + rId + "." + wbext;
|
|
zip_add_file(zip, cf, write_cmnt(comments, cf, opts));
|
|
ct.comments.push(cf);
|
|
add_rels(wsrels, -1, "../comments" + rId + "." + wbext, RELS.CMNT);
|
|
need_vml = true;
|
|
}
|
|
if (ws['!legacy']) {
|
|
if (need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + rId + ".vml", write_comments_vml(rId, ws['!comments']));
|
|
}
|
|
delete ws['!comments'];
|
|
delete ws['!legacy'];
|
|
}
|
|
if (wsrels['!id'].rId1) zip_add_file(zip, get_rels_path(f), write_rels(wsrels));
|
|
}
|
|
if (opts.Strings != null && opts.Strings.length > 0) {
|
|
f = "xl/sharedStrings." + wbext;
|
|
zip_add_file(zip, f, write_sst(opts.Strings, f, opts));
|
|
ct.strs.push(f);
|
|
add_rels(opts.wbrels, -1, "sharedStrings." + wbext, RELS.SST);
|
|
}
|
|
f = "xl/workbook." + wbext;
|
|
zip_add_file(zip, f, write_wb(wb, f, opts));
|
|
ct.workbooks.push(f);
|
|
add_rels(opts.rels, 1, f, RELS.WB);
|
|
|
|
/* TODO: something more intelligent with themes */
|
|
|
|
f = "xl/theme/theme1.xml";
|
|
zip_add_file(zip, f, write_theme(wb.Themes, opts));
|
|
ct.themes.push(f);
|
|
add_rels(opts.wbrels, -1, "theme/theme1.xml", RELS.THEME);
|
|
|
|
/* TODO: something more intelligent with styles */
|
|
|
|
f = "xl/styles." + wbext;
|
|
zip_add_file(zip, f, write_sty(wb, f, opts));
|
|
ct.styles.push(f);
|
|
add_rels(opts.wbrels, -1, "styles." + wbext, RELS.STY);
|
|
if (wb.vbaraw && vbafmt) {
|
|
f = "xl/vbaProject.bin";
|
|
zip_add_file(zip, f, wb.vbaraw);
|
|
ct.vba.push(f);
|
|
add_rels(opts.wbrels, -1, "vbaProject.bin", RELS.VBA);
|
|
}
|
|
zip_add_file(zip, "[Content_Types].xml", write_ct(ct, opts));
|
|
zip_add_file(zip, '_rels/.rels', write_rels(opts.rels));
|
|
zip_add_file(zip, 'xl/_rels/workbook.' + wbext + '.rels', write_rels(opts.wbrels));
|
|
delete opts.revssf;
|
|
delete opts.ssf;
|
|
return zip;
|
|
}
|
|
function firstbyte(f, o) {
|
|
var x = "";
|
|
switch ((o || {}).type || "base64") {
|
|
case 'buffer':
|
|
return [f[0], f[1], f[2], f[3], f[4], f[5], f[6], f[7]];
|
|
case 'base64':
|
|
x = Base64.decode(f.slice(0, 12));
|
|
break;
|
|
case 'binary':
|
|
x = f;
|
|
break;
|
|
case 'array':
|
|
return [f[0], f[1], f[2], f[3], f[4], f[5], f[6], f[7]];
|
|
default:
|
|
throw new Error("Unrecognized type " + (o && o.type || "undefined"));
|
|
}
|
|
return [x.charCodeAt(0), x.charCodeAt(1), x.charCodeAt(2), x.charCodeAt(3), x.charCodeAt(4), x.charCodeAt(5), x.charCodeAt(6), x.charCodeAt(7)];
|
|
}
|
|
function read_cfb(cfb, opts) {
|
|
if (CFB.find(cfb, "EncryptedPackage")) return parse_xlsxcfb(cfb, opts);
|
|
return parse_xlscfb(cfb, opts);
|
|
}
|
|
function read_zip(data, opts) {
|
|
var zip,
|
|
d = data;
|
|
var o = opts || {};
|
|
if (!o.type) o.type = has_buf && Buffer.isBuffer(data) ? "buffer" : "base64";
|
|
zip = zip_read(d, o);
|
|
return parse_zip(zip, o);
|
|
}
|
|
function read_plaintext(data, o) {
|
|
var i = 0;
|
|
main: while (i < data.length) {
|
|
switch (data.charCodeAt(i)) {
|
|
case 0x0A:
|
|
case 0x0D:
|
|
case 0x20:
|
|
++i;
|
|
break;
|
|
case 0x3C:
|
|
return parse_xlml(data.slice(i), o);
|
|
default:
|
|
break main;
|
|
}
|
|
}
|
|
return PRN.to_workbook(data, o);
|
|
}
|
|
function read_plaintext_raw(data, o) {
|
|
var str = "",
|
|
bytes = firstbyte(data, o);
|
|
switch (o.type) {
|
|
case 'base64':
|
|
str = Base64.decode(data);
|
|
break;
|
|
case 'binary':
|
|
str = data;
|
|
break;
|
|
case 'buffer':
|
|
str = data.toString('binary');
|
|
break;
|
|
case 'array':
|
|
str = cc2str(data);
|
|
break;
|
|
default:
|
|
throw new Error("Unrecognized type " + o.type);
|
|
}
|
|
if (bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) str = utf8read(str);
|
|
return read_plaintext(str, o);
|
|
}
|
|
function read_utf16(data, o) {
|
|
var d = data;
|
|
if (o.type == 'base64') d = Base64.decode(d);
|
|
d = cptable.utils.decode(1200, d.slice(2), 'str');
|
|
o.type = "binary";
|
|
return read_plaintext(d, o);
|
|
}
|
|
function bstrify(data) {
|
|
return !data.match(/[^\x00-\x7F]/) ? data : utf8write(data);
|
|
}
|
|
function read_prn(data, d, o, str) {
|
|
if (str) {
|
|
o.type = "string";
|
|
return PRN.to_workbook(data, o);
|
|
}
|
|
return PRN.to_workbook(d, o);
|
|
}
|
|
function readSync(data, opts) {
|
|
reset_cp();
|
|
var o = opts || {};
|
|
if (typeof ArrayBuffer !== 'undefined' && data instanceof ArrayBuffer) return readSync(new Uint8Array(data), (o = dup(o), o.type = "array", o));
|
|
var d = data,
|
|
n = [0, 0, 0, 0],
|
|
str = false;
|
|
if (o.cellStyles) {
|
|
o.cellNF = true;
|
|
o.sheetStubs = true;
|
|
}
|
|
_ssfopts = {};
|
|
if (o.dateNF) _ssfopts.dateNF = o.dateNF;
|
|
if (!o.type) o.type = has_buf && Buffer.isBuffer(data) ? "buffer" : "base64";
|
|
if (o.type == "file") {
|
|
o.type = has_buf ? "buffer" : "binary";
|
|
d = read_binary(data);
|
|
}
|
|
if (o.type == "string") {
|
|
str = true;
|
|
o.type = "binary";
|
|
o.codepage = 65001;
|
|
d = bstrify(data);
|
|
}
|
|
if (o.type == 'array' && typeof Uint8Array !== 'undefined' && data instanceof Uint8Array && typeof ArrayBuffer !== 'undefined') {
|
|
// $FlowIgnore
|
|
var ab = new ArrayBuffer(3),
|
|
vu = new Uint8Array(ab);
|
|
vu.foo = "bar";
|
|
// $FlowIgnore
|
|
if (!vu.foo) {
|
|
o = dup(o);
|
|
o.type = 'array';
|
|
return readSync(ab2a(d), o);
|
|
}
|
|
}
|
|
switch ((n = firstbyte(d, o))[0]) {
|
|
case 0xD0:
|
|
if (n[1] === 0xCF && n[2] === 0x11 && n[3] === 0xE0 && n[4] === 0xA1 && n[5] === 0xB1 && n[6] === 0x1A && n[7] === 0xE1) return read_cfb(CFB.read(d, o), o);
|
|
break;
|
|
case 0x09:
|
|
if (n[1] <= 0x08) return parse_xlscfb(d, o);
|
|
break;
|
|
case 0x3C:
|
|
return parse_xlml(d, o);
|
|
case 0x49:
|
|
if (n[1] === 0x49 && n[2] === 0x2a && n[3] === 0x00) throw new Error("TIFF Image File is not a spreadsheet");
|
|
if (n[1] === 0x44) return read_wb_ID(d, o);
|
|
break;
|
|
case 0x54:
|
|
if (n[1] === 0x41 && n[2] === 0x42 && n[3] === 0x4C) return DIF.to_workbook(d, o);
|
|
break;
|
|
case 0x50:
|
|
return n[1] === 0x4B && n[2] < 0x09 && n[3] < 0x09 ? read_zip(d, o) : read_prn(data, d, o, str);
|
|
case 0xEF:
|
|
return n[3] === 0x3C ? parse_xlml(d, o) : read_prn(data, d, o, str);
|
|
case 0xFF:
|
|
if (n[1] === 0xFE) {
|
|
return read_utf16(d, o);
|
|
} else if (n[1] === 0x00 && n[2] === 0x02 && n[3] === 0x00) return WK_.to_workbook(d, o);
|
|
break;
|
|
case 0x00:
|
|
if (n[1] === 0x00) {
|
|
if (n[2] >= 0x02 && n[3] === 0x00) return WK_.to_workbook(d, o);
|
|
if (n[2] === 0x00 && (n[3] === 0x08 || n[3] === 0x09)) return WK_.to_workbook(d, o);
|
|
}
|
|
break;
|
|
case 0x03:
|
|
case 0x83:
|
|
case 0x8B:
|
|
case 0x8C:
|
|
return DBF.to_workbook(d, o);
|
|
case 0x7B:
|
|
if (n[1] === 0x5C && n[2] === 0x72 && n[3] === 0x74) return RTF.to_workbook(d, o);
|
|
break;
|
|
case 0x0A:
|
|
case 0x0D:
|
|
case 0x20:
|
|
return read_plaintext_raw(d, o);
|
|
case 0x89:
|
|
if (n[1] === 0x50 && n[2] === 0x4E && n[3] === 0x47) throw new Error("PNG Image File is not a spreadsheet");
|
|
break;
|
|
}
|
|
if (DBF.versions.indexOf(n[0]) > -1 && n[2] <= 12 && n[3] <= 31) return DBF.to_workbook(d, o);
|
|
return read_prn(data, d, o, str);
|
|
}
|
|
function readFileSync(filename, opts) {
|
|
var o = opts || {};
|
|
o.type = 'file';
|
|
return readSync(filename, o);
|
|
}
|
|
function write_cfb_ctr(cfb, o) {
|
|
switch (o.type) {
|
|
case "base64":
|
|
case "binary":
|
|
break;
|
|
case "buffer":
|
|
case "array":
|
|
o.type = "";
|
|
break;
|
|
case "file":
|
|
return write_dl(o.file, CFB.write(cfb, {
|
|
type: has_buf ? 'buffer' : ""
|
|
}));
|
|
case "string":
|
|
throw new Error("'string' output type invalid for '" + o.bookType + "' files");
|
|
default:
|
|
throw new Error("Unrecognized type " + o.type);
|
|
}
|
|
return CFB.write(cfb, o);
|
|
}
|
|
function write_zip_type(wb, opts) {
|
|
var o = dup(opts || {});
|
|
var z = write_zip(wb, o);
|
|
var oopts = {};
|
|
if (o.compression) oopts.compression = 'DEFLATE';
|
|
if (o.password) oopts.type = has_buf ? "nodebuffer" : "string";else switch (o.type) {
|
|
case "base64":
|
|
oopts.type = "base64";
|
|
break;
|
|
case "binary":
|
|
oopts.type = "string";
|
|
break;
|
|
case "string":
|
|
throw new Error("'string' output type invalid for '" + o.bookType + "' files");
|
|
case "buffer":
|
|
case "file":
|
|
oopts.type = has_buf ? "nodebuffer" : "string";
|
|
break;
|
|
default:
|
|
throw new Error("Unrecognized type " + o.type);
|
|
}
|
|
var out = z.FullPaths ? CFB.write(z, {
|
|
fileType: "zip",
|
|
type: {
|
|
"nodebuffer": "buffer",
|
|
"string": "binary"
|
|
}[oopts.type] || oopts.type
|
|
}) : z.generate(oopts);
|
|
/*jshint -W083 */
|
|
if (o.password && typeof encrypt_agile !== 'undefined') return write_cfb_ctr(encrypt_agile(out, o.password), o); // eslint-disable-line no-undef
|
|
/*jshint +W083 */
|
|
if (o.type === "file") return write_dl(o.file, out);
|
|
return o.type == "string" ? utf8read(out) : out;
|
|
}
|
|
function write_cfb_type(wb, opts) {
|
|
var o = opts || {};
|
|
var cfb = write_xlscfb(wb, o);
|
|
return write_cfb_ctr(cfb, o);
|
|
}
|
|
function write_string_type(out, opts, bom) {
|
|
if (!bom) bom = "";
|
|
var o = bom + out;
|
|
switch (opts.type) {
|
|
case "base64":
|
|
return Base64.encode(utf8write(o));
|
|
case "binary":
|
|
return utf8write(o);
|
|
case "string":
|
|
return out;
|
|
case "file":
|
|
return write_dl(opts.file, o, 'utf8');
|
|
case "buffer":
|
|
{
|
|
if (has_buf) return Buffer_from(o, 'utf8');else return write_string_type(o, {
|
|
type: 'binary'
|
|
}).split("").map(function (c) {
|
|
return c.charCodeAt(0);
|
|
});
|
|
}
|
|
}
|
|
throw new Error("Unrecognized type " + opts.type);
|
|
}
|
|
function write_stxt_type(out, opts) {
|
|
switch (opts.type) {
|
|
case "base64":
|
|
return Base64.encode(out);
|
|
case "binary":
|
|
return out;
|
|
case "string":
|
|
return out;
|
|
/* override in sheet_to_txt */
|
|
case "file":
|
|
return write_dl(opts.file, out, 'binary');
|
|
case "buffer":
|
|
{
|
|
if (has_buf) return Buffer_from(out, 'binary');else return out.split("").map(function (c) {
|
|
return c.charCodeAt(0);
|
|
});
|
|
}
|
|
}
|
|
throw new Error("Unrecognized type " + opts.type);
|
|
}
|
|
|
|
/* TODO: test consistency */
|
|
function write_binary_type(out, opts) {
|
|
switch (opts.type) {
|
|
case "string":
|
|
case "base64":
|
|
case "binary":
|
|
var bstr = "";
|
|
// $FlowIgnore
|
|
for (var i = 0; i < out.length; ++i) {
|
|
bstr += String.fromCharCode(out[i]);
|
|
}
|
|
return opts.type == 'base64' ? Base64.encode(bstr) : opts.type == 'string' ? utf8read(bstr) : bstr;
|
|
case "file":
|
|
return write_dl(opts.file, out);
|
|
case "buffer":
|
|
return out;
|
|
default:
|
|
throw new Error("Unrecognized type " + opts.type);
|
|
}
|
|
}
|
|
function writeSync(wb, opts) {
|
|
reset_cp();
|
|
check_wb(wb);
|
|
var o = dup(opts || {});
|
|
if (o.cellStyles) {
|
|
o.cellNF = true;
|
|
o.sheetStubs = true;
|
|
}
|
|
if (o.type == "array") {
|
|
o.type = "binary";
|
|
var out = writeSync(wb, o);
|
|
o.type = "array";
|
|
return s2ab(out);
|
|
}
|
|
switch (o.bookType || 'xlsb') {
|
|
case 'xml':
|
|
case 'xlml':
|
|
return write_string_type(write_xlml(wb, o), o);
|
|
case 'slk':
|
|
case 'sylk':
|
|
return write_string_type(write_slk_str(wb, o), o);
|
|
case 'htm':
|
|
case 'html':
|
|
return write_string_type(write_htm_str(wb, o), o);
|
|
case 'txt':
|
|
return write_stxt_type(write_txt_str(wb, o), o);
|
|
case 'csv':
|
|
return write_string_type(write_csv_str(wb, o), o, "\uFEFF");
|
|
case 'dif':
|
|
return write_string_type(write_dif_str(wb, o), o);
|
|
case 'dbf':
|
|
return write_binary_type(write_dbf_buf(wb, o), o);
|
|
case 'prn':
|
|
return write_string_type(write_prn_str(wb, o), o);
|
|
case 'rtf':
|
|
return write_string_type(write_rtf_str(wb, o), o);
|
|
case 'eth':
|
|
return write_string_type(write_eth_str(wb, o), o);
|
|
case 'fods':
|
|
return write_string_type(write_ods(wb, o), o);
|
|
case 'wk1':
|
|
return write_binary_type(write_wk1_buf(wb, o), o);
|
|
case 'wk3':
|
|
return write_binary_type(WK_.book_to_wk3(wb, o), o);
|
|
case 'biff2':
|
|
if (!o.biff) o.biff = 2;
|
|
/* falls through */
|
|
case 'biff3':
|
|
if (!o.biff) o.biff = 3;
|
|
/* falls through */
|
|
case 'biff4':
|
|
if (!o.biff) o.biff = 4;
|
|
return write_binary_type(write_biff_buf(wb, o), o);
|
|
case 'biff5':
|
|
if (!o.biff) o.biff = 5;
|
|
/* falls through */
|
|
case 'biff8':
|
|
case 'xla':
|
|
case 'xls':
|
|
if (!o.biff) o.biff = 8;
|
|
return write_cfb_type(wb, o);
|
|
case 'xlsx':
|
|
case 'xlsm':
|
|
case 'xlam':
|
|
case 'xlsb':
|
|
case 'ods':
|
|
return write_zip_type(wb, o);
|
|
default:
|
|
throw new Error("Unrecognized bookType |" + o.bookType + "|");
|
|
}
|
|
}
|
|
function resolve_book_type(o) {
|
|
if (o.bookType) return;
|
|
var _BT = {
|
|
"xls": "biff8",
|
|
"htm": "html",
|
|
"slk": "sylk",
|
|
"socialcalc": "eth",
|
|
"Sh33tJS": "WTF"
|
|
};
|
|
var ext = o.file.slice(o.file.lastIndexOf(".")).toLowerCase();
|
|
if (ext.match(/^\.[a-z]+$/)) o.bookType = ext.slice(1);
|
|
o.bookType = _BT[o.bookType] || o.bookType;
|
|
}
|
|
function writeFileSync(wb, filename, opts) {
|
|
var o = opts || {};
|
|
o.type = 'file';
|
|
o.file = filename;
|
|
resolve_book_type(o);
|
|
return writeSync(wb, o);
|
|
}
|
|
function writeFileAsync(filename, wb, opts, cb) {
|
|
var o = opts || {};
|
|
o.type = 'file';
|
|
o.file = filename;
|
|
resolve_book_type(o);
|
|
o.type = 'buffer';
|
|
var _cb = cb;
|
|
if (!(_cb instanceof Function)) _cb = opts;
|
|
return _fs.writeFile(filename, writeSync(wb, o), _cb);
|
|
}
|
|
function make_json_row(sheet, r, R, cols, header, hdr, dense, o) {
|
|
var rr = encode_row(R);
|
|
var defval = o.defval,
|
|
raw = o.raw || !Object.prototype.hasOwnProperty.call(o, "raw");
|
|
var isempty = true;
|
|
var row = header === 1 ? [] : {};
|
|
if (header !== 1) {
|
|
if (Object.defineProperty) try {
|
|
Object.defineProperty(row, '__rowNum__', {
|
|
value: R,
|
|
enumerable: false
|
|
});
|
|
} catch (e) {
|
|
row.__rowNum__ = R;
|
|
} else row.__rowNum__ = R;
|
|
}
|
|
if (!dense || sheet[R]) for (var C = r.s.c; C <= r.e.c; ++C) {
|
|
var val = dense ? sheet[R][C] : sheet[cols[C] + rr];
|
|
if (val === undefined || val.t === undefined) {
|
|
if (defval === undefined) continue;
|
|
if (hdr[C] != null) {
|
|
row[hdr[C]] = defval;
|
|
}
|
|
continue;
|
|
}
|
|
var v = val.v;
|
|
switch (val.t) {
|
|
case 'z':
|
|
if (v == null) break;
|
|
continue;
|
|
case 'e':
|
|
v = v == 0 ? null : void 0;
|
|
break;
|
|
case 's':
|
|
case 'd':
|
|
case 'b':
|
|
case 'n':
|
|
break;
|
|
default:
|
|
throw new Error('unrecognized type ' + val.t);
|
|
}
|
|
if (hdr[C] != null) {
|
|
if (v == null) {
|
|
if (val.t == "e" && v === null) row[hdr[C]] = null;else if (defval !== undefined) row[hdr[C]] = defval;else if (raw && v === null) row[hdr[C]] = null;else continue;
|
|
} else {
|
|
row[hdr[C]] = raw || o.rawNumbers && val.t == "n" ? v : format_cell(val, v, o);
|
|
}
|
|
if (v != null) isempty = false;
|
|
}
|
|
}
|
|
return {
|
|
row: row,
|
|
isempty: isempty
|
|
};
|
|
}
|
|
function sheet_to_json(sheet, opts) {
|
|
if (sheet == null || sheet["!ref"] == null) return [];
|
|
var val = {
|
|
t: 'n',
|
|
v: 0
|
|
},
|
|
header = 0,
|
|
offset = 1,
|
|
hdr = [],
|
|
v = 0,
|
|
vv = "";
|
|
var r = {
|
|
s: {
|
|
r: 0,
|
|
c: 0
|
|
},
|
|
e: {
|
|
r: 0,
|
|
c: 0
|
|
}
|
|
};
|
|
var o = opts || {};
|
|
var range = o.range != null ? o.range : sheet["!ref"];
|
|
if (o.header === 1) header = 1;else if (o.header === "A") header = 2;else if (Array.isArray(o.header)) header = 3;else if (o.header == null) header = 0;
|
|
switch (_typeof(range)) {
|
|
case 'string':
|
|
r = safe_decode_range(range);
|
|
break;
|
|
case 'number':
|
|
r = safe_decode_range(sheet["!ref"]);
|
|
r.s.r = range;
|
|
break;
|
|
default:
|
|
r = range;
|
|
}
|
|
if (header > 0) offset = 0;
|
|
var rr = encode_row(r.s.r);
|
|
var cols = [];
|
|
var out = [];
|
|
var outi = 0,
|
|
counter = 0;
|
|
var dense = Array.isArray(sheet);
|
|
var R = r.s.r,
|
|
C = 0,
|
|
CC = 0;
|
|
if (dense && !sheet[R]) sheet[R] = [];
|
|
for (C = r.s.c; C <= r.e.c; ++C) {
|
|
cols[C] = encode_col(C);
|
|
val = dense ? sheet[R][C] : sheet[cols[C] + rr];
|
|
switch (header) {
|
|
case 1:
|
|
hdr[C] = C - r.s.c;
|
|
break;
|
|
case 2:
|
|
hdr[C] = cols[C];
|
|
break;
|
|
case 3:
|
|
hdr[C] = o.header[C - r.s.c];
|
|
break;
|
|
default:
|
|
if (val == null) val = {
|
|
w: "__EMPTY",
|
|
t: "s"
|
|
};
|
|
vv = v = format_cell(val, null, o);
|
|
counter = 0;
|
|
for (CC = 0; CC < hdr.length; ++CC) {
|
|
if (hdr[CC] == vv) vv = v + "_" + ++counter;
|
|
}
|
|
hdr[C] = vv;
|
|
}
|
|
}
|
|
for (R = r.s.r + offset; R <= r.e.r; ++R) {
|
|
var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);
|
|
if (row.isempty === false || (header === 1 ? o.blankrows !== false : !!o.blankrows)) out[outi++] = row.row;
|
|
}
|
|
out.length = outi;
|
|
return out;
|
|
}
|
|
var qreg = /"/g;
|
|
function make_csv_row(sheet, r, R, cols, fs, rs, FS, o) {
|
|
var isempty = true;
|
|
var row = [],
|
|
txt = "",
|
|
rr = encode_row(R);
|
|
for (var C = r.s.c; C <= r.e.c; ++C) {
|
|
if (!cols[C]) continue;
|
|
var val = o.dense ? (sheet[R] || [])[C] : sheet[cols[C] + rr];
|
|
if (val == null) txt = "";else if (val.v != null) {
|
|
isempty = false;
|
|
txt = '' + (o.rawNumbers && val.t == "n" ? val.v : format_cell(val, null, o));
|
|
for (var i = 0, cc = 0; i !== txt.length; ++i) {
|
|
if ((cc = txt.charCodeAt(i)) === fs || cc === rs || cc === 34 || o.forceQuotes) {
|
|
txt = "\"" + txt.replace(qreg, '""') + "\"";
|
|
break;
|
|
}
|
|
}
|
|
if (txt == "ID") txt = '"ID"';
|
|
} else if (val.f != null && !val.F) {
|
|
isempty = false;
|
|
txt = '=' + val.f;
|
|
if (txt.indexOf(",") >= 0) txt = '"' + txt.replace(qreg, '""') + '"';
|
|
} else txt = "";
|
|
/* NOTE: Excel CSV does not support array formulae */
|
|
row.push(txt);
|
|
}
|
|
if (o.blankrows === false && isempty) return null;
|
|
return row.join(FS);
|
|
}
|
|
function sheet_to_csv(sheet, opts) {
|
|
var out = [];
|
|
var o = opts == null ? {} : opts;
|
|
if (sheet == null || sheet["!ref"] == null) return "";
|
|
var r = safe_decode_range(sheet["!ref"]);
|
|
var FS = o.FS !== undefined ? o.FS : ",",
|
|
fs = FS.charCodeAt(0);
|
|
var RS = o.RS !== undefined ? o.RS : "\n",
|
|
rs = RS.charCodeAt(0);
|
|
var endregex = new RegExp((FS == "|" ? "\\|" : FS) + "+$");
|
|
var row = "",
|
|
cols = [];
|
|
o.dense = Array.isArray(sheet);
|
|
var colinfo = o.skipHidden && sheet["!cols"] || [];
|
|
var rowinfo = o.skipHidden && sheet["!rows"] || [];
|
|
for (var C = r.s.c; C <= r.e.c; ++C) {
|
|
if (!(colinfo[C] || {}).hidden) cols[C] = encode_col(C);
|
|
}
|
|
for (var R = r.s.r; R <= r.e.r; ++R) {
|
|
if ((rowinfo[R] || {}).hidden) continue;
|
|
row = make_csv_row(sheet, r, R, cols, fs, rs, FS, o);
|
|
if (row == null) {
|
|
continue;
|
|
}
|
|
if (o.strip) row = row.replace(endregex, "");
|
|
out.push(row + RS);
|
|
}
|
|
delete o.dense;
|
|
return out.join("");
|
|
}
|
|
function sheet_to_txt(sheet, opts) {
|
|
if (!opts) opts = {};
|
|
opts.FS = "\t";
|
|
opts.RS = "\n";
|
|
var s = sheet_to_csv(sheet, opts);
|
|
if (typeof cptable == 'undefined' || opts.type == 'string') return s;
|
|
var o = cptable.utils.encode(1200, s, 'str');
|
|
return String.fromCharCode(255) + String.fromCharCode(254) + o;
|
|
}
|
|
function sheet_to_formulae(sheet) {
|
|
var y = "",
|
|
x,
|
|
val = "";
|
|
if (sheet == null || sheet["!ref"] == null) return [];
|
|
var r = safe_decode_range(sheet['!ref']),
|
|
rr = "",
|
|
cols = [],
|
|
C;
|
|
var cmds = [];
|
|
var dense = Array.isArray(sheet);
|
|
for (C = r.s.c; C <= r.e.c; ++C) {
|
|
cols[C] = encode_col(C);
|
|
}
|
|
for (var R = r.s.r; R <= r.e.r; ++R) {
|
|
rr = encode_row(R);
|
|
for (C = r.s.c; C <= r.e.c; ++C) {
|
|
y = cols[C] + rr;
|
|
x = dense ? (sheet[R] || [])[C] : sheet[y];
|
|
val = "";
|
|
if (x === undefined) continue;else if (x.F != null) {
|
|
y = x.F;
|
|
if (!x.f) continue;
|
|
val = x.f;
|
|
if (y.indexOf(":") == -1) y = y + ":" + y;
|
|
}
|
|
if (x.f != null) val = x.f;else if (x.t == 'z') continue;else if (x.t == 'n' && x.v != null) val = "" + x.v;else if (x.t == 'b') val = x.v ? "TRUE" : "FALSE";else if (x.w !== undefined) val = "'" + x.w;else if (x.v === undefined) continue;else if (x.t == 's') val = "'" + x.v;else val = "" + x.v;
|
|
cmds[cmds.length] = y + "=" + val;
|
|
}
|
|
}
|
|
return cmds;
|
|
}
|
|
function sheet_add_json(_ws, js, opts) {
|
|
var o = opts || {};
|
|
var offset = +!o.skipHeader;
|
|
var ws = _ws || {};
|
|
var _R = 0,
|
|
_C = 0;
|
|
if (ws && o.origin != null) {
|
|
if (typeof o.origin == 'number') _R = o.origin;else {
|
|
var _origin = typeof o.origin == "string" ? decode_cell(o.origin) : o.origin;
|
|
_R = _origin.r;
|
|
_C = _origin.c;
|
|
}
|
|
}
|
|
var cell;
|
|
var range = {
|
|
s: {
|
|
c: 0,
|
|
r: 0
|
|
},
|
|
e: {
|
|
c: _C,
|
|
r: _R + js.length - 1 + offset
|
|
}
|
|
};
|
|
if (ws['!ref']) {
|
|
var _range = safe_decode_range(ws['!ref']);
|
|
range.e.c = Math.max(range.e.c, _range.e.c);
|
|
range.e.r = Math.max(range.e.r, _range.e.r);
|
|
if (_R == -1) {
|
|
_R = _range.e.r + 1;
|
|
range.e.r = _R + js.length - 1 + offset;
|
|
}
|
|
} else {
|
|
if (_R == -1) {
|
|
_R = 0;
|
|
range.e.r = js.length - 1 + offset;
|
|
}
|
|
}
|
|
var hdr = o.header || [],
|
|
C = 0;
|
|
js.forEach(function (JS, R) {
|
|
keys(JS).forEach(function (k) {
|
|
if ((C = hdr.indexOf(k)) == -1) hdr[C = hdr.length] = k;
|
|
var v = JS[k];
|
|
var t = 'z';
|
|
var z = "";
|
|
var ref = encode_cell({
|
|
c: _C + C,
|
|
r: _R + R + offset
|
|
});
|
|
cell = utils.sheet_get_cell(ws, ref);
|
|
if (v && _typeof(v) === 'object' && !(v instanceof Date)) {
|
|
ws[ref] = v;
|
|
} else {
|
|
if (typeof v == 'number') t = 'n';else if (typeof v == 'boolean') t = 'b';else if (typeof v == 'string') t = 's';else if (v instanceof Date) {
|
|
t = 'd';
|
|
if (!o.cellDates) {
|
|
t = 'n';
|
|
v = datenum(v);
|
|
}
|
|
z = o.dateNF || SSF._table[14];
|
|
} else if (v === null && o.nullError) {
|
|
t = 'e';
|
|
v = 0;
|
|
}
|
|
if (!cell) ws[ref] = cell = {
|
|
t: t,
|
|
v: v
|
|
};else {
|
|
cell.t = t;
|
|
cell.v = v;
|
|
delete cell.w;
|
|
delete cell.R;
|
|
if (z) cell.z = z;
|
|
}
|
|
if (z) cell.z = z;
|
|
}
|
|
});
|
|
});
|
|
range.e.c = Math.max(range.e.c, _C + hdr.length - 1);
|
|
var __R = encode_row(_R);
|
|
if (offset) for (C = 0; C < hdr.length; ++C) {
|
|
ws[encode_col(C + _C) + __R] = {
|
|
t: 's',
|
|
v: hdr[C]
|
|
};
|
|
}
|
|
ws['!ref'] = encode_range(range);
|
|
return ws;
|
|
}
|
|
function json_to_sheet(js, opts) {
|
|
return sheet_add_json(null, js, opts);
|
|
}
|
|
var utils = {
|
|
encode_col: encode_col,
|
|
encode_row: encode_row,
|
|
encode_cell: encode_cell,
|
|
encode_range: encode_range,
|
|
decode_col: decode_col,
|
|
decode_row: decode_row,
|
|
split_cell: split_cell,
|
|
decode_cell: decode_cell,
|
|
decode_range: decode_range,
|
|
format_cell: format_cell,
|
|
get_formulae: sheet_to_formulae,
|
|
make_csv: sheet_to_csv,
|
|
make_json: sheet_to_json,
|
|
make_formulae: sheet_to_formulae,
|
|
sheet_add_aoa: sheet_add_aoa,
|
|
sheet_add_json: sheet_add_json,
|
|
sheet_add_dom: sheet_add_dom,
|
|
aoa_to_sheet: aoa_to_sheet,
|
|
json_to_sheet: json_to_sheet,
|
|
table_to_sheet: parse_dom_table,
|
|
table_to_book: table_to_book,
|
|
sheet_to_csv: sheet_to_csv,
|
|
sheet_to_txt: sheet_to_txt,
|
|
sheet_to_json: sheet_to_json,
|
|
sheet_to_html: HTML_.from_sheet,
|
|
sheet_to_formulae: sheet_to_formulae,
|
|
sheet_to_row_object_array: sheet_to_json
|
|
};
|
|
(function (utils) {
|
|
utils.consts = utils.consts || {};
|
|
function add_consts(R /*Array<any>*/) {
|
|
R.forEach(function (a) {
|
|
utils.consts[a[0]] = a[1];
|
|
});
|
|
}
|
|
function get_default(x, y, z) {
|
|
return x[y] != null ? x[y] : x[y] = z;
|
|
}
|
|
|
|
/* get cell, creating a stub if necessary */
|
|
function ws_get_cell_stub(ws, R, C) {
|
|
/* A1 cell address */
|
|
if (typeof R == "string") {
|
|
/* dense */
|
|
if (Array.isArray(ws)) {
|
|
var RC = decode_cell(R);
|
|
if (!ws[RC.r]) ws[RC.r] = [];
|
|
return ws[RC.r][RC.c] || (ws[RC.r][RC.c] = {
|
|
t: 'z'
|
|
});
|
|
}
|
|
return ws[R] || (ws[R] = {
|
|
t: 'z'
|
|
});
|
|
}
|
|
/* cell address object */
|
|
if (typeof R != "number") return ws_get_cell_stub(ws, encode_cell(R));
|
|
/* R and C are 0-based indices */
|
|
return ws_get_cell_stub(ws, encode_cell({
|
|
r: R,
|
|
c: C || 0
|
|
}));
|
|
}
|
|
utils.sheet_get_cell = ws_get_cell_stub;
|
|
|
|
/* find sheet index for given name / validate index */
|
|
function wb_sheet_idx(wb, sh) {
|
|
if (typeof sh == "number") {
|
|
if (sh >= 0 && wb.SheetNames.length > sh) return sh;
|
|
throw new Error("Cannot find sheet # " + sh);
|
|
} else if (typeof sh == "string") {
|
|
var idx = wb.SheetNames.indexOf(sh);
|
|
if (idx > -1) return idx;
|
|
throw new Error("Cannot find sheet name |" + sh + "|");
|
|
} else throw new Error("Cannot find sheet |" + sh + "|");
|
|
}
|
|
|
|
/* simple blank workbook object */
|
|
utils.book_new = function () {
|
|
return {
|
|
SheetNames: [],
|
|
Sheets: {}
|
|
};
|
|
};
|
|
|
|
/* add a worksheet to the end of a given workbook */
|
|
utils.book_append_sheet = function (wb, ws, name) {
|
|
if (!name) for (var i = 1; i <= 0xFFFF; ++i, name = undefined) {
|
|
if (wb.SheetNames.indexOf(name = "Sheet" + i) == -1) break;
|
|
}
|
|
if (!name || wb.SheetNames.length >= 0xFFFF) throw new Error("Too many worksheets");
|
|
check_ws_name(name);
|
|
if (wb.SheetNames.indexOf(name) >= 0) throw new Error("Worksheet with name |" + name + "| already exists!");
|
|
wb.SheetNames.push(name);
|
|
wb.Sheets[name] = ws;
|
|
};
|
|
|
|
/* set sheet visibility (visible/hidden/very hidden) */
|
|
utils.book_set_sheet_visibility = function (wb, sh, vis) {
|
|
get_default(wb, "Workbook", {});
|
|
get_default(wb.Workbook, "Sheets", []);
|
|
var idx = wb_sheet_idx(wb, sh);
|
|
// $FlowIgnore
|
|
get_default(wb.Workbook.Sheets, idx, {});
|
|
switch (vis) {
|
|
case 0:
|
|
case 1:
|
|
case 2:
|
|
break;
|
|
default:
|
|
throw new Error("Bad sheet visibility setting " + vis);
|
|
}
|
|
// $FlowIgnore
|
|
wb.Workbook.Sheets[idx].Hidden = vis;
|
|
};
|
|
add_consts([["SHEET_VISIBLE", 0], ["SHEET_HIDDEN", 1], ["SHEET_VERY_HIDDEN", 2]]);
|
|
|
|
/* set number format */
|
|
utils.cell_set_number_format = function (cell, fmt) {
|
|
cell.z = fmt;
|
|
return cell;
|
|
};
|
|
|
|
/* set cell hyperlink */
|
|
utils.cell_set_hyperlink = function (cell, target, tooltip) {
|
|
if (!target) {
|
|
delete cell.l;
|
|
} else {
|
|
cell.l = {
|
|
Target: target
|
|
};
|
|
if (tooltip) cell.l.Tooltip = tooltip;
|
|
}
|
|
return cell;
|
|
};
|
|
utils.cell_set_internal_link = function (cell, range, tooltip) {
|
|
return utils.cell_set_hyperlink(cell, "#" + range, tooltip);
|
|
};
|
|
|
|
/* add to cell comments */
|
|
utils.cell_add_comment = function (cell, text, author) {
|
|
if (!cell.c) cell.c = [];
|
|
cell.c.push({
|
|
t: text,
|
|
a: author || "SheetJS"
|
|
});
|
|
};
|
|
|
|
/* set array formula and flush related cells */
|
|
utils.sheet_set_array_formula = function (ws, range, formula) {
|
|
var rng = typeof range != "string" ? range : safe_decode_range(range);
|
|
var rngstr = typeof range == "string" ? range : encode_range(range);
|
|
for (var R = rng.s.r; R <= rng.e.r; ++R) {
|
|
for (var C = rng.s.c; C <= rng.e.c; ++C) {
|
|
var cell = ws_get_cell_stub(ws, R, C);
|
|
cell.t = 'n';
|
|
cell.F = rngstr;
|
|
delete cell.v;
|
|
if (R == rng.s.r && C == rng.s.c) cell.f = formula;
|
|
}
|
|
}
|
|
return ws;
|
|
};
|
|
return utils;
|
|
})(utils);
|
|
if (typeof parse_xlscfb !== "undefined") XLSX.parse_xlscfb = parse_xlscfb;
|
|
XLSX.parse_zip = parse_zip;
|
|
XLSX.read = readSync; //xlsread
|
|
XLSX.readFile = readFileSync; //readFile
|
|
XLSX.readFileSync = readFileSync;
|
|
XLSX.write = writeSync;
|
|
XLSX.writeFile = writeFileSync;
|
|
XLSX.writeFileSync = writeFileSync;
|
|
XLSX.writeFileAsync = writeFileAsync;
|
|
XLSX.utils = utils;
|
|
XLSX.SSF = SSF;
|
|
XLSX.excel_exprot = excel_exprot;
|
|
if (typeof CFB !== "undefined") XLSX.CFB = CFB;
|
|
var fs = wx.getFileSystemManager(); //获取全局唯一的文件管理器
|
|
function excel_exprot(data, header, headerName, fileName) {
|
|
var wopts = {
|
|
bookType: 'xlsx',
|
|
bookSST: false,
|
|
type: 'binary'
|
|
};
|
|
var workBook = {
|
|
SheetNames: ['Sheet1'],
|
|
Sheets: {},
|
|
Props: {}
|
|
};
|
|
dell();
|
|
var newData = [headerName].concat(_toConsumableArray(data));
|
|
// 1.XLSX.utils.json_to_sheet(data)接受一个对象数组并返回一个基于对象关键字自动生成的“标题”的工作表
|
|
//默认的列顺序由使用Object.keys的字段的第一次出现确定
|
|
// 2.将数据放入对象workBook的Sheets中等待输出
|
|
//加了一句skipHeader:true,这样就会忽略原来的表头
|
|
workBook.Sheets['Sheet1'] = XLSX.utils.json_to_sheet(newData, {
|
|
header: header,
|
|
skipHeader: true
|
|
});
|
|
// 3.XLSX.write()开始编写Excel表格
|
|
// 4.changeData()将数据处理成需要的输出的格式
|
|
// console.log(this.changeData(XLSX.write(workBook, wopts)))
|
|
var time = new Date().getTime();
|
|
var StrData = changeData(XLSX.write(workBook, wopts));
|
|
fs.writeFile({
|
|
filePath: wx.env.USER_DATA_PATH + "/".concat(fileName + time, ".xlsx"),
|
|
// wx.env.USER_DATA_PATH 指定临时文件存入的路径,后面字符串自定义
|
|
data: StrData,
|
|
encoding: 'binary',
|
|
//二进制流文件必须是 binary
|
|
success: function success(res) {
|
|
uni.hideLoading();
|
|
wx.openDocument({
|
|
// 打开文档
|
|
filePath: wx.env.USER_DATA_PATH + "/".concat(fileName + time, ".xlsx"),
|
|
//拿上面存入的文件路径
|
|
showMenu: true,
|
|
// 显示右上角菜单
|
|
success: function success(res) {},
|
|
fail: function fail() {
|
|
uni.showToast({
|
|
title: "\u6253\u5F00\u5931\u8D25",
|
|
icon: 'error',
|
|
duration: 2000
|
|
});
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
function changeData(s) {
|
|
//如果存在ArrayBuffer对象(es6)最好采用该对象
|
|
if (typeof ArrayBuffer !== 'undefined') {
|
|
//1.创建一个字节长度为s.length的内存区域
|
|
var buf = new ArrayBuffer(s.length);
|
|
//2.创建一个指向buf的Unit8视图,开始于字节0,直到缓冲区的末尾
|
|
var view = new Uint8Array(buf);
|
|
//3.返回指定位置的字符的Unicode编码
|
|
for (var _i2 = 0; _i2 != s.length; ++_i2) {
|
|
view[_i2] = s.charCodeAt(_i2) & 0xff;
|
|
}
|
|
return buf;
|
|
} else {
|
|
var _buf = new Array(s.length);
|
|
for (var _i3 = 0; _i3 != s.length; ++_i3) {
|
|
_buf[_i3] = s.charCodeAt(_i3) & 0xff;
|
|
}
|
|
return _buf;
|
|
}
|
|
}
|
|
|
|
//删除缓存文件
|
|
function dell() {
|
|
fs.readdir({
|
|
dirPath: wx.env.USER_DATA_PATH,
|
|
success: function success(res) {
|
|
console.log("文件列表", res);
|
|
var indexVal = res.files.length;
|
|
res.files.forEach(function (el) {
|
|
var name = (wx.env.USER_DATA_PATH + el).replace(/usr/g, "usr/");
|
|
fs.unlink({
|
|
filePath: name,
|
|
fail: function fail(e) {
|
|
console.log('文件删除失败:', e);
|
|
},
|
|
success: function success(succ) {
|
|
indexVal++;
|
|
if (indexVal == 0) {}
|
|
console.log('文件删除成功:', succ);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
});
|
|
}
|
|
};
|
|
/*global define */
|
|
if (true) make_xlsx_lib(exports);else {}
|
|
/* NOTE: the following extra line is needed for "Lightning Locker Service" */
|
|
if (typeof window !== 'undefined' && !window.XLSX) try {
|
|
window.XLSX = XLSX;
|
|
} catch (e) {}
|
|
/*exported XLS, ODS */
|
|
var XLS = XLSX,
|
|
ODS = XLSX;
|
|
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/buffer/index.js */ 72).Buffer, __webpack_require__(/*! ./node_modules/node-libs-browser/mock/process.js */ 76), __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-weixin/dist/wx.js */ 1)["default"], __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-weixin/dist/index.js */ 2)["default"]))
|
|
|
|
/***/ }),
|
|
|
|
/***/ 72:
|
|
/*!**************************************!*\
|
|
!*** ./node_modules/buffer/index.js ***!
|
|
\**************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(global) {/*!
|
|
* The buffer module from node.js, for the browser.
|
|
*
|
|
* @author Feross Aboukhadijeh <http://feross.org>
|
|
* @license MIT
|
|
*/
|
|
/* eslint-disable no-proto */
|
|
|
|
|
|
|
|
var base64 = __webpack_require__(/*! base64-js */ 73)
|
|
var ieee754 = __webpack_require__(/*! ieee754 */ 74)
|
|
var isArray = __webpack_require__(/*! isarray */ 75)
|
|
|
|
exports.Buffer = Buffer
|
|
exports.SlowBuffer = SlowBuffer
|
|
exports.INSPECT_MAX_BYTES = 50
|
|
|
|
/**
|
|
* If `Buffer.TYPED_ARRAY_SUPPORT`:
|
|
* === true Use Uint8Array implementation (fastest)
|
|
* === false Use Object implementation (most compatible, even IE6)
|
|
*
|
|
* Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
|
|
* Opera 11.6+, iOS 4.2+.
|
|
*
|
|
* Due to various browser bugs, sometimes the Object implementation will be used even
|
|
* when the browser supports typed arrays.
|
|
*
|
|
* Note:
|
|
*
|
|
* - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
|
|
* See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
|
|
*
|
|
* - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
|
|
*
|
|
* - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
|
|
* incorrect length in some situations.
|
|
|
|
* We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
|
|
* get the Object implementation, which is slower but behaves correctly.
|
|
*/
|
|
Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined
|
|
? global.TYPED_ARRAY_SUPPORT
|
|
: typedArraySupport()
|
|
|
|
/*
|
|
* Export kMaxLength after typed array support is determined.
|
|
*/
|
|
exports.kMaxLength = kMaxLength()
|
|
|
|
function typedArraySupport () {
|
|
try {
|
|
var arr = new Uint8Array(1)
|
|
arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}
|
|
return arr.foo() === 42 && // typed array instances can be augmented
|
|
typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
|
|
arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
|
|
} catch (e) {
|
|
return false
|
|
}
|
|
}
|
|
|
|
function kMaxLength () {
|
|
return Buffer.TYPED_ARRAY_SUPPORT
|
|
? 0x7fffffff
|
|
: 0x3fffffff
|
|
}
|
|
|
|
function createBuffer (that, length) {
|
|
if (kMaxLength() < length) {
|
|
throw new RangeError('Invalid typed array length')
|
|
}
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
// Return an augmented `Uint8Array` instance, for best performance
|
|
that = new Uint8Array(length)
|
|
that.__proto__ = Buffer.prototype
|
|
} else {
|
|
// Fallback: Return an object instance of the Buffer class
|
|
if (that === null) {
|
|
that = new Buffer(length)
|
|
}
|
|
that.length = length
|
|
}
|
|
|
|
return that
|
|
}
|
|
|
|
/**
|
|
* The Buffer constructor returns instances of `Uint8Array` that have their
|
|
* prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
|
|
* `Uint8Array`, so the returned instances will have all the node `Buffer` methods
|
|
* and the `Uint8Array` methods. Square bracket notation works as expected -- it
|
|
* returns a single octet.
|
|
*
|
|
* The `Uint8Array` prototype remains unmodified.
|
|
*/
|
|
|
|
function Buffer (arg, encodingOrOffset, length) {
|
|
if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {
|
|
return new Buffer(arg, encodingOrOffset, length)
|
|
}
|
|
|
|
// Common case.
|
|
if (typeof arg === 'number') {
|
|
if (typeof encodingOrOffset === 'string') {
|
|
throw new Error(
|
|
'If encoding is specified then the first argument must be a string'
|
|
)
|
|
}
|
|
return allocUnsafe(this, arg)
|
|
}
|
|
return from(this, arg, encodingOrOffset, length)
|
|
}
|
|
|
|
Buffer.poolSize = 8192 // not used by this implementation
|
|
|
|
// TODO: Legacy, not needed anymore. Remove in next major version.
|
|
Buffer._augment = function (arr) {
|
|
arr.__proto__ = Buffer.prototype
|
|
return arr
|
|
}
|
|
|
|
function from (that, value, encodingOrOffset, length) {
|
|
if (typeof value === 'number') {
|
|
throw new TypeError('"value" argument must not be a number')
|
|
}
|
|
|
|
if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
|
|
return fromArrayBuffer(that, value, encodingOrOffset, length)
|
|
}
|
|
|
|
if (typeof value === 'string') {
|
|
return fromString(that, value, encodingOrOffset)
|
|
}
|
|
|
|
return fromObject(that, value)
|
|
}
|
|
|
|
/**
|
|
* Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
|
|
* if value is a number.
|
|
* Buffer.from(str[, encoding])
|
|
* Buffer.from(array)
|
|
* Buffer.from(buffer)
|
|
* Buffer.from(arrayBuffer[, byteOffset[, length]])
|
|
**/
|
|
Buffer.from = function (value, encodingOrOffset, length) {
|
|
return from(null, value, encodingOrOffset, length)
|
|
}
|
|
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
Buffer.prototype.__proto__ = Uint8Array.prototype
|
|
Buffer.__proto__ = Uint8Array
|
|
if (typeof Symbol !== 'undefined' && Symbol.species &&
|
|
Buffer[Symbol.species] === Buffer) {
|
|
// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
|
|
Object.defineProperty(Buffer, Symbol.species, {
|
|
value: null,
|
|
configurable: true
|
|
})
|
|
}
|
|
}
|
|
|
|
function assertSize (size) {
|
|
if (typeof size !== 'number') {
|
|
throw new TypeError('"size" argument must be a number')
|
|
} else if (size < 0) {
|
|
throw new RangeError('"size" argument must not be negative')
|
|
}
|
|
}
|
|
|
|
function alloc (that, size, fill, encoding) {
|
|
assertSize(size)
|
|
if (size <= 0) {
|
|
return createBuffer(that, size)
|
|
}
|
|
if (fill !== undefined) {
|
|
// Only pay attention to encoding if it's a string. This
|
|
// prevents accidentally sending in a number that would
|
|
// be interpretted as a start offset.
|
|
return typeof encoding === 'string'
|
|
? createBuffer(that, size).fill(fill, encoding)
|
|
: createBuffer(that, size).fill(fill)
|
|
}
|
|
return createBuffer(that, size)
|
|
}
|
|
|
|
/**
|
|
* Creates a new filled Buffer instance.
|
|
* alloc(size[, fill[, encoding]])
|
|
**/
|
|
Buffer.alloc = function (size, fill, encoding) {
|
|
return alloc(null, size, fill, encoding)
|
|
}
|
|
|
|
function allocUnsafe (that, size) {
|
|
assertSize(size)
|
|
that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)
|
|
if (!Buffer.TYPED_ARRAY_SUPPORT) {
|
|
for (var i = 0; i < size; ++i) {
|
|
that[i] = 0
|
|
}
|
|
}
|
|
return that
|
|
}
|
|
|
|
/**
|
|
* Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
|
|
* */
|
|
Buffer.allocUnsafe = function (size) {
|
|
return allocUnsafe(null, size)
|
|
}
|
|
/**
|
|
* Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
|
|
*/
|
|
Buffer.allocUnsafeSlow = function (size) {
|
|
return allocUnsafe(null, size)
|
|
}
|
|
|
|
function fromString (that, string, encoding) {
|
|
if (typeof encoding !== 'string' || encoding === '') {
|
|
encoding = 'utf8'
|
|
}
|
|
|
|
if (!Buffer.isEncoding(encoding)) {
|
|
throw new TypeError('"encoding" must be a valid string encoding')
|
|
}
|
|
|
|
var length = byteLength(string, encoding) | 0
|
|
that = createBuffer(that, length)
|
|
|
|
var actual = that.write(string, encoding)
|
|
|
|
if (actual !== length) {
|
|
// Writing a hex string, for example, that contains invalid characters will
|
|
// cause everything after the first invalid character to be ignored. (e.g.
|
|
// 'abxxcd' will be treated as 'ab')
|
|
that = that.slice(0, actual)
|
|
}
|
|
|
|
return that
|
|
}
|
|
|
|
function fromArrayLike (that, array) {
|
|
var length = array.length < 0 ? 0 : checked(array.length) | 0
|
|
that = createBuffer(that, length)
|
|
for (var i = 0; i < length; i += 1) {
|
|
that[i] = array[i] & 255
|
|
}
|
|
return that
|
|
}
|
|
|
|
function fromArrayBuffer (that, array, byteOffset, length) {
|
|
array.byteLength // this throws if `array` is not a valid ArrayBuffer
|
|
|
|
if (byteOffset < 0 || array.byteLength < byteOffset) {
|
|
throw new RangeError('\'offset\' is out of bounds')
|
|
}
|
|
|
|
if (array.byteLength < byteOffset + (length || 0)) {
|
|
throw new RangeError('\'length\' is out of bounds')
|
|
}
|
|
|
|
if (byteOffset === undefined && length === undefined) {
|
|
array = new Uint8Array(array)
|
|
} else if (length === undefined) {
|
|
array = new Uint8Array(array, byteOffset)
|
|
} else {
|
|
array = new Uint8Array(array, byteOffset, length)
|
|
}
|
|
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
// Return an augmented `Uint8Array` instance, for best performance
|
|
that = array
|
|
that.__proto__ = Buffer.prototype
|
|
} else {
|
|
// Fallback: Return an object instance of the Buffer class
|
|
that = fromArrayLike(that, array)
|
|
}
|
|
return that
|
|
}
|
|
|
|
function fromObject (that, obj) {
|
|
if (Buffer.isBuffer(obj)) {
|
|
var len = checked(obj.length) | 0
|
|
that = createBuffer(that, len)
|
|
|
|
if (that.length === 0) {
|
|
return that
|
|
}
|
|
|
|
obj.copy(that, 0, 0, len)
|
|
return that
|
|
}
|
|
|
|
if (obj) {
|
|
if ((typeof ArrayBuffer !== 'undefined' &&
|
|
obj.buffer instanceof ArrayBuffer) || 'length' in obj) {
|
|
if (typeof obj.length !== 'number' || isnan(obj.length)) {
|
|
return createBuffer(that, 0)
|
|
}
|
|
return fromArrayLike(that, obj)
|
|
}
|
|
|
|
if (obj.type === 'Buffer' && isArray(obj.data)) {
|
|
return fromArrayLike(that, obj.data)
|
|
}
|
|
}
|
|
|
|
throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')
|
|
}
|
|
|
|
function checked (length) {
|
|
// Note: cannot use `length < kMaxLength()` here because that fails when
|
|
// length is NaN (which is otherwise coerced to zero.)
|
|
if (length >= kMaxLength()) {
|
|
throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
|
|
'size: 0x' + kMaxLength().toString(16) + ' bytes')
|
|
}
|
|
return length | 0
|
|
}
|
|
|
|
function SlowBuffer (length) {
|
|
if (+length != length) { // eslint-disable-line eqeqeq
|
|
length = 0
|
|
}
|
|
return Buffer.alloc(+length)
|
|
}
|
|
|
|
Buffer.isBuffer = function isBuffer (b) {
|
|
return !!(b != null && b._isBuffer)
|
|
}
|
|
|
|
Buffer.compare = function compare (a, b) {
|
|
if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
|
|
throw new TypeError('Arguments must be Buffers')
|
|
}
|
|
|
|
if (a === b) return 0
|
|
|
|
var x = a.length
|
|
var y = b.length
|
|
|
|
for (var i = 0, len = Math.min(x, y); i < len; ++i) {
|
|
if (a[i] !== b[i]) {
|
|
x = a[i]
|
|
y = b[i]
|
|
break
|
|
}
|
|
}
|
|
|
|
if (x < y) return -1
|
|
if (y < x) return 1
|
|
return 0
|
|
}
|
|
|
|
Buffer.isEncoding = function isEncoding (encoding) {
|
|
switch (String(encoding).toLowerCase()) {
|
|
case 'hex':
|
|
case 'utf8':
|
|
case 'utf-8':
|
|
case 'ascii':
|
|
case 'latin1':
|
|
case 'binary':
|
|
case 'base64':
|
|
case 'ucs2':
|
|
case 'ucs-2':
|
|
case 'utf16le':
|
|
case 'utf-16le':
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
Buffer.concat = function concat (list, length) {
|
|
if (!isArray(list)) {
|
|
throw new TypeError('"list" argument must be an Array of Buffers')
|
|
}
|
|
|
|
if (list.length === 0) {
|
|
return Buffer.alloc(0)
|
|
}
|
|
|
|
var i
|
|
if (length === undefined) {
|
|
length = 0
|
|
for (i = 0; i < list.length; ++i) {
|
|
length += list[i].length
|
|
}
|
|
}
|
|
|
|
var buffer = Buffer.allocUnsafe(length)
|
|
var pos = 0
|
|
for (i = 0; i < list.length; ++i) {
|
|
var buf = list[i]
|
|
if (!Buffer.isBuffer(buf)) {
|
|
throw new TypeError('"list" argument must be an Array of Buffers')
|
|
}
|
|
buf.copy(buffer, pos)
|
|
pos += buf.length
|
|
}
|
|
return buffer
|
|
}
|
|
|
|
function byteLength (string, encoding) {
|
|
if (Buffer.isBuffer(string)) {
|
|
return string.length
|
|
}
|
|
if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&
|
|
(ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {
|
|
return string.byteLength
|
|
}
|
|
if (typeof string !== 'string') {
|
|
string = '' + string
|
|
}
|
|
|
|
var len = string.length
|
|
if (len === 0) return 0
|
|
|
|
// Use a for loop to avoid recursion
|
|
var loweredCase = false
|
|
for (;;) {
|
|
switch (encoding) {
|
|
case 'ascii':
|
|
case 'latin1':
|
|
case 'binary':
|
|
return len
|
|
case 'utf8':
|
|
case 'utf-8':
|
|
case undefined:
|
|
return utf8ToBytes(string).length
|
|
case 'ucs2':
|
|
case 'ucs-2':
|
|
case 'utf16le':
|
|
case 'utf-16le':
|
|
return len * 2
|
|
case 'hex':
|
|
return len >>> 1
|
|
case 'base64':
|
|
return base64ToBytes(string).length
|
|
default:
|
|
if (loweredCase) return utf8ToBytes(string).length // assume utf8
|
|
encoding = ('' + encoding).toLowerCase()
|
|
loweredCase = true
|
|
}
|
|
}
|
|
}
|
|
Buffer.byteLength = byteLength
|
|
|
|
function slowToString (encoding, start, end) {
|
|
var loweredCase = false
|
|
|
|
// No need to verify that "this.length <= MAX_UINT32" since it's a read-only
|
|
// property of a typed array.
|
|
|
|
// This behaves neither like String nor Uint8Array in that we set start/end
|
|
// to their upper/lower bounds if the value passed is out of range.
|
|
// undefined is handled specially as per ECMA-262 6th Edition,
|
|
// Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
|
|
if (start === undefined || start < 0) {
|
|
start = 0
|
|
}
|
|
// Return early if start > this.length. Done here to prevent potential uint32
|
|
// coercion fail below.
|
|
if (start > this.length) {
|
|
return ''
|
|
}
|
|
|
|
if (end === undefined || end > this.length) {
|
|
end = this.length
|
|
}
|
|
|
|
if (end <= 0) {
|
|
return ''
|
|
}
|
|
|
|
// Force coersion to uint32. This will also coerce falsey/NaN values to 0.
|
|
end >>>= 0
|
|
start >>>= 0
|
|
|
|
if (end <= start) {
|
|
return ''
|
|
}
|
|
|
|
if (!encoding) encoding = 'utf8'
|
|
|
|
while (true) {
|
|
switch (encoding) {
|
|
case 'hex':
|
|
return hexSlice(this, start, end)
|
|
|
|
case 'utf8':
|
|
case 'utf-8':
|
|
return utf8Slice(this, start, end)
|
|
|
|
case 'ascii':
|
|
return asciiSlice(this, start, end)
|
|
|
|
case 'latin1':
|
|
case 'binary':
|
|
return latin1Slice(this, start, end)
|
|
|
|
case 'base64':
|
|
return base64Slice(this, start, end)
|
|
|
|
case 'ucs2':
|
|
case 'ucs-2':
|
|
case 'utf16le':
|
|
case 'utf-16le':
|
|
return utf16leSlice(this, start, end)
|
|
|
|
default:
|
|
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
|
|
encoding = (encoding + '').toLowerCase()
|
|
loweredCase = true
|
|
}
|
|
}
|
|
}
|
|
|
|
// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect
|
|
// Buffer instances.
|
|
Buffer.prototype._isBuffer = true
|
|
|
|
function swap (b, n, m) {
|
|
var i = b[n]
|
|
b[n] = b[m]
|
|
b[m] = i
|
|
}
|
|
|
|
Buffer.prototype.swap16 = function swap16 () {
|
|
var len = this.length
|
|
if (len % 2 !== 0) {
|
|
throw new RangeError('Buffer size must be a multiple of 16-bits')
|
|
}
|
|
for (var i = 0; i < len; i += 2) {
|
|
swap(this, i, i + 1)
|
|
}
|
|
return this
|
|
}
|
|
|
|
Buffer.prototype.swap32 = function swap32 () {
|
|
var len = this.length
|
|
if (len % 4 !== 0) {
|
|
throw new RangeError('Buffer size must be a multiple of 32-bits')
|
|
}
|
|
for (var i = 0; i < len; i += 4) {
|
|
swap(this, i, i + 3)
|
|
swap(this, i + 1, i + 2)
|
|
}
|
|
return this
|
|
}
|
|
|
|
Buffer.prototype.swap64 = function swap64 () {
|
|
var len = this.length
|
|
if (len % 8 !== 0) {
|
|
throw new RangeError('Buffer size must be a multiple of 64-bits')
|
|
}
|
|
for (var i = 0; i < len; i += 8) {
|
|
swap(this, i, i + 7)
|
|
swap(this, i + 1, i + 6)
|
|
swap(this, i + 2, i + 5)
|
|
swap(this, i + 3, i + 4)
|
|
}
|
|
return this
|
|
}
|
|
|
|
Buffer.prototype.toString = function toString () {
|
|
var length = this.length | 0
|
|
if (length === 0) return ''
|
|
if (arguments.length === 0) return utf8Slice(this, 0, length)
|
|
return slowToString.apply(this, arguments)
|
|
}
|
|
|
|
Buffer.prototype.equals = function equals (b) {
|
|
if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
|
|
if (this === b) return true
|
|
return Buffer.compare(this, b) === 0
|
|
}
|
|
|
|
Buffer.prototype.inspect = function inspect () {
|
|
var str = ''
|
|
var max = exports.INSPECT_MAX_BYTES
|
|
if (this.length > 0) {
|
|
str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
|
|
if (this.length > max) str += ' ... '
|
|
}
|
|
return '<Buffer ' + str + '>'
|
|
}
|
|
|
|
Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
|
|
if (!Buffer.isBuffer(target)) {
|
|
throw new TypeError('Argument must be a Buffer')
|
|
}
|
|
|
|
if (start === undefined) {
|
|
start = 0
|
|
}
|
|
if (end === undefined) {
|
|
end = target ? target.length : 0
|
|
}
|
|
if (thisStart === undefined) {
|
|
thisStart = 0
|
|
}
|
|
if (thisEnd === undefined) {
|
|
thisEnd = this.length
|
|
}
|
|
|
|
if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
|
|
throw new RangeError('out of range index')
|
|
}
|
|
|
|
if (thisStart >= thisEnd && start >= end) {
|
|
return 0
|
|
}
|
|
if (thisStart >= thisEnd) {
|
|
return -1
|
|
}
|
|
if (start >= end) {
|
|
return 1
|
|
}
|
|
|
|
start >>>= 0
|
|
end >>>= 0
|
|
thisStart >>>= 0
|
|
thisEnd >>>= 0
|
|
|
|
if (this === target) return 0
|
|
|
|
var x = thisEnd - thisStart
|
|
var y = end - start
|
|
var len = Math.min(x, y)
|
|
|
|
var thisCopy = this.slice(thisStart, thisEnd)
|
|
var targetCopy = target.slice(start, end)
|
|
|
|
for (var i = 0; i < len; ++i) {
|
|
if (thisCopy[i] !== targetCopy[i]) {
|
|
x = thisCopy[i]
|
|
y = targetCopy[i]
|
|
break
|
|
}
|
|
}
|
|
|
|
if (x < y) return -1
|
|
if (y < x) return 1
|
|
return 0
|
|
}
|
|
|
|
// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
|
|
// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
|
|
//
|
|
// Arguments:
|
|
// - buffer - a Buffer to search
|
|
// - val - a string, Buffer, or number
|
|
// - byteOffset - an index into `buffer`; will be clamped to an int32
|
|
// - encoding - an optional encoding, relevant is val is a string
|
|
// - dir - true for indexOf, false for lastIndexOf
|
|
function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
|
|
// Empty buffer means no match
|
|
if (buffer.length === 0) return -1
|
|
|
|
// Normalize byteOffset
|
|
if (typeof byteOffset === 'string') {
|
|
encoding = byteOffset
|
|
byteOffset = 0
|
|
} else if (byteOffset > 0x7fffffff) {
|
|
byteOffset = 0x7fffffff
|
|
} else if (byteOffset < -0x80000000) {
|
|
byteOffset = -0x80000000
|
|
}
|
|
byteOffset = +byteOffset // Coerce to Number.
|
|
if (isNaN(byteOffset)) {
|
|
// byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
|
|
byteOffset = dir ? 0 : (buffer.length - 1)
|
|
}
|
|
|
|
// Normalize byteOffset: negative offsets start from the end of the buffer
|
|
if (byteOffset < 0) byteOffset = buffer.length + byteOffset
|
|
if (byteOffset >= buffer.length) {
|
|
if (dir) return -1
|
|
else byteOffset = buffer.length - 1
|
|
} else if (byteOffset < 0) {
|
|
if (dir) byteOffset = 0
|
|
else return -1
|
|
}
|
|
|
|
// Normalize val
|
|
if (typeof val === 'string') {
|
|
val = Buffer.from(val, encoding)
|
|
}
|
|
|
|
// Finally, search either indexOf (if dir is true) or lastIndexOf
|
|
if (Buffer.isBuffer(val)) {
|
|
// Special case: looking for empty string/buffer always fails
|
|
if (val.length === 0) {
|
|
return -1
|
|
}
|
|
return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
|
|
} else if (typeof val === 'number') {
|
|
val = val & 0xFF // Search for a byte value [0-255]
|
|
if (Buffer.TYPED_ARRAY_SUPPORT &&
|
|
typeof Uint8Array.prototype.indexOf === 'function') {
|
|
if (dir) {
|
|
return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
|
|
} else {
|
|
return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
|
|
}
|
|
}
|
|
return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
|
|
}
|
|
|
|
throw new TypeError('val must be string, number or Buffer')
|
|
}
|
|
|
|
function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
|
|
var indexSize = 1
|
|
var arrLength = arr.length
|
|
var valLength = val.length
|
|
|
|
if (encoding !== undefined) {
|
|
encoding = String(encoding).toLowerCase()
|
|
if (encoding === 'ucs2' || encoding === 'ucs-2' ||
|
|
encoding === 'utf16le' || encoding === 'utf-16le') {
|
|
if (arr.length < 2 || val.length < 2) {
|
|
return -1
|
|
}
|
|
indexSize = 2
|
|
arrLength /= 2
|
|
valLength /= 2
|
|
byteOffset /= 2
|
|
}
|
|
}
|
|
|
|
function read (buf, i) {
|
|
if (indexSize === 1) {
|
|
return buf[i]
|
|
} else {
|
|
return buf.readUInt16BE(i * indexSize)
|
|
}
|
|
}
|
|
|
|
var i
|
|
if (dir) {
|
|
var foundIndex = -1
|
|
for (i = byteOffset; i < arrLength; i++) {
|
|
if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
|
|
if (foundIndex === -1) foundIndex = i
|
|
if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
|
|
} else {
|
|
if (foundIndex !== -1) i -= i - foundIndex
|
|
foundIndex = -1
|
|
}
|
|
}
|
|
} else {
|
|
if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
|
|
for (i = byteOffset; i >= 0; i--) {
|
|
var found = true
|
|
for (var j = 0; j < valLength; j++) {
|
|
if (read(arr, i + j) !== read(val, j)) {
|
|
found = false
|
|
break
|
|
}
|
|
}
|
|
if (found) return i
|
|
}
|
|
}
|
|
|
|
return -1
|
|
}
|
|
|
|
Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
|
|
return this.indexOf(val, byteOffset, encoding) !== -1
|
|
}
|
|
|
|
Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
|
|
return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
|
|
}
|
|
|
|
Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
|
|
return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
|
|
}
|
|
|
|
function hexWrite (buf, string, offset, length) {
|
|
offset = Number(offset) || 0
|
|
var remaining = buf.length - offset
|
|
if (!length) {
|
|
length = remaining
|
|
} else {
|
|
length = Number(length)
|
|
if (length > remaining) {
|
|
length = remaining
|
|
}
|
|
}
|
|
|
|
// must be an even number of digits
|
|
var strLen = string.length
|
|
if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')
|
|
|
|
if (length > strLen / 2) {
|
|
length = strLen / 2
|
|
}
|
|
for (var i = 0; i < length; ++i) {
|
|
var parsed = parseInt(string.substr(i * 2, 2), 16)
|
|
if (isNaN(parsed)) return i
|
|
buf[offset + i] = parsed
|
|
}
|
|
return i
|
|
}
|
|
|
|
function utf8Write (buf, string, offset, length) {
|
|
return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
|
|
}
|
|
|
|
function asciiWrite (buf, string, offset, length) {
|
|
return blitBuffer(asciiToBytes(string), buf, offset, length)
|
|
}
|
|
|
|
function latin1Write (buf, string, offset, length) {
|
|
return asciiWrite(buf, string, offset, length)
|
|
}
|
|
|
|
function base64Write (buf, string, offset, length) {
|
|
return blitBuffer(base64ToBytes(string), buf, offset, length)
|
|
}
|
|
|
|
function ucs2Write (buf, string, offset, length) {
|
|
return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
|
|
}
|
|
|
|
Buffer.prototype.write = function write (string, offset, length, encoding) {
|
|
// Buffer#write(string)
|
|
if (offset === undefined) {
|
|
encoding = 'utf8'
|
|
length = this.length
|
|
offset = 0
|
|
// Buffer#write(string, encoding)
|
|
} else if (length === undefined && typeof offset === 'string') {
|
|
encoding = offset
|
|
length = this.length
|
|
offset = 0
|
|
// Buffer#write(string, offset[, length][, encoding])
|
|
} else if (isFinite(offset)) {
|
|
offset = offset | 0
|
|
if (isFinite(length)) {
|
|
length = length | 0
|
|
if (encoding === undefined) encoding = 'utf8'
|
|
} else {
|
|
encoding = length
|
|
length = undefined
|
|
}
|
|
// legacy write(string, encoding, offset, length) - remove in v0.13
|
|
} else {
|
|
throw new Error(
|
|
'Buffer.write(string, encoding, offset[, length]) is no longer supported'
|
|
)
|
|
}
|
|
|
|
var remaining = this.length - offset
|
|
if (length === undefined || length > remaining) length = remaining
|
|
|
|
if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
|
|
throw new RangeError('Attempt to write outside buffer bounds')
|
|
}
|
|
|
|
if (!encoding) encoding = 'utf8'
|
|
|
|
var loweredCase = false
|
|
for (;;) {
|
|
switch (encoding) {
|
|
case 'hex':
|
|
return hexWrite(this, string, offset, length)
|
|
|
|
case 'utf8':
|
|
case 'utf-8':
|
|
return utf8Write(this, string, offset, length)
|
|
|
|
case 'ascii':
|
|
return asciiWrite(this, string, offset, length)
|
|
|
|
case 'latin1':
|
|
case 'binary':
|
|
return latin1Write(this, string, offset, length)
|
|
|
|
case 'base64':
|
|
// Warning: maxLength not taken into account in base64Write
|
|
return base64Write(this, string, offset, length)
|
|
|
|
case 'ucs2':
|
|
case 'ucs-2':
|
|
case 'utf16le':
|
|
case 'utf-16le':
|
|
return ucs2Write(this, string, offset, length)
|
|
|
|
default:
|
|
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
|
|
encoding = ('' + encoding).toLowerCase()
|
|
loweredCase = true
|
|
}
|
|
}
|
|
}
|
|
|
|
Buffer.prototype.toJSON = function toJSON () {
|
|
return {
|
|
type: 'Buffer',
|
|
data: Array.prototype.slice.call(this._arr || this, 0)
|
|
}
|
|
}
|
|
|
|
function base64Slice (buf, start, end) {
|
|
if (start === 0 && end === buf.length) {
|
|
return base64.fromByteArray(buf)
|
|
} else {
|
|
return base64.fromByteArray(buf.slice(start, end))
|
|
}
|
|
}
|
|
|
|
function utf8Slice (buf, start, end) {
|
|
end = Math.min(buf.length, end)
|
|
var res = []
|
|
|
|
var i = start
|
|
while (i < end) {
|
|
var firstByte = buf[i]
|
|
var codePoint = null
|
|
var bytesPerSequence = (firstByte > 0xEF) ? 4
|
|
: (firstByte > 0xDF) ? 3
|
|
: (firstByte > 0xBF) ? 2
|
|
: 1
|
|
|
|
if (i + bytesPerSequence <= end) {
|
|
var secondByte, thirdByte, fourthByte, tempCodePoint
|
|
|
|
switch (bytesPerSequence) {
|
|
case 1:
|
|
if (firstByte < 0x80) {
|
|
codePoint = firstByte
|
|
}
|
|
break
|
|
case 2:
|
|
secondByte = buf[i + 1]
|
|
if ((secondByte & 0xC0) === 0x80) {
|
|
tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
|
|
if (tempCodePoint > 0x7F) {
|
|
codePoint = tempCodePoint
|
|
}
|
|
}
|
|
break
|
|
case 3:
|
|
secondByte = buf[i + 1]
|
|
thirdByte = buf[i + 2]
|
|
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
|
|
tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
|
|
if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
|
|
codePoint = tempCodePoint
|
|
}
|
|
}
|
|
break
|
|
case 4:
|
|
secondByte = buf[i + 1]
|
|
thirdByte = buf[i + 2]
|
|
fourthByte = buf[i + 3]
|
|
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
|
|
tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
|
|
if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
|
|
codePoint = tempCodePoint
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (codePoint === null) {
|
|
// we did not generate a valid codePoint so insert a
|
|
// replacement char (U+FFFD) and advance only 1 byte
|
|
codePoint = 0xFFFD
|
|
bytesPerSequence = 1
|
|
} else if (codePoint > 0xFFFF) {
|
|
// encode to utf16 (surrogate pair dance)
|
|
codePoint -= 0x10000
|
|
res.push(codePoint >>> 10 & 0x3FF | 0xD800)
|
|
codePoint = 0xDC00 | codePoint & 0x3FF
|
|
}
|
|
|
|
res.push(codePoint)
|
|
i += bytesPerSequence
|
|
}
|
|
|
|
return decodeCodePointsArray(res)
|
|
}
|
|
|
|
// Based on http://stackoverflow.com/a/22747272/680742, the browser with
|
|
// the lowest limit is Chrome, with 0x10000 args.
|
|
// We go 1 magnitude less, for safety
|
|
var MAX_ARGUMENTS_LENGTH = 0x1000
|
|
|
|
function decodeCodePointsArray (codePoints) {
|
|
var len = codePoints.length
|
|
if (len <= MAX_ARGUMENTS_LENGTH) {
|
|
return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
|
|
}
|
|
|
|
// Decode in chunks to avoid "call stack size exceeded".
|
|
var res = ''
|
|
var i = 0
|
|
while (i < len) {
|
|
res += String.fromCharCode.apply(
|
|
String,
|
|
codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
|
|
)
|
|
}
|
|
return res
|
|
}
|
|
|
|
function asciiSlice (buf, start, end) {
|
|
var ret = ''
|
|
end = Math.min(buf.length, end)
|
|
|
|
for (var i = start; i < end; ++i) {
|
|
ret += String.fromCharCode(buf[i] & 0x7F)
|
|
}
|
|
return ret
|
|
}
|
|
|
|
function latin1Slice (buf, start, end) {
|
|
var ret = ''
|
|
end = Math.min(buf.length, end)
|
|
|
|
for (var i = start; i < end; ++i) {
|
|
ret += String.fromCharCode(buf[i])
|
|
}
|
|
return ret
|
|
}
|
|
|
|
function hexSlice (buf, start, end) {
|
|
var len = buf.length
|
|
|
|
if (!start || start < 0) start = 0
|
|
if (!end || end < 0 || end > len) end = len
|
|
|
|
var out = ''
|
|
for (var i = start; i < end; ++i) {
|
|
out += toHex(buf[i])
|
|
}
|
|
return out
|
|
}
|
|
|
|
function utf16leSlice (buf, start, end) {
|
|
var bytes = buf.slice(start, end)
|
|
var res = ''
|
|
for (var i = 0; i < bytes.length; i += 2) {
|
|
res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
|
|
}
|
|
return res
|
|
}
|
|
|
|
Buffer.prototype.slice = function slice (start, end) {
|
|
var len = this.length
|
|
start = ~~start
|
|
end = end === undefined ? len : ~~end
|
|
|
|
if (start < 0) {
|
|
start += len
|
|
if (start < 0) start = 0
|
|
} else if (start > len) {
|
|
start = len
|
|
}
|
|
|
|
if (end < 0) {
|
|
end += len
|
|
if (end < 0) end = 0
|
|
} else if (end > len) {
|
|
end = len
|
|
}
|
|
|
|
if (end < start) end = start
|
|
|
|
var newBuf
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
newBuf = this.subarray(start, end)
|
|
newBuf.__proto__ = Buffer.prototype
|
|
} else {
|
|
var sliceLen = end - start
|
|
newBuf = new Buffer(sliceLen, undefined)
|
|
for (var i = 0; i < sliceLen; ++i) {
|
|
newBuf[i] = this[i + start]
|
|
}
|
|
}
|
|
|
|
return newBuf
|
|
}
|
|
|
|
/*
|
|
* Need to make sure that buffer isn't trying to write out of bounds.
|
|
*/
|
|
function checkOffset (offset, ext, length) {
|
|
if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
|
|
if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
|
|
}
|
|
|
|
Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
|
|
offset = offset | 0
|
|
byteLength = byteLength | 0
|
|
if (!noAssert) checkOffset(offset, byteLength, this.length)
|
|
|
|
var val = this[offset]
|
|
var mul = 1
|
|
var i = 0
|
|
while (++i < byteLength && (mul *= 0x100)) {
|
|
val += this[offset + i] * mul
|
|
}
|
|
|
|
return val
|
|
}
|
|
|
|
Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
|
|
offset = offset | 0
|
|
byteLength = byteLength | 0
|
|
if (!noAssert) {
|
|
checkOffset(offset, byteLength, this.length)
|
|
}
|
|
|
|
var val = this[offset + --byteLength]
|
|
var mul = 1
|
|
while (byteLength > 0 && (mul *= 0x100)) {
|
|
val += this[offset + --byteLength] * mul
|
|
}
|
|
|
|
return val
|
|
}
|
|
|
|
Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 1, this.length)
|
|
return this[offset]
|
|
}
|
|
|
|
Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 2, this.length)
|
|
return this[offset] | (this[offset + 1] << 8)
|
|
}
|
|
|
|
Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 2, this.length)
|
|
return (this[offset] << 8) | this[offset + 1]
|
|
}
|
|
|
|
Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 4, this.length)
|
|
|
|
return ((this[offset]) |
|
|
(this[offset + 1] << 8) |
|
|
(this[offset + 2] << 16)) +
|
|
(this[offset + 3] * 0x1000000)
|
|
}
|
|
|
|
Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 4, this.length)
|
|
|
|
return (this[offset] * 0x1000000) +
|
|
((this[offset + 1] << 16) |
|
|
(this[offset + 2] << 8) |
|
|
this[offset + 3])
|
|
}
|
|
|
|
Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
|
|
offset = offset | 0
|
|
byteLength = byteLength | 0
|
|
if (!noAssert) checkOffset(offset, byteLength, this.length)
|
|
|
|
var val = this[offset]
|
|
var mul = 1
|
|
var i = 0
|
|
while (++i < byteLength && (mul *= 0x100)) {
|
|
val += this[offset + i] * mul
|
|
}
|
|
mul *= 0x80
|
|
|
|
if (val >= mul) val -= Math.pow(2, 8 * byteLength)
|
|
|
|
return val
|
|
}
|
|
|
|
Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
|
|
offset = offset | 0
|
|
byteLength = byteLength | 0
|
|
if (!noAssert) checkOffset(offset, byteLength, this.length)
|
|
|
|
var i = byteLength
|
|
var mul = 1
|
|
var val = this[offset + --i]
|
|
while (i > 0 && (mul *= 0x100)) {
|
|
val += this[offset + --i] * mul
|
|
}
|
|
mul *= 0x80
|
|
|
|
if (val >= mul) val -= Math.pow(2, 8 * byteLength)
|
|
|
|
return val
|
|
}
|
|
|
|
Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 1, this.length)
|
|
if (!(this[offset] & 0x80)) return (this[offset])
|
|
return ((0xff - this[offset] + 1) * -1)
|
|
}
|
|
|
|
Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 2, this.length)
|
|
var val = this[offset] | (this[offset + 1] << 8)
|
|
return (val & 0x8000) ? val | 0xFFFF0000 : val
|
|
}
|
|
|
|
Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 2, this.length)
|
|
var val = this[offset + 1] | (this[offset] << 8)
|
|
return (val & 0x8000) ? val | 0xFFFF0000 : val
|
|
}
|
|
|
|
Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 4, this.length)
|
|
|
|
return (this[offset]) |
|
|
(this[offset + 1] << 8) |
|
|
(this[offset + 2] << 16) |
|
|
(this[offset + 3] << 24)
|
|
}
|
|
|
|
Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 4, this.length)
|
|
|
|
return (this[offset] << 24) |
|
|
(this[offset + 1] << 16) |
|
|
(this[offset + 2] << 8) |
|
|
(this[offset + 3])
|
|
}
|
|
|
|
Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 4, this.length)
|
|
return ieee754.read(this, offset, true, 23, 4)
|
|
}
|
|
|
|
Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 4, this.length)
|
|
return ieee754.read(this, offset, false, 23, 4)
|
|
}
|
|
|
|
Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 8, this.length)
|
|
return ieee754.read(this, offset, true, 52, 8)
|
|
}
|
|
|
|
Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 8, this.length)
|
|
return ieee754.read(this, offset, false, 52, 8)
|
|
}
|
|
|
|
function checkInt (buf, value, offset, ext, max, min) {
|
|
if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
|
|
if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
|
|
if (offset + ext > buf.length) throw new RangeError('Index out of range')
|
|
}
|
|
|
|
Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
byteLength = byteLength | 0
|
|
if (!noAssert) {
|
|
var maxBytes = Math.pow(2, 8 * byteLength) - 1
|
|
checkInt(this, value, offset, byteLength, maxBytes, 0)
|
|
}
|
|
|
|
var mul = 1
|
|
var i = 0
|
|
this[offset] = value & 0xFF
|
|
while (++i < byteLength && (mul *= 0x100)) {
|
|
this[offset + i] = (value / mul) & 0xFF
|
|
}
|
|
|
|
return offset + byteLength
|
|
}
|
|
|
|
Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
byteLength = byteLength | 0
|
|
if (!noAssert) {
|
|
var maxBytes = Math.pow(2, 8 * byteLength) - 1
|
|
checkInt(this, value, offset, byteLength, maxBytes, 0)
|
|
}
|
|
|
|
var i = byteLength - 1
|
|
var mul = 1
|
|
this[offset + i] = value & 0xFF
|
|
while (--i >= 0 && (mul *= 0x100)) {
|
|
this[offset + i] = (value / mul) & 0xFF
|
|
}
|
|
|
|
return offset + byteLength
|
|
}
|
|
|
|
Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
|
|
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
|
|
this[offset] = (value & 0xff)
|
|
return offset + 1
|
|
}
|
|
|
|
function objectWriteUInt16 (buf, value, offset, littleEndian) {
|
|
if (value < 0) value = 0xffff + value + 1
|
|
for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {
|
|
buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
|
|
(littleEndian ? i : 1 - i) * 8
|
|
}
|
|
}
|
|
|
|
Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
this[offset] = (value & 0xff)
|
|
this[offset + 1] = (value >>> 8)
|
|
} else {
|
|
objectWriteUInt16(this, value, offset, true)
|
|
}
|
|
return offset + 2
|
|
}
|
|
|
|
Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
this[offset] = (value >>> 8)
|
|
this[offset + 1] = (value & 0xff)
|
|
} else {
|
|
objectWriteUInt16(this, value, offset, false)
|
|
}
|
|
return offset + 2
|
|
}
|
|
|
|
function objectWriteUInt32 (buf, value, offset, littleEndian) {
|
|
if (value < 0) value = 0xffffffff + value + 1
|
|
for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {
|
|
buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
|
|
}
|
|
}
|
|
|
|
Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
this[offset + 3] = (value >>> 24)
|
|
this[offset + 2] = (value >>> 16)
|
|
this[offset + 1] = (value >>> 8)
|
|
this[offset] = (value & 0xff)
|
|
} else {
|
|
objectWriteUInt32(this, value, offset, true)
|
|
}
|
|
return offset + 4
|
|
}
|
|
|
|
Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
this[offset] = (value >>> 24)
|
|
this[offset + 1] = (value >>> 16)
|
|
this[offset + 2] = (value >>> 8)
|
|
this[offset + 3] = (value & 0xff)
|
|
} else {
|
|
objectWriteUInt32(this, value, offset, false)
|
|
}
|
|
return offset + 4
|
|
}
|
|
|
|
Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
if (!noAssert) {
|
|
var limit = Math.pow(2, 8 * byteLength - 1)
|
|
|
|
checkInt(this, value, offset, byteLength, limit - 1, -limit)
|
|
}
|
|
|
|
var i = 0
|
|
var mul = 1
|
|
var sub = 0
|
|
this[offset] = value & 0xFF
|
|
while (++i < byteLength && (mul *= 0x100)) {
|
|
if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
|
|
sub = 1
|
|
}
|
|
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
|
|
}
|
|
|
|
return offset + byteLength
|
|
}
|
|
|
|
Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
if (!noAssert) {
|
|
var limit = Math.pow(2, 8 * byteLength - 1)
|
|
|
|
checkInt(this, value, offset, byteLength, limit - 1, -limit)
|
|
}
|
|
|
|
var i = byteLength - 1
|
|
var mul = 1
|
|
var sub = 0
|
|
this[offset + i] = value & 0xFF
|
|
while (--i >= 0 && (mul *= 0x100)) {
|
|
if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
|
|
sub = 1
|
|
}
|
|
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
|
|
}
|
|
|
|
return offset + byteLength
|
|
}
|
|
|
|
Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
|
|
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
|
|
if (value < 0) value = 0xff + value + 1
|
|
this[offset] = (value & 0xff)
|
|
return offset + 1
|
|
}
|
|
|
|
Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
this[offset] = (value & 0xff)
|
|
this[offset + 1] = (value >>> 8)
|
|
} else {
|
|
objectWriteUInt16(this, value, offset, true)
|
|
}
|
|
return offset + 2
|
|
}
|
|
|
|
Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
this[offset] = (value >>> 8)
|
|
this[offset + 1] = (value & 0xff)
|
|
} else {
|
|
objectWriteUInt16(this, value, offset, false)
|
|
}
|
|
return offset + 2
|
|
}
|
|
|
|
Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
this[offset] = (value & 0xff)
|
|
this[offset + 1] = (value >>> 8)
|
|
this[offset + 2] = (value >>> 16)
|
|
this[offset + 3] = (value >>> 24)
|
|
} else {
|
|
objectWriteUInt32(this, value, offset, true)
|
|
}
|
|
return offset + 4
|
|
}
|
|
|
|
Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
|
|
if (value < 0) value = 0xffffffff + value + 1
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
this[offset] = (value >>> 24)
|
|
this[offset + 1] = (value >>> 16)
|
|
this[offset + 2] = (value >>> 8)
|
|
this[offset + 3] = (value & 0xff)
|
|
} else {
|
|
objectWriteUInt32(this, value, offset, false)
|
|
}
|
|
return offset + 4
|
|
}
|
|
|
|
function checkIEEE754 (buf, value, offset, ext, max, min) {
|
|
if (offset + ext > buf.length) throw new RangeError('Index out of range')
|
|
if (offset < 0) throw new RangeError('Index out of range')
|
|
}
|
|
|
|
function writeFloat (buf, value, offset, littleEndian, noAssert) {
|
|
if (!noAssert) {
|
|
checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
|
|
}
|
|
ieee754.write(buf, value, offset, littleEndian, 23, 4)
|
|
return offset + 4
|
|
}
|
|
|
|
Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
|
|
return writeFloat(this, value, offset, true, noAssert)
|
|
}
|
|
|
|
Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
|
|
return writeFloat(this, value, offset, false, noAssert)
|
|
}
|
|
|
|
function writeDouble (buf, value, offset, littleEndian, noAssert) {
|
|
if (!noAssert) {
|
|
checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
|
|
}
|
|
ieee754.write(buf, value, offset, littleEndian, 52, 8)
|
|
return offset + 8
|
|
}
|
|
|
|
Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
|
|
return writeDouble(this, value, offset, true, noAssert)
|
|
}
|
|
|
|
Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
|
|
return writeDouble(this, value, offset, false, noAssert)
|
|
}
|
|
|
|
// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
|
|
Buffer.prototype.copy = function copy (target, targetStart, start, end) {
|
|
if (!start) start = 0
|
|
if (!end && end !== 0) end = this.length
|
|
if (targetStart >= target.length) targetStart = target.length
|
|
if (!targetStart) targetStart = 0
|
|
if (end > 0 && end < start) end = start
|
|
|
|
// Copy 0 bytes; we're done
|
|
if (end === start) return 0
|
|
if (target.length === 0 || this.length === 0) return 0
|
|
|
|
// Fatal error conditions
|
|
if (targetStart < 0) {
|
|
throw new RangeError('targetStart out of bounds')
|
|
}
|
|
if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
|
|
if (end < 0) throw new RangeError('sourceEnd out of bounds')
|
|
|
|
// Are we oob?
|
|
if (end > this.length) end = this.length
|
|
if (target.length - targetStart < end - start) {
|
|
end = target.length - targetStart + start
|
|
}
|
|
|
|
var len = end - start
|
|
var i
|
|
|
|
if (this === target && start < targetStart && targetStart < end) {
|
|
// descending copy from end
|
|
for (i = len - 1; i >= 0; --i) {
|
|
target[i + targetStart] = this[i + start]
|
|
}
|
|
} else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
|
|
// ascending copy from start
|
|
for (i = 0; i < len; ++i) {
|
|
target[i + targetStart] = this[i + start]
|
|
}
|
|
} else {
|
|
Uint8Array.prototype.set.call(
|
|
target,
|
|
this.subarray(start, start + len),
|
|
targetStart
|
|
)
|
|
}
|
|
|
|
return len
|
|
}
|
|
|
|
// Usage:
|
|
// buffer.fill(number[, offset[, end]])
|
|
// buffer.fill(buffer[, offset[, end]])
|
|
// buffer.fill(string[, offset[, end]][, encoding])
|
|
Buffer.prototype.fill = function fill (val, start, end, encoding) {
|
|
// Handle string cases:
|
|
if (typeof val === 'string') {
|
|
if (typeof start === 'string') {
|
|
encoding = start
|
|
start = 0
|
|
end = this.length
|
|
} else if (typeof end === 'string') {
|
|
encoding = end
|
|
end = this.length
|
|
}
|
|
if (val.length === 1) {
|
|
var code = val.charCodeAt(0)
|
|
if (code < 256) {
|
|
val = code
|
|
}
|
|
}
|
|
if (encoding !== undefined && typeof encoding !== 'string') {
|
|
throw new TypeError('encoding must be a string')
|
|
}
|
|
if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
|
|
throw new TypeError('Unknown encoding: ' + encoding)
|
|
}
|
|
} else if (typeof val === 'number') {
|
|
val = val & 255
|
|
}
|
|
|
|
// Invalid ranges are not set to a default, so can range check early.
|
|
if (start < 0 || this.length < start || this.length < end) {
|
|
throw new RangeError('Out of range index')
|
|
}
|
|
|
|
if (end <= start) {
|
|
return this
|
|
}
|
|
|
|
start = start >>> 0
|
|
end = end === undefined ? this.length : end >>> 0
|
|
|
|
if (!val) val = 0
|
|
|
|
var i
|
|
if (typeof val === 'number') {
|
|
for (i = start; i < end; ++i) {
|
|
this[i] = val
|
|
}
|
|
} else {
|
|
var bytes = Buffer.isBuffer(val)
|
|
? val
|
|
: utf8ToBytes(new Buffer(val, encoding).toString())
|
|
var len = bytes.length
|
|
for (i = 0; i < end - start; ++i) {
|
|
this[i + start] = bytes[i % len]
|
|
}
|
|
}
|
|
|
|
return this
|
|
}
|
|
|
|
// HELPER FUNCTIONS
|
|
// ================
|
|
|
|
var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g
|
|
|
|
function base64clean (str) {
|
|
// Node strips out invalid characters like \n and \t from the string, base64-js does not
|
|
str = stringtrim(str).replace(INVALID_BASE64_RE, '')
|
|
// Node converts strings with length < 2 to ''
|
|
if (str.length < 2) return ''
|
|
// Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
|
|
while (str.length % 4 !== 0) {
|
|
str = str + '='
|
|
}
|
|
return str
|
|
}
|
|
|
|
function stringtrim (str) {
|
|
if (str.trim) return str.trim()
|
|
return str.replace(/^\s+|\s+$/g, '')
|
|
}
|
|
|
|
function toHex (n) {
|
|
if (n < 16) return '0' + n.toString(16)
|
|
return n.toString(16)
|
|
}
|
|
|
|
function utf8ToBytes (string, units) {
|
|
units = units || Infinity
|
|
var codePoint
|
|
var length = string.length
|
|
var leadSurrogate = null
|
|
var bytes = []
|
|
|
|
for (var i = 0; i < length; ++i) {
|
|
codePoint = string.charCodeAt(i)
|
|
|
|
// is surrogate component
|
|
if (codePoint > 0xD7FF && codePoint < 0xE000) {
|
|
// last char was a lead
|
|
if (!leadSurrogate) {
|
|
// no lead yet
|
|
if (codePoint > 0xDBFF) {
|
|
// unexpected trail
|
|
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
|
|
continue
|
|
} else if (i + 1 === length) {
|
|
// unpaired lead
|
|
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
|
|
continue
|
|
}
|
|
|
|
// valid lead
|
|
leadSurrogate = codePoint
|
|
|
|
continue
|
|
}
|
|
|
|
// 2 leads in a row
|
|
if (codePoint < 0xDC00) {
|
|
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
|
|
leadSurrogate = codePoint
|
|
continue
|
|
}
|
|
|
|
// valid surrogate pair
|
|
codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
|
|
} else if (leadSurrogate) {
|
|
// valid bmp char, but last char was a lead
|
|
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
|
|
}
|
|
|
|
leadSurrogate = null
|
|
|
|
// encode utf8
|
|
if (codePoint < 0x80) {
|
|
if ((units -= 1) < 0) break
|
|
bytes.push(codePoint)
|
|
} else if (codePoint < 0x800) {
|
|
if ((units -= 2) < 0) break
|
|
bytes.push(
|
|
codePoint >> 0x6 | 0xC0,
|
|
codePoint & 0x3F | 0x80
|
|
)
|
|
} else if (codePoint < 0x10000) {
|
|
if ((units -= 3) < 0) break
|
|
bytes.push(
|
|
codePoint >> 0xC | 0xE0,
|
|
codePoint >> 0x6 & 0x3F | 0x80,
|
|
codePoint & 0x3F | 0x80
|
|
)
|
|
} else if (codePoint < 0x110000) {
|
|
if ((units -= 4) < 0) break
|
|
bytes.push(
|
|
codePoint >> 0x12 | 0xF0,
|
|
codePoint >> 0xC & 0x3F | 0x80,
|
|
codePoint >> 0x6 & 0x3F | 0x80,
|
|
codePoint & 0x3F | 0x80
|
|
)
|
|
} else {
|
|
throw new Error('Invalid code point')
|
|
}
|
|
}
|
|
|
|
return bytes
|
|
}
|
|
|
|
function asciiToBytes (str) {
|
|
var byteArray = []
|
|
for (var i = 0; i < str.length; ++i) {
|
|
// Node's code seems to be doing this and not & 0x7F..
|
|
byteArray.push(str.charCodeAt(i) & 0xFF)
|
|
}
|
|
return byteArray
|
|
}
|
|
|
|
function utf16leToBytes (str, units) {
|
|
var c, hi, lo
|
|
var byteArray = []
|
|
for (var i = 0; i < str.length; ++i) {
|
|
if ((units -= 2) < 0) break
|
|
|
|
c = str.charCodeAt(i)
|
|
hi = c >> 8
|
|
lo = c % 256
|
|
byteArray.push(lo)
|
|
byteArray.push(hi)
|
|
}
|
|
|
|
return byteArray
|
|
}
|
|
|
|
function base64ToBytes (str) {
|
|
return base64.toByteArray(base64clean(str))
|
|
}
|
|
|
|
function blitBuffer (src, dst, offset, length) {
|
|
for (var i = 0; i < length; ++i) {
|
|
if ((i + offset >= dst.length) || (i >= src.length)) break
|
|
dst[i + offset] = src[i]
|
|
}
|
|
return i
|
|
}
|
|
|
|
function isnan (val) {
|
|
return val !== val // eslint-disable-line no-self-compare
|
|
}
|
|
|
|
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ 3)))
|
|
|
|
/***/ }),
|
|
|
|
/***/ 73:
|
|
/*!*****************************************!*\
|
|
!*** ./node_modules/base64-js/index.js ***!
|
|
\*****************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
exports.byteLength = byteLength
|
|
exports.toByteArray = toByteArray
|
|
exports.fromByteArray = fromByteArray
|
|
|
|
var lookup = []
|
|
var revLookup = []
|
|
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
|
|
|
|
var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
|
|
for (var i = 0, len = code.length; i < len; ++i) {
|
|
lookup[i] = code[i]
|
|
revLookup[code.charCodeAt(i)] = i
|
|
}
|
|
|
|
// Support decoding URL-safe base64 strings, as Node.js does.
|
|
// See: https://en.wikipedia.org/wiki/Base64#URL_applications
|
|
revLookup['-'.charCodeAt(0)] = 62
|
|
revLookup['_'.charCodeAt(0)] = 63
|
|
|
|
function getLens (b64) {
|
|
var len = b64.length
|
|
|
|
if (len % 4 > 0) {
|
|
throw new Error('Invalid string. Length must be a multiple of 4')
|
|
}
|
|
|
|
// Trim off extra bytes after placeholder bytes are found
|
|
// See: https://github.com/beatgammit/base64-js/issues/42
|
|
var validLen = b64.indexOf('=')
|
|
if (validLen === -1) validLen = len
|
|
|
|
var placeHoldersLen = validLen === len
|
|
? 0
|
|
: 4 - (validLen % 4)
|
|
|
|
return [validLen, placeHoldersLen]
|
|
}
|
|
|
|
// base64 is 4/3 + up to two characters of the original data
|
|
function byteLength (b64) {
|
|
var lens = getLens(b64)
|
|
var validLen = lens[0]
|
|
var placeHoldersLen = lens[1]
|
|
return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
|
|
}
|
|
|
|
function _byteLength (b64, validLen, placeHoldersLen) {
|
|
return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
|
|
}
|
|
|
|
function toByteArray (b64) {
|
|
var tmp
|
|
var lens = getLens(b64)
|
|
var validLen = lens[0]
|
|
var placeHoldersLen = lens[1]
|
|
|
|
var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))
|
|
|
|
var curByte = 0
|
|
|
|
// if there are placeholders, only get up to the last complete 4 chars
|
|
var len = placeHoldersLen > 0
|
|
? validLen - 4
|
|
: validLen
|
|
|
|
var i
|
|
for (i = 0; i < len; i += 4) {
|
|
tmp =
|
|
(revLookup[b64.charCodeAt(i)] << 18) |
|
|
(revLookup[b64.charCodeAt(i + 1)] << 12) |
|
|
(revLookup[b64.charCodeAt(i + 2)] << 6) |
|
|
revLookup[b64.charCodeAt(i + 3)]
|
|
arr[curByte++] = (tmp >> 16) & 0xFF
|
|
arr[curByte++] = (tmp >> 8) & 0xFF
|
|
arr[curByte++] = tmp & 0xFF
|
|
}
|
|
|
|
if (placeHoldersLen === 2) {
|
|
tmp =
|
|
(revLookup[b64.charCodeAt(i)] << 2) |
|
|
(revLookup[b64.charCodeAt(i + 1)] >> 4)
|
|
arr[curByte++] = tmp & 0xFF
|
|
}
|
|
|
|
if (placeHoldersLen === 1) {
|
|
tmp =
|
|
(revLookup[b64.charCodeAt(i)] << 10) |
|
|
(revLookup[b64.charCodeAt(i + 1)] << 4) |
|
|
(revLookup[b64.charCodeAt(i + 2)] >> 2)
|
|
arr[curByte++] = (tmp >> 8) & 0xFF
|
|
arr[curByte++] = tmp & 0xFF
|
|
}
|
|
|
|
return arr
|
|
}
|
|
|
|
function tripletToBase64 (num) {
|
|
return lookup[num >> 18 & 0x3F] +
|
|
lookup[num >> 12 & 0x3F] +
|
|
lookup[num >> 6 & 0x3F] +
|
|
lookup[num & 0x3F]
|
|
}
|
|
|
|
function encodeChunk (uint8, start, end) {
|
|
var tmp
|
|
var output = []
|
|
for (var i = start; i < end; i += 3) {
|
|
tmp =
|
|
((uint8[i] << 16) & 0xFF0000) +
|
|
((uint8[i + 1] << 8) & 0xFF00) +
|
|
(uint8[i + 2] & 0xFF)
|
|
output.push(tripletToBase64(tmp))
|
|
}
|
|
return output.join('')
|
|
}
|
|
|
|
function fromByteArray (uint8) {
|
|
var tmp
|
|
var len = uint8.length
|
|
var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
|
|
var parts = []
|
|
var maxChunkLength = 16383 // must be multiple of 3
|
|
|
|
// go through the array every three bytes, we'll deal with trailing stuff later
|
|
for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
|
|
parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
|
|
}
|
|
|
|
// pad the end with zeros, but make sure to not forget the extra bytes
|
|
if (extraBytes === 1) {
|
|
tmp = uint8[len - 1]
|
|
parts.push(
|
|
lookup[tmp >> 2] +
|
|
lookup[(tmp << 4) & 0x3F] +
|
|
'=='
|
|
)
|
|
} else if (extraBytes === 2) {
|
|
tmp = (uint8[len - 2] << 8) + uint8[len - 1]
|
|
parts.push(
|
|
lookup[tmp >> 10] +
|
|
lookup[(tmp >> 4) & 0x3F] +
|
|
lookup[(tmp << 2) & 0x3F] +
|
|
'='
|
|
)
|
|
}
|
|
|
|
return parts.join('')
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 74:
|
|
/*!***************************************!*\
|
|
!*** ./node_modules/ieee754/index.js ***!
|
|
\***************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
|
exports.read = function (buffer, offset, isLE, mLen, nBytes) {
|
|
var e, m
|
|
var eLen = (nBytes * 8) - mLen - 1
|
|
var eMax = (1 << eLen) - 1
|
|
var eBias = eMax >> 1
|
|
var nBits = -7
|
|
var i = isLE ? (nBytes - 1) : 0
|
|
var d = isLE ? -1 : 1
|
|
var s = buffer[offset + i]
|
|
|
|
i += d
|
|
|
|
e = s & ((1 << (-nBits)) - 1)
|
|
s >>= (-nBits)
|
|
nBits += eLen
|
|
for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
|
|
|
|
m = e & ((1 << (-nBits)) - 1)
|
|
e >>= (-nBits)
|
|
nBits += mLen
|
|
for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
|
|
|
|
if (e === 0) {
|
|
e = 1 - eBias
|
|
} else if (e === eMax) {
|
|
return m ? NaN : ((s ? -1 : 1) * Infinity)
|
|
} else {
|
|
m = m + Math.pow(2, mLen)
|
|
e = e - eBias
|
|
}
|
|
return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
|
|
}
|
|
|
|
exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
|
|
var e, m, c
|
|
var eLen = (nBytes * 8) - mLen - 1
|
|
var eMax = (1 << eLen) - 1
|
|
var eBias = eMax >> 1
|
|
var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
|
|
var i = isLE ? 0 : (nBytes - 1)
|
|
var d = isLE ? 1 : -1
|
|
var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
|
|
|
|
value = Math.abs(value)
|
|
|
|
if (isNaN(value) || value === Infinity) {
|
|
m = isNaN(value) ? 1 : 0
|
|
e = eMax
|
|
} else {
|
|
e = Math.floor(Math.log(value) / Math.LN2)
|
|
if (value * (c = Math.pow(2, -e)) < 1) {
|
|
e--
|
|
c *= 2
|
|
}
|
|
if (e + eBias >= 1) {
|
|
value += rt / c
|
|
} else {
|
|
value += rt * Math.pow(2, 1 - eBias)
|
|
}
|
|
if (value * c >= 2) {
|
|
e++
|
|
c /= 2
|
|
}
|
|
|
|
if (e + eBias >= eMax) {
|
|
m = 0
|
|
e = eMax
|
|
} else if (e + eBias >= 1) {
|
|
m = ((value * c) - 1) * Math.pow(2, mLen)
|
|
e = e + eBias
|
|
} else {
|
|
m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
|
|
e = 0
|
|
}
|
|
}
|
|
|
|
for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
|
|
|
|
e = (e << mLen) | m
|
|
eLen += mLen
|
|
for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
|
|
|
|
buffer[offset + i - d] |= s * 128
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 75:
|
|
/*!***************************************!*\
|
|
!*** ./node_modules/isarray/index.js ***!
|
|
\***************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
var toString = {}.toString;
|
|
|
|
module.exports = Array.isArray || function (arr) {
|
|
return toString.call(arr) == '[object Array]';
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 76:
|
|
/*!********************************************************!*\
|
|
!*** ./node_modules/node-libs-browser/mock/process.js ***!
|
|
\********************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
exports.nextTick = function nextTick(fn) {
|
|
var args = Array.prototype.slice.call(arguments);
|
|
args.shift();
|
|
setTimeout(function () {
|
|
fn.apply(null, args);
|
|
}, 0);
|
|
};
|
|
|
|
exports.platform = exports.arch =
|
|
exports.execPath = exports.title = 'browser';
|
|
exports.pid = 1;
|
|
exports.browser = true;
|
|
exports.env = {};
|
|
exports.argv = [];
|
|
|
|
exports.binding = function (name) {
|
|
throw new Error('No such module. (Possibly not yet loaded)')
|
|
};
|
|
|
|
(function () {
|
|
var cwd = '/';
|
|
var path;
|
|
exports.cwd = function () { return cwd };
|
|
exports.chdir = function (dir) {
|
|
if (!path) path = __webpack_require__(/*! path */ 77);
|
|
cwd = path.resolve(dir, cwd);
|
|
};
|
|
})();
|
|
|
|
exports.exit = exports.kill =
|
|
exports.umask = exports.dlopen =
|
|
exports.uptime = exports.memoryUsage =
|
|
exports.uvCounters = function() {};
|
|
exports.features = {};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 77:
|
|
/*!***********************************************!*\
|
|
!*** ./node_modules/path-browserify/index.js ***!
|
|
\***********************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
/* WEBPACK VAR INJECTION */(function(process) {// .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1,
|
|
// backported and transplited with Babel, with backwards-compat fixes
|
|
|
|
// Copyright Joyent, Inc. and other Node contributors.
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
// copy of this software and associated documentation files (the
|
|
// "Software"), to deal in the Software without restriction, including
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
// persons to whom the Software is furnished to do so, subject to the
|
|
// following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included
|
|
// in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
// resolves . and .. elements in a path array with directory names there
|
|
// must be no slashes, empty elements, or device names (c:\) in the array
|
|
// (so also no leading and trailing slashes - it does not distinguish
|
|
// relative and absolute paths)
|
|
function normalizeArray(parts, allowAboveRoot) {
|
|
// if the path tries to go above the root, `up` ends up > 0
|
|
var up = 0;
|
|
for (var i = parts.length - 1; i >= 0; i--) {
|
|
var last = parts[i];
|
|
if (last === '.') {
|
|
parts.splice(i, 1);
|
|
} else if (last === '..') {
|
|
parts.splice(i, 1);
|
|
up++;
|
|
} else if (up) {
|
|
parts.splice(i, 1);
|
|
up--;
|
|
}
|
|
}
|
|
|
|
// if the path is allowed to go above the root, restore leading ..s
|
|
if (allowAboveRoot) {
|
|
for (; up--; up) {
|
|
parts.unshift('..');
|
|
}
|
|
}
|
|
|
|
return parts;
|
|
}
|
|
|
|
// path.resolve([from ...], to)
|
|
// posix version
|
|
exports.resolve = function() {
|
|
var resolvedPath = '',
|
|
resolvedAbsolute = false;
|
|
|
|
for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
|
|
var path = (i >= 0) ? arguments[i] : process.cwd();
|
|
|
|
// Skip empty and invalid entries
|
|
if (typeof path !== 'string') {
|
|
throw new TypeError('Arguments to path.resolve must be strings');
|
|
} else if (!path) {
|
|
continue;
|
|
}
|
|
|
|
resolvedPath = path + '/' + resolvedPath;
|
|
resolvedAbsolute = path.charAt(0) === '/';
|
|
}
|
|
|
|
// At this point the path should be resolved to a full absolute path, but
|
|
// handle relative paths to be safe (might happen when process.cwd() fails)
|
|
|
|
// Normalize the path
|
|
resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
|
|
return !!p;
|
|
}), !resolvedAbsolute).join('/');
|
|
|
|
return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
|
|
};
|
|
|
|
// path.normalize(path)
|
|
// posix version
|
|
exports.normalize = function(path) {
|
|
var isAbsolute = exports.isAbsolute(path),
|
|
trailingSlash = substr(path, -1) === '/';
|
|
|
|
// Normalize the path
|
|
path = normalizeArray(filter(path.split('/'), function(p) {
|
|
return !!p;
|
|
}), !isAbsolute).join('/');
|
|
|
|
if (!path && !isAbsolute) {
|
|
path = '.';
|
|
}
|
|
if (path && trailingSlash) {
|
|
path += '/';
|
|
}
|
|
|
|
return (isAbsolute ? '/' : '') + path;
|
|
};
|
|
|
|
// posix version
|
|
exports.isAbsolute = function(path) {
|
|
return path.charAt(0) === '/';
|
|
};
|
|
|
|
// posix version
|
|
exports.join = function() {
|
|
var paths = Array.prototype.slice.call(arguments, 0);
|
|
return exports.normalize(filter(paths, function(p, index) {
|
|
if (typeof p !== 'string') {
|
|
throw new TypeError('Arguments to path.join must be strings');
|
|
}
|
|
return p;
|
|
}).join('/'));
|
|
};
|
|
|
|
|
|
// path.relative(from, to)
|
|
// posix version
|
|
exports.relative = function(from, to) {
|
|
from = exports.resolve(from).substr(1);
|
|
to = exports.resolve(to).substr(1);
|
|
|
|
function trim(arr) {
|
|
var start = 0;
|
|
for (; start < arr.length; start++) {
|
|
if (arr[start] !== '') break;
|
|
}
|
|
|
|
var end = arr.length - 1;
|
|
for (; end >= 0; end--) {
|
|
if (arr[end] !== '') break;
|
|
}
|
|
|
|
if (start > end) return [];
|
|
return arr.slice(start, end - start + 1);
|
|
}
|
|
|
|
var fromParts = trim(from.split('/'));
|
|
var toParts = trim(to.split('/'));
|
|
|
|
var length = Math.min(fromParts.length, toParts.length);
|
|
var samePartsLength = length;
|
|
for (var i = 0; i < length; i++) {
|
|
if (fromParts[i] !== toParts[i]) {
|
|
samePartsLength = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
var outputParts = [];
|
|
for (var i = samePartsLength; i < fromParts.length; i++) {
|
|
outputParts.push('..');
|
|
}
|
|
|
|
outputParts = outputParts.concat(toParts.slice(samePartsLength));
|
|
|
|
return outputParts.join('/');
|
|
};
|
|
|
|
exports.sep = '/';
|
|
exports.delimiter = ':';
|
|
|
|
exports.dirname = function (path) {
|
|
if (typeof path !== 'string') path = path + '';
|
|
if (path.length === 0) return '.';
|
|
var code = path.charCodeAt(0);
|
|
var hasRoot = code === 47 /*/*/;
|
|
var end = -1;
|
|
var matchedSlash = true;
|
|
for (var i = path.length - 1; i >= 1; --i) {
|
|
code = path.charCodeAt(i);
|
|
if (code === 47 /*/*/) {
|
|
if (!matchedSlash) {
|
|
end = i;
|
|
break;
|
|
}
|
|
} else {
|
|
// We saw the first non-path separator
|
|
matchedSlash = false;
|
|
}
|
|
}
|
|
|
|
if (end === -1) return hasRoot ? '/' : '.';
|
|
if (hasRoot && end === 1) {
|
|
// return '//';
|
|
// Backwards-compat fix:
|
|
return '/';
|
|
}
|
|
return path.slice(0, end);
|
|
};
|
|
|
|
function basename(path) {
|
|
if (typeof path !== 'string') path = path + '';
|
|
|
|
var start = 0;
|
|
var end = -1;
|
|
var matchedSlash = true;
|
|
var i;
|
|
|
|
for (i = path.length - 1; i >= 0; --i) {
|
|
if (path.charCodeAt(i) === 47 /*/*/) {
|
|
// If we reached a path separator that was not part of a set of path
|
|
// separators at the end of the string, stop now
|
|
if (!matchedSlash) {
|
|
start = i + 1;
|
|
break;
|
|
}
|
|
} else if (end === -1) {
|
|
// We saw the first non-path separator, mark this as the end of our
|
|
// path component
|
|
matchedSlash = false;
|
|
end = i + 1;
|
|
}
|
|
}
|
|
|
|
if (end === -1) return '';
|
|
return path.slice(start, end);
|
|
}
|
|
|
|
// Uses a mixed approach for backwards-compatibility, as ext behavior changed
|
|
// in new Node.js versions, so only basename() above is backported here
|
|
exports.basename = function (path, ext) {
|
|
var f = basename(path);
|
|
if (ext && f.substr(-1 * ext.length) === ext) {
|
|
f = f.substr(0, f.length - ext.length);
|
|
}
|
|
return f;
|
|
};
|
|
|
|
exports.extname = function (path) {
|
|
if (typeof path !== 'string') path = path + '';
|
|
var startDot = -1;
|
|
var startPart = 0;
|
|
var end = -1;
|
|
var matchedSlash = true;
|
|
// Track the state of characters (if any) we see before our first dot and
|
|
// after any path separator we find
|
|
var preDotState = 0;
|
|
for (var i = path.length - 1; i >= 0; --i) {
|
|
var code = path.charCodeAt(i);
|
|
if (code === 47 /*/*/) {
|
|
// If we reached a path separator that was not part of a set of path
|
|
// separators at the end of the string, stop now
|
|
if (!matchedSlash) {
|
|
startPart = i + 1;
|
|
break;
|
|
}
|
|
continue;
|
|
}
|
|
if (end === -1) {
|
|
// We saw the first non-path separator, mark this as the end of our
|
|
// extension
|
|
matchedSlash = false;
|
|
end = i + 1;
|
|
}
|
|
if (code === 46 /*.*/) {
|
|
// If this is our first dot, mark it as the start of our extension
|
|
if (startDot === -1)
|
|
startDot = i;
|
|
else if (preDotState !== 1)
|
|
preDotState = 1;
|
|
} else if (startDot !== -1) {
|
|
// We saw a non-dot and non-path separator before our dot, so we should
|
|
// have a good chance at having a non-empty extension
|
|
preDotState = -1;
|
|
}
|
|
}
|
|
|
|
if (startDot === -1 || end === -1 ||
|
|
// We saw a non-dot character immediately before the dot
|
|
preDotState === 0 ||
|
|
// The (right-most) trimmed path component is exactly '..'
|
|
preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
|
|
return '';
|
|
}
|
|
return path.slice(startDot, end);
|
|
};
|
|
|
|
function filter (xs, f) {
|
|
if (xs.filter) return xs.filter(f);
|
|
var res = [];
|
|
for (var i = 0; i < xs.length; i++) {
|
|
if (f(xs[i], i, xs)) res.push(xs[i]);
|
|
}
|
|
return res;
|
|
}
|
|
|
|
// String.prototype.substr - negative index don't work in IE8
|
|
var substr = 'ab'.substr(-1) === 'b'
|
|
? function (str, start, len) { return str.substr(start, len) }
|
|
: function (str, start, len) {
|
|
if (start < 0) start = str.length + start;
|
|
return str.substr(start, len);
|
|
}
|
|
;
|
|
|
|
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../node-libs-browser/mock/process.js */ 76)))
|
|
|
|
/***/ }),
|
|
|
|
/***/ 78:
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/node-libs-browser/mock/empty.js ***!
|
|
\******************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 8:
|
|
/*!***************************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js ***!
|
|
\***************************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var arrayLikeToArray = __webpack_require__(/*! ./arrayLikeToArray.js */ 9);
|
|
function _unsupportedIterableToArray(o, minLen) {
|
|
if (!o) return;
|
|
if (typeof o === "string") return arrayLikeToArray(o, minLen);
|
|
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
if (n === "Map" || n === "Set") return Array.from(o);
|
|
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);
|
|
}
|
|
module.exports = _unsupportedIterableToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
|
|
/***/ 9:
|
|
/*!*****************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/arrayLikeToArray.js ***!
|
|
\*****************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
function _arrayLikeToArray(arr, len) {
|
|
if (len == null || len > arr.length) len = arr.length;
|
|
for (var i = 0, arr2 = new Array(len); i < len; i++) {
|
|
arr2[i] = arr[i];
|
|
}
|
|
return arr2;
|
|
}
|
|
module.exports = _arrayLikeToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ })
|
|
|
|
}]);
|
|
//# sourceMappingURL=../../.sourcemap/mp-weixin/common/vendor.js.map
|