2015-07-22 05:02:10 +02:00
|
|
|
#Download CSS styles from an OPML list
|
2015-03-07 14:50:31 +01:00
|
|
|
###Download CSS styles for shaarlis listed in an opml file
|
|
|
|
Example php script:
|
|
|
|
|
2015-07-22 05:02:10 +02:00
|
|
|
```php
|
2015-03-07 14:50:31 +01:00
|
|
|
<!---- ?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) {
|
2015-07-22 05:02:10 +02:00
|
|
|
$siteUrl = siteUrl((string) $site['htmlUrl']);[](.html)
|
|
|
|
$result[$siteUrl]=((string) $site['text']);[](.html)
|
2015-03-07 14:50:31 +01:00
|
|
|
}
|
|
|
|
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);
|
2015-07-22 05:02:10 +02:00
|
|
|
return substr($headers[0], 9, 3);[](.html)
|
2015-03-07 14:50:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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 != "..") {
|
2015-07-22 05:02:10 +02:00
|
|
|
$results[ = realpath($realPath . "/" . $file);](-=-realpath($realPath-.-"/"-.-$file);.html)
|
2015-03-07 14:50:31 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
// 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);
|
2015-07-22 05:02:10 +02:00
|
|
|
array_push($result, $iniParameters['site_url']);[](.html)
|
2015-03-07 14:50:31 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
|
|
|
|
$knownStyles = findKnownStyles();
|
|
|
|
copyUserStylesFrom(createShaarliHashFromOPMLL(SHAARLI_RSS_OPML), $knownStyles);
|
|
|
|
|
|
|
|
<!--- ? ---->
|
|
|
|
```
|