package goquery import ( "exp/html" ) // First() reduces the set of matched elements to the first in the set. // It returns a new Selection object. func (this *Selection) First() *Selection { return this.Eq(0) } // Last() reduces the set of matched elements to the last in the set. // It returns a new Selection object. func (this *Selection) Last() *Selection { return this.Eq(-1) } // Eq() reduces the set of matched elements to the one at the specified index. // If a negative index is given, it counts backwards starting at the end of the // set. It returns a new Selection object, and an empty Selection object if the // index is invalid. func (this *Selection) Eq(index int) *Selection { if index < 0 { index += len(this.Nodes) } return this.Slice(index, index+1) } // Slice() reduces the set of matched elements to a subset specified by a range // of indices. At the moment, negative indices are not supported. func (this *Selection) Slice(start int, end int) *Selection { // TODO : Negative indices, like jQuery return pushStack(this, this.Nodes[start:end]) } // Get() retrieves the underlying node at the specified index. // Get() without parameter is not implemented, since the node array is available // on the Selection object. func (this *Selection) Get(index int) *html.Node { if index < 0 { index += len(this.Nodes) // Negative index gets from the end } return this.Nodes[index] } // Index() returns the position of the first element within the Selection object // relative to its sibling elements. func (this *Selection) Index() int { // TODO : Eventually refactor with prevAll(), like jQuery's code if len(this.Nodes) > 0 { n := this.Nodes[0] if p := n.Parent; p != nil { var i = 0 for _, c := range p.Child { if c == n { // This is the index of the element return i } else if c.Type == html.ElementNode { i++ } } } } return -1 } // IndexSelector() returns the position of the first element within the // Selection object relative to the elements matched by the selector, or -1 if // not found. func (this *Selection) IndexSelector(selector string) int { if len(this.Nodes) > 0 { sel := this.document.Find(selector) return indexInSlice(sel.Nodes, this.Nodes[0]) } return -1 } // IndexOfNode() returns the position of the specified node within the Selection // object, or -1 if not found. func (this *Selection) IndexOfNode(node *html.Node) int { return indexInSlice(this.Nodes, node) } // IndexOfSelection() returns the position of the first node in the specified // Selection object within this Selection object, or -1 if not found. func (this *Selection) IndexOfSelection(s *Selection) int { if s != nil && len(s.Nodes) > 0 { return indexInSlice(this.Nodes, s.Nodes[0]) } return -1 }