From: fraccy Date: Tue, 28 Jun 2005 13:26:20 +0000 (+0000) Subject: Added initial version of VoodooPad Wiki importer X-Git-Tag: 0.9~376 X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=551f12376c6d18430a2ad4b802e6ddffcd1de963;p=s9y.git Added initial version of VoodooPad Wiki importer --- diff --git a/include/admin/importers/voodoopad.inc.php b/include/admin/importers/voodoopad.inc.php new file mode 100644 index 0000000..d41ccbf --- /dev/null +++ b/include/admin/importers/voodoopad.inc.php @@ -0,0 +1,269 @@ + '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 '
Requires installation of the Static Pages plugin
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('
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

\"$file\" does not exist.

\n\n"); + + if(!($handle = fopen($file, "r"))) + die("

Cannot open \"$file\".

\n\n"); + + 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': // 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 ( '
'.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 ( '
'.IMPORTER_VOODOO_UPDATINGPAGE.': '. $mykey ); + serendipity_db_update("staticpages", array("id" => $thispage["id"]), $thispage); + } + else + printf ( '
'.IMPORTER_VOODOO_NOTUPDATING.': '. $mykey ); + } + + // If its a url, the content is the link instead + else + { + printf ( '
'.IMPORTER_VOODOO_RECORDURL.': '.$thispage['headline'] ); + $aliases[$thispage['headline']] = $thispage['content']; + } + break; + } + + } + + // Now rewrite the permalinks + printf ('
' ); + 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 ( '

'.IMPORTER_VOODOO_WRITEINTRALINKS.'

'); + + $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!

"); + } + + // 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), ''.$alias.'', $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'; +?> + + + + + + + + + +