xref: /plugin/combo/ComboStrap/Tag/AdTag.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau/**
3*04fd306cSNickeau * Copyright (c) 2020. ComboStrap, Inc. and its affiliates. All Rights Reserved.
4*04fd306cSNickeau *
5*04fd306cSNickeau * This source code is licensed under the GPL license found in the
6*04fd306cSNickeau * COPYING  file in the root directory of this source tree.
7*04fd306cSNickeau *
8*04fd306cSNickeau * @license  GPL 3 (https://www.gnu.org/licenses/gpl-3.0.en.html)
9*04fd306cSNickeau * @author   ComboStrap <support@combostrap.com>
10*04fd306cSNickeau *
11*04fd306cSNickeau */
12*04fd306cSNickeau
13*04fd306cSNickeaunamespace ComboStrap\Tag;
14*04fd306cSNickeau
15*04fd306cSNickeau
16*04fd306cSNickeauuse ComboStrap\ColorRgb;
17*04fd306cSNickeauuse ComboStrap\Dimension;
18*04fd306cSNickeauuse ComboStrap\ExceptionBadArgument;
19*04fd306cSNickeauuse ComboStrap\ExceptionCompile;
20*04fd306cSNickeauuse ComboStrap\ExecutionContext;
21*04fd306cSNickeauuse ComboStrap\LogUtility;
22*04fd306cSNickeauuse ComboStrap\MarkupPath;
23*04fd306cSNickeauuse ComboStrap\MarkupRenderUtility;
24*04fd306cSNickeauuse ComboStrap\PluginUtility;
25*04fd306cSNickeauuse ComboStrap\SiteConfig;
26*04fd306cSNickeauuse ComboStrap\Spacing;
27*04fd306cSNickeauuse ComboStrap\TagAttribute\Align;
28*04fd306cSNickeauuse ComboStrap\TagAttributes;
29*04fd306cSNickeau
30*04fd306cSNickeau/**
31*04fd306cSNickeau * Class AdsUtility
32*04fd306cSNickeau * @package ComboStrap
33*04fd306cSNickeau *
34*04fd306cSNickeau * TODO: Injection: Words Between Ads (https://wpadvancedads.com/manual/minimum-amount-of-words-between-ads/)
35*04fd306cSNickeau */
36*04fd306cSNickeauclass AdTag
37*04fd306cSNickeau{
38*04fd306cSNickeau
39*04fd306cSNickeau    const CONF_ADS_MIN_LOCAL_LINE_DEFAULT = 2;
40*04fd306cSNickeau    const CONF_ADS_MIN_LOCAL_LINE_KEY = '"AdsMinLocalLine"';
41*04fd306cSNickeau    const CONF_ADS_LINE_BETWEEN_DEFAULT = 13;
42*04fd306cSNickeau    const CONF_ADS_LINE_BETWEEN_KEY = 'AdsLineBetween';
43*04fd306cSNickeau    const CONF_ADS_MIN_SECTION_NUMBER_DEFAULT = 2;
44*04fd306cSNickeau    const CONF_ADS_MIN_SECTION_KEY = 'AdsMinSectionNumber';
45*04fd306cSNickeau
46*04fd306cSNickeau
47*04fd306cSNickeau    const ADS_NAMESPACE = ':combostrap:ads:';
48*04fd306cSNickeau
49*04fd306cSNickeau    /**
50*04fd306cSNickeau     * All in-article should start with this prefix
51*04fd306cSNickeau     */
52*04fd306cSNickeau    const PREFIX_IN_ARTICLE_ADS = "inarticle";
53*04fd306cSNickeau
54*04fd306cSNickeau    /**
55*04fd306cSNickeau     * Do we show a placeholder when there is no ad page
56*04fd306cSNickeau     * for a in-article
57*04fd306cSNickeau     */
58*04fd306cSNickeau    const CONF_IN_ARTICLE_PLACEHOLDER = 'AdsInArticleShowPlaceholder';
59*04fd306cSNickeau    const CONF_IN_ARTICLE_PLACEHOLDER_DEFAULT = 0;
60*04fd306cSNickeau    const MARKUP = "ad";
61*04fd306cSNickeau    const NAME_ATTRIBUTE = "name";
62*04fd306cSNickeau    const CONF_IN_ARTICLE_ENABLED = "combo-conf-007" ;
63*04fd306cSNickeau    const CONF_IN_ARTICLE_ENABLED_DEFAULT = 0;
64*04fd306cSNickeau
65*04fd306cSNickeau    const CANONICAL = "ad";
66*04fd306cSNickeau
67*04fd306cSNickeau    public static function showAds($sectionLineCount, $currentLineCountSinceLastAd, $sectionNumber, $adsCounter, $isLastSection, ?MarkupPath $markupPath): bool
68*04fd306cSNickeau    {
69*04fd306cSNickeau        $isHiddenPage = false;
70*04fd306cSNickeau        if ($markupPath !== null) {
71*04fd306cSNickeau            try {
72*04fd306cSNickeau                $isHiddenPage = isHiddenPage($markupPath->getWikiId());
73*04fd306cSNickeau            } catch (ExceptionBadArgument $e) {
74*04fd306cSNickeau                //
75*04fd306cSNickeau            }
76*04fd306cSNickeau        }
77*04fd306cSNickeau        global $ACT;
78*04fd306cSNickeau        if (
79*04fd306cSNickeau            $ACT !== ExecutionContext::ADMIN_ACTION && // Not in the admin page
80*04fd306cSNickeau            $isHiddenPage === false &&// No ads on hidden pages
81*04fd306cSNickeau            (
82*04fd306cSNickeau                (
83*04fd306cSNickeau                    $sectionLineCount > self::CONF_ADS_MIN_LOCAL_LINE_DEFAULT && // Doesn't show any ad if the section does not contains this minimum number of line
84*04fd306cSNickeau                    $currentLineCountSinceLastAd > self::CONF_ADS_LINE_BETWEEN_DEFAULT && // Every N line,
85*04fd306cSNickeau                    $sectionNumber > self::CONF_ADS_MIN_SECTION_NUMBER_DEFAULT // Doesn't show any ad before
86*04fd306cSNickeau                )
87*04fd306cSNickeau                or
88*04fd306cSNickeau                // Show always an ad after a number of section
89*04fd306cSNickeau                (
90*04fd306cSNickeau                    $adsCounter == 0 && // Still no ads
91*04fd306cSNickeau                    $sectionNumber > self::CONF_ADS_MIN_SECTION_NUMBER_DEFAULT && // Above the minimum number of section
92*04fd306cSNickeau                    $sectionLineCount > self::CONF_ADS_MIN_LOCAL_LINE_DEFAULT // Minimum line in the current section (to avoid a pub below a header)
93*04fd306cSNickeau                )
94*04fd306cSNickeau                or
95*04fd306cSNickeau                // Sometimes the last section (reference) has not so much line and it avoids to show an ads at the end
96*04fd306cSNickeau                // even if the number of line (space) was enough
97*04fd306cSNickeau                (
98*04fd306cSNickeau                    $isLastSection && // The last section
99*04fd306cSNickeau                    $currentLineCountSinceLastAd > self::CONF_ADS_LINE_BETWEEN_DEFAULT  // Every N line,
100*04fd306cSNickeau                )
101*04fd306cSNickeau            )) {
102*04fd306cSNickeau            return true;
103*04fd306cSNickeau        } else {
104*04fd306cSNickeau            return false;
105*04fd306cSNickeau        }
106*04fd306cSNickeau    }
107*04fd306cSNickeau
108*04fd306cSNickeau    public static function showPlaceHolder()
109*04fd306cSNickeau    {
110*04fd306cSNickeau        return SiteConfig::getConfValue(self::CONF_IN_ARTICLE_PLACEHOLDER, self::CONF_IN_ARTICLE_PLACEHOLDER_DEFAULT);
111*04fd306cSNickeau    }
112*04fd306cSNickeau
113*04fd306cSNickeau    /**
114*04fd306cSNickeau     * Return the full page location
115*04fd306cSNickeau     * @param $name
116*04fd306cSNickeau     * @return string
117*04fd306cSNickeau     */
118*04fd306cSNickeau    public static function getAdPage($name): string
119*04fd306cSNickeau    {
120*04fd306cSNickeau        return strtolower(self::ADS_NAMESPACE . $name);
121*04fd306cSNickeau    }
122*04fd306cSNickeau
123*04fd306cSNickeau    /**
124*04fd306cSNickeau     * Return the id of the div that wrap the ad
125*04fd306cSNickeau     * @param $name - the name of the page ad
126*04fd306cSNickeau     * @return string|string[]
127*04fd306cSNickeau     */
128*04fd306cSNickeau    public static function getTagId($name)
129*04fd306cSNickeau    {
130*04fd306cSNickeau        return str_replace(":", "-", substr(self::getAdPage($name), 1));
131*04fd306cSNickeau    }
132*04fd306cSNickeau
133*04fd306cSNickeau    public static function render(TagAttributes $attributes): string
134*04fd306cSNickeau    {
135*04fd306cSNickeau
136*04fd306cSNickeau        $name = $attributes->getValueAndRemoveIfPresent(self::NAME_ATTRIBUTE);
137*04fd306cSNickeau        if ($name === null) {
138*04fd306cSNickeau            return LogUtility::wrapInRedForHtml("Internal error: the name attribute is mandatory to render an ad");
139*04fd306cSNickeau        }
140*04fd306cSNickeau
141*04fd306cSNickeau        $attributes->setId(AdTag::getTagId($name));
142*04fd306cSNickeau
143*04fd306cSNickeau        $adsPageId = AdTag::getAdPage($name);
144*04fd306cSNickeau        if (!page_exists($adsPageId)) {
145*04fd306cSNickeau
146*04fd306cSNickeau            if (AdTag::showPlaceHolder()) {
147*04fd306cSNickeau
148*04fd306cSNickeau
149*04fd306cSNickeau                $link = PluginUtility::getDocumentationHyperLink("automatic/in-article/ad#AdsInArticleShowPlaceholder", "In-article placeholder");
150*04fd306cSNickeau                $htmlAttributes = $attributes
151*04fd306cSNickeau                    ->setComponentAttributeValue(ColorRgb::COLOR, "dark")
152*04fd306cSNickeau                    ->setComponentAttributeValue(Spacing::SPACING_ATTRIBUTE, "m-3 p-3")
153*04fd306cSNickeau                    ->setComponentAttributeValue(Align::ALIGN_ATTRIBUTE, "center text-align")
154*04fd306cSNickeau                    ->setComponentAttributeValue(Dimension::WIDTH_KEY, "600")
155*04fd306cSNickeau                    ->setComponentAttributeValue("border-color", "dark")
156*04fd306cSNickeau                    ->toHTMLAttributeString();
157*04fd306cSNickeau                return <<<EOF
158*04fd306cSNickeau<div $htmlAttributes>
159*04fd306cSNickeauAds Page Id ($adsPageId ) not found. <br>
160*04fd306cSNickeauShowing the $link<br>
161*04fd306cSNickeau</div>
162*04fd306cSNickeauEOF;
163*04fd306cSNickeau
164*04fd306cSNickeau            }
165*04fd306cSNickeau
166*04fd306cSNickeau            return LogUtility::wrapInRedForHtml("The ad page (" . $adsPageId . ") does not exist");
167*04fd306cSNickeau
168*04fd306cSNickeau
169*04fd306cSNickeau        }
170*04fd306cSNickeau
171*04fd306cSNickeau        try {
172*04fd306cSNickeau            $content = MarkupRenderUtility::renderId2Xhtml($adsPageId);
173*04fd306cSNickeau        } catch (ExceptionCompile $e) {
174*04fd306cSNickeau            return LogUtility::wrapInRedForHtml("Error: " . $e->getMessage());
175*04fd306cSNickeau        }
176*04fd306cSNickeau
177*04fd306cSNickeau        /**
178*04fd306cSNickeau         * We wrap the ad with a div to locate it and id it
179*04fd306cSNickeau         */
180*04fd306cSNickeau        $htmlAttributesString = $attributes
181*04fd306cSNickeau            ->toHTMLAttributeString();
182*04fd306cSNickeau
183*04fd306cSNickeau        return <<<EOF
184*04fd306cSNickeau<div $htmlAttributesString>
185*04fd306cSNickeau$content
186*04fd306cSNickeau</div>
187*04fd306cSNickeauEOF;
188*04fd306cSNickeau
189*04fd306cSNickeau    }
190*04fd306cSNickeau}
191