1*5f891b7eSNickeau<?php 2*5f891b7eSNickeau 3*5f891b7eSNickeauuse ComboStrap\Image; 4*5f891b7eSNickeauuse ComboStrap\LogUtility; 5*5f891b7eSNickeauuse ComboStrap\MetadataUtility; 6*5f891b7eSNickeauuse ComboStrap\PluginUtility; 7*5f891b7eSNickeauuse ComboStrap\Page; 8*5f891b7eSNickeauuse ComboStrap\Site; 9*5f891b7eSNickeauuse ComboStrap\StringUtility; 10*5f891b7eSNickeau 11*5f891b7eSNickeauif (!defined('DOKU_INC')) die(); 12*5f891b7eSNickeau 13*5f891b7eSNickeaurequire_once(__DIR__ . '/../class/Site.php'); 14*5f891b7eSNickeau 15*5f891b7eSNickeau/** 16*5f891b7eSNickeau * 17*5f891b7eSNickeau * For the canonical meta, see {@link action_plugin_combo_metacanonical} 18*5f891b7eSNickeau * https://github.com/twbs/bootstrap/blob/v4-dev/site/layouts/partials/social.html 19*5f891b7eSNickeau * 20*5f891b7eSNickeau * TODO: https://developer.twitter.com/en/docs/twitter-for-websites/embedded-tweets/overview 21*5f891b7eSNickeau */ 22*5f891b7eSNickeauclass action_plugin_combo_metatwitter extends DokuWiki_Action_Plugin 23*5f891b7eSNickeau{ 24*5f891b7eSNickeau 25*5f891b7eSNickeau 26*5f891b7eSNickeau /** 27*5f891b7eSNickeau * The handle name 28*5f891b7eSNickeau */ 29*5f891b7eSNickeau const CONF_TWITTER_SITE_HANDLE = "twitterSiteHandle"; 30*5f891b7eSNickeau /** 31*5f891b7eSNickeau * The handle id 32*5f891b7eSNickeau */ 33*5f891b7eSNickeau const CONF_TWITTER_SITE_ID = "twitterSiteId"; 34*5f891b7eSNickeau /** 35*5f891b7eSNickeau * The image 36*5f891b7eSNickeau */ 37*5f891b7eSNickeau const CONF_DEFAULT_TWITTER_IMAGE = "defaultTwitterImage"; 38*5f891b7eSNickeau 39*5f891b7eSNickeau /** 40*5f891b7eSNickeau * Don't track 41*5f891b7eSNickeau */ 42*5f891b7eSNickeau const CONF_TWITTER_DONT_NOT_TRACK = "twitter:dnt"; 43*5f891b7eSNickeau const CONF_DONT_NOT_TRACK = "twitter:dnt"; 44*5f891b7eSNickeau const CONF_ON = "on"; 45*5f891b7eSNickeau const CONF_OFF = "off"; 46*5f891b7eSNickeau 47*5f891b7eSNickeau /** 48*5f891b7eSNickeau * The creation ie (combostrap) 49*5f891b7eSNickeau */ 50*5f891b7eSNickeau const COMBO_STRAP_TWITTER_HANDLE = "@combostrapweb"; 51*5f891b7eSNickeau const COMBO_STRAP_TWITTER_ID = "1283330969332842497"; 52*5f891b7eSNickeau const CANONICAL = "twitter"; 53*5f891b7eSNickeau 54*5f891b7eSNickeau 55*5f891b7eSNickeau 56*5f891b7eSNickeau function __construct() 57*5f891b7eSNickeau { 58*5f891b7eSNickeau // enable direct access to language strings 59*5f891b7eSNickeau // ie $this->lang 60*5f891b7eSNickeau $this->setupLocale(); 61*5f891b7eSNickeau } 62*5f891b7eSNickeau 63*5f891b7eSNickeau public function register(Doku_Event_Handler $controller) 64*5f891b7eSNickeau { 65*5f891b7eSNickeau $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'metaTwitterProcessing', array()); 66*5f891b7eSNickeau } 67*5f891b7eSNickeau 68*5f891b7eSNickeau /** 69*5f891b7eSNickeau * 70*5f891b7eSNickeau * @param $event 71*5f891b7eSNickeau */ 72*5f891b7eSNickeau function metaTwitterProcessing($event) 73*5f891b7eSNickeau { 74*5f891b7eSNickeau 75*5f891b7eSNickeau global $ID; 76*5f891b7eSNickeau if (empty($ID)) { 77*5f891b7eSNickeau // $ID is null for media 78*5f891b7eSNickeau return; 79*5f891b7eSNickeau } 80*5f891b7eSNickeau 81*5f891b7eSNickeau 82*5f891b7eSNickeau $page = new Page($ID); 83*5f891b7eSNickeau 84*5f891b7eSNickeau /** 85*5f891b7eSNickeau * No social for bars 86*5f891b7eSNickeau */ 87*5f891b7eSNickeau if ($page->isBar()) { 88*5f891b7eSNickeau return; 89*5f891b7eSNickeau } 90*5f891b7eSNickeau 91*5f891b7eSNickeau 92*5f891b7eSNickeau // https://datacadamia.com/marketing/twitter#html_meta 93*5f891b7eSNickeau // https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/markup 94*5f891b7eSNickeau // https://cards-dev.twitter.com/validator 95*5f891b7eSNickeau 96*5f891b7eSNickeau $twitterMeta = array( 97*5f891b7eSNickeau "twitter:card" => "summary", 98*5f891b7eSNickeau "twitter:title" => StringUtility::truncateString($page->getTitleNotEmpty(), 70), 99*5f891b7eSNickeau "twitter:description" => StringUtility::truncateString($page->getDescription(), 200), 100*5f891b7eSNickeau "twitter:creator" => self::COMBO_STRAP_TWITTER_HANDLE, 101*5f891b7eSNickeau "twitter:creator:id" => self::COMBO_STRAP_TWITTER_ID 102*5f891b7eSNickeau ); 103*5f891b7eSNickeau 104*5f891b7eSNickeau 105*5f891b7eSNickeau /** 106*5f891b7eSNickeau * Twitter site 107*5f891b7eSNickeau */ 108*5f891b7eSNickeau $siteTwitterHandle = PluginUtility::getConfValue(self::CONF_TWITTER_SITE_HANDLE); 109*5f891b7eSNickeau $siteTwitterId = PluginUtility::getConfValue(self::CONF_TWITTER_SITE_ID); 110*5f891b7eSNickeau if (!empty($siteTwitterHandle)) { 111*5f891b7eSNickeau $twitterMeta["twitter:site"] = $siteTwitterHandle; 112*5f891b7eSNickeau 113*5f891b7eSNickeau // Identify the Twitter profile of the page that populates the via property 114*5f891b7eSNickeau // https://developer.twitter.com/en/docs/twitter-for-websites/webpage-properties 115*5f891b7eSNickeau $name = str_replace("@","",$siteTwitterHandle); 116*5f891b7eSNickeau $event->data['link'][] = array("rel" => "me", "href" => "https://twitter.com/$name"); 117*5f891b7eSNickeau } 118*5f891b7eSNickeau if (!empty($siteTwitterId)) { 119*5f891b7eSNickeau $twitterMeta["twitter:site:id"] = $siteTwitterId; 120*5f891b7eSNickeau } 121*5f891b7eSNickeau 122*5f891b7eSNickeau /** 123*5f891b7eSNickeau * Card image 124*5f891b7eSNickeau */ 125*5f891b7eSNickeau $twitterImages = $page->getImageSet(); 126*5f891b7eSNickeau if (empty($twitterImages)) { 127*5f891b7eSNickeau $defaultImageIdConf = cleanID(PluginUtility::getConfValue(self::CONF_DEFAULT_TWITTER_IMAGE)); 128*5f891b7eSNickeau if (!empty($defaultImageIdConf)) { 129*5f891b7eSNickeau $twitterImage = new Image($defaultImageIdConf); 130*5f891b7eSNickeau if ($twitterImage->exists()) { 131*5f891b7eSNickeau $twitterImages[] = $twitterImage; 132*5f891b7eSNickeau } else { 133*5f891b7eSNickeau if ($defaultImageIdConf != "apple-touch-icon.png") { 134*5f891b7eSNickeau LogUtility::msg("The default twitter image ($defaultImageIdConf) does not exist", LogUtility::LVL_MSG_ERROR, self::CANONICAL); 135*5f891b7eSNickeau } 136*5f891b7eSNickeau } 137*5f891b7eSNickeau } 138*5f891b7eSNickeau 139*5f891b7eSNickeau } 140*5f891b7eSNickeau if (!empty($twitterImages)) { 141*5f891b7eSNickeau foreach ($twitterImages as $twitterImage) { 142*5f891b7eSNickeau if ($twitterImage->exists()) { 143*5f891b7eSNickeau $twitterMeta["twitter:image"] = $twitterImage->getUrl(); 144*5f891b7eSNickeau if (!empty($twitterImage->getAlt())) { 145*5f891b7eSNickeau $twitterMeta["twitter:image:alt"] = $twitterImage->getAlt(); 146*5f891b7eSNickeau } 147*5f891b7eSNickeau // One image only 148*5f891b7eSNickeau break; 149*5f891b7eSNickeau } 150*5f891b7eSNickeau } 151*5f891b7eSNickeau } 152*5f891b7eSNickeau 153*5f891b7eSNickeau /** 154*5f891b7eSNickeau * https://developer.twitter.com/en/docs/twitter-for-websites/webpage-properties 155*5f891b7eSNickeau */ 156*5f891b7eSNickeau // don;t track 157*5f891b7eSNickeau $twitterMeta["twitter:dnt"]=PluginUtility::getConfValue(self::CONF_TWITTER_DONT_NOT_TRACK); 158*5f891b7eSNickeau // turn off csp warning 159*5f891b7eSNickeau $twitterMeta["twitter:widgets:csp"]="on"; 160*5f891b7eSNickeau 161*5f891b7eSNickeau /** 162*5f891b7eSNickeau * Embedded Tweet Theme 163*5f891b7eSNickeau */ 164*5f891b7eSNickeau 165*5f891b7eSNickeau $twitterMeta["twitter:widgets:theme"]=PluginUtility::getConfValue(syntax_plugin_combo_blockquote::CONF_TWEET_WIDGETS_THEME); 166*5f891b7eSNickeau $twitterMeta["twitter:widgets:border-color"]=PluginUtility::getConfValue(syntax_plugin_combo_blockquote::CONF_TWEET_WIDGETS_BORDER); 167*5f891b7eSNickeau 168*5f891b7eSNickeau /** 169*5f891b7eSNickeau * Add the properties 170*5f891b7eSNickeau */ 171*5f891b7eSNickeau foreach ($twitterMeta as $key => $content) { 172*5f891b7eSNickeau $event->data['meta'][] = array("name" => $key, "content" => $content); 173*5f891b7eSNickeau } 174*5f891b7eSNickeau 175*5f891b7eSNickeau 176*5f891b7eSNickeau 177*5f891b7eSNickeau } 178*5f891b7eSNickeau 179*5f891b7eSNickeau} 180