Commit f4f99559 authored by JosephK's avatar JosephK
Browse files

Intégration à la Framanav et mini accueil dans le bookmarklet

parent a54c5d1d
<?php
// remplacer http par https
define('URL_BASE', str_replace($_SERVER['DOCUMENT_ROOT'], 'http://'.$_SERVER['HTTP_HOST'], dirname($_SERVER['SCRIPT_FILENAME'])) );
define('TITLE', 'MyFrama');
......@@ -133,9 +132,32 @@ function create_account($account, $password, $email) {
);
writeConfig($GLOBALS, true, $account_path . '/data/config.php');
//------------------------------------------------------------------
}
//------------------------------------------------------------------
// ~~~~~~~~~~~~~~~~~~~~~~ 1. Bookmarklet ~~~~~~~~~~~~~~~~~~~~~~~~~~~
function encodeURIComponent($str) {
$revert = array('%21'=>'!', '%2A'=>'*', '%27'=>"'", '%28'=>'(', '%29'=>')');
return strtr(rawurlencode($str), $revert);
}
$bm_src= ''; $bm_post = '';
if (isset($_GET['source']) && $_GET['source']=='bookmarklet') {
$bm_src = '&source=bookmarklet';
if (isset($_GET['post'])) {
$bm_url = encodeURIComponent($_GET['post']);
$bm_title = isset($_GET['title']) ? encodeURIComponent($_GET['title']) : '';
$bm_description = isset($_GET['description']) ? encodeURIComponent($_GET['description']) : '';
$bm_post = '&post='.$bm_url.'&title='.$bm_title.'&description='.$bm_description;
}
if(isset($_COOKIE['myframa']) && !empty($_COOKIE['myframa'])) {
$account = $_COOKIE['myframa'];
header('Location: u/' . $account . '?'.$bm_post.$bm_src);
}
}
// ~~~~~~~~~~~~~~~~~~~~~~ 2. Account ~~~~~~~~~~~~~~~~~~~~~~~~~~~
$test_values = true;
if (!is_writable(PATH_ACCOUNTS)) {
......@@ -145,7 +167,10 @@ if (!is_writable(PATH_ACCOUNTS)) {
// Handle account redirection.
$account = strtolower($_POST['subdomain_redirect']);
if (check_account_exists($account)) {
header('Location: u/' . $account . '?do=login' );
// Keep user account in a cookie
setcookie('myframa', $account, time()+365*24*60*60, dirname($_SERVER["SCRIPT_NAME"]).'/');
// Redirection
header('Location: u/' . $account . '?do=login'.$bm_post.$bm_src );
} else {
$error_redirection = 'Ce compte ne semble pas exister. Êtes-vous sûr du nom de votre compte&nbsp;?';
}
......@@ -182,14 +207,16 @@ if (!is_writable(PATH_ACCOUNTS)) {
$error = 'Ce compte semble déjà exister, veuillez choisir un autre nom de compte.';
$test_values = 'account';
} elseif (is_null($error)) {
// Everything is fine, we can redirect user to its new board!
header('Location: u/' . $account . '?do=login&username=' . $account . '&r');
// Keep user account in a cookie
setcookie('myframa', $account, time()+365*24*60*60, dirname($_SERVER["SCRIPT_NAME"]).'/');
// Everything is fine, we can redirect user to its new account!
header('Location: u/' . $account . '?do=login&first'.$bm_post.$bm_src);
}
}
// Tempfix redirect on shaarli's home when user logged in
if(isset($_SERVER['HTTP_REFERER']) && strstr($_SERVER['HTTP_REFERER'], '?do=login')) {
header('Location: '.str_replace('?do=login', '', $_SERVER['HTTP_REFERER']));
header('Location: '.str_replace('?do=login', '?', $_SERVER['HTTP_REFERER']));
}
include 'layout.php';
<!DOCTYPE html>
<html>
<?php
$bookmarklet = (isset($_GET['source']) && $_GET['source']=='bookmarklet') ? 'class="bookmarklet"' : '';
$nav = ($bookmarklet == '') ? '<script src="https://framasoft.org/nav/nav.js" type="text/javascript"></script>' : '';
$meta = '<!DOCTYPE html>
<html '.$bookmarklet.'>
<head>
<title>MyFrama</title>
<meta charset="UTF-8" />
<meta name="viewport" content="initial-scale=1.0" />
<script src="https://framasoft.org/nav/lib/jquery/jquery.min.js" type="text/javascript"></script>
<script src="https://framasoft.org/nav/lib/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
<script src="shaarli/tpl/frama/inc/jquery/jquery.min.js" type="text/javascript"></script>
<script src="shaarli/tpl/frama/inc/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
<link href="shaarli/tpl/frama/inc/bootstrap/css/bootstrap.min.css" media="all" rel="stylesheet">
<link href="shaarli/tpl/frama/inc/font-awesome/css/font-awesome.min.css" media="all" rel="stylesheet">
<link href="shaarli/tpl/frama/inc/frama.css" media="all" rel="stylesheet">
</head>
<body class="fb_g2">
<script src="https://framasoft.org/nav/nav.js" type="text/javascript"></script>
<div class="container ombre">
<body>
'.$nav.'
<div class="container ombre home">';
$header = '
<header>
<h1 class="big-title"><a href="/"><b class="violet">My</b><b class="vert">Frama</b></a></h1>
<p class="lead">Marquez et partagez vos liens</p>
<hr class="trait" role="presentation" />
</header>
<div class="row <?php echo isset($error) ? 'active' : ''; ?>" id="registration">
</header>';
// Choose {
$choose = '
<script type="text/javascript">
jQuery(document).ready(function() {
jQuery(\'#choose .btn-success\').on(\'click\', function() {
jQuery(\'#choose\').hide();
jQuery(\'#registration\').show();
});
jQuery(\'#choose .btn-primary\').on(\'click\', function() {
jQuery(\'#choose\').hide();
jQuery(\'#login\').show();
});
jQuery(\'#registration .btn-default,#login .btn-default\').on(\'click\', function() {
jQuery(\'#choose\').show();
jQuery(\'#login, #registration\').hide();
});
});
</script>
<div class="row" id="choose">
<div class="col-md-12 text-center">
<p class="text-center"><a href="javascript:void(0)" class="btn btn-success btn-lg btn-block">
<i class="fa fa-fw fa-user"></i> Créer un compte
</a></p>
<p>ou</p>
<p><a href="javascript:void(0)" class="btn btn-primary btn-lg btn-block">
<i class="fa fa-fw fa-lock"></i> Accéder à votre compte
</a></p>
</div>
</div>';
$loggedin = '
<div class="row">
<div class="col-md-12">
<h2>Créer un compte</h2>
<p>Vous vous êtes connecté récemment avec le compte <b>account</b></p>
<p><a href="javascript:void(0)" class="btn btn-primary btn-lg">
<i class="fa fa-fw fa-lock"></i> Utiliser ce compte
</a></p>
<p class="helpblock"><a href="javascript:void(0)" class="btn btn-link">
Ce n’est pas mon compte
</a></p>
</div>';
// Registration
$active_reg = isset($error) ? 'active' : '';
<?php if (isset($error)) { ?>
$has_error['account'] = $test_values === 'account' ? 'has-error' : '';
$has_error['email'] = $test_values === 'email' ? 'has-error' : '';
$has_error['password'] = $test_values === 'password' ? 'has-error' : '';
$has_error['registration'] = (isset($error))
? '
<div class="col-md-8 col-md-offset-2">
<div class="alert alert-danger"><strong>Mince&nbsp;!</strong> <?php echo $error; ?></div>
</div>
<?php } ?>
</div>'
: '';
$value['account'] = isset($_POST['account']) ? $_POST['account'] : '';
$value['email'] = isset($_POST['email']) ? $_POST['email'] : '';
$value['password'] = isset($_POST['password']) ? $_POST['password'] : '';
if(!isset($_GET['source'])) {
$btn_reg = '
<div class="form-group">
<div class="col-sm-offset-4 col-sm-8">
<input class="btn btn-primary" type="submit" value="Créer mon compte" />
</div>
</div>';
} else {
$btn_reg = '
<div class="form-group">
<div class="text-right col-xs-12">
<a href="javascript:void(0)" class="pull-left btn btn-default">Annuler</a>
<input class="btn btn-primary" type="submit" value="Créer mon compte" />
</div>
</div>';
}
$registration = '
<div class="row '.$active_reg.'" id="registration">
<div class="col-md-12">
<h2>Créer un compte</h2>
'.$has_error['registration'].'
<div class="col-md-8 col-md-offset-2">
<form class="form-horizontal" method="POST" action="#" role="form">
<div class="alert alert-info">Merci de remplir tous les champs.</div>
<div class="form-group <?php echo $test_values === 'account' ? 'has-error' : ''; ?>">
<div class="form-group '.$has_error['account'].'">
<label class="col-sm-4 control-label" for="account">Nom d&rsquo;utilisateur<br /><span class="small">(max. 25 caractères)</span></label>
<div class="col-sm-8">
<input type="text" class="form-control" required="" id="account" name="account" pattern="[a-zA-Z0-9_-]{1,25}" value="<?php echo isset($_POST['account']) ? $_POST['account'] : ''; ?>" >
<input type="text" class="form-control" required="" id="account" name="account" pattern="[a-zA-Z0-9_-]{1,25}" value="'.$value['account'].'" >
</div>
</div>
<div class="form-group <?php echo $test_values === 'email' ? 'has-error' : ''; ?>">
<div class="form-group '.$has_error['email'].'">
<label class="col-sm-4 control-label" for="email">Adresse courriel</label>
<div class="col-sm-8">
<input type="email" class="form-control" required="" id="email" name="email" value="<?php echo isset($_POST['email']) ? $_POST['email'] : ''; ?>">
<input type="email" class="form-control" required="" id="email" name="email" value="'.$value['email'].'">
</div>
</div>
<div class="form-group <?php echo $test_values === 'password' ? 'has-error' : ''; ?>">
<div class="form-group '.$has_error['password'].'">
<label class="col-sm-4 control-label" for="password">Mot de passe</label>
<div class="col-sm-8">
<input type="password" class="form-control" required="" id="password" name="password" value="<?php echo isset($_POST['password']) ? $_POST['password'] : ''; ?>">
<input type="password" class="form-control" required="" id="password" name="password" value="'.$value['password'].'">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-4 col-sm-8">
<input class="btn btn-primary" type="submit" value="Créer mon compte" />
</div>
</div>
'.$btn_reg.'
</form>
</div>
</div>
</div>
</div>';
// Login
$active_log = isset($error_redirection) ? 'active' : '';
if (isset($error_redirection)) {
$has_error['login'] = '
<div class="col-md-8 col-md-offset-2">
<div class="alert alert-danger"><strong>Mince&nbsp;!</strong> '.$error_redirection.'</div>
</div>';
} else {
$has_error['login'] = '';
}
$value['login'] = isset($_POST['subdomain_redirect']) ? $_POST['subdomain_redirect'] : '';
<div class="row <?php echo isset($error_redirection) ? 'active' : ''; ?>" id="login">
if(!isset($_GET['source'])) {
$btn_log = '
<div class="form-group">
<div class="col-sm-offset-4 col-sm-8">
<input class="btn btn-primary" type="submit" value="Accéder à mon compte" />
</div>
</div>';
} else {
$btn_log = '
<div class="form-group">
<div class="text-right col-xs-12">
<a href="javascript:void(0)" class="pull-left btn btn-default">Annuler</a>
<input class="btn btn-primary" type="submit" value="Accéder à mon compte" />
</div>
</div>';
}
$login = '
<div class="row '.$active_log.'" id="login">
<div class="col-md-12">
<h2>Vous possédez déjà un compte&nbsp;?</h2>
<?php if (isset($error_redirection)) { ?>
<div class="col-md-8 col-md-offset-2">
<div class="alert alert-danger"><strong>Mince&nbsp;!</strong> <?php echo $error_redirection; ?></div>
</div>
<?php } ?>
'.$has_error['login'].'
<div class="col-md-8 col-md-offset-2">
<form class="form-horizontal" method="POST" action="#" role="form">
......@@ -74,23 +183,20 @@
<label class="col-sm-4 control-label" for="subdomain_redirect">Votre compte</label>
<div class="col-sm-8">
<div class="input-group">
<div class="input-group-addon"><?php echo URL_BASE; ?>/u/</div>
<input type="text" class="form-control" required="" id="subdomain_redirect" name="subdomain_redirect" pattern="[a-zA-Z0-9_-]{1,25}" value="<?php echo isset($_POST['subdomain_redirect']) ? $_POST['subdomain_redirect'] : ''; ?>">
<div class="input-group-addon">'.URL_BASE.'/u/</div>
<input type="text" class="form-control" required="" id="subdomain_redirect" name="subdomain_redirect" pattern="[a-zA-Z0-9_-]{1,25}" value="'.$value['login'].'">
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-4 col-sm-8">
<input class="btn btn-primary" type="submit" value="Accéder à mon compte" />
</div>
</div>
'.$btn_log.'
</form>
</div>
</div>
</div>
</div>';
$about = '
<hr role="presentation" />
<div class="row">
......@@ -122,8 +228,17 @@
<p>Si vous souhaitez installer ce logiciel pour votre propre usage et ainsi gagner en autonomie, nous vous aidons sur&nbsp;:</p>
<p class="text-center"><a href="http://framacloud.org/cultiver-son-jardin/installation-de-shaarli/" class="btn btn-success"><i class="glyphicon glyphicon-tree-deciduous"></i> framacloud.org</a></p>
</div>
</div>
</div>';
$footer = '
</div>
</div>
</body>
</html>
</body>
</html>';
// Accueil full
if($bookmarklet == '') {
echo $meta.$header.$registration.$login.$about.$footer;
// Accueil iframe nav
} else {
echo $meta.$choose.$registration.$login.$footer;
}
\ No newline at end of file
......@@ -3,5 +3,10 @@
$t['Hide links descriptions'] = 'Masquer la description des liens';
$t['Show links descriptions'] = 'Afficher la description des liens';
$t['Close'] = 'Fermer';
$t['Cancel'] = 'Annuler';
$t['Your account has been successfully created. You can sign in now.'] = 'Votre compte MyFrama a bien été créé. Vous pouvez à présent vous y connecter.';
$t['Add this link'] = 'Ajouter ce lien';
$t['Edit this link'] = 'Modifier ce lien';
$t['See all my links'] = 'Voir tous mes liens';
$t['or'] = 'ou';
?>
\ No newline at end of file
......@@ -61,14 +61,51 @@ jQuery(document).ready(function(){
jQuery('#i18n, #myframa, #recovery, #tags_advanced').attr('disabled', 'true');
}
if(/\&source\=bookmarklet/i.test(window.location.href)) {
jQuery('#editlinkform').hide();
var editbtn = (jQuery('#editlink[name="delete_link"]').length == 1)
? '<?php echo t('Add this link');?>'
: '<?php echo t('Edit this link');?>';
var editlink = (jQuery('#lf_url').val().length > 40)
? jQuery('#lf_url').val().substring(0, 40)+'…'
: jQuery('#lf_url').val();
jQuery('#editlinkform').before(
'<div class="row" id="choose">'+
'<div class="col-md-12 text-center">'+
'<p class="text-center"><a href="javascript:void(0)" class="btn btn-warning btn-lg btn-block">'+
'<i class="fa fa-fw fa-star"></i> '+editbtn+
'<br><small>'+editlink+'</small>'+
'</a></p>'+
'<p><?php echo t('or');?></p>'+
'<p><a href="javascript:void(0)" class="btn btn-primary btn-lg btn-block">'+
'<i class="fa fa-fw fa-link"></i> <?php echo t('See all my links');?>'+
'</a></p>'+
'</div>'+
'</div>'
);
jQuery('#choose .btn-warning').on('click', function() {
jQuery('#choose').hide();
jQuery('#editlinkform').show();
});
jQuery('#choose .btn-primary').on('click', function() {
window.open(window.location.href.split('?')[0]);
self.close();
});
}
// Login MyFrama
if(/do=login/i.test(window.location.href)) {
// After registration
if(/do=login\&r/i.test(window.location.href)) {
if(/do=login\&first/i.test(window.location.href)) {
jQuery('#loginform').prepend('<div class="alert alert-info text-center"><button type="button" class="close" data-dismiss="alert" aria-label="<?php echo t('Close'); ?>"><span aria-hidden="true">&times;</span></button><b><?php echo t('Your account has been successfully created. You can sign in now.'); ?></b></div>');
jQuery('[name="returnurl"]').val('');
}
if(/\&source\=bookmarklet/i.test(window.location.href)) {
jQuery('.btn-success').before('<button class="btn btn-default pull-left" type="button" onclick="self.close();"><?php echo t('Cancel');?></button>');
}
<?php
if($GLOBALS['login'] == $account[count($account)-1]) {
echo "
......
<!DOCTYPE html>
<html>
<html {if="!empty($_GET['source']) && $_GET['source']=='bookmarklet'"}class="bookmarklet"{/if}>
<head>{include="includes"}
<link type="text/css" rel="stylesheet" href="../../inc/awesomplete.css" />
</head>
<body
{if="$link.title==''"}onload="document.linkform.lf_title.focus();"
{elseif="$link.description==''"}onload="document.linkform.lf_description.focus();"
{else}onload="document.linkform.lf_tags.focus();"{/if} >
{else}onload="document.linkform.lf_tags.focus();"{/if}
>
<div id="pageheader" class="row">
{if="$source !== 'firefoxsocialapi'"}
{include="page.header"}
......@@ -34,7 +35,7 @@
<p class="text-right">
<input type="submit" value="{'Save'|t}" name="save_edit" class="btn btn-success">
<input type="submit" value="{'Cancel'|t}" name="cancel_edit" class="btn btn-default">
<input type="submit" value="{'Cancel'|t}" name="cancel_edit" class="btn btn-default pull-left">
{if="!$link_is_new"}<input type="submit" value="{'Delete'|t}" name="delete_link" class="btn btn-danger" onClick="return confirmDeleteLink();">{/if}
<input type="hidden" name="token" value="{$token}">
{if="$http_referer"}<input type="hidden" name="returnurl" value="{$http_referer}">{/if}
......
......@@ -992,7 +992,7 @@ cite {
/************
* MyFrama *
************/
html, body {
html,body {
background: #eee;
}
......@@ -1304,4 +1304,39 @@ a.link-url:hover{ color: #333; }
/* Plugins admin */
#pluginsadmin {
padding-bottom:20px;
}
/* Bookmarklet */
html.bookmarklet,
html.bookmarklet body {
background: #fff;
}
.bookmarklet .ombre {
box-shadow:none;
}
.bookmarklet .home .ombre {
margin:0 auto;
}
.bookmarklet .home #registration,
.bookmarklet .home #login {
display:none;
}
.bookmarklet .row {
margin:0;
}
.bookmarklet #editlinkform {
padding-top:10px;
padding-bottom:0px;
}
.bookmarklet .home #registration h2,
.bookmarklet .home #login h2 {
text-align: center;
}
.bookmarklet #choose {
margin-top:20%;
}
\ No newline at end of file
jQuery(document).ready(function(){
// Bouton afficher/masquer la description
if(/do=daily|login/i.test(window.location.href) || !(/=/i.test(window.location.href))) {
jQuery('.sl-menu .list-inline.pull-right').prepend(
'<li><a id="descToggle" href="javascript:void(0);" title="Hide links descriptions">'+
'<i class="fa fa-fw fa-lg fa-toggle-on"></i><span class="sr-only">Hide links descriptions</span>'+
'</a></li>'
);
jQuery('#descToggle').click(
function(){
if(jQuery(this).children('i').hasClass('fa-toggle-on')) {
jQuery('.link-description').hide();
jQuery('#descToggle').attr('title', 'Show links descriptions');
jQuery('#descToggle').children('i').addClass('fa-toggle-off').removeClass('fa-toggle-on');
jQuery('#descToggle').children('.sr-only').text('Show links descriptions');
} else {
jQuery('.link-description').show();
jQuery('#descToggle').attr('title', 'Hide links descriptions');
jQuery('#descToggle').children('i').removeClass('fa-toggle-off').addClass('fa-toggle-on');
jQuery('#descToggle').children('.sr-only').text('Hide links descriptions');
}
}
);
}
// Mise en forme addlink_toolbar
jQuery('#addlink_toolbar form')
.wrapInner('<div class="input-group"></div>')
.addClass('col-sm-8 col-sm-offset-2');
jQuery('#addlink_toolbar input[type="submit"]')
.after(
'<span class="input-group-btn"><button class="btn btn-default" value="'+jQuery('.navbar a[href="?do=addlink"]').text()+'" type="submit">'+
'<i class="fa fa-fw fa-lg fa-plus text-success"></i> '+jQuery('.navbar a[href="?do=addlink"]').text()+
'</button></span>')
.remove();
jQuery('#addlink_toolbar input[type="text"]')
.addClass('form-control')
.attr('placeholder','http(s)://…');
if(/do=addlink|login/i.test(window.location.href) || !(/=/i.test(window.location.href))) {
jQuery('.navbar a[href="?do=addlink"]').parent().hide();
}
});
\ No newline at end of file
<?php
// Pré-remplissage Login
require_once str_replace('/tpl/frama/inc', '', dirname($_SERVER['SCRIPT_FILENAME'])) . '/data/config.php';
$account = explode('/', str_replace('/tpl/frama/inc', '', dirname($_SERVER['SCRIPT_FILENAME'])));
?>
jQuery(document).ready(function(){
// Bouton afficher/masquer la description
if(/do=daily|login/i.test(window.location.href) || !(/=/i.test(window.location.href))) {
jQuery('.sl-menu .list-inline.pull-right').prepend(
'<li><a id="descToggle" href="javascript:void(0);" title="Hide links descriptions">'+
'<i class="fa fa-fw fa-lg fa-toggle-on"></i><span class="sr-only">Hide links descriptions</span>'+
'</a></li>'
);
jQuery('#descToggle').click(
function(){
if(jQuery(this).children('i').hasClass('fa-toggle-on')) {
jQuery('.link-description').hide();
jQuery('#descToggle').attr('title', 'Show links descriptions');
jQuery('#descToggle').children('i').addClass('fa-toggle-off').removeClass('fa-toggle-on');
jQuery('#descToggle').children('.sr-only').text('Show links descriptions');
} else {
jQuery('.link-description').show();
jQuery('#descToggle').attr('title', 'Hide links descriptions');
jQuery('#descToggle').children('i').removeClass('fa-toggle-off').addClass('fa-toggle-on');
jQuery('#descToggle').children('.sr-only').text('Hide links descriptions');
}
}
);
}
// Mise en forme addlink_toolbar
jQuery('#addlink_toolbar form')
.wrapInner('<div class="input-group"></div>')
.addClass('col-sm-8 col-sm-offset-2');
jQuery('#addlink_toolbar input[type="submit"]')
.after(
'<span class="input-group-btn"><button class="btn btn-default" value="'+jQuery('.navbar a[href="?do=addlink"]').text()+'" type="submit">'+
'<i class="fa fa-fw fa-lg fa-plus text-success"></i> '+jQuery('.navbar a[href="?do=addlink"]').text()+
'</button></span>')
.remove();
jQuery('#addlink_toolbar input[type="text"]')
.addClass('form-control')
.attr('placeholder','http(s)://…');
if(/do=addlink|login/i.test(window.location.href) || !(/=/i.test(window.location.href))) {
jQuery('.navbar a[href="?do=addlink"]').parent().hide();
}
// Login MyFrama
if(/do=login/i.test(window.location.href)) {
// After registration
if(/do=login\&r/i.test(window.location.href)) {
jQuery('#loginform').prepend('<div class="alert alert-info text-center"><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button><b>Votre compte MyFrama a bien été créé. Vous pouvez à présent vous y connecter.</b></div>');
jQuery('[name="returnurl"]').val('');
}
<?php
if($GLOBALS['login'] == $account[count($account)-1]) {
echo "
jQuery('#login').val('".$GLOBALS['login']."');";
}
?>
}
});
<!DOCTYPE html>
<html>
<html {if="!empty($_GET['source']) && $_GET['source']=='bookmarklet'"}class="bookmarklet"{/if}>
<head>{include="includes"}</head>
<body
{if="ban_canLogin()"}
......@@ -8,7 +8,8 @@
{else}
onload="document.loginform.password.focus();"
{/if}
{/if}>
{/if}
>
<div id="pageheader">
{include="page.header"}
</div>
......
{if="empty($_GET['source'])"}
<div id="footer" class="container text-center">
<strong><a href="https://github.com/shaarli/Shaarli">{'Shaarli'|t}</a></strong> - {'The personal, minimalist, super-fast, database free, bookmarking service<br>by the Shaarli community'|t} - <a href="doc/Home.html" rel="nofollow">{'Help/documentation'|t}</a>
{loop="$plugins_footer.text"}
{$value}
{/loop}
</div>
{/if}