github.com/godaddy-x/freego@v1.0.156/goquery/array.go (about) 1 package goquery 2 3 import ( 4 "golang.org/x/net/html" 5 ) 6 7 const ( 8 maxUint = ^uint(0) 9 maxInt = int(maxUint >> 1) 10 11 // ToEnd is a special index value that can be used as end index in a call 12 // to Slice so that all elements are selected until the end of the Selection. 13 // It is equivalent to passing (*Selection).Length(). 14 ToEnd = maxInt 15 ) 16 17 // First reduces the set of matched elements to the first in the set. 18 // It returns a new Selection object, and an empty Selection object if the 19 // the selection is empty. 20 func (s *Selection) First() *Selection { 21 return s.Eq(0) 22 } 23 24 // Last reduces the set of matched elements to the last in the set. 25 // It returns a new Selection object, and an empty Selection object if 26 // the selection is empty. 27 func (s *Selection) Last() *Selection { 28 return s.Eq(-1) 29 } 30 31 // Eq reduces the set of matched elements to the one at the specified index. 32 // If a negative index is given, it counts backwards starting at the end of the 33 // set. It returns a new Selection object, and an empty Selection object if the 34 // index is invalid. 35 func (s *Selection) Eq(index int) *Selection { 36 if index < 0 { 37 index += len(s.Nodes) 38 } 39 40 if index >= len(s.Nodes) || index < 0 { 41 return newEmptySelection(s.document) 42 } 43 44 return s.Slice(index, index+1) 45 } 46 47 // Slice reduces the set of matched elements to a subset specified by a range 48 // of indices. The start index is 0-based and indicates the index of the first 49 // element to select. The end index is 0-based and indicates the index at which 50 // the elements stop being selected (the end index is not selected). 51 // 52 // The indices may be negative, in which case they represent an offset from the 53 // end of the selection. 54 // 55 // The special value ToEnd may be specified as end index, in which case all elements 56 // until the end are selected. This works both for a positive and negative start 57 // index. 58 func (s *Selection) Slice(start, end int) *Selection { 59 if start < 0 { 60 start += len(s.Nodes) 61 } 62 if end == ToEnd { 63 end = len(s.Nodes) 64 } else if end < 0 { 65 end += len(s.Nodes) 66 } 67 return pushStack(s, s.Nodes[start:end]) 68 } 69 70 // Get retrieves the underlying node at the specified index. 71 // Get without parameter is not implemented, since the node array is available 72 // on the Selection object. 73 func (s *Selection) Get(index int) *html.Node { 74 if index < 0 { 75 index += len(s.Nodes) // Negative index gets from the end 76 } 77 return s.Nodes[index] 78 } 79 80 // Index returns the position of the first element within the Selection object 81 // relative to its sibling elements. 82 func (s *Selection) Index() int { 83 if len(s.Nodes) > 0 { 84 return newSingleSelection(s.Nodes[0], s.document).PrevAll().Length() 85 } 86 return -1 87 } 88 89 // IndexSelector returns the position of the first element within the 90 // Selection object relative to the elements matched by the selector, or -1 if 91 // not found. 92 func (s *Selection) IndexSelector(selector string) int { 93 if len(s.Nodes) > 0 { 94 sel := s.document.Find(selector) 95 return indexInSlice(sel.Nodes, s.Nodes[0]) 96 } 97 return -1 98 } 99 100 // IndexMatcher returns the position of the first element within the 101 // Selection object relative to the elements matched by the matcher, or -1 if 102 // not found. 103 func (s *Selection) IndexMatcher(m Matcher) int { 104 if len(s.Nodes) > 0 { 105 sel := s.document.FindMatcher(m) 106 return indexInSlice(sel.Nodes, s.Nodes[0]) 107 } 108 return -1 109 } 110 111 // IndexOfNode returns the position of the specified node within the Selection 112 // object, or -1 if not found. 113 func (s *Selection) IndexOfNode(node *html.Node) int { 114 return indexInSlice(s.Nodes, node) 115 } 116 117 // IndexOfSelection returns the position of the first node in the specified 118 // Selection object within this Selection object, or -1 if not found. 119 func (s *Selection) IndexOfSelection(sel *Selection) int { 120 if sel != nil && len(sel.Nodes) > 0 { 121 return indexInSlice(s.Nodes, sel.Nodes[0]) 122 } 123 return -1 124 }