Added basic docs and renamed SetString, SetItem to AddString, AddItem

pull/2/head
Ian Davis 2012-06-10 19:55:12 +01:00
parent 0b1fbba09d
commit 83080b03e8
2 changed files with 27 additions and 6 deletions

View File

@ -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 package microdata
import ( import (
@ -12,12 +19,14 @@ import (
type ValueList []interface{} type ValueList []interface{}
type PropertyMap map[string]ValueList type PropertyMap map[string]ValueList
// Represents a microdata item
type Item struct { type Item struct {
Properties PropertyMap `json:"properties"` Properties PropertyMap `json:"properties"`
Types []string `json:"type,omitempty"` Types []string `json:"type,omitempty"`
ID string `json:"id,omitempty"` ID string `json:"id,omitempty"`
} }
// Create a new microdata item
func NewItem() *Item { func NewItem() *Item {
return &Item{ return &Item{
Properties: make(PropertyMap, 0), 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) 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) self.Properties[property] = append(self.Properties[property], value)
} }
// Add a type to the item
func (self *Item) AddType(value string) { func (self *Item) AddType(value string) {
self.Types = append(self.Types, value) self.Types = append(self.Types, value)
} }
// Represents a set of microdata items
type Microdata struct { type Microdata struct {
Items []*Item `json:"items"` Items []*Item `json:"items"`
} }
// Create a new microdata set
func NewMicrodata() *Microdata { func NewMicrodata() *Microdata {
return &Microdata{ return &Microdata{
Items: make([]*Item, 0), Items: make([]*Item, 0),
} }
} }
// Add an item to the microdata set
func (self *Microdata) AddItem(value *Item) { func (self *Microdata) AddItem(value *Item) {
self.Items = append(self.Items, value) self.Items = append(self.Items, value)
} }
// Convert the microdata set to JSON
func (self *Microdata) Json() ([]byte, error) { func (self *Microdata) Json() ([]byte, error) {
b, err := json.Marshal(self) b, err := json.Marshal(self)
if err != nil { if err != nil {
@ -59,6 +75,7 @@ func (self *Microdata) Json() ([]byte, error) {
return b, nil return b, nil
} }
// An HTML parser that extracts microdata
type Parser struct { type Parser struct {
p *h5.Parser p *h5.Parser
data *Microdata data *Microdata
@ -66,6 +83,9 @@ type Parser struct {
identifiedNodes map[string]*h5.Node 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 { func NewParser(r io.Reader, base *url.URL) *Parser {
return &Parser{ return &Parser{
p: h5.NewParser(r), 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) { func (self *Parser) Parse() (*Microdata, error) {
err := self.p.Parse() err := self.p.Parse()
if err != nil { if err != nil {
@ -159,7 +180,7 @@ func (self *Parser) readItem(item *Item, node *h5.Node) {
for _, propertyName := range strings.Split(strings.TrimSpace(itemprop), " ") { for _, propertyName := range strings.Split(strings.TrimSpace(itemprop), " ") {
propertyName = strings.TrimSpace(propertyName) propertyName = strings.TrimSpace(propertyName)
if 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), " ") { for _, propertyName := range strings.Split(strings.TrimSpace(itemprop), " ") {
propertyName = strings.TrimSpace(propertyName) propertyName = strings.TrimSpace(propertyName)
if propertyName != "" { if propertyName != "" {
item.SetString(propertyName, propertyValue) item.AddString(propertyName, propertyValue)
} }
} }
} }

View File

@ -534,7 +534,7 @@ func TestParseItemRelativeId(t *testing.T) {
func TestJson(t *testing.T) { func TestJson(t *testing.T) {
item := NewItem() item := NewItem()
item.SetString("name", "Elizabeth") item.AddString("name", "Elizabeth")
data := NewMicrodata() data := NewMicrodata()
data.AddItem(item) data.AddItem(item)
@ -551,7 +551,7 @@ func TestJson(t *testing.T) {
func TestJsonWithType(t *testing.T) { func TestJsonWithType(t *testing.T) {
item := NewItem() item := NewItem()
item.AddType("http://example.org/animals#cat") item.AddType("http://example.org/animals#cat")
item.SetString("name", "Elizabeth") item.AddString("name", "Elizabeth")
data := NewMicrodata() data := NewMicrodata()
data.AddItem(item) data.AddItem(item)