code: func (og *OpenGraph) ProcessHTML(buffer io.Reader) error {
  	z := html.NewTokenizer(buffer)
  	for {
  		tt := z.Next()
  		switch tt {
  		case html.ErrorToken:
  			if z.Err() == io.EOF {
  				return nil
  			}
  			return z.Err()
  		case html.StartTagToken, html.SelfClosingTagToken, html.EndTagToken:
  			name, hasAttr := z.TagName()
  			if atom.Lookup(name) == atom.Body {
  				return nil // OpenGraph is only in head, so we don't need body
  			}
  			if atom.Lookup(name) != atom.Meta || !hasAttr {
  				continue
  			}
  			m := make(map[string]string)
  			var key, val []byte
  			for hasAttr {
  				key, val, hasAttr = z.TagAttr()
  				m[atom.String(key)] = string(val)
  			}
  			og.ProcessMeta(m)
  		}
  	}
  }
docs: // ProcessHTML parses given html from Reader interface and fills up OpenGraph structure