|
1 LOG.inform("XMLDOC.DomReader loaded"); |
|
2 |
|
3 XMLDOC.DomReader = function(root) { |
|
4 |
|
5 this.dom = root; |
|
6 |
|
7 /** |
|
8 * The current node the reader is on |
|
9 */ |
|
10 this.node = root; |
|
11 |
|
12 /** |
|
13 * Get the current node the reader is on |
|
14 * @type XMLDOC.Parser.node |
|
15 */ |
|
16 XMLDOC.DomReader.prototype.getNode = function() { |
|
17 return this.node; |
|
18 }; |
|
19 |
|
20 /** |
|
21 * Set the node the reader should be positioned on. |
|
22 * @param node {XMLDOC.Parser.node} |
|
23 */ |
|
24 XMLDOC.DomReader.prototype.setNode = function(node) { |
|
25 this.node = node; |
|
26 }; |
|
27 |
|
28 /** |
|
29 * A helper method to make sure the current node will |
|
30 * never return null, unless null is passed as the root. |
|
31 * @param step {String} An expression to evaluate - should return a node or null |
|
32 */ |
|
33 XMLDOC.DomReader.prototype.navigate = function(step) { |
|
34 var n; |
|
35 if ((n = step) != null) |
|
36 { |
|
37 this.node = n; |
|
38 return this.node; |
|
39 } |
|
40 return null; |
|
41 }; |
|
42 |
|
43 /** |
|
44 * Get the root node of the current node's document. |
|
45 */ |
|
46 XMLDOC.DomReader.prototype.root = function() { |
|
47 this.navigate(this.dom); |
|
48 }; |
|
49 |
|
50 /** |
|
51 * Get the parent of the current node. |
|
52 */ |
|
53 XMLDOC.DomReader.prototype.parent = function() { |
|
54 return this.navigate(this.node.parentNode()); |
|
55 }; |
|
56 |
|
57 /** |
|
58 * Get the first child of the current node. |
|
59 */ |
|
60 XMLDOC.DomReader.prototype.firstChild = function() { |
|
61 return this.navigate(this.node.firstChild()); |
|
62 }; |
|
63 |
|
64 /** |
|
65 * Get the last child of the current node. |
|
66 */ |
|
67 XMLDOC.DomReader.prototype.lastChild = function() { |
|
68 return this.navigate(this.node.lastChild()); |
|
69 }; |
|
70 |
|
71 /** |
|
72 * Get the next sibling of the current node. |
|
73 */ |
|
74 XMLDOC.DomReader.prototype.nextSibling = function() { |
|
75 return this.navigate(this.node.nextSibling()); |
|
76 }; |
|
77 |
|
78 /** |
|
79 * Get the previous sibling of the current node. |
|
80 */ |
|
81 XMLDOC.DomReader.prototype.prevSibling = function() { |
|
82 return this.navigate(this.node.prevSibling()); |
|
83 }; |
|
84 |
|
85 //=============================================================================================== |
|
86 // Support methods |
|
87 |
|
88 /** |
|
89 * Walk the tree starting with the current node, calling the plug-in for |
|
90 * each node visited. Each time the plug-in is called, the DomReader |
|
91 * is passed as the only parameter. Use the {@link XMLDOC.DomReader#getNode} method |
|
92 * to access the current node. <i>This method uses a depth first traversal pattern.</i> |
|
93 * |
|
94 * @param srcFile {String} The source file being evaluated |
|
95 */ |
|
96 XMLDOC.DomReader.prototype.getSymbols = function(srcFile) |
|
97 { |
|
98 XMLDOC.DomReader.symbols = []; |
|
99 XMLDOC.DomReader.currentFile = srcFile; |
|
100 JSDOC.Symbol.srcFile = (srcFile || ""); |
|
101 |
|
102 if (defined(JSDOC.PluginManager)) { |
|
103 JSDOC.PluginManager.run("onDomGetSymbols", this); |
|
104 } |
|
105 |
|
106 return XMLDOC.DomReader.symbols; |
|
107 }; |
|
108 |
|
109 /** |
|
110 * Find the node with the given name using a depth first traversal. |
|
111 * Does not modify the DomReader's current node. |
|
112 * |
|
113 * @param name {String} The name of the node to find |
|
114 * @return the node that was found, or null if not found |
|
115 */ |
|
116 XMLDOC.DomReader.prototype.findNode = function(name) |
|
117 { |
|
118 var findNode = null; |
|
119 |
|
120 // Start at the current node and move into the subtree, |
|
121 // looking for the node with the given name |
|
122 function deeper(node, find) |
|
123 { |
|
124 var look = null; |
|
125 |
|
126 if (node) { |
|
127 if (node.name == find) |
|
128 { |
|
129 return node; |
|
130 } |
|
131 |
|
132 if (node.firstChild()) |
|
133 { |
|
134 look = deeper(node.firstChild(), find); |
|
135 } |
|
136 |
|
137 if (!look && node.nextSibling()) |
|
138 { |
|
139 look = deeper(node.nextSibling(), find); |
|
140 } |
|
141 } |
|
142 |
|
143 return look; |
|
144 } |
|
145 |
|
146 return deeper(this.getNode().firstChild(), name); |
|
147 }; |
|
148 |
|
149 /** |
|
150 * Find the next node with the given name using a depth first traversal. |
|
151 * |
|
152 * @param name {String} The name of the node to find |
|
153 */ |
|
154 XMLDOC.DomReader.prototype.findPreviousNode = function(name) |
|
155 { |
|
156 }; |
|
157 |
|
158 }; |
|
159 |