web/wp-admin/import/blogger.php
author ymh
Fri, 12 Mar 2010 13:29:04 +0000
changeset 1 0d28b7c10758
permissions -rw-r--r--
First commit
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
0d28b7c10758 First commit
ymh
parents:
diff changeset
     1
<?php
0d28b7c10758 First commit
ymh
parents:
diff changeset
     2
/**
0d28b7c10758 First commit
ymh
parents:
diff changeset
     3
 * Blogger Importer
0d28b7c10758 First commit
ymh
parents:
diff changeset
     4
 *
0d28b7c10758 First commit
ymh
parents:
diff changeset
     5
 * @package WordPress
0d28b7c10758 First commit
ymh
parents:
diff changeset
     6
 * @subpackage Importer
0d28b7c10758 First commit
ymh
parents:
diff changeset
     7
 */
0d28b7c10758 First commit
ymh
parents:
diff changeset
     8
0d28b7c10758 First commit
ymh
parents:
diff changeset
     9
/**
0d28b7c10758 First commit
ymh
parents:
diff changeset
    10
 * How many records per GData query
0d28b7c10758 First commit
ymh
parents:
diff changeset
    11
 *
0d28b7c10758 First commit
ymh
parents:
diff changeset
    12
 * @package WordPress
0d28b7c10758 First commit
ymh
parents:
diff changeset
    13
 * @subpackage Blogger_Import
0d28b7c10758 First commit
ymh
parents:
diff changeset
    14
 * @var int
0d28b7c10758 First commit
ymh
parents:
diff changeset
    15
 * @since unknown
0d28b7c10758 First commit
ymh
parents:
diff changeset
    16
 */
0d28b7c10758 First commit
ymh
parents:
diff changeset
    17
define( 'MAX_RESULTS',        50 );
0d28b7c10758 First commit
ymh
parents:
diff changeset
    18
0d28b7c10758 First commit
ymh
parents:
diff changeset
    19
/**
0d28b7c10758 First commit
ymh
parents:
diff changeset
    20
 * How many seconds to let the script run
0d28b7c10758 First commit
ymh
parents:
diff changeset
    21
 *
0d28b7c10758 First commit
ymh
parents:
diff changeset
    22
 * @package WordPress
0d28b7c10758 First commit
ymh
parents:
diff changeset
    23
 * @subpackage Blogger_Import
0d28b7c10758 First commit
ymh
parents:
diff changeset
    24
 * @var int
0d28b7c10758 First commit
ymh
parents:
diff changeset
    25
 * @since unknown
0d28b7c10758 First commit
ymh
parents:
diff changeset
    26
 */
0d28b7c10758 First commit
ymh
parents:
diff changeset
    27
define( 'MAX_EXECUTION_TIME', 20 );
0d28b7c10758 First commit
ymh
parents:
diff changeset
    28
0d28b7c10758 First commit
ymh
parents:
diff changeset
    29
/**
0d28b7c10758 First commit
ymh
parents:
diff changeset
    30
 * How many seconds between status bar updates
0d28b7c10758 First commit
ymh
parents:
diff changeset
    31
 *
0d28b7c10758 First commit
ymh
parents:
diff changeset
    32
 * @package WordPress
0d28b7c10758 First commit
ymh
parents:
diff changeset
    33
 * @subpackage Blogger_Import
0d28b7c10758 First commit
ymh
parents:
diff changeset
    34
 * @var int
0d28b7c10758 First commit
ymh
parents:
diff changeset
    35
 * @since unknown
0d28b7c10758 First commit
ymh
parents:
diff changeset
    36
 */
0d28b7c10758 First commit
ymh
parents:
diff changeset
    37
define( 'STATUS_INTERVAL',     3 );
0d28b7c10758 First commit
ymh
parents:
diff changeset
    38
0d28b7c10758 First commit
ymh
parents:
diff changeset
    39
/**
0d28b7c10758 First commit
ymh
parents:
diff changeset
    40
 * Blogger Importer class
0d28b7c10758 First commit
ymh
parents:
diff changeset
    41
 *
0d28b7c10758 First commit
ymh
parents:
diff changeset
    42
 * @since unknown
0d28b7c10758 First commit
ymh
parents:
diff changeset
    43
 */
0d28b7c10758 First commit
ymh
parents:
diff changeset
    44
class Blogger_Import {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    45
0d28b7c10758 First commit
ymh
parents:
diff changeset
    46
	// Shows the welcome screen and the magic auth link.
0d28b7c10758 First commit
ymh
parents:
diff changeset
    47
	function greet() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    48
		$next_url = get_option('siteurl') . '/wp-admin/index.php?import=blogger&amp;noheader=true';
0d28b7c10758 First commit
ymh
parents:
diff changeset
    49
		$auth_url = "https://www.google.com/accounts/AuthSubRequest";
0d28b7c10758 First commit
ymh
parents:
diff changeset
    50
		$title = __('Import Blogger');
0d28b7c10758 First commit
ymh
parents:
diff changeset
    51
		$welcome = __('Howdy! This importer allows you to import posts and comments from your Blogger account into your WordPress blog.');
0d28b7c10758 First commit
ymh
parents:
diff changeset
    52
		$prereqs = __('To use this importer, you must have a Google account and an upgraded (New, was Beta) blog hosted on blogspot.com or a custom domain (not FTP).');
0d28b7c10758 First commit
ymh
parents:
diff changeset
    53
		$stepone = __('The first thing you need to do is tell Blogger to let WordPress access your account. You will be sent back here after providing authorization.');
0d28b7c10758 First commit
ymh
parents:
diff changeset
    54
		$auth = esc_attr__('Authorize');
0d28b7c10758 First commit
ymh
parents:
diff changeset
    55
0d28b7c10758 First commit
ymh
parents:
diff changeset
    56
		echo "
0d28b7c10758 First commit
ymh
parents:
diff changeset
    57
		<div class='wrap'>
0d28b7c10758 First commit
ymh
parents:
diff changeset
    58
		".screen_icon()."
0d28b7c10758 First commit
ymh
parents:
diff changeset
    59
		<h2>$title</h2>
0d28b7c10758 First commit
ymh
parents:
diff changeset
    60
		<p>$welcome</p><p>$prereqs</p><p>$stepone</p>
0d28b7c10758 First commit
ymh
parents:
diff changeset
    61
			<form action='$auth_url' method='get'>
0d28b7c10758 First commit
ymh
parents:
diff changeset
    62
				<p class='submit' style='text-align:left;'>
0d28b7c10758 First commit
ymh
parents:
diff changeset
    63
					<input type='submit' class='button' value='$auth' />
0d28b7c10758 First commit
ymh
parents:
diff changeset
    64
					<input type='hidden' name='scope' value='http://www.blogger.com/feeds/' />
0d28b7c10758 First commit
ymh
parents:
diff changeset
    65
					<input type='hidden' name='session' value='1' />
0d28b7c10758 First commit
ymh
parents:
diff changeset
    66
					<input type='hidden' name='secure' value='0' />
0d28b7c10758 First commit
ymh
parents:
diff changeset
    67
					<input type='hidden' name='next' value='$next_url' />
0d28b7c10758 First commit
ymh
parents:
diff changeset
    68
				</p>
0d28b7c10758 First commit
ymh
parents:
diff changeset
    69
			</form>
0d28b7c10758 First commit
ymh
parents:
diff changeset
    70
		</div>\n";
0d28b7c10758 First commit
ymh
parents:
diff changeset
    71
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    72
0d28b7c10758 First commit
ymh
parents:
diff changeset
    73
	function uh_oh($title, $message, $info) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    74
		echo "<div class='wrap'>";
0d28b7c10758 First commit
ymh
parents:
diff changeset
    75
		screen_icon();
0d28b7c10758 First commit
ymh
parents:
diff changeset
    76
		echo "<h2>$title</h2><p>$message</p><pre>$info</pre></div>";
0d28b7c10758 First commit
ymh
parents:
diff changeset
    77
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    78
0d28b7c10758 First commit
ymh
parents:
diff changeset
    79
	function auth() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    80
		// We have a single-use token that must be upgraded to a session token.
0d28b7c10758 First commit
ymh
parents:
diff changeset
    81
		$token = preg_replace( '/[^-_0-9a-zA-Z]/', '', $_GET['token'] );
0d28b7c10758 First commit
ymh
parents:
diff changeset
    82
		$headers = array(
0d28b7c10758 First commit
ymh
parents:
diff changeset
    83
			"GET /accounts/AuthSubSessionToken HTTP/1.0",
0d28b7c10758 First commit
ymh
parents:
diff changeset
    84
			"Authorization: AuthSub token=\"$token\""
0d28b7c10758 First commit
ymh
parents:
diff changeset
    85
		);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    86
		$request = join( "\r\n", $headers ) . "\r\n\r\n";
0d28b7c10758 First commit
ymh
parents:
diff changeset
    87
		$sock = $this->_get_auth_sock( );
0d28b7c10758 First commit
ymh
parents:
diff changeset
    88
		if ( ! $sock ) return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    89
		$response = $this->_txrx( $sock, $request );
0d28b7c10758 First commit
ymh
parents:
diff changeset
    90
		preg_match( '/token=([-_0-9a-z]+)/i', $response, $matches );
0d28b7c10758 First commit
ymh
parents:
diff changeset
    91
		if ( empty( $matches[1] ) ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    92
			$this->uh_oh(
0d28b7c10758 First commit
ymh
parents:
diff changeset
    93
				__( 'Authorization failed' ),
0d28b7c10758 First commit
ymh
parents:
diff changeset
    94
				__( 'Something went wrong. If the problem persists, send this info to support:' ),
0d28b7c10758 First commit
ymh
parents:
diff changeset
    95
				htmlspecialchars($response)
0d28b7c10758 First commit
ymh
parents:
diff changeset
    96
			);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    97
			return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    98
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    99
		$this->token = $matches[1];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   100
0d28b7c10758 First commit
ymh
parents:
diff changeset
   101
		wp_redirect( remove_query_arg( array( 'token', 'noheader' ) ) );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   102
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   103
0d28b7c10758 First commit
ymh
parents:
diff changeset
   104
	function get_token_info() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   105
		$headers = array(
0d28b7c10758 First commit
ymh
parents:
diff changeset
   106
			"GET /accounts/AuthSubTokenInfo  HTTP/1.0",
0d28b7c10758 First commit
ymh
parents:
diff changeset
   107
			"Authorization: AuthSub token=\"$this->token\""
0d28b7c10758 First commit
ymh
parents:
diff changeset
   108
		);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   109
		$request = join( "\r\n", $headers ) . "\r\n\r\n";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   110
		$sock = $this->_get_auth_sock( );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   111
		if ( ! $sock ) return;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   112
		$response = $this->_txrx( $sock, $request );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   113
		return $this->parse_response($response);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   114
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   115
0d28b7c10758 First commit
ymh
parents:
diff changeset
   116
	function token_is_valid() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   117
		$info = $this->get_token_info();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   118
0d28b7c10758 First commit
ymh
parents:
diff changeset
   119
		if ( $info['code'] == 200 )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   120
			return true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   121
0d28b7c10758 First commit
ymh
parents:
diff changeset
   122
		return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   123
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   124
0d28b7c10758 First commit
ymh
parents:
diff changeset
   125
	function show_blogs($iter = 0) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   126
		if ( empty($this->blogs) ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   127
			$headers = array(
0d28b7c10758 First commit
ymh
parents:
diff changeset
   128
				"GET /feeds/default/blogs HTTP/1.0",
0d28b7c10758 First commit
ymh
parents:
diff changeset
   129
				"Host: www.blogger.com",
0d28b7c10758 First commit
ymh
parents:
diff changeset
   130
				"Authorization: AuthSub token=\"$this->token\""
0d28b7c10758 First commit
ymh
parents:
diff changeset
   131
			);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   132
			$request = join( "\r\n", $headers ) . "\r\n\r\n";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   133
			$sock = $this->_get_blogger_sock( );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   134
			if ( ! $sock ) return;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   135
			$response = $this->_txrx( $sock, $request );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   136
0d28b7c10758 First commit
ymh
parents:
diff changeset
   137
			// Quick and dirty XML mining.
0d28b7c10758 First commit
ymh
parents:
diff changeset
   138
			list( $headers, $xml ) = explode( "\r\n\r\n", $response );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   139
			$p = xml_parser_create();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   140
			xml_parse_into_struct($p, $xml, $vals, $index);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   141
			xml_parser_free($p);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   142
0d28b7c10758 First commit
ymh
parents:
diff changeset
   143
			$this->title = $vals[$index['TITLE'][0]]['value'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   144
0d28b7c10758 First commit
ymh
parents:
diff changeset
   145
			// Give it a few retries... this step often flakes out the first time.
0d28b7c10758 First commit
ymh
parents:
diff changeset
   146
			if ( empty( $index['ENTRY'] ) ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   147
				if ( $iter < 3 ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   148
					return $this->show_blogs($iter + 1);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   149
				} else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   150
					$this->uh_oh(
0d28b7c10758 First commit
ymh
parents:
diff changeset
   151
						__('Trouble signing in'),
0d28b7c10758 First commit
ymh
parents:
diff changeset
   152
						__('We were not able to gain access to your account. Try starting over.'),
0d28b7c10758 First commit
ymh
parents:
diff changeset
   153
						''
0d28b7c10758 First commit
ymh
parents:
diff changeset
   154
					);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   155
					return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   156
				}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   157
			}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   158
0d28b7c10758 First commit
ymh
parents:
diff changeset
   159
			foreach ( $index['ENTRY'] as $i ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   160
				$blog = array();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   161
				while ( ( $tag = $vals[$i] ) && ! ( $tag['tag'] == 'ENTRY' && $tag['type'] == 'close' ) ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   162
					if ( $tag['tag'] == 'TITLE' ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   163
						$blog['title'] = $tag['value'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   164
					} elseif ( $tag['tag'] == 'SUMMARY' ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   165
						$blog['summary'] == $tag['value'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   166
					} elseif ( $tag['tag'] == 'LINK' ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   167
						if ( $tag['attributes']['REL'] == 'alternate' && $tag['attributes']['TYPE'] == 'text/html' ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   168
							$parts = parse_url( $tag['attributes']['HREF'] );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   169
							$blog['host'] = $parts['host'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   170
						} elseif ( $tag['attributes']['REL'] == 'edit' )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   171
							$blog['gateway'] = $tag['attributes']['HREF'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   172
					}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   173
					++$i;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   174
				}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   175
				if ( ! empty ( $blog ) ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   176
					$blog['total_posts'] = $this->get_total_results('posts', $blog['host']);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   177
					$blog['total_comments'] = $this->get_total_results('comments', $blog['host']);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   178
					$blog['mode'] = 'init';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   179
					$this->blogs[] = $blog;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   180
				}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   181
			}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   182
0d28b7c10758 First commit
ymh
parents:
diff changeset
   183
			if ( empty( $this->blogs ) ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   184
				$this->uh_oh(
0d28b7c10758 First commit
ymh
parents:
diff changeset
   185
					__('No blogs found'),
0d28b7c10758 First commit
ymh
parents:
diff changeset
   186
					__('We were able to log in but there were no blogs. Try a different account next time.'),
0d28b7c10758 First commit
ymh
parents:
diff changeset
   187
					''
0d28b7c10758 First commit
ymh
parents:
diff changeset
   188
				);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   189
				return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   190
			}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   191
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   192
//echo '<pre>'.print_r($this,1).'</pre>';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   193
		$start    = esc_js( __('Import') );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   194
		$continue = esc_js( __('Continue') );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   195
		$stop     = esc_js( __('Importing...') );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   196
		$authors  = esc_js( __('Set Authors') );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   197
		$loadauth = esc_js( __('Preparing author mapping form...') );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   198
		$authhead = esc_js( __('Final Step: Author Mapping') );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   199
		$nothing  = esc_js( __('Nothing was imported. Had you already imported this blog?') );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   200
		$stopping = ''; //Missing String used below.
0d28b7c10758 First commit
ymh
parents:
diff changeset
   201
		$title    = __('Blogger Blogs');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   202
		$name     = __('Blog Name');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   203
		$url      = __('Blog URL');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   204
		$action   = __('The Magic Button');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   205
		$posts    = __('Posts');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   206
		$comments = __('Comments');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   207
		$noscript = __('This feature requires Javascript but it seems to be disabled. Please enable Javascript and then reload this page. Don&#8217;t worry, you can turn it back off when you&#8217;re done.');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   208
0d28b7c10758 First commit
ymh
parents:
diff changeset
   209
		$interval = STATUS_INTERVAL * 1000;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   210
0d28b7c10758 First commit
ymh
parents:
diff changeset
   211
		foreach ( $this->blogs as $i => $blog ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   212
			if ( $blog['mode'] == 'init' )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   213
				$value = $start;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   214
			elseif ( $blog['mode'] == 'posts' || $blog['mode'] == 'comments' )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   215
				$value = $continue;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   216
			else
0d28b7c10758 First commit
ymh
parents:
diff changeset
   217
				$value = $authors;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   218
			$value = esc_attr($value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   219
			$blogtitle = esc_js( $blog['title'] );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   220
			$pdone = isset($blog['posts_done']) ? (int) $blog['posts_done'] : 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   221
			$cdone = isset($blog['comments_done']) ? (int) $blog['comments_done'] : 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   222
			$init .= "blogs[$i]=new blog($i,'$blogtitle','{$blog['mode']}'," . $this->get_js_status($i) . ');';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   223
			$pstat = "<div class='ind' id='pind$i'>&nbsp;</div><div id='pstat$i' class='stat'>$pdone/{$blog['total_posts']}</div>";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   224
			$cstat = "<div class='ind' id='cind$i'>&nbsp;</div><div id='cstat$i' class='stat'>$cdone/{$blog['total_comments']}</div>";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   225
			$rows .= "<tr id='blog$i'><td class='blogtitle'>$blogtitle</td><td class='bloghost'>{$blog['host']}</td><td class='bar'>$pstat</td><td class='bar'>$cstat</td><td class='submit'><input type='submit' class='button' id='submit$i' value='$value' /><input type='hidden' name='blog' value='$i' /></td></tr>\n";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   226
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   227
0d28b7c10758 First commit
ymh
parents:
diff changeset
   228
		echo "<div class='wrap'><h2>$title</h2><noscript>$noscript</noscript><table cellpadding='5px'><thead><tr><td>$name</td><td>$url</td><td>$posts</td><td>$comments</td><td>$action</td></tr></thead>\n$rows</table></div>";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   229
		echo "
0d28b7c10758 First commit
ymh
parents:
diff changeset
   230
		<script type='text/javascript'>
0d28b7c10758 First commit
ymh
parents:
diff changeset
   231
		/* <![CDATA[ */
0d28b7c10758 First commit
ymh
parents:
diff changeset
   232
			var strings = {cont:'$continue',stop:'$stop',stopping:'$stopping',authors:'$authors',nothing:'$nothing'};
0d28b7c10758 First commit
ymh
parents:
diff changeset
   233
			var blogs = {};
0d28b7c10758 First commit
ymh
parents:
diff changeset
   234
			function blog(i, title, mode, status){
0d28b7c10758 First commit
ymh
parents:
diff changeset
   235
				this.blog   = i;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   236
				this.mode   = mode;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   237
				this.title  = title;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   238
				this.status = status;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   239
				this.button = document.getElementById('submit'+this.blog);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   240
			};
0d28b7c10758 First commit
ymh
parents:
diff changeset
   241
			blog.prototype = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   242
				start: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   243
					this.cont = true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   244
					this.kick();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   245
					this.check();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   246
				},
0d28b7c10758 First commit
ymh
parents:
diff changeset
   247
				kick: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   248
					++this.kicks;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   249
					var i = this.blog;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   250
					jQuery.post('admin.php?import=blogger&noheader=true',{blog:this.blog},function(text,result){blogs[i].kickd(text,result)});
0d28b7c10758 First commit
ymh
parents:
diff changeset
   251
				},
0d28b7c10758 First commit
ymh
parents:
diff changeset
   252
				check: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   253
					++this.checks;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   254
					var i = this.blog;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   255
					jQuery.post('admin.php?import=blogger&noheader=true&status=true',{blog:this.blog},function(text,result){blogs[i].checkd(text,result)});
0d28b7c10758 First commit
ymh
parents:
diff changeset
   256
				},
0d28b7c10758 First commit
ymh
parents:
diff changeset
   257
				kickd: function(text, result) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   258
					if ( result == 'error' ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   259
						// TODO: exception handling
0d28b7c10758 First commit
ymh
parents:
diff changeset
   260
						if ( this.cont )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   261
							setTimeout('blogs['+this.blog+'].kick()', 1000);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   262
					} else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   263
						if ( text == 'done' ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   264
							this.stop();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   265
							this.done();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   266
						} else if ( text == 'nothing' ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   267
							this.stop();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   268
							this.nothing();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   269
						} else if ( text == 'continue' ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   270
							this.kick();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   271
						} else if ( this.mode = 'stopped' )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   272
							jQuery(this.button).attr('value', strings.cont);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   273
					}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   274
					--this.kicks;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   275
				},
0d28b7c10758 First commit
ymh
parents:
diff changeset
   276
				checkd: function(text, result) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   277
					if ( result == 'error' ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   278
						// TODO: exception handling
0d28b7c10758 First commit
ymh
parents:
diff changeset
   279
					} else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   280
						eval('this.status='+text);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   281
						jQuery('#pstat'+this.blog).empty().append(this.status.p1+'/'+this.status.p2);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   282
						jQuery('#cstat'+this.blog).empty().append(this.status.c1+'/'+this.status.c2);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   283
						this.update();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   284
						if ( this.cont || this.kicks > 0 )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   285
							setTimeout('blogs['+this.blog+'].check()', $interval);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   286
					}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   287
					--this.checks;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   288
				},
0d28b7c10758 First commit
ymh
parents:
diff changeset
   289
				update: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   290
					jQuery('#pind'+this.blog).width(((this.status.p1>0&&this.status.p2>0)?(this.status.p1/this.status.p2*jQuery('#pind'+this.blog).parent().width()):1)+'px');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   291
					jQuery('#cind'+this.blog).width(((this.status.c1>0&&this.status.c2>0)?(this.status.c1/this.status.c2*jQuery('#cind'+this.blog).parent().width()):1)+'px');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   292
				},
0d28b7c10758 First commit
ymh
parents:
diff changeset
   293
				stop: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   294
					this.cont = false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   295
				},
0d28b7c10758 First commit
ymh
parents:
diff changeset
   296
				done: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   297
					this.mode = 'authors';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   298
					jQuery(this.button).attr('value', strings.authors);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   299
				},
0d28b7c10758 First commit
ymh
parents:
diff changeset
   300
				nothing: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   301
					this.mode = 'nothing';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   302
					jQuery(this.button).remove();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   303
					alert(strings.nothing);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   304
				},
0d28b7c10758 First commit
ymh
parents:
diff changeset
   305
				getauthors: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   306
					if ( jQuery('div.wrap').length > 1 )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   307
						jQuery('div.wrap').gt(0).remove();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   308
					jQuery('div.wrap').empty().append('<h2>$authhead</h2><h3>' + this.title + '</h3>');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   309
					jQuery('div.wrap').append('<p id=\"auth\">$loadauth</p>');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   310
					jQuery('p#auth').load('index.php?import=blogger&noheader=true&authors=1',{blog:this.blog});
0d28b7c10758 First commit
ymh
parents:
diff changeset
   311
				},
0d28b7c10758 First commit
ymh
parents:
diff changeset
   312
				init: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   313
					this.update();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   314
					var i = this.blog;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   315
					jQuery(this.button).bind('click', function(){return blogs[i].click();});
0d28b7c10758 First commit
ymh
parents:
diff changeset
   316
					this.kicks = 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   317
					this.checks = 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   318
				},
0d28b7c10758 First commit
ymh
parents:
diff changeset
   319
				click: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   320
					if ( this.mode == 'init' || this.mode == 'stopped' || this.mode == 'posts' || this.mode == 'comments' ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   321
						this.mode = 'started';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   322
						this.start();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   323
						jQuery(this.button).attr('value', strings.stop);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   324
					} else if ( this.mode == 'started' ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   325
						return false; // let it run...
0d28b7c10758 First commit
ymh
parents:
diff changeset
   326
						this.mode = 'stopped';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   327
						this.stop();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   328
						if ( this.checks > 0 || this.kicks > 0 ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   329
							this.mode = 'stopping';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   330
							jQuery(this.button).attr('value', strings.stopping);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   331
						} else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   332
							jQuery(this.button).attr('value', strings.cont);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   333
						}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   334
					} else if ( this.mode == 'authors' ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   335
						document.location = 'index.php?import=blogger&authors=1&blog='+this.blog;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   336
						//this.mode = 'authors2';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   337
						//this.getauthors();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   338
					}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   339
					return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   340
				}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   341
			};
0d28b7c10758 First commit
ymh
parents:
diff changeset
   342
			$init
0d28b7c10758 First commit
ymh
parents:
diff changeset
   343
			jQuery.each(blogs, function(i, me){me.init();});
0d28b7c10758 First commit
ymh
parents:
diff changeset
   344
		/* ]]> */
0d28b7c10758 First commit
ymh
parents:
diff changeset
   345
		</script>\n";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   346
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   347
0d28b7c10758 First commit
ymh
parents:
diff changeset
   348
	// Handy function for stopping the script after a number of seconds.
0d28b7c10758 First commit
ymh
parents:
diff changeset
   349
	function have_time() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   350
		global $importer_started;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   351
		if ( time() - $importer_started > MAX_EXECUTION_TIME )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   352
			die('continue');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   353
		return true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   354
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   355
0d28b7c10758 First commit
ymh
parents:
diff changeset
   356
	function get_total_results($type, $host) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   357
		$headers = array(
0d28b7c10758 First commit
ymh
parents:
diff changeset
   358
			"GET /feeds/$type/default?max-results=1&start-index=2 HTTP/1.0",
0d28b7c10758 First commit
ymh
parents:
diff changeset
   359
			"Host: $host",
0d28b7c10758 First commit
ymh
parents:
diff changeset
   360
			"Authorization: AuthSub token=\"$this->token\""
0d28b7c10758 First commit
ymh
parents:
diff changeset
   361
		);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   362
		$request = join( "\r\n", $headers ) . "\r\n\r\n";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   363
		$sock = $this->_get_blogger_sock( $host );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   364
		if ( ! $sock ) return;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   365
		$response = $this->_txrx( $sock, $request );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   366
		$response = $this->parse_response( $response );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   367
		$parser = xml_parser_create();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   368
		xml_parse_into_struct($parser, $response['body'], $struct, $index);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   369
		xml_parser_free($parser);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   370
		$total_results = $struct[$index['OPENSEARCH:TOTALRESULTS'][0]]['value'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   371
		return (int) $total_results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   372
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   373
0d28b7c10758 First commit
ymh
parents:
diff changeset
   374
	function import_blog($blogID) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   375
		global $importing_blog;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   376
		$importing_blog = $blogID;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   377
0d28b7c10758 First commit
ymh
parents:
diff changeset
   378
		if ( isset($_GET['authors']) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   379
			return print($this->get_author_form());
0d28b7c10758 First commit
ymh
parents:
diff changeset
   380
0d28b7c10758 First commit
ymh
parents:
diff changeset
   381
		header('Content-Type: text/plain');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   382
0d28b7c10758 First commit
ymh
parents:
diff changeset
   383
		if ( isset($_GET['status']) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   384
			die($this->get_js_status());
0d28b7c10758 First commit
ymh
parents:
diff changeset
   385
0d28b7c10758 First commit
ymh
parents:
diff changeset
   386
		if ( isset($_GET['saveauthors']) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   387
			die($this->save_authors());
0d28b7c10758 First commit
ymh
parents:
diff changeset
   388
0d28b7c10758 First commit
ymh
parents:
diff changeset
   389
		$blog = $this->blogs[$blogID];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   390
		$total_results = $this->get_total_results('posts', $blog['host']);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   391
		$this->blogs[$importing_blog]['total_posts'] = $total_results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   392
0d28b7c10758 First commit
ymh
parents:
diff changeset
   393
		$start_index = $total_results - MAX_RESULTS + 1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   394
0d28b7c10758 First commit
ymh
parents:
diff changeset
   395
		if ( isset( $this->blogs[$importing_blog]['posts_start_index'] ) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   396
			$start_index = (int) $this->blogs[$importing_blog]['posts_start_index'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   397
		elseif ( $total_results > MAX_RESULTS )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   398
			$start_index = $total_results - MAX_RESULTS + 1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   399
		else
0d28b7c10758 First commit
ymh
parents:
diff changeset
   400
			$start_index = 1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   401
0d28b7c10758 First commit
ymh
parents:
diff changeset
   402
		// This will be positive until we have finished importing posts
0d28b7c10758 First commit
ymh
parents:
diff changeset
   403
		if ( $start_index > 0 ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   404
			// Grab all the posts
0d28b7c10758 First commit
ymh
parents:
diff changeset
   405
			$this->blogs[$importing_blog]['mode'] = 'posts';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   406
			$query = "start-index=$start_index&max-results=" . MAX_RESULTS;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   407
			do {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   408
				$index = $struct = $entries = array();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   409
				$headers = array(
0d28b7c10758 First commit
ymh
parents:
diff changeset
   410
					"GET /feeds/posts/default?$query HTTP/1.0",
0d28b7c10758 First commit
ymh
parents:
diff changeset
   411
					"Host: {$blog['host']}",
0d28b7c10758 First commit
ymh
parents:
diff changeset
   412
					"Authorization: AuthSub token=\"$this->token\""
0d28b7c10758 First commit
ymh
parents:
diff changeset
   413
				);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   414
				$request = join( "\r\n", $headers ) . "\r\n\r\n";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   415
				$sock = $this->_get_blogger_sock( $blog['host'] );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   416
				if ( ! $sock ) return; // TODO: Error handling
0d28b7c10758 First commit
ymh
parents:
diff changeset
   417
				$response = $this->_txrx( $sock, $request );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   418
0d28b7c10758 First commit
ymh
parents:
diff changeset
   419
				$response = $this->parse_response( $response );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   420
0d28b7c10758 First commit
ymh
parents:
diff changeset
   421
				// Extract the entries and send for insertion
0d28b7c10758 First commit
ymh
parents:
diff changeset
   422
				preg_match_all( '/<entry[^>]*>.*?<\/entry>/s', $response['body'], $matches );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   423
				if ( count( $matches[0] ) ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   424
					$entries = array_reverse($matches[0]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   425
					foreach ( $entries as $entry ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   426
						$entry = "<feed>$entry</feed>";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   427
						$AtomParser = new AtomParser();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   428
						$AtomParser->parse( $entry );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   429
						$result = $this->import_post($AtomParser->entry);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   430
						if ( is_wp_error( $result ) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   431
							return $result;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   432
						unset($AtomParser);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   433
					}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   434
				} else break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   435
0d28b7c10758 First commit
ymh
parents:
diff changeset
   436
				// Get the 'previous' query string which we'll use on the next iteration
0d28b7c10758 First commit
ymh
parents:
diff changeset
   437
				$query = '';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   438
				$links = preg_match_all('/<link([^>]*)>/', $response['body'], $matches);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   439
				if ( count( $matches[1] ) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   440
					foreach ( $matches[1] as $match )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   441
						if ( preg_match('/rel=.previous./', $match) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   442
							$query = @html_entity_decode( preg_replace('/^.*href=[\'"].*\?(.+)[\'"].*$/', '$1', $match), ENT_COMPAT, get_option('blog_charset') );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   443
0d28b7c10758 First commit
ymh
parents:
diff changeset
   444
				if ( $query ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   445
					parse_str($query, $q);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   446
					$this->blogs[$importing_blog]['posts_start_index'] = (int) $q['start-index'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   447
				} else
0d28b7c10758 First commit
ymh
parents:
diff changeset
   448
					$this->blogs[$importing_blog]['posts_start_index'] = 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   449
				$this->save_vars();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   450
			} while ( !empty( $query ) && $this->have_time() );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   451
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   452
0d28b7c10758 First commit
ymh
parents:
diff changeset
   453
		$total_results = $this->get_total_results( 'comments', $blog['host'] );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   454
		$this->blogs[$importing_blog]['total_comments'] = $total_results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   455
0d28b7c10758 First commit
ymh
parents:
diff changeset
   456
		if ( isset( $this->blogs[$importing_blog]['comments_start_index'] ) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   457
			$start_index = (int) $this->blogs[$importing_blog]['comments_start_index'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   458
		elseif ( $total_results > MAX_RESULTS )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   459
			$start_index = $total_results - MAX_RESULTS + 1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   460
		else
0d28b7c10758 First commit
ymh
parents:
diff changeset
   461
			$start_index = 1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   462
0d28b7c10758 First commit
ymh
parents:
diff changeset
   463
		if ( $start_index > 0 ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   464
			// Grab all the comments
0d28b7c10758 First commit
ymh
parents:
diff changeset
   465
			$this->blogs[$importing_blog]['mode'] = 'comments';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   466
			$query = "start-index=$start_index&max-results=" . MAX_RESULTS;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   467
			do {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   468
				$index = $struct = $entries = array();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   469
				$headers = array(
0d28b7c10758 First commit
ymh
parents:
diff changeset
   470
					"GET /feeds/comments/default?$query HTTP/1.0",
0d28b7c10758 First commit
ymh
parents:
diff changeset
   471
					"Host: {$blog['host']}",
0d28b7c10758 First commit
ymh
parents:
diff changeset
   472
					"Authorization: AuthSub token=\"$this->token\""
0d28b7c10758 First commit
ymh
parents:
diff changeset
   473
				);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   474
				$request = join( "\r\n", $headers ) . "\r\n\r\n";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   475
				$sock = $this->_get_blogger_sock( $blog['host'] );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   476
				if ( ! $sock ) return; // TODO: Error handling
0d28b7c10758 First commit
ymh
parents:
diff changeset
   477
				$response = $this->_txrx( $sock, $request );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   478
0d28b7c10758 First commit
ymh
parents:
diff changeset
   479
				$response = $this->parse_response( $response );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   480
0d28b7c10758 First commit
ymh
parents:
diff changeset
   481
				// Extract the comments and send for insertion
0d28b7c10758 First commit
ymh
parents:
diff changeset
   482
				preg_match_all( '/<entry[^>]*>.*?<\/entry>/s', $response['body'], $matches );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   483
				if ( count( $matches[0] ) ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   484
					$entries = array_reverse( $matches[0] );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   485
					foreach ( $entries as $entry ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   486
						$entry = "<feed>$entry</feed>";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   487
						$AtomParser = new AtomParser();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   488
						$AtomParser->parse( $entry );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   489
						$this->import_comment($AtomParser->entry);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   490
						unset($AtomParser);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   491
					}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   492
				}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   493
0d28b7c10758 First commit
ymh
parents:
diff changeset
   494
				// Get the 'previous' query string which we'll use on the next iteration
0d28b7c10758 First commit
ymh
parents:
diff changeset
   495
				$query = '';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   496
				$links = preg_match_all('/<link([^>]*)>/', $response['body'], $matches);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   497
				if ( count( $matches[1] ) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   498
					foreach ( $matches[1] as $match )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   499
						if ( preg_match('/rel=.previous./', $match) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   500
							$query = @html_entity_decode( preg_replace('/^.*href=[\'"].*\?(.+)[\'"].*$/', '$1', $match), ENT_COMPAT, get_option('blog_charset') );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   501
0d28b7c10758 First commit
ymh
parents:
diff changeset
   502
				parse_str($query, $q);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   503
0d28b7c10758 First commit
ymh
parents:
diff changeset
   504
				$this->blogs[$importing_blog]['comments_start_index'] = (int) $q['start-index'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   505
				$this->save_vars();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   506
			} while ( !empty( $query ) && $this->have_time() );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   507
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   508
		$this->blogs[$importing_blog]['mode'] = 'authors';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   509
		$this->save_vars();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   510
		if ( !$this->blogs[$importing_blog]['posts_done'] && !$this->blogs[$importing_blog]['comments_done'] )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   511
			die('nothing');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   512
		do_action('import_done', 'blogger');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   513
		die('done');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   514
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   515
0d28b7c10758 First commit
ymh
parents:
diff changeset
   516
	function convert_date( $date ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   517
	    preg_match('#([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(?:\.[0-9]+)?(Z|[\+|\-][0-9]{2,4}){0,1}#', $date, $date_bits);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   518
	    $offset = iso8601_timezone_to_offset( $date_bits[7] );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   519
		$timestamp = gmmktime($date_bits[4], $date_bits[5], $date_bits[6], $date_bits[2], $date_bits[3], $date_bits[1]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   520
		$timestamp -= $offset; // Convert from Blogger local time to GMT
0d28b7c10758 First commit
ymh
parents:
diff changeset
   521
		$timestamp += get_option('gmt_offset') * 3600; // Convert from GMT to WP local time
0d28b7c10758 First commit
ymh
parents:
diff changeset
   522
		return gmdate('Y-m-d H:i:s', $timestamp);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   523
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   524
0d28b7c10758 First commit
ymh
parents:
diff changeset
   525
	function no_apos( $string ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   526
		return str_replace( '&apos;', "'", $string);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   527
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   528
0d28b7c10758 First commit
ymh
parents:
diff changeset
   529
	function min_whitespace( $string ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   530
		return preg_replace( '|\s+|', ' ', $string );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   531
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   532
0d28b7c10758 First commit
ymh
parents:
diff changeset
   533
	function _normalize_tag( $matches ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   534
		return '<' . strtolower( $matches[1] );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   535
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   536
0d28b7c10758 First commit
ymh
parents:
diff changeset
   537
	function import_post( $entry ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   538
		global $importing_blog;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   539
0d28b7c10758 First commit
ymh
parents:
diff changeset
   540
		// The old permalink is all Blogger gives us to link comments to their posts.
0d28b7c10758 First commit
ymh
parents:
diff changeset
   541
		if ( isset( $entry->draft ) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   542
			$rel = 'self';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   543
		else
0d28b7c10758 First commit
ymh
parents:
diff changeset
   544
			$rel = 'alternate';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   545
		foreach ( $entry->links as $link ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   546
			if ( $link['rel'] == $rel ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   547
				$parts = parse_url( $link['href'] );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   548
				$entry->old_permalink = $parts['path'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   549
				break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   550
			}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   551
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   552
0d28b7c10758 First commit
ymh
parents:
diff changeset
   553
		$post_date    = $this->convert_date( $entry->published );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   554
		$post_content = trim( addslashes( $this->no_apos( @html_entity_decode( $entry->content, ENT_COMPAT, get_option('blog_charset') ) ) ) );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   555
		$post_title   = trim( addslashes( $this->no_apos( $this->min_whitespace( $entry->title ) ) ) );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   556
		$post_status  = isset( $entry->draft ) ? 'draft' : 'publish';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   557
0d28b7c10758 First commit
ymh
parents:
diff changeset
   558
		// Clean up content
0d28b7c10758 First commit
ymh
parents:
diff changeset
   559
		$post_content = preg_replace_callback('|<(/?[A-Z]+)|', array( &$this, '_normalize_tag' ), $post_content);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   560
		$post_content = str_replace('<br>', '<br />', $post_content);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   561
		$post_content = str_replace('<hr>', '<hr />', $post_content);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   562
0d28b7c10758 First commit
ymh
parents:
diff changeset
   563
		// Checks for duplicates
0d28b7c10758 First commit
ymh
parents:
diff changeset
   564
		if ( isset( $this->blogs[$importing_blog]['posts'][$entry->old_permalink] ) ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   565
			++$this->blogs[$importing_blog]['posts_skipped'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   566
		} elseif ( $post_id = post_exists( $post_title, $post_content, $post_date ) ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   567
			$this->blogs[$importing_blog]['posts'][$entry->old_permalink] = $post_id;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   568
			++$this->blogs[$importing_blog]['posts_skipped'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   569
		} else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   570
			$post = compact('post_date', 'post_content', 'post_title', 'post_status');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   571
0d28b7c10758 First commit
ymh
parents:
diff changeset
   572
			$post_id = wp_insert_post($post);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   573
			if ( is_wp_error( $post_id ) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   574
				return $post_id;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   575
0d28b7c10758 First commit
ymh
parents:
diff changeset
   576
			wp_create_categories( array_map( 'addslashes', $entry->categories ), $post_id );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   577
0d28b7c10758 First commit
ymh
parents:
diff changeset
   578
			$author = $this->no_apos( strip_tags( $entry->author ) );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   579
0d28b7c10758 First commit
ymh
parents:
diff changeset
   580
			add_post_meta( $post_id, 'blogger_blog', $this->blogs[$importing_blog]['host'], true );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   581
			add_post_meta( $post_id, 'blogger_author', $author, true );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   582
			add_post_meta( $post_id, 'blogger_permalink', $entry->old_permalink, true );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   583
0d28b7c10758 First commit
ymh
parents:
diff changeset
   584
			$this->blogs[$importing_blog]['posts'][$entry->old_permalink] = $post_id;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   585
			++$this->blogs[$importing_blog]['posts_done'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   586
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   587
		$this->save_vars();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   588
		return;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   589
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   590
0d28b7c10758 First commit
ymh
parents:
diff changeset
   591
	function import_comment( $entry ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   592
		global $importing_blog;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   593
0d28b7c10758 First commit
ymh
parents:
diff changeset
   594
		// Drop the #fragment and we have the comment's old post permalink.
0d28b7c10758 First commit
ymh
parents:
diff changeset
   595
		foreach ( $entry->links as $link ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   596
			if ( $link['rel'] == 'alternate' ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   597
				$parts = parse_url( $link['href'] );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   598
				$entry->old_permalink = $parts['fragment'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   599
				$entry->old_post_permalink = $parts['path'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   600
				break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   601
			}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   602
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   603
0d28b7c10758 First commit
ymh
parents:
diff changeset
   604
		$comment_post_ID = (int) $this->blogs[$importing_blog]['posts'][$entry->old_post_permalink];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   605
		preg_match('#<name>(.+?)</name>.*(?:\<uri>(.+?)</uri>)?#', $entry->author, $matches);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   606
		$comment_author  = addslashes( $this->no_apos( strip_tags( (string) $matches[1] ) ) );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   607
		$comment_author_url = addslashes( $this->no_apos( strip_tags( (string) $matches[2] ) ) );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   608
		$comment_date    = $this->convert_date( $entry->updated );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   609
		$comment_content = addslashes( $this->no_apos( @html_entity_decode( $entry->content, ENT_COMPAT, get_option('blog_charset') ) ) );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   610
0d28b7c10758 First commit
ymh
parents:
diff changeset
   611
		// Clean up content
0d28b7c10758 First commit
ymh
parents:
diff changeset
   612
		$comment_content = preg_replace_callback('|<(/?[A-Z]+)|', array( &$this, '_normalize_tag' ), $comment_content);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   613
		$comment_content = str_replace('<br>', '<br />', $comment_content);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   614
		$comment_content = str_replace('<hr>', '<hr />', $comment_content);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   615
0d28b7c10758 First commit
ymh
parents:
diff changeset
   616
		// Checks for duplicates
0d28b7c10758 First commit
ymh
parents:
diff changeset
   617
		if (
0d28b7c10758 First commit
ymh
parents:
diff changeset
   618
			isset( $this->blogs[$importing_blog]['comments'][$entry->old_permalink] ) ||
0d28b7c10758 First commit
ymh
parents:
diff changeset
   619
			comment_exists( $comment_author, $comment_date )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   620
		) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   621
			++$this->blogs[$importing_blog]['comments_skipped'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   622
		} else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   623
			$comment = compact('comment_post_ID', 'comment_author', 'comment_author_url', 'comment_date', 'comment_content');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   624
0d28b7c10758 First commit
ymh
parents:
diff changeset
   625
			$comment = wp_filter_comment($comment);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   626
			$comment_id = wp_insert_comment($comment);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   627
0d28b7c10758 First commit
ymh
parents:
diff changeset
   628
			$this->blogs[$importing_blog]['comments'][$entry->old_permalink] = $comment_id;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   629
0d28b7c10758 First commit
ymh
parents:
diff changeset
   630
			++$this->blogs[$importing_blog]['comments_done'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   631
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   632
		$this->save_vars();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   633
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   634
0d28b7c10758 First commit
ymh
parents:
diff changeset
   635
	function get_js_status($blog = false) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   636
		global $importing_blog;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   637
		if ( $blog === false )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   638
			$blog = $this->blogs[$importing_blog];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   639
		else
0d28b7c10758 First commit
ymh
parents:
diff changeset
   640
			$blog = $this->blogs[$blog];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   641
		$p1 = isset( $blog['posts_done'] ) ? (int) $blog['posts_done'] : 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   642
		$p2 = isset( $blog['total_posts'] ) ? (int) $blog['total_posts'] : 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   643
		$c1 = isset( $blog['comments_done'] ) ? (int) $blog['comments_done'] : 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   644
		$c2 = isset( $blog['total_comments'] ) ? (int) $blog['total_comments'] : 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   645
		return "{p1:$p1,p2:$p2,c1:$c1,c2:$c2}";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   646
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   647
0d28b7c10758 First commit
ymh
parents:
diff changeset
   648
	function get_author_form($blog = false) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   649
		global $importing_blog, $wpdb, $current_user;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   650
		if ( $blog === false )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   651
			$blog = & $this->blogs[$importing_blog];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   652
		else
0d28b7c10758 First commit
ymh
parents:
diff changeset
   653
			$blog = & $this->blogs[$blog];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   654
0d28b7c10758 First commit
ymh
parents:
diff changeset
   655
		if ( !isset( $blog['authors'] ) ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   656
			$post_ids = array_values($blog['posts']);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   657
			$authors = (array) $wpdb->get_col("SELECT DISTINCT meta_value FROM $wpdb->postmeta WHERE meta_key = 'blogger_author' AND post_id IN (" . join( ',', $post_ids ) . ")");
0d28b7c10758 First commit
ymh
parents:
diff changeset
   658
			$blog['authors'] = array_map(null, $authors, array_fill(0, count($authors), $current_user->ID));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   659
			$this->save_vars();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   660
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   661
0d28b7c10758 First commit
ymh
parents:
diff changeset
   662
		$directions = __('All posts were imported with the current user as author. Use this form to move each Blogger user&#8217;s posts to a different WordPress user. You may <a href="users.php">add users</a> and then return to this page and complete the user mapping. This form may be used as many times as you like until you activate the &#8220;Restart&#8221; function below.');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   663
		$heading = __('Author mapping');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   664
		$blogtitle = "{$blog['title']} ({$blog['host']})";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   665
		$mapthis = __('Blogger username');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   666
		$tothis = __('WordPress login');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   667
		$submit = esc_js( __('Save Changes') );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   668
0d28b7c10758 First commit
ymh
parents:
diff changeset
   669
		foreach ( $blog['authors'] as $i => $author )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   670
			$rows .= "<tr><td><label for='authors[$i]'>{$author[0]}</label></td><td><select name='authors[$i]' id='authors[$i]'>" . $this->get_user_options($author[1]) . "</select></td></tr>";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   671
0d28b7c10758 First commit
ymh
parents:
diff changeset
   672
		return "<div class='wrap'><h2>$heading</h2><h3>$blogtitle</h3><p>$directions</p><form action='index.php?import=blogger&amp;noheader=true&saveauthors=1' method='post'><input type='hidden' name='blog' value='" . esc_attr($importing_blog) . "' /><table cellpadding='5'><thead><td>$mapthis</td><td>$tothis</td></thead>$rows<tr><td></td><td class='submit'><input type='submit' class='button authorsubmit' value='$submit' /></td></tr></table></form></div>";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   673
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   674
0d28b7c10758 First commit
ymh
parents:
diff changeset
   675
	function get_user_options($current) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   676
		global $importer_users;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   677
		if ( ! isset( $importer_users ) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   678
			$importer_users = (array) get_users_of_blog();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   679
0d28b7c10758 First commit
ymh
parents:
diff changeset
   680
		foreach ( $importer_users as $user ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   681
			$sel = ( $user->user_id == $current ) ? " selected='selected'" : '';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   682
			$options .= "<option value='$user->user_id'$sel>$user->display_name</option>";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   683
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   684
0d28b7c10758 First commit
ymh
parents:
diff changeset
   685
		return $options;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   686
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   687
0d28b7c10758 First commit
ymh
parents:
diff changeset
   688
	function save_authors() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   689
		global $importing_blog, $wpdb;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   690
		$authors = (array) $_POST['authors'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   691
0d28b7c10758 First commit
ymh
parents:
diff changeset
   692
		$host = $this->blogs[$importing_blog]['host'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   693
0d28b7c10758 First commit
ymh
parents:
diff changeset
   694
		// Get an array of posts => authors
0d28b7c10758 First commit
ymh
parents:
diff changeset
   695
		$post_ids = (array) $wpdb->get_col( $wpdb->prepare("SELECT post_id FROM $wpdb->postmeta WHERE meta_key = 'blogger_blog' AND meta_value = %s", $host) );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   696
		$post_ids = join( ',', $post_ids );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   697
		$results = (array) $wpdb->get_results("SELECT post_id, meta_value FROM $wpdb->postmeta WHERE meta_key = 'blogger_author' AND post_id IN ($post_ids)");
0d28b7c10758 First commit
ymh
parents:
diff changeset
   698
		foreach ( $results as $row )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   699
			$authors_posts[$row->post_id] = $row->meta_value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   700
0d28b7c10758 First commit
ymh
parents:
diff changeset
   701
		foreach ( $authors as $author => $user_id ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   702
			$user_id = (int) $user_id;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   703
0d28b7c10758 First commit
ymh
parents:
diff changeset
   704
			// Skip authors that haven't been changed
0d28b7c10758 First commit
ymh
parents:
diff changeset
   705
			if ( $user_id == $this->blogs[$importing_blog]['authors'][$author][1] )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   706
				continue;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   707
0d28b7c10758 First commit
ymh
parents:
diff changeset
   708
			// Get a list of the selected author's posts
0d28b7c10758 First commit
ymh
parents:
diff changeset
   709
			$post_ids = (array) array_keys( $authors_posts, $this->blogs[$importing_blog]['authors'][$author][0] );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   710
			$post_ids = join( ',', $post_ids);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   711
0d28b7c10758 First commit
ymh
parents:
diff changeset
   712
			$wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET post_author = %d WHERE id IN ($post_ids)", $user_id) );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   713
			$this->blogs[$importing_blog]['authors'][$author][1] = $user_id;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   714
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   715
		$this->save_vars();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   716
0d28b7c10758 First commit
ymh
parents:
diff changeset
   717
		wp_redirect('edit.php');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   718
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   719
0d28b7c10758 First commit
ymh
parents:
diff changeset
   720
	function _get_auth_sock() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   721
		// Connect to https://www.google.com
0d28b7c10758 First commit
ymh
parents:
diff changeset
   722
		if ( !$sock = @ fsockopen('ssl://www.google.com', 443, $errno, $errstr) ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   723
			$this->uh_oh(
0d28b7c10758 First commit
ymh
parents:
diff changeset
   724
				__('Could not connect to https://www.google.com'),
0d28b7c10758 First commit
ymh
parents:
diff changeset
   725
				__('There was a problem opening a secure connection to Google. This is what went wrong:'),
0d28b7c10758 First commit
ymh
parents:
diff changeset
   726
				"$errstr ($errno)"
0d28b7c10758 First commit
ymh
parents:
diff changeset
   727
			);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   728
			return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   729
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   730
		return $sock;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   731
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   732
0d28b7c10758 First commit
ymh
parents:
diff changeset
   733
	function _get_blogger_sock($host = 'www2.blogger.com') {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   734
		if ( !$sock = @ fsockopen($host, 80, $errno, $errstr) ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   735
			$this->uh_oh(
0d28b7c10758 First commit
ymh
parents:
diff changeset
   736
				sprintf( __('Could not connect to %s'), $host ),
0d28b7c10758 First commit
ymh
parents:
diff changeset
   737
				__('There was a problem opening a connection to Blogger. This is what went wrong:'),
0d28b7c10758 First commit
ymh
parents:
diff changeset
   738
				"$errstr ($errno)"
0d28b7c10758 First commit
ymh
parents:
diff changeset
   739
			);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   740
			return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   741
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   742
		return $sock;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   743
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   744
0d28b7c10758 First commit
ymh
parents:
diff changeset
   745
	function _txrx( $sock, $request ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   746
		fwrite( $sock, $request );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   747
		while ( ! feof( $sock ) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   748
			$response .= @ fread ( $sock, 8192 );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   749
		fclose( $sock );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   750
		return $response;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   751
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   752
0d28b7c10758 First commit
ymh
parents:
diff changeset
   753
	function revoke($token) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   754
		$headers = array(
0d28b7c10758 First commit
ymh
parents:
diff changeset
   755
			"GET /accounts/AuthSubRevokeToken HTTP/1.0",
0d28b7c10758 First commit
ymh
parents:
diff changeset
   756
			"Authorization: AuthSub token=\"$token\""
0d28b7c10758 First commit
ymh
parents:
diff changeset
   757
		);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   758
		$request = join( "\r\n", $headers ) . "\r\n\r\n";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   759
		$sock = $this->_get_auth_sock( );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   760
		if ( ! $sock ) return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   761
		$this->_txrx( $sock, $request );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   762
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   763
0d28b7c10758 First commit
ymh
parents:
diff changeset
   764
	function restart() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   765
		global $wpdb;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   766
		$options = get_option( 'blogger_importer' );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   767
0d28b7c10758 First commit
ymh
parents:
diff changeset
   768
		if ( isset( $options['token'] ) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   769
			$this->revoke( $options['token'] );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   770
0d28b7c10758 First commit
ymh
parents:
diff changeset
   771
		delete_option('blogger_importer');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   772
		$wpdb->query("DELETE FROM $wpdb->postmeta WHERE meta_key = 'blogger_author'");
0d28b7c10758 First commit
ymh
parents:
diff changeset
   773
		wp_redirect('?import=blogger');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   774
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   775
0d28b7c10758 First commit
ymh
parents:
diff changeset
   776
	// Returns associative array of code, header, cookies, body. Based on code from php.net.
0d28b7c10758 First commit
ymh
parents:
diff changeset
   777
	function parse_response($this_response) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   778
		// Split response into header and body sections
0d28b7c10758 First commit
ymh
parents:
diff changeset
   779
		list($response_headers, $response_body) = explode("\r\n\r\n", $this_response, 2);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   780
		$response_header_lines = explode("\r\n", $response_headers);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   781
0d28b7c10758 First commit
ymh
parents:
diff changeset
   782
		// First line of headers is the HTTP response code
0d28b7c10758 First commit
ymh
parents:
diff changeset
   783
		$http_response_line = array_shift($response_header_lines);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   784
		if(preg_match('@^HTTP/[0-9]\.[0-9] ([0-9]{3})@',$http_response_line, $matches)) { $response_code = $matches[1]; }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   785
0d28b7c10758 First commit
ymh
parents:
diff changeset
   786
		// put the rest of the headers in an array
0d28b7c10758 First commit
ymh
parents:
diff changeset
   787
		$response_header_array = array();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   788
		foreach($response_header_lines as $header_line) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   789
			list($header,$value) = explode(': ', $header_line, 2);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   790
			$response_header_array[$header] .= $value."\n";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   791
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   792
0d28b7c10758 First commit
ymh
parents:
diff changeset
   793
		$cookie_array = array();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   794
		$cookies = explode("\n", $response_header_array["Set-Cookie"]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   795
		foreach($cookies as $this_cookie) { array_push($cookie_array, "Cookie: ".$this_cookie); }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   796
0d28b7c10758 First commit
ymh
parents:
diff changeset
   797
		return array("code" => $response_code, "header" => $response_header_array, "cookies" => $cookie_array, "body" => $response_body);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   798
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   799
0d28b7c10758 First commit
ymh
parents:
diff changeset
   800
	// Step 9: Congratulate the user
0d28b7c10758 First commit
ymh
parents:
diff changeset
   801
	function congrats() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   802
		$blog = (int) $_GET['blog'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   803
		echo '<h1>'.__('Congratulations!').'</h1><p>'.__('Now that you have imported your Blogger blog into WordPress, what are you going to do? Here are some suggestions:').'</p><ul><li>'.__('That was hard work! Take a break.').'</li>';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   804
		if ( count($this->import['blogs']) > 1 )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   805
			echo '<li>'.__('In case you haven&#8217;t done it already, you can import the posts from your other blogs:'). $this->show_blogs() . '</li>';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   806
		if ( $n = count($this->import['blogs'][$blog]['newusers']) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   807
			echo '<li>'.sprintf(__('Go to <a href="%s" target="%s">Authors &amp; Users</a>, where you can modify the new user(s) or delete them. If you want to make all of the imported posts yours, you will be given that option when you delete the new authors.'), 'users.php', '_parent').'</li>';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   808
		echo '<li>'.__('For security, click the link below to reset this importer.').'</li>';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   809
		echo '</ul>';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   810
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   811
0d28b7c10758 First commit
ymh
parents:
diff changeset
   812
	// Figures out what to do, then does it.
0d28b7c10758 First commit
ymh
parents:
diff changeset
   813
	function start() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   814
		if ( isset($_POST['restart']) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   815
			$this->restart();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   816
0d28b7c10758 First commit
ymh
parents:
diff changeset
   817
		$options = get_option('blogger_importer');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   818
0d28b7c10758 First commit
ymh
parents:
diff changeset
   819
		if ( is_array($options) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   820
			foreach ( $options as $key => $value )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   821
				$this->$key = $value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   822
0d28b7c10758 First commit
ymh
parents:
diff changeset
   823
		if ( isset( $_REQUEST['blog'] ) ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   824
			$blog = is_array($_REQUEST['blog']) ? array_shift( $keys = array_keys( $_REQUEST['blog'] ) ) : $_REQUEST['blog'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   825
			$blog = (int) $blog;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   826
			$result = $this->import_blog( $blog );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   827
			if ( is_wp_error( $result ) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   828
				echo $result->get_error_message();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   829
		} elseif ( isset($_GET['token']) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   830
			$this->auth();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   831
		elseif ( isset($this->token) && $this->token_is_valid() )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   832
			$this->show_blogs();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   833
		else
0d28b7c10758 First commit
ymh
parents:
diff changeset
   834
			$this->greet();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   835
0d28b7c10758 First commit
ymh
parents:
diff changeset
   836
		$saved = $this->save_vars();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   837
0d28b7c10758 First commit
ymh
parents:
diff changeset
   838
		if ( $saved && !isset($_GET['noheader']) ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   839
			$restart = __('Restart');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   840
			$message = __('We have saved some information about your Blogger account in your WordPress database. Clearing this information will allow you to start over. Restarting will not affect any posts you have already imported. If you attempt to re-import a blog, duplicate posts and comments will be skipped.');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   841
			$submit = esc_attr__('Clear account information');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   842
			echo "<div class='wrap'><h2>$restart</h2><p>$message</p><form method='post' action='?import=blogger&amp;noheader=true'><p class='submit' style='text-align:left;'><input type='submit' class='button' value='$submit' name='restart' /></p></form></div>";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   843
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   844
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   845
0d28b7c10758 First commit
ymh
parents:
diff changeset
   846
	function save_vars() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   847
		$vars = get_object_vars($this);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   848
		update_option( 'blogger_importer', $vars );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   849
0d28b7c10758 First commit
ymh
parents:
diff changeset
   850
		return !empty($vars);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   851
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   852
0d28b7c10758 First commit
ymh
parents:
diff changeset
   853
	function admin_head() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   854
?>
0d28b7c10758 First commit
ymh
parents:
diff changeset
   855
<style type="text/css">
0d28b7c10758 First commit
ymh
parents:
diff changeset
   856
td { text-align: center; line-height: 2em;}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   857
thead td { font-weight: bold; }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   858
.bar {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   859
	width: 200px;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   860
	text-align: left;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   861
	line-height: 2em;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   862
	padding: 0px;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   863
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   864
.ind {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   865
	position: absolute;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   866
	background-color: #83B4D8;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   867
	width: 1px;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   868
	z-index: 9;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   869
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   870
.stat {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   871
	z-index: 10;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   872
	position: relative;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   873
	text-align: center;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   874
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   875
</style>
0d28b7c10758 First commit
ymh
parents:
diff changeset
   876
<?php
0d28b7c10758 First commit
ymh
parents:
diff changeset
   877
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   878
0d28b7c10758 First commit
ymh
parents:
diff changeset
   879
	function Blogger_Import() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   880
		global $importer_started;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   881
		$importer_started = time();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   882
		if ( isset( $_GET['import'] ) && $_GET['import'] == 'blogger' ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   883
			wp_enqueue_script('jquery');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   884
			add_action('admin_head', array(&$this, 'admin_head'));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   885
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   886
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   887
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   888
0d28b7c10758 First commit
ymh
parents:
diff changeset
   889
$blogger_import = new Blogger_Import();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   890
0d28b7c10758 First commit
ymh
parents:
diff changeset
   891
register_importer('blogger', __('Blogger'), __('Import posts, comments, and users from a Blogger blog.'), array ($blogger_import, 'start'));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   892
0d28b7c10758 First commit
ymh
parents:
diff changeset
   893
class AtomEntry {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   894
	var $links = array();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   895
	var $categories = array();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   896
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   897
0d28b7c10758 First commit
ymh
parents:
diff changeset
   898
class AtomParser {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   899
0d28b7c10758 First commit
ymh
parents:
diff changeset
   900
	var $ATOM_CONTENT_ELEMENTS = array('content','summary','title','subtitle','rights');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   901
	var $ATOM_SIMPLE_ELEMENTS = array('id','updated','published','draft','author');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   902
0d28b7c10758 First commit
ymh
parents:
diff changeset
   903
	var $depth = 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   904
	var $indent = 2;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   905
	var $in_content;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   906
	var $ns_contexts = array();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   907
	var $ns_decls = array();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   908
	var $is_xhtml = false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   909
	var $skipped_div = false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   910
0d28b7c10758 First commit
ymh
parents:
diff changeset
   911
	var $entry;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   912
0d28b7c10758 First commit
ymh
parents:
diff changeset
   913
	function AtomParser() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   914
		$this->entry = new AtomEntry();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   915
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   916
0d28b7c10758 First commit
ymh
parents:
diff changeset
   917
	function _map_attrs_func( $k, $v ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   918
		return "$k=\"$v\"";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   919
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   920
0d28b7c10758 First commit
ymh
parents:
diff changeset
   921
	function _map_xmlns_func( $p, $n ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   922
		$xd = "xmlns";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   923
		if ( strlen( $n[0] ) > 0 )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   924
			$xd .= ":{$n[0]}";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   925
0d28b7c10758 First commit
ymh
parents:
diff changeset
   926
		return "{$xd}=\"{$n[1]}\"";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   927
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   928
0d28b7c10758 First commit
ymh
parents:
diff changeset
   929
	function parse($xml) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   930
0d28b7c10758 First commit
ymh
parents:
diff changeset
   931
		global $app_logging;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   932
		array_unshift($this->ns_contexts, array());
0d28b7c10758 First commit
ymh
parents:
diff changeset
   933
0d28b7c10758 First commit
ymh
parents:
diff changeset
   934
		$parser = xml_parser_create_ns();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   935
		xml_set_object($parser, $this);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   936
		xml_set_element_handler($parser, "start_element", "end_element");
0d28b7c10758 First commit
ymh
parents:
diff changeset
   937
		xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   938
		xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,0);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   939
		xml_set_character_data_handler($parser, "cdata");
0d28b7c10758 First commit
ymh
parents:
diff changeset
   940
		xml_set_default_handler($parser, "_default");
0d28b7c10758 First commit
ymh
parents:
diff changeset
   941
		xml_set_start_namespace_decl_handler($parser, "start_ns");
0d28b7c10758 First commit
ymh
parents:
diff changeset
   942
		xml_set_end_namespace_decl_handler($parser, "end_ns");
0d28b7c10758 First commit
ymh
parents:
diff changeset
   943
0d28b7c10758 First commit
ymh
parents:
diff changeset
   944
		$contents = "";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   945
0d28b7c10758 First commit
ymh
parents:
diff changeset
   946
		xml_parse($parser, $xml);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   947
0d28b7c10758 First commit
ymh
parents:
diff changeset
   948
		xml_parser_free($parser);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   949
0d28b7c10758 First commit
ymh
parents:
diff changeset
   950
		return true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   951
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   952
0d28b7c10758 First commit
ymh
parents:
diff changeset
   953
	function start_element($parser, $name, $attrs) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   954
0d28b7c10758 First commit
ymh
parents:
diff changeset
   955
		$tag = array_pop(split(":", $name));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   956
0d28b7c10758 First commit
ymh
parents:
diff changeset
   957
		array_unshift($this->ns_contexts, $this->ns_decls);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   958
0d28b7c10758 First commit
ymh
parents:
diff changeset
   959
		$this->depth++;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   960
0d28b7c10758 First commit
ymh
parents:
diff changeset
   961
		if(!empty($this->in_content)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   962
			$attrs_prefix = array();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   963
0d28b7c10758 First commit
ymh
parents:
diff changeset
   964
			// resolve prefixes for attributes
0d28b7c10758 First commit
ymh
parents:
diff changeset
   965
			foreach($attrs as $key => $value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   966
				$attrs_prefix[$this->ns_to_prefix($key)] = $this->xml_escape($value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   967
			}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   968
			$attrs_str = join(' ', array_map( array( &$this, '_map_attrs_func' ), array_keys($attrs_prefix), array_values($attrs_prefix)));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   969
			if(strlen($attrs_str) > 0) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   970
				$attrs_str = " " . $attrs_str;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   971
			}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   972
0d28b7c10758 First commit
ymh
parents:
diff changeset
   973
			$xmlns_str = join(' ', array_map( array( &$this, '_map_xmlns_func' ), array_keys($this->ns_contexts[0]), array_values($this->ns_contexts[0])));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   974
			if(strlen($xmlns_str) > 0) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   975
				$xmlns_str = " " . $xmlns_str;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   976
			}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   977
0d28b7c10758 First commit
ymh
parents:
diff changeset
   978
			// handle self-closing tags (case: a new child found right-away, no text node)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   979
			if(count($this->in_content) == 2) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   980
				array_push($this->in_content, ">");
0d28b7c10758 First commit
ymh
parents:
diff changeset
   981
			}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   982
0d28b7c10758 First commit
ymh
parents:
diff changeset
   983
			array_push($this->in_content, "<". $this->ns_to_prefix($name) ."{$xmlns_str}{$attrs_str}");
0d28b7c10758 First commit
ymh
parents:
diff changeset
   984
		} else if(in_array($tag, $this->ATOM_CONTENT_ELEMENTS) || in_array($tag, $this->ATOM_SIMPLE_ELEMENTS)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   985
			$this->in_content = array();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   986
			$this->is_xhtml = $attrs['type'] == 'xhtml';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   987
			array_push($this->in_content, array($tag,$this->depth));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   988
		} else if($tag == 'link') {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   989
			array_push($this->entry->links, $attrs);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   990
		} else if($tag == 'category') {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   991
			array_push($this->entry->categories, $attrs['term']);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   992
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   993
0d28b7c10758 First commit
ymh
parents:
diff changeset
   994
		$this->ns_decls = array();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   995
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   996
0d28b7c10758 First commit
ymh
parents:
diff changeset
   997
	function end_element($parser, $name) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   998
0d28b7c10758 First commit
ymh
parents:
diff changeset
   999
		$tag = array_pop(split(":", $name));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1000
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1001
		if(!empty($this->in_content)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1002
			if($this->in_content[0][0] == $tag &&
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1003
			$this->in_content[0][1] == $this->depth) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1004
				array_shift($this->in_content);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1005
				if($this->is_xhtml) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1006
					$this->in_content = array_slice($this->in_content, 2, count($this->in_content)-3);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1007
				}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1008
				$this->entry->$tag = join('',$this->in_content);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1009
				$this->in_content = array();
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1010
			} else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1011
				$endtag = $this->ns_to_prefix($name);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1012
				if (strpos($this->in_content[count($this->in_content)-1], '<' . $endtag) !== false) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1013
					array_push($this->in_content, "/>");
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1014
				} else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1015
					array_push($this->in_content, "</$endtag>");
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1016
				}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1017
			}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1018
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1019
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1020
		array_shift($this->ns_contexts);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1021
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1022
		#print str_repeat(" ", $this->depth * $this->indent) . "end_element('$name')" ."\n";
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1023
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1024
		$this->depth--;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1025
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1026
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1027
	function start_ns($parser, $prefix, $uri) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1028
		#print str_repeat(" ", $this->depth * $this->indent) . "starting: " . $prefix . ":" . $uri . "\n";
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1029
		array_push($this->ns_decls, array($prefix,$uri));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1030
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1031
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1032
	function end_ns($parser, $prefix) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1033
		#print str_repeat(" ", $this->depth * $this->indent) . "ending: #" . $prefix . "#\n";
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1034
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1035
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1036
	function cdata($parser, $data) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1037
		#print str_repeat(" ", $this->depth * $this->indent) . "data: #" . $data . "#\n";
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1038
		if(!empty($this->in_content)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1039
			// handle self-closing tags (case: text node found, need to close element started)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1040
			if (strpos($this->in_content[count($this->in_content)-1], '<') !== false) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1041
				array_push($this->in_content, ">");
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1042
			}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1043
			array_push($this->in_content, $this->xml_escape($data));
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1044
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1045
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1046
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1047
	function _default($parser, $data) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1048
		# when does this gets called?
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1049
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1050
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1051
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1052
	function ns_to_prefix($qname) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1053
		$components = split(":", $qname);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1054
		$name = array_pop($components);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1055
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1056
		if(!empty($components)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1057
			$ns = join(":",$components);
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1058
			foreach($this->ns_contexts as $context) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1059
				foreach($context as $mapping) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1060
					if($mapping[1] == $ns && strlen($mapping[0]) > 0) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1061
						return "$mapping[0]:$name";
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1062
					}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1063
				}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1064
			}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1065
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1066
		return $name;
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1067
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1068
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1069
	function xml_escape($string)
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1070
	{
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1071
			 return str_replace(array('&','"',"'",'<','>'),
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1072
				array('&amp;','&quot;','&apos;','&lt;','&gt;'),
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1073
				$string );
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1074
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1075
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1076
0d28b7c10758 First commit
ymh
parents:
diff changeset
  1077
?>