<!DOCTYPE html> <!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> <!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="shortcut icon" href="../img/favicon.ico"> <title>Download CSS styles from an OPML list - Shaarli Documentation</title> <link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'> <link rel="stylesheet" href="../css/theme.css" type="text/css" /> <link rel="stylesheet" href="../css/theme_extra.css" type="text/css" /> <link rel="stylesheet" href="../css/highlight.css"> <link href="../github-markdown.css" rel="stylesheet"> <script> // Current page data var mkdocs_page_name = "Download CSS styles from an OPML list"; var mkdocs_page_input_path = "Download-CSS-styles-from-an-OPML-list.md"; var mkdocs_page_url = "/Download-CSS-styles-from-an-OPML-list/"; </script> <script src="../js/jquery-2.1.1.min.js"></script> <script src="../js/modernizr-2.8.3.min.js"></script> <script type="text/javascript" src="../js/highlight.pack.js"></script> </head> <body class="wy-body-for-nav" role="document"> <div class="wy-grid-for-nav"> <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> <div class="wy-side-nav-search"> <a href=".." class="icon icon-home"> Shaarli Documentation</a> <div role="search"> <form id ="rtd-search-form" class="wy-form" action="../search.html" method="get"> <input type="text" name="q" placeholder="Search docs" /> </form> </div> </div> <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> <ul class="current"> <li class="toctree-l1"> <a class="" href="..">Home</a> </li> <li class="toctree-l1"> <span class="caption-text">Setup</span> <ul class="subnav"> <li class=""> <a class="" href="../Download-and-Installation/">Download and Installation</a> </li> <li class=""> <a class="" href="../Upgrade-and-migration/">Upgrade and migration</a> </li> <li class=""> <a class="" href="../Server-requirements/">Server requirements</a> </li> <li class=""> <a class="" href="../Server-configuration/">Server configuration</a> </li> <li class=""> <a class="" href="../Server-security/">Server security</a> </li> <li class=""> <a class="" href="../Shaarli-configuration/">Shaarli configuration</a> </li> <li class=""> <a class="" href="../Plugins/">Plugins</a> </li> </ul> </li> <li class="toctree-l1"> <span class="caption-text">Docker</span> <ul class="subnav"> <li class=""> <a class="" href="../Docker-101/">Docker 101</a> </li> <li class=""> <a class="" href="../Shaarli-images/">Shaarli images</a> </li> <li class=""> <a class="" href="../Reverse-proxy-configuration/">Reverse proxy configuration</a> </li> <li class=""> <a class="" href="../Docker-resources/">Docker resources</a> </li> </ul> </li> <li class="toctree-l1"> <span class="caption-text">Usage</span> <ul class="subnav"> <li class=""> <a class="" href="../Features/">Features</a> </li> <li class=""> <a class="" href="../Bookmarklet/">Bookmarklet</a> </li> <li class=""> <a class="" href="../Browsing-and-searching/">Browsing and searching</a> </li> <li class=""> <a class="" href="../Firefox-share/">Firefox share</a> </li> <li class=""> <a class="" href="../RSS-feeds/">RSS feeds</a> </li> <li class=""> <a class="" href="../REST-API/">REST API</a> </li> </ul> </li> <li class="toctree-l1"> <span class="caption-text">How To</span> <ul class="subnav"> <li class=""> <a class="" href="../Backup,-restore,-import-and-export/">Backup, restore, import and export</a> </li> <li class=""> <a class="" href="../Copy-an-existing-installation-over-SSH-and-serve-it-locally/">Copy an existing installation over SSH and serve it locally</a> </li> <li class=""> <a class="" href="../Create-and-serve-multiple-Shaarlis-(farm)/">Create and serve multiple Shaarlis (farm)</a> </li> <li class=" current"> <a class="current" href="./">Download CSS styles from an OPML list</a> <ul class="subnav"> <li class="toctree-l3"><a href="#download-css-styles-for-shaarlis-listed-in-an-opml-file">Download CSS styles for shaarlis listed in an opml file</a></li> </ul> </li> <li class=""> <a class="" href="../Datastore-hacks/">Datastore hacks</a> </li> </ul> </li> <li class="toctree-l1"> <a class="" href="../Troubleshooting/">Troubleshooting</a> </li> <li class="toctree-l1"> <span class="caption-text">Development</span> <ul class="subnav"> <li class=""> <a class="" href="../Development-guidelines/">Development guidelines</a> </li> <li class=""> <a class="" href="../Continuous-integration-tools/">Continuous integration tools</a> </li> <li class=""> <a class="" href="../GnuPG-signature/">GnuPG signature</a> </li> <li class=""> <a class="" href="../Coding-guidelines/">Coding guidelines</a> </li> <li class=""> <a class="" href="../Directory-structure/">Directory structure</a> </li> <li class=""> <a class="" href="../3rd-party-libraries/">3rd party libraries</a> </li> <li class=""> <a class="" href="../Plugin-System/">Plugin System</a> </li> <li class=""> <a class="" href="../Release-Shaarli/">Release Shaarli</a> </li> <li class=""> <a class="" href="../Versioning-and-Branches/">Versioning and Branches</a> </li> <li class=""> <a class="" href="../Security/">Security</a> </li> <li class=""> <a class="" href="../Static-analysis/">Static analysis</a> </li> <li class=""> <a class="" href="../Theming/">Theming</a> </li> <li class=""> <a class="" href="../Unit-tests/">Unit tests</a> </li> </ul> </li> <li class="toctree-l1"> <span class="caption-text">About</span> <ul class="subnav"> <li class=""> <a class="" href="../FAQ/">FAQ</a> </li> <li class=""> <a class="" href="../Community-&-Related-software/">Community & Related software</a> </li> </ul> </li> </ul> </div> </nav> <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> <nav class="wy-nav-top" role="navigation" aria-label="top navigation"> <i data-toggle="wy-nav-top" class="fa fa-bars"></i> <a href="..">Shaarli Documentation</a> </nav> <div class="wy-nav-content"> <div class="rst-content"> <div role="navigation" aria-label="breadcrumbs navigation"> <ul class="wy-breadcrumbs"> <li><a href="..">Docs</a> »</li> <li>How To »</li> <li>Download CSS styles from an OPML list</li> <li class="wy-breadcrumbs-aside"> <a href="https://github.com/shaarli/Shaarli/edit/master/docs/Download-CSS-styles-from-an-OPML-list.md" class="icon icon-github"> Edit on GitHub</a> </li> </ul> <hr/> </div> <div role="main"> <div class="section"> <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 class="php"><!---- ?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> </div> </div> <footer> <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> <a href="../Datastore-hacks/" class="btn btn-neutral float-right" title="Datastore hacks">Next <span class="icon icon-circle-arrow-right"></span></a> <a href="../Create-and-serve-multiple-Shaarlis-(farm)/" class="btn btn-neutral" title="Create and serve multiple Shaarlis (farm)"><span class="icon icon-circle-arrow-left"></span> Previous</a> </div> <hr/> <div role="contentinfo"> <!-- Copyright etc --> </div> Built with <a href="http://www.mkdocs.org">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. </footer> </div> </div> </section> </div> <div class="rst-versions" role="note" style="cursor: pointer"> <span class="rst-current-version" data-toggle="rst-current-version"> <a href="https://github.com/shaarli/Shaarli" class="fa fa-github" style="float: left; color: #fcfcfc"> GitHub</a> <span><a href="../Create-and-serve-multiple-Shaarlis-(farm)/" style="color: #fcfcfc;">« Previous</a></span> <span style="margin-left: 15px"><a href="../Datastore-hacks/" style="color: #fcfcfc">Next »</a></span> </span> </div> <script src="../js/theme.js"></script> </body> </html>