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