LuckyCoinkydink/include/admin/importers/livejournal.inc.php
2006-10-27 09:18:19 +00:00

217 lines
7.3 KiB
PHP

<?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 : */