--- /dev/null
+<?php # $Id: voodoopad.inc.php 1 2005-04-16 06:39:31Z timputnam $
+# Copyright (c) 2003-2005, Tim Putnam
+
+/*****************************************************************
+ * VoodooPad Importer, by Tim Putnam
+ * http://deepbluesea.fracsoft.com *
+ *****************************************************************/
+
+// These are used by the XML parser
+class element{
+ var $name = '';
+ var $attributes = array();
+ var $data = '';
+ var $depth = 0;
+}
+$elements = $stack = array();
+$count = $depth = 0;
+
+// Language, language...
+switch ($serendipity['lang']) {
+ case 'en':
+ default:
+ @define ('IMPORTER_VOODOO_FILEPROMPT', 'VoodooPad XML file');
+ @define('IMPORTER_VOODOO_CREATEINTRALINKSPROMPT', 'Recreate intra-links?');
+ @define('IMPORTER_VOODOO_WIKINAMEPROMPT','Wiki name');
+ @define('IMPORTER_VOODOO_KEYPREFIXPROMPT','Prefix for static page DB key');
+ @define('IMPORTER_VOODOO_UPDATEEXISTINGPROMPT','Update existing entries?');
+ @define('IMPORTER_VOODOO_CREATINGPAGE','Creating page');
+ @define('IMPORTER_VOODOO_UPDATINGPAGE','Updating page');
+ @define('IMPORTER_VOODOO_NOTUPDATING','Not updating');
+ @define('IMPORTER_VOODOO_RECORDURL','Recording link URL');
+ @define('IMPORTER_VOODOO_WRITEINTRALINKS','Writing intra-links..');
+ break;
+}
+
+class Serendipity_Import_VoodooPad extends Serendipity_Import {
+ var $info = array('software' => 'VoodooPad');
+ var $data = array();
+ var $inputFields = array();
+
+ function Serendipity_Import_VoodooPad($data) {
+ $this->data = $data;
+ $this->inputFields = array(
+ array( 'text' => IMPORTER_VOODOO_FILEPROMPT,
+ 'type' => 'file',
+ 'name' => 'voodooPadXML'),
+ array( 'text' => IMPORTER_VOODOO_CREATEINTRALINKSPROMPT,
+ 'type' => 'bool',
+ 'name' => 'shouldWriteLinks',
+ 'default' => 'true'),
+ array( 'text' => IMPORTER_VOODOO_WIKINAMEPROMPT,
+ 'type' => 'input',
+ 'name' => 'wikiName',
+ 'default' => ''),
+ array( 'text' => IMPORTER_VOODOO_KEYPREFIXPROMPT,
+ 'type' => 'input',
+ 'name' => 'keyPrefix',
+ 'default' => '' ),
+ array( 'text' => IMPORTER_VOODOO_UPDATEEXISTINGPROMPT,
+ 'type' => 'bool',
+ 'name' => 'updateExisting',
+ 'default' => 'true' ) );
+ }
+
+ function getImportNotes(){
+ return '<br/>Requires installation of the Static Pages plugin<br/>All static pages are currently scanned for a match';
+ }
+
+ function validateData() {
+ return sizeof($_FILES['serendipity']['tmp_name']['import']['voodooPadXML']);
+ }
+
+ function getInputFields() {
+ return $this->inputFields;
+ }
+
+
+ function import() {
+ global $serendipity;
+ global $elements;
+
+ // Dependency on static pages
+ if(!class_exists('serendipity_event_staticpage'))
+ die('<br/>This importer requires the Static Pages plugin to be installed');
+ // The selected file
+ $file = $_FILES['serendipity']['tmp_name']['import']['voodooPadXML'];
+
+ // Create a parser and set it up with the callbacks
+ $xml_parser = xml_parser_create('');
+ xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);
+ xml_set_element_handler($xml_parser, "start_element_handler", "end_element_handler");
+ xml_set_character_data_handler($xml_parser, "character_data_handler");
+
+ // Feed the contents of the file into the parser
+ if(!file_exists($file))
+ die("\n<p>\"$file\" does not exist.</p>\n</body>\n</html>");
+
+ if(!($handle = fopen($file, "r")))
+ die("<p>Cannot open \"$file\".</p>\n</body>\n</html>");
+
+ while($contents = fread($handle, 4096))
+ xml_parse($xml_parser, $contents, feof($handle));
+
+ fclose($handle);
+ xml_parser_free($xml_parser);
+
+ // Maintain a list of the aliases and their links
+ $aliases = array();
+
+ // Now have a list of elements referenceable by id
+ // so loop through building and/or updating page objects
+ while(list($key_a) = each($elements)){
+ $name = $elements[$key_a]->name;
+
+ switch ( $name )
+ {
+ case 'data': // <data> indicates the start of the VoodooPad entry, so create page object
+ $thispage = array();
+ break;
+ case 'key': // This is the unique identifier of the page
+ $mykey = serendipity_makeFilename ( $elements[$key_a]->data );
+ $mykey = basename($this->data['keyPrefix']) . $mykey;
+
+ // Pluck out the existing one if its there
+ $page = serendipity_db_query ( "SELECT *
+ FROM {$serendipity['dbPrefix']}staticpages
+ WHERE filename = '" . $mykey . "'
+ LIMIT 1", true, 'assoc');
+ if (is_array($page)) {
+ $thispage =& $page;
+ if (empty($thispage['timestamp']))
+ $thispage['timestamp'] = time();
+ }
+
+ $thispage['filename'] = $mykey;
+ $thispage['permalink'] = $serendipity['serendipityHTTPPath'] .'pages/' . $mykey .'.htm';
+ break;
+ case 'alias': // The title and the string used to match links
+ $thispage['articleformattitle'] = $this->data['wikiName'];
+ $thispage['pagetitle'] = $elements[$key_a]->data;
+ $thispage['headline'] = $elements[$key_a]->data;
+ break;
+ case 'content': // The content of a voodoopad entry
+ case 'path': // The path of a url string
+ $thispage['content'] = $elements[$key_a]->data;
+
+ // If its a content link list it for referencing with the page permalink
+ if ( $name == 'content' ){
+ $aliases[$thispage['headline']] = $thispage['permalink'];
+
+ // Either replace or insert depending on previous existence
+ if (!isset($thispage['id'])) {
+ printf ( '<br/>'.IMPORTER_VOODOO_CREATINGPAGE.': '. $mykey );
+ serendipity_db_insert('staticpages', $thispage);
+ $serendipity["POST"]["staticpage"] = serendipity_db_insert_id("staticpages", 'id');
+ }
+ else if ( $this->data['updateExisting'] == 'true') {
+ printf ( '<br/>'.IMPORTER_VOODOO_UPDATINGPAGE.': '. $mykey );
+ serendipity_db_update("staticpages", array("id" => $thispage["id"]), $thispage);
+ }
+ else
+ printf ( '<br/>'.IMPORTER_VOODOO_NOTUPDATING.': '. $mykey );
+ }
+
+ // If its a url, the content is the link instead
+ else
+ {
+ printf ( '<br/>'.IMPORTER_VOODOO_RECORDURL.': '.$thispage['headline'] );
+ $aliases[$thispage['headline']] = $thispage['content'];
+ }
+ break;
+ }
+
+ }
+
+ // Now rewrite the permalinks
+ printf ('<br/>' );
+ if ( $this->data['shouldWriteLinks'] == 'true')
+ Serendipity_Import_VoodooPad::write_links ($aliases );
+ return true;
+ }
+
+ function write_links($aliases) {
+ // Here we run through the static pages database and put in cross links
+ // around the keywords in the text
+ global $serendipity;
+
+ // **TODO** Change this to pull out only entries for the current wiki
+ printf ( '<br/><p>'.IMPORTER_VOODOO_WRITEINTRALINKS.'</p>');
+
+ $pages= &serendipity_db_query("SELECT * FROM {$serendipity['dbPrefix']}staticpages ORDER BY pagetitle DESC");
+
+ foreach( $pages as $thispage){
+ // Parse the content string
+ foreach ($aliases as $alias => $permalink) {
+ $thispage['content'] = Serendipity_Import_VoodooPad::wikify ( $alias, $permalink , $thispage['content'] );
+ }
+ for ( $counter = 0; $counter <= 12; $counter+=1)
+ unset ($thispage[$counter]);
+
+ // Write back to the database
+ serendipity_db_update("staticpages", array("id" => $thispage["id"]), $thispage);
+ }
+
+ printf ( "Success!</p>");
+ }
+
+ // Search and replace avoiding content of links
+ // **TODO** Fix this to avoid short links screwing up longer links
+ function wikify($alias, $link, $txt) {
+ $r = preg_split('((>)|(<))', $txt, -1, PREG_SPLIT_DELIM_CAPTURE);
+ $ns = '';
+ for ($i = 0; $i < count($r); $i++) {
+ if ($r[$i] == "<") {
+ $i+=2;
+ continue;
+ }
+ $r[$i] = eregi_replace( sql_regcase($alias), '<a href='.$link.'>'.$alias.'</a>', $r[$i] );
+ }
+ return join("", $r);
+ }
+}
+
+// XML Parser callbacks
+function start_element_handler($parser, $name, $attribs){
+ global $elements, $stack, $count, $depth;
+
+
+ $id = $count;
+ $element = new element;
+ $elements[$id] = $element;
+ $elements[$id]->name = $name;
+
+ while(list($key, $value) = each($attribs))
+ $elements[$id]->attributes[$key] = $value;
+
+ $elements[$id]->depth = $depth;
+ array_push($stack, $id);
+
+ $count++;
+ $depth++;
+}
+
+function end_element_handler($parser, $name){
+ global $stack, $depth;
+
+ array_pop($stack);
+
+ $depth--;
+}
+
+function character_data_handler($parser, $data){
+ global $elements, $stack;
+
+ $elements[$stack[count($stack)-1]]->data .= $data;
+}
+
+return 'Serendipity_Import_VoodooPad';
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
+
+<html>
+<head>
+ <title></title>
+</head>
+
+<body>
+</body>
+</html>