From: <sam...@us...> - 2010-10-25 18:52:51
|
Revision: 30293 http://tikiwiki.svn.sourceforge.net/tikiwiki/?rev=30293&view=rev Author: sampaioprimo Date: 2010-10-25 18:52:45 +0000 (Mon, 25 Oct 2010) Log Message: ----------- wordpress importer: import tags Modified Paths: -------------- trunk/lib/importer/tikiimporter_blog.php trunk/lib/importer/tikiimporter_blog_wordpress.php trunk/lib/importer/tikiimporter_wiki.php trunk/lib/test/importer/TikiImporterBlogTest.php trunk/lib/test/importer/TikiImporterBlogWordpressTest.php trunk/lib/test/importer/TikiImporterWikiTest.php Modified: trunk/lib/importer/tikiimporter_blog.php =================================================================== --- trunk/lib/importer/tikiimporter_blog.php 2010-10-25 18:30:21 UTC (rev 30292) +++ trunk/lib/importer/tikiimporter_blog.php 2010-10-25 18:52:45 UTC (rev 30293) @@ -114,30 +114,41 @@ $this->createBlog(); if (!empty($parsedData)) { - foreach ($parsedData as $item) { - $methodName = 'insert' . ucfirst($item['type']); + if (!empty($parsedData['tags'])) { + $this->createTags($parsedData['tags']); + } + if (!empty($parsedData['items'])) { + //TODO: move this foreach to a function (insertItems()) + foreach ($parsedData['items'] as $item) { + $methodName = 'insert' . ucfirst($item['type']); + + if ($objId = $this->$methodName($item)) { + $countItems++; + $this->saveAndDisplayLog('Item ' . $item['name'] . " sucessfully imported\n"); - if ($objId = $this->$methodName($item)) { - $countItems++; - $this->saveAndDisplayLog('Item ' . $item['name'] . " sucessfully imported\n"); - - if (!empty($item['comments'])) { if ($item['type'] == 'page') { $type = 'wiki page'; } else if ($item['type'] == 'post') { $type = 'blog post'; } - $this->insertComments($objId, $type, $item['comments']); + if (!empty($item['comments'])) { + $this->insertComments($objId, $type, $item['comments']); + } + + if (!empty($item['tags'])) { + $this->linkObjectWithTags($objId, $type, $item['tags']); + } + + } else { + $this->saveAndDisplayLog('Item ' . $item['name'] . " NOT imported (there was already a item with the same name)\n"); } - - } else { - $this->saveAndDisplayLog('Item ' . $item['name'] . " NOT imported (there was already a item with the same name)\n"); } } } - $countData['totalPages'] = count($parsedData); + //TODO: extend the output to report the user how many tags and categories were created (not only pages and posts) + $countData['totalPages'] = (isset($parsedData['items'])) ? count($parsedData['items']) : 0; $countData['importedPages'] = $countItems; return $countData; } @@ -158,6 +169,36 @@ } /** + * Create all existing tags for a blog. Tags here + * are just created, not related yet with any object (post or page) + * + * @param array $tags + * @return void + */ + function createTags($tags) + { + global $freetaglib; require_once('lib/freetag/freetaglib.php'); + foreach ($tags as $tag) { + $freetaglib->find_or_create_tag($tag); + } + } + + /** + * Link an object with its tags + * + * @param $objId + * @param $type + * @param $tags + * @return void + */ + function linkObjectWithTags($objId, $type, $tags) { + global $freetaglib; require_once('lib/freetag/freetaglib.php'); + global $user; + + $freetaglib->_tag_object_array($user, $objId, $type, $tags); + } + + /** * Insert page into Tiki using its builtin methods * * @param array $page @@ -192,7 +233,14 @@ function insertPost($post) { global $bloglib; - return $bloglib->blog_post($this->blogId, $post['content'], $post['excerpt'], $post['author'], $post['name'], '', 'n', $post['created']); + global $objectlib; require_once('lib/objectlib.php'); + $postId = $bloglib->blog_post($this->blogId, $post['content'], $post['excerpt'], $post['author'], $post['name'], '', 'n', $post['created']); + + if ($postId) { + $objectlib->insert_object('blog post', $postId, '', $post['name'], 'tiki-view_blog_post.php?postId=' . urlencode($postId)); + } + + return $postId; } /** Modified: trunk/lib/importer/tikiimporter_blog_wordpress.php =================================================================== --- trunk/lib/importer/tikiimporter_blog_wordpress.php 2010-10-25 18:30:21 UTC (rev 30292) +++ trunk/lib/importer/tikiimporter_blog_wordpress.php 2010-10-25 18:52:45 UTC (rev 30293) @@ -61,6 +61,9 @@ $tikilib->set_preference('feature_blogposts_comments', 'y'); $tikilib->set_preference('feature_comments_moderation', 'y'); $tikilib->set_preference('comments_notitle', 'y'); + $tikilib->set_preference('feature_freetags', 'y'); + $tikilib->set_preference('feature_categories', 'y'); + $tikilib->set_preference('feature_wiki_comments', 'y'); parent::setupTiki(); } @@ -119,29 +122,46 @@ } } - //TODO: handle tags, categories and comments + //TODO: handle categories /** - * Foreach <item> element check if it is a post, page or - * attachment and call the proper method + * Calls the respective functions to extract and parse (when needed) + * items (pages, posts and attachments), categories and tags. * - * @return array $parsedData + * @return array each key of this array contain one set of data (items, categories and tags) */ function parseData() { + $this->extractBlogInfo(); + $parsedData = array(); - $items = $this->dom->getElementsByTagName('item'); - + $this->saveAndDisplayLog("\nStarting to parse data:\n"); + + // pages or posts + $parsedData['items'] = $this->extractItems(); + + $parsedData['tags'] = $this->extractTags(); - $this->extractBlogInfo(); + return $parsedData; + } + + //TODO: handle attachments + /** + * Extract pages, posts and attachments + * + * @return array all extract items (pages, posts and attachments) + */ + function extractItems() + { + $data = $this->dom->getElementsByTagName('item'); - foreach ($items as $item) { + foreach ($data as $item) { $type = $item->getElementsByTagName('post_type')->item(0)->nodeValue; $status = $item->getElementsByTagName('status')->item(0)->nodeValue; if (($type == 'post' || $type == 'page') && $status == 'publish') { try { - $parsedData[] = $this->extractInfo($item); + $items[] = $this->extractInfo($item); } catch (ImporterParserException $e) { $this->saveAndDisplayLog($e->getMessage(), true); } @@ -149,11 +169,29 @@ } } - - return $parsedData; + + return $items; } /** + * Return all tags present in the Wordpress XML file + * + * @return array tags + */ + function extractTags() + { + $tags = array(); + + $data = $this->dom->getElementsByTagName('tag'); + + foreach ($data as $tag) { + $tags[] = $tag->getElementsByTagName('tag_name')->item(0)->nodeValue; + } + + return $tags; + } + + /** * Searches for the last version of each attachments in the XML file * and try to download it to the img/wiki_up/ directory * Modified: trunk/lib/importer/tikiimporter_wiki.php =================================================================== --- trunk/lib/importer/tikiimporter_wiki.php 2010-10-25 18:30:21 UTC (rev 30292) +++ trunk/lib/importer/tikiimporter_wiki.php 2010-10-25 18:52:45 UTC (rev 30293) @@ -165,6 +165,6 @@ } } - return true; + return $page['name']; } } Modified: trunk/lib/test/importer/TikiImporterBlogTest.php =================================================================== --- trunk/lib/test/importer/TikiImporterBlogTest.php 2010-10-25 18:30:21 UTC (rev 30292) +++ trunk/lib/test/importer/TikiImporterBlogTest.php 2010-10-25 18:52:45 UTC (rev 30293) @@ -48,12 +48,14 @@ $obj->expects($this->exactly(2))->method('insertPage'); $obj->expects($this->exactly(4))->method('insertPost'); $parsedData = array( - array('type' => 'post', 'name' => 'Any name'), - array('type' => 'post', 'name' => 'Any name'), - array('type' => 'page', 'name' => 'Any name'), - array('type' => 'post', 'name' => 'Any name'), - array('type' => 'page', 'name' => 'Any name'), - array('type' => 'post', 'name' => 'Any name'), + 'items' => array( + array('type' => 'post', 'name' => 'Any name'), + array('type' => 'post', 'name' => 'Any name'), + array('type' => 'page', 'name' => 'Any name'), + array('type' => 'post', 'name' => 'Any name'), + array('type' => 'page', 'name' => 'Any name'), + array('type' => 'post', 'name' => 'Any name'), + ), ); $obj->insertData($parsedData); } @@ -74,12 +76,14 @@ $obj->expects($this->exactly(6))->method('insertPage')->will($this->onConsecutiveCalls(true, true, false, true, false, true)); $parsedData = array( - array('type' => 'page', 'name' => 'Any name'), - array('type' => 'page', 'name' => 'Any name'), - array('type' => 'page', 'name' => 'Any name'), - array('type' => 'page', 'name' => 'Any name'), - array('type' => 'page', 'name' => 'Any name'), - array('type' => 'page', 'name' => 'Any name'), + 'items' => array( + array('type' => 'page', 'name' => 'Any name'), + array('type' => 'page', 'name' => 'Any name'), + array('type' => 'page', 'name' => 'Any name'), + array('type' => 'page', 'name' => 'Any name'), + array('type' => 'page', 'name' => 'Any name'), + array('type' => 'page', 'name' => 'Any name'), + ), ); $countData = $obj->insertData($parsedData); @@ -96,12 +100,14 @@ $obj->expects($this->exactly(3))->method('insertComments')->with('Any name', 'wiki page'); $parsedData = array( - array('type' => 'page', 'name' => 'Any name', 'comments' => array(1, 2, 3)), - array('type' => 'page', 'name' => 'Any name', 'comments' => array(1, 2)), - array('type' => 'page', 'name' => 'Any name'), - array('type' => 'page', 'name' => 'Any name', 'comments' => array()), - array('type' => 'page', 'name' => 'Any name'), - array('type' => 'page', 'name' => 'Any name', 'comments' => array(1, 2, 3)), + 'items' => array( + array('type' => 'page', 'name' => 'Any name', 'comments' => array(1, 2, 3)), + array('type' => 'page', 'name' => 'Any name', 'comments' => array(1, 2)), + array('type' => 'page', 'name' => 'Any name'), + array('type' => 'page', 'name' => 'Any name', 'comments' => array()), + array('type' => 'page', 'name' => 'Any name'), + array('type' => 'page', 'name' => 'Any name', 'comments' => array(1, 2, 3)), + ), ); $countData = $obj->insertData($parsedData); @@ -115,8 +121,10 @@ $obj2->expects($this->exactly(2))->method('insertComments')->with('Any name', 'blog post'); $parsedData = array( - array('type' => 'post', 'name' => 'Any name', 'comments' => array(1, 2, 3)), - array('type' => 'post', 'name' => 'Any name', 'comments' => array(1, 2)), + 'items' => array( + array('type' => 'post', 'name' => 'Any name', 'comments' => array(1, 2, 3)), + array('type' => 'post', 'name' => 'Any name', 'comments' => array(1, 2)), + ), ); $countData = $obj2->insertData($parsedData); @@ -152,4 +160,43 @@ $obj->insertPage(array()); } + + public function testInsertPost() + { + global $objectlib; require_once('lib/objectlib.php'); + global $bloglib; require_once('lib/blogs/bloglib.php'); + + $bloglib = $this->getMock('BlogLib', array('blog_post')); + $bloglib->expects($this->once())->method('blog_post')->will($this->returnValue(1)); + + $objectlib = $this->getMock('ObjectLib', array('insert_object')); + $objectlib->expects($this->once())->method('insert_object'); + + $post = array('content' => 'asdf', 'excerpt' => '', 'author' => 'admin', 'name' => 'blog post title', 'created' => 1234); + + $this->obj->insertPost($post); + } + + public function testCreateTags() + { + global $freetaglib; require_once('lib/freetag/freetaglib.php'); + $freetaglib = $this->getMock('FreetagLib', array('find_or_create_tag')); + $freetaglib->expects($this->exactly(4))->method('find_or_create_tag'); + + $tags = array('tag1', 'tag2', 'tag3', 'tag4'); + + $this->obj->createTags($tags); + } + + public function testLinkObjectWithTags() + { + global $freetaglib; require_once('lib/freetag/freetaglib.php'); + $freetaglib = $this->getMock('FreetagLib', array('_tag_object_array')); + $freetaglib->expects($this->once())->method('_tag_object_array'); + + $tags = array('tag1', 'tag2', 'tag3', 'tag4'); + + $this->obj->linkObjectWithTags('user', 'HomePage', 'wiki page', $tags); + } + } \ No newline at end of file Modified: trunk/lib/test/importer/TikiImporterBlogWordpressTest.php =================================================================== --- trunk/lib/test/importer/TikiImporterBlogWordpressTest.php 2010-10-25 18:30:21 UTC (rev 30292) +++ trunk/lib/test/importer/TikiImporterBlogWordpressTest.php 2010-10-25 18:52:45 UTC (rev 30293) @@ -63,16 +63,42 @@ public function testParseData() { - $obj = $this->getMock('TikiImporter_Blog_Wordpress', array('extractInfo', 'extractBlogInfo')); - $obj->dom = new DOMDocument; - $obj->dom->load(dirname(__FILE__) . '/fixtures/wordpress_sample.xml'); - $obj->expects($this->exactly(5))->method('extractInfo')->will($this->returnValue(array())); + $obj = $this->getMock('TikiImporter_Blog_Wordpress', array('extractItems', 'extractBlogInfo', 'extractTags')); + $obj->expects($this->once())->method('extractItems')->will($this->returnValue(array())); $obj->expects($this->once())->method('extractBlogInfo')->will($this->returnValue(array())); $this->expectOutputString("\nStarting to parse data:\n"); $parsedData = $obj->parseData(); - $this->assertEquals(5, count($parsedData)); + $this->assertEquals(2, count($parsedData)); } + + public function testExtractItems() + { + $obj = $this->getMock('TikiImporter_Blog_Wordpress', array('extractInfo')); + $obj->dom = new DOMDocument; + $obj->dom->load(dirname(__FILE__) . '/fixtures/wordpress_sample.xml'); + $obj->expects($this->exactly(5))->method('extractInfo')->will($this->returnValue(array())); + $expectedResult = $obj->extractItems(); + $this->assertEquals(5, count($expectedResult)); + } + public function testExtractTags() + { + $expectedResult = array('alta montanha', 'barcelona', 'bicicleta', 'bicicletada', 'buenos aires', 'caminhada', 'canadá', 'carga', + 'cerro plata', 'chapada diamantina', 'chapada dos veadeiras', 'chile', 'cicloativismo', 'cicloturismo', 'cidade', 'cidades', + 'comida', 'conhecimento livre', 'creative commons', 'davi marski', 'debate', 'die-in', 'digikam', 'dmsc', 'dmsc2010', + 'el chaltén', 'eleições', 'escalada', 'europa', 'exiv2', 'filme', 'fotos', 'gelo', 'gettext', 'ghost bike', 'gsoc', 'hacklab', + 'januária', 'linux', 'livros', 'londres', 'mapas', 'mediawiki', 'mendoza', 'montanhismo', 'montreal', 'mudanças', 'osorno', + 'parser', 'partidos políticos', 'patagônia', 'pear', 'php', 'phpbb', 'phpdocumentor', 'phpt', 'phpunit', 'plugin', + 'quinta livre', 'restaurantes vegetarianos', 'san pedro de atacama', 'santiago', 'são paulo', 'software livre', 'Text_Wiki', + 'tikifest', 'tikiwiki', 'tinymce', 'torres del paine', 'transporte', 'trekking', 'tv', 'ubuntu', 'unit tests', 'usp', + 'vegetarianismo', 'vídeo', 'vulcão', 'vulcão maipo', 'wiki', 'wordpress', 'youtube'); + + $this->obj->dom = new DOMDocument; + $this->obj->dom->load(dirname(__FILE__) . '/fixtures/wordpress_sample.xml'); + + $this->assertEquals($expectedResult, $this->obj->extractTags()); + } + public function testExtractInfoPost() { $obj = $this->getMock('TikiImporter_Blog_Wordpress', array('extractComment')); Modified: trunk/lib/test/importer/TikiImporterWikiTest.php =================================================================== --- trunk/lib/test/importer/TikiImporterWikiTest.php 2010-10-25 18:30:21 UTC (rev 30292) +++ trunk/lib/test/importer/TikiImporterWikiTest.php 2010-10-25 18:52:45 UTC (rev 30293) @@ -115,7 +115,7 @@ $tikilib->expects($this->exactly(7))->method('update_page'); // $page is set on mediawiki_page_as_array.php - $this->assertTrue($this->obj->insertPage($page)); + $this->assertEquals('Redes de ensino', $this->obj->insertPage($page)); } public function testInsertPageAlreadyExistentPageNameOverride() @@ -127,7 +127,7 @@ $tikilib->expects($this->exactly(7))->method('update_page'); $this->obj->alreadyExistentPageName = 'override'; - $this->assertTrue($this->obj->insertPage($page)); + $this->assertEquals('Redes de ensino', $this->obj->insertPage($page)); } public function testInsertPageAlreadyExistentPageNameAppendPrefix() @@ -141,7 +141,7 @@ $tikilib->expects($this->exactly(7))->method('update_page')->with($newPageName); $this->obj->alreadyExistentPageName = 'appendPrefix'; - $this->assertTrue($this->obj->insertPage($page)); + $this->assertEquals('Mediawiki_Redes de ensino', $this->obj->insertPage($page)); } public function testInsertPageAlreadyExistentPageNameDoNotImport() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |