xref: /template/strap/ComboStrap/Site.php (revision 82a60d039cd81033dc8147c27f0a50716b7a5301)
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*82a60d03SNickeauuse Exception;
17c3437056SNickeauuse RuntimeException;
18c3437056SNickeau
1937748cd8SNickeauclass Site
2037748cd8SNickeau{
2137748cd8SNickeau
2237748cd8SNickeau    const STRAP_TEMPLATE_NAME = "strap";
2337748cd8SNickeau
2437748cd8SNickeau    const SVG_LOGO_IDS = array(
2537748cd8SNickeau        ':wiki:logo.svg',
2637748cd8SNickeau        ':logo.svg'
2737748cd8SNickeau    );
2837748cd8SNickeau
2937748cd8SNickeau    const PNG_LOGO_IDS = array(
3037748cd8SNickeau        ':logo.png',
3137748cd8SNickeau        ':wiki:logo.png',
3237748cd8SNickeau        ':favicon-32×32.png',
3337748cd8SNickeau        ':favicon-16×16.png',
3437748cd8SNickeau        ':apple-touch-icon.png',
3537748cd8SNickeau        ':android-chrome-192x192.png'
3637748cd8SNickeau    );
3737748cd8SNickeau
3837748cd8SNickeau
3937748cd8SNickeau    /**
4037748cd8SNickeau     * @return string|null the html img tag or null
4137748cd8SNickeau     */
421fa8c418SNickeau    public static function getLogoImgHtmlTag($tagAttributes = null): ?string
4337748cd8SNickeau    {
4437748cd8SNickeau        $logoIds = self::getLogoIds();
4537748cd8SNickeau        foreach ($logoIds as $logoId) {
461fa8c418SNickeau            if ($logoId->exists()) {
47c3437056SNickeau                $mediaLink = MediaLink::createMediaLinkFromPath($logoId->getPath(), $tagAttributes)
48c3437056SNickeau                    ->setLazyLoad(false);
4937748cd8SNickeau                return $mediaLink->renderMediaTag();
5037748cd8SNickeau            }
5137748cd8SNickeau        }
5237748cd8SNickeau        return null;
5337748cd8SNickeau    }
5437748cd8SNickeau
551fa8c418SNickeau    /**
561fa8c418SNickeau     * @return Image[]
571fa8c418SNickeau     */
581fa8c418SNickeau    private static function getLogoIds(): array
5937748cd8SNickeau    {
601fa8c418SNickeau        $logosPaths = PluginUtility::mergeAttributes(self::PNG_LOGO_IDS, self::SVG_LOGO_IDS);
611fa8c418SNickeau        $logos = [];
621fa8c418SNickeau        foreach ($logosPaths as $logoPath) {
63c3437056SNickeau            $dokuPath = DokuPath::createMediaPathFromId($logoPath);
64*82a60d03SNickeau            if(FileSystems::exists($dokuPath)) {
65*82a60d03SNickeau                try {
66c3437056SNickeau                    $logos[] = Image::createImageFromPath($dokuPath);
67*82a60d03SNickeau                } catch (Exception $e) {
68*82a60d03SNickeau                    // The image is not valid
69*82a60d03SNickeau                    LogUtility::msg("The logo ($logoPath) is not a valid image. {$e->getMessage()}");
70*82a60d03SNickeau                }
71*82a60d03SNickeau            }
721fa8c418SNickeau        }
731fa8c418SNickeau        return $logos;
7437748cd8SNickeau    }
7537748cd8SNickeau
7637748cd8SNickeau
7737748cd8SNickeau    /**
7837748cd8SNickeau     * @return string|null
7937748cd8SNickeau     */
8037748cd8SNickeau    public static function getLogoUrlAsSvg()
8137748cd8SNickeau    {
8237748cd8SNickeau
8337748cd8SNickeau
8437748cd8SNickeau        $url = null;
8537748cd8SNickeau        foreach (self::SVG_LOGO_IDS as $svgLogo) {
8637748cd8SNickeau
8737748cd8SNickeau            $svgLogoFN = mediaFN($svgLogo);
8837748cd8SNickeau
8937748cd8SNickeau            if (file_exists($svgLogoFN)) {
9037748cd8SNickeau                $url = ml($svgLogo, '', true, '', true);
9137748cd8SNickeau                break;
9237748cd8SNickeau            };
9337748cd8SNickeau        }
9437748cd8SNickeau        return $url;
9537748cd8SNickeau    }
9637748cd8SNickeau
9737748cd8SNickeau    public static function getLogoUrlAsPng()
9837748cd8SNickeau    {
9937748cd8SNickeau
10037748cd8SNickeau        $url = null;
10137748cd8SNickeau        foreach (self::PNG_LOGO_IDS as $svgLogo) {
10237748cd8SNickeau
10337748cd8SNickeau            $svgLogoFN = mediaFN($svgLogo);
10437748cd8SNickeau
10537748cd8SNickeau            if (file_exists($svgLogoFN)) {
10637748cd8SNickeau                $url = ml($svgLogo, '', true, '', true);
10737748cd8SNickeau                break;
10837748cd8SNickeau            };
10937748cd8SNickeau        }
11037748cd8SNickeau        return $url;
11137748cd8SNickeau    }
11237748cd8SNickeau
11337748cd8SNickeau    /**
11437748cd8SNickeau     * https://www.dokuwiki.org/config:title
11537748cd8SNickeau     * @return mixed
11637748cd8SNickeau     */
11737748cd8SNickeau    public static function getTitle()
11837748cd8SNickeau    {
11937748cd8SNickeau        global $conf;
12037748cd8SNickeau        return $conf['title'];
12137748cd8SNickeau    }
12237748cd8SNickeau
12337748cd8SNickeau    /**
12437748cd8SNickeau     * @param string $sep - the separator - generally ("-") but not always
12537748cd8SNickeau     * @return string
12637748cd8SNickeau     *
12737748cd8SNickeau     * Locale always canonicalizes to upper case.
12837748cd8SNickeau     */
129c3437056SNickeau    public static function getLocale(string $sep = "-"): ?string
13037748cd8SNickeau    {
13137748cd8SNickeau
13237748cd8SNickeau        $locale = null;
13337748cd8SNickeau
13437748cd8SNickeau        $lang = self::getLang();
13537748cd8SNickeau        if ($lang != null) {
136c3437056SNickeau            $country = self::getLanguageRegion();
13737748cd8SNickeau            if ($country != null) {
13837748cd8SNickeau                $locale = strtolower($lang) . $sep . strtoupper($country);
13937748cd8SNickeau            }
14037748cd8SNickeau        }
14137748cd8SNickeau
14237748cd8SNickeau        return $locale;
14337748cd8SNickeau    }
14437748cd8SNickeau
14537748cd8SNickeau    /**
14637748cd8SNickeau     *
14737748cd8SNickeau     * ISO 3166 alpha-2 country code
14837748cd8SNickeau     *
14937748cd8SNickeau     */
150c3437056SNickeau    public static function getLanguageRegion()
15137748cd8SNickeau    {
152c3437056SNickeau        $region = PluginUtility::getConfValue(Region::CONF_SITE_LANGUAGE_REGION);
153c3437056SNickeau        if (!empty($region)) {
154c3437056SNickeau            return $region;
15537748cd8SNickeau        } else {
156c3437056SNickeau
157c3437056SNickeau            if (extension_loaded("intl")) {
158c3437056SNickeau                $locale = locale_get_default();
159c3437056SNickeau                $localeParts = preg_split("/_/", $locale, 2);
160c3437056SNickeau                if (sizeof($localeParts) === 2) {
161c3437056SNickeau                    return $localeParts[1];
162c3437056SNickeau                }
163c3437056SNickeau            }
164c3437056SNickeau
16537748cd8SNickeau            return null;
16637748cd8SNickeau        }
16737748cd8SNickeau
16837748cd8SNickeau    }
16937748cd8SNickeau
17037748cd8SNickeau    /**
17137748cd8SNickeau     * @return mixed|null
17237748cd8SNickeau     * Wrapper around  https://www.dokuwiki.org/config:lang
17337748cd8SNickeau     */
174c3437056SNickeau    public static function getLang()
17537748cd8SNickeau    {
17637748cd8SNickeau
17737748cd8SNickeau        global $conf;
178c3437056SNickeau        $lang = $conf['lang'];
179c3437056SNickeau        return ($lang ?: null);
18037748cd8SNickeau    }
18137748cd8SNickeau
182c3437056SNickeau    public static function getBaseUrl(): string
18337748cd8SNickeau    {
18437748cd8SNickeau
18537748cd8SNickeau        /**
18637748cd8SNickeau         * In a {@link PluginUtility::isDevOrTest()} dev environment,
18737748cd8SNickeau         * don't set the
18837748cd8SNickeau         * https://www.dokuwiki.org/config:baseurl
18937748cd8SNickeau         * to be able to test the metadata / social integration
19037748cd8SNickeau         * via a tunnel
191c3437056SNickeau         *
192c3437056SNickeau         * Same as {@link getBaseURL()} ??
19337748cd8SNickeau         */
19437748cd8SNickeau
19537748cd8SNickeau        return DOKU_URL;
19637748cd8SNickeau
19737748cd8SNickeau    }
19837748cd8SNickeau
19937748cd8SNickeau    public static function getTag()
20037748cd8SNickeau    {
20137748cd8SNickeau        global $conf;
20237748cd8SNickeau        $tag = $conf['tag'];
20337748cd8SNickeau        return ($tag ? $tag : null);
20437748cd8SNickeau    }
20537748cd8SNickeau
20637748cd8SNickeau    /**
20737748cd8SNickeau     * @return string - the name of the sidebar page
20837748cd8SNickeau     */
20937748cd8SNickeau    public static function getSidebarName()
21037748cd8SNickeau    {
21137748cd8SNickeau        global $conf;
21237748cd8SNickeau        return $conf["sidebar"];
21337748cd8SNickeau    }
21437748cd8SNickeau
21537748cd8SNickeau    public static function setTemplate($template)
21637748cd8SNickeau    {
21737748cd8SNickeau        global $conf;
21837748cd8SNickeau        $conf['template'] = $template;
21937748cd8SNickeau    }
22037748cd8SNickeau
221c3437056SNickeau    public static function setCacheXhtmlOn()
22237748cd8SNickeau    {
22337748cd8SNickeau        // ensure the value is not -1, which disables caching
22437748cd8SNickeau        // https://www.dokuwiki.org/config:cachetime
22537748cd8SNickeau        global $conf;
22637748cd8SNickeau        $conf['cachetime'] = 60 * 60;
22737748cd8SNickeau    }
22837748cd8SNickeau
22937748cd8SNickeau    public static function debugIsOn()
23037748cd8SNickeau    {
23137748cd8SNickeau        global $conf;
23237748cd8SNickeau        return $conf['allowdebug'];
23337748cd8SNickeau    }
23437748cd8SNickeau
23537748cd8SNickeau    public static function setTemplateToStrap()
23637748cd8SNickeau    {
23737748cd8SNickeau        global $conf;
23837748cd8SNickeau        $conf['template'] = 'strap';
23937748cd8SNickeau    }
24037748cd8SNickeau
24137748cd8SNickeau    public static function setTemplateToDefault()
24237748cd8SNickeau    {
24337748cd8SNickeau        global $conf;
24437748cd8SNickeau        $conf['template'] = 'dokuwiki';
24537748cd8SNickeau    }
24637748cd8SNickeau
24737748cd8SNickeau    public static function setCacheDefault()
24837748cd8SNickeau    {
24937748cd8SNickeau        // The value is -1, which disables caching
25037748cd8SNickeau        // https://www.dokuwiki.org/config:cachetime
25137748cd8SNickeau        global $conf;
25237748cd8SNickeau        $conf['cachetime'] = -1;
25337748cd8SNickeau    }
25437748cd8SNickeau
25537748cd8SNickeau    public static function useHeadingAsTitle()
25637748cd8SNickeau    {
25737748cd8SNickeau        // https://www.dokuwiki.org/config:useheading
25837748cd8SNickeau        global $conf;
25937748cd8SNickeau        $conf['useheading'] = 1;
26037748cd8SNickeau    }
26137748cd8SNickeau
26237748cd8SNickeau    public static function useHeadingDefault()
26337748cd8SNickeau    {
26437748cd8SNickeau        // https://www.dokuwiki.org/config:useheading
26537748cd8SNickeau        global $conf;
26637748cd8SNickeau        $conf['useheading'] = 0;
26737748cd8SNickeau    }
26837748cd8SNickeau
26937748cd8SNickeau    public static function getTemplate()
27037748cd8SNickeau    {
27137748cd8SNickeau        global $conf;
27237748cd8SNickeau        return $conf['template'];
27337748cd8SNickeau
27437748cd8SNickeau    }
27537748cd8SNickeau
27637748cd8SNickeau    public static function isStrapTemplate()
27737748cd8SNickeau    {
27837748cd8SNickeau        global $conf;
27937748cd8SNickeau        return $conf['template'] == self::STRAP_TEMPLATE_NAME;
28037748cd8SNickeau    }
28137748cd8SNickeau
28237748cd8SNickeau    public static function getAjaxUrl()
28337748cd8SNickeau    {
284c3437056SNickeau        return self::getBaseUrl() . "lib/exe/ajax.php";
28537748cd8SNickeau    }
28637748cd8SNickeau
28737748cd8SNickeau    public static function getPageDirectory()
28837748cd8SNickeau    {
28937748cd8SNickeau        global $conf;
290c3437056SNickeau        /**
291c3437056SNickeau         * Data dir is the pages dir
292c3437056SNickeau         */
29337748cd8SNickeau        return $conf['datadir'];
29437748cd8SNickeau    }
29537748cd8SNickeau
29637748cd8SNickeau    public static function disableHeadingSectionEditing()
29737748cd8SNickeau    {
29837748cd8SNickeau        global $conf;
29937748cd8SNickeau        $conf['maxseclevel'] = 0;
30037748cd8SNickeau    }
30137748cd8SNickeau
30237748cd8SNickeau    public static function setBreadCrumbOn()
30337748cd8SNickeau    {
30437748cd8SNickeau        global $conf;
30537748cd8SNickeau        $conf['youarehere'] = 1;
30637748cd8SNickeau    }
30737748cd8SNickeau
308c3437056SNickeau    public static function isHtmlRenderCacheOn(): bool
309c3437056SNickeau    {
310c3437056SNickeau        global $conf;
311c3437056SNickeau        return $conf['cachetime'] !== -1;
312c3437056SNickeau    }
313c3437056SNickeau
314c3437056SNickeau    public static function getDataDirectory()
315c3437056SNickeau    {
316c3437056SNickeau        global $conf;
317c3437056SNickeau        $dataDirectory = $conf['datadir'];
318c3437056SNickeau        if ($dataDirectory === null) {
319c3437056SNickeau            throw new RuntimeException("The base directory ($dataDirectory) is null");
320c3437056SNickeau        }
321c3437056SNickeau        $file = File::createFromPath($dataDirectory)->getParent();
322c3437056SNickeau        return $file->getAbsoluteFileSystemPath();
323c3437056SNickeau    }
324c3437056SNickeau
325c3437056SNickeau    public static function isLowQualityProtectionEnable(): bool
326c3437056SNickeau    {
327c3437056SNickeau        return PluginUtility::getConfValue(LowQualityPage::CONF_LOW_QUALITY_PAGE_PROTECTION_ENABLE) === 1;
328c3437056SNickeau    }
329c3437056SNickeau
330c3437056SNickeau    public static function getHomePageName()
331c3437056SNickeau    {
332c3437056SNickeau        global $conf;
333c3437056SNickeau        return $conf["start"];
334c3437056SNickeau    }
335c3437056SNickeau
336c3437056SNickeau    /**
337c3437056SNickeau     * @return mixed - Application / Website name
338c3437056SNickeau     */
339c3437056SNickeau    public static function getName()
340c3437056SNickeau    {
341c3437056SNickeau        global $conf;
342c3437056SNickeau        return $conf["title"];
343c3437056SNickeau    }
344c3437056SNickeau
345c3437056SNickeau    public static function getTagLine()
346c3437056SNickeau    {
347c3437056SNickeau        global $conf;
348c3437056SNickeau        return $conf['tagline'];
349c3437056SNickeau    }
350c3437056SNickeau
351c3437056SNickeau    /**
352c3437056SNickeau     * @return int|null
353c3437056SNickeau     */
354c3437056SNickeau    public static function getCacheTime(): ?int
355c3437056SNickeau    {
356c3437056SNickeau        global $conf;
357c3437056SNickeau        $cacheTime = $conf['cachetime'];
358c3437056SNickeau        if ($cacheTime === null) {
359c3437056SNickeau            return null;
360c3437056SNickeau        }
361c3437056SNickeau        if (is_numeric($cacheTime)) {
362c3437056SNickeau            return intval($cacheTime);
363c3437056SNickeau        }
364c3437056SNickeau        return null;
365c3437056SNickeau    }
366c3437056SNickeau
367c3437056SNickeau    /**
368c3437056SNickeau     * Absolute vs Relative URL
369c3437056SNickeau     * https://www.dokuwiki.org/config:canonical
370c3437056SNickeau     */
371c3437056SNickeau    public static function getCanonicalConfForRelativeVsAbsoluteUrl()
372c3437056SNickeau    {
373c3437056SNickeau        global $conf;
374c3437056SNickeau        return $conf['canonical'];
375c3437056SNickeau    }
376c3437056SNickeau
37737748cd8SNickeau
37837748cd8SNickeau}
379