diff --git a/plugins/Bookmark/BookmarkPlugin.php b/plugins/Bookmark/BookmarkPlugin.php index 3f36770391..14b1f1d2a5 100644 --- a/plugins/Bookmark/BookmarkPlugin.php +++ b/plugins/Bookmark/BookmarkPlugin.php @@ -115,6 +115,7 @@ class BookmarkPlugin extends Plugin include_once $dir.'/'.$cls.'.php'; return false; case 'BookmarkForm': + case 'DeliciousBackupImporter': include_once $dir.'/'.strtolower($cls).'.php'; return false; default: diff --git a/plugins/Bookmark/deliciousbackupimporter.php b/plugins/Bookmark/deliciousbackupimporter.php new file mode 100644 index 0000000000..af34f6066b --- /dev/null +++ b/plugins/Bookmark/deliciousbackupimporter.php @@ -0,0 +1,117 @@ +importHTML($body); + + $dls = $doc->getElementsByTagName('dl'); + + if ($dls->length != 1) { + throw new ClientException(_("Bad import file.")); + } + + $dl = $dls->item(0); + + $children = $dl->childNodes; + + common_debug("
child nodes is " . $children->length); + + $dt = null; + + for ($i = 0; $i < $children->length; $i++) { + try { + $child = $children->item($i); + if ($child->nodeType != XML_ELEMENT_NODE) { + continue; + } + common_log(LOG_INFO, $child->tagName); + switch (strtolower($child->tagName)) { + case 'dt': + if (!empty($dt)) { + // No DD provided + $this->importBookmark($user, $dt); + $dt = null; + } + $dt = $child; + break; + case 'dd': + $dd = $child; + $saved = $this->importBookmark($user, $dt, $dd); + $dt = null; + case 'p': + common_log(LOG_INFO, 'Skipping the

in the

.'); + break; + default: + common_log(LOG_WARNING, "Unexpected element $child->tagName found in import."); + } + } catch (Exception $e) { + common_log(LOG_ERR, $e->getMessage()); + } + } + } + + function importBookmark($user, $dt, $dd = null) + { + common_debug("DT child nodes length = " . $dt->childNodes->length); + + for ($i = 0; $i < $dt->childNodes->length; $i++) { + $child = $dt->childNodes->item($i); + if ($child->nodeType == XML_ELEMENT_NODE) { + common_debug('DT has an element child with tag name '. $child->tagName); + } + } + + $as = $dt->getElementsByTagName('a'); + + if ($as->length == 0) { + throw new ClientException(_("No tag in a
.")); + } + + $a = $as->item(0); + + $private = $a->getAttribute('private'); + + if ($private != 0) { + throw new ClientException(_('Skipping private bookmark.')); + } + + if (!empty($dd)) { + $description = $dd->nodeValue; + } else { + $description = null; + } + + $title = $a->getAttribute('title'); + $url = $a->getAttribute('href'); + $tags = $a->getAttribute('tags'); + $addDate = $a->getAttribute('add_date'); + $created = common_sql_date(intval($addDate)); + + $saved = Notice_bookmark::saveNew($user, + $title, + $url, + $tags, + $description, + array('created' => $created)); + + return $saved; + } + + function importHTML($body) + { + // DOMDocument::loadHTML may throw warnings on unrecognized elements, + // and notices on unrecognized namespaces. + $old = error_reporting(error_reporting() & ~(E_WARNING | E_NOTICE)); + $dom = new DOMDocument(); + $ok = $dom->loadHTML($body); + error_reporting($old); + + if ($ok) { + return $dom; + } else { + return null; + } + } +} diff --git a/plugins/Bookmark/importbookmarks.php b/plugins/Bookmark/importbookmarks.php new file mode 100644 index 0000000000..3074be39f9 --- /dev/null +++ b/plugins/Bookmark/importbookmarks.php @@ -0,0 +1,79 @@ +. + */ + +define('INSTALLDIR', realpath(dirname(__FILE__) . '/../..')); + +$shortoptions = 'i:n:f:'; +$longoptions = array('id=', 'nickname=', 'file='); + +$helptext = <<importBookmarks($user, $html); + +} catch (Exception $e) { + print $e->getMessage()."\n"; + exit(1); +}