\r\n";
+ // Nettoyage simple de l'email expéditeur.
$sender = str_replace(["\r", "\n"], '', post('email'));
$headers = 'From: '. $sender . "\r\n" .
'Reply-To: '. $sender . "\r\n" .
@@ -18,6 +25,7 @@ if(isset($_POST['submit'])) {
'MIME-Version: 1.0' . "\r\n" .
'Content-type: text/html; charset=UTF-8' . "\r\n";
+ // Anti-spam basique via champ caché et captcha.
if(post('ns') == '' && $_POST['captcha'] == -2) {
$send = true;
if(post('name') == '') {
@@ -49,6 +57,7 @@ if(isset($_POST['submit'])) {
}
}
+// Préremplissage du formulaire avec les infos connues.
if(post('name') != '')
$contact['name'] = post('name');
else if($user->rankIsHigher("registered"))
@@ -68,6 +77,7 @@ $contact['message'] = post('message');
$contact['ns'] = post('ns');
+// Chargement de la vue contact.
$head['css'] = "d.index.css;d.user.css";
$head['js'] = "d.captcha.js";
$head['title'] = "Contact";
diff --git a/src/Controllers/d.map.php b/src/Controllers/d.map.php
index 91badf5..549c926 100755
--- a/src/Controllers/d.map.php
+++ b/src/Controllers/d.map.php
@@ -1,7 +1,12 @@
splitted_url[1]) && $controller->splitted_url[1] != '') {
switch ($controller->splitted_url[1]) {
default:
@@ -10,6 +15,7 @@ if(isset($controller->splitted_url[1]) && $controller->splitted_url[1] != '') {
}
}
else {
+ // Chargement de la carte et des dépendances Leaflet.
$head['title'] = "Carte";
$head['third'] = "leaflet/leaflet.js;leaflet-fullscreen/Leaflet.fullscreen.min.js;leaflet-easybutton/easy-button.js";
$head['css'] .= ";d.map.css;../third/leaflet/leaflet.css;../third/leaflet-fullscreen/leaflet.fullscreen.css;../third/leaflet-easybutton/easy-button.css";
diff --git a/src/Controllers/d.poi.php b/src/Controllers/d.poi.php
index e8c35af..43447fd 100755
--- a/src/Controllers/d.poi.php
+++ b/src/Controllers/d.poi.php
@@ -1,5 +1,9 @@
splitted_url[1]) {
case "new":
if ($user->rankIsHigher("registered")) {
@@ -23,6 +28,7 @@ switch ($controller->splitted_url[1]) {
$poi->source = "kab";
$poi->is_commentable = 't';
+ // Paramètres selon le type de POI.
$definition = $poi_types[$poi->poi_type][5];
$params = [];
@@ -92,6 +98,7 @@ switch ($controller->splitted_url[1]) {
break;
case "elevation_proxy":
+ // Proxy vers l'API d'élévation.
if (isset($_GET['location'])) {
if (!preg_match('/^[0-9,\.\|\-]+$/', $_GET['location'])) {
$notfound = 1;
@@ -107,6 +114,7 @@ switch ($controller->splitted_url[1]) {
break;
case "api_list":
+ // API JSON pour la liste des POIs (carte).
header("Content-Type: application/json; charset=utf-8");
$pois = new Kabano\Pois();
diff --git a/src/Controllers/d.users.php b/src/Controllers/d.users.php
index 6bce8a6..790df10 100755
--- a/src/Controllers/d.users.php
+++ b/src/Controllers/d.users.php
@@ -1,9 +1,14 @@
splitted_url[1])) {
switch ($controller->splitted_url[1]) {
case 'login':
@@ -38,6 +43,7 @@ if(isset($controller->splitted_url[1])) {
}
break;
case 'logout':
+ // Déconnexion et retour à la page précédente si locale.
session_destroy();
$redirect = $config['rel_root_folder'];
if (!empty($_SERVER['HTTP_REFERER'])) {
@@ -91,6 +97,7 @@ if(isset($controller->splitted_url[1])) {
}
break;
case 'password_lost':
+ // Demande de réinitialisation du mot de passe.
$head['title'] = "Récupération de mot de passe";
if ($user->rank == "visitor") {
if (isset($_POST['submit'])) {
@@ -198,6 +205,7 @@ if(isset($controller->splitted_url[1])) {
}
break;
case 'member_list':
+ // Liste des membres.
if ($user->rankIsHigher("registered")) {
$rows_per_pages = 50;
// Get the correct page number
diff --git a/src/Controllers/d.wiki.php b/src/Controllers/d.wiki.php
index dc9d230..022be24 100755
--- a/src/Controllers/d.wiki.php
+++ b/src/Controllers/d.wiki.php
@@ -1,5 +1,9 @@
array("Abri sommaire", "Abri", "#ef2929", "basic_hut",
diff --git a/src/Core/routes.php b/src/Core/routes.php
index 92226f0..6de0b36 100755
--- a/src/Core/routes.php
+++ b/src/Core/routes.php
@@ -4,9 +4,11 @@
** This file contains the routing from any request to the correct view and controller
*****/
+// Objets pour partager les informations de routeur avec les contrôleurs et vues.
$controller = new stdClass;
$view = new stdClass;
+// URL complète demandée par le client.
$controller->full_url = $_SERVER['REQUEST_URI'];
$controller->url_no_param = explode('?',$controller->full_url);
@@ -17,9 +19,11 @@ $controller->splitted_url = explode ('/',$controller->base_url);
// By default we use the desktop
$view->prefix = "d.";
$controller->prefix = "d.";
+// Flags de gestion d'erreurs et de session.
$notfound = 0;
$session = 1;
+// La racine du site redirige vers la page d'accueil.
if($controller->splitted_url[0]=="") $controller->splitted_url[0]="index";
// Routing to the correct page from the correct link
@@ -46,20 +50,24 @@ switch ($controller->splitted_url[0])
default :
$controller->name="";
$view->name="";
- $notfound = 1;
+ $notfound = 1;
break;
}
+// Initialisation de la session utilisateur.
if($session==1) {
require_once($config['includes_folder']."session.php");
}
+// Exécution du contrôleur correspondant si défini.
if($controller->name != "") {
include ($config['controllers_folder'].$controller->prefix.$controller->name.".php");
}
+// Affichage de la vue statique si définie.
if($view->name != "") {
include ($config['views_folder'].$view->prefix.$view->name.".html");
}
+// Rendu de la page 404 via le wiki si aucune route n'a correspondu.
if($notfound) {
require_once($config['includes_folder']."session.php");
require_once($config['models_folder']."d.wiki.php");
diff --git a/src/Core/session.php b/src/Core/session.php
index 8286fe2..9b3fc3e 100755
--- a/src/Core/session.php
+++ b/src/Core/session.php
@@ -1,19 +1,26 @@
checkID($_SESSION['userid'])) {
+ // Mise à jour de la date de connexion et des préférences.
$user->updateLoginDate();
$config['locale'] = $user->locale;
$config['timezone'] = $user->timezone;
}
else {
+ // Réinitialisation si la session est invalide.
session_destroy();
$config['locale'] = "fr_FR";
$config['timezone'] = "Europe/Paris";
@@ -21,11 +28,13 @@ if(isset($_SESSION['userid'])) {
}
}
else {
+ // Configuration par défaut pour les visiteurs.
$config['locale'] = "fr_FR";
$config['timezone'] = "Europe/Paris";
$user->rank = "visitor"; // All users are visitors
}
+// Formatage des dates selon la version PHP.
if (PHP_VERSION_ID < 80000) {
$user->date_format = new IntlDateFormatter($config['locale'], IntlDateFormatter::LONG, IntlDateFormatter::NONE, $config['timezone']);
} else {
diff --git a/src/Models/d.blog.php b/src/Models/d.blog.php
index 3911e2e..878151f 100755
--- a/src/Models/d.blog.php
+++ b/src/Models/d.blog.php
@@ -13,6 +13,7 @@ namespace Kabano;
require_once($config['third_folder']."Md/MarkdownExtra.inc.php");
require_once($config['includes_folder']."database.php");
+// Objet représentant un article de blog.
class BlogArticle
{
public $content_id = NULL;
@@ -39,6 +40,7 @@ class BlogArticle
return '';
}
+ // Le contenu est stocké comme {"text": "..."} en base.
$decoded = json_decode($value, true);
if (!is_array($decoded)) {
return '';
@@ -53,6 +55,7 @@ class BlogArticle
public function checkPermalink($permalink, $withArchive=0, $elementNb=0) {
global $config;
+ // Recherche de la dernière version publiée.
$con = sql_connect();
$query = "SELECT content_versions.id AS version_id, * FROM contents INNER JOIN content_locales ON contents.id = content_locales.content_id INNER JOIN content_versions ON content_locales.id = content_versions.locale_id WHERE permalink=$1 AND type='blog'";
@@ -145,6 +148,7 @@ class BlogArticle
global $config;
global $user;
+ // Protection contre l'édition sans identifiants valides.
if($this->content_id == 0 || $this->locale_id == 0 || $this->version_id == 0)
die("Cannot update entry without giving ID");
@@ -173,6 +177,7 @@ class BlogArticle
$this->version_id = pg_fetch_assoc($result)['id'];
+ // Association de l'auteur comme contributeur.
$query = "INSERT INTO content_contributors (content, contributor) VALUES
($1, $2) ON CONFLICT (content, contributor) DO NOTHING";
@@ -181,6 +186,7 @@ class BlogArticle
$result = pg_execute($con, "prepare3", array($this->locale_id, $user->id))
or die ("Cannot execute statement\n");
+ // Mise à jour du flag de commentaires.
$query = "UPDATE contents SET is_commentable = $1 WHERE id = $2";
pg_prepare($con, "prepare4", $query)
or die ("Cannot prepare statement\n");
@@ -252,6 +258,7 @@ class BlogArticle
global $config;
global $user;
+ // Création d'un article publié par défaut.
$con = sql_connect();
pg_query($con, "BEGIN");
@@ -288,6 +295,7 @@ class BlogArticle
$this->version_id = pg_fetch_assoc($result)['id'];
+ // Ajout du contributeur.
$query = "INSERT INTO content_contributors (content, contributor) VALUES
($1, $2)";
@@ -310,6 +318,7 @@ class BlogArticle
** Converts the Markdown content to HTML
*****/
public function md2html() {
+ // Transforme le contenu Markdown en HTML.
$this->content_html = \Michelf\MarkdownExtra::defaultTransform($this->content);
}
@@ -317,6 +326,7 @@ class BlogArticle
** Converts the Markdown content to text
*****/
public function md2txt() {
+ // Transforme le contenu Markdown en texte brut.
$this->md2html();
$this->content_txt = strip_tags($this->content_html);
}
@@ -331,6 +341,7 @@ class BlogArticle
***********************************************************
**********************************************************/
+// Liste paginée des articles de blog.
class BlogArticles
{
public $objs = array();
@@ -342,6 +353,7 @@ class BlogArticles
public function listArticles($first, $count, $archive=0) {
global $config;
+ // Récupère les versions non archivées.
$con = sql_connect();
$query = "SELECT content_versions.id AS version_id, * FROM contents INNER JOIN content_locales ON contents.id = content_locales.content_id INNER JOIN content_versions ON content_locales.id = content_versions.locale_id WHERE is_archive=FALSE ";
@@ -370,6 +382,7 @@ class BlogArticles
public function number($archive=0) {
global $config;
+ // Compte le nombre d'articles.
$con = sql_connect();
$query = "SELECT content_versions.id AS version_id, * FROM contents INNER JOIN content_locales ON contents.id = content_locales.content_id INNER JOIN content_versions ON content_locales.id = content_versions.locale_id WHERE is_archive=FALSE ";
@@ -393,6 +406,7 @@ class BlogArticles
public function getHistory($url) {
global $config;
+ // Récupère l'historique des versions d'un article.
$con = sql_connect();
$query = "SELECT content_versions.id AS version_id, * FROM contents INNER JOIN content_locales ON contents.id = content_locales.content_id INNER JOIN content_versions ON content_locales.id = content_versions.locale_id WHERE permalink=$1 AND type='blog' ORDER BY update_date DESC";
diff --git a/src/Models/d.comments.php b/src/Models/d.comments.php
index 331b81c..c0f477e 100644
--- a/src/Models/d.comments.php
+++ b/src/Models/d.comments.php
@@ -13,6 +13,7 @@ namespace Kabano;
require_once($config['third_folder']."Md/MarkdownExtra.inc.php");
require_once($config['includes_folder']."database.php");
+// Objet représentant un commentaire sur un contenu.
class Comment
{
public $id = NULL;
@@ -35,6 +36,7 @@ class Comment
public function checkID($id) {
global $config;
+ // Chargement du commentaire par ID.
$con = sql_connect();
$query = "SELECT * FROM content_comments WHERE id=$1";
@@ -64,6 +66,7 @@ class Comment
return;
}
+ // Mapping des champs SQL vers les propriétés.
if (array_key_exists('id', $row)) {
$this->id = $row['id'];
}
@@ -102,6 +105,7 @@ class Comment
public function insert() {
global $config;
+ // Insertion d'un nouveau commentaire.
$con = sql_connect();
$query = "INSERT INTO content_comments (version, creation_date, update_date, author, is_public, is_archive, content, comment, locale) VALUES
@@ -124,6 +128,7 @@ class Comment
global $config;
global $user;
+ // Archivage logique du commentaire.
$con = sql_connect();
$query = "UPDATE content_comments SET is_public = FALSE WHERE id = $1";
@@ -148,6 +153,7 @@ class Comment
global $config;
global $user;
+ // Restauration d'un commentaire archivé.
$con = sql_connect();
$query = "UPDATE content_comments SET is_public = TRUE WHERE id = $1";
@@ -169,6 +175,7 @@ class Comment
** Converts the Markdown comment to HTML
*****/
public function md2html() {
+ // Conversion Markdown -> HTML.
$this->comment_html = \Michelf\MarkdownExtra::defaultTransform($this->comment);
}
@@ -176,6 +183,7 @@ class Comment
** Converts the Markdown comment to text
*****/
public function md2txt() {
+ // Conversion Markdown -> texte brut.
$this->md2html();
$this->comment_txt = strip_tags($this->comment_html);
}
@@ -190,11 +198,13 @@ class Comment
***********************************************************
**********************************************************/
+// Liste de commentaires liée à un contenu.
class Comments
{
public $objs = array();
public $number = NULL;
+ // Retourne la liste des commentaires pour un contenu.
/*****
** Return the list of different articles
*****/
diff --git a/src/Models/d.locales.php b/src/Models/d.locales.php
index fbab96e..0faa26b 100755
--- a/src/Models/d.locales.php
+++ b/src/Models/d.locales.php
@@ -12,6 +12,7 @@ namespace Kabano;
require_once($config['includes_folder']."database.php");
+// Objet représentant une locale (langue).
class Locale
{
public $name = 0;
@@ -24,6 +25,7 @@ class Locale
public function checkName($name) {
global $config;
+ // Chargement de la locale par son code.
$con = sql_connect();
$query = "SELECT * FROM locales WHERE name=$1";
@@ -53,6 +55,7 @@ class Locale
return;
}
+ // Mapping des champs SQL.
if (array_key_exists('name', $row)) {
$this->name = $row['name'];
}
@@ -78,12 +81,14 @@ class Locales
public $number = 0;
public $objs = array();
+ // Charge toutes les locales disponibles.
/*****
** Get all locales
*****/
public function getAll() {
global $config;
+ // Récupère la liste complète des locales.
$con = sql_connect();
$query = "SELECT * FROM locales";
diff --git a/src/Models/d.poi.php b/src/Models/d.poi.php
index b82b9fb..ebcf241 100755
--- a/src/Models/d.poi.php
+++ b/src/Models/d.poi.php
@@ -14,6 +14,7 @@ require_once($config['third_folder']."Md/MarkdownExtra.inc.php");
require_once($config['includes_folder']."poi_types.struct.php");
require_once($config['includes_folder']."database.php");
+// Objet représentant un point d'intérêt.
class Poi
{
public $content_id = NULL;
@@ -46,6 +47,7 @@ class Poi
return [];
}
+ // Les paramètres sont stockés en JSON.
$decoded = json_decode($value, true);
if (!is_array($decoded)) {
return [];
@@ -60,6 +62,7 @@ class Poi
public function checkPermalink($permalink, $withArchive=0, $elementNb=0) {
global $config;
+ // Récupère la dernière version du POI.
$con = sql_connect();
$query = "SELECT
@@ -134,6 +137,7 @@ class Poi
return;
}
+ // Décode les paramètres JSON et mappe les champs.
$decodedParameters = null;
if (array_key_exists('parameters', $row)) {
$decodedParameters = $this->decodeJsonArray($row['parameters']);
@@ -214,6 +218,7 @@ class Poi
global $config;
global $user;
+ // Création d'un nouveau POI.
$con = sql_connect();
pg_query($con, "BEGIN");
@@ -282,6 +287,7 @@ class Poi
global $config;
global $user;
+ // Vérifie que les identifiants sont chargés.
if ($this->content_id == 0 || $this->locale_id == 0 || $this->version_id == 0)
die("Cannot update entry without giving ID");
@@ -342,6 +348,7 @@ class Poi
global $config;
global $user;
+ // Archivage logique du POI.
$con = sql_connect();
$query = "UPDATE contents SET is_public = FALSE WHERE id = $1";
@@ -365,6 +372,7 @@ class Poi
global $config;
global $user;
+ // Restauration d'un POI archivé.
$con = sql_connect();
$query = "UPDATE contents SET is_public = TRUE WHERE id = $1";
@@ -382,14 +390,17 @@ class Poi
}
}
+// Liste de points d'intérêt (POI).
class Pois
{
public $objs = [];
public $number = 0;
+ // Liste des POIs publiés (ou archivés si demandé).
public function listPois($archive=0) {
global $config;
+ // Chargement des POIs avec leurs versions actives.
$con = sql_connect();
$query = "SELECT
@@ -453,6 +464,7 @@ class Pois
public function getHistory($permalink) {
global $config;
+ // Historique des versions d'un POI.
$con = sql_connect();
$query = "SELECT
diff --git a/src/Models/d.users.php b/src/Models/d.users.php
index b87e4ef..56e971d 100755
--- a/src/Models/d.users.php
+++ b/src/Models/d.users.php
@@ -23,6 +23,7 @@ $ranks = array(
"visitor" => array(0,"Visiteur", "black", "visitor")
);
+// Objet représentant un utilisateur.
class User
{
public $id = 0;
@@ -52,6 +53,7 @@ class User
public function checkID($id) {
global $config;
+ // Recherche de l'utilisateur par identifiant.
$con = sql_connect();
$query = "SELECT * FROM users WHERE id=$1";
@@ -79,6 +81,7 @@ class User
public function login($login, $pass) {
global $config;
+ // Connexion à partir du nom et du mot de passe.
$con = sql_connect();
$query = "SELECT * FROM users WHERE name=$1 AND password=$2";
@@ -105,6 +108,7 @@ class User
return;
}
+ // Mapping des champs SQL vers les propriétés.
if (array_key_exists('id', $row)) {
$this->id = $row['id'];
}
@@ -152,6 +156,7 @@ class User
public function get_rank() {
global $ranks;
+ // Renvoie l'affichage HTML du rang.
return ''.$ranks[$this->rank][1].'';
}
public function get_locale() {
@@ -174,6 +179,7 @@ class User
public function rankIsHigher($rank) {
global $ranks;
+ // Compare le niveau de rang.
return $ranks[$this->rank][0] >= $ranks[$rank][0];
}
@@ -183,6 +189,7 @@ class User
public function availableName() {
global $config;
+ // Vérifie l'unicité du pseudo.
$con = sql_connect();
$query = "SELECT * FROM users WHERE lower(name)=$1";
diff --git a/src/Models/d.wiki.php b/src/Models/d.wiki.php
index b9644d9..c3629dd 100755
--- a/src/Models/d.wiki.php
+++ b/src/Models/d.wiki.php
@@ -13,6 +13,7 @@ namespace Kabano;
require_once($config['third_folder']."Md/MarkdownExtra.inc.php");
require_once($config['includes_folder']."database.php");
+// Objet représentant une page wiki.
class WikiPage
{
public $content_id = NULL;
@@ -38,6 +39,7 @@ class WikiPage
return '';
}
+ // Contenu stocké sous la forme {"text": "..."}.
$decoded = json_decode($value, true);
if (!is_array($decoded)) {
return '';
@@ -52,6 +54,7 @@ class WikiPage
public function checkPermalink($permalink, $withArchive=0, $elementNb=0) {
global $config;
+ // Récupère la dernière version de la page.
$con = sql_connect();
$query = "SELECT content_versions.id AS version_id, * FROM contents INNER JOIN content_locales ON contents.id = content_locales.content_id INNER JOIN content_versions ON content_locales.id = content_versions.locale_id WHERE permalink=$1 AND type='wiki'";
@@ -85,6 +88,7 @@ class WikiPage
return;
}
+ // Mapping des champs SQL vers les propriétés.
$decodedContent = null;
if (array_key_exists('content', $row)) {
$decodedContent = $this->decodeJsonText($row['content']);
@@ -144,6 +148,7 @@ class WikiPage
global $config;
global $user;
+ // Protection contre les mises à jour sans IDs.
if($this->content_id == 0 || $this->locale_id == 0 || $this->version_id == 0)
die("Cannot update entry without giving ID");
@@ -172,6 +177,7 @@ class WikiPage
$this->version_id = pg_fetch_assoc($result)['id'];
+ // Ajout du contributeur si absent.
$query = "INSERT INTO content_contributors (content, contributor) VALUES
($1, $2) ON CONFLICT (content, contributor) DO NOTHING";
@@ -197,6 +203,7 @@ class WikiPage
global $config;
global $user;
+ // Archivage logique de la page.
$con = sql_connect();
$query = "UPDATE contents SET is_public=FALSE WHERE permalink=$1 AND type='wiki'";
@@ -221,6 +228,7 @@ class WikiPage
global $config;
global $user;
+ // Restauration d'une page archivée.
$con = sql_connect();
$query = "UPDATE contents SET is_public=TRUE WHERE permalink=$1 AND type='wiki'";
@@ -245,6 +253,7 @@ class WikiPage
global $config;
global $user;
+ // Création d'une nouvelle page wiki.
$con = sql_connect();
pg_query($con, "BEGIN");
@@ -303,6 +312,7 @@ class WikiPage
** Converts the Markdown content to HTML
*****/
public function md2html() {
+ // Conversion Markdown -> HTML.
$this->content_html = \Michelf\MarkdownExtra::defaultTransform($this->content);
}
}
@@ -315,11 +325,13 @@ class WikiPage
***********************************************************
**********************************************************/
+// Liste de pages wiki.
class WikiPages
{
public $objs = array();
public $number = NULL;
+ // Historique des versions d'une page.
/*****
** Checks if a page at this URL exists and return the ID
*****/
From 41625ac44310203c49d19c21a521207df392d5bd Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 24 Jan 2026 15:18:15 +0000
Subject: [PATCH 3/3] Add header comments to HTML and CSS
Co-authored-by: LeOSW42 <673670+LeOSW42@users.noreply.github.com>
---
public/views/blocks/d.footer.html | 1 +
public/views/blocks/d.head.html | 1 +
public/views/blocks/d.nav.html | 1 +
public/views/css/d.admin.css | 1 +
public/views/css/d.blog.css | 1 +
public/views/css/d.index.css | 1 +
public/views/css/d.map.css | 1 +
public/views/css/d.poi.css | 1 +
public/views/css/d.user.css | 1 +
public/views/css/d.wiki.css | 1 +
public/views/d.admin.backup.html | 1 +
public/views/d.admin.git-pull.html | 1 +
public/views/d.admin.html | 1 +
public/views/d.admin.logs.html | 1 +
public/views/d.admin.stats.html | 1 +
public/views/d.admin.wiki-files.html | 1 +
public/views/d.blog.edit.html | 1 +
public/views/d.blog.list.html | 1 +
public/views/d.blog.list.rss | 2 +-
public/views/d.blog.view.html | 1 +
public/views/d.community.html | 1 +
public/views/d.contact.html | 1 +
public/views/d.index.html | 1 +
public/views/d.map.html | 1 +
public/views/d.poi.edit.html | 1 +
public/views/d.poi.view.html | 1 +
public/views/d.user.login.html | 1 +
public/views/d.user.member_list.html | 1 +
public/views/d.user.password_lost.html | 1 +
public/views/d.user.profile.edit.html | 1 +
public/views/d.user.profile.html | 1 +
public/views/d.user.signin.html | 1 +
public/views/d.wiki.edit.html | 1 +
public/views/d.wiki.view.html | 1 +
34 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/public/views/blocks/d.footer.html b/public/views/blocks/d.footer.html
index b995c1d..2d75bbe 100755
--- a/public/views/blocks/d.footer.html
+++ b/public/views/blocks/d.footer.html
@@ -1,3 +1,4 @@
+