$field)) { migrate_instrument_start('MigrateDestinationMedia rewriteImgTags'); foreach ($entity->$field as $language => $values) { $body = $values[0]['value']; break; } // Quickly skip any non-candidates if (!stristr($body, ']*>|i', array(self, 'replaceCallback'), $body); $entity->{$field}[$language][0]['value'] = $new_body; migrate_instrument_stop('MigrateDestinationMedia rewriteImgTags'); } } /** * If a referenced image can be found in the files table, replace the tag * with a media JSON reference. * * @param array $matches */ static protected function replaceCallback(array $matches) { $src_matches = array(); // Default to the original tag $result = $matches[0]; // Extract the src parameter if (preg_match('|src=[\'"]([^\'"]+)[\'"]|i', $matches[0], $src_matches)) { // Replace the scheme and host portions of the referenced URI with the // Drupal scheme as it's saved in the file_unmanaged table $src = $src_matches[1]; $fid = db_select('file_managed', 'f') ->fields('f', array('fid')) ->condition('filename', basename($src)) ->execute() ->fetchField(); if ($fid) { $image_info = array( 'type' => 'media', 'view_mode' => 'media_large', 'fid' => $fid, 'attributes' => array( 'alt' => '', 'title' => '', 'class' => 'media-image', 'typeof' => 'foaf:Image', 'wysiwyg' => 1, ), ); // Get the height and width parameters if present preg_match('|width=[\'"]([^\'"]+)[\'"]|i', $matches[0], $width); preg_match('|height=[\'"]([^\'"]+)[\'"]|i', $matches[0], $height); // image width if ($width) { $image_info['attributes']['width'] = $width[1]; } // image height if ($height) { $image_info['attributes']['height'] = $height[1]; } $result = '[[' . drupal_json_encode($image_info) . ']]'; } } return $result; } } /** * Class for creating Youtube file entities. */ class MigrateExtrasFileYoutube implements MigrateFileInterface { /** * Implementation of MigrateFileInterface::fields(). * * @return array */ static public function fields() { return array(); } /** * Implementation of MigrateFileInterface::processFiles(). * * @param $value * The URI or local filespec of a file to be imported. * @param $owner * User ID (uid) to be the owner of the file. * @return object * The file entity being created or referenced. */ public function processFile($value, $owner) { // Convert the Youtube URI into a local stream wrapper. if (class_exists('MediaInternetYouTubeHandler')) { $handler = new MediaInternetYouTubeHandler($value); $destination = $handler->parse($value); $file = file_uri_to_object($destination, TRUE); } elseif (class_exists('MediaInternetOEmbedHandler')) { $handler = new MediaInternetOEmbedHandler($value); $file = $handler->getFileObject(); } else { MigrationBase::displayMessage(t('Could not find a handler for YouTube videos')); return FALSE; } // Create a file entity object for this Youtube reference, and see if we // can get the video title. if (empty($file->fid) && $info = $handler->getOEmbed()) { $file->filename = truncate_utf8($info['title'], 255); } $file = file_save($file); if (is_object($file)) { return $file; } else { return FALSE; } } } // Basic support for the deprecated media field type. class MigrateMediaFieldHandler extends MigrateFileFieldHandler { public function __construct() { $this->registerTypes(array('media')); } /** * Implementation of MigrateFieldHandler::fields(). * * @param $type * The field type. * @param $instance * Instance info for the field. * @param Migration $migration * The migration context for the parent field. We can look at the mappings * and determine which subfields are relevant. * @return array */ public function fields($type, $instance, $migration = NULL) { $fields = parent::fields($type, $instance, $migration); unset($fields['description']); unset($fields['display']); $fields += array( 'title' => t('Subfield: String to be used as the title value'), 'data' => t('Subfield: Additional data about the field'), ); return $fields; } }