15f891b7eSNickeau<?php 25f891b7eSNickeau 31fa8c418SNickeauuse ComboStrap\Image; 423723136Sgerardnicouse ComboStrap\MediaLink; 55f891b7eSNickeauuse ComboStrap\LogUtility; 65f891b7eSNickeauuse ComboStrap\Page; 7*c3437056SNickeauuse ComboStrap\PageImage; 8*c3437056SNickeauuse ComboStrap\PageImageUsage; 9f788f694Sgerardnicouse ComboStrap\PluginUtility; 105f891b7eSNickeauuse ComboStrap\StringUtility; 1121913ab3SNickeauuse ComboStrap\TagAttributes; 125f891b7eSNickeau 135f891b7eSNickeauif (!defined('DOKU_INC')) die(); 145f891b7eSNickeau 1537748cd8SNickeaurequire_once(__DIR__ . '/../ComboStrap/Site.php'); 165f891b7eSNickeau 175f891b7eSNickeau/** 185f891b7eSNickeau * 195f891b7eSNickeau * For the canonical meta, see {@link action_plugin_combo_metacanonical} 205f891b7eSNickeau * https://github.com/twbs/bootstrap/blob/v4-dev/site/layouts/partials/social.html 215f891b7eSNickeau * 225f891b7eSNickeau * TODO: https://developer.twitter.com/en/docs/twitter-for-websites/embedded-tweets/overview 235f891b7eSNickeau */ 245f891b7eSNickeauclass action_plugin_combo_metatwitter extends DokuWiki_Action_Plugin 255f891b7eSNickeau{ 265f891b7eSNickeau 275f891b7eSNickeau 285f891b7eSNickeau /** 295f891b7eSNickeau * The handle name 305f891b7eSNickeau */ 315f891b7eSNickeau const CONF_TWITTER_SITE_HANDLE = "twitterSiteHandle"; 325f891b7eSNickeau /** 335f891b7eSNickeau * The handle id 345f891b7eSNickeau */ 355f891b7eSNickeau const CONF_TWITTER_SITE_ID = "twitterSiteId"; 365f891b7eSNickeau /** 375f891b7eSNickeau * The image 385f891b7eSNickeau */ 395f891b7eSNickeau const CONF_DEFAULT_TWITTER_IMAGE = "defaultTwitterImage"; 405f891b7eSNickeau 415f891b7eSNickeau /** 425f891b7eSNickeau * Don't track 435f891b7eSNickeau */ 4432b85071SNickeau const CONF_TWITTER_DONT_NOT_TRACK = self::META_DNT; 4532b85071SNickeau const CONF_DONT_NOT_TRACK = self::META_DNT; 465f891b7eSNickeau const CONF_ON = "on"; 475f891b7eSNickeau const CONF_OFF = "off"; 485f891b7eSNickeau 495f891b7eSNickeau /** 505f891b7eSNickeau * The creation ie (combostrap) 515f891b7eSNickeau */ 525f891b7eSNickeau const COMBO_STRAP_TWITTER_HANDLE = "@combostrapweb"; 535f891b7eSNickeau const COMBO_STRAP_TWITTER_ID = "1283330969332842497"; 545f891b7eSNickeau const CANONICAL = "twitter"; 555f891b7eSNickeau 5632b85071SNickeau const META_CARD = "twitter:card"; 5732b85071SNickeau const DEFAULT_IMAGE = ":apple-touch-icon.png"; 5832b85071SNickeau const META_DESCRIPTION = "twitter:description"; 5932b85071SNickeau const META_IMAGE = "twitter:image"; 6032b85071SNickeau const META_TITLE = "twitter:title"; 6132b85071SNickeau const META_CREATOR = "twitter:creator"; 6232b85071SNickeau const META_CREATOR_ID = "twitter:creator:id"; 6332b85071SNickeau const META_SITE = "twitter:site"; 6432b85071SNickeau const META_SITE_ID = "twitter:site:id"; 6532b85071SNickeau const META_IMAGE_ALT = "twitter:image:alt"; 6632b85071SNickeau const META_DNT = "twitter:dnt"; 6732b85071SNickeau const META_WIDGET_CSP = "twitter:widgets:csp"; 6832b85071SNickeau const META_WIDGETS_THEME = "twitter:widgets:theme"; 6932b85071SNickeau const META_WIDGETS_BORDER_COLOR = "twitter:widgets:border-color"; 705f891b7eSNickeau 715f891b7eSNickeau 725f891b7eSNickeau function __construct() 735f891b7eSNickeau { 745f891b7eSNickeau // enable direct access to language strings 755f891b7eSNickeau // ie $this->lang 765f891b7eSNickeau $this->setupLocale(); 775f891b7eSNickeau } 785f891b7eSNickeau 795f891b7eSNickeau public function register(Doku_Event_Handler $controller) 805f891b7eSNickeau { 815f891b7eSNickeau $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'metaTwitterProcessing', array()); 825f891b7eSNickeau } 835f891b7eSNickeau 845f891b7eSNickeau /** 855f891b7eSNickeau * 865f891b7eSNickeau * @param $event 875f891b7eSNickeau */ 885f891b7eSNickeau function metaTwitterProcessing($event) 895f891b7eSNickeau { 905f891b7eSNickeau 915f891b7eSNickeau global $ID; 925f891b7eSNickeau if (empty($ID)) { 935f891b7eSNickeau // $ID is null for media 945f891b7eSNickeau return; 955f891b7eSNickeau } 965f891b7eSNickeau 975f891b7eSNickeau 9885e82846SNickeau $page = Page::createPageFromId($ID); 9921913ab3SNickeau 100f788f694Sgerardnico if (!$page->exists()) { 101dd39a644Sgerardnico return; 102dd39a644Sgerardnico } 10321913ab3SNickeau 1045f891b7eSNickeau /** 1055f891b7eSNickeau * No social for bars 1065f891b7eSNickeau */ 107531e725cSNickeau if ($page->isSlot()) { 1085f891b7eSNickeau return; 1095f891b7eSNickeau } 1105f891b7eSNickeau 1115f891b7eSNickeau 1125f891b7eSNickeau // https://datacadamia.com/marketing/twitter#html_meta 1135f891b7eSNickeau // https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/markup 1145f891b7eSNickeau // https://cards-dev.twitter.com/validator 1155f891b7eSNickeau 116f788f694Sgerardnico 1175f891b7eSNickeau $twitterMeta = array( 11832b85071SNickeau self::META_CARD => "summary", 119*c3437056SNickeau self::META_TITLE => StringUtility::truncateString($page->getTitleOrDefault(), 70), 12032b85071SNickeau self::META_CREATOR => self::COMBO_STRAP_TWITTER_HANDLE, 12132b85071SNickeau self::META_CREATOR_ID => self::COMBO_STRAP_TWITTER_ID 1225f891b7eSNickeau ); 123f788f694Sgerardnico $description = $page->getDescriptionOrElseDokuWiki(); 124f788f694Sgerardnico if (!empty($description)) { 125f788f694Sgerardnico // happens in test with document without content 126f788f694Sgerardnico $twitterMeta[self::META_DESCRIPTION] = StringUtility::truncateString($description, 200); 127f788f694Sgerardnico } 1285f891b7eSNickeau 1295f891b7eSNickeau 1305f891b7eSNickeau /** 1315f891b7eSNickeau * Twitter site 1325f891b7eSNickeau */ 1335f891b7eSNickeau $siteTwitterHandle = PluginUtility::getConfValue(self::CONF_TWITTER_SITE_HANDLE); 1345f891b7eSNickeau $siteTwitterId = PluginUtility::getConfValue(self::CONF_TWITTER_SITE_ID); 1355f891b7eSNickeau if (!empty($siteTwitterHandle)) { 13632b85071SNickeau $twitterMeta[self::META_SITE] = $siteTwitterHandle; 1375f891b7eSNickeau 1385f891b7eSNickeau // Identify the Twitter profile of the page that populates the via property 1395f891b7eSNickeau // https://developer.twitter.com/en/docs/twitter-for-websites/webpage-properties 1405f891b7eSNickeau $name = str_replace("@", "", $siteTwitterHandle); 1415f891b7eSNickeau $event->data['link'][] = array("rel" => "me", "href" => "https://twitter.com/$name"); 1425f891b7eSNickeau } 1435f891b7eSNickeau if (!empty($siteTwitterId)) { 14432b85071SNickeau $twitterMeta[self::META_SITE_ID] = $siteTwitterId; 1455f891b7eSNickeau } 1465f891b7eSNickeau 1475f891b7eSNickeau /** 1485f891b7eSNickeau * Card image 1495f891b7eSNickeau */ 150*c3437056SNickeau $twitterImages = $page->getImagesOrDefaultForTheFollowingUsages([PageImageUsage::TWITTER, PageImageUsage::ALL, PageImageUsage::SOCIAL]); 1515f891b7eSNickeau if (empty($twitterImages)) { 1521fa8c418SNickeau $defaultImageIdConf = PluginUtility::getConfValue(self::CONF_DEFAULT_TWITTER_IMAGE); 1535f891b7eSNickeau if (!empty($defaultImageIdConf)) { 154*c3437056SNickeau $twitterImage = Image::createImageFromId($defaultImageIdConf); 1555f891b7eSNickeau if ($twitterImage->exists()) { 1565f891b7eSNickeau $twitterImages[] = $twitterImage; 1575f891b7eSNickeau } else { 1581fa8c418SNickeau if ($defaultImageIdConf != ":apple-touch-icon.png") { 1595f891b7eSNickeau LogUtility::msg("The default twitter image ($defaultImageIdConf) does not exist", LogUtility::LVL_MSG_ERROR, self::CANONICAL); 1605f891b7eSNickeau } 1615f891b7eSNickeau } 1625f891b7eSNickeau } 1635f891b7eSNickeau 1645f891b7eSNickeau } 1655f891b7eSNickeau if (!empty($twitterImages)) { 1665f891b7eSNickeau foreach ($twitterImages as $twitterImage) { 1675f891b7eSNickeau if ($twitterImage->exists()) { 16821913ab3SNickeau $twitterMeta[self::META_IMAGE] = $twitterImage->getAbsoluteUrl(); 1691fa8c418SNickeau $title = $twitterImage->getAltNotEmpty(); 17021913ab3SNickeau if (!empty($title)) { 17121913ab3SNickeau $twitterMeta[self::META_IMAGE_ALT] = $title; 1725f891b7eSNickeau } 1735f891b7eSNickeau // One image only 1745f891b7eSNickeau break; 1755f891b7eSNickeau } 1765f891b7eSNickeau } 1775f891b7eSNickeau } 1785f891b7eSNickeau 1795f891b7eSNickeau /** 1805f891b7eSNickeau * https://developer.twitter.com/en/docs/twitter-for-websites/webpage-properties 1815f891b7eSNickeau */ 18232b85071SNickeau // don't track 18332b85071SNickeau $twitterMeta[self::META_DNT] = PluginUtility::getConfValue(self::CONF_TWITTER_DONT_NOT_TRACK); 1845f891b7eSNickeau // turn off csp warning 18532b85071SNickeau $twitterMeta[self::META_WIDGET_CSP] = "on"; 1865f891b7eSNickeau 1875f891b7eSNickeau /** 1885f891b7eSNickeau * Embedded Tweet Theme 1895f891b7eSNickeau */ 1905f891b7eSNickeau 19132b85071SNickeau $twitterMeta[self::META_WIDGETS_THEME] = PluginUtility::getConfValue(syntax_plugin_combo_blockquote::CONF_TWEET_WIDGETS_THEME); 19232b85071SNickeau $twitterMeta[self::META_WIDGETS_BORDER_COLOR] = PluginUtility::getConfValue(syntax_plugin_combo_blockquote::CONF_TWEET_WIDGETS_BORDER); 1935f891b7eSNickeau 1945f891b7eSNickeau /** 1955f891b7eSNickeau * Add the properties 1965f891b7eSNickeau */ 1975f891b7eSNickeau foreach ($twitterMeta as $key => $content) { 1985f891b7eSNickeau $event->data['meta'][] = array("name" => $key, "content" => $content); 1995f891b7eSNickeau } 2005f891b7eSNickeau 2015f891b7eSNickeau 2025f891b7eSNickeau } 2035f891b7eSNickeau 2045f891b7eSNickeau} 205