217 lines
7.3 KiB
PHP
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 : */
|