xref: /template/strap/action/metatwitter.php (revision 1fa8c418ed5809db58049141be41b7738471dd32)
1<?php
2
3use ComboStrap\Image;
4use ComboStrap\MediaLink;
5use ComboStrap\LogUtility;
6use ComboStrap\Page;
7use ComboStrap\PluginUtility;
8use ComboStrap\StringUtility;
9use ComboStrap\TagAttributes;
10
11if (!defined('DOKU_INC')) die();
12
13require_once(__DIR__ . '/../ComboStrap/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 = Page::createPageFromId($ID);
97
98        if(!$page->exists()){
99            return;
100        }
101
102        /**
103         * No social for bars
104         */
105        if ($page->isSlot()) {
106            return;
107        }
108
109
110        // https://datacadamia.com/marketing/twitter#html_meta
111        // https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/markup
112        // https://cards-dev.twitter.com/validator
113
114
115        $twitterMeta = array(
116            self::META_CARD => "summary",
117            self::META_TITLE => StringUtility::truncateString($page->getTitleNotEmpty(), 70),
118            self::META_CREATOR => self::COMBO_STRAP_TWITTER_HANDLE,
119            self::META_CREATOR_ID => self::COMBO_STRAP_TWITTER_ID
120        );
121        $description = $page->getDescriptionOrElseDokuWiki();
122        if (!empty($description)){
123            // happens in test with document without content
124            $twitterMeta[self::META_DESCRIPTION] = StringUtility::truncateString($description, 200);
125        }
126
127
128        /**
129         * Twitter site
130         */
131        $siteTwitterHandle = PluginUtility::getConfValue(self::CONF_TWITTER_SITE_HANDLE);
132        $siteTwitterId = PluginUtility::getConfValue(self::CONF_TWITTER_SITE_ID);
133        if (!empty($siteTwitterHandle)) {
134            $twitterMeta[self::META_SITE] = $siteTwitterHandle;
135
136            // Identify the Twitter profile of the page that populates the via property
137            // https://developer.twitter.com/en/docs/twitter-for-websites/webpage-properties
138            $name = str_replace("@","",$siteTwitterHandle);
139            $event->data['link'][] = array("rel" => "me", "href" => "https://twitter.com/$name");
140        }
141        if (!empty($siteTwitterId)) {
142            $twitterMeta[self::META_SITE_ID] = $siteTwitterId;
143        }
144
145        /**
146         * Card image
147         */
148        $twitterImages = $page->getLocalImageSet();
149        if (empty($twitterImages)) {
150            $defaultImageIdConf = PluginUtility::getConfValue(self::CONF_DEFAULT_TWITTER_IMAGE);
151            if (!empty($defaultImageIdConf)) {
152                $twitterImage = Image::createImageFromAbsolutePath($defaultImageIdConf);
153                if ($twitterImage->exists()) {
154                    $twitterImages[] = $twitterImage;
155                } else {
156                    if ($defaultImageIdConf != ":apple-touch-icon.png") {
157                        LogUtility::msg("The default twitter image ($defaultImageIdConf) does not exist", LogUtility::LVL_MSG_ERROR, self::CANONICAL);
158                    }
159                }
160            }
161
162        }
163        if (!empty($twitterImages)) {
164            foreach ($twitterImages as $twitterImage) {
165                if ($twitterImage->exists()) {
166                    $twitterMeta[self::META_IMAGE] = $twitterImage->getAbsoluteUrl();
167                    $title = $twitterImage->getAltNotEmpty();
168                    if (!empty($title)) {
169                        $twitterMeta[self::META_IMAGE_ALT] = $title;
170                    }
171                    // One image only
172                    break;
173                }
174            }
175        }
176
177        /**
178         * https://developer.twitter.com/en/docs/twitter-for-websites/webpage-properties
179         */
180        // don't track
181        $twitterMeta[self::META_DNT]=PluginUtility::getConfValue(self::CONF_TWITTER_DONT_NOT_TRACK);
182        // turn off csp warning
183        $twitterMeta[self::META_WIDGET_CSP]="on";
184
185        /**
186         * Embedded Tweet Theme
187         */
188
189        $twitterMeta[self::META_WIDGETS_THEME]=PluginUtility::getConfValue(syntax_plugin_combo_blockquote::CONF_TWEET_WIDGETS_THEME);
190        $twitterMeta[self::META_WIDGETS_BORDER_COLOR]=PluginUtility::getConfValue(syntax_plugin_combo_blockquote::CONF_TWEET_WIDGETS_BORDER);
191
192        /**
193         * Add the properties
194         */
195        foreach ($twitterMeta as $key => $content) {
196            $event->data['meta'][] = array("name" => $key, "content" => $content);
197        }
198
199
200
201    }
202
203}
204