onli 92afc37753 Introduce serendipity_specialchars-wrapper for encoding bug (#236)
PHP 5.4 sets UTF-8 as the default for htmlspecialchars, htmlentities and html_entity_decode. The first two will echo an empty string when given a string with umlauts. This commits introduces serendipity_specialchar-wrapper that are meant to be a temporary solution for the s9y-core until PHP 5.6 fixed the bug, so the native charset option of s9y continues to work.
2014-11-23 23:41:08 +01:00

205 lines
9.4 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
# Loosely based on the Importer by Stefan Koopmanschap for TXP:
# http://www.leftontheweb.com/pivot_to_textpattern.phps
class Serendipity_Import_Pivot extends Serendipity_Import {
var $info = array('software' => 'Pivot');
var $data = array();
var $inputFields = array();
function Serendipity_Import_Pivot($data) {
$this->data = $data;
$this->inputFields = array(array('text' => PARENT_DIRECTORY,
'type' => 'input',
'name' => 'pivot_path',
'default' => '/path/to/pivot/db/'),
);
}
function validateData() {
return sizeof($this->data);
}
function getInputFields() {
return $this->inputFields;
}
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 toTimestamp($string) {
if (empty($string)) {
return time();
}
$parts = explode('-', $string);
return mktime($parts[3], $parts[4], 0, $parts[1], $parts[2], $parts[0]);
}
function &unserialize($file) {
$c = file_get_contents($file);
$entrydata = str_replace(array('<?php /* pivot */ die(); ?>', "\r"), array('', ''), $c);
$entrydata = unserialize($entrydata);
if (empty($entrydata) || !is_array($entrydata)) {
$entrydata = str_replace(array('<?php /* pivot */ die(); ?>'), array(''), $c);
$entrydata = unserialize($entrydata);
}
return $entrydata;
}
function import() {
global $serendipity;
$max_import = 9999;
$serendipity['noautodiscovery'] = true;
if (!is_dir($this->data['pivot_path']) || !is_readable($this->data['pivot_path'])) {
$check_dir = $serendipity['serendipityPath'] . $this->data['pivot_path'];
if (!is_dir($check_dir) || !is_readable($check_dir)) {
return sprintf(ERROR_NO_DIRECTORY, serendipity_specialchars($this->data['pivot_path']));
}
$this->data['pivot_path'] = $check_dir;
}
printf('<span class="block_level">' . CHECKING_DIRECTORY . ': ', $this->data['pivot_path']) . '</span>';
if ($root = opendir($this->data['pivot_path'])) {
// Fetch category data:
$s9y_categories = serendipity_fetchCategories('all');
$categories = $this->unserialize($this->data['pivot_path'] . '/ser-cats.php');
$pivot_to_s9y = array(
'categories' => array()
);
echo '<ul>';
foreach($categories AS $pivot_category_id => $category) {
$found = false;
$pivot_category = trim(stripslashes($category[0]));
foreach($s9y_categories AS $idx => $item) {
if ($pivot_category == $item['category_name']) {
$found = $item['categoryid'];
break;
}
}
if ($found) {
echo '<li>Pivot Category "' . serendipity_specialchars($pivot_category) . '" mapped to Serendipity ID ' . $found . '</li>';
$pivot_to_s9y['categories'][$pivot_category] = $found;
} else {
echo '<li>Created Pivot Category "' . serendipity_specialchars($pivot_category) . '".</li>';
$cat = array('category_name' => $pivot_category,
'category_description' => '',
'parentid' => 0,
'category_left' => 0,
'category_right' => 0);
serendipity_db_insert('category', $cat);
$pivot_to_s9y['categories'][$pivot_category] = serendipity_db_insert_id('category', 'categoryid');
}
}
$i = 0;
while (false !== ($dir = readdir($root))) {
if ($dir[0] == '.') continue;
if (substr($dir, 0, 8) == 'standard') {
printf('<li>' . CHECKING_DIRECTORY . '...</li>', $dir);
$data = $this->unserialize($this->data['pivot_path'] . '/' . $dir . '/index-' . $dir . '.php');
if (empty($data) || !is_array($data) || count($data) < 1) {
echo '<li><span class="msg_error">FATAL: File <em>' . $dir . '/index-' . $dir . '.php</em> has no data!</span></li>';
flush();
ob_flush();
continue;
}
foreach($data AS $entry) {
$entryid = str_pad($entry['code'], 5, '0', STR_PAD_LEFT);
if ($i >= $max_import) {
echo '<li>Skipping entry data for #' . $entryid . '</li>';
continue;
}
echo '<li>Fetching entry data for #' . $entryid . '</li>';
$entrydata = $this->unserialize($this->data['pivot_path'] . '/' . $dir . '/' . $entryid . '.php');
if (empty($entrydata) || !is_array($entrydata) || count($entrydata) < 1) {
echo '<li><span class="msg_error">FATAL: File <em>' . $dir . '/' . $entryid . '.php</em> has no data!</span></li>';
flush();
ob_flush();
continue;
}
$entry = array();
$entry['title'] = trim(stripslashes($entrydata['title']));
$entry['categories'] = array();
if (is_array($entrydata['category'])) {
foreach($entrydata['category'] AS $pivot_category) {
$entry['categories'][] = $pivot_to_s9y['categories'][$pivot_category];
}
}
$entry['timestamp'] = $this->toTimestamp($entrydata['date']);
$entry['last_modified'] = (!empty($entrydata['edit_date']) ? $this->toTimestamp($entrydata['edit_date']) : $entry['timestamp']);
$entry['isdraft'] = ($entrydata['status'] == 'publish' ? 'false' : 'true');
$entry['body'] = stripslashes($entrydata['introduction']);
$entry['extended'] = stripslashes($entrydata['body']);
$entry['title'] = stripslashes($entrydata['title']);
$entry['authorid'] = $serendipity['authorid'];
$entry['author'] = $serendipity['serendipityUser'];
$entry['allow_comments'] = ($entrydata['allow_comments'] ? 'true' : 'false');
$entry['moderate_comments'] = 'false';
$entry['exflag'] = (!empty($entry['extended']) ? 1 : 0);
$entry['trackbacks'] = 0;
$entry['comments'] = (isset($entrydata['comments']) ? count($entrydata['comments']) : 0);
serendipity_updertEntry($entry);
$i++;
if (isset($entrydata['comments']) && count($entrydata['comments']) > 0) {
foreach($entrydata['comments'] AS $comment) {
$comment = array('entry_id ' => $entry['id'],
'parent_id' => 0,
'timestamp' => $this->toTimestamp($comment['date']),
'author' => stripslashes($comment['name']),
'email' => stripslashes($comment['email']),
'url' => stripslashes($comment['url']),
'ip' => stripslashes($comment['ip']),
'status' => 'approved',
'body' => stripslashes($comment['comment']),
'subscribed'=> ($comment['notify'] ? 'true' : 'false'),
'type' => 'NORMAL');
serendipity_db_insert('comments', $comment);
}
}
echo '<li><span class="msg_success">Entry #' . $entryid . ' imported</span></li>';
flush();
ob_flush();
}
}
}
echo '</ul>';
} else {
return sprintf(ERROR_NO_DIRECTORY, serendipity_specialchars($this->data['pivot_path']));
}
return true;
}
}
return 'Serendipity_Import_Pivot';
/* vim: set sts=4 ts=4 expandtab : */
?>