xref: /template/strap/ComboStrap/Site.php (revision c3437056399326d621a01da73b649707fbb0ae69)
137748cd8SNickeau<?php
237748cd8SNickeau/**
337748cd8SNickeau * Copyright (c) 2021. ComboStrap, Inc. and its affiliates. All Rights Reserved.
437748cd8SNickeau *
537748cd8SNickeau * This source code is licensed under the GPL license found in the
637748cd8SNickeau * COPYING  file in the root directory of this source tree.
737748cd8SNickeau *
837748cd8SNickeau * @license  GPL 3 (https://www.gnu.org/licenses/gpl-3.0.en.html)
937748cd8SNickeau * @author   ComboStrap <support@combostrap.com>
1037748cd8SNickeau *
1137748cd8SNickeau */
1237748cd8SNickeau
1337748cd8SNickeaunamespace ComboStrap;
1437748cd8SNickeau
1537748cd8SNickeau
16*c3437056SNickeauuse RuntimeException;
17*c3437056SNickeau
1837748cd8SNickeauclass Site
1937748cd8SNickeau{
2037748cd8SNickeau
2137748cd8SNickeau    const STRAP_TEMPLATE_NAME = "strap";
2237748cd8SNickeau
2337748cd8SNickeau    const SVG_LOGO_IDS = array(
2437748cd8SNickeau        ':wiki:logo.svg',
2537748cd8SNickeau        ':logo.svg'
2637748cd8SNickeau    );
2737748cd8SNickeau
2837748cd8SNickeau    const PNG_LOGO_IDS = array(
2937748cd8SNickeau        ':logo.png',
3037748cd8SNickeau        ':wiki:logo.png',
3137748cd8SNickeau        ':favicon-32×32.png',
3237748cd8SNickeau        ':favicon-16×16.png',
3337748cd8SNickeau        ':apple-touch-icon.png',
3437748cd8SNickeau        ':android-chrome-192x192.png'
3537748cd8SNickeau    );
3637748cd8SNickeau
3737748cd8SNickeau
3837748cd8SNickeau    /**
3937748cd8SNickeau     * @return string|null the html img tag or null
4037748cd8SNickeau     */
411fa8c418SNickeau    public static function getLogoImgHtmlTag($tagAttributes = null): ?string
4237748cd8SNickeau    {
4337748cd8SNickeau        $logoIds = self::getLogoIds();
4437748cd8SNickeau        foreach ($logoIds as $logoId) {
451fa8c418SNickeau            if ($logoId->exists()) {
46*c3437056SNickeau                $mediaLink = MediaLink::createMediaLinkFromPath($logoId->getPath(), $tagAttributes)
47*c3437056SNickeau                    ->setLazyLoad(false);
4837748cd8SNickeau                return $mediaLink->renderMediaTag();
4937748cd8SNickeau            }
5037748cd8SNickeau        }
5137748cd8SNickeau        return null;
5237748cd8SNickeau    }
5337748cd8SNickeau
541fa8c418SNickeau    /**
551fa8c418SNickeau     * @return Image[]
561fa8c418SNickeau     */
571fa8c418SNickeau    private static function getLogoIds(): array
5837748cd8SNickeau    {
591fa8c418SNickeau        $logosPaths = PluginUtility::mergeAttributes(self::PNG_LOGO_IDS, self::SVG_LOGO_IDS);
601fa8c418SNickeau        $logos = [];
611fa8c418SNickeau        foreach ($logosPaths as $logoPath) {
62*c3437056SNickeau            $dokuPath = DokuPath::createMediaPathFromId($logoPath);
63*c3437056SNickeau            $logos[] = Image::createImageFromPath($dokuPath);
641fa8c418SNickeau        }
651fa8c418SNickeau        return $logos;
6637748cd8SNickeau    }
6737748cd8SNickeau
6837748cd8SNickeau
6937748cd8SNickeau    /**
7037748cd8SNickeau     * @return string|null
7137748cd8SNickeau     */
7237748cd8SNickeau    public static function getLogoUrlAsSvg()
7337748cd8SNickeau    {
7437748cd8SNickeau
7537748cd8SNickeau
7637748cd8SNickeau        $url = null;
7737748cd8SNickeau        foreach (self::SVG_LOGO_IDS as $svgLogo) {
7837748cd8SNickeau
7937748cd8SNickeau            $svgLogoFN = mediaFN($svgLogo);
8037748cd8SNickeau
8137748cd8SNickeau            if (file_exists($svgLogoFN)) {
8237748cd8SNickeau                $url = ml($svgLogo, '', true, '', true);
8337748cd8SNickeau                break;
8437748cd8SNickeau            };
8537748cd8SNickeau        }
8637748cd8SNickeau        return $url;
8737748cd8SNickeau    }
8837748cd8SNickeau
8937748cd8SNickeau    public static function getLogoUrlAsPng()
9037748cd8SNickeau    {
9137748cd8SNickeau
9237748cd8SNickeau        $url = null;
9337748cd8SNickeau        foreach (self::PNG_LOGO_IDS as $svgLogo) {
9437748cd8SNickeau
9537748cd8SNickeau            $svgLogoFN = mediaFN($svgLogo);
9637748cd8SNickeau
9737748cd8SNickeau            if (file_exists($svgLogoFN)) {
9837748cd8SNickeau                $url = ml($svgLogo, '', true, '', true);
9937748cd8SNickeau                break;
10037748cd8SNickeau            };
10137748cd8SNickeau        }
10237748cd8SNickeau        return $url;
10337748cd8SNickeau    }
10437748cd8SNickeau
10537748cd8SNickeau    /**
10637748cd8SNickeau     * https://www.dokuwiki.org/config:title
10737748cd8SNickeau     * @return mixed
10837748cd8SNickeau     */
10937748cd8SNickeau    public static function getTitle()
11037748cd8SNickeau    {
11137748cd8SNickeau        global $conf;
11237748cd8SNickeau        return $conf['title'];
11337748cd8SNickeau    }
11437748cd8SNickeau
11537748cd8SNickeau    /**
11637748cd8SNickeau     * @param string $sep - the separator - generally ("-") but not always
11737748cd8SNickeau     * @return string
11837748cd8SNickeau     *
11937748cd8SNickeau     * Locale always canonicalizes to upper case.
12037748cd8SNickeau     */
121*c3437056SNickeau    public static function getLocale(string $sep = "-"): ?string
12237748cd8SNickeau    {
12337748cd8SNickeau
12437748cd8SNickeau        $locale = null;
12537748cd8SNickeau
12637748cd8SNickeau        $lang = self::getLang();
12737748cd8SNickeau        if ($lang != null) {
128*c3437056SNickeau            $country = self::getLanguageRegion();
12937748cd8SNickeau            if ($country != null) {
13037748cd8SNickeau                $locale = strtolower($lang) . $sep . strtoupper($country);
13137748cd8SNickeau            }
13237748cd8SNickeau        }
13337748cd8SNickeau
13437748cd8SNickeau        return $locale;
13537748cd8SNickeau    }
13637748cd8SNickeau
13737748cd8SNickeau    /**
13837748cd8SNickeau     *
13937748cd8SNickeau     * ISO 3166 alpha-2 country code
14037748cd8SNickeau     *
14137748cd8SNickeau     */
142*c3437056SNickeau    public static function getLanguageRegion()
14337748cd8SNickeau    {
144*c3437056SNickeau        $region = PluginUtility::getConfValue(Region::CONF_SITE_LANGUAGE_REGION);
145*c3437056SNickeau        if (!empty($region)) {
146*c3437056SNickeau            return $region;
14737748cd8SNickeau        } else {
148*c3437056SNickeau
149*c3437056SNickeau            if (extension_loaded("intl")) {
150*c3437056SNickeau                $locale = locale_get_default();
151*c3437056SNickeau                $localeParts = preg_split("/_/", $locale, 2);
152*c3437056SNickeau                if (sizeof($localeParts) === 2) {
153*c3437056SNickeau                    return $localeParts[1];
154*c3437056SNickeau                }
155*c3437056SNickeau            }
156*c3437056SNickeau
15737748cd8SNickeau            return null;
15837748cd8SNickeau        }
15937748cd8SNickeau
16037748cd8SNickeau    }
16137748cd8SNickeau
16237748cd8SNickeau    /**
16337748cd8SNickeau     * @return mixed|null
16437748cd8SNickeau     * Wrapper around  https://www.dokuwiki.org/config:lang
16537748cd8SNickeau     */
166*c3437056SNickeau    public static function getLang()
16737748cd8SNickeau    {
16837748cd8SNickeau
16937748cd8SNickeau        global $conf;
170*c3437056SNickeau        $lang = $conf['lang'];
171*c3437056SNickeau        return ($lang ?: null);
17237748cd8SNickeau    }
17337748cd8SNickeau
174*c3437056SNickeau    public static function getBaseUrl(): string
17537748cd8SNickeau    {
17637748cd8SNickeau
17737748cd8SNickeau        /**
17837748cd8SNickeau         * In a {@link PluginUtility::isDevOrTest()} dev environment,
17937748cd8SNickeau         * don't set the
18037748cd8SNickeau         * https://www.dokuwiki.org/config:baseurl
18137748cd8SNickeau         * to be able to test the metadata / social integration
18237748cd8SNickeau         * via a tunnel
183*c3437056SNickeau         *
184*c3437056SNickeau         * Same as {@link getBaseURL()} ??
18537748cd8SNickeau         */
18637748cd8SNickeau
18737748cd8SNickeau        return DOKU_URL;
18837748cd8SNickeau
18937748cd8SNickeau    }
19037748cd8SNickeau
19137748cd8SNickeau    public static function getTag()
19237748cd8SNickeau    {
19337748cd8SNickeau        global $conf;
19437748cd8SNickeau        $tag = $conf['tag'];
19537748cd8SNickeau        return ($tag ? $tag : null);
19637748cd8SNickeau    }
19737748cd8SNickeau
19837748cd8SNickeau    /**
19937748cd8SNickeau     * @return string - the name of the sidebar page
20037748cd8SNickeau     */
20137748cd8SNickeau    public static function getSidebarName()
20237748cd8SNickeau    {
20337748cd8SNickeau        global $conf;
20437748cd8SNickeau        return $conf["sidebar"];
20537748cd8SNickeau    }
20637748cd8SNickeau
20737748cd8SNickeau    public static function setTemplate($template)
20837748cd8SNickeau    {
20937748cd8SNickeau        global $conf;
21037748cd8SNickeau        $conf['template'] = $template;
21137748cd8SNickeau    }
21237748cd8SNickeau
213*c3437056SNickeau    public static function setCacheXhtmlOn()
21437748cd8SNickeau    {
21537748cd8SNickeau        // ensure the value is not -1, which disables caching
21637748cd8SNickeau        // https://www.dokuwiki.org/config:cachetime
21737748cd8SNickeau        global $conf;
21837748cd8SNickeau        $conf['cachetime'] = 60 * 60;
21937748cd8SNickeau    }
22037748cd8SNickeau
22137748cd8SNickeau    public static function debugIsOn()
22237748cd8SNickeau    {
22337748cd8SNickeau        global $conf;
22437748cd8SNickeau        return $conf['allowdebug'];
22537748cd8SNickeau    }
22637748cd8SNickeau
22737748cd8SNickeau    public static function setTemplateToStrap()
22837748cd8SNickeau    {
22937748cd8SNickeau        global $conf;
23037748cd8SNickeau        $conf['template'] = 'strap';
23137748cd8SNickeau    }
23237748cd8SNickeau
23337748cd8SNickeau    public static function setTemplateToDefault()
23437748cd8SNickeau    {
23537748cd8SNickeau        global $conf;
23637748cd8SNickeau        $conf['template'] = 'dokuwiki';
23737748cd8SNickeau    }
23837748cd8SNickeau
23937748cd8SNickeau    public static function setCacheDefault()
24037748cd8SNickeau    {
24137748cd8SNickeau        // The value is -1, which disables caching
24237748cd8SNickeau        // https://www.dokuwiki.org/config:cachetime
24337748cd8SNickeau        global $conf;
24437748cd8SNickeau        $conf['cachetime'] = -1;
24537748cd8SNickeau    }
24637748cd8SNickeau
24737748cd8SNickeau    public static function useHeadingAsTitle()
24837748cd8SNickeau    {
24937748cd8SNickeau        // https://www.dokuwiki.org/config:useheading
25037748cd8SNickeau        global $conf;
25137748cd8SNickeau        $conf['useheading'] = 1;
25237748cd8SNickeau    }
25337748cd8SNickeau
25437748cd8SNickeau    public static function useHeadingDefault()
25537748cd8SNickeau    {
25637748cd8SNickeau        // https://www.dokuwiki.org/config:useheading
25737748cd8SNickeau        global $conf;
25837748cd8SNickeau        $conf['useheading'] = 0;
25937748cd8SNickeau    }
26037748cd8SNickeau
26137748cd8SNickeau    public static function getTemplate()
26237748cd8SNickeau    {
26337748cd8SNickeau        global $conf;
26437748cd8SNickeau        return $conf['template'];
26537748cd8SNickeau
26637748cd8SNickeau    }
26737748cd8SNickeau
26837748cd8SNickeau    public static function isStrapTemplate()
26937748cd8SNickeau    {
27037748cd8SNickeau        global $conf;
27137748cd8SNickeau        return $conf['template'] == self::STRAP_TEMPLATE_NAME;
27237748cd8SNickeau    }
27337748cd8SNickeau
27437748cd8SNickeau    public static function getAjaxUrl()
27537748cd8SNickeau    {
276*c3437056SNickeau        return self::getBaseUrl() . "lib/exe/ajax.php";
27737748cd8SNickeau    }
27837748cd8SNickeau
27937748cd8SNickeau    public static function getPageDirectory()
28037748cd8SNickeau    {
28137748cd8SNickeau        global $conf;
282*c3437056SNickeau        /**
283*c3437056SNickeau         * Data dir is the pages dir
284*c3437056SNickeau         */
28537748cd8SNickeau        return $conf['datadir'];
28637748cd8SNickeau    }
28737748cd8SNickeau
28837748cd8SNickeau    public static function disableHeadingSectionEditing()
28937748cd8SNickeau    {
29037748cd8SNickeau        global $conf;
29137748cd8SNickeau        $conf['maxseclevel'] = 0;
29237748cd8SNickeau    }
29337748cd8SNickeau
29437748cd8SNickeau    public static function setBreadCrumbOn()
29537748cd8SNickeau    {
29637748cd8SNickeau        global $conf;
29737748cd8SNickeau        $conf['youarehere'] = 1;
29837748cd8SNickeau    }
29937748cd8SNickeau
300*c3437056SNickeau    public static function isHtmlRenderCacheOn(): bool
301*c3437056SNickeau    {
302*c3437056SNickeau        global $conf;
303*c3437056SNickeau        return $conf['cachetime'] !== -1;
304*c3437056SNickeau    }
305*c3437056SNickeau
306*c3437056SNickeau    public static function getDataDirectory()
307*c3437056SNickeau    {
308*c3437056SNickeau        global $conf;
309*c3437056SNickeau        $dataDirectory = $conf['datadir'];
310*c3437056SNickeau        if ($dataDirectory === null) {
311*c3437056SNickeau            throw new RuntimeException("The base directory ($dataDirectory) is null");
312*c3437056SNickeau        }
313*c3437056SNickeau        $file = File::createFromPath($dataDirectory)->getParent();
314*c3437056SNickeau        return $file->getAbsoluteFileSystemPath();
315*c3437056SNickeau    }
316*c3437056SNickeau
317*c3437056SNickeau    public static function isLowQualityProtectionEnable(): bool
318*c3437056SNickeau    {
319*c3437056SNickeau        return PluginUtility::getConfValue(LowQualityPage::CONF_LOW_QUALITY_PAGE_PROTECTION_ENABLE) === 1;
320*c3437056SNickeau    }
321*c3437056SNickeau
322*c3437056SNickeau    public static function getHomePageName()
323*c3437056SNickeau    {
324*c3437056SNickeau        global $conf;
325*c3437056SNickeau        return $conf["start"];
326*c3437056SNickeau    }
327*c3437056SNickeau
328*c3437056SNickeau    /**
329*c3437056SNickeau     * @return mixed - Application / Website name
330*c3437056SNickeau     */
331*c3437056SNickeau    public static function getName()
332*c3437056SNickeau    {
333*c3437056SNickeau        global $conf;
334*c3437056SNickeau        return $conf["title"];
335*c3437056SNickeau    }
336*c3437056SNickeau
337*c3437056SNickeau    public static function getTagLine()
338*c3437056SNickeau    {
339*c3437056SNickeau        global $conf;
340*c3437056SNickeau        return $conf['tagline'];
341*c3437056SNickeau    }
342*c3437056SNickeau
343*c3437056SNickeau    /**
344*c3437056SNickeau     * @return int|null
345*c3437056SNickeau     */
346*c3437056SNickeau    public static function getCacheTime(): ?int
347*c3437056SNickeau    {
348*c3437056SNickeau        global $conf;
349*c3437056SNickeau        $cacheTime = $conf['cachetime'];
350*c3437056SNickeau        if ($cacheTime === null) {
351*c3437056SNickeau            return null;
352*c3437056SNickeau        }
353*c3437056SNickeau        if (is_numeric($cacheTime)) {
354*c3437056SNickeau            return intval($cacheTime);
355*c3437056SNickeau        }
356*c3437056SNickeau        return null;
357*c3437056SNickeau    }
358*c3437056SNickeau
359*c3437056SNickeau    /**
360*c3437056SNickeau     * Absolute vs Relative URL
361*c3437056SNickeau     * https://www.dokuwiki.org/config:canonical
362*c3437056SNickeau     */
363*c3437056SNickeau    public static function getCanonicalConfForRelativeVsAbsoluteUrl()
364*c3437056SNickeau    {
365*c3437056SNickeau        global $conf;
366*c3437056SNickeau        return $conf['canonical'];
367*c3437056SNickeau    }
368*c3437056SNickeau
36937748cd8SNickeau
37037748cd8SNickeau}
371