#Download CSS styles from an OPML list ###Download CSS styles for shaarlis listed in an opml file Example php script: ```php /** * Source: https://github.com/Riduidel * Download css styles for shaarlis listed in an opml file */ define("SHAARLI_RSS_OPML", "https://www.ecirtam.net/shaarlirss/custom/people.opml"); define("THEMES_TEMP_FOLDER", "new_themes"); if(!file_exists(THEMES_TEMP_FOLDER)) { mkdir(THEMES_TEMP_FOLDER); } function siteUrl($pathInSite) { $indexPos = strpos($pathInSite, "index.php"); if(!$indexPos) { return $pathInSite; } else { return substr($pathInSite, 0, $indexPos); } } function createShaarliHashFromOPMLL($opmlFile) { $result = array(); $opml = file_get_contents($opmlFile); $opmlXml = simplexml_load_string($opml); $outlineElements = $opmlXml->xpath("body/outline"); foreach($outlineElements as $site) { $siteUrl = siteUrl((string) $site['htmlUrl']);[](.html) $result[$siteUrl]=((string) $site['text']);[](.html) } return $result; } function getSiteFolder($url) { $domain = parse_url($url, PHP_URL_HOST); return THEMES_TEMP_FOLDER."/".str_replace(".", "_", $domain); } function get_http_response_code($theURL) { $headers = get_headers($theURL); return substr($headers[0], 9, 3);[](.html) } /** * This makes the code PHP-5 only (particularly the call to "get_headers") */ function copyUserStyleFrom($url, $name, $knownStyles) { $userStyle = $url."inc/user.css"; if(in_array($url, $knownStyles)) { // TODO add log message } else { $statusCode = get_http_response_code($userStyle); if(intval($statusCode)<300) { $styleSheet = file_get_contents($userStyle); $siteFolder = getSiteFolder($url); if(!file_exists($siteFolder)) { mkdir($siteFolder); } if(!file_exists($siteFolder.'/user.css')) { // Copy stylesheet file_put_contents($siteFolder.'/user.css', $styleSheet); } if(!file_exists($siteFolder.'/README.md')) { // Then write a readme.md file file_put_contents($siteFolder.'/README.md', "User style from ".$name."\n" ."=============================" ."\n\n" ."This stylesheet was downloaded from ".$userStyle." on ".date(DATE_RFC822) ); } if(!file_exists($siteFolder.'/config.ini')) { // Write a config file containing useful informations file_put_contents($siteFolder.'/config.ini', "site_url=".$url."\n" ."site_name=".$name."\n" ); } if(!file_exists($siteFolder.'/home.png')) { // And finally copy generated thumbnail $homeThumb = $siteFolder.'/home.png'; file_put_contents($siteFolder.'/home.png', file_get_contents(getThumbnailUrl($url))); } echo 'Theme have been downloaded from '.$url.' into '.$siteFolder .'. It looks like
'; } } } function getThumbnailUrl($url) { return 'http://api.webthumbnail.org/?url='.$url; } function copyUserStylesFrom($urlToNames, $knownStyles) { foreach($urlToNames as $url => $name) { copyUserStyleFrom($url, $name, $knownStyles); } } /** * Reading directory list, courtesy of http://www.laughing-buddha.net/php/dirlist/ * @param directory the directory we want to list files of * @return a simple array containing the list of absolute file paths. Notice that current file (".") and parent one("..") * are not listed here */ function getDirectoryList ($directory) { $realPath = realpath($directory); // create an array to hold directory list $results = array(); // create a handler for the directory $handler = opendir($directory); // open directory and walk through the filenames while ($file = readdir($handler)) { // if file isn't this directory or its parent, add it to the results if ($file != "." && $file != "..") { $results[ = realpath($realPath . "/" . $file);](-=-realpath($realPath-.-"/"-.-$file);.html) } } // tidy up: close the handler closedir($handler); // done! return $results; } /** * Start in themes folder and look in all subfolders for config.ini files. * These config.ini files allow us not to download styles again and again */ function findKnownStyles() { $result = array(); $subFolders = getDirectoryList("themes"); foreach($subFolders as $folder) { $configFile = $folder."/config.ini"; if(file_exists($configFile)) { $iniParameters = parse_ini_file($configFile); array_push($result, $iniParameters['site_url']);[](.html) } } return $result; } $knownStyles = findKnownStyles(); copyUserStylesFrom(createShaarliHashFromOPMLL(SHAARLI_RSS_OPML), $knownStyles); ```