function doImportBLOGGER($file, $section, $status, $invite) { # Parse a file in the MT Import Format, as described here: # http://www.movabletype.org/docs/mtimport.html # This doesn't interpret the data at all, just parse it into # a structure. $fp = fopen($file, 'r'); if (!$fp) { return false; } //Keep some response on some part $results = array(); $multiline_type = ''; $multiline_data = ''; $state = 'metadata'; $item = array(); while (!feof($fp)) { $line = rtrim(fgets($fp, 8192)); # The states suggested by the spec are inconsisent, but # we'll do our best to fake it if ($line == '--------') { if ($state == 'multiline' and !empty($multiline_type)) { $item[$multiline_type][] = $multiline_data; } # End of an item, so we can process it $results[] = import_blogger_item($item, $section, $status, $invite); $item = array(); $state = 'metadata'; } elseif ($line == '-----' and $state == 'metadata') { $state = 'multiline'; $multiline_type = ''; } elseif ($line == '-----' and $state == 'multiline') { if (!empty($multiline_type)) { $item[$multiline_type][] = $multiline_data; } $state = 'multiline'; $multiline_type = ''; } elseif ($state == 'metadata') { if (preg_match('/^([A-Z ]+):\\s*(.*)$/', $line, $match)) { $item[$match[1]] = $match[2]; } } elseif ($state == 'multiline' and empty($multiline_type)) { if (preg_match('/^([A-Z ]+):\\s*$/', $line, $match)) { $multiline_type = $match[1]; $multiline_data = array(); } } elseif ($state == 'multiline') { # Here's where things get hinky. Rather than put the # multiline metadata before the field name, it goes # after, with no clear separation between metadata # and data. And either the metadata or data might be # missing. if (empty($multiline_data['content']) and preg_match('/^([A-Z ]+):\\s*(.*)$/', $line, $match)) { # Metadata within the multiline field $multiline_data[$match[1]] = $match[2]; } elseif (empty($multiline_data['content'])) { $multiline_data['content'] = $line . "\n"; } else { $multiline_data['content'] .= $line . "\n"; } } } # Catch the last item in the file, if it doesn't end with a separator if (!empty($item)) { $results[] = import_blogger_item($item, $section, $status, $invite); } fclose($fp); return join('<br />', $results); }
/** * Imports from a Blogger dump file. * * This function parses a file in the 'MovableType Import Format'. * The data isn't interpreted at all, just parsed into a * structure. * * This function supports importing comments and articles from * Blogger. Things such as statuses, sections, categories or keywords * do not carry over. Just body content and titles, basically. * * Returns results as a HTML formatted list. * * @param string $file Path to the dump file * @param string $section The article section * @param string $status The article status * @param string $invite The comments invite * @return string HTML * @see http://www.movabletype.org/docs/mtimport.html */ function doImportBLOGGER($file, $section, $status, $invite) { $fp = fopen($file, 'r'); if (!$fp) { return false; } // Keep some response on some part. $results = array(); $multiline_type = ''; $multiline_data = ''; $state = 'metadata'; $item = array(); while (!feof($fp)) { $line = rtrim(fgets($fp, 8192)); // The states suggested by the spec are inconsisent, but we'll do our // best to fake it. if ($line == '--------') { if ($state == 'multiline' and !empty($multiline_type)) { $item[$multiline_type][] = $multiline_data; } // End of an item, so we can process it. $results[] = import_blogger_item($item, $section, $status, $invite); $item = array(); $state = 'metadata'; } elseif ($line == '-----' and $state == 'metadata') { $state = 'multiline'; $multiline_type = ''; } elseif ($line == '-----' and $state == 'multiline') { if (!empty($multiline_type)) { $item[$multiline_type][] = $multiline_data; } $state = 'multiline'; $multiline_type = ''; } elseif ($state == 'metadata') { if (preg_match('/^([A-Z ]+):\\s*(.*)$/', $line, $match)) { $item[$match[1]] = $match[2]; } } elseif ($state == 'multiline' and empty($multiline_type)) { if (preg_match('/^([A-Z ]+):\\s*$/', $line, $match)) { $multiline_type = $match[1]; $multiline_data = array(); } } elseif ($state == 'multiline') { // Here's where things get hinky. Rather than put the multiline // metadata before the field name, it goes after, with no clear // separation between metadata and data. And either the metadata // or data might be missing. if (empty($multiline_data['content']) and preg_match('/^([A-Z ]+):\\s*(.*)$/', $line, $match)) { // Metadata within the multiline field. $multiline_data[$match[1]] = $match[2]; } elseif (empty($multiline_data['content'])) { $multiline_data['content'] = $line . "\n"; } else { $multiline_data['content'] .= $line . "\n"; } } } // Catch the last item in the file, if it doesn't end with a separator. if (!empty($item)) { $results[] = import_blogger_item($item, $section, $status, $invite); } fclose($fp); return join('<br />', $results); }