--- /dev/null
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <meta name="generator" content="pandoc">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
+ <title></title>
+ <style type="text/css">code{white-space: pre;}</style>
+ <!--[if lt IE 9]>
+ <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+ <![endif]-->
+ <link rel="stylesheet" href="github-markdown.css">
+</head>
+<body>
+<h3 id="download-css-styles-for-shaarlis-listed-in-an-opml-file">Download CSS styles for shaarlis listed in an opml file</h3>
+<p>Example php script:</p>
+<pre><code><!---- ?php -->
+<!---- Copyright (c) 2014 Nicolas Delsaux (https://github.com/Riduidel) -->
+<!---- License: zlib (http://www.gzip.org/zlib/zlib_license.html) -->
+
+/**
+ * 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']);
+ $result[$siteUrl]=((string) $site['text']);
+ }
+ 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);
+}
+
+/**
+ * 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 <a href="'.$url.'">'.$url.'</a> into '.$siteFolder
+ .'. It looks like <img src="'.$homeThumb.'"><br/>';
+ }
+ }
+}
+
+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);
+ }
+ }
+ // 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']);
+ }
+ }
+ return $result;
+}
+
+$knownStyles = findKnownStyles();
+copyUserStylesFrom(createShaarliHashFromOPMLL(SHAARLI_RSS_OPML), $knownStyles);
+
+<!--- ? ----></code></pre>
+</body>
+</html>