forked from ukamnya/microdata_mirror
		
	Added basic docs and renamed SetString, SetItem to AddString, AddItem
This commit is contained in:
		
							parent
							
								
									0b1fbba09d
								
							
						
					
					
						commit
						83080b03e8
					
				
							
								
								
									
										29
									
								
								microdata.go
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								microdata.go
									
									
									
									
									
								
							@ -1,3 +1,10 @@
 | 
			
		||||
/*
 | 
			
		||||
  To the extent possible under law, Ian Davis has waived all copyright
 | 
			
		||||
  and related or neighboring rights to this Source Code file.
 | 
			
		||||
  This work is published from the United Kingdom. 
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// A package for parsing microdata
 | 
			
		||||
package microdata
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@ -12,12 +19,14 @@ import (
 | 
			
		||||
type ValueList []interface{}
 | 
			
		||||
type PropertyMap map[string]ValueList
 | 
			
		||||
 | 
			
		||||
// Represents a microdata item
 | 
			
		||||
type Item struct {
 | 
			
		||||
	Properties PropertyMap `json:"properties"`
 | 
			
		||||
	Types      []string    `json:"type,omitempty"`
 | 
			
		||||
	ID         string      `json:"id,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Create a new microdata item
 | 
			
		||||
func NewItem() *Item {
 | 
			
		||||
	return &Item{
 | 
			
		||||
		Properties: make(PropertyMap, 0),
 | 
			
		||||
@ -25,32 +34,39 @@ func NewItem() *Item {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (self *Item) SetString(property string, value string) {
 | 
			
		||||
// Add a string type item property value
 | 
			
		||||
func (self *Item) AddString(property string, value string) {
 | 
			
		||||
	self.Properties[property] = append(self.Properties[property], value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (self *Item) SetItem(property string, value *Item) {
 | 
			
		||||
// Add an Item type item property value
 | 
			
		||||
func (self *Item) AddItem(property string, value *Item) {
 | 
			
		||||
	self.Properties[property] = append(self.Properties[property], value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Add a type to the item
 | 
			
		||||
func (self *Item) AddType(value string) {
 | 
			
		||||
	self.Types = append(self.Types, value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Represents a set of microdata items
 | 
			
		||||
type Microdata struct {
 | 
			
		||||
	Items []*Item `json:"items"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Create a new microdata set
 | 
			
		||||
func NewMicrodata() *Microdata {
 | 
			
		||||
	return &Microdata{
 | 
			
		||||
		Items: make([]*Item, 0),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Add an item to the microdata set
 | 
			
		||||
func (self *Microdata) AddItem(value *Item) {
 | 
			
		||||
	self.Items = append(self.Items, value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Convert the microdata set to JSON
 | 
			
		||||
func (self *Microdata) Json() ([]byte, error) {
 | 
			
		||||
	b, err := json.Marshal(self)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@ -59,6 +75,7 @@ func (self *Microdata) Json() ([]byte, error) {
 | 
			
		||||
	return b, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// An HTML parser that extracts microdata
 | 
			
		||||
type Parser struct {
 | 
			
		||||
	p               *h5.Parser
 | 
			
		||||
	data            *Microdata
 | 
			
		||||
@ -66,6 +83,9 @@ type Parser struct {
 | 
			
		||||
	identifiedNodes map[string]*h5.Node
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Create a new parser for extracting microdata
 | 
			
		||||
// r is a reader over an HTML document
 | 
			
		||||
// base is the base URL for resolving relative URLs
 | 
			
		||||
func NewParser(r io.Reader, base *url.URL) *Parser {
 | 
			
		||||
	return &Parser{
 | 
			
		||||
		p:    h5.NewParser(r),
 | 
			
		||||
@ -74,6 +94,7 @@ func NewParser(r io.Reader, base *url.URL) *Parser {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Parse the document and return a Microdata set
 | 
			
		||||
func (self *Parser) Parse() (*Microdata, error) {
 | 
			
		||||
	err := self.p.Parse()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@ -159,7 +180,7 @@ func (self *Parser) readItem(item *Item, node *h5.Node) {
 | 
			
		||||
			for _, propertyName := range strings.Split(strings.TrimSpace(itemprop), " ") {
 | 
			
		||||
				propertyName = strings.TrimSpace(propertyName)
 | 
			
		||||
				if propertyName != "" {
 | 
			
		||||
					item.SetItem(propertyName, subitem)
 | 
			
		||||
					item.AddItem(propertyName, subitem)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
@ -207,7 +228,7 @@ func (self *Parser) readItem(item *Item, node *h5.Node) {
 | 
			
		||||
				for _, propertyName := range strings.Split(strings.TrimSpace(itemprop), " ") {
 | 
			
		||||
					propertyName = strings.TrimSpace(propertyName)
 | 
			
		||||
					if propertyName != "" {
 | 
			
		||||
						item.SetString(propertyName, propertyValue)
 | 
			
		||||
						item.AddString(propertyName, propertyValue)
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
@ -534,7 +534,7 @@ func TestParseItemRelativeId(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
func TestJson(t *testing.T) {
 | 
			
		||||
	item := NewItem()
 | 
			
		||||
	item.SetString("name", "Elizabeth")
 | 
			
		||||
	item.AddString("name", "Elizabeth")
 | 
			
		||||
 | 
			
		||||
	data := NewMicrodata()
 | 
			
		||||
	data.AddItem(item)
 | 
			
		||||
@ -551,7 +551,7 @@ func TestJson(t *testing.T) {
 | 
			
		||||
func TestJsonWithType(t *testing.T) {
 | 
			
		||||
	item := NewItem()
 | 
			
		||||
	item.AddType("http://example.org/animals#cat")
 | 
			
		||||
	item.SetString("name", "Elizabeth")
 | 
			
		||||
	item.AddString("name", "Elizabeth")
 | 
			
		||||
 | 
			
		||||
	data := NewMicrodata()
 | 
			
		||||
	data.AddItem(item)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user