2015-07-22 05:02:10 +02:00
<!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 > Shaarli - Download CSS styles from an OPML list< / 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]-->
< style type = "text/css" >
table.sourceCode, tr.sourceCode, td.lineNumbers, td.sourceCode {
margin: 0; padding: 0; vertical-align: baseline; border: none; }
table.sourceCode { width: 100%; line-height: 100%; }
td.lineNumbers { text-align: right; padding-right: 4px; padding-left: 4px; color: #aaaaaa; border-right: 1px solid #aaaaaa; }
td.sourceCode { padding-left: 5px; }
code > span.kw { color: #007020; font-weight: bold; }
code > span.dt { color: #902000; }
code > span.dv { color: #40a070; }
code > span.bn { color: #40a070; }
code > span.fl { color: #40a070; }
code > span.ch { color: #4070a0; }
code > span.st { color: #4070a0; }
code > span.co { color: #60a0b0; font-style: italic; }
code > span.ot { color: #007020; }
code > span.al { color: #ff0000; font-weight: bold; }
code > span.fu { color: #06287e; }
code > span.er { color: #ff0000; font-weight: bold; }
< / style >
< link rel = "stylesheet" href = "github-markdown.css" >
< / head >
< body >
< div id = "local-sidebar" >
< ul >
< li > < a href = "Home.html" > Home< / a > < / li >
< li > Installation
< ul >
< li > < a href = "Server-requirements.html" > Server requirements< / a > < / li >
< li > < a href = "Server-configuration.html" > Server configuration< / a > < / li >
< li > < a href = "Shaarli-configuration.html" > Shaarli configuration< / a > < / li >
< / ul > < / li >
< li > < a href = "Usage.html" > Usage< / a >
< ul >
< li > < a href = "Sharing-button.html" > Sharing button< / a > (bookmarklet)< / li >
< li > < a href = "Firefox-share.html" > Firefox share< / a > < / li >
< li > < a href = "RSS-feeds.html" > RSS feeds< / a > < / li >
< / ul > < / li >
< li > How To
< ul >
< li > < a href = "Backup,-restore,-import-and-export.html" > Backup, restore, import and export< / a > < / li >
< li > < a href = "Copy-an-existing-installation-over-SSH-and-serve-it-locally.html" > Copy an existing installation over SSH and serve it locally< / a > < / li >
< li > < a href = "Download-CSS-styles-from-an-OPML-list.html" > Download CSS styles from an OPML list< / a > < / li >
2015-08-18 00:33:25 +02:00
< li > < a href = "Datastore-hacks.html" > Datastore hacks< / a > < / li >
2015-07-22 05:02:10 +02:00
< / ul > < / li >
< li > < a href = "Troubleshooting.html" > Troubleshooting< / a > < / li >
< li > < a href = "Development.html" > Development< / a >
< ul >
< li > < a href = "GnuPG-signature.html" > GnuPG signature< / a > < / li >
< li > < a href = "Coding-guidelines.html" > Coding guidelines< / a > < / li >
< li > < a href = "Directory-structure.html" > Directory structure< / a > < / li >
< li > < a href = "3rd-party-libraries.html" > 3rd party libraries< / a > < / li >
< li > < a href = "Plugin-System.html" > Plugin System< / a > < / li >
< li > < a href = "Security.html" > Security< / a > < / li >
< li > < a href = "Static-analysis.html" > Static analysis< / a > < / li >
< li > < a href = "Theming.html" > Theming< / a > < / li >
< li > < a href = "Unit-tests.html" > Unit tests< / a > < / li >
< / ul > < / li >
< li > About
< ul >
< li > < a href = "FAQ.html" > FAQ< / a > < / li >
< li > < a href = "Community-&-Related-software.html" > Community & Related software< / a > < / li >
< li > < a href = "TODO.html" > TODO< / a > < / li >
< / ul > < / li >
< / ul >
< / div >
< h1 id = "download-css-styles-from-an-opml-list" > Download CSS styles from an OPML list< / h1 >
< 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 class = "sourceCode php" > < code class = "sourceCode php" > < !---- < span class = "ot" > ?< / span > php -->
< !---- Copyright < span class = "ot" > (< / span > c< span class = "ot" > )< / span > < span class = "dv" > 2014< / span > Nicolas Delsaux < span class = "ot" > (< / span > https< span class = "ot" > :< / span > < span class = "co" > //github.com/Riduidel) --> < / span >
< !---- License: zlib < span class = "ot" > (< / span > http:< span class = "co" > //www.gzip.org/zlib/zlib_license.html) --> < / span >
< span class = "co" > /**< / span >
< span class = "co" > * Source: https://github.com/Riduidel< / span >
< span class = "co" > * Download css styles for shaarlis listed in an opml file< / span >
< span class = "co" > */< / span >
< span class = "fu" > define< / span > < span class = "ot" > (< / span > < span class = "st" > " SHAARLI_RSS_OPML" < / span > < span class = "ot" > ,< / span > < span class = "st" > " https://www.ecirtam.net/shaarlirss/custom/people.opml" < / span > < span class = "ot" > );< / span >
< span class = "fu" > define< / span > < span class = "ot" > (< / span > < span class = "st" > " THEMES_TEMP_FOLDER" < / span > < span class = "ot" > ,< / span > < span class = "st" > " new_themes" < / span > < span class = "ot" > );< / span >
< span class = "kw" > if< / span > < span class = "ot" > (< / span > !< span class = "fu" > file_exists< / span > < span class = "ot" > (< / span > < span class = "kw" > THEMES_TEMP_FOLDER< / span > < span class = "ot" > ))< / span > {
< span class = "fu" > mkdir< / span > < span class = "ot" > (< / span > < span class = "kw" > THEMES_TEMP_FOLDER< / span > < span class = "ot" > );< / span >
}
< span class = "kw" > function< / span > siteUrl< span class = "ot" > (< / span > < span class = "kw" > $pathInSite< / span > < span class = "ot" > )< / span > {
< span class = "kw" > $indexPos< / span > = < span class = "fu" > strpos< / span > < span class = "ot" > (< / span > < span class = "kw" > $pathInSite< / span > < span class = "ot" > ,< / span > < span class = "st" > " index.php" < / span > < span class = "ot" > );< / span >
< span class = "kw" > if< / span > < span class = "ot" > (< / span > !< span class = "kw" > $indexPos< / span > < span class = "ot" > )< / span > {
< span class = "kw" > return< / span > < span class = "kw" > $pathInSite< / span > < span class = "ot" > ;< / span >
} < span class = "kw" > else< / span > {
< span class = "kw" > return< / span > < span class = "fu" > substr< / span > < span class = "ot" > (< / span > < span class = "kw" > $pathInSite< / span > < span class = "ot" > ,< / span > < span class = "dv" > 0< / span > < span class = "ot" > ,< / span > < span class = "kw" > $indexPos< / span > < span class = "ot" > );< / span >
}
}
< span class = "kw" > function< / span > createShaarliHashFromOPMLL< span class = "ot" > (< / span > < span class = "kw" > $opmlFile< / span > < span class = "ot" > )< / span > {
< span class = "kw" > $result< / span > = < span class = "fu" > array< / span > < span class = "ot" > ();< / span >
< span class = "kw" > $opml< / span > = < span class = "fu" > file_get_contents< / span > < span class = "ot" > (< / span > < span class = "kw" > $opmlFile< / span > < span class = "ot" > );< / span >
< span class = "kw" > $opmlXml< / span > = < span class = "fu" > simplexml_load_string< / span > < span class = "ot" > (< / span > < span class = "kw" > $opml< / span > < span class = "ot" > );< / span >
< span class = "kw" > $outlineElements< / span > = < span class = "kw" > $opmlXml< / span > -> xpath< span class = "ot" > (< / span > < span class = "st" > " body/outline" < / span > < span class = "ot" > );< / span >
< span class = "kw" > foreach< / span > < span class = "ot" > (< / span > < span class = "kw" > $outlineElements< / span > < span class = "kw" > as< / span > < span class = "kw" > $site< / span > < span class = "ot" > )< / span > {
< span class = "kw" > $siteUrl< / span > = siteUrl< span class = "ot" > (< / span > < span class = "dt" > (string)< / span > < span class = "kw" > $site< / span > < span class = "ot" > [< / span > < span class = "st" > ' htmlUrl' < / span > < span class = "ot" > ]);[](< / span > .html< span class = "ot" > )< / span >
< span class = "kw" > $result< / span > < span class = "ot" > [< / span > < span class = "kw" > $siteUrl< / span > < span class = "ot" > ]< / span > =< span class = "ot" > (< / span > < span class = "dt" > (string)< / span > < span class = "kw" > $site< / span > < span class = "ot" > [< / span > < span class = "st" > ' text' < / span > < span class = "ot" > ]);[](< / span > .html< span class = "ot" > )< / span >
}
< span class = "kw" > return< / span > < span class = "kw" > $result< / span > < span class = "ot" > ;< / span >
}
< span class = "kw" > function< / span > getSiteFolder< span class = "ot" > (< / span > < span class = "kw" > $url< / span > < span class = "ot" > )< / span > {
< span class = "kw" > $domain< / span > = < span class = "fu" > parse_url< / span > < span class = "ot" > (< / span > < span class = "kw" > $url< / span > < span class = "ot" > ,< / span > < span class = "kw" > PHP_URL_HOST< / span > < span class = "ot" > );< / span >
< span class = "kw" > return< / span > < span class = "kw" > THEMES_TEMP_FOLDER< / span > .< span class = "st" > " /" < / span > .< span class = "fu" > str_replace< / span > < span class = "ot" > (< / span > < span class = "st" > " ." < / span > < span class = "ot" > ,< / span > < span class = "st" > " _" < / span > < span class = "ot" > ,< / span > < span class = "kw" > $domain< / span > < span class = "ot" > );< / span >
}
< span class = "kw" > function< / span > get_http_response_code< span class = "ot" > (< / span > < span class = "kw" > $theURL< / span > < span class = "ot" > )< / span > {
< span class = "kw" > $headers< / span > = < span class = "fu" > get_headers< / span > < span class = "ot" > (< / span > < span class = "kw" > $theURL< / span > < span class = "ot" > );< / span >
< span class = "kw" > return< / span > < span class = "fu" > substr< / span > < span class = "ot" > (< / span > < span class = "kw" > $headers< / span > < span class = "ot" > [< / span > < span class = "dv" > 0< / span > < span class = "ot" > ],< / span > < span class = "dv" > 9< / span > < span class = "ot" > ,< / span > < span class = "dv" > 3< / span > < span class = "ot" > );[](< / span > .html< span class = "ot" > )< / span >
}
< span class = "co" > /**< / span >
< span class = "co" > * This makes the code PHP-5 only (particularly the call to " get_headers" )< / span >
< span class = "co" > */< / span >
< span class = "kw" > function< / span > copyUserStyleFrom< span class = "ot" > (< / span > < span class = "kw" > $url< / span > < span class = "ot" > ,< / span > < span class = "kw" > $name< / span > < span class = "ot" > ,< / span > < span class = "kw" > $knownStyles< / span > < span class = "ot" > )< / span > {
< span class = "kw" > $userStyle< / span > = < span class = "kw" > $url< / span > .< span class = "st" > " inc/user.css" < / span > < span class = "ot" > ;< / span >
< span class = "kw" > if< / span > < span class = "ot" > (< / span > < span class = "fu" > in_array< / span > < span class = "ot" > (< / span > < span class = "kw" > $url< / span > < span class = "ot" > ,< / span > < span class = "kw" > $knownStyles< / span > < span class = "ot" > ))< / span > {
< span class = "co" > // TODO add log message< / span >
} < span class = "kw" > else< / span > {
< span class = "kw" > $statusCode< / span > = get_http_response_code< span class = "ot" > (< / span > < span class = "kw" > $userStyle< / span > < span class = "ot" > );< / span >
< span class = "kw" > if< / span > < span class = "ot" > (< / span > < span class = "fu" > intval< / span > < span class = "ot" > (< / span > < span class = "kw" > $statusCode< / span > < span class = "ot" > )< / span > < < span class = "dv" > 300< / span > < span class = "ot" > )< / span > {
< span class = "kw" > $styleSheet< / span > = < span class = "fu" > file_get_contents< / span > < span class = "ot" > (< / span > < span class = "kw" > $userStyle< / span > < span class = "ot" > );< / span >
< span class = "kw" > $siteFolder< / span > = getSiteFolder< span class = "ot" > (< / span > < span class = "kw" > $url< / span > < span class = "ot" > );< / span >
< span class = "kw" > if< / span > < span class = "ot" > (< / span > !< span class = "fu" > file_exists< / span > < span class = "ot" > (< / span > < span class = "kw" > $siteFolder< / span > < span class = "ot" > ))< / span > {
< span class = "fu" > mkdir< / span > < span class = "ot" > (< / span > < span class = "kw" > $siteFolder< / span > < span class = "ot" > );< / span >
}
< span class = "kw" > if< / span > < span class = "ot" > (< / span > !< span class = "fu" > file_exists< / span > < span class = "ot" > (< / span > < span class = "kw" > $siteFolder< / span > .< span class = "st" > ' /user.css' < / span > < span class = "ot" > ))< / span > {
< span class = "co" > // Copy stylesheet< / span >
< span class = "fu" > file_put_contents< / span > < span class = "ot" > (< / span > < span class = "kw" > $siteFolder< / span > .< span class = "st" > ' /user.css' < / span > < span class = "ot" > ,< / span > < span class = "kw" > $styleSheet< / span > < span class = "ot" > );< / span >
}
< span class = "kw" > if< / span > < span class = "ot" > (< / span > !< span class = "fu" > file_exists< / span > < span class = "ot" > (< / span > < span class = "kw" > $siteFolder< / span > .< span class = "st" > ' /README.md' < / span > < span class = "ot" > ))< / span > {
< span class = "co" > // Then write a readme.md file< / span >
< span class = "fu" > file_put_contents< / span > < span class = "ot" > (< / span > < span class = "kw" > $siteFolder< / span > .< span class = "st" > ' /README.md' < / span > < span class = "ot" > ,< / span >
< span class = "st" > " User style from " < / span > .< span class = "kw" > $name< / span > .< span class = "st" > " < / span > < span class = "kw" > \n< / span > < span class = "st" > " < / span >
.< span class = "st" > " =============================" < / span >
.< span class = "st" > " < / span > < span class = "kw" > \n\n< / span > < span class = "st" > " < / span >
.< span class = "st" > " This stylesheet was downloaded from " < / span > .< span class = "kw" > $userStyle< / span > .< span class = "st" > " on " < / span > .< span class = "fu" > date< / span > < span class = "ot" > (< / span > < span class = "kw" > DATE_RFC822< / span > < span class = "ot" > )< / span >
< span class = "ot" > );< / span >
}
< span class = "kw" > if< / span > < span class = "ot" > (< / span > !< span class = "fu" > file_exists< / span > < span class = "ot" > (< / span > < span class = "kw" > $siteFolder< / span > .< span class = "st" > ' /config.ini' < / span > < span class = "ot" > ))< / span > {
< span class = "co" > // Write a config file containing useful informations< / span >
< span class = "fu" > file_put_contents< / span > < span class = "ot" > (< / span > < span class = "kw" > $siteFolder< / span > .< span class = "st" > ' /config.ini' < / span > < span class = "ot" > ,< / span >
< span class = "st" > " site_url=" < / span > .< span class = "kw" > $url< / span > .< span class = "st" > " < / span > < span class = "kw" > \n< / span > < span class = "st" > " < / span >
.< span class = "st" > " site_name=" < / span > .< span class = "kw" > $name< / span > .< span class = "st" > " < / span > < span class = "kw" > \n< / span > < span class = "st" > " < / span >
< span class = "ot" > );< / span >
}
< span class = "kw" > if< / span > < span class = "ot" > (< / span > !< span class = "fu" > file_exists< / span > < span class = "ot" > (< / span > < span class = "kw" > $siteFolder< / span > .< span class = "st" > ' /home.png' < / span > < span class = "ot" > ))< / span > {
< span class = "co" > // And finally copy generated thumbnail< / span >
< span class = "kw" > $homeThumb< / span > = < span class = "kw" > $siteFolder< / span > .< span class = "st" > ' /home.png' < / span > < span class = "ot" > ;< / span >
< span class = "fu" > file_put_contents< / span > < span class = "ot" > (< / span > < span class = "kw" > $siteFolder< / span > .< span class = "st" > ' /home.png' < / span > < span class = "ot" > ,< / span > < span class = "fu" > file_get_contents< / span > < span class = "ot" > (< / span > getThumbnailUrl< span class = "ot" > (< / span > < span class = "kw" > $url< / span > < span class = "ot" > )));< / span >
}
< span class = "fu" > echo< / span > < span class = "st" > ' Theme have been downloaded from < a href=" ' < / span > .< span class = "kw" > $url< / span > .< span class = "st" > ' " > ' < / span > .< span class = "kw" > $url< / span > .< span class = "st" > ' < /a> into ' < / span > .< span class = "kw" > $siteFolder< / span >
.< span class = "st" > ' . It looks like < img src=" ' < / span > .< span class = "kw" > $homeThumb< / span > .< span class = "st" > ' " > < br/> ' < / span > < span class = "ot" > ;< / span >
}
}
}
< span class = "kw" > function< / span > getThumbnailUrl< span class = "ot" > (< / span > < span class = "kw" > $url< / span > < span class = "ot" > )< / span > {
< span class = "kw" > return< / span > < span class = "st" > ' http://api.webthumbnail.org/?url=' < / span > .< span class = "kw" > $url< / span > < span class = "ot" > ;< / span >
}
< span class = "kw" > function< / span > copyUserStylesFrom< span class = "ot" > (< / span > < span class = "kw" > $urlToNames< / span > < span class = "ot" > ,< / span > < span class = "kw" > $knownStyles< / span > < span class = "ot" > )< / span > {
< span class = "kw" > foreach< / span > < span class = "ot" > (< / span > < span class = "kw" > $urlToNames< / span > < span class = "kw" > as< / span > < span class = "kw" > $url< / span > => < span class = "kw" > $name< / span > < span class = "ot" > )< / span > {
copyUserStyleFrom< span class = "ot" > (< / span > < span class = "kw" > $url< / span > < span class = "ot" > ,< / span > < span class = "kw" > $name< / span > < span class = "ot" > ,< / span > < span class = "kw" > $knownStyles< / span > < span class = "ot" > );< / span >
}
}
< span class = "co" > /**< / span >
< span class = "co" > * Reading directory list, courtesy of http://www.laughing-buddha.net/php/dirlist/< / span >
< span class = "co" > * < / span > < span class = "kw" > @param< / span > < span class = "co" > < / span > < span class = "kw" > directory< / span > < span class = "co" > the directory we want to list files of< / span >
< span class = "co" > * < / span > < span class = "kw" > @return< / span > < span class = "co" > a simple array containing the list of absolute file paths. Notice that current file (" ." ) and parent one(" .." )< / span >
< span class = "co" > * are not listed here< / span >
< span class = "co" > */< / span >
< span class = "kw" > function< / span > getDirectoryList < span class = "ot" > (< / span > < span class = "kw" > $directory< / span > < span class = "ot" > )< / span > {
< span class = "kw" > $realPath< / span > = < span class = "fu" > realpath< / span > < span class = "ot" > (< / span > < span class = "kw" > $directory< / span > < span class = "ot" > );< / span >
< span class = "co" > // create an array to hold directory list< / span >
< span class = "kw" > $results< / span > = < span class = "fu" > array< / span > < span class = "ot" > ();< / span >
< span class = "co" > // create a handler for the directory< / span >
< span class = "kw" > $handler< / span > = < span class = "fu" > opendir< / span > < span class = "ot" > (< / span > < span class = "kw" > $directory< / span > < span class = "ot" > );< / span >
< span class = "co" > // open directory and walk through the filenames< / span >
< span class = "kw" > while< / span > < span class = "ot" > (< / span > < span class = "kw" > $file< / span > = < span class = "fu" > readdir< / span > < span class = "ot" > (< / span > < span class = "kw" > $handler< / span > < span class = "ot" > ))< / span > {
< span class = "co" > // if file isn' t this directory or its parent, add it to the results< / span >
< span class = "kw" > if< / span > < span class = "ot" > (< / span > < span class = "kw" > $file< / span > != < span class = "st" > " ." < / span > & & < span class = "kw" > $file< / span > != < span class = "st" > " .." < / span > < span class = "ot" > )< / span > {
< span class = "kw" > $results< / span > < span class = "ot" > [< / span > = < span class = "fu" > realpath< / span > < span class = "ot" > (< / span > < span class = "kw" > $realPath< / span > . < span class = "st" > " /" < / span > . < span class = "kw" > $file< / span > < span class = "ot" > );](< / span > -=-< span class = "fu" > realpath< / span > < span class = "ot" > (< / span > < span class = "kw" > $realPath< / span > -.-< span class = "st" > " /" < / span > -.-< span class = "kw" > $file< / span > < span class = "ot" > );< / span > .html< span class = "ot" > )< / span >
}
}
< span class = "co" > // tidy up: close the handler< / span >
< span class = "fu" > closedir< / span > < span class = "ot" > (< / span > < span class = "kw" > $handler< / span > < span class = "ot" > );< / span >
< span class = "co" > // done!< / span >
< span class = "kw" > return< / span > < span class = "kw" > $results< / span > < span class = "ot" > ;< / span >
}
< span class = "co" > /**< / span >
< span class = "co" > * Start in themes folder and look in all subfolders for config.ini files. < / span >
< span class = "co" > * These config.ini files allow us not to download styles again and again< / span >
< span class = "co" > */< / span >
< span class = "kw" > function< / span > findKnownStyles< span class = "ot" > ()< / span > {
< span class = "kw" > $result< / span > = < span class = "fu" > array< / span > < span class = "ot" > ();< / span >
< span class = "kw" > $subFolders< / span > = getDirectoryList< span class = "ot" > (< / span > < span class = "st" > " themes" < / span > < span class = "ot" > );< / span >
< span class = "kw" > foreach< / span > < span class = "ot" > (< / span > < span class = "kw" > $subFolders< / span > < span class = "kw" > as< / span > < span class = "kw" > $folder< / span > < span class = "ot" > )< / span > {
< span class = "kw" > $configFile< / span > = < span class = "kw" > $folder< / span > .< span class = "st" > " /config.ini" < / span > < span class = "ot" > ;< / span >
< span class = "kw" > if< / span > < span class = "ot" > (< / span > < span class = "fu" > file_exists< / span > < span class = "ot" > (< / span > < span class = "kw" > $configFile< / span > < span class = "ot" > ))< / span > {
< span class = "kw" > $iniParameters< / span > = < span class = "fu" > parse_ini_file< / span > < span class = "ot" > (< / span > < span class = "kw" > $configFile< / span > < span class = "ot" > );< / span >
< span class = "fu" > array_push< / span > < span class = "ot" > (< / span > < span class = "kw" > $result< / span > < span class = "ot" > ,< / span > < span class = "kw" > $iniParameters< / span > < span class = "ot" > [< / span > < span class = "st" > ' site_url' < / span > < span class = "ot" > ]);[](< / span > .html< span class = "ot" > )< / span >
}
}
< span class = "kw" > return< / span > < span class = "kw" > $result< / span > < span class = "ot" > ;< / span >
}
< span class = "kw" > $knownStyles< / span > = findKnownStyles< span class = "ot" > ();< / span >
copyUserStylesFrom< span class = "ot" > (< / span > createShaarliHashFromOPMLL< span class = "ot" > (< / span > < span class = "kw" > SHAARLI_RSS_OPML< / span > < span class = "ot" > ),< / span > < span class = "kw" > $knownStyles< / span > < span class = "ot" > );< / span >
< !--- < span class = "ot" > ?< / span > ----> < / code > < / pre >
< / body >
< / html >