'LiveJournal XML'); var $data = array(); var $inputFields = array(); var $force_recode = false; 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 : */