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