From 60284479936d65443bd5dc14456bc0b692eab500 Mon Sep 17 00:00:00 2001 From: Jozef Selesi Date: Sat, 22 Nov 2008 18:22:53 +0000 Subject: An Atom library prototype. Its purpose is to explore the cost of us supporting Atom as the default input and output format of RESTful controllers. Only the constructs necessary for representing comment feeds and entries have been implemented. Its output are valid Atom 1.0 documents. The test contains examples of how to make feeds and entries. --- modules/atom/libraries/Atom_Author.php | 35 ++++++++++++++++ modules/atom/libraries/Atom_Base.php | 74 ++++++++++++++++++++++++++++++++++ modules/atom/libraries/Atom_Entry.php | 50 +++++++++++++++++++++++ modules/atom/libraries/Atom_Feed.php | 49 ++++++++++++++++++++++ modules/atom/libraries/Atom_Link.php | 40 ++++++++++++++++++ 5 files changed, 248 insertions(+) create mode 100644 modules/atom/libraries/Atom_Author.php create mode 100644 modules/atom/libraries/Atom_Base.php create mode 100644 modules/atom/libraries/Atom_Entry.php create mode 100644 modules/atom/libraries/Atom_Feed.php create mode 100644 modules/atom/libraries/Atom_Link.php (limited to 'modules/atom/libraries') diff --git a/modules/atom/libraries/Atom_Author.php b/modules/atom/libraries/Atom_Author.php new file mode 100644 index 00000000..ec3c61aa --- /dev/null +++ b/modules/atom/libraries/Atom_Author.php @@ -0,0 +1,35 @@ +element->appendChild($this->dom->createElement("name", $name)); + return $this; + } + + public function email($email) { + $this->element->appendChild($this->dom->createElement("email", $email)); + return $this; + } + + public function uri($uri) { + $this->element->appendChild($this->dom->createElement("uri", $uri)); + return $this; + } +} diff --git a/modules/atom/libraries/Atom_Base.php b/modules/atom/libraries/Atom_Base.php new file mode 100644 index 00000000..62fdfea1 --- /dev/null +++ b/modules/atom/libraries/Atom_Base.php @@ -0,0 +1,74 @@ +dom = $dom; + $this->element = $dom->createElement($element_name); + } else { + $this->dom = new DOMDocument('1.0', 'utf-8'); + $this->element = $this->dom->createElementNS("http://www.w3.org/2005/Atom", $element_name); + } + $this->dom->appendChild($this->element); + $this->element_name = $element_name; + return $this; + } + + public function get_element() { + $this->add_children_to_base_element(); + return $this->element; + } + + public function as_xml() { + $this->add_children_to_base_element(); + return $this->dom->saveXML(); + } + + public function as_json() { + $this->add_children_to_base_element(); + /* Both Google and Yahoo generate their JSON from XML. We could do that, too. */ + return null; + } + + public function load_xml($xml) { + /* Load XML into our DOM. We can also validate against the RELAX NG schema from the Atom RFC. */ + } + + protected function add_child($element_type, $element_name) { + // @todo check if element_type is of Atom_Base; this can also be done with no magic + $element = new $element_type($element_name, $this->dom); + $this->children[$element_name][] = $element; + return end($this->children[$element_name]); + } + + protected function add_children_to_base_element() { + foreach ($this->children as $element_type => $elements) { + $base_element = $this->dom->getElementsByTagName($this->element_name)->item(0); + foreach ($elements as $id => $element) { + $base_element->appendChild($element->get_element()); + } + } + } +} \ No newline at end of file diff --git a/modules/atom/libraries/Atom_Entry.php b/modules/atom/libraries/Atom_Entry.php new file mode 100644 index 00000000..d566f49b --- /dev/null +++ b/modules/atom/libraries/Atom_Entry.php @@ -0,0 +1,50 @@ +element->appendChild($this->dom->createElement("id", $id)); + return $this; + } + + public function updated($updated) { + $this->element->appendChild($this->dom->createElement("updated", $updated)); + return $this; + } + + public function title($title) { + $this->element->appendChild($this->dom->createElement("title", $title)); + return $this; + } + + public function content($text, $type="html") { + $content = $this->dom->createElement("content", $text); + $content->setAttribute("type", $type); + $this->element->appendChild($content); + return $this; + } + + public function author() { + return $this->add_child("Atom_Author", "author"); + } + + public function link() { + return $this->add_child("Atom_Link", "link"); + } +} diff --git a/modules/atom/libraries/Atom_Feed.php b/modules/atom/libraries/Atom_Feed.php new file mode 100644 index 00000000..0b667e88 --- /dev/null +++ b/modules/atom/libraries/Atom_Feed.php @@ -0,0 +1,49 @@ +element->appendChild($this->dom->createElement("id", $id)); + return $this; + } + + public function title($title) { + $this->element->appendChild($this->dom->createElement("title", $title)); + return $this; + } + + public function updated($updated) { + $this->element->appendChild($this->dom->createElement("updated", $updated)); + return $this; + } + + public function link() { + return $this->add_child("Atom_Link", "link"); + } + + public function entry() { + /* Create new empty entry. */ + return $this->add_child("Atom_Entry", "entry"); + } + + public function append_entry($atom_entry) { + /* Append an exising entry. */ + $this->element->appendChild($atom_entry->get_element()); + } +} diff --git a/modules/atom/libraries/Atom_Link.php b/modules/atom/libraries/Atom_Link.php new file mode 100644 index 00000000..5fff30f2 --- /dev/null +++ b/modules/atom/libraries/Atom_Link.php @@ -0,0 +1,40 @@ +element->setAttribute("rel", $rel); + return $this; + } + + public function type($type) { + $this->element->setAttribute("type", $type); + return $this; + } + + public function title($title) { + $this->element->setAttribute("title", $title); + return $this; + } + + public function href($href) { + $this->element->setAttribute("href", $href); + return $this; + } +} -- cgit v1.2.3