1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 | var __ = require('underscore');
|
23 | var plist = require('plist');
|
24 |
|
25 |
|
26 | module.exports.graftPLIST = graftPLIST;
|
27 | function graftPLIST (doc, xml, selector) {
|
28 | var obj = plist.parse('<plist>' + xml + '</plist>');
|
29 |
|
30 | var node = doc[selector];
|
31 | if (node && Array.isArray(node) && Array.isArray(obj)) {
|
32 | node = node.concat(obj);
|
33 | for (var i = 0; i < node.length; i++) {
|
34 | for (var j = i + 1; j < node.length; ++j) {
|
35 | if (nodeEqual(node[i], node[j])) { node.splice(j--, 1); }
|
36 | }
|
37 | }
|
38 | doc[selector] = node;
|
39 | } else {
|
40 |
|
41 |
|
42 | if (node && __.isObject(node) && __.isObject(obj) && !__.isDate(node) && !__.isDate(obj)) {
|
43 | __.extend(obj, node);
|
44 | }
|
45 | doc[selector] = obj;
|
46 | }
|
47 |
|
48 | return true;
|
49 | }
|
50 |
|
51 |
|
52 | module.exports.prunePLIST = prunePLIST;
|
53 | function prunePLIST (doc, xml, selector) {
|
54 | var obj = plist.parse('<plist>' + xml + '</plist>');
|
55 |
|
56 | pruneOBJECT(doc, selector, obj);
|
57 |
|
58 | return true;
|
59 | }
|
60 |
|
61 | function pruneOBJECT (doc, selector, fragment) {
|
62 | if (Array.isArray(fragment) && Array.isArray(doc[selector])) {
|
63 | var empty = true;
|
64 | for (var i in fragment) {
|
65 | for (var j in doc[selector]) {
|
66 | empty = pruneOBJECT(doc[selector], j, fragment[i]) && empty;
|
67 | }
|
68 | }
|
69 | if (empty) {
|
70 | delete doc[selector];
|
71 | return true;
|
72 | }
|
73 | } else if (nodeEqual(doc[selector], fragment)) {
|
74 | delete doc[selector];
|
75 | return true;
|
76 | }
|
77 |
|
78 | return false;
|
79 | }
|
80 |
|
81 | function nodeEqual (node1, node2) {
|
82 | if (typeof node1 !== typeof node2) { return false; } else if (typeof node1 === 'string') {
|
83 | node2 = escapeRE(node2).replace(/\\\$\S+/gm, '(.*?)');
|
84 | return new RegExp('^' + node2 + '$').test(node1);
|
85 | } else {
|
86 | for (var key in node2) {
|
87 | if (!nodeEqual(node1[key], node2[key])) return false;
|
88 | }
|
89 | return true;
|
90 | }
|
91 | }
|
92 |
|
93 |
|
94 | function escapeRE (str) {
|
95 | return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
|
96 | }
|