Index: import_typepad.info
===================================================================
RCS file: /cvs/drupal/contributions/modules/import_typepad/import_typepad.info,v
retrieving revision 1.4
diff -u -r1.4 import_typepad.info
--- import_typepad.info 3 Oct 2008 00:47:47 -0000 1.4
+++ import_typepad.info 7 Jan 2010 15:06:37 -0000
@@ -1,17 +1,4 @@
+; $Id$
name = "Import Typepad"
-description = "Imports Typepad/MoveableType backup files to Content Types"
-version = "5.x-dev"
-project = "import_typepad"
-
-; Information added by drupal.org packaging script on 2008-09-24
-version = "5.x-1.0"
-project = "import_typepad"
-datestamp = "1222234217"
-
-
-; Information added by drupal.org packaging script on 2008-09-25
-version = "6.x-1.0"
-core = "6.x"
-project = "import_typepad"
-datestamp = "1222316414"
-
+description = "Imports content from Typepad export."
+core = 6.x
Index: import_typepad.module
===================================================================
RCS file: /cvs/drupal/contributions/modules/import_typepad/import_typepad.module,v
retrieving revision 1.9
diff -u -r1.9 import_typepad.module
--- import_typepad.module 3 Oct 2008 00:47:47 -0000 1.9
+++ import_typepad.module 8 Jan 2010 19:32:11 -0000
@@ -12,61 +12,100 @@
define('_IMPORT_TYPEPAD', 'import_typepad');
define('_ACTION_DELETE_FILE', 'Delete file from server');
-function import_typepad_help($section) {
- switch ($section) {
- case 'admin/modules#description':
- return t('Import nodes from a typepad file.');
- case 'admin/help#import_typepad':
- return t(' ', array('%admin-node-import_typepad' => url('admin/node/import_typepad'), '%admin-access-permission' => url('admin/access/permission')));
- }
+function import_typepad_perm() {
+ return array('import nodes');
}
-function import_typepad_menu($may_cache) {
- $links = array();
- $links[] = array('path' => 'admin/node/import_typepad', 'title' => t('type pad'), 'callback' => 'import_typepad_page', 'weight' => 5, 'access' => user_access('import nodes'));
- $links[] = array('path' => 'admin/node/import_typepad/preview', 'title' => t('type pad'), 'callback' => 'import_typepad_preview', 'weight' => 5, 'access' => user_access('import nodes'), 'type' => MENU_CALLBACK);
- return $links;
-}
+function import_typepad_menu() {
+ $items['admin/content/import_typepad'] = array(
+ 'title' => t('Import Typepad'),
+ 'description' => t('Description goes here.'),
+ 'page callback' => 'import_typepad_page',
+ 'page arguments' => array($form_values),
+ 'access arguments' => array('import nodes'),
+ );
+
+ $items['admin/content/import_typepad/preview'] = array(
+ 'title' => t('Import Typepad Preview'),
+ 'page callback' => 'import_typepad_preview',
+ 'page arguments' => array($previewCount),
+ 'description' => t('Description goes here.'),
+ 'access arguments' => array('import nodes'),
+ 'type' => MENU_CALLBACK
+ );
-function import_typepad_perm() {
- return array('import nodes');
+ return $items;
}
+
+
/**
* Show the front page, with either the current working file, or a file selection form
*/
-function import_typepad_page($form_values=NULL) {
+function import_typepad_page() {
+
+ $output = drupal_get_form('import_typepad_step1_form');
+ return $output;
+}
- if ($edit[_WORKING_FILE]) {
- $output .= form_item(t('File'), $edit[_WORKING_FILE] .' ('. format_size( filesize($edit[_WORKING_FILE]) ) .')
'. form_submit(t('Use a different file')));
+function import_typepad_step1_form($form_state) {
+ // get all of the content types for this Drupal installation
+ $types = db_query('SELECT DISTINCT type, name FROM {node_type} ORDER BY name ASC');
+ while ($row = db_fetch_object($types))
+ {
+ $opts[$row->type] = $row->name;
+ }
+
+ // get all of the vocabs for this Drupal installation
+ $vocabs = taxonomy_get_vocabularies();
+ foreach($vocabs as $v)
+ {
+ $vocab[$v->name] = $v->name;
}
- else {
- $form['upload_file'] = array(
+
+ $form['#attributes'] = array('enctype' => 'multipart/form-data');
+
+ $form['upload_file'] = array(
'#type' => 'file',
'#title' => t('Upload Type Pad/Movable Type file'),
- '#description' => t('The export file you wish to import'));
- $form['serverside_file'] = array(
+ '#description' => t('The export file you wish to import')
+ );
+
+ $form['serverside_file'] = array(
'#type' => 'textfield',
'#title' => t('Server side file'),
- '#description' => t('The file located on the server you wish to import'));
- }
+ '#description' => t('The file located on the server you wish to import')
+ );
+
+ $form['content_type'] = array(
+ '#type' => 'select',
+ '#title' => t('Content type'),
+ '#default_value' => variable_get('import_typepad_content_type', null),
+ '#options' => $opts,
+ '#description' => t('The content type the new nodes will have.'),
+ '#required' => true,
+ );
+
+ $form['vocab'] = array(
+ '#type' => 'select',
+ '#title' => t('Vocabulary'),
+ '#default_value' => variable_get('import_typepad_vocab', null),
+ '#options' => $vocab,
+ '#description' => t('The vocabulary with which you want to map taxonomy terms.'),
+ '#required' => true,
+ );
- // todo add an insert/update option
$form['submit'] = array(
'#type' => 'submit',
- '#value' => t('Step 2'));
-
- $form['#attributes'] = array('enctype' => 'multipart/form-data');
-
- $output = drupal_get_form('typepad_step1', $form);
-
- return $output;
+ '#value' => t('Step 2')
+ );
+ return $form;
}
/**
* Discover which file we are using, and move it into the appropriate position
*/
-function typepad_step1_validate($form_id, $form_values){
+ function import_typepad_step1_form_validate($form, &$form_state){
global $user;
global $base_url;
@@ -78,24 +117,28 @@
//$_SESSION[_IMPORT_TYPEPAD][_WORKING_FILE] = $file->filepath;
variable_set(_WORKING_FILE, $file->filepath);
variable_set(_FILE_TYPE, 'UPLOAD');
- } else if (strlen($form_values['serverside_file'])>0 && file_exists($form_values['serverside_file'])){
+ } else if (strlen($form_state['values']['serverside_file'])>0 && file_exists($form_state['values']['serverside_file'])){
drupal_set_message("Using server file ".$form_values['serverside_file']);
// See if there was a server file
- variable_set(_WORKING_FILE, $form_values['serverside_file']);
+ variable_set(_WORKING_FILE, $form_state['values']['serverside_file']);
variable_set(_FILE_TYPE, 'SERVER');
//$_SESSION[_IMPORT_TYPEPAD][_WORKING_FILE] = $edit['serverfile'];
}
- if ( variable_get(_WORKING_FILE, null) == null ) {
- form_set_error('file', t('You must select a file to import.'.variable_get(_FILE_TYPE,'missing')));
+ if (!($file-->filename)) {
+ form_set_error('file', t('You must select a file to import. '.variable_get(_FILE_TYPE,'missing')));
}
}
/**
* If the validation passed then simple redirect to the preview
*/
-function typepad_step1_submit($form_id, $form_values){
- return 'admin/node/import_typepad/preview';
+function import_typepad_step1_form_submit($form, &$form_state){
+
+ dsm($form_state);
+ variable_set('import_typepad_content_type', $form_state['values']['content_type']);
+ variable_set('import_typepad_vocab', $form_state['values']['vocab']);
+ $form_state['redirect'] = 'admin/content/import_typepad/preview';
}
/**
@@ -106,16 +149,9 @@
function import_typepad_preview($previewCount = 10) {
$authors = array();
$cats = array();
- $output = '';
-
- $items = _import_typepad_get_nodes( variable_get(_WORKING_FILE, null), $edit['type'], $previewCount, $authors, $cats, array());
-
-
- // Refresh preview w/ entry count
-
// Previews
- $output .= $items;
-
+ $output .= _import_typepad_get_nodes(variable_get(_WORKING_FILE, null), 'import_typepad', $previewCount = 10, $authors, $cats, array());
+
// Mappings and import
// Get user list
$users = array();
@@ -124,36 +160,46 @@
while ($user = db_fetch_object($result)) {
$users[$user->uid] = $user->name;
}
+ return $output.drupal_get_form('import_typepad_process_form', $users, $authors, $cats);
+}
- $import_form["author_title"] = array(
- "#type" => "markup",
- "#value" => t("Author mappings"));
- foreach ($authors as $author=>$uid){
+function import_typepad_process_form($form_state, $users, $authors, $cats) {
+
+ $import_form['author_title'] = array(
+ '#type' => 'markup',
+ '#value' => t('Author mappings')
+ );
+
+ foreach ($authors as $author => $uid){
$import_form[$author] = array(
- "#type" => 'select',
- "#title"=> $author,
- '#options' => $users);
+ '#type' => 'select',
+ '#title' => $author,
+ '#options' => $users
+ );
}
+
+ $import_form['taxonomy_title'] = array(
+ '#type' => 'markup',
+ '#value' => t('Taxonomy mappings')
+ );
- $import_form["taxonomy_title"] = array(
- "#type" => "markup",
- "#value" => t("Taxonomy mappings"));
-
- foreach ($cats as $cat=>$count){
+ foreach ($cats as $cat => $count){
$item = _import_typepad_taxonomy_list($cat);
$item['#title'] = "$cat ($count)";
$import_form['taxonomy_'.str_replace(' ','_',$cat)] = $item;
}
- $import_form["import_warning"] = array (
- "#type" => "markup",
- "#value" => t('Importing may take awhile, do not click \'Import\' more than once. To see progress, look at the Administer -> Content page in a new window.') );
-
- $import_form['submit'] = array('#type' => 'submit', '#value' => t('Import'));
-
- $output .= drupal_get_form('import_typepad_process', $import_form);
-
- return $output;
+ $import_form['import_warning'] = array (
+ '#type' => 'markup',
+ '#value' => t('Importing may take awhile, do not click \'Import\' more than once. To see progress, look at the Administer -> Content page in a new window.')
+ );
+
+ $import_form['submit'] = array(
+ '#type' => 'submit',
+ '#value' => t('Import')
+ );
+
+ return $import_form;
}
/**
@@ -163,36 +209,40 @@
function _import_typepad_taxonomy_list($name){
if (user_access('access content')) {
$default = '';
- $vocabs = taxonomy_get_vocabularies('blog');
+ $v = variable_get('import_typepad_vocab', false);
+ $vocabs = taxonomy_get_vocabularies($v);
$items = array();
foreach ($vocabs as $vocab) {
$tree = taxonomy_get_tree($vocab->vid);
foreach ($tree as $term) {
$items[$term->tid] = _taxonomy_depth($term->depth) .' '.$term->name;
- if ($name == $term->name){
+ if ($name == $term->name){
$default = $term->tid;
- }
+ }
}
}
return array(
- "#type" => "select",
- "#default_value" => $default,
- "#options" => $items );
+ '#type' => 'select',
+ '#default_value' => $default,
+ '#options' => $items );
}
}
/**
* Simply run the import, passing the form in for the taxonomy and author maps
*/
-function import_typepad_process_submit($formid, $form_elements){
+function import_typepad_process_form_submit($form, &$form_state){
+ dsm($form);
$cats = array(); // unused
- $items = _import_typepad_get_nodes( variable_get(_WORKING_FILE, null), $edit['type'], 0, $form_elements, $cats, $form_elements);
- if ( variable_get(_FILE_TYPE, null) == 'UPLOAD'){
- unlink( variable_get(_WORKING_FILE, null) );
+ $items = _import_typepad_get_nodes( variable_get(_WORKING_FILE, null), 'import_typepad', 0, $form_state['values'], $cats, $form_state['values']);
+ if ( variable_get(_FILE_TYPE, false) == 'UPLOAD'){
+ unlink( variable_get(_WORKING_FILE, false) );
}
variable_del(_WORKING_FILE);
variable_del(_FILE_TYPE);
- return 'admin/node/import_typepad';
+ variable_del('import_typepad_content_type');
+ variable_del('import_typepad_content_type');
+ $form_state['redirect'] = 'admin/content/import_typepad';
}
/**
@@ -206,16 +256,16 @@
$authorMap = array();
$cats = array();
foreach ($_POST['edit'] as $id=>$val){
- if (!(strpos($id,"author_map_") === FALSE)){
- $authorMap[substr($id, strlen("author_map_"))] = $val;
- }
+ if (!(strpos($id,"author_map_") === FALSE)){
+ $authorMap[substr($id, strlen("author_map_"))] = $val;
+ }
}
$edit['errors'] = 0;
- $output .= _import_typepad_get_nodes($edit[_WORKING_FILE], $edit['type'], $edit['type'] == 'import_typepad' ? NULL : $edit['match'], $edit['global'], $edit['errors'], $authorMap, $cats, $edit);
+ $output .= _import_typepad_get_nodes(variable_get(_WORKING_FILE, null), 'import_typepad', 'import_typepad', $edit['global'], $edit['errors'], $authorMap, $cats, $edit);
unset($edit['match']);
- return form($output);
+ return $output;
}
/**
@@ -265,6 +315,7 @@
* @return preview
*/
function _import_typepad_get_nodes($path, $type, $preview, &$authors, &$cats, $taxonomy) {
+
$handle = fopen($path, 'r');
if ($handle == null)
return false;
@@ -291,111 +342,111 @@
$state = 0;
// We currently want to ignore these sections
} else if (in_array($line, array("EXCERPT:","KEYWORDS:"))) {
- $state = 3;
+ $state = 3;
} else if ($line == "EXTENDED BODY:"){
- $state = 4;
+ $state = 4;
} else if ($line == "BODY:"){
- $state = 5;
+ $state = 5;
} else if ( !(strpos($line,"COMMENT:") === FALSE) ){
- // We are working on a comment
- //echo "\n";
- $state = 2;
+ // We are working on a comment
+ //echo "\n";
+ $state = 2;
$currentBlog->comments[] = new StdClass();
} else if ( !(strpos($line, "DATE:") === FALSE )){
- if ($state == 1){
- $currentBlog->created = strtotime(substr($line,strlen("DATE:")));
- } else if ($state == 2) {
- $currentBlog->comments[count($currentBlog->comments)-1]->timestamp = strtotime(substr($line,strlen("DATE:")));
- } else {
- //echo "\n";
- }
+ if ($state == 1){
+ $currentBlog->created = strtotime(substr($line,strlen("DATE:")));
+ } else if ($state == 2) {
+ $currentBlog->comments[count($currentBlog->comments)-1]->timestamp = strtotime(substr($line,strlen("DATE:")));
+ } else {
+ //echo "\n";
+ }
} else if ( !(strpos($line, "STATUS:") === FALSE ) ){
- $value = trim(substr($line,strlen("STATUS:")));
- if (strcmp($value, "Publish") == 0){
+ $value = trim(substr($line,strlen("STATUS:")));
+ if (strcmp($value, "Publish") == 0){
$currentBlog->status = 1;
- } else {
+ } else {
$currentBlog->status = 0;
- }
+ }
} else if ( !(strpos($line,"CATEGORY:") === FALSE) ){
$category = trim(substr($line, strpos($line,"CATEGORY:") + strlen("CATEGORY:")));
- $cats[$category]++;
- $blogCats[] = $category; // Add the category to this entry
+ $cats[$category]++;
+ $blogCats[] = $category; // Add the category to this entry
} else if ( !(strpos($line,"AUTHOR:") === FALSE) ){
- // If state is unknown, then the new item is a blog, not a comment
- if ($state == 0){
- $state = 1;
- // Save the last blog
- if ($currentBlog != null){
+ // If state is unknown, then the new item is a blog, not a comment
+ if ($state == 0){
+ $state = 1;
+ // Save the last blog
+ if ($currentBlog != null){
$currentBlog->body = strlen(trim($currentBlog->body))==0?$currentBlog->teaser:$currentBlog->body;
- if (!$preview){
+ if (!$preview){
$c = array();
foreach ($blogCats as $id=>$val){
$c[] = $taxonomy['taxonomy_'.str_replace(' ','_',$val)];
}
_import_typepad_save($currentBlog, $c);
$success++;
- } else if ($previewCount < $preview){
- $output .= node_view($currentBlog);
- $previewCount++;
+ } else if ($previewCount < $preview){
+ $output .= node_view($currentBlog);
+ $previewCount++;
}
- }
-
- // Start new blog
+ }
+
+ // Start new blog
$blogCats = array();
- $currentBlog = new StdClass();
- $currentBlog->type = 'blog';
- $currentBlog->author = trim( substr($line, strpos($line,"AUTHOR:") + strlen("AUTHOR:")) );
- // We generate a hash for the author name which can be used in HTML forms
- $authorHash = 'author_map_'.str_replace(" ","_",$currentBlog->author);
- if (!array_key_exists($authorHash, $authors)){
- $authors[$authorHash] = 0;
- } else if (!$preview) {
- $currentBlog->uid = $authors[$authorHash];
- }
-
- $currentBlog->comments = array();
-
- } else if ($state == 2) {
- $currentBlog->comments[count($currentBlog->comments)-1]->name = substr($line, strlen("AUTHOR:"));
- } else {
- echo "
$state : $line"; - } + $value = ""; + } else { + $name = substr($line, 0, $sep+1); + $value = substr($line, $sep+1); + } + + if ($state == 1){ + $prop = $mapping[$name]; + if (strlen($prop) > 0 ) + $currentBlog->$prop = $value; + } else if ($state == 2){ + //echo "\n"; + if (strlen($name) > 0 && array_key_exists($name, $mapping)){ + $currentBlog->comments[count($currentBlog->comments)-1]->$mapping[$name] = $value; + } else { + $currentBlog->comments[count($currentBlog->comments)-1]->comment .= $rawLine; + } + } else if ($state == 3){ + // Do nothing (Skip) + } else if ($state == 4){ + // Blog body + $currentBlog->body .= $rawLine; + } else if ($state == 5){ + $currentBlog->teaser .= $rawLine; + } else if ($state == 0){ + //Do nothing, to avioid errors over nothing + } else { + echo "
$state : $line"; + } } } $run = false; @@ -414,16 +465,8 @@ } fclose($handle); - /* - if ($errors) { - // todo use drupal_set_message? - drupal_set_message(t('%errors. Click \'Download rows with errors\' for a CSV file of the failed rows.', array('%errors' => format_plural(count($errors), 'There was 1 error', 'There were %count errors')))); - $output = form_submit(t('Download rows with errors')) . $output; - $errors; - } - */ if ($success) { - drupal_set_message(t('Successfully imported %count.', array('%count' => format_plural($success, '1 node', '%count nodes')))); + drupal_set_message(t('Successfully imported %count.', array('%count' => format_plural($success, '1 node', $success.' nodes')))); } return $output; @@ -454,8 +497,8 @@ //echo "\n"; foreach ($currentBlog->comments as $comment){ // Most of the following code is ripped straight from comment.module - $cid = db_next_id('{comments}_cid'); - + $cid = db_last_insert_id('{comments}_cid', 'cid'); + // This is a comment with no parent comment (depth 0): we start // by retrieving the maximum thread level. $max = db_result(db_query('SELECT MAX(thread) FROM {comments} WHERE nid = %d', $edit['nid'])); @@ -484,10 +527,9 @@ $thread = $decimals . $units .'/'; // Type pad doesn't have threaded comments, or subject lines, so we have to improvise them - db_query("INSERT INTO {comments} (cid, nid, pid, uid, subject, comment, format, hostname, timestamp, status, score, users, thread, name, mail, homepage) VALUES (%d, %d, %d, %d, '%s', '%s', %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s', '%s')", - $cid, $currentBlog->nid, 0/*pid*/, 0, "re: ".$currentBlog->title, $comment->comment, 1/*format*/, $comment->hostname, $comment->timestamp, 0/*status*/, 0/*score*/, ''/*$users*/, $thread, $comment->name, $comment->mail, $comment->homepage); - _comment_update_node_statistics($nid); + db_query("INSERT INTO {comments} (nid, pid, uid, subject, comment, format, hostname, timestamp, status, thread, name, mail, homepage) VALUES (%d, %d, %d, '%s', '%s', %d, '%s', %d, %d, '%s', '%s', '%s', '%s')", + $currentBlog->nid, 0/*pid*/, 0, "re: ".$currentBlog->title, $comment->comment, 1/*format*/, $comment->hostname, $comment->timestamp, 0/*status*/, $thread, $comment->name, $comment->mail, $comment->homepage); + _comment_update_node_statistics($nid); } } -} -?> +} \ No newline at end of file