xref: /template/strap/action/metatwitter.php (revision c3437056399326d621a01da73b649707fbb0ae69)
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