1*37748cd8SNickeau<?php 2*37748cd8SNickeau 3*37748cd8SNickeau 4*37748cd8SNickeaunamespace ComboStrap; 5*37748cd8SNickeau 6*37748cd8SNickeau 7*37748cd8SNickeauuse dokuwiki\Cache\Cache; 8*37748cd8SNickeau 9*37748cd8SNickeauclass Lang 10*37748cd8SNickeau{ 11*37748cd8SNickeau 12*37748cd8SNickeau const CANONICAL = "lang"; 13*37748cd8SNickeau const LANG_ATTRIBUTES = "lang"; 14*37748cd8SNickeau 15*37748cd8SNickeau /** 16*37748cd8SNickeau * Process the lang attribute 17*37748cd8SNickeau * https://www.w3.org/International/questions/qa-html-language-declarations 18*37748cd8SNickeau * @param TagAttributes $attributes 19*37748cd8SNickeau * 20*37748cd8SNickeau * Language supported: 21*37748cd8SNickeau * http://www.iana.org/assignments/language-subtag-registry/language-subtag-registry 22*37748cd8SNickeau * 23*37748cd8SNickeau * Common Locale Data Repository 24*37748cd8SNickeau * http://cldr.unicode.org/ 25*37748cd8SNickeau * Data: 26*37748cd8SNickeau * * http://www.unicode.org/Public/cldr/ 27*37748cd8SNickeau * * https://github.com/unicode-cldr/ 28*37748cd8SNickeau * * https://github.com/unicode-org/cldr-json 29*37748cd8SNickeau * The ''dir'' data is known as the ''characterOrder'' 30*37748cd8SNickeau * 31*37748cd8SNickeau */ 32*37748cd8SNickeau public static function processLangAttribute(&$attributes) 33*37748cd8SNickeau { 34*37748cd8SNickeau 35*37748cd8SNickeau 36*37748cd8SNickeau /** 37*37748cd8SNickeau * Adding the lang attribute 38*37748cd8SNickeau * if set 39*37748cd8SNickeau */ 40*37748cd8SNickeau if ($attributes->hasComponentAttribute(self::LANG_ATTRIBUTES)) { 41*37748cd8SNickeau $langValue = $attributes->getValueAndRemove(self::LANG_ATTRIBUTES); 42*37748cd8SNickeau $attributes->addHtmlAttributeValue("lang", $langValue); 43*37748cd8SNickeau 44*37748cd8SNickeau $languageDataCache = new Cache("combo_" . $langValue, ".json"); 45*37748cd8SNickeau $cacheDataUsable = $languageDataCache->useCache(); 46*37748cd8SNickeau if (!$cacheDataUsable) { 47*37748cd8SNickeau 48*37748cd8SNickeau // Language about the data 49*37748cd8SNickeau $downloadUrl = "https://raw.githubusercontent.com/unicode-org/cldr-json/master/cldr-json/cldr-misc-modern/main/$langValue/layout.json"; 50*37748cd8SNickeau 51*37748cd8SNickeau $filePointer = @fopen($downloadUrl, 'r'); 52*37748cd8SNickeau if ($filePointer != false) { 53*37748cd8SNickeau 54*37748cd8SNickeau $numberOfByte = @file_put_contents($languageDataCache->cache, $filePointer); 55*37748cd8SNickeau if ($numberOfByte != false) { 56*37748cd8SNickeau LogUtility::msg("The new language data ($langValue) was downloaded", LogUtility::LVL_MSG_INFO, self::CANONICAL); 57*37748cd8SNickeau $cacheDataUsable = true; 58*37748cd8SNickeau } else { 59*37748cd8SNickeau LogUtility::msg("Internal error: The language data ($langValue) could no be written to ($languageDataCache->cache)", LogUtility::LVL_MSG_ERROR, self::CANONICAL); 60*37748cd8SNickeau } 61*37748cd8SNickeau 62*37748cd8SNickeau } else { 63*37748cd8SNickeau 64*37748cd8SNickeau LogUtility::msg("The data for the language ($langValue) could not be found at ($downloadUrl).", LogUtility::LVL_MSG_ERROR, self::CANONICAL); 65*37748cd8SNickeau 66*37748cd8SNickeau } 67*37748cd8SNickeau } 68*37748cd8SNickeau 69*37748cd8SNickeau if ($cacheDataUsable) { 70*37748cd8SNickeau $jsonAsArray = true; 71*37748cd8SNickeau $languageData = json_decode(file_get_contents($languageDataCache->cache), $jsonAsArray); 72*37748cd8SNickeau if($languageData==null){ 73*37748cd8SNickeau LogUtility::msg("We could not read the data from the language ($langValue). No direction was set.", LogUtility::LVL_MSG_ERROR, self::CANONICAL); 74*37748cd8SNickeau return; 75*37748cd8SNickeau } 76*37748cd8SNickeau $characterOrder = $languageData["main"][$langValue]["layout"]["orientation"]["characterOrder"]; 77*37748cd8SNickeau if ($characterOrder == "right-to-left") { 78*37748cd8SNickeau $attributes->addHtmlAttributeValue("dir", "rtl"); 79*37748cd8SNickeau } else { 80*37748cd8SNickeau $attributes->addHtmlAttributeValue("dir", "ltr"); 81*37748cd8SNickeau } 82*37748cd8SNickeau } else { 83*37748cd8SNickeau LogUtility::msg("The language direction cannot be set because no language data was found for the language ($langValue)", LogUtility::LVL_MSG_WARNING, self::CANONICAL); 84*37748cd8SNickeau } 85*37748cd8SNickeau 86*37748cd8SNickeau } 87*37748cd8SNickeau 88*37748cd8SNickeau } 89*37748cd8SNickeau 90*37748cd8SNickeau} 91