thirdparty/jsdoctoolkit/app/handlers/XMLDOC/DomReader.js
changeset 3041 c8f47f0b6697
equal deleted inserted replaced
3040:8f9580309846 3041:c8f47f0b6697
       
     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