]> git.mjollnir.org Git - s9y.git/commitdiff
add livejournal import
authorgarvinhicking <garvinhicking>
Tue, 25 Jul 2006 08:29:14 +0000 (08:29 +0000)
committergarvinhicking <garvinhicking>
Tue, 25 Jul 2006 08:29:14 +0000 (08:29 +0000)
docs/NEWS
include/admin/importers/livejournal.inc.php [new file with mode: 0644]

index 0f36b0458dfc48b5be9916e9e70825d7ca6cdd53..8a056ec5cf3b37015830b1e052e5ce085f1538f8 100644 (file)
--- a/docs/NEWS
+++ b/docs/NEWS
@@ -3,6 +3,8 @@
 Version 1.1-alpha7()
 ------------------------------------------------------------------------
 
+    * Add LiveJournal XML importer (garvinhicking)
+
     * Fix not fetching allow_comments/moderate_comments value when
       inside search function. Thanks to stm! (garvinhicking)
 
diff --git a/include/admin/importers/livejournal.inc.php b/include/admin/importers/livejournal.inc.php
new file mode 100644 (file)
index 0000000..ea13de3
--- /dev/null
@@ -0,0 +1,215 @@
+<?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();
+
+    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 : */