Merge branch 'master' into myAutoBlog
Conflicts: autoblogs/autoblog.php config.php.example functions.php index.php xsaf3.php
6
.gitignore
vendored
|
@ -1,9 +1,15 @@
|
|||
config.php
|
||||
.versionlock
|
||||
.xsaflock
|
||||
.updatealllock
|
||||
resources/rss.xml
|
||||
resources/rss.json
|
||||
.project
|
||||
resources/user.css
|
||||
autoblogs/*
|
||||
!autoblogs/autoblog.php
|
||||
docs/*
|
||||
!docs/docs.txt
|
||||
robots.txt
|
||||
.idea
|
||||
cache_*
|
||||
|
|
34
LICENSE.md
Normal file
|
@ -0,0 +1,34 @@
|
|||
LICENCE
|
||||
===============
|
||||
|
||||
- domaine public
|
||||
|
||||
LICENSE
|
||||
===============
|
||||
|
||||
- public domain
|
||||
|
||||
This is free and unencumbered software released into the public domain.
|
||||
|
||||
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||
distribute this software, either in source code form or as a compiled
|
||||
binary, for any purpose, commercial or non-commercial, and by any
|
||||
means.
|
||||
|
||||
In jurisdictions that recognize copyright laws, the author or authors
|
||||
of this software dedicate any and all copyright interest in the
|
||||
software to the public domain. We make this dedication for the benefit
|
||||
of the public at large and to the detriment of our heirs and
|
||||
successors. We intend this dedication to be an overt act of
|
||||
relinquishment in perpetuity of all present and future rights to this
|
||||
software under copyright law.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
For more information, please refer to <http://unlicense.org/>
|
75
README.md
|
@ -1,23 +1,42 @@
|
|||
|
||||
Projet Autoblog
|
||||
===============
|
||||
|
||||
Création, gestion et échange de blogs automatiques contre la censure (à propos: http://sebsauvage.net/streisand.me/fr/ ).
|
||||
> This project is historically in French. See [our english README](https://github.com/mitsukarenai/Projet-Autoblog/wiki/Autoblog-Project).
|
||||
|
||||
Réplication automatique de contenu à partir de flux RSS/Atom, avec partage des ajouts entre les fermes d'Autoblog.
|
||||
|
||||
L'objectif premier du projet Autoblog est de lutter contre la censure et toute autre forme de pression allant à l'encontre de la liberté d'expression en favorisant l'[effet Streisand](http://fr.wikipedia.org/wiki/Effet_Streisand).
|
||||
|
||||
Le projet a été initialement lancé par Sébastien Sauvage : [plus d'info par ici](http://sebsauvage.net/streisand.me/fr/).
|
||||
|
||||
Exemples d'instances :
|
||||
- [autoblog.suumitsu.eu](http://autoblog.suumitsu.eu/)
|
||||
- [streisand.hoa.ro](http://streisand.hoa.ro/)
|
||||
- [ecirtam.net](https://ecirtam.net/autoblogs/)
|
||||
- [autoblog.ohax.fr](http://autoblog.ohax.fr/)
|
||||
- [flamby.aldarone.fr](http://flamby.aldarone.fr/)
|
||||
- [tcit.fr](http://www.tcit.fr/streisand/)
|
||||
- [kaelsitoo.fr](http://kaelsitoo.fr/autoblog/)
|
||||
- [autoblog.postblue.info](http://autoblog.postblue.info/)
|
||||
|
||||
|
||||
Serie 0.3 par [Mitsu](https://github.com/mitsukarenai/), [Oros](https://github.com/Oros42), [Arthur Hoaro](https://github.com/ArthurHoaro).
|
||||
|
||||
Nouveautés majeures
|
||||
![logo](https://raw.github.com/mitsukarenai/Projet-Autoblog/master/resources/icon-logo.png)
|
||||
Fonctionnalités majeures
|
||||
===================
|
||||
|
||||
- "ferme" d'autoblogs avec ajout facile par différents formulaires (générique, microblogging, OPML, marque-pages)
|
||||
- échange de références entre fermes avec XSAF (Cross-Site Autoblog Farming)
|
||||
- vérification du statut des sites distants, et flux de suivi des changements
|
||||
- export facile des références, articles et médias
|
||||
- contrôle de version et alerte de mise à jour
|
||||
- apparence de l'autoblog selon son type
|
||||
- CSS utilisateur personnalisable
|
||||
- hébergement de documents spécifiques
|
||||
- Ferme d'autoblogs avec ajout facile par différents formulaires (générique, microblogging, OPML, marque-pages).
|
||||
- Échange de références entre fermes avec XSAF ([Cross-Site Autoblog Farming](https://github.com/mitsukarenai/Projet-Autoblog/wiki/XSAF---Cross-Site-Autoblog-Farming)).
|
||||
- Vérification du statut des sites distants, et flux de suivi des changements.
|
||||
- Export des références, articles et médias.
|
||||
- Contrôle de version de la ferme et alerte de mise à jour.
|
||||
- Identification du type d'autoblog.
|
||||
- CSS utilisateur personnalisable.
|
||||
- Hébergement de documents divers (PDF, images, réplique de site web, etc.).
|
||||
|
||||
Branches :
|
||||
Branches
|
||||
===================
|
||||
|
||||
- [master](https://github.com/mitsukarenai/Projet-Autoblog/tree/master/) _(développement)_ : Autoblog Project serie 0.3 par Mitsu, Oros, Arthur Hoaro
|
||||
|
@ -28,4 +47,36 @@ Branches :
|
|||
Pré-requis techniques
|
||||
=====================
|
||||
|
||||
- serveur web avec PHP 5.3 et son support SQLite
|
||||
- Serveur web (Apache, nginx, etc.)
|
||||
- PHP 5.3 ou supérieur
|
||||
- Support SQLite 3 pour PHP
|
||||
|
||||
Documentation
|
||||
=====================
|
||||
|
||||
La documentation du projet est sur le [Wiki du repo](https://github.com/mitsukarenai/Projet-Autoblog/wiki).
|
||||
|
||||
Accès hors ligne : `git clone https://github.com/mitsukarenai/Projet-Autoblog.wiki.git`
|
||||
|
||||
Licence
|
||||
=====================
|
||||
|
||||
Domaine public.
|
||||
|
||||
Changelog
|
||||
=====================
|
||||
- 2014-02-12 MILESTONE 0.3.2
|
||||
- separate type icons
|
||||
- cache added
|
||||
- pagination fixes
|
||||
- SVG fixes
|
||||
- fix date() warnings
|
||||
- bugfixes
|
||||
- 2013-10-14 MILESTONE 0.3.1
|
||||
- code semantics
|
||||
- "docs" filesize
|
||||
- robots.txt
|
||||
- bugfixes
|
||||
- 2013-07-30
|
||||
- twitter2feed.php fixed (regex on class "avatar"; ```<fullname>```)
|
||||
- 2013-07-22 MILESTONE 0.3
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
- Source feed MUST be valid UTF-8
|
||||
- Source feed MUST contain article body
|
||||
|
||||
This program is public domain. COPY COPY COPY !
|
||||
This program is public domain. COPY COPY COPY!
|
||||
*/
|
||||
$vvbversion = '0.3.0';
|
||||
if (!version_compare(phpversion(), '5.3.0', '>='))
|
||||
|
@ -41,7 +41,7 @@ if (!defined('MEDIA_DIR')) define('MEDIA_DIR', ROOT_DIR . '/media');
|
|||
if (!defined('LOCAL_URL'))
|
||||
{
|
||||
// Automagic URL discover
|
||||
define('LOCAL_URL', 'http' . (!empty($_SERVER['HTTPS']) ? 's' : '')."://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}");
|
||||
define('LOCAL_URL', 'http' . (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ? 's' : '')."://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}");
|
||||
}
|
||||
|
||||
if (!defined('LOCAL_URI'))
|
||||
|
@ -121,7 +121,7 @@ function exception_handler($e)
|
|||
exit;
|
||||
}
|
||||
|
||||
$error = "Error happened !\n\n".
|
||||
$error = "Error happened!\n\n".
|
||||
$e->getCode()." - ".$e->getMessage()."\n\nIn: ".
|
||||
$e->getFile() . ":" . $e->getLine()."\n\n";
|
||||
|
||||
|
@ -328,6 +328,11 @@ class VroumVroum_Blog
|
|||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function mustUpdateXsaf()
|
||||
{
|
||||
return file_exists('import.json');
|
||||
}
|
||||
|
||||
protected function _getStreamContext()
|
||||
{
|
||||
|
@ -375,9 +380,12 @@ class VroumVroum_Blog
|
|||
{
|
||||
$date = isset($item->published) ? (string) $item->published : (string) $item->updated;
|
||||
$guid = !empty($item->id) ? (string)$item->id : (string)$item->link['href'];
|
||||
|
||||
|
||||
if( count($item->content->children()) > 0 ) $content = (string)$item->content->asXML();
|
||||
else $content = (string)$item->content;
|
||||
|
||||
$id = $this->insertOrUpdateArticle($guid, (string)$item->title,
|
||||
(string)$item->link['href'], strtotime($date), (string)$item->content);
|
||||
(string)$item->link['href'], strtotime($date), $content );
|
||||
|
||||
if ($id !== false)
|
||||
$updated++;
|
||||
|
@ -425,6 +433,34 @@ class VroumVroum_Blog
|
|||
|
||||
return $updated;
|
||||
}
|
||||
|
||||
public function updateXsaf() {
|
||||
if($this->mustUpdateXsaf()) {
|
||||
$json = json_decode(file_get_contents('import.json'), true);
|
||||
$count = count($json['files']);
|
||||
file_put_contents('import.lock', $count); /* one-process locking */
|
||||
$remoteurl = $json['url'];
|
||||
if (!file_exists('media')) {
|
||||
mkdir('media');
|
||||
}
|
||||
$time = time();
|
||||
$maxtime = $time + 3; /* max exec time: 3 seconds */
|
||||
|
||||
while ($time <= $maxtime) {
|
||||
$file = array_shift($json['files']); /* get first element while unstacking */
|
||||
if(!empty($file)) {
|
||||
$this->_copy($remoteurl.$file, "media/$file");
|
||||
file_put_contents('import.json', json_encode($json));
|
||||
}
|
||||
else {
|
||||
unlink('import.json');
|
||||
break;
|
||||
} /* first element empty: import finished */
|
||||
$time = time();
|
||||
}
|
||||
unlink('import.lock');
|
||||
}
|
||||
}
|
||||
|
||||
public function listArticlesByPage($page = 1)
|
||||
{
|
||||
|
@ -467,6 +503,7 @@ class VroumVroum_Blog
|
|||
$res = $this->articles->query('SELECT id, uri, title, content
|
||||
FROM articles
|
||||
WHERE content LIKE \'%'.$this->articles->escapeString($query).'%\'
|
||||
OR title LIKE \'%'.$this->articles->escapeString($query).'%\'
|
||||
ORDER BY id DESC
|
||||
LIMIT 0,100;');
|
||||
|
||||
|
@ -537,6 +574,13 @@ class VroumVroum_Blog
|
|||
}
|
||||
return $content;
|
||||
}
|
||||
|
||||
public function getXsafCounter() {
|
||||
if($this->mustUpdateXsaf()) {
|
||||
$json = json_decode(file_get_contents('import.json'), true);
|
||||
return count($json['files']);
|
||||
}
|
||||
}
|
||||
|
||||
/* copy() is buggy with http streams and safe_mode enabled (which is bad), so here's a workaround */
|
||||
protected function _copy($from, $to)
|
||||
|
@ -583,7 +627,7 @@ if (isset($_GET['feed'])) // FEED
|
|||
<updated>'.date(DATE_ATOM, $art['date']).'</updated>
|
||||
|
||||
<content type="html">
|
||||
<![CDATA[(<a href="'.escape($art['feed_id']).'">source</a>)<br />'.escape_content($art['content']).']]>
|
||||
<![CDATA[(<a href="'.escape($art['url']).'">source</a>)<br />'.escape_content($art['content']).']]>
|
||||
</content>
|
||||
</entry>';
|
||||
}
|
||||
|
@ -649,6 +693,7 @@ if (!$search && !empty($_SERVER['QUERY_STRING']) && !is_numeric($_SERVER['QUERY_
|
|||
}
|
||||
|
||||
// common CSS
|
||||
<<<<<<< HEAD
|
||||
$css=' * { margin: 0; padding: 0; }
|
||||
body { font-family:sans-serif; background-color: #efefef; padding: 1%; color: #333; }
|
||||
img { max-width: 100%; height: auto; }
|
||||
|
@ -676,48 +721,108 @@ $css=' * { margin: 0; padding: 0; }
|
|||
.content h2 { font-size: 1.4em;color:#000; }
|
||||
.result h3 a { color: darkblue; text-decoration: none; text-shadow: 1px 1px 1px #fff; }
|
||||
#error { position: fixed; top: 0; left: 0; right: 0; padding: 1%; background: #fff; border-bottom: 2px solid red; color: darkred; }
|
||||
||||||| merged common ancestors
|
||||
$css=' * { margin: 0; padding: 0; }
|
||||
body { font-family:sans-serif; background-color: #efefef; padding: 1%; color: #333; }
|
||||
img { max-width: 100%; height: auto; }
|
||||
a { text-decoration: none; color: #000;font-weight:bold; }
|
||||
.header a { text-decoration: none; color: #000;font-weight:bold; }
|
||||
.header { text-align:center; padding: 30px 3%; max-width:70em;margin:0 auto; }
|
||||
.article .title { margin-bottom: 1em; }
|
||||
.article .title h2 a:hover { color:#403976; }
|
||||
.article h4 { font-weight: normal; font-size: small; color: #666; }
|
||||
.article .source a { color: #666; }
|
||||
.searchForm { float:right; }
|
||||
.searchForm input { }
|
||||
.pagination { background-color:white;padding: 12px 10px 12px 10px;border:1px solid #aaa;max-width:70em;margin:1em auto;box-shadow:0px 5px 7px #aaa; }
|
||||
.pagination b { font-size: 1.2em; color: #333; }
|
||||
.pagination a { color:#000; margin: 0 0.5em; }
|
||||
.pagination a:hover { color:#333; }
|
||||
.footer a { color:#000; }
|
||||
.footer a:hover { color:#333; }
|
||||
.content ul, .content ol { margin-left: 2em; }
|
||||
.content h1, .content h2, .content h3, .content h4, .content h5, .content h6,
|
||||
.content ul, .content ol, .content p, .content object, .content div, .content blockquote,
|
||||
.content dl, .content pre { margin-bottom: 0.8em; }
|
||||
.content pre, .content blockquote { background: #ddd; border: 1px solid #999; padding: 0.2em; max-width: 100%; overflow: auto; }
|
||||
.content h1 { font-size: 1.5em; }
|
||||
.content h2 { font-size: 1.4em;color:#000; }
|
||||
.result h3 a { color: darkblue; text-decoration: none; text-shadow: 1px 1px 1px #fff; }
|
||||
#error { position: fixed; top: 0; left: 0; right: 0; padding: 1%; background: #fff; border-bottom: 2px solid red; color: darkred; }
|
||||
=======
|
||||
$css='* { margin: 0; padding: 0; }
|
||||
body { font-family:sans-serif; background-color: #efefef; padding: 1%; color: #333; }
|
||||
img { max-width: 100%; height: auto; }
|
||||
a { text-decoration: none; color: #000;font-weight:bold; }
|
||||
body > header a { text-decoration: none; color: #000;font-weight:bold; }
|
||||
body > header { text-align:center; padding: 30px 3%; max-width:70em;margin:0 auto; }
|
||||
body > article > header { margin-bottom: 1em; }
|
||||
body > article > header h2 a:hover { color:#403976; }
|
||||
body > article h4 { font-weight: normal; font-size: small; color: #666; }
|
||||
body > article .source a { color: #666; }
|
||||
body > header > form { float:right; }
|
||||
body > header > form input { }
|
||||
body > nav { background-color:white;padding: 12px 10px 12px 10px;border:1px solid #aaa;max-width:70em;margin:1em auto;box-shadow:0px 5px 7px #aaa; }
|
||||
body > nav strong { font-size: 1.2em; color: #333; }
|
||||
body > nav a { color:#000; margin: 0 0.5em; }
|
||||
body > nav a:hover { color:#333; }
|
||||
body > footer a { color:#000; }
|
||||
body > footer a:hover { color:#333; }
|
||||
.content ul, .content ol { margin-left: 2em; }
|
||||
.content h1, .content h2, .content h3, .content h4, .content h5, .content h6,
|
||||
.content ul, .content ol, .content p, .content object, .content div, .content blockquote,
|
||||
.content dl, .content pre { margin-bottom: 0.8em; }
|
||||
.content pre, .content blockquote { background: #ddd; border: 1px solid #999; padding: 0.2em; max-width: 100%; overflow: auto; }
|
||||
.content h1 { font-size: 1.5em; }
|
||||
.content h2 { font-size: 1.4em;color:#000; }
|
||||
.result h3 a { color: darkblue; text-decoration: none; text-shadow: 1px 1px 1px #fff; }
|
||||
#error { position: fixed; top: 0; left: 0; right: 0; padding: 1%; background: #fff; border-bottom: 2px solid red; color: darkred; }
|
||||
>>>>>>> master
|
||||
';
|
||||
|
||||
if($site_type == 'generic') // custom CSS for generic
|
||||
{
|
||||
$css = $css.'.header h1 a { color: #333;font-size:40pt;text-shadow: #ccc 0px 5px 5px;text-transform:uppercase; }
|
||||
.article .title h2 { margin: 0; color:#333; text-shadow: 1px 1px 1px #fff; }
|
||||
.article .title h2 a { color:#000; text-decoration:none; }
|
||||
.article .source { font-size: 0.8em; color: #666; }
|
||||
.article { background-color:white;padding: 12px 10px 12px 10px;border:1px solid #aaa;max-width:70em;margin:1em auto;box-shadow:0px 5px 7px #aaa; }
|
||||
.footer { text-align:center; font-size: small; color:#333; clear: both; }';
|
||||
}
|
||||
else if($site_type == 'microblog' || $site_type == 'twitter' || $site_type == 'identica') // custom CSS for microblog
|
||||
{
|
||||
$css = $css.'.header h1 a { color: #333;font-size:40pt;text-shadow: #ccc 0px 5px 5px; }
|
||||
.article .title h2 { width: 10em;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;font-size: 0.7em;margin: 0; color:#333; text-shadow: 1px 1px 1px #fff; }
|
||||
.article .title h2 a { color:#333; text-decoration:none; }
|
||||
.article { background-color:white;padding: 12px 10px 12px 10px;border:1px solid #aaa;max-width:70em;margin:0 auto;box-shadow:0px 5px 7px #aaa; }
|
||||
.article .source { font-size: 0.8em; color: #666; }
|
||||
.footer { margin-top:1em;text-align:center; font-size: small; color:#333; clear: both; }
|
||||
.content {font-size:0.9em;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;}';
|
||||
}
|
||||
else if($site_type == 'shaarli') // custom CSS for shaarli
|
||||
{
|
||||
$css = $css.'.header h1 a { color: #333;font-size:40pt;text-shadow: #ccc 0px 5px 5px; }
|
||||
.article .title h2 { margin: 0; color:#333; text-shadow: 1px 1px 1px #fff; }
|
||||
.article .title h2 a { color:#000; text-decoration:none; }
|
||||
.article { background-color:white;padding: 12px 10px 12px 10px;border:1px solid #aaa;max-width:70em;margin:1em auto;box-shadow:0px 5px 7px #aaa; }
|
||||
.article .source { margin-top:1em;font-size: 0.8em; color: #666; }
|
||||
.footer { text-align:center; font-size: small; color:#333; clear: both; }';
|
||||
}
|
||||
|
||||
switch($site_type) {
|
||||
case 'microblog':
|
||||
case 'twitter':
|
||||
$css .= "\n".' /* twitter/microblog style */
|
||||
body > header h1 a { color: #333;font-size:40pt;text-shadow: #ccc 0px 5px 5px; }
|
||||
body > article > header h2 { width: 10em;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;font-size: 0.7em;margin: 0; color:#333; text-shadow: 1px 1px 1px #fff; }
|
||||
body > article > header h2 a { color:#333; text-decoration:none; }
|
||||
body > article { background-color:white;padding: 12px 10px 33px;border:1px solid #aaa;max-width:70em;margin:0 auto;box-shadow:0px 5px 7px #aaa; }
|
||||
body > article .source { font-size: 0.8em; color: #666; }
|
||||
body > footer { margin-top:1em;text-align:center; font-size: small; color:#333; clear: both; }
|
||||
.content {font-size:0.9em;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;}';
|
||||
break;
|
||||
case 'shaarli':
|
||||
$css .= "\n".' /* shaarli style */
|
||||
body > header h1 a { color: #333;font-size:40pt;text-shadow: #ccc 0px 5px 5px; }
|
||||
body > article > header title h2 { margin: 0; color:#333; text-shadow: 1px 1px 1px #fff; }
|
||||
body > article > header h2 a { color:#000; text-decoration:none; }
|
||||
body > article { background-color:white;padding: 12px 10px 33px;border:1px solid #aaa;max-width:70em;margin:1em auto;box-shadow:0px 5px 7px #aaa; }
|
||||
body > article footer.source { margin-top:1em;font-size: 0.8em; color: #666; }
|
||||
body > footer { text-align:center; font-size: small; color:#333; clear: both; }';
|
||||
break;
|
||||
case 'generic':
|
||||
case 'youtube':
|
||||
default:
|
||||
$css .= "\n".' /* youtube style */
|
||||
body > header h1 a { color: #333;font-size:40pt;text-shadow: #ccc 0px 5px 5px;text-transform:uppercase; }
|
||||
body > article > header h2 { margin: 0; color:#333; text-shadow: 1px 1px 1px #fff; }
|
||||
body > article > header h2 a { color:#000; text-decoration:none; }
|
||||
body > article footer.source { font-size: 0.8em; color: #666; }
|
||||
body > article { background-color:white;padding: 12px 10px 33px;border:1px solid #aaa;max-width:70em;margin:1em auto;box-shadow:0px 5px 7px #aaa; }
|
||||
body > footer { text-align:center; font-size: small; color:#333; clear: both; }';
|
||||
}
|
||||
|
||||
// HTML HEADER
|
||||
echo '
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" dir="ltr">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
echo '<!DOCTYPE html>
|
||||
<html lang="fr" dir="ltr">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" charset="utf-8" />
|
||||
<title>'.escape($config->site_title).'</title>
|
||||
<link rel="canonical" href="'.escape($config->site_url).'">
|
||||
<link rel="alternate" type="application/atom+xml" title="'.__('ATOM Feed').'" href="?feed">
|
||||
<style type="text/css" media="screen,projection">
|
||||
<<<<<<< HEAD
|
||||
'.$css.'
|
||||
</style>
|
||||
</head>
|
||||
|
@ -731,66 +836,111 @@ if (!empty($config->site_description)){
|
|||
echo '<p>'.$config->site_description.'<br><a href="../../">⇐ retour index</a></p>';
|
||||
}
|
||||
echo '<p class="pagination">'.$config->site_meta_description.'<br></p>';
|
||||
||||||| merged common ancestors
|
||||
'.$css.'
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1><a href="../../" style="font-size:0.8em;">PROJET AUTOBLOG'. (strlen(HEAD_TITLE) > 0 ? ' ~ '. HEAD_TITLE : '') .'</a></h1>
|
||||
<hr>
|
||||
<h1><a href="./">'.escape($config->site_title).'</a></h1>';
|
||||
|
||||
if (!empty($config->site_description))
|
||||
echo '<p>'.$config->site_description.'<br><a href="../../">⇐ retour index</a></p>';
|
||||
|
||||
=======
|
||||
'.$css.'
|
||||
</style>';
|
||||
if( $vvb->mustUpdateXsaf()) {
|
||||
echo ' <meta http-equiv="Refresh" content="1">';
|
||||
}
|
||||
echo '
|
||||
<form method="get" action="'.escape(LOCAL_URL).'" class="searchForm">
|
||||
<div>
|
||||
<input type="text" name="q" value="'.escape($search).'">
|
||||
<input type="submit" value="'.__('Search').'">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<h1><a href="../../" style="font-size:0.8em;">PROJET AUTOBLOG'. (strlen(HEAD_TITLE) > 0 ? ' ~ '. HEAD_TITLE : '') .'</a></h1>
|
||||
<hr />
|
||||
<h1><a href="./">'.escape($config->site_title).'</a></h1>';
|
||||
|
||||
if (!empty($config->site_description))
|
||||
echo '
|
||||
<p>'.$config->site_description.'</p>
|
||||
<p><a href="../../">⇐ retour index</a></p>';
|
||||
|
||||
>>>>>>> master
|
||||
echo '
|
||||
<form method="get" action="'.escape(LOCAL_URL).'">
|
||||
<input type="search" name="q" value="'.escape($search).'" />
|
||||
<input type="submit" value="'.__('Search').'" />
|
||||
</form>
|
||||
</header>
|
||||
';
|
||||
|
||||
if ($vvb->mustUpdate())
|
||||
if( $vvb->mustUpdateXsaf()) {
|
||||
echo '
|
||||
<article>
|
||||
<header>
|
||||
<h2>'.__('Update').'</h2>
|
||||
</header>
|
||||
<div class="content" id="update">
|
||||
'.__('Import running: '). $vvb->getXsafCounter() . __(' files remaining').'<br>
|
||||
'.__('The page should refresh every second. If not, <a href="javascript:window.location.reload()">refresh manually</a>.').'
|
||||
</div>
|
||||
</article>';
|
||||
}
|
||||
elseif ($vvb->mustUpdate())
|
||||
{
|
||||
echo '
|
||||
<div class="article">
|
||||
<div class="title">
|
||||
<h2>'.__('Update').'</h2>
|
||||
</div>
|
||||
<div class="content" id="update">
|
||||
'.__('Updating database... Please wait.').'
|
||||
</div>
|
||||
</div>';
|
||||
<article>
|
||||
<header>
|
||||
<h2>'.__('Update').'</h2>
|
||||
</header>
|
||||
<div class="content" id="update">
|
||||
'.__('Updating database... Please wait.').'
|
||||
</div>
|
||||
</article>';
|
||||
}
|
||||
|
||||
if (!empty($search))
|
||||
{
|
||||
$results = $vvb->searchArticles($search);
|
||||
$text = sprintf(__('<b>%d</b> results for <i>%s</i>'), count($results), escape($search));
|
||||
$text = sprintf(__('<strong>%d</strong> results for <em>%s</em>'), count($results), escape($search));
|
||||
echo '
|
||||
<div class="article">
|
||||
<div class="title">
|
||||
<h2>'.__('Search').'</h2>
|
||||
'.$text.'
|
||||
</div>
|
||||
</div>';
|
||||
<article id="results">
|
||||
<header>
|
||||
<h2>'.__('Search').'</h2>
|
||||
'.$text.'
|
||||
</header>
|
||||
<article>';
|
||||
|
||||
foreach ($results as $art)
|
||||
{
|
||||
echo '
|
||||
<div class="article result">
|
||||
<h3><a href="./?'.escape($art['uri']).'">'.escape($art['title']).'</a></h3>
|
||||
<p>'.$art['content'].'</p>
|
||||
</div>';
|
||||
<article class="result">
|
||||
<header>
|
||||
<h3><a href="./?'.escape($art['uri']).'">'.escape($art['title']).'</a></h3>
|
||||
</header>
|
||||
<p>'.$art['content'].'</p>
|
||||
</article>';
|
||||
}
|
||||
}
|
||||
elseif (!is_null($article))
|
||||
{
|
||||
if (!$article)
|
||||
{
|
||||
echo '
|
||||
<div class="article">
|
||||
<div class="title">
|
||||
<h2>'.__('Not Found').'</h2>
|
||||
'.(!empty($uri) ? '<p><tt>'.escape($vvb->getLocalURL($uri)) . '</tt></p>' : '').'
|
||||
'.__('Article not found.').'
|
||||
</div>
|
||||
</div>';
|
||||
echo '
|
||||
<article>
|
||||
<header>
|
||||
<h2>'.__('Not Found').'</h2>
|
||||
'.(!empty($uri) ? '<p><tt>'.escape($vvb->getLocalURL($uri)) . '</tt></p>' : '').'
|
||||
'.__('Article not found.').'
|
||||
</header>
|
||||
</article>';
|
||||
}
|
||||
else
|
||||
{
|
||||
display_article($article);
|
||||
display_article($article);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -808,35 +958,54 @@ else
|
|||
}
|
||||
|
||||
$max = $vvb->countArticles();
|
||||
if ($max > $config->articles_per_page)
|
||||
{
|
||||
echo '<div class="pagination">';
|
||||
if ($max > $config->articles_per_page) {
|
||||
echo "\n".' <nav>'."\n";
|
||||
if ($page > 1)
|
||||
echo ' <a rel="prev" href="'.$vvb->getLocalURL($page - 1).'">← '.__('Newer').'</a>'."\n";
|
||||
|
||||
if ($page > 1)
|
||||
echo '<a href="'.$vvb->getLocalURL($page - 1).'">← '.__('Newer').'</a> ';
|
||||
$last = ceil($max / $config->articles_per_page);
|
||||
for ($i = 1; $i <= $last; $i++) {
|
||||
echo ' '.($i == $page ? '<strong>'.$i.'</strong>' : '<a href="'.$vvb->getLocalURL($i).'">'.$i.'</a>')."\n";
|
||||
}
|
||||
|
||||
$last = ceil($max / $config->articles_per_page);
|
||||
for ($i = 1; $i <= $last; $i++)
|
||||
{
|
||||
echo '<a href="'.$vvb->getLocalURL($i).'">'.($i == $page ? '<b>'.$i.'</b>' : $i).'</a> ';
|
||||
}
|
||||
if ($page < $last)
|
||||
echo ' <a rel="next" href="'.$vvb->getLocalURL($page + 1).'">'.__('Older').' →</a>'."\n";
|
||||
|
||||
if ($page < $last)
|
||||
echo '<a href="'.$vvb->getLocalURL($page + 1).'">'.__('Older').' →</a> ';
|
||||
|
||||
echo '</div>';
|
||||
echo ' </nav>';
|
||||
}
|
||||
}
|
||||
|
||||
echo '
|
||||
<div class="footer">
|
||||
<p>Propulsé par <a href="https://github.com/mitsukarenai/Projet-Autoblog">Projet Autoblog '.$vvbversion.'</a> - <a href="?feed">'.__('ATOM Feed').'</a></p>
|
||||
<p>'.__('Download:').' <a href="./'.basename(CONFIG_FILE).'">'.__('configuration').'</a> (<a href="?opml">OPML</a>)
|
||||
- <a href="./'.basename(ARTICLES_DB_FILE).'">'.__('articles').'</a><p/>
|
||||
<p><a href="./?media">'.__('Media export').' <sup> JSON</sup></a></p>
|
||||
</div>';
|
||||
<footer>
|
||||
<p>Propulsé par <a href="https://github.com/mitsukarenai/Projet-Autoblog">Projet Autoblog '.$vvbversion.'</a> - <a href="?feed">'.__('ATOM Feed').'</a></p>
|
||||
<p>'.__('Download:').' <a href="./'.basename(CONFIG_FILE).'">'.__('configuration').'</a> (<a href="?opml">OPML</a>)
|
||||
— <a href="./'.basename(ARTICLES_DB_FILE).'">'.__('articles').'</a></p>
|
||||
<p><a href="./?media">'.__('Media export').' <sup> JSON</sup></a></p>
|
||||
</footer>';
|
||||
|
||||
if ($vvb->mustUpdate())
|
||||
if( $vvb->mustUpdateXsaf() ) {
|
||||
try {
|
||||
ob_end_flush();
|
||||
flush();
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
// Silent, not critical
|
||||
}
|
||||
|
||||
try {
|
||||
$updated = $vvb->updateXsaf();
|
||||
}
|
||||
catch (VroumVroum_Feed_Exception $e)
|
||||
{
|
||||
echo '
|
||||
<div id="error">
|
||||
'.escape($e->getMessage()).'
|
||||
</div>';
|
||||
$updated = 0;
|
||||
}
|
||||
}
|
||||
elseif ($vvb->mustUpdate())
|
||||
{
|
||||
try {
|
||||
ob_end_flush();
|
||||
|
@ -853,34 +1022,34 @@ if ($vvb->mustUpdate())
|
|||
catch (VroumVroum_Feed_Exception $e)
|
||||
{
|
||||
echo '
|
||||
<div id="error">
|
||||
<div id="error">
|
||||
'.escape($e->getMessage()).'
|
||||
</div>';
|
||||
</div>';
|
||||
$updated = 0;
|
||||
}
|
||||
|
||||
if ($updated > 0)
|
||||
{
|
||||
echo '
|
||||
<script type="text/javascript">
|
||||
window.onload = function () {
|
||||
document.getElementById("update").innerHTML = "'.__('Update complete!').' <a href=\\"#reload\\" onclick=\\"window.location.reload();\\">'.__('Click here to reload this webpage.').'</a>";
|
||||
};
|
||||
</script>';
|
||||
<script type="text/javascript">
|
||||
window.onload = function () {
|
||||
document.getElementById("update").innerHTML = "'.__('Update complete!').' <a href=\\"#reload\\" onclick=\\"window.location.reload();\\">'.__('Click here to reload this webpage.').'</a>";
|
||||
};
|
||||
</script>';
|
||||
}
|
||||
else
|
||||
{
|
||||
echo '
|
||||
<script type="text/javascript">
|
||||
window.onload = function () {
|
||||
document.body.removeChild(document.getElementById("update").parentNode);
|
||||
};
|
||||
</script>';
|
||||
<script type="text/javascript">
|
||||
window.onload = function () {
|
||||
document.body.removeChild(document.getElementById("update").parentNode);
|
||||
};
|
||||
</script>';
|
||||
}
|
||||
}
|
||||
|
||||
echo '
|
||||
</body>
|
||||
</body>
|
||||
</html>';
|
||||
|
||||
|
||||
|
@ -896,15 +1065,14 @@ function display_article($article)
|
|||
{
|
||||
global $vvb, $config;
|
||||
echo '
|
||||
<div class="article">
|
||||
<div class="title">
|
||||
<h2><a href="'.$vvb->getLocalURL($article).'">'.escape($article['title']).'</a></h2>
|
||||
'.strftime(__('_date_format'), $article['date']).'
|
||||
</div>
|
||||
<div class="content">'.escape_content($article['content']).'</div>
|
||||
<p class="source">'.__('Source:').' <a href="'.escape($article['url']).'">'.escape($article['url']).'</a></p>
|
||||
<br style="clear: both;" />
|
||||
</div>';
|
||||
<article>
|
||||
<header>
|
||||
<h2><a href="'.$vvb->getLocalURL($article).'">'.escape($article['title']).'</a></h2>
|
||||
'.strftime(__('_date_format'), $article['date']).'
|
||||
</header>
|
||||
<div class="content">'.escape_content($article['content']).'</div>
|
||||
<footer class="source"><p>'.__('Source:').' <a href="'.escape($article['url']).'">'.escape($article['url']).'</a></p></footer>
|
||||
</article>';
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
46
config.php
|
@ -1,46 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* config.php - User configuration file
|
||||
* ---
|
||||
* If you uncomment a setting in this file, it will override default option
|
||||
*
|
||||
* See how to configure your Autoblog farm at
|
||||
* https://github.com/mitsukarenai/Projet-Autoblog/wiki/Configuration
|
||||
**/
|
||||
|
||||
// define( 'LOGO', 'icon-logo.svg' );
|
||||
// define( 'HEAD_TITLE', '');
|
||||
// define( 'FOOTER', 'D\'après les premières versions de <a href="http://sebsauvage.net">SebSauvage</a> et <a href="http://bohwaz.net/">Bohwaz</a>.');
|
||||
|
||||
define( 'ALLOW_FULL_UPDATE', TRUE );
|
||||
define( 'ALLOW_CHECK_UPDATE', TRUE );
|
||||
|
||||
/**
|
||||
* If you set ALLOW_NEW_AUTOBLOGS to FALSE, the following options do not matter.
|
||||
**/
|
||||
define( 'ALLOW_NEW_AUTOBLOGS', false );
|
||||
// define( 'ALLOW_NEW_AUTOBLOGS_BY_LINKS', TRUE );
|
||||
// define( 'ALLOW_NEW_AUTOBLOGS_BY_SOCIAL', TRUE );
|
||||
// define( 'ALLOW_NEW_AUTOBLOGS_BY_BUTTON', TRUE );
|
||||
// define( 'ALLOW_NEW_AUTOBLOGS_BY_OPML_FILE', TRUE );
|
||||
// define( 'ALLOW_NEW_AUTOBLOGS_BY_OPML_LINK', TRUE );
|
||||
// define( 'ALLOW_NEW_AUTOBLOGS_BY_XSAF', TRUE );
|
||||
|
||||
/**
|
||||
* More about TwitterBridge : https://github.com/mitsukarenai/twitterbridge
|
||||
**/
|
||||
// define( 'API_TWITTER', FALSE );
|
||||
|
||||
/**
|
||||
* Import autoblogs from friend's autoblog farm - Add a link to the JSON export
|
||||
**/
|
||||
$friends_autoblog_farm = array(
|
||||
'https://raw.github.com/mitsukarenai/xsaf-bootstrap/master/3.json',
|
||||
'https://www.ecirtam.net/autoblogs/?export',
|
||||
'https://autoblog.suumitsu.eu/?export',
|
||||
'http://streisand.hoa.ro/?export'
|
||||
);
|
||||
|
||||
$myOptions['enableThumbShot'] = true;
|
||||
$myOptions['externalThumbSdhot'] = 'http://soshot.knah-tsaeb.org/?key=3400affe9919&s=m&url=';
|
||||
?>
|
57
config.php.example
Normal file
|
@ -0,0 +1,57 @@
|
|||
<?php
|
||||
/**
|
||||
* config.php.example - User configuration file
|
||||
* ---
|
||||
* 1. Rename this file to config.php.
|
||||
* 2. Uncomment settings in this file, it will override default option
|
||||
*
|
||||
* See how to configure your Autoblog farm at
|
||||
* https://github.com/mitsukarenai/Projet-Autoblog/wiki/Configuration
|
||||
**/
|
||||
|
||||
// define( 'LOGO', 'icon-logo.svg' );
|
||||
// define( 'HEAD_TITLE', '');
|
||||
// define( 'FOOTER', 'D\'après les premières versions de <a href="http://sebsauvage.net">SebSauvage</a> et <a href="http://bohwaz.net/">Bohwaz</a>.');
|
||||
|
||||
// define( 'DOCS_CACHE_DURATION', 1800);
|
||||
// define( 'AUTOBLOGS_CACHE_DURATION', 1800);
|
||||
|
||||
// define( 'ALLOW_FULL_UPDATE', TRUE );
|
||||
// define( 'ALLOW_CHECK_UPDATE', TRUE );
|
||||
|
||||
/**
|
||||
* If you set ALLOW_NEW_AUTOBLOGS to FALSE, the following options do not matter.
|
||||
**/
|
||||
// define( 'ALLOW_NEW_AUTOBLOGS', TRUE );
|
||||
// define( 'ALLOW_NEW_AUTOBLOGS_BY_LINKS', TRUE );
|
||||
// define( 'ALLOW_NEW_AUTOBLOGS_BY_SOCIAL', TRUE );
|
||||
// define( 'ALLOW_NEW_AUTOBLOGS_BY_BUTTON', TRUE );
|
||||
// define( 'ALLOW_NEW_AUTOBLOGS_BY_OPML_FILE', TRUE );
|
||||
// define( 'ALLOW_NEW_AUTOBLOGS_BY_OPML_LINK', TRUE );
|
||||
// define( 'ALLOW_NEW_AUTOBLOGS_BY_XSAF', TRUE );
|
||||
|
||||
/**
|
||||
* TwitterBridge: https://github.com/mitsukarenai/twitterbridge
|
||||
* twitter2feed : https://github.com/mitsukarenai/twitter2feed
|
||||
* rss-bridge : https://github.com/sebsauvage/rss-bridge
|
||||
* replace LOCAL with:
|
||||
- the twitterbridge request URL (example: 'http://www.some.website/twitterbridge/?u=' )
|
||||
- or the rss-bridge request URL (example: 'http://www.some.website/rss-bridge/?action=display&bridge=TwitterBridge&format=AtomFormat&u=' )
|
||||
- or leave LOCAL to use the included twitter2feed.php.
|
||||
* set to FALSE if you want to fully disable Twitter support
|
||||
**/
|
||||
// define( 'API_TWITTER', 'LOCAL' );
|
||||
|
||||
/**
|
||||
* Import autoblogs from friend's autoblog farm - Add a link to the JSON export
|
||||
**/
|
||||
$friends_autoblog_farm = array(
|
||||
'https://raw.github.com/mitsukarenai/xsaf-bootstrap/master/3.json',
|
||||
// 'https://www.ecirtam.net/autoblogs/?export',
|
||||
// 'http://autoblog.suumitsu.eu/?export',
|
||||
// 'http://streisand.hoa.ro/?export',
|
||||
);
|
||||
|
||||
$myOptions['enableThumbShot'] = true;
|
||||
$myOptions['externalThumbSdhot'] = 'http://soshot.knah-tsaeb.org/?key=apikey&s=m&url=';
|
||||
?>
|
|
@ -16,6 +16,9 @@ if (!defined('FOLDER_MAX_LENGTH')) define('FOLDER_MAX_LENGTH', 80);
|
|||
date_default_timezone_set('Europe/Paris');
|
||||
setlocale(LC_TIME, 'fr_FR.UTF-8', 'fr_FR', 'fr');
|
||||
|
||||
if( !defined('DOCS_CACHE_DURATION')) define( 'DOCS_CACHE_DURATION', 1800 );
|
||||
if( !defined('AUTOBLOGS_CACHE_DURATION')) define( 'AUTOBLOGS_CACHE_DURATION', 1800 );
|
||||
|
||||
if( !defined('ALLOW_FULL_UPDATE')) define( 'ALLOW_FULL_UPDATE', TRUE );
|
||||
if( !defined('ALLOW_CHECK_UPDATE')) define( 'ALLOW_CHECK_UPDATE', TRUE );
|
||||
|
||||
|
@ -29,7 +32,7 @@ if( !defined('ALLOW_NEW_AUTOBLOGS_BY_OPML_LINK')) define( 'ALLOW_NEW_AUTOBLOGS_B
|
|||
if( !defined('ALLOW_NEW_AUTOBLOGS_BY_XSAF')) define( 'ALLOW_NEW_AUTOBLOGS_BY_XSAF', TRUE );
|
||||
|
||||
// More about TwitterBridge : https://github.com/mitsukarenai/twitterbridge
|
||||
if( !defined('API_TWITTER')) define( 'API_TWITTER', FALSE );
|
||||
if( !defined('API_TWITTER')) define( 'API_TWITTER', 'LOCAL' );
|
||||
|
||||
if( !defined('LOGO')) define( 'LOGO', 'icon-logo.svg' );
|
||||
if( !defined('HEAD_TITLE')) define( 'HEAD_TITLE', '');
|
||||
|
@ -39,7 +42,7 @@ if( !defined('FOOTER')) define( 'FOOTER', 'D\'après les premières versions de
|
|||
* Functions
|
||||
**/
|
||||
function NoProtocolSiteURL($url) {
|
||||
$protocols = array("http://", "https://");
|
||||
$protocols = array("http://", "https://");
|
||||
$siteurlnoproto = str_replace($protocols, "", $url);
|
||||
|
||||
// Remove the / at the end of string
|
||||
|
@ -158,8 +161,12 @@ function getArticlesPerPage( $type ) {
|
|||
switch( $type ) {
|
||||
case 'microblog':
|
||||
return 20;
|
||||
case 'twitter':
|
||||
return 20;
|
||||
case 'shaarli':
|
||||
return 20;
|
||||
case 'youtube':
|
||||
return 10;
|
||||
default:
|
||||
return 5;
|
||||
}
|
||||
|
@ -169,6 +176,8 @@ function getInterval( $type ) {
|
|||
switch( $type ) {
|
||||
case 'microblog':
|
||||
return 300;
|
||||
case 'twitter':
|
||||
return 300;
|
||||
case 'shaarli':
|
||||
return 1800;
|
||||
default:
|
||||
|
@ -178,10 +187,6 @@ function getInterval( $type ) {
|
|||
|
||||
function getTimeout( $type ) {
|
||||
switch( $type ) {
|
||||
case 'microblog':
|
||||
return 30;
|
||||
case 'shaarli':
|
||||
return 30;
|
||||
default:
|
||||
return 30;
|
||||
}
|
||||
|
@ -191,12 +196,12 @@ function updateType($siteurl) {
|
|||
if( strpos($siteurl, 'twitter.com') !== FALSE ) {
|
||||
return array('type' => 'twitter', 'name' => 'twitter');
|
||||
}
|
||||
elseif ( strpos( $siteurl, 'identi.ca') !== FALSE ) {
|
||||
return array('type' => 'identica', 'name' => 'identica');
|
||||
}
|
||||
elseif( strpos( $siteurl, 'shaarli' ) !== FALSE ) {
|
||||
return array('type' => 'shaarli', 'name' => 'shaarli');
|
||||
}
|
||||
elseif( strpos( $siteurl, 'youtube.com' ) !== FALSE ) {
|
||||
return array('type' => 'youtube', 'name' => '');
|
||||
}
|
||||
else
|
||||
return array('type' => 'generic', 'name' => '');
|
||||
}
|
||||
|
@ -256,11 +261,14 @@ function __($str)
|
|||
return 'Source :';
|
||||
case '_date_format':
|
||||
return '%A %e %B %Y à %H:%M';
|
||||
case 'configuration':
|
||||
case 'articles':
|
||||
return $str;
|
||||
case 'Media export':
|
||||
return 'Export fichiers media';
|
||||
case 'Import running: ':
|
||||
return 'Import en cours : ';
|
||||
case ' files remaining':
|
||||
return ' fichiers restants';
|
||||
case 'The page should refresh every second. If not, <a href="javascript:window.location.reload()">refresh manually</a>.':
|
||||
return 'La page devrait se rafraîchir toutes les secondes. Si non, <a href="javascript:window.location.reload()">rafraîchissez là manuellement.</a>.';
|
||||
default:
|
||||
return $str;
|
||||
}
|
||||
|
@ -278,6 +286,7 @@ $json[] = array(
|
|||
'status'=>$status,
|
||||
'response_code'=>$response_code
|
||||
);
|
||||
$json = array_slice($json, -50, 50);
|
||||
if(file_put_contents(RESOURCES_FOLDER.'rss.json', json_encode($json), LOCK_EX) === FALSE)
|
||||
{ return FALSE; }
|
||||
else { return TRUE; }
|
||||
|
@ -287,47 +296,52 @@ function displayXMLstatus($status, $response_code, $autoblog_url, $autoblog_titl
|
|||
switch ($status)
|
||||
{
|
||||
case 'unavailable':
|
||||
return 'Autoblog "'.$autoblog_title.'": site distant inaccessible (code '.$response_code.')<br>Autoblog: <a href="'. serverUrl(false).AUTOBLOGS_FOLDER.$autoblog_url.'">'.$autoblog_title.'</a><br>Site: <a href="'. $autoblog_sourceurl .'">'. $autoblog_sourceurl .'</a><br>RSS: <a href="'.$autoblog_sourcefeed.'">'.$autoblog_sourcefeed.'</a>';
|
||||
return 'Autoblog "'.$autoblog_title.'" : site distant inaccessible (code '.$response_code.')<br>Autoblog : <a href="'. serverUrl(true).$autoblog_url.'">'.$autoblog_title.'</a><br>Site : <a href="'. $autoblog_sourceurl .'">'. $autoblog_sourceurl .'</a><br>RSS : <a href="'.$autoblog_sourcefeed.'">'.$autoblog_sourcefeed.'</a>';
|
||||
case 'moved':
|
||||
return 'Autoblog "'.$autoblog_title.'": site distant redirigé (code '.$response_code.')<br>Autoblog: <a href="'. serverUrl(false).AUTOBLOGS_FOLDER.$autoblog_url.'">'.$autoblog_title.'</a><br>Site: <a href="'. $autoblog_sourceurl .'">'. $autoblog_sourceurl .'</a><br>RSS: <a href="'.$autoblog_sourcefeed.'">'.$autoblog_sourcefeed.'</a>';
|
||||
return 'Autoblog "'.$autoblog_title.'" : site distant redirigé (code '.$response_code.')<br>Autoblog : <a href="'. serverUrl(true).$autoblog_url.'">'.$autoblog_title.'</a><br>Site : <a href="'. $autoblog_sourceurl .'">'. $autoblog_sourceurl .'</a><br>RSS : <a href="'.$autoblog_sourcefeed.'">'.$autoblog_sourcefeed.'</a>';
|
||||
case 'not_found':
|
||||
return 'Autoblog "'.$autoblog_title.'": site distant introuvable (code '.$response_code.')<br>Autoblog: <a href="'. serverUrl(false).AUTOBLOGS_FOLDER.$autoblog_url.'">'.$autoblog_title.'</a><br>Site: <a href="'. $autoblog_sourceurl .'">'. $autoblog_sourceurl .'</a><br>RSS: <a href="'.$autoblog_sourcefeed.'">'.$autoblog_sourcefeed.'</a>';
|
||||
return 'Autoblog "'.$autoblog_title.'" : site distant introuvable (code '.$response_code.')<br>Autoblog : <a href="'. serverUrl(true).$autoblog_url.'">'.$autoblog_title.'</a><br>Site : <a href="'. $autoblog_sourceurl .'">'. $autoblog_sourceurl .'</a><br>RSS : <a href="'.$autoblog_sourcefeed.'">'.$autoblog_sourcefeed.'</a>';
|
||||
case 'remote_error':
|
||||
return 'Autoblog "'.$autoblog_title.'": site distant a problème serveur (code '.$response_code.')<br>Autoblog: <a href="'. serverUrl(false).AUTOBLOGS_FOLDER.$autoblog_url.'">'.$autoblog_title.'</a><br>Site: <a href="'. $autoblog_sourceurl .'">'. $autoblog_sourceurl .'</a><br>RSS: <a href="'.$autoblog_sourcefeed.'">'.$autoblog_sourcefeed.'</a>';
|
||||
return 'Autoblog "'.$autoblog_title.'" : site distant a problème serveur (code '.$response_code.')<br>Autoblog : <a href="'. serverUrl(true).$autoblog_url.'">'.$autoblog_title.'</a><br>Site : <a href="'. $autoblog_sourceurl .'">'. $autoblog_sourceurl .'</a><br>RSS : <a href="'.$autoblog_sourcefeed.'">'.$autoblog_sourcefeed.'</a>';
|
||||
case 'available':
|
||||
return 'Autoblog "'.$autoblog_title.'": site distant à nouveau opérationnel (code '.$response_code.')<br>Autoblog: <a href="'. serverUrl(false).AUTOBLOGS_FOLDER.$autoblog_url.'">'.$autoblog_title.'</a><br>Site: <a href="'. $autoblog_sourceurl .'">'. $autoblog_sourceurl .'</a><br>RSS: <a href="'.$autoblog_sourcefeed.'">'.$autoblog_sourcefeed.'</a>';
|
||||
return 'Autoblog "'.$autoblog_title.'" : site distant à nouveau accessible (code '.$response_code.')<br>Autoblog : <a href="'. serverUrl(true).$autoblog_url.'">'.$autoblog_title.'</a><br>Site : <a href="'. $autoblog_sourceurl .'">'. $autoblog_sourceurl .'</a><br>RSS : <a href="'.$autoblog_sourcefeed.'">'.$autoblog_sourcefeed.'</a>';
|
||||
case 'new_autoblog_added':
|
||||
return 'Autoblog "'.$autoblog_title.'" ajouté (code '.$response_code.')<br>Autoblog: <a href="'. serverUrl(false).AUTOBLOGS_FOLDER.$autoblog_url.'">'.$autoblog_title.'</a><br>Site: <a href="'. $autoblog_sourceurl .'">'. $autoblog_sourceurl .'</a><br>RSS: <a href="'.$autoblog_sourcefeed.'">'.$autoblog_sourcefeed.'</a>';
|
||||
return 'Autoblog "'.$autoblog_title.'" ajouté.<br>Autoblog : <a href="'. serverUrl(true).$autoblog_url.'">'.$autoblog_title.'</a><br>Site : <a href="'. $autoblog_sourceurl .'">'. $autoblog_sourceurl .'</a><br>RSS : <a href="'.$autoblog_sourcefeed.'">'.$autoblog_sourcefeed.'</a>';
|
||||
}
|
||||
}
|
||||
|
||||
function displayXML() {
|
||||
header('Content-type: application/rss+xml; charset=utf-8');
|
||||
echo '<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><link>'.serverUrl(true).'</link>';
|
||||
echo '<atom:link href="'.serverUrl(false) . '/?rss" rel="self" type="application/rss+xml"/><title>Projet Autoblog'. ((strlen(HEAD_TITLE)>0) ? ' | '. HEAD_TITLE : '').'</title><description>'.serverUrl(true),"Projet Autoblog - RSS : Ajouts et changements de disponibilité.".'</description>';
|
||||
if(file_exists(RESOURCES_FOLDER.'rss.json'))
|
||||
{
|
||||
$json = json_decode(file_get_contents(RESOURCES_FOLDER.'rss.json'), true);
|
||||
rsort($json);
|
||||
foreach ($json as $item)
|
||||
header('Content-type: application/rss+xml; charset=utf-8');
|
||||
echo '<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><link>'.serverUrl(true).'</link>';
|
||||
echo '<atom:link href="'.serverUrl(true) . '/?rss" rel="self" type="application/rss+xml"/><title>Projet Autoblog'. ((strlen(HEAD_TITLE)>0) ? ' | '. HEAD_TITLE : '').'</title><description>Projet Autoblog - RSS : Ajouts et changements de disponibilité.</description>';
|
||||
if(file_exists(RESOURCES_FOLDER.'rss.json'))
|
||||
{
|
||||
$description = displayXMLstatus($item['status'],$item['response_code'],$item['autoblog_url'],$item['autoblog_title'],$item['autoblog_sourceurl'],$item['autoblog_sourcefeed']);
|
||||
$link = serverUrl(true).AUTOBLOGS_FOLDER.$item['autoblog_url'];
|
||||
$date = date("r", $item['timestamp']);
|
||||
print <<<EOT
|
||||
$json = json_decode(file_get_contents(RESOURCES_FOLDER.'rss.json'), true);
|
||||
rsort($json);
|
||||
foreach ($json as $uitem)
|
||||
{
|
||||
$item = array();
|
||||
foreach($uitem AS $Key => $Value) {
|
||||
$item[$Key] = escape($Value);
|
||||
}
|
||||
|
||||
$description = displayXMLstatus($item['status'],$item['response_code'],$item['autoblog_url'],$item['autoblog_title'],$item['autoblog_sourceurl'],$item['autoblog_sourcefeed']);
|
||||
$link = serverUrl(true).$item['autoblog_url'];
|
||||
$date = date(DATE_RSS, $item['timestamp']);
|
||||
print <<<EOT
|
||||
|
||||
<item>
|
||||
<title>{$item['autoblog_title']}</title>
|
||||
<description><![CDATA[{$description}]]></description>
|
||||
<link>{$link}</link>
|
||||
<guid isPermaLink="false">{$item['timestamp']}</guid>
|
||||
<author>admin@{$_SERVER['SERVER_NAME']}</author>
|
||||
<dc:creator>Autoblog</dc:creator>
|
||||
<pubDate>{$date}</pubDate>
|
||||
</item>
|
||||
EOT;
|
||||
}
|
||||
}
|
||||
}
|
||||
echo '</channel></rss>';
|
||||
echo '</channel></rss>';
|
||||
}
|
||||
?>
|
||||
|
|
|
@ -9,40 +9,42 @@
|
|||
body {background-color:#efefef;text-align:center;color:#333;font-family:sans-serif;}
|
||||
a {color:black;text-decoration:none;font-weight:bold;}
|
||||
a:hover {color:darkred;}
|
||||
h1 {text-align:center;font-size:40pt;text-shadow: #ccc 0px 5px 5px;}
|
||||
h1 {text-transform:uppercase;text-align:center;font-size:40pt;text-shadow: #ccc 0px 5px 5px;}
|
||||
h2 {text-align:center;font-size: 16pt;margin:0 0 1em 0;font-style:italic;text-shadow: #ccc 0px 5px 5px; }
|
||||
.pbloc {background-color:white;padding: 12px 10px 12px 10px;border:1px solid #aaa;max-width:70em;margin:1em auto;text-align:justify;box-shadow:0px 5px 7px #aaa;}
|
||||
body > section {background-color:white;padding: 12px 10px 12px 10px;border:1px solid #aaa;max-width:70em;margin:1em auto;text-align:justify;box-shadow:0px 5px 7px #aaa;}
|
||||
li {list-style-type:none;}
|
||||
input[type="text"]{width:20em;}
|
||||
input[type="radio"] {width:1em;}
|
||||
input[type="submit"] {width:8em;}
|
||||
div.form {padding:0.2em;border:1px solid #fff;}
|
||||
div.form:hover {background-color:#FAF4DA;border:1px dotted;}
|
||||
#contentVignette {text-align: center;}
|
||||
.vignette {width:27%;height:2em;display: inline-block;text-align:justify;margin:0; padding:20px;background-color:#eee;border: 1px solid #888;}
|
||||
.vignette:hover {background-color:#fff;}
|
||||
.vignette .title {font-size: 14pt;text-shadow: #ccc 0px 5px 5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
|
||||
.vignette .title a:hover {color:darkred; text-decoration:none;}
|
||||
.vignette .source {font-size:x-small;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
|
||||
.vignette .source a:hover {color:darkred; text-decoration:none;}
|
||||
section.form {padding:0.2em;border:1px solid #fff;}
|
||||
section.form:hover {background-color:#FAF4DA;border:1px dotted;}
|
||||
section#autoblogs > ul {text-align: center;padding:0;}
|
||||
section#autoblogs > ul > li {width:27%;height:2em;display: inline-block;text-align:justify;margin:0; padding:20px;background-color:#eee;border: 1px solid #888;}
|
||||
section#autoblogs > ul > li:hover {background-color:#fff;}
|
||||
section#autoblogs > ul > li header, section#autoblogs > ul > li h3 {font-size: large;text-shadow: #ccc 0px 5px 5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
|
||||
section#autoblogs > ul > li h3 {display:inline;font-size:large;text-overflow:ellipsis;width:100%;}
|
||||
section#autoblogs > ul > li header a:hover {color:darkred; text-decoration:none;}
|
||||
section#autoblogs > ul > li .source {font-size:x-small;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
|
||||
section#autoblogs > ul > li .source a:hover {color:darkred; text-decoration:none;}
|
||||
.clear {clear:both;text-align:right;font-size:small;}
|
||||
#logo {float: right;}
|
||||
.bouton{background: -moz-linear-gradient(center top , #EDEDED 5%, #DFDFDF 100%) repeat scroll 0 0 #EDEDED;border: 1px none;padding: 10px;border: 1px solid #7777777;border-radius: 8px 8px 8px 8px;box-shadow: 0 1px 0 0 #FFFFFF inset;display: inline-block;}
|
||||
.bouton{border: 1px none;padding: 10px;border: 1px solid #777777;border-radius: 8px 8px 8px 8px;box-shadow: 0 1px 0 0 #FFFFFF inset;display: inline-block;}
|
||||
.success {color: green;}
|
||||
.error {color: red;}
|
||||
.button_list{display:none;}
|
||||
.button{-moz-box-shadow:inset 0 1px 0 0 #d9fbbe;-webkit-box-shadow:inset 0 1px 0 0 #d9fbbe;box-shadow:inset 0 1px 0 0 #d9fbbe;background:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b8e356',endColorstr='#a5cc52');background-color:#b8e356;-moz-border-radius:6px;-webkit-border-radius:6px;border-radius:6px;border:1px solid #83c41a;display:inline-block;color:#fff;font-family:arial;font-size:14px;font-weight:700;text-decoration:none;text-shadow:1px 1px 0 #86ae47;padding:6px 24px;}
|
||||
.button:hover{background:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#a5cc52',endColorstr='#b8e356');background-color:#a5cc52;}
|
||||
.button{box-shadow:inset 0 1px 0 0 #d9fbbe;background:0;background-color:#b8e356;border-radius:6px;border:1px solid #83c41a;display:inline-block;color:#fff;font-family:arial;font-size:14px;font-weight:700;text-decoration:none;text-shadow:1px 1px 0 #86ae47;padding:6px 24px;}
|
||||
.button:hover{background:0;background-color:#a5cc52;}
|
||||
.button:active{position:relative;top:1px;}
|
||||
.buttonactive{background-color:#aaa;-moz-border-radius:6px;-webkit-border-radius:6px;border-radius:6px;border:1px solid #83c41a;display:inline-block;color:#fff;font-family:arial;font-size:14px;font-weight:700;text-decoration:none;text-shadow:1px 1px 0 #86ae47;padding:6px 24px;}
|
||||
.buttonactive{background-color:#aaa;border-radius:6px;border:1px solid #83c41a;display:inline-block;color:#fff;font-family:arial;font-size:14px;font-weight:700;text-decoration:none;text-shadow:1px 1px 0 #86ae47;padding:6px 24px;}
|
||||
@media screen and (max-width:1024px) {
|
||||
.vignette { width: 40%; }
|
||||
section#autoblogs > ul > li { width: 40%; }
|
||||
}
|
||||
@media screen and (max-width:640px) {
|
||||
h1 { font-size:20pt; }
|
||||
.button, .button:hover, .button:active, .buttonactive { display: block; margin: auto; text-align:center; }
|
||||
.vignette { width: 80%; }
|
||||
section#autoblogs > ul > li { width: 80%; }
|
||||
}
|
||||
@media screen and (max-width:480px) {
|
||||
#logo { max-width: 250px; }
|
||||
input[type="text"]{width:15em;}
|
||||
}
|
||||
}
|
||||
|
|
1
resources/icon-generic.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15"><circle cx="7.5" cy="7.5" r="4" style="stroke:#000;fill:none;stroke-width:4" /></svg>
|
After Width: | Height: | Size: 149 B |
BIN
resources/icon-logo.png
Normal file
After Width: | Height: | Size: 2.9 KiB |
|
@ -1,218 +1,64 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.1"
|
||||
width="300"
|
||||
height="180"
|
||||
id="svg2">
|
||||
<defs
|
||||
id="defs4" />
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer5">
|
||||
<g
|
||||
id="text2990-7"
|
||||
style="font-size:19.98827362px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans Mono;-inkscape-font-specification:Droid Sans Mono">
|
||||
<path
|
||||
d="m 106.42552,68.920204 -1.71775,0 0,-8.910788 c 0,-0.793795 0.026,-1.968235 0.0781,-3.523323 -0.25376,0.279795 -0.64741,0.647418 -1.18095,1.102868 l -1.4347,1.180948 -0.94671,-1.200468 3.73804,-2.91821 1.46399,0 0,14.268973"
|
||||
id="path3056" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(-0.96800707,0.25092291,-0.25092291,-0.96800707,0,0)"
|
||||
id="text2990-7-4"
|
||||
style="font-size:19.98827362px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans Mono;-inkscape-font-specification:Droid Sans Mono">
|
||||
<path
|
||||
d="m -83.665748,-114.1049 -1.717742,0 0,-8.91078 c -6e-6,-0.7938 0.02602,-1.96824 0.07808,-3.52333 -0.253763,0.2798 -0.647411,0.64742 -1.180947,1.10287 l -1.434706,1.18095 -0.94671,-1.20047 3.738042,-2.91821 1.463984,0 0,14.26897"
|
||||
id="path3059" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(0.91697723,-0.39893955,0.39893955,0.91697723,0,0)"
|
||||
id="text2990-7-9"
|
||||
style="font-size:19.98827362px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans Mono;-inkscape-font-specification:Droid Sans Mono">
|
||||
<path
|
||||
d="m 63.170327,105.14977 -1.717742,0 0,-8.910785 c -6e-6,-0.793796 0.02602,-1.968236 0.07808,-3.523324 -0.253763,0.279796 -0.647412,0.647418 -1.180948,1.102869 l -1.434705,1.180947 -0.94671,-1.200467 3.738041,-2.91821 1.463985,0 0,14.26897"
|
||||
id="path3062" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(-0.59314555,-0.80509524,0.80509524,-0.59314555,0,0)"
|
||||
id="text2990-7-5"
|
||||
style="font-size:19.98827362px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans Mono;-inkscape-font-specification:Droid Sans Mono">
|
||||
<path
|
||||
d="m -126.66057,27.239197 -1.71775,0 0,-8.910788 c 0,-0.793796 0.026,-1.968236 0.0781,-3.523324 -0.25376,0.279796 -0.64741,0.647419 -1.18095,1.102869 l -1.4347,1.180948 -0.94671,-1.200468 3.73804,-2.91821 1.46399,0 0,14.268973"
|
||||
id="path3065" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(0.31319215,-0.94968978,0.94968978,0.31319215,0,0)"
|
||||
id="text2990-7-81"
|
||||
style="font-size:19.98827362px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans Mono;-inkscape-font-specification:Droid Sans Mono">
|
||||
<path
|
||||
d="m -41.445109,113.0434 -1.717743,0 0,-8.91078 c -5e-6,-0.7938 0.02602,-1.96824 0.07808,-3.52333 -0.253763,0.2798 -0.647412,0.64742 -1.180948,1.10287 l -1.434705,1.18095 -0.946711,-1.20047 3.738042,-2.918209 1.463985,0 0,14.268969"
|
||||
id="path3068" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(-0.26611424,-0.9639415,0.9639415,-0.26611424,0,0)"
|
||||
id="text2990-7-99"
|
||||
style="font-size:19.98827362px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans Mono;-inkscape-font-specification:Droid Sans Mono">
|
||||
<path
|
||||
d="m -101.83545,68.705475 -1.71774,0 0,-8.910788 c -1e-5,-0.793796 0.026,-1.968236 0.0781,-3.523324 -0.25376,0.279796 -0.64741,0.647419 -1.18095,1.102869 l -1.4347,1.180948 -0.94671,-1.200468 3.73804,-2.91821 1.46398,0 0,14.268973"
|
||||
id="path3071" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(-0.66389743,0.74782364,-0.74782364,-0.66389743,0,0)"
|
||||
id="text2990-7-0"
|
||||
style="font-size:19.98827362px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans Mono;-inkscape-font-specification:Droid Sans Mono">
|
||||
<path
|
||||
d="m -10.770921,-142.41505 -1.717742,0 0,-8.91079 c -6e-6,-0.7938 0.02602,-1.96824 0.07808,-3.52333 -0.253763,0.2798 -0.647412,0.64742 -1.180948,1.10287 l -1.434705,1.18095 -0.94671,-1.20047 3.738041,-2.91821 1.463985,0 0,14.26898"
|
||||
id="path3074" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(0.61642924,0.78741031,-0.78741031,0.61642924,0,0)"
|
||||
id="text2990-7-47"
|
||||
style="font-size:19.98827362px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans Mono;-inkscape-font-specification:Droid Sans Mono">
|
||||
<path
|
||||
d="m 122.52353,-67.256531 -1.71774,0 0,-8.910788 c -1e-5,-0.793795 0.026,-1.968235 0.0781,-3.523323 -0.25377,0.279796 -0.64741,0.647418 -1.18095,1.102868 l -1.43471,1.180948 -0.94671,-1.200468 3.73805,-2.918209 1.46398,0 0,14.268972"
|
||||
id="path3077" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(0.03313105,0.99945102,-0.99945102,0.03313105,0,0)"
|
||||
id="text2990-7-50"
|
||||
style="font-size:19.98827362px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans Mono;-inkscape-font-specification:Droid Sans Mono">
|
||||
<path
|
||||
d="m 86.240953,-144.46338 -1.717743,0 0,-8.91079 c -5e-6,-0.79379 0.02602,-1.96823 0.07808,-3.52332 -0.253762,0.2798 -0.647411,0.64742 -1.180947,1.10287 l -1.434706,1.18095 -0.94671,-1.20047 3.738042,-2.91821 1.463985,0 0,14.26897"
|
||||
id="path3080" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(0.56201745,0.82712538,-0.82712538,0.56201745,0,0)"
|
||||
id="text2990-7-6"
|
||||
style="font-size:19.98827362px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans Mono;-inkscape-font-specification:Droid Sans Mono">
|
||||
<path
|
||||
d="m 141.46955,-115.26434 -1.71774,0 0,-8.91079 c -1e-5,-0.7938 0.026,-1.96824 0.0781,-3.52332 -0.25376,0.27979 -0.64741,0.64741 -1.18095,1.10286 l -1.4347,1.18095 -0.94671,-1.20047 3.73804,-2.91821 1.46398,0 0,14.26898"
|
||||
id="path3083" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(0.41026184,0.91196777,-0.91196777,0.41026184,0,0)"
|
||||
id="text2990-7-68"
|
||||
style="font-size:19.98827362px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans Mono;-inkscape-font-specification:Droid Sans Mono">
|
||||
<path
|
||||
d="m 106.62199,-165.76779 -1.71774,0 0,-8.91079 c -1e-5,-0.7938 0.026,-1.96824 0.0781,-3.52332 -0.25376,0.27979 -0.64741,0.64742 -1.18094,1.10287 l -1.43471,1.18094 -0.94671,-1.20046 3.73804,-2.91821 1.46399,0 0,14.26897"
|
||||
id="path3086" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(-0.23609203,0.9717307,-0.9717307,-0.23609203,0,0)"
|
||||
id="text2990-7-07"
|
||||
style="font-size:19.98827362px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans Mono;-inkscape-font-specification:Droid Sans Mono">
|
||||
<path
|
||||
d="m 21.373971,-224.19429 -1.717742,0 0,-8.91079 c -6e-6,-0.79379 0.02602,-1.96823 0.07808,-3.52332 -0.253763,0.27979 -0.647412,0.64742 -1.180948,1.10287 l -1.434705,1.18094 -0.94671,-1.20046 3.738041,-2.91821 1.463985,0 0,14.26897"
|
||||
id="path3089" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(0.26029759,0.96552844,-0.96552844,0.26029759,0,0)"
|
||||
id="text2990-7-1"
|
||||
style="font-size:19.98827362px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans Mono;-inkscape-font-specification:Droid Sans Mono">
|
||||
<path
|
||||
d="m 109.52001,-224.81616 -1.71774,0 0,-8.91079 c -10e-6,-0.7938 0.026,-1.96824 0.0781,-3.52332 -0.25376,0.27979 -0.64741,0.64741 -1.18095,1.10286 l -1.4347,1.18095 -0.94671,-1.20046 3.73804,-2.91821 1.46398,0 0,14.26897"
|
||||
id="path3092" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="layer3">
|
||||
<g
|
||||
transform="matrix(-0.72542887,-0.29673984,-0.48305239,1.1809002,0,0)"
|
||||
id="text2985-0-36"
|
||||
style="font-size:13.06711483px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans">
|
||||
<path
|
||||
d="m -165.36303,43.093833 c -0.97408,0 -1.71208,-0.410474 -2.21401,-1.231422 -0.50193,-0.8252 -0.75289,-2.016212 -0.75289,-3.573039 0,-3.198713 0.98896,-4.798072 2.9669,-4.798082 0.98683,1e-5 1.73122,0.41261 2.23315,1.237803 0.50617,0.820956 0.75926,2.007714 0.75927,3.560279 -1e-5,3.202975 -0.99748,4.804461 -2.99242,4.804461 m 0,-0.988966 c 0.62528,1e-6 1.08467,-0.297752 1.37817,-0.89326 0.29349,-0.599758 0.44024,-1.573835 0.44025,-2.922235 -1e-5,-1.339884 -0.14676,-2.307581 -0.44025,-2.903095 -0.2935,-0.599752 -0.75289,-0.899632 -1.37817,-0.89964 -0.61678,8e-6 -1.06979,0.297761 -1.35903,0.89326 -0.285,0.59126 -0.42749,1.561084 -0.42749,2.909475 0,1.352653 0.14249,2.326731 0.42749,2.922235 0.28924,0.595508 0.74225,0.893261 1.35903,0.89326"
|
||||
id="path3029"
|
||||
style="font-variant:normal;font-stretch:normal;font-family:Droid Sans Mono;-inkscape-font-specification:Droid Sans Mono" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(-0.7582023,-0.19857197,-0.32324835,1.234251,0,0)"
|
||||
id="text2985-0-5-3"
|
||||
style="font-size:13.06711483px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans">
|
||||
<path
|
||||
d="m -151.53292,77.359611 c -0.97408,0 -1.71209,-0.410474 -2.21401,-1.231423 -0.50193,-0.8252 -0.75289,-2.016212 -0.75289,-3.573039 0,-3.198713 0.98896,-4.798072 2.9669,-4.798081 0.98683,9e-6 1.73121,0.41261 2.23315,1.237803 0.50617,0.820956 0.75926,2.007714 0.75927,3.560278 -1e-5,3.202976 -0.99748,4.804462 -2.99242,4.804462 m 0,-0.988966 c 0.62527,0 1.08466,-0.297753 1.37817,-0.89326 0.29349,-0.599758 0.44024,-1.573836 0.44025,-2.922236 -1e-5,-1.339884 -0.14676,-2.307581 -0.44025,-2.903094 -0.29351,-0.599752 -0.7529,-0.899632 -1.37817,-0.89964 -0.61678,8e-6 -1.06979,0.297761 -1.35903,0.893259 -0.285,0.59126 -0.42749,1.561084 -0.42749,2.909475 0,1.352654 0.14249,2.326732 0.42749,2.922236 0.28924,0.595507 0.74225,0.89326 1.35903,0.89326"
|
||||
id="path3032"
|
||||
style="font-variant:normal;font-stretch:normal;font-family:Droid Sans Mono;-inkscape-font-specification:Droid Sans Mono" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(-0.76749141,-0.15892919,-0.25871525,1.2493724,0,0)"
|
||||
id="text2985-0-5-3-4"
|
||||
style="font-size:13.06711483px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans">
|
||||
<path
|
||||
d="m -143.35433,102.91132 c -0.97409,0 -1.71209,-0.41048 -2.21401,-1.23143 -0.50193,-0.8252 -0.75289,-2.016209 -0.75289,-3.573036 0,-3.198713 0.98896,-4.798072 2.9669,-4.798082 0.98683,10e-6 1.73121,0.41261 2.23315,1.237803 0.50617,0.820956 0.75926,2.007714 0.75927,3.560279 -1e-5,3.202976 -0.99748,4.804466 -2.99242,4.804466 m 0,-0.98897 c 0.62527,0 1.08466,-0.29775 1.37817,-0.89326 0.29349,-0.59976 0.44024,-1.573836 0.44025,-2.922236 -1e-5,-1.339884 -0.14676,-2.307581 -0.44025,-2.903095 -0.29351,-0.599752 -0.7529,-0.899632 -1.37817,-0.89964 -0.61678,8e-6 -1.06979,0.297761 -1.35903,0.89326 -0.285,0.59126 -0.4275,1.561084 -0.42749,2.909475 -1e-5,1.352653 0.14249,2.326736 0.42749,2.922236 0.28924,0.59551 0.74225,0.89326 1.35903,0.89326"
|
||||
id="path3035"
|
||||
style="font-variant:normal;font-stretch:normal;font-family:Droid Sans Mono;-inkscape-font-specification:Droid Sans Mono" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(-0.77762174,-0.09801014,-0.15954727,1.2658632,0,0)"
|
||||
id="text2985-0-5-3-3"
|
||||
style="font-size:13.06711483px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans">
|
||||
<path
|
||||
d="m -128.43879,130.7428 c -0.97408,0 -1.71208,-0.41048 -2.21401,-1.23143 -0.50193,-0.8252 -0.75289,-2.01621 -0.75289,-3.57303 0,-3.19872 0.98896,-4.79808 2.9669,-4.79809 0.98683,1e-5 1.73122,0.41261 2.23315,1.23781 0.50617,0.82095 0.75926,2.00771 0.75927,3.56028 -1e-5,3.20297 -0.99748,4.80446 -2.99242,4.80446 m 0,-0.98897 c 0.62528,0 1.08467,-0.29775 1.37817,-0.89326 0.2935,-0.59976 0.44024,-1.57383 0.44025,-2.92223 -1e-5,-1.33989 -0.14675,-2.30759 -0.44025,-2.9031 -0.2935,-0.59975 -0.75289,-0.89963 -1.37817,-0.89964 -0.61678,1e-5 -1.06979,0.29776 -1.35903,0.89326 -0.285,0.59126 -0.42749,1.56108 -0.42749,2.90948 0,1.35265 0.14249,2.32673 0.42749,2.92223 0.28924,0.59551 0.74225,0.89326 1.35903,0.89326"
|
||||
id="path3038"
|
||||
style="font-variant:normal;font-stretch:normal;font-family:Droid Sans Mono;-inkscape-font-specification:Droid Sans Mono" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(1.2224283,0.19806604,-0.31571913,0.76688897,0,0)"
|
||||
id="text2990-7-14"
|
||||
style="font-size:17.2256794px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans Mono;-inkscape-font-specification:Droid Sans Mono">
|
||||
<path
|
||||
d="m 108.4038,118.44056 -1.48033,0 0,-7.67922 c 0,-0.68409 0.0224,-1.69621 0.0673,-3.03636 -0.21869,0.24112 -0.55793,0.55793 -1.01773,0.95044 l -1.23641,1.01772 -0.81587,-1.03455 3.22141,-2.51488 1.26164,0 0,12.29685"
|
||||
id="path3041" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(1.2380995,-0.02589828,-0.17206885,0.81128882,0,0)"
|
||||
id="text2990-7-14-7"
|
||||
style="font-size:17.2256794px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans Mono;-inkscape-font-specification:Droid Sans Mono">
|
||||
<path
|
||||
d="m 95.070558,172.14899 -1.480332,0 0,-7.67922 c -5e-6,-0.68409 0.02242,-1.69621 0.06729,-3.03637 -0.21869,0.24113 -0.557933,0.55794 -1.017728,0.95044 l -1.236414,1.01773 -0.815864,-1.03455 3.221403,-2.51488 1.261647,0 0,12.29685"
|
||||
id="path3044" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(1.2383695,-0.00147106,-0.18803848,0.80773681,0,0)"
|
||||
id="text2990-7-14-3"
|
||||
style="font-size:17.2256794px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans Mono;-inkscape-font-specification:Droid Sans Mono">
|
||||
<path
|
||||
d="m 97.014077,203.21602 -1.480331,0 0,-7.67922 c -5e-6,-0.68409 0.02242,-1.69621 0.06729,-3.03637 -0.21869,0.24113 -0.557932,0.55794 -1.017728,0.95045 l -1.236413,1.01772 -0.815865,-1.03455 3.221404,-2.51488 1.261646,0 0,12.29685"
|
||||
id="path3047" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(-1.2360182,0.04170273,-0.03045568,0.81007712,0,0)"
|
||||
id="text2985-0-5-3-7"
|
||||
style="font-size:13.94503117px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans">
|
||||
<path
|
||||
d="m -87.840912,107.61557 c -1.039525,0 -1.82711,-0.43805 -2.362757,-1.31415 -0.53565,-0.88064 -0.803474,-2.15167 -0.803473,-3.8131 -10e-7,-3.413614 1.055408,-5.120426 3.16623,-5.120436 1.053135,1e-5 1.847529,0.440331 2.383184,1.320964 0.540181,0.876112 0.810275,2.142602 0.810283,3.799472 -8e-6,3.41817 -1.064496,5.12725 -3.193467,5.12725 m 0,-1.05541 c 0.667287,1e-5 1.157541,-0.31775 1.470765,-0.95327 0.313213,-0.64005 0.469822,-1.67957 0.469828,-3.11857 -6e-6,-1.4299 -0.156615,-2.46261 -0.469828,-3.098135 -0.313224,-0.640046 -0.803478,-0.960073 -1.470765,-0.960082 -0.658216,9e-6 -1.141662,0.317766 -1.450338,0.953273 -0.304142,0.630984 -0.456212,1.665964 -0.456209,3.104944 -3e-6,1.44354 0.152067,2.48306 0.456209,3.11857 0.308676,0.63552 0.792122,0.95328 1.450338,0.95327"
|
||||
id="path3050"
|
||||
style="font-variant:normal;font-stretch:normal;font-family:Droid Sans Mono;-inkscape-font-specification:Droid Sans Mono" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="layer4">
|
||||
<g
|
||||
transform="scale(1.3546944,0.73817387)"
|
||||
id="text2985-04"
|
||||
style="font-size:29.82770729px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans">
|
||||
<path
|
||||
d="m 77.811338,118.12566 c -2.223492,0 -3.908095,-0.93697 -5.053816,-2.81091 -1.145729,-1.88365 -1.718591,-4.60232 -1.718589,-8.15602 -2e-6,-7.301552 2.257464,-10.952336 6.772405,-10.952357 2.252602,2.1e-5 3.95177,0.941846 5.097508,2.825476 1.15542,1.873961 1.733137,4.582921 1.733153,8.126881 -1.6e-5,7.31129 -2.276901,10.96693 -6.830661,10.96693 m 0,-2.25747 c 1.427292,0 2.475921,-0.67966 3.145891,-2.039 0.669945,-1.36904 1.004924,-3.59252 1.004937,-6.67046 -1.3e-5,-3.05849 -0.334992,-5.26741 -1.004937,-6.62676 -0.66997,-1.369024 -1.718599,-2.053545 -3.145891,-2.053565 -1.407891,2e-5 -2.441956,0.679687 -3.102198,2.039005 -0.650545,1.34964 -0.975814,3.56341 -0.975809,6.64132 -5e-6,3.08765 0.325264,5.31113 0.975809,6.67046 0.660242,1.35934 1.694307,2.039 3.102198,2.039"
|
||||
id="path3053"
|
||||
style="font-variant:normal;font-stretch:normal;font-family:Droid Sans Mono;-inkscape-font-specification:Droid Sans Mono" />
|
||||
</g>
|
||||
</g>
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="m 106.4,68.92 h -1.718 v -8.911 c 0,-0.7938 0.026,-1.968 0.0781,-3.523 -0.2538,0.2798 -0.6474,0.6474 -1.181,1.103 l -1.435,1.181 -0.9467,-1.2 3.738,-2.918 h 1.464 v 14.27" />
|
||||
<g transform="matrix(0.91699047,-0.39890912,0.39890912,0.91699047,0,0)">
|
||||
<path d="m 63.17,105.2 h -1.718 v -8.911 c -6e-6,-0.7938 0.02602,-1.968 0.07808,-3.523 -0.2538,0.2798 -0.6474,0.6474 -1.181,1.103 l -1.435,1.181 -0.9467,-1.2 3.738,-2.918 h 1.464" />
|
||||
</g>
|
||||
<g transform="matrix(-0.59341889,-0.8048938,0.8048938,-0.59341889,0,0)">
|
||||
<path d="m -126.7,27.24 h -1.718 v -8.911 c 0,-0.7938 0.026,-1.968 0.0781,-3.523 -0.2538,0.2798 -0.6474,0.6474 -1.181,1.103 l -1.435,1.181 -0.9467,-1.2 3.738,-2.918 h 1.464" />
|
||||
</g>
|
||||
<g transform="matrix(0.31316381,-0.94969913,0.94969913,0.31316381,0,0)">
|
||||
<path d="m -41.44,113 h -1.718 v -8.911 c -5e-6,-0.7938 0.02602,-1.968 0.07808,-3.523 -0.2538,0.2798 -0.6474,0.6474 -1.181,1.103 l -1.435,1.181 -0.9467,-1.2 3.738,-2.918" />
|
||||
</g>
|
||||
<g transform="matrix(-0.26555612,-0.9640954,0.9640954,-0.26555612,0,0)">
|
||||
<path d="m -101.8,68.7 h -1.718 v -8.911 c -1e-5,-0.7938 0.026,-1.968 0.0781,-3.523 -0.2538,0.2798 -0.6474,0.6474 -1.181,1.103 l -1.435,1.181 -0.9467,-1.2" />
|
||||
</g>
|
||||
<g transform="matrix(-0.66392621,0.74779809,-0.74779809,-0.66392621,0,0)">
|
||||
<path d="m -10.77,-142.4 h -1.718 v -8.911 c -6e-6,-0.7938 0.02602,-1.968 0.07808,-3.523 -0.2538,0.2798 -0.6474,0.6474 -1.181,1.103 l -1.435,1.181" />
|
||||
</g>
|
||||
<g transform="matrix(0.61648634,0.7873656,-0.7873656,0.61648634,0,0)">
|
||||
<path d="m 122.5,-67.26 h -1.718 v -8.911 c -1e-5,-0.7938 0.026,-1.968 0.0781,-3.523 -0.2538,0.2798 -0.6474,0.6474 -1.181,1.103 l -1.435,1.181" />
|
||||
</g>
|
||||
<g transform="matrix(0.03315518,0.99945022,-0.99945022,0.03315518,0,0)">
|
||||
<path d="m 86.24,-144.5 h -1.718 v -8.911 c -5e-6,-0.7938 0.02602,-1.968 0.07808,-3.523 -0.2538,0.2798 -0.6474,0.6474 -1.181,1.103" />
|
||||
</g>
|
||||
<g transform="matrix(0.56208338,0.82708057,-0.82708057,0.56208338,0,0)">
|
||||
<path d="m 141.5,-115.3 h -1.718 v -8.911 c -1e-5,-0.7938 0.026,-1.968 0.0781,-3.523 -0.2538,0.2798 -0.6474,0.6474 -1.181,1.103" />
|
||||
</g>
|
||||
<g transform="matrix(0.4102414,0.91197697,-0.91197697,0.4102414,0,0)">
|
||||
<path d="m 106.6,-165.8 h -1.718 v -8.911 c -1e-5,-0.7938 0.026,-1.968 0.0781,-3.523 -0.2538,0.2798 -0.6474,0.6474 -1.181,1.103" />
|
||||
</g>
|
||||
<g transform="matrix(-0.23683815,0.97154912,-0.97154912,-0.23683815,0,0)">
|
||||
<path d="m 21.37,-224.2 h -1.718 v -8.911 c -6e-6,-0.7938 0.02602,-1.968 0.07808,-3.523" />
|
||||
</g>
|
||||
<g transform="matrix(0.260336,0.96551808,-0.96551808,0.260336,0,0)">
|
||||
<path d="m 109.5,-224.8 h -1.718 v -8.911 c -1e-5,-0.7938 0.026,-1.968 0.0781,-3.523" />
|
||||
</g>
|
||||
<g transform="matrix(-0.7254,-0.2967,-0.483,1.181,0,0)">
|
||||
<path d="m -165.4,43.09 c -0.9741,0 -1.712,-0.4105 -2.214,-1.231" />
|
||||
</g>
|
||||
<g transform="matrix(-0.7582,-0.1986,-0.3232,1.234,0,0)">
|
||||
<path d="M -151.5,77.36" />
|
||||
</g>
|
||||
<g transform="matrix(-0.7675,-0.1589,-0.2587,1.249,0,0)">
|
||||
<path d="m -143.4,102.9 c -0.9741,0 -1.712,-0.4105 -2.214,-1.231 -0.5019,-0.8252 -0.7529,-2.016 -0.7529,-3.573 0,-3.199 0.989,-4.798 2.967,-4.798 0.9868,1e-5 1.731,0.4126 2.233,1.238" />
|
||||
</g>
|
||||
<g transform="matrix(-0.7776,-0.09801,-0.1596,1.266,0,0)">
|
||||
<path d="m -128.4,130.7 c -0.9741,0 -1.712,-0.4105 -2.214,-1.231 -0.5019,-0.8252 -0.7529,-2.016 -0.7529,-3.573 0,-3.199 0.989,-4.798 2.967,-4.798" />
|
||||
</g>
|
||||
<g transform="matrix(1.222,0.1981,-0.3157,0.7669,0,0)">
|
||||
<path d="m 108.4,118.4 h -1.48 v -7.679 c 0,-0.6841 0.0224,-1.696 0.0673,-3.036 -0.2187,0.2411 -0.5579,0.5579 -1.018,0.9504" />
|
||||
</g>
|
||||
<g transform="matrix(1.238,-0.0259,-0.1721,0.8113,0,0)">
|
||||
<path d="m 95.07,172.2 h -1.48 v -7.679 c -5e-6,-0.6841 0.02242,-1.696 0.06729,-3.036" />
|
||||
</g>
|
||||
<g transform="matrix(1.238,-0.001471,-0.188,0.8077,0,0)">
|
||||
<path d="m 97.01,203.2 h -1.48 v -7.679" />
|
||||
</g>
|
||||
<g transform="matrix(-1.236,0.0417,-0.03046,0.8101,0,0)">
|
||||
<path d="M -87.84,107.6" />
|
||||
</g>
|
||||
<g transform="scale(1.355,0.7382)">
|
||||
<path d="m 77.81,118.1 c -2.224,0 -3.908,-0.937 -5.054,-2.811 -1.146,-1.884 -1.719,-4.602 -1.719,-8.156 -2e-6,-7.302 2.258,-10.95 6.772,-10.95 2.253,2.1e-5 3.952,0.9418 5.098,2.826" />
|
||||
</g>
|
||||
</svg>
|
||||
|
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 4.1 KiB |
1
resources/icon-microblog.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15"><circle cx="7.5" cy="7.5" r="4" style="stroke:#F60;fill:none;stroke-width:4" /></svg>
|
After Width: | Height: | Size: 149 B |
1
resources/icon-shaarli.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15"><circle cx="7.5" cy="7.5" r="4" style="stroke:#080;fill:none;stroke-width:4" /></svg>
|
After Width: | Height: | Size: 149 B |
1
resources/icon-twitter.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15"><circle cx="7.5" cy="7.5" r="4" style="stroke:#3AE;fill:none;stroke-width:4" /></svg>
|
After Width: | Height: | Size: 149 B |
1
resources/icon-youtube.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15"><circle cx="7.5" cy="7.5" r="4" style="stroke:#A00;fill:none;stroke-width:4" /></svg>
|
After Width: | Height: | Size: 149 B |
125
twitter2feed.php
Executable file
|
@ -0,0 +1,125 @@
|
|||
<?php
|
||||
/*
|
||||
* Récupération du flux RSS d'un compte Twitter
|
||||
* Passez le nom du compte en Paramètre. Exemple: http://monsite.com/twit2rss.php?name=Craftbukkit
|
||||
* 2013 - by Tronics
|
||||
*/
|
||||
|
||||
// ----------------------------
|
||||
// Autoblog Project inclusion
|
||||
// ----------------------------
|
||||
if(file_exists("config.php")) require_once "config.php";
|
||||
if(file_exists("functions.php")) require_once "functions.php";
|
||||
if( !defined('API_TWITTER')) {header("HTTP/1.1 404 Not Found"); die('API_TWITTER is undefined: make it LOCAL in "config.php" if you want me to work for you.');}
|
||||
if ('API_TWITTER' === FALSE) {header("HTTP/1.1 404 Not Found"); die('Twitter support disabled in "config.php". Sorry.');}
|
||||
$api = API_TWITTER;
|
||||
if ($api === 'LOCAL') { } else {header("HTTP/1.1 404 Not Found"); die('Custom twitterbridge defined in "config.php": leave me alone.');}
|
||||
if(!isset($_GET['u'])) {header("HTTP/1.1 404 Not Found"); die('no username provided');}
|
||||
$exclude_reply = '@'; // if you want twitter2feed to return replies too: $exclude_reply = '';
|
||||
// ----------------------------
|
||||
// Let's rock !
|
||||
|
||||
$name = $_GET["u"];
|
||||
$str = file_get_contents("https://twitter.com/$name");
|
||||
|
||||
$nb = preg_match_all('%<div class="tweet original-tweet(.*)'.
|
||||
'data-tweet-id="(?P<id>\d+)"(.*)'.
|
||||
'(data-retweet-id="(?P<retweetid>\d+)"(.*))?'.
|
||||
'data-screen-name="(?P<name>[^"]+)"(.*)'.
|
||||
'<img class="avatar js-action-profile-avatar" src="(?P<avatar>[^"]+)" alt="(?P<fullname>[^"]*)">(.*)'.
|
||||
'data-time="(?P<created>\d+)"(.*)'.
|
||||
'<p class="js-tweet-text tweet-text">(?P<message>.*)</p>'.
|
||||
'%sU', $str, $arr);
|
||||
|
||||
function parsemessage($message)
|
||||
{
|
||||
$message = preg_replace('%<a href="/([^"]+)"([^>]+)>%', '<a href="https://twitter.com/$1" class="twitter_account">', $message);
|
||||
$message = preg_replace('%<s>(@|#)</s><b>([^<]+)</b>%', '$1$2', $message);
|
||||
$message = preg_replace('%<a href="http://t.co/[^"]+" rel="nofollow" dir="ltr" data-expanded-url="([^"]+)" class="twitter-timeline-link" target="_blank" title="[^"]+"%', '<a href="$1" class="twitter_link"', $message);
|
||||
$message = preg_replace('%<span class="[^"]+">([^<]+)</span>%', '$1', $message);
|
||||
$message = preg_replace('%<span class="tco-ellipsis"> …</span>%', '', $message);
|
||||
|
||||
return $message;
|
||||
}
|
||||
|
||||
function parsetitle($message)
|
||||
{
|
||||
$message = preg_replace('%<a ([^>]+)>https?://([^/]+)/[^<]*</a>%', '[$2]', $message);
|
||||
$message = strip_tags($message);
|
||||
return $message;
|
||||
}
|
||||
|
||||
$fullname = "?";
|
||||
$updated = "";
|
||||
if ($nb !== false)
|
||||
{
|
||||
for ($i = 0; $i < $nb; $i++)
|
||||
{
|
||||
$mname = $arr["name"][$i];
|
||||
$mfullname = $arr["fullname"][$i];
|
||||
if ($updated == "")
|
||||
$updated = date(DATE_ATOM, $arr["created"][$i]);
|
||||
|
||||
if ($mname == $name)
|
||||
{
|
||||
$fullname = $mfullname;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
header('Content-type: application/xml; charset=UTF-8', true);
|
||||
echo '<?xml version="1.0" encoding="utf-8"?' . '>' . PHP_EOL;
|
||||
?>
|
||||
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
|
||||
<title>Twitter / <?php echo $name ?></title>
|
||||
<id>tag:twitter.com,2013:Status:<?php echo $name ?></id>
|
||||
<link type="text/html" rel="alternate" href="http://twitter.com/<?php echo $name ?>"/>
|
||||
<link type="application/atom+xml" rel="self" href="http://<?php echo $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"] ?>"></link>
|
||||
<updated><?php echo $updated ?></updated>
|
||||
<subtitle>Twitter de <?php echo $fullname ?>.</subtitle>
|
||||
<?php
|
||||
if ($nb !== false)
|
||||
{
|
||||
for ($i = 0; $i < $nb; $i++)
|
||||
{
|
||||
$message = parsemessage($arr["message"][$i]);
|
||||
$mname = $arr["name"][$i];
|
||||
$mfullname = $arr["fullname"][$i];
|
||||
$avatar = $arr["avatar"][$i];
|
||||
$id = $arr["id"][$i];
|
||||
$created = date(DATE_ATOM, $arr["created"][$i]);
|
||||
|
||||
$rt = "";
|
||||
if ($arr["retweetid"][$i] != "")
|
||||
$rt = "RT <a href=\"https://twitter.com/$mname\">@$mname</a> : ";
|
||||
|
||||
$title = htmlspecialchars(parsetitle($rt . $message));
|
||||
|
||||
$header = "<img src=\"$avatar\" alt=\"$mname\"/> $mfullname (<a href=\"https://twitter.com/$mname\">@$mname</a>)<br/>\r\n";
|
||||
$footer = "<br/>\r\n<a href=\"https://twitter.com/$mname/status/$id\">Afficher la conversation</a>";
|
||||
$message = "$header$rt$message$footer";
|
||||
$message = htmlspecialchars($message);
|
||||
if(substr($title, 0, 1) !== $exclude_reply) {
|
||||
echo <<<HTML
|
||||
<entry>
|
||||
<title>$title</title>
|
||||
<content type="html">$message</content>
|
||||
<id>tag:twitter.com,2013:https://twitter.com/$name/status/$id</id>
|
||||
<published>$created</published>
|
||||
<updated>$created</updated>
|
||||
<link type="text/html" rel="alternate" href="https://twitter.com/$name/status/$id"/>
|
||||
<link type="image/png" rel="image" href="$avatar"/>
|
||||
<author>
|
||||
<name>$name</name>
|
||||
<uri>https://twitter.com/$name</uri>
|
||||
</author>
|
||||
</entry>
|
||||
HTML;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
</feed>
|
||||
|
2
version
|
@ -1 +1 @@
|
|||
0.3.0-DEV Build 1
|
||||
0.3.2
|
||||
|
|
49
xsaf3.php
|
@ -2,10 +2,12 @@
|
|||
|
||||
define('DEBUG', false);
|
||||
define('XSAF_VERSION', 3);
|
||||
define('AUTOBLOG_FILE_NAME', 'autoblog.php');
|
||||
define('ALLOW_REMOTE_DB_DL', false);
|
||||
define('ALLOW_REMOTE_MEDIA_DL', false);
|
||||
define('EXEC_TIME', 20);
|
||||
define('AUTOBLOG_FILE_NAME', 'autoblog.php'); // useless ?
|
||||
define('ALLOW_REMOTE_DB_DL', true);
|
||||
define('ALLOW_REMOTE_MEDIA_DL', true);
|
||||
define('EXEC_TIME', 10);
|
||||
|
||||
date_default_timezone_set('UTC');
|
||||
|
||||
header("HTTP/1.0 403 Forbidden"); /* Uncivilized method to prevent bot indexing, huh :) */
|
||||
header('X-Robots-Tag: noindex'); /* more civilized method, but bots may not all take into account */
|
||||
|
@ -75,17 +77,12 @@ function xsafimport($xsafremote, $max_exec_time) {
|
|||
$get_remote_media = ($json_import['meta']['xsaf-media_transfer'] == "true") ? true : false;
|
||||
|
||||
if(!empty($json_import['autoblogs'])) {
|
||||
foreach ($json_import['autoblogs'] as $value) {
|
||||
|
||||
foreach ($json_import['autoblogs'] as $remote_folder => $value) {
|
||||
if(DEBUG) debug('remote = '. $remote_folder);
|
||||
if(count($value)==4 && !empty($value['SITE_TYPE']) && !empty($value['SITE_TITLE']) && !empty($value['SITE_URL']) && !empty($value['FEED_URL'])) {
|
||||
$sitetype = escape($value['SITE_TYPE']);
|
||||
$sitename = escape($value['SITE_TITLE']);
|
||||
$siteurl = escape($value['SITE_URL']);
|
||||
if(empty($value['SITE_META_DESCRIPTION'])){
|
||||
$siteDesc = getSiteDesc(escape($value['SITE_URL']));
|
||||
} else {
|
||||
$siteDesc = escape($value['SITE_META_DESCRIPTION']);
|
||||
}
|
||||
// Do not use DetectRedirect because it's slow and it has been used when the feed was added
|
||||
//$rssurl = DetectRedirect(escape($value['FEED_URL']));
|
||||
$rssurl = escape($value['FEED_URL']);
|
||||
|
@ -100,10 +97,10 @@ function xsafimport($xsafremote, $max_exec_time) {
|
|||
|
||||
/* autoblog */
|
||||
if( $result === true ) {
|
||||
$foldername = urlToFolder($sitename, $rssurl);
|
||||
$foldername = urlToFolder($siteurl, $rssurl);
|
||||
|
||||
try {
|
||||
createAutoblog($sitetype, $sitename, $siteurl, $rssurl,$siteDesc);
|
||||
createAutoblog($sitetype, $sitename, $siteurl, $rssurl);
|
||||
|
||||
if( DEBUG ) {
|
||||
echo '<p>autoblog '. $sitename .' crée avec succès (DL DB : '. var_dump($get_remote_db) .' - DL media : '. var_dump($get_remote_media) .') : '. $foldername .'</p>';
|
||||
|
@ -114,23 +111,23 @@ function xsafimport($xsafremote, $max_exec_time) {
|
|||
/* ============================================================================================================================================================================== */
|
||||
/* récupération de la DB distante */
|
||||
if($get_remote_db == true && ALLOW_REMOTE_DB_DL ) {
|
||||
$remote_db = str_replace("?export", $foldername."/articles.db", $xsafremote);
|
||||
$remote_db = str_replace("?export", $remote_folder."/articles.db", $xsafremote);
|
||||
copy($remote_db, './'. $foldername .'/articles.db');
|
||||
}
|
||||
|
||||
/* préparation à la récupération des médias distants */
|
||||
if($get_remote_media == true && ALLOW_REMOTE_MEDIA_DL ) {
|
||||
$remote_media=str_replace("?export", $foldername."/?media", $xsafremote);
|
||||
$remote_media=str_replace("?export", $remote_folder."/?media", $xsafremote);
|
||||
if(DEBUG)
|
||||
debug("Récupération de la liste des médias à $remote_media <br>");
|
||||
$json_media_import = file_get_contents($remote_media);
|
||||
if(!empty($json_media_import))
|
||||
{
|
||||
mkdir('./'.$foldername.'/media/');
|
||||
$json_media_import = json_decode($json_media_import, true);
|
||||
$media_path=$json_media_import['url'];
|
||||
if(!empty($json_media_import['files'])) {
|
||||
foreach ($json_media_import['files'] as $value) {
|
||||
copy($media_path.$value, './'.$foldername.'/media/'.$value);
|
||||
}
|
||||
}
|
||||
if(DEBUG)
|
||||
debug($json_media_import);
|
||||
$media_data = json_decode($json_media_import, true);
|
||||
if(DEBUG)
|
||||
debug($media_data);
|
||||
if(!empty($json_media_import) && $media_data !== null && !empty($media_data['files']))
|
||||
{
|
||||
file_put_contents('./'. $foldername .'/import.json', $json_media_import);
|
||||
}
|
||||
}
|
||||
|
||||
|
|