--- /dev/null
+<?php # $Id: generic.inc.php 717 2005-11-21 09:56:25Z garvinhicking $
+# Copyright (c) 2003-2005, Jannis Hermanns (on behalf the Serendipity Developer Team)
+# All rights reserved. See LICENSE file for licensing details
+
+require_once S9Y_PEAR_PATH . 'Onyx/RSS.php';
+
+class Serendipity_Import_LiveJournalXML extends Serendipity_Import {
+ var $info = array('software' => '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 = '<?xml version="1.0" encoding="UTF-8" ?>';
+ 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('@(<entry>.*</entry>)@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']) . '"<br />' . "\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 : */