forked from ukamnya/microdata_mirror
Added basic docs and renamed SetString, SetItem to AddString, AddItem
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…
Reference in New Issue