From 6a4210822fa30cdb30592dc42227c9d651b656c2 Mon Sep 17 00:00:00 2001 From: garvinhicking Date: Tue, 25 Jul 2006 08:29:14 +0000 Subject: [PATCH] add livejournal import --- docs/NEWS | 2 + include/admin/importers/livejournal.inc.php | 215 ++++++++++++++++++++ 2 files changed, 217 insertions(+) create mode 100644 include/admin/importers/livejournal.inc.php diff --git a/docs/NEWS b/docs/NEWS index 0f36b04..8a056ec 100644 --- a/docs/NEWS +++ b/docs/NEWS @@ -3,6 +3,8 @@ Version 1.1-alpha7() ------------------------------------------------------------------------ + * Add LiveJournal XML importer (garvinhicking) + * Fix not fetching allow_comments/moderate_comments value when inside search function. Thanks to stm! (garvinhicking) diff --git a/include/admin/importers/livejournal.inc.php b/include/admin/importers/livejournal.inc.php new file mode 100644 index 0000000..ea13de3 --- /dev/null +++ b/include/admin/importers/livejournal.inc.php @@ -0,0 +1,215 @@ + 'LiveJournal XML'); + var $data = array(); + var $inputFields = array(); + + function Serendipity_Import_LiveJournalXML($data) { + global $serendipity; + $this->data = $data; + $this->inputFields = array(array('text' => 'LiveJournal XML', + 'type' => 'input', + 'name' => 'url', + 'default' => $serendipity['serendipityPath'] . $serendipity['uploadPath'] . 'EVbackup.xml'), + + array('text' => RSS_IMPORT_CATEGORY, + 'type' => 'list', + 'name' => 'category', + 'value' => 0, + 'default' => $this->_getCategoryList()), + + array('text' => STATUS, + 'type' => 'list', + 'name' => 'type', + 'value' => 'publish', + 'default' => array('publish' => PUBLISH, 'draft' => DRAFT)), + + ); + } + + function _getCategoryList() { + $res = serendipity_fetchCategories('all'); + $ret = array(0 => NO_CATEGORY); + if (is_array($res)) { + foreach ($res as $v) { + $ret[$v['categoryid']] = $v['category_name']; + } + } + return $ret; + } + + function GetChildren(&$vals, &$i) { + $children = array(); + $cnt = sizeof($vals); + while (++$i < $cnt) { + // compare type + switch ($vals[$i]['type']) { + case 'cdata': + $children[] = $vals[$i]['value']; + break; + + case 'complete': + $children[] = array( + 'tag' => $vals[$i]['tag'], + 'attributes' => $vals[$i]['attributes'], + 'value' => $vals[$i]['value'] + ); + break; + + case 'open': + $children[] = array( + 'tag' => $vals[$i]['tag'], + 'attributes' => $vals[$i]['attributes'], + 'value' => $vals[$i]['value'], + 'children' => $this->GetChildren($vals, $i) + ); + break; + + case 'close': + return $children; + } + } + } + + function &parseXML(&$xml) { + // XML functions + $xml_string = ''; + if (preg_match('@(<\?xml.+\?>)@imsU', $xml, $xml_head)) { + $xml_string = $xml_head[1]; + } + + $encoding = 'UTF-8'; + if (preg_match('@encoding="([^"]+)"@', $xml_string, $xml_encoding)) { + $encoding = $xml_encoding[1]; + } + + preg_match_all('@(.*)@imsU', $xml, $xml_matches); + if (!is_array($xml_matches)) { + return false; + } + + $i = 0; + $tree = array(); + $tree[$i] = array( + 'tag' => 'entries', + 'attributes' => '', + 'value' => '', + 'children' => array() + ); + + foreach($xml_matches[0] as $xml_index => $xml_package) { + $i = 0; + + switch(strtolower($encoding)) { + case 'iso-8859-1': + case 'utf-8': + $p = xml_parser_create($encoding); + break; + + default: + $p = xml_parser_create(''); + } + + xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, 0); + @xml_parser_set_option($p, XML_OPTION_TARGET_ENCODING, LANG_CHARSET); + $xml_package = $xml_string . "\n" . $xml_package; + xml_parse_into_struct($p, $xml_package, $vals); + xml_parser_free($p); + $tree[0]['children'][] = array( + 'tag' => $vals[$i]['tag'], + 'attributes' => $vals[$i]['attributes'], + 'value' => $vals[$i]['value'], + 'children' => $this->GetChildren($vals, $i) + ); + unset($vals); + } + + return $tree; + } + + function validateData() { + return sizeof($this->data); + } + + function getInputFields() { + return $this->inputFields; + } + + function getTimestamp($string) { + if (preg_match('@(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})@', $string, $match)) { + return mktime($match[4], $match[5], $match[6], $match[2], $match[3], $match[1]); + } else { + return time(); + } + } + + function import() { + global $serendipity; + + if (!file_exists($this->data['url'])) { + printf(FILE_NOT_FOUND, htmlspecialchars($this->data['url'])); + return false; + } + + $file = file_get_contents($this->data['url']); + $tree =& $this->parseXML($file); + $serendipity['noautodiscovery'] = 1; + + foreach($tree[0]['children'] AS $idx => $entry) { + if (!is_array($entry)) continue; + if ($entry['tag'] != 'entry') { + continue; + } + + $new_entry = array( + 'allow_comments' => true, + 'extended' => '', + 'categories' => array(), + 'isdraft' => ($this->data['type'] == 'draft' ? 'true' : 'false'), + 'categories' => array($this->data['category'] => $this->data['category']) + ); + + if (!is_array($entry['children'])) continue; + + foreach($entry['children'] AS $idx2 => $entrydata) { + if (!is_array($entrydata)) { + continue; + } + + switch($entrydata['tag']) { + case 'eventtime': + $new_entry['timestamp'] = $this->getTimestamp($entrydata['value']); + break; + + case 'subject': + $new_entry['title'] = $entrydata['value']; + break; + + case 'event': + $new_entry['body'] = $entrydata['value']; + break; + } + } + $id = serendipity_updertEntry($new_entry); + echo 'Inserted entry #' . $id . ', "' . htmlspecialchars($new_entry['title']) . '"
' . "\n"; + + if (function_exists('ob_flush')) { + @ob_flush(); + } + if (function_exists('flush')) { + @flush(); + } + } + + return true; + } +} + +return 'Serendipity_Import_LiveJournalXML'; + +/* vim: set sts=4 ts=4 expandtab : */ -- 2.39.5