code: func (formatter *outputFormatter) Text(s *goquery.Selection) string {
  	var buf bytes.Buffer
  
  	// Slightly optimized vs calling Each: no single selection object created
  	var f func(*html.Node)
  	f = func(n *html.Node) {
  		if n.Type == html.TextNode && 0 == n.DataAtom { // NB: had to add the DataAtom check to avoid printing text twice when a textual node embeds another textual node
  			// Keep newlines and spaces, like jQuery
  			buf.WriteString(n.Data)
  		}
  		if n.FirstChild != nil {
  			for c := n.FirstChild; c != nil; c = c.NextSibling {
  				f(c)
  			}
  		}
  	}
  	for _, n := range s.Nodes {
  		f(n)
  	}
  
  	return buf.String()
  }
docs: // Text gets the combined text contents of each element in the set of matched
  // elements, including their descendants.
  //
  // @see https://github.com/PuerkitoBio/goquery/blob/master/property.go