137748cd8SNickeau<?php 237748cd8SNickeau 337748cd8SNickeau 437748cd8SNickeaunamespace ComboStrap; 537748cd8SNickeau 637748cd8SNickeau 737748cd8SNickeauuse dokuwiki\Cache\Cache; 837748cd8SNickeau 9*c3437056SNickeauclass Lang extends MetadataText 1037748cd8SNickeau{ 1137748cd8SNickeau 12*c3437056SNickeau public const PROPERTY_NAME = "lang"; 13*c3437056SNickeau 1437748cd8SNickeau 1537748cd8SNickeau /** 1637748cd8SNickeau * Process the lang attribute 1737748cd8SNickeau * https://www.w3.org/International/questions/qa-html-language-declarations 1837748cd8SNickeau * @param TagAttributes $attributes 1937748cd8SNickeau * 2037748cd8SNickeau * Language supported: 2137748cd8SNickeau * http://www.iana.org/assignments/language-subtag-registry/language-subtag-registry 2237748cd8SNickeau * 2337748cd8SNickeau * Common Locale Data Repository 2437748cd8SNickeau * http://cldr.unicode.org/ 2537748cd8SNickeau * Data: 2637748cd8SNickeau * * http://www.unicode.org/Public/cldr/ 2737748cd8SNickeau * * https://github.com/unicode-cldr/ 2837748cd8SNickeau * * https://github.com/unicode-org/cldr-json 2937748cd8SNickeau * The ''dir'' data is known as the ''characterOrder'' 3037748cd8SNickeau * 3137748cd8SNickeau */ 3237748cd8SNickeau public static function processLangAttribute(&$attributes) 3337748cd8SNickeau { 3437748cd8SNickeau 3537748cd8SNickeau 3637748cd8SNickeau /** 3737748cd8SNickeau * Adding the lang attribute 3837748cd8SNickeau * if set 3937748cd8SNickeau */ 40*c3437056SNickeau if ($attributes->hasComponentAttribute(self::PROPERTY_NAME)) { 41*c3437056SNickeau $langValue = $attributes->getValueAndRemove(self::PROPERTY_NAME); 4237748cd8SNickeau $attributes->addHtmlAttributeValue("lang", $langValue); 4337748cd8SNickeau 4437748cd8SNickeau $languageDataCache = new Cache("combo_" . $langValue, ".json"); 4537748cd8SNickeau $cacheDataUsable = $languageDataCache->useCache(); 4637748cd8SNickeau if (!$cacheDataUsable) { 4737748cd8SNickeau 4837748cd8SNickeau // Language about the data 4937748cd8SNickeau $downloadUrl = "https://raw.githubusercontent.com/unicode-org/cldr-json/master/cldr-json/cldr-misc-modern/main/$langValue/layout.json"; 5037748cd8SNickeau 5137748cd8SNickeau $filePointer = @fopen($downloadUrl, 'r'); 5237748cd8SNickeau if ($filePointer != false) { 5337748cd8SNickeau 5437748cd8SNickeau $numberOfByte = @file_put_contents($languageDataCache->cache, $filePointer); 5537748cd8SNickeau if ($numberOfByte != false) { 56*c3437056SNickeau LogUtility::msg("The new language data ($langValue) was downloaded", LogUtility::LVL_MSG_INFO, self::PROPERTY_NAME); 5737748cd8SNickeau $cacheDataUsable = true; 5837748cd8SNickeau } else { 59*c3437056SNickeau LogUtility::msg("Internal error: The language data ($langValue) could no be written to ($languageDataCache->cache)", LogUtility::LVL_MSG_ERROR, self::PROPERTY_NAME); 6037748cd8SNickeau } 6137748cd8SNickeau 6237748cd8SNickeau } else { 6337748cd8SNickeau 64*c3437056SNickeau LogUtility::msg("The data for the language ($langValue) could not be found at ($downloadUrl).", LogUtility::LVL_MSG_ERROR, self::PROPERTY_NAME); 6537748cd8SNickeau 6637748cd8SNickeau } 6737748cd8SNickeau } 6837748cd8SNickeau 6937748cd8SNickeau if ($cacheDataUsable) { 7037748cd8SNickeau $jsonAsArray = true; 7137748cd8SNickeau $languageData = json_decode(file_get_contents($languageDataCache->cache), $jsonAsArray); 7237748cd8SNickeau if ($languageData == null) { 73*c3437056SNickeau LogUtility::msg("We could not read the data from the language ($langValue). No direction was set.", LogUtility::LVL_MSG_ERROR, self::PROPERTY_NAME); 7437748cd8SNickeau return; 7537748cd8SNickeau } 7637748cd8SNickeau $characterOrder = $languageData["main"][$langValue]["layout"]["orientation"]["characterOrder"]; 7737748cd8SNickeau if ($characterOrder == "right-to-left") { 7837748cd8SNickeau $attributes->addHtmlAttributeValue("dir", "rtl"); 7937748cd8SNickeau } else { 8037748cd8SNickeau $attributes->addHtmlAttributeValue("dir", "ltr"); 8137748cd8SNickeau } 8237748cd8SNickeau } else { 83*c3437056SNickeau LogUtility::msg("The language direction cannot be set because no language data was found for the language ($langValue)", LogUtility::LVL_MSG_WARNING, self::PROPERTY_NAME); 8437748cd8SNickeau } 8537748cd8SNickeau 8637748cd8SNickeau } 8737748cd8SNickeau 8837748cd8SNickeau } 8937748cd8SNickeau 90*c3437056SNickeau public static function createForPage(Page $page) 91*c3437056SNickeau { 92*c3437056SNickeau return (new Lang()) 93*c3437056SNickeau ->setResource($page); 94*c3437056SNickeau } 95*c3437056SNickeau 96*c3437056SNickeau public function getTab(): ?string 97*c3437056SNickeau { 98*c3437056SNickeau return MetaManagerForm::TAB_LANGUAGE_VALUE; 99*c3437056SNickeau } 100*c3437056SNickeau 101*c3437056SNickeau /** 102*c3437056SNickeau * @throws ExceptionCombo 103*c3437056SNickeau */ 104*c3437056SNickeau public function setFromStoreValue($value): Metadata 105*c3437056SNickeau { 106*c3437056SNickeau 107*c3437056SNickeau $this->validityCheck($value); 108*c3437056SNickeau return parent::setFromStoreValue($value); 109*c3437056SNickeau 110*c3437056SNickeau } 111*c3437056SNickeau 112*c3437056SNickeau /** 113*c3437056SNickeau * @param string|null $value 114*c3437056SNickeau * @return Metadata 115*c3437056SNickeau * @throws ExceptionCombo 116*c3437056SNickeau */ 117*c3437056SNickeau public function setValue($value): Metadata 118*c3437056SNickeau { 119*c3437056SNickeau $this->validityCheck($value); 120*c3437056SNickeau return parent::setValue($value); 121*c3437056SNickeau } 122*c3437056SNickeau 123*c3437056SNickeau 124*c3437056SNickeau public function getDescription(): string 125*c3437056SNickeau { 126*c3437056SNickeau return "The language of the page"; 127*c3437056SNickeau } 128*c3437056SNickeau 129*c3437056SNickeau public function getLabel(): string 130*c3437056SNickeau { 131*c3437056SNickeau return "Language"; 132*c3437056SNickeau } 133*c3437056SNickeau 134*c3437056SNickeau public static function getName(): string 135*c3437056SNickeau { 136*c3437056SNickeau return self::PROPERTY_NAME; 137*c3437056SNickeau } 138*c3437056SNickeau 139*c3437056SNickeau public function getPersistenceType(): string 140*c3437056SNickeau { 141*c3437056SNickeau return Metadata::PERSISTENT_METADATA; 142*c3437056SNickeau } 143*c3437056SNickeau 144*c3437056SNickeau public function getMutable(): bool 145*c3437056SNickeau { 146*c3437056SNickeau return true; 147*c3437056SNickeau } 148*c3437056SNickeau 149*c3437056SNickeau public function getDefaultValue() 150*c3437056SNickeau { 151*c3437056SNickeau return Site::getLang(); 152*c3437056SNickeau } 153*c3437056SNickeau 154*c3437056SNickeau /** 155*c3437056SNickeau * @throws ExceptionCombo 156*c3437056SNickeau */ 157*c3437056SNickeau private function validityCheck($value) 158*c3437056SNickeau { 159*c3437056SNickeau if ($value === "" || $value === null) { 160*c3437056SNickeau return; 161*c3437056SNickeau } 162*c3437056SNickeau if (!StringUtility::match($value, "^[a-zA-Z]{2}$")) { 163*c3437056SNickeau throw new ExceptionCombo("The lang value ($value) for the page ($this) does not have two letters", $this->getCanonical()); 164*c3437056SNickeau } 165*c3437056SNickeau } 166*c3437056SNickeau 167*c3437056SNickeau public function getCanonical(): string 168*c3437056SNickeau { 169*c3437056SNickeau return "lang"; 170*c3437056SNickeau } 171*c3437056SNickeau 172*c3437056SNickeau 17337748cd8SNickeau} 174