diff --git a/metatag.module b/metatag.module index e278685..56ad797 100644 --- a/metatag.module +++ b/metatag.module @@ -690,38 +690,7 @@ function metatag_migrate_prepare_row(Row $row, MigrateSourceInterface $source, M } } - // Keep a list of the D7 meta tags and how they translate to D8. - $tags_map = MigrateHelper::mapForMetatagD7(); - - $metatags = []; - foreach ($query->execute()->fetchCol() as $data_entry) { - // Re-shape D7 entries into for D8 entries. - // @todo This could live in a migrate process plugin. - foreach (unserialize($data_entry) as $d7_metatag_name => $data) { - // If there's no data for this tag, ignore everything. - if (empty($data)) { - continue; - } - - // @todo Skip these values for now, maybe an some version supported - // these? - if (!is_array($data) || empty($data['value'])) { - continue; - } - - // Convert the D7 meta tag name to the D8 equivalent. If this meta tag - // is not recognized, skip it. - if (empty($tags_map[$d7_metatag_name])) { - continue; - } - $d8_metatag_name = $tags_map[$d7_metatag_name]; - - // Keep the entire data structure. - $metatags[$d8_metatag_name] = $data; - } - } - - $row->setSourceProperty('pseudo_metatag_d7', serialize($metatags)); + $row->setSourceProperty('pseudo_metatag_d7', $query->execute()->fetchCol()); } } @@ -741,7 +710,10 @@ function metatag_migration_plugins_alter(array &$migrations) { $destination_plugin = DefaultFactory::getPluginClass($migration['destination']['plugin'], $plugin_definition); if (is_subclass_of($destination_plugin, EntityContentBase::class) || $destination_plugin == EntityContentBase::class) { - $migration['process']['field_metatag'] = 'pseudo_metatag_d7'; + $migration['process']['field_metatag'] = [ + 'process' => 'metatag_d7', + 'source' => 'pseudo_metatag_d7', + ]; } } } diff --git a/src/MigrateHelper.php b/src/MigrateHelper.php deleted file mode 100644 index 929130b..0000000 --- a/src/MigrateHelper.php +++ /dev/null @@ -1,356 +0,0 @@ - 'abstract', - // @todo 'cache-control' => '', - 'canonical' => 'canonical_url', - 'content-language' => 'content_language', - 'description' => 'description', - // @todo 'expires' => '', - 'generator' => 'generator', - 'geo.placename' => 'geo_placename', - 'geo.position' => 'geo_position', - 'geo.region' => 'geo_region', - 'icbm' => 'icbm', - 'image_src' => 'image_src', - 'keywords' => 'keywords', - 'news_keywords' => 'news_keywords', - // @todo 'next' => '', - 'original-source' => 'original_source', - // @todo 'pragma' => '', - // @todo 'prev' => '', - 'rating' => 'rating', - 'referrer' => 'referrer', - // @todo 'refresh' => '', - // @todo 'revisit-after' => '', - 'rights' => 'rights', - 'robots' => 'robots', - 'set_cookie' => 'set_cookie', - 'shortlink' => 'shortlink', - 'standout' => 'standout', - 'title' => 'title', - // From metatag_app_links.metatag.inc: - 'al:android:app_name' => 'al_android_app_name', - 'al:android:class' => 'al_android_class', - 'al:android:package' => 'al_android_package', - 'al:android:url' => 'al_android_url', - 'al:ios:app_name' => 'al_ios_app_name', - 'al:ios:app_store_id' => 'al_ios_app_store_id', - 'al:ios:url' => 'al_ios_url', - 'al:ipad:app_name' => 'al_ipad_app_name', - 'al:ipad:app_store_id' => 'al_ipad_app_store_id', - 'al:ipad:url' => 'al_ipad_url', - 'al:iphone:app_name' => 'al_iphone_app_name', - 'al:iphone:app_store_id' => 'al_iphone_app_store_id', - 'al:iphone:url' => 'al_iphone_url', - 'al:web:should_fallback' => 'al_web_should_fallback', - 'al:web:url' => 'al_web_url', - 'al:windows:app_id' => 'al_windows_app_id', - 'al:windows:app_name' => 'al_windows_app_name', - 'al:windows:url' => 'al_windows_url', - 'al:windows_phone:app_id' => 'al_windows_phone_app_id', - 'al:windows_phone:app_name' => 'al_windows_phone_app_name', - 'al:windows_phone:url' => 'al_windows_phone_url', - 'al:windows_universal:app_id' => 'al_windows_universal_app_id', - 'al:windows_universal:app_name' => 'al_windows_universal_app_name', - 'al:windows_universal:url' => 'al_windows_universal_url', - // From metatag_dc.metatag.inc: - 'dcterms.contributor' => 'dcterms_contributor', - 'dcterms.coverage' => 'dcterms_coverage', - 'dcterms.creator' => 'dcterms_creator', - 'dcterms.date' => 'dcterms_date', - 'dcterms.description' => 'dcterms_description', - 'dcterms.format' => 'dcterms_format', - 'dcterms.identifier' => 'dcterms_identifier', - 'dcterms.language' => 'dcterms_language', - 'dcterms.publisher' => 'dcterms_publisher', - 'dcterms.relation' => 'dcterms_relation', - 'dcterms.rights' => 'dcterms_rights', - 'dcterms.source' => 'dcterms_source', - 'dcterms.subject' => 'dcterms_subject', - 'dcterms.title' => 'dcterms_title', - 'dcterms.type' => 'dcterms_type', - // From metatag_dc_advanced.metatag.inc: - 'dcterms.abstract' => 'dcterms_abstract', - 'dcterms.accessRights' => 'dcterms_access_rights', - 'dcterms.accrualMethod' => 'dcterms_accrual_method', - 'dcterms.accrualPeriodicity' => 'dcterms_accrual_periodicity', - 'dcterms.accrualPolicy' => 'dcterms_accrual_policy', - 'dcterms.alternative' => 'dcterms_alternative', - 'dcterms.audience' => 'dcterms_audience', - 'dcterms.available' => 'dcterms_available', - 'dcterms.bibliographicCitation' => 'dcterms_bibliographic_citation', - 'dcterms.conformsTo' => 'dcterms_conforms_to', - 'dcterms.created' => 'dcterms_created', - 'dcterms.dateAccepted' => 'dcterms_date_accepted', - 'dcterms.dateCopyrighted' => 'dcterms_date_copyrighted', - 'dcterms.dateSubmitted' => 'dcterms_date_submitted', - 'dcterms.educationLevel' => 'dcterms_education_level', - 'dcterms.extent' => 'dcterms_extent', - 'dcterms.hasFormat' => 'dcterms_has_format', - 'dcterms.hasPart' => 'dcterms_has_part', - 'dcterms.hasVersion' => 'dcterms_has_version', - 'dcterms.instructionalMethod' => 'dcterms_instructional_method', - 'dcterms.isFormatOf' => 'dcterms_is_format_of', - 'dcterms.isPartOf' => 'dcterms_is_part_of', - 'dcterms.isReferencedBy' => 'dcterms_is_referenced_by', - 'dcterms.isReplacedBy' => 'dcterms_is_replaced_by', - 'dcterms.isRequiredBy' => 'dcterms_is_required_by', - 'dcterms.issued' => 'dcterms_issued', - 'dcterms.isVersionOf' => 'dcterms_is_version_of', - 'dcterms.license' => 'dcterms_license', - 'dcterms.mediator' => 'dcterms_mediator', - 'dcterms.medium' => 'dcterms_medium', - 'dcterms.modified' => 'dcterms_modified', - 'dcterms.provenance' => 'dcterms_provenance', - 'dcterms.references' => 'dcterms_references', - 'dcterms.replaces' => 'dcterms_replaces', - 'dcterms.requires' => 'dcterms_requires', - 'dcterms.rightsHolder' => 'dcterms_rights_holder', - 'dcterms.spatial' => 'dcterms_spatial', - 'dcterms.tableOfContents' => 'dcterms_table_of_contents', - 'dcterms.temporal' => 'dcterms_temporal', - 'dcterms.valid' => 'dcterms_valid', - // From metatag_facebook.metatag.inc: - 'fb:admins' => 'fb_admins', - 'fb:app_id' => 'fb_app_id', - 'fb:pages' => 'fb_pages', - // From metatag_favicons.metatag.inc: - 'apple-touch-icon' => 'apple_touch_icon', - 'apple-touch-icon-precomposed' => 'apple_touch_icon_precomposed', - 'apple-touch-icon-precomposed_114x114' => 'apple_touch_icon_precomposed_114x114', - 'apple-touch-icon-precomposed_120x120' => 'apple_touch_icon_precomposed_120x120', - 'apple-touch-icon-precomposed_144x144' => 'apple_touch_icon_precomposed_144x144', - 'apple-touch-icon-precomposed_152x152' => 'apple_touch_icon_precomposed_152x152', - 'apple-touch-icon-precomposed_180x180' => 'apple_touch_icon_precomposed_180x180', - 'apple-touch-icon-precomposed_72x72' => 'apple_touch_icon_precomposed_72x72', - 'apple-touch-icon-precomposed_76x76' => 'apple_touch_icon_precomposed_76x76', - 'apple-touch-icon_114x114' => 'apple_touch_icon_114x114', - 'apple-touch-icon_120x120' => 'apple_touch_icon_120x120', - 'apple-touch-icon_144x144' => 'apple_touch_icon_144x144', - 'apple-touch-icon_152x152' => 'apple_touch_icon_152x152', - 'apple-touch-icon_180x180' => 'apple_touch_icon_180x180', - 'apple-touch-icon_72x72' => 'apple_touch_icon_72x72', - 'apple-touch-icon_76x76' => 'apple_touch_icon_76x76', - 'icon_16x16' => 'icon_16x16', - 'icon_192x192' => 'icon_192x192', - 'icon_32x32' => 'icon_32x32', - 'icon_96x96' => 'icon_96x96', - 'mask-icon' => 'mask-icon', - 'shortcut icon' => 'shortcut_icon', - // From metatag_google_cse.metatag.inc: - 'audience' => 'audience', - 'department' => 'department', - 'doc_status' => 'doc_status', - 'google_rating' => 'google_rating', - 'thumbnail' => 'thumbnail', - // From metatag_google_plus.metatag.inc; not doing these, Google+ closed. - 'itemtype' => '', - 'itemprop:name' => '', - 'itemprop:description' => '', - 'itemprop:image' => '', - 'author' => '', - 'publisher' => '', - // From metatag_hreflang.metatag.inc: - 'hreflang_xdefault' => 'hreflang_xdefault', - // @todo 'hreflang_' . $langcode => 'hreflang_per_language', - // From metatag_mobile.metatag.inc: - // @todo 'alternate_handheld' => '', - // @todo 'amphtml' => '', - 'android-app-link-alternative' => 'android_app_link_alternative', - 'android-manifest' => 'android_manifest', - 'apple-itunes-app' => 'apple_itunes_app', - 'apple-mobile-web-app-capable' => 'apple_mobile_web_app_capable', - 'apple-mobile-web-app-status-bar-style' => 'apple_mobile_web_app_status_bar_style', - 'apple-mobile-web-app-title' => 'apple_mobile_web_app_title', - 'application-name' => 'application_name', - 'cleartype' => 'cleartype', - 'format-detection' => 'format_detection', - 'HandheldFriendly' => 'handheldfriendly', - 'ios-app-link-alternative' => 'ios_app_link_alternative', - 'MobileOptimized' => 'mobileoptimized', - 'msapplication-allowDomainApiCalls' => 'msapplication_allowDomainApiCalls', - 'msapplication-allowDomainMetaTags' => 'msapplication_allowDomainMetaTags', - 'msapplication-badge' => 'msapplication_badge', - 'msapplication-config' => 'msapplication_config', - 'msapplication-navbutton-color' => 'msapplication_navbutton_color', - 'msapplication-notification' => 'msapplication_notification', - 'msapplication-square150x150logo' => 'msapplication_square150x150logo', - 'msapplication-square310x310logo' => 'msapplication_square310x310logo', - 'msapplication-square70x70logo' => 'msapplication_square70x70logo', - 'msapplication-starturl' => 'msapplication_starturl', - 'msapplication-task' => 'msapplication_task', - 'msapplication-task-separator' => 'msapplication_task_separator', - 'msapplication-tilecolor' => 'msapplication_tilecolor', - 'msapplication-tileimage' => 'msapplication_tileimage', - 'msapplication-tooltip' => 'msapplication_tooltip', - 'msapplication-wide310x150logo' => 'msapplication_wide310x150logo', - 'msapplication-window' => 'msapplication_window', - 'theme-color' => 'theme_color', - 'viewport' => 'viewport', - 'x-ua-compatible' => 'x_ua_compatible', - // From metatag_opengraph.metatag.inc: - 'article:author' => 'article_author', - 'article:expiration_time' => 'article_expiration_time', - 'article:modified_time' => 'article_modified_time', - 'article:published_time' => 'article_published_time', - 'article:publisher' => 'article_publisher', - 'article:section' => 'article_section', - 'article:tag' => 'article_tag', - 'book:author' => 'book_author', - 'book:isbn' => 'book_isbn', - 'book:release_date' => 'book_release_date', - 'book:tag' => 'book_tag', - // @todo 'og:audio' => '', - // @todo 'og:audio:secure_url' => '', - // @todo 'og:audio:type' => '', - 'og:country_name' => 'og_country_name', - 'og:description' => 'og_description', - 'og:determiner' => 'og_determiner', - 'og:email' => 'og_email', - 'og:fax_number' => 'og_fax_number', - 'og:image' => 'og_image', - // @todo '' => 'og_image_alt', - 'og:image:height' => 'og_image_height', - 'og:image:secure_url' => 'og_image_secure_url', - 'og:image:type' => 'og_image_type', - 'og:image:url' => 'og_image_url', - 'og:image:width' => 'og_image_width', - 'og:latitude' => 'og_latitude', - 'og:locale' => 'og_locale', - 'og:locale:alternate' => 'og_locale_alternative', - 'og:locality' => 'og_locality', - 'og:longitude' => 'og_longitude', - 'og:phone_number' => 'og_phone_number', - 'og:postal_code' => 'og_postal_code', - 'og:region' => 'og_region', - 'og:see_also' => 'og_see_also', - 'og:site_name' => 'og_site_name', - 'og:street_address' => 'og_street_address', - 'og:title' => 'og_title', - 'og:type' => 'og_type', - 'og:updated_time' => 'og_updated_time', - 'og:url' => 'og_url', - // @todo '' => 'og_video', - 'og:video:height' => 'og_video_height', - 'og:video:secure_url' => 'og_video_secure_url', - 'og:video:type' => 'og_video_type', - 'og:video:url' => 'og_video_url', - 'og:video:width' => 'og_video_width', - // @todo 'profile:first_name' => '', - // @todo 'profile:gender' => '', - // @todo 'profile:last_name' => '', - // @todo 'profile:username' => '', - // @todo 'video:actor' => '', - // @todo 'video:actor:role' => '', - // @todo 'video:director' => '', - // @todo 'video:duration' => '', - // @todo 'video:release_date' => '', - // @todo 'video:series' => '', - // @todo 'video:tag' => '', - // @todo 'video:writer' => '', - // From metatag_opengraph_products.metatag.inc: - 'product:price:amount' => 'product_price_amount', - 'product:price:currency' => 'product_price_currency', - // @todo 'product:availability' => '', - // @todo 'product:brand' => '', - // @todo 'product:upc' => '', - // @todo 'product:ean' => '', - // @todo 'product:isbn' => '', - // @todo 'product:plural_title' => '', - // @todo 'product:retailer' => '', - // @todo 'product:retailer_title' => '', - // @todo 'product:retailer_part_no' => '', - // @todo 'product:mfr_part_no' => '', - // @todo 'product:size' => '', - // @todo 'product:product_link' => '', - // @todo 'product:category' => '', - // @todo 'product:color' => '', - // @todo 'product:material' => '', - // @todo 'product:pattern' => '', - // @todo 'product:shipping_cost:amount' => '', - // @todo 'product:shipping_cost:currency' => '', - // @todo 'product:weight:value' => '', - // @todo 'product:weight:units' => '', - // @todo 'product:shipping_weight:value' => '', - // @todo 'product:shipping_weight:units' => '', - // @todo 'product:expiration_time' => '', - // @todo 'product:condition' => '', - // Pinterest. - // @todo '' => 'pinterest_id', - // @todo '' => 'pinterest_description', - // @todo '' => 'pinterest_nohover', - // @todo '' => 'pinterest_url', - // @todo '' => 'pinterest_media', - // @todo '' => 'pinterest_nopin', - // @todo '' => 'pinterest_nosearch', - // From metatag_twitter_cards.metatag.inc: - 'twitter:app:country' => 'twitter_cards_app_store_country', - 'twitter:app:id:googleplay' => 'twitter_cards_app_id_googleplay', - 'twitter:app:id:ipad' => 'twitter_cards_app_id_ipad', - 'twitter:app:id:iphone' => 'twitter_cards_app_id_iphone', - 'twitter:app:name:googleplay' => 'twitter_cards_app_name_googleplay', - 'twitter:app:name:ipad' => 'twitter_cards_app_name_ipad', - 'twitter:app:name:iphone' => 'twitter_cards_app_name_iphone', - 'twitter:app:url:googleplay' => 'twitter_cards_app_url_googleplay', - 'twitter:app:url:ipad' => 'twitter_cards_app_url_ipad', - 'twitter:app:url:iphone' => 'twitter_cards_app_url_iphone', - 'twitter:card' => 'twitter_cards_type', - 'twitter:creator' => 'twitter_cards_creator', - 'twitter:creator:id' => 'twitter_cards_creator_id', - 'twitter:data1' => 'twitter_cards_data1', - 'twitter:data2' => 'twitter_cards_data2', - 'twitter:description' => 'twitter_cards_description', - 'twitter:dnt' => 'twitter_cards_donottrack', - 'twitter:image' => 'twitter_cards_image', - 'twitter:image0' => 'twitter_cards_gallery_image0', - 'twitter:image1' => 'twitter_cards_gallery_image1', - 'twitter:image2' => 'twitter_cards_gallery_image2', - 'twitter:image3' => 'twitter_cards_gallery_image3', - 'twitter:image:alt' => 'twitter_cards_image_alt', - 'twitter:image:height' => 'twitter_cards_image_height', - 'twitter:image:width' => 'twitter_cards_image_width', - 'twitter:label1' => 'twitter_cards_label1', - 'twitter:label2' => 'twitter_cards_label2', - 'twitter:player' => 'twitter_cards_player', - 'twitter:player:height' => 'twitter_cards_player_height', - 'twitter:player:stream' => 'twitter_cards_player_stream', - 'twitter:player:stream:content_type' => 'twitter_cards_player_stream_content_type', - 'twitter:player:width' => 'twitter_cards_player_width', - 'twitter:site' => 'twitter_cards_site', - 'twitter:site:id' => 'twitter_cards_site_id', - 'twitter:title' => 'twitter_cards_title', - 'twitter:url' => 'twitter_cards_page_url', - // From metatag_verification.metatag.inc: - 'baidu-site-verification' => 'baidu', - 'google-site-verification' => 'bing', - 'msvalidate.01' => 'google', - 'norton-safeweb-site-verification' => 'norton_safe_web', - 'p:domain_verify' => 'pinterest', - // @todo '' => 'pocket', - 'yandex-verification' => 'yandex', - ]; - - // Trigger hook_metatag_migrate_tags_map_alter(). - // Allow modules to override tags or the entity used for token replacements. - \Drupal::service('module_handler')->alter('metatag_migrate_tags_map', $map); - - return $map; - } - -} diff --git a/src/Plugin/migrate/process/d7/MetatagD7.php b/src/Plugin/migrate/process/d7/MetatagD7.php new file mode 100644 index 0000000..3fa897b --- /dev/null +++ b/src/Plugin/migrate/process/d7/MetatagD7.php @@ -0,0 +1,409 @@ +tagsMap(); + + $metatags = []; + + // Re-shape D7 entries into for D8 entries. + try { + $old_tags = unserialize($value); + } + catch (\Exception $e) { + throw new MigrateException('Data from Metatag was not a serialized array;' . $e->getMessage()); + } + + foreach ($old_tags as $d7_metatag_name => $data) { + // If there's no data for this tag, ignore everything. + if (empty($data)) { + continue; + } + + // @todo Skip these values for now, maybe some version supported these? + if (!is_array($data) || empty($data['value'])) { + continue; + } + + // Convert the D7 meta tag name to the D8 equivalent. If this meta tag + // is not recognized, skip it. + if (empty([$d7_metatag_name])) { + continue; + } + + // There's a D8 equivalent for this meta tag. + $d8_metatag_name = $tags_map[$d7_metatag_name]; + + // Keep the entire data structure. + $metatags[$d8_metatag_name] = $data; + } + + return serialize($metatags); + } + + /** + * Match Metatag-D7 meta tags with their D8 counterparts. + * + * @return array + * An array of D7 tags to their D8 counterparts. + */ + public function tagsMap() { + $map = [ + // From the main Metatag module. + 'abstract' => 'abstract', + // @todo 'cache-control' => '', + 'canonical' => 'canonical_url', + 'content-language' => 'content_language', + 'description' => 'description', + // @todo 'expires' => '', + 'generator' => 'generator', + 'geo.placename' => 'geo_placename', + 'geo.position' => 'geo_position', + 'geo.region' => 'geo_region', + 'icbm' => 'icbm', + 'image_src' => 'image_src', + 'keywords' => 'keywords', + 'news_keywords' => 'news_keywords', + // @todo 'next' => '', + 'original-source' => 'original_source', + // @todo 'pragma' => '', + // @todo 'prev' => '', + 'rating' => 'rating', + 'referrer' => 'referrer', + // @todo 'refresh' => '', + // @todo 'revisit-after' => '', + 'rights' => 'rights', + 'robots' => 'robots', + 'set_cookie' => 'set_cookie', + 'shortlink' => 'shortlink', + 'standout' => 'standout', + 'title' => 'title', + // From metatag_app_links.metatag.inc: + 'al:android:app_name' => 'al_android_app_name', + 'al:android:class' => 'al_android_class', + 'al:android:package' => 'al_android_package', + 'al:android:url' => 'al_android_url', + 'al:ios:app_name' => 'al_ios_app_name', + 'al:ios:app_store_id' => 'al_ios_app_store_id', + 'al:ios:url' => 'al_ios_url', + 'al:ipad:app_name' => 'al_ipad_app_name', + 'al:ipad:app_store_id' => 'al_ipad_app_store_id', + 'al:ipad:url' => 'al_ipad_url', + 'al:iphone:app_name' => 'al_iphone_app_name', + 'al:iphone:app_store_id' => 'al_iphone_app_store_id', + 'al:iphone:url' => 'al_iphone_url', + 'al:web:should_fallback' => 'al_web_should_fallback', + 'al:web:url' => 'al_web_url', + 'al:windows:app_id' => 'al_windows_app_id', + 'al:windows:app_name' => 'al_windows_app_name', + 'al:windows:url' => 'al_windows_url', + 'al:windows_phone:app_id' => 'al_windows_phone_app_id', + 'al:windows_phone:app_name' => 'al_windows_phone_app_name', + 'al:windows_phone:url' => 'al_windows_phone_url', + 'al:windows_universal:app_id' => 'al_windows_universal_app_id', + 'al:windows_universal:app_name' => 'al_windows_universal_app_name', + 'al:windows_universal:url' => 'al_windows_universal_url', + // From metatag_dc.metatag.inc: + 'dcterms.contributor' => 'dcterms_contributor', + 'dcterms.coverage' => 'dcterms_coverage', + 'dcterms.creator' => 'dcterms_creator', + 'dcterms.date' => 'dcterms_date', + 'dcterms.description' => 'dcterms_description', + 'dcterms.format' => 'dcterms_format', + 'dcterms.identifier' => 'dcterms_identifier', + 'dcterms.language' => 'dcterms_language', + 'dcterms.publisher' => 'dcterms_publisher', + 'dcterms.relation' => 'dcterms_relation', + 'dcterms.rights' => 'dcterms_rights', + 'dcterms.source' => 'dcterms_source', + 'dcterms.subject' => 'dcterms_subject', + 'dcterms.title' => 'dcterms_title', + 'dcterms.type' => 'dcterms_type', + // From metatag_dc_advanced.metatag.inc: + 'dcterms.abstract' => 'dcterms_abstract', + 'dcterms.accessRights' => 'dcterms_access_rights', + 'dcterms.accrualMethod' => 'dcterms_accrual_method', + 'dcterms.accrualPeriodicity' => 'dcterms_accrual_periodicity', + 'dcterms.accrualPolicy' => 'dcterms_accrual_policy', + 'dcterms.alternative' => 'dcterms_alternative', + 'dcterms.audience' => 'dcterms_audience', + 'dcterms.available' => 'dcterms_available', + 'dcterms.bibliographicCitation' => 'dcterms_bibliographic_citation', + 'dcterms.conformsTo' => 'dcterms_conforms_to', + 'dcterms.created' => 'dcterms_created', + 'dcterms.dateAccepted' => 'dcterms_date_accepted', + 'dcterms.dateCopyrighted' => 'dcterms_date_copyrighted', + 'dcterms.dateSubmitted' => 'dcterms_date_submitted', + 'dcterms.educationLevel' => 'dcterms_education_level', + 'dcterms.extent' => 'dcterms_extent', + 'dcterms.hasFormat' => 'dcterms_has_format', + 'dcterms.hasPart' => 'dcterms_has_part', + 'dcterms.hasVersion' => 'dcterms_has_version', + 'dcterms.instructionalMethod' => 'dcterms_instructional_method', + 'dcterms.isFormatOf' => 'dcterms_is_format_of', + 'dcterms.isPartOf' => 'dcterms_is_part_of', + 'dcterms.isReferencedBy' => 'dcterms_is_referenced_by', + 'dcterms.isReplacedBy' => 'dcterms_is_replaced_by', + 'dcterms.isRequiredBy' => 'dcterms_is_required_by', + 'dcterms.issued' => 'dcterms_issued', + 'dcterms.isVersionOf' => 'dcterms_is_version_of', + 'dcterms.license' => 'dcterms_license', + 'dcterms.mediator' => 'dcterms_mediator', + 'dcterms.medium' => 'dcterms_medium', + 'dcterms.modified' => 'dcterms_modified', + 'dcterms.provenance' => 'dcterms_provenance', + 'dcterms.references' => 'dcterms_references', + 'dcterms.replaces' => 'dcterms_replaces', + 'dcterms.requires' => 'dcterms_requires', + 'dcterms.rightsHolder' => 'dcterms_rights_holder', + 'dcterms.spatial' => 'dcterms_spatial', + 'dcterms.tableOfContents' => 'dcterms_table_of_contents', + 'dcterms.temporal' => 'dcterms_temporal', + 'dcterms.valid' => 'dcterms_valid', + // From metatag_facebook.metatag.inc: + 'fb:admins' => 'fb_admins', + 'fb:app_id' => 'fb_app_id', + 'fb:pages' => 'fb_pages', + // From metatag_favicons.metatag.inc: + 'apple-touch-icon' => 'apple_touch_icon', + 'apple-touch-icon-precomposed' => 'apple_touch_icon_precomposed', + 'apple-touch-icon-precomposed_114x114' => 'apple_touch_icon_precomposed_114x114', + 'apple-touch-icon-precomposed_120x120' => 'apple_touch_icon_precomposed_120x120', + 'apple-touch-icon-precomposed_144x144' => 'apple_touch_icon_precomposed_144x144', + 'apple-touch-icon-precomposed_152x152' => 'apple_touch_icon_precomposed_152x152', + 'apple-touch-icon-precomposed_180x180' => 'apple_touch_icon_precomposed_180x180', + 'apple-touch-icon-precomposed_72x72' => 'apple_touch_icon_precomposed_72x72', + 'apple-touch-icon-precomposed_76x76' => 'apple_touch_icon_precomposed_76x76', + 'apple-touch-icon_114x114' => 'apple_touch_icon_114x114', + 'apple-touch-icon_120x120' => 'apple_touch_icon_120x120', + 'apple-touch-icon_144x144' => 'apple_touch_icon_144x144', + 'apple-touch-icon_152x152' => 'apple_touch_icon_152x152', + 'apple-touch-icon_180x180' => 'apple_touch_icon_180x180', + 'apple-touch-icon_72x72' => 'apple_touch_icon_72x72', + 'apple-touch-icon_76x76' => 'apple_touch_icon_76x76', + 'icon_16x16' => 'icon_16x16', + 'icon_192x192' => 'icon_192x192', + 'icon_32x32' => 'icon_32x32', + 'icon_96x96' => 'icon_96x96', + 'mask-icon' => 'mask-icon', + 'shortcut icon' => 'shortcut_icon', + // From metatag_google_cse.metatag.inc: + 'audience' => 'audience', + 'department' => 'department', + 'doc_status' => 'doc_status', + 'google_rating' => 'google_rating', + 'thumbnail' => 'thumbnail', + // From metatag_google_plus.metatag.inc; not doing these, Google+ closed. + 'itemtype' => '', + 'itemprop:name' => '', + 'itemprop:description' => '', + 'itemprop:image' => '', + 'author' => '', + 'publisher' => '', + // From metatag_hreflang.metatag.inc: + 'hreflang_xdefault' => 'hreflang_xdefault', + // @todo 'hreflang_' . $langcode => 'hreflang_per_language', + // From metatag_mobile.metatag.inc: + // @todo 'alternate_handheld' => '', + // @todo 'amphtml' => '', + 'android-app-link-alternative' => 'android_app_link_alternative', + 'android-manifest' => 'android_manifest', + 'apple-itunes-app' => 'apple_itunes_app', + 'apple-mobile-web-app-capable' => 'apple_mobile_web_app_capable', + 'apple-mobile-web-app-status-bar-style' => 'apple_mobile_web_app_status_bar_style', + 'apple-mobile-web-app-title' => 'apple_mobile_web_app_title', + 'application-name' => 'application_name', + 'cleartype' => 'cleartype', + 'format-detection' => 'format_detection', + 'HandheldFriendly' => 'handheldfriendly', + 'ios-app-link-alternative' => 'ios_app_link_alternative', + 'MobileOptimized' => 'mobileoptimized', + 'msapplication-allowDomainApiCalls' => 'msapplication_allowDomainApiCalls', + 'msapplication-allowDomainMetaTags' => 'msapplication_allowDomainMetaTags', + 'msapplication-badge' => 'msapplication_badge', + 'msapplication-config' => 'msapplication_config', + 'msapplication-navbutton-color' => 'msapplication_navbutton_color', + 'msapplication-notification' => 'msapplication_notification', + 'msapplication-square150x150logo' => 'msapplication_square150x150logo', + 'msapplication-square310x310logo' => 'msapplication_square310x310logo', + 'msapplication-square70x70logo' => 'msapplication_square70x70logo', + 'msapplication-starturl' => 'msapplication_starturl', + 'msapplication-task' => 'msapplication_task', + 'msapplication-task-separator' => 'msapplication_task_separator', + 'msapplication-tilecolor' => 'msapplication_tilecolor', + 'msapplication-tileimage' => 'msapplication_tileimage', + 'msapplication-tooltip' => 'msapplication_tooltip', + 'msapplication-wide310x150logo' => 'msapplication_wide310x150logo', + 'msapplication-window' => 'msapplication_window', + 'theme-color' => 'theme_color', + 'viewport' => 'viewport', + 'x-ua-compatible' => 'x_ua_compatible', + // From metatag_opengraph.metatag.inc: + 'article:author' => 'article_author', + 'article:expiration_time' => 'article_expiration_time', + 'article:modified_time' => 'article_modified_time', + 'article:published_time' => 'article_published_time', + 'article:publisher' => 'article_publisher', + 'article:section' => 'article_section', + 'article:tag' => 'article_tag', + 'book:author' => 'book_author', + 'book:isbn' => 'book_isbn', + 'book:release_date' => 'book_release_date', + 'book:tag' => 'book_tag', + // @todo 'og:audio' => '', + // @todo 'og:audio:secure_url' => '', + // @todo 'og:audio:type' => '', + 'og:country_name' => 'og_country_name', + 'og:description' => 'og_description', + 'og:determiner' => 'og_determiner', + 'og:email' => 'og_email', + 'og:fax_number' => 'og_fax_number', + 'og:image' => 'og_image', + // @todo '' => 'og_image_alt', + 'og:image:height' => 'og_image_height', + 'og:image:secure_url' => 'og_image_secure_url', + 'og:image:type' => 'og_image_type', + 'og:image:url' => 'og_image_url', + 'og:image:width' => 'og_image_width', + 'og:latitude' => 'og_latitude', + 'og:locale' => 'og_locale', + 'og:locale:alternate' => 'og_locale_alternative', + 'og:locality' => 'og_locality', + 'og:longitude' => 'og_longitude', + 'og:phone_number' => 'og_phone_number', + 'og:postal_code' => 'og_postal_code', + 'og:region' => 'og_region', + 'og:see_also' => 'og_see_also', + 'og:site_name' => 'og_site_name', + 'og:street_address' => 'og_street_address', + 'og:title' => 'og_title', + 'og:type' => 'og_type', + 'og:updated_time' => 'og_updated_time', + 'og:url' => 'og_url', + // @todo '' => 'og_video', + 'og:video:height' => 'og_video_height', + 'og:video:secure_url' => 'og_video_secure_url', + 'og:video:type' => 'og_video_type', + 'og:video:url' => 'og_video_url', + 'og:video:width' => 'og_video_width', + // @todo 'profile:first_name' => '', + // @todo 'profile:gender' => '', + // @todo 'profile:last_name' => '', + // @todo 'profile:username' => '', + // @todo 'video:actor' => '', + // @todo 'video:actor:role' => '', + // @todo 'video:director' => '', + // @todo 'video:duration' => '', + // @todo 'video:release_date' => '', + // @todo 'video:series' => '', + // @todo 'video:tag' => '', + // @todo 'video:writer' => '', + // From metatag_opengraph_products.metatag.inc: + 'product:price:amount' => 'product_price_amount', + 'product:price:currency' => 'product_price_currency', + // @todo 'product:availability' => '', + // @todo 'product:brand' => '', + // @todo 'product:upc' => '', + // @todo 'product:ean' => '', + // @todo 'product:isbn' => '', + // @todo 'product:plural_title' => '', + // @todo 'product:retailer' => '', + // @todo 'product:retailer_title' => '', + // @todo 'product:retailer_part_no' => '', + // @todo 'product:mfr_part_no' => '', + // @todo 'product:size' => '', + // @todo 'product:product_link' => '', + // @todo 'product:category' => '', + // @todo 'product:color' => '', + // @todo 'product:material' => '', + // @todo 'product:pattern' => '', + // @todo 'product:shipping_cost:amount' => '', + // @todo 'product:shipping_cost:currency' => '', + // @todo 'product:weight:value' => '', + // @todo 'product:weight:units' => '', + // @todo 'product:shipping_weight:value' => '', + // @todo 'product:shipping_weight:units' => '', + // @todo 'product:expiration_time' => '', + // @todo 'product:condition' => '', + // Pinterest. + // @todo '' => 'pinterest_id', + // @todo '' => 'pinterest_description', + // @todo '' => 'pinterest_nohover', + // @todo '' => 'pinterest_url', + // @todo '' => 'pinterest_media', + // @todo '' => 'pinterest_nopin', + // @todo '' => 'pinterest_nosearch', + // From metatag_twitter_cards.metatag.inc: + 'twitter:app:country' => 'twitter_cards_app_store_country', + 'twitter:app:id:googleplay' => 'twitter_cards_app_id_googleplay', + 'twitter:app:id:ipad' => 'twitter_cards_app_id_ipad', + 'twitter:app:id:iphone' => 'twitter_cards_app_id_iphone', + 'twitter:app:name:googleplay' => 'twitter_cards_app_name_googleplay', + 'twitter:app:name:ipad' => 'twitter_cards_app_name_ipad', + 'twitter:app:name:iphone' => 'twitter_cards_app_name_iphone', + 'twitter:app:url:googleplay' => 'twitter_cards_app_url_googleplay', + 'twitter:app:url:ipad' => 'twitter_cards_app_url_ipad', + 'twitter:app:url:iphone' => 'twitter_cards_app_url_iphone', + 'twitter:card' => 'twitter_cards_type', + 'twitter:creator' => 'twitter_cards_creator', + 'twitter:creator:id' => 'twitter_cards_creator_id', + 'twitter:data1' => 'twitter_cards_data1', + 'twitter:data2' => 'twitter_cards_data2', + 'twitter:description' => 'twitter_cards_description', + 'twitter:dnt' => 'twitter_cards_donottrack', + 'twitter:image' => 'twitter_cards_image', + 'twitter:image0' => 'twitter_cards_gallery_image0', + 'twitter:image1' => 'twitter_cards_gallery_image1', + 'twitter:image2' => 'twitter_cards_gallery_image2', + 'twitter:image3' => 'twitter_cards_gallery_image3', + 'twitter:image:alt' => 'twitter_cards_image_alt', + 'twitter:image:height' => 'twitter_cards_image_height', + 'twitter:image:width' => 'twitter_cards_image_width', + 'twitter:label1' => 'twitter_cards_label1', + 'twitter:label2' => 'twitter_cards_label2', + 'twitter:player' => 'twitter_cards_player', + 'twitter:player:height' => 'twitter_cards_player_height', + 'twitter:player:stream' => 'twitter_cards_player_stream', + 'twitter:player:stream:content_type' => 'twitter_cards_player_stream_content_type', + 'twitter:player:width' => 'twitter_cards_player_width', + 'twitter:site' => 'twitter_cards_site', + 'twitter:site:id' => 'twitter_cards_site_id', + 'twitter:title' => 'twitter_cards_title', + 'twitter:url' => 'twitter_cards_page_url', + // From metatag_verification.metatag.inc: + 'baidu-site-verification' => 'baidu', + 'google-site-verification' => 'bing', + 'msvalidate.01' => 'google', + 'norton-safeweb-site-verification' => 'norton_safe_web', + 'p:domain_verify' => 'pinterest', + // @todo '' => 'pocket', + 'yandex-verification' => 'yandex', + ]; + + // Trigger hook_metatag_migrate_tags_map_alter(). + // Allow modules to override tags or the entity used for token replacements. + \Drupal::service('module_handler')->alter('metatag_migrate_tags_map', $map); + + return $map; + } + +}