> $realFiles
*/
function scanFolder($folder){
$folder = utf8_decode($folder);
$noFolders = array(
$folder.'.dc',
$folder.'.'
);
$folder = str_replace('//','/',$folder);
$root = getConfig('ROOT');
if(realpath($folder)==realpath('../'.UPLOAD_FOLDER))$noFolders []=$folder.'..';
$filteredFiles = array();
//if($folder!='../uploads/') var_dump(mb_detect_encoding($folder),$folder);
$files = scandir($folder);
$realFiles = array();
foreach($files as $file){
$fileArray = array();
//echo var_dump($folder.$file);
if(DISPLAY_DOTFILES || (substr($file,0,1)!='.' || $file=='..') ){
if(is_file($folder.$file)){
if(!isset($filter) || in_array(str_replace('../','',utf8_encode($folder.$file)),$filteredFiles)){
$fileArray['type'] = 'file';
$fileArray['toolTipName'] =wordwrap(utf8_encode($file),29,'
',true);
$fileArray['name'] = utf8_encode($file);
$fileArray['shortname'] =utf8_encode(short($file,NAME_LIMIT,get_extension($file)));
$fileArray['extension'] =get_extension($file);
$fileArray['url'] = utf8_encode(str_replace('../','',$folder).$file);
$fileArray['absoluteUrl'] = $root.'php/action.php?action=openFile&file=../'.$fileArray['url'];
$fileArray['size'] = getSize($folder.$file);
$fileArray['published'] = isPublished($folder.$file);
$mtime = filemtime ($folder.$file);
$fileArray['mtimeDate'] = date('d/m/Y',$mtime);
$fileArray['mtimeHour'] = date('h\hi\m',$mtime);
$realFiles[]=$fileArray;
unset($fileArray);
}
}else{
if(!in_array($folder.$file, $noFolders) && ( !DISPLAY_AVATAR_FOLDER && realpath($folder.$file)!=realpath('../'.AVATARFOLDER)) ){
$fileArray['type'] = 'folder';
$fileArray['name'] = utf8_encode($file);
$fileArray['shortname'] =utf8_encode(short($file,NAME_LIMIT,get_extension($file)));
$fileArray['url'] = utf8_encode(str_replace('//','/',$folder.'/'.$file));
if($file=='..')$fileArray['url'] =rewindPath($fileArray['url']);
$fileArray['size'] ='10ko';
$realFiles[]=$fileArray;
unset($fileArray);
}
}
}
}
return $realFiles;
}
/**
* Retourne le resume d'une chaine $string au bout de $limit caracteres en ne prenant par compte de l'extension $ext (si c'est un fichier)
* Enter description here ...
* @param $string
* @param $limit
* @param $ext
* @author Idleman
* @return string $shortName
*/
function short($string,$limit,$ext){
return (strlen($string)>$limit?substr($string,0,$limit-3).NAME_LIMIT_BORDER.$ext:$string);
}
/**
*
* Retourne l'extension d'un fichier a partir de son nom
* @param $file_name
* @author Idleman
* @return string $extension
*/
function get_extension($file_name){
$ext = explode('.', $file_name);
$ext = (count($ext)==1?null:array_pop($ext));
return strtolower($ext);
}
function getEvents(){
if(!file_exists('../'.DCFOLDER.EVENTFILE)) @touch('../'.DCFOLDER.EVENTFILE);
return file('../'.DCFOLDER.EVENTFILE);
}
/**
*
* Lit le fichier JSON des evenements, le parse et les retourne sous forme d'une liste d'objets JSON
* @author Idleman
* @return array $events
*/
function parseEvents(){
$events = getEvents();
$parsedEvents = array();
foreach($events as $event){
$parsedEvents [] = json_decode($event);
}
return $parsedEvents;
}
/**
*
* Ajoute un Evenement au fichier JSON de stockage des evenements
* @author Idleman
* @param array<> $event
*/
function addEvent($event){
file_put_contents('../'.DCFOLDER.EVENTFILE,json_encode($event)."\r\n",FILE_APPEND);
}
/**
*
* Ajoute un parametre au fichier securise JSON de configuration
* @author Idleman
* @param array<> $user
*/
function addConfig($key,$value){
$config = array($key => $value);
file_put_contents('../'.DCFOLDER.CONFIGFILE,SECURE_DELIMITER_BEGIN.json_encode($config).SECURE_DELIMITER_END."\r\n",FILE_APPEND);
}
/**
*
* Encode le mot de passe fournis en sha1 et md5
* @param string password
* @author Idleman
*/
function encode($str){
return md5(sha1($str));
}
/**
*
* Teste l'existence d'un compte utilisateur dans la base.
* @param string $login
* @param string $password
* @author Idleman
* @return si l'utilisateur existe, il le retourne dans le cas contraire : boolean faux
*/
function exist($login,$password){
$user = getUser($login);
return ($user!=false && $user->password==encode($password)?$user:false);
}
/**
*
* Teste l'existence d'un compte utilisateur dans la base en fonction de son authToken.
* @param string $token
* @author Idleman
* @return boolean vrai ou faux
*/
function existToken($token){
$users = parseUsers();
$target = false;
foreach($users as $user){
if(strcasecmp(getToken($user),$token)==0)$target=$user;
}
return ($target!=false?$target:false);
}
function getToken($user){
return sha1(LEFT_HASH.$user->login.$user->password.RIGHT_HASH);
}
function existLogin($login){
$user = getUser($login);
return ($user!=false?$user:false);
}
/**
*
* Retourne les infos liees a un parametre de configuration sous la forme d'un objet JSON a partir de sa cle
* @param $login
* @return JSONObject $target
* @author Idleman
*/
function getConfig($key){
$configs = parseConfigs();
$target = false;
foreach($configs as $config){
$config = get_object_vars($config);
if(isset($config[$key])){
$target=$config[$key];
}
}
return $target;
}
/**
*
* Ajoute un utilisateur au fichier securise JSON de stockage des utilisateurs
* @author Idleman
* @param array<> $user
*/
function addUser($user,$encodePassword = true){
if($encodePassword) $user['password'] = encode($user['password']);
file_put_contents('../'.DCFOLDER.USERFILE,SECURE_DELIMITER_BEGIN.json_encode($user).SECURE_DELIMITER_END."\r\n",FILE_APPEND);
}
/**
*
* Retourne les infos d'un utilisateur sous la forme d'un objet JSON a partir de son login
* @param $login
* @return JSONObject $target
* @author Idleman
*/
function getUser($login){
$users = parseUsers();
$target = false;
foreach($users as $user){
if(strcasecmp($user->login,$login)==0)$target=$user;
}
return $target;
}
/**
*
* update les params d'un user à partir de son login
* @param $login
* @return JSONObject $target
* @author H3
* @edit [21/03/2012] Idleman -> Cryptage du mdp, non modification du mdp si nouveaux mdp vide
*/
function updateUser($login,$values){
$user = get_object_vars(getUser($login));
foreach($values as $attr=>$value){
if(!($attr == 'password' && ($value =="") || !isset($value))) $user[$attr] = ($attr=='password'?encode($value):$value);
}
deleteUser($login);
addUser($user,false);
$_SESSION['user'] = serialize((object)$user);
}
/**
* Supprime une utilisateur de la base a partir de son login
* @param string $login
* @author Idleman
*/
function deleteUser($login){
$users = parseUsers();
$targets = array();
unlink('../'.DCFOLDER.USERFILE);
foreach($users as $currentUser){
if($currentUser->login!=$login){
file_put_contents('../'.DCFOLDER.USERFILE,SECURE_DELIMITER_BEGIN.json_encode($currentUser).SECURE_DELIMITER_END."\r\n",FILE_APPEND);
}
}
}
/**
* Parse le fichiers des utilisateurs et les retourne sous forme d'une liste d'objets JSON
* @param [OPTIONNAL] string $dir
* @author Idleman
* @return array $users
*/
function parseUsers($dir = '../'){
$userLines = file($dir.DCFOLDER.USERFILE);
$users = array();
foreach($userLines as $userLine){
if(trim($userLine)!=''){
$catchedUser = json_decode(str_replace(array(SECURE_DELIMITER_BEGIN,SECURE_DELIMITER_END),'',$userLine));
if(!isset($catchedUser->avatar) || trim($catchedUser->avatar)==''){
//if($catchedUser->mail!=''){
$catchedUser->avatar= getGravatar($catchedUser);
//}else{
// $catchedUser->avatar =AVATARFOLDER.AVATAR_DEFAULT;
//}
}
$users [] = $catchedUser;
}
}
return $users;
}
function deletePublish($file){
$publishes = parsePublishes();
$targets = array();
unlink('../'.DCFOLDER.PUBLISHFILE);
foreach($publishes as $publish){
if($publish!=$file){
file_put_contents('../'.DCFOLDER.PUBLISHFILE,SECURE_DELIMITER_BEGIN.json_encode(utf8_encode($publish)).SECURE_DELIMITER_END."\r\n",FILE_APPEND);
}
}
}
/**
*
* Ajoute un fichier publié au fichier des publications
* @author Idleman
* @param file
*/
function addPublish($file){
if(!isPublished($file)){
file_put_contents('../'.DCFOLDER.PUBLISHFILE,SECURE_DELIMITER_BEGIN.json_encode(utf8_encode($file)).SECURE_DELIMITER_END."\r\n",FILE_APPEND);
}
}
/**
*
* Questionne le fichier des publications pour voir si le fichier est publié.
* @param $file chemin du fichier
* @return true ou false
* @author Idleman
*/
function isPublished($file){
$publishes = parsePublishes();
$target = false;
foreach($publishes as $publish){
if(strcasecmp($publish,$file)==0)$target = true;
}
return $target;
}
/**
* Parse le fichiers des publication et les retourne sous forme d'une liste d'objets JSON
* @param [OPTIONNAL] string $dir
* @author Idleman
* @return array $publishes
*/
function parsePublishes($dir = '../'){
if(!file_exists($dir.DCFOLDER.PUBLISHFILE)) touch($dir.DCFOLDER.PUBLISHFILE);
$publishesLines = file($dir.DCFOLDER.PUBLISHFILE);
$publishes = array();
foreach($publishesLines as $publishLine){
if(trim($publishLine)!=''){
$publishes [] = utf8_decode(json_decode(str_replace(array(SECURE_DELIMITER_BEGIN,SECURE_DELIMITER_END),'',$publishLine)));
}
}
return $publishes;
}
/**
* Parse le fichiers des configurations et les retourne sous forme d'une liste d'objets JSON
* @param [OPTIONNAL] string $dir
* @author Idleman
* @return array $configs
*/
function parseConfigs($dir = '../'){
$configLines = (file_exists($dir.DCFOLDER.CONFIGFILE)?@file($dir.DCFOLDER.CONFIGFILE):@file(DCFOLDER.CONFIGFILE));
$configs = array();
if($configLines!=false){
foreach($configLines as $configLine){
if(trim($configLine)!=''){
$catchedConfig = json_decode(str_replace(array(SECURE_DELIMITER_BEGIN,SECURE_DELIMITER_END),'',$configLine));
$configs [] = $catchedConfig;
}
}
}
return $configs;
}
function reductImage($image,$dest,$largeur = 0, $hauteur = 0,$proportions = TRUE){
$dimensions=getimagesize($image);
if ($proportions){
if($dimensions[0]<$dimensions[1]){
$largeur = ($hauteur / $dimensions[1]) * $dimensions[0] ;
}else{
$hauteur = ($largeur / $dimensions[0]) * $dimensions[1] ;
}
}
$pats = pathinfo($image);
switch (strtolower($pats['extension'])){
case 'jpg':
$imageFlux = imagecreatefromjpeg($image);
break;
case 'jpeg':
$imageFlux = imagecreatefromjpeg($image);
break;
case 'png':
$imageFlux = imagecreatefrompng($image);
break;
case 'gif':
$imageFlux = imagecreatefromgif($image);
break;
case 'bmp':
$imageFlux = imagecreatefrombmp($image);
break;
}
$destination = imagecreatetruecolor($largeur, $hauteur);
imagecopyresampled ($destination,$imageFlux,0,0,0,0,$largeur,$hauteur,$dimensions[0],$dimensions[1] ) ;
switch (strtolower($pats['extension'])){
case 'jpg':
imagejpeg($destination, $dest);
break;
case 'jpeg':
imagejpeg($destination, $dest);
break;
case 'png':
imagepng($destination, $dest);
break;
case 'gif':
imagegif($destination, $dest);
break;
case 'bmp':
imagejpeg($destination, $dest);
break;
}
imagedestroy($imageFlux);
}
/**
* Retourne l'url de l'image d'avatar correspondant au mail donne en parametre
* @author Site de Gravatar
* @param string $email The email address
* @param string $s Size in pixels, defaults to 80px [ 1 - 512 ]
* @param string $d Default imageset to use [ 404 | mm | identicon | monsterid | wavatar ]
* @param string $r Maximum rating (inclusive) [ g | pg | r | x ]
* @param boole $img True to return a complete IMG tag False for just the URL
* @param array $atts Optional, additional key/value attributes to include in the IMG tag
* @return String containing either just a URL or a complete image tag
* @source http://gravatar.com/site/implement/images/php/
*/
function getGravatar( $user, $s = 50, $d = 'mm', $r = 'g') {
$email = $user->mail;
$url = AVATARFOLDER.$user->login.'.jpg';
if(!file_exists('../'.$url) && !file_exists($url)){
@copy('http://www.gravatar.com/avatar/'.md5( strtolower( trim( $email ) ) ).".jpg?s=$s&d=$d&r=$r",'../'.$url);
//@copy(file_get_contents('http://DropCenter.idleman.fr/services/avatar/index.php?code=nobot&key='.strtolower( trim( $email ))),$url);
}
return $url;
}
function describeEvent($event,$root){
$user = getUser($event->user);
$describedEvent['user'] = $user;
$describedEvent['date'] = $event->date;
$describedEvent['action'] = $event->action;
$avatar = $root.'php/action.php?action=openFile&file='.$user->avatar;
switch($event->action){
case 'addEventForUpload':
$describedEvent['title'] = $event->user.' '.tt('a ajoute un ou plusieurs fichiers');
$files = $event->files;
$describedEvent['lien'] = $root.'#'.urlencode(count($files)).'files-added-'.date('d-m-Y-h\hi\ms\s',$event->date);
$describedEvent['description'] = '
'.$event->user.' '.tt('a ajoute % fichier%',array(count($files),(count($files)>1?'s':''))).' : ';
if(count($files)!=0){
foreach($files as $file){
$describedEvent['description'] .='- '.$file->name.'
';
}
}
$describedEvent['description'] .='
le '.date('d/m/Y \- h:i:s',$event->date);
break;
case 'upload':
$describedEvent['title'] = $event->user.' '.tt('a ajoute un fichier');
$describedEvent['lien'] = $event->filePath;
$describedEvent['description'] = '
'.$event->user.' '.tt('a ajoute le fichier % le %',array($describedEvent['lien'],$event->file,date('d/m/Y \- h:i:s',$event->date)));
break;
case 'deleteFiles':
if($event->type=='folder'){
$describedEvent['title'] = $event->user.' '.tt('a supprime un dossier');
$describedEvent['description'] = '
'.$event->user.' '.tt('a supprime le dossier % le %',array(str_replace(UPLOAD_FOLDER,'',$event->file),date('d/m/Y \- h:i:s',$event->date)));
$describedEvent['lien'] = $root.'#'.urlencode($event->file).'-'.date('d-m-Y-h\hi\ms\s',$event->date).'-deleted';
}else{
$describedEvent['title'] = $event->user.' '.tt('a supprime un fichier');
$describedEvent['description'] = '
'.$event->user.' '.tt('a supprime le fichier % le %',array(str_replace(UPLOAD_FOLDER,'',$event->file),date('d/m/Y \- h:i:s',$event->date)));
$describedEvent['lien'] = $root.'#'.(isset($event->filePath)?$event->filePath:'').urlencode($event->file).'-'.date('d-m-Y-h\hi\ms\s',$event->date).'-deleted';
}
break;
case 'renameFile':
$describedEvent['title'] = $event->user.' '.tt('a renomme un '.($event->type=='folder'?'dossier':'fichier'));
$describedEvent['lien'] = $root.UPLOAD_FOLDER.urlencode($event->rename);
$describedEvent['description'] = '
'.$event->user.' '.tt('a renomme le '.($event->type=='folder'?'dossier':'fichier').' % en % le %',array(str_replace(UPLOAD_FOLDER,'',$event->file),$describedEvent['lien'],$event->rename,date('d/m/Y \- h:i:s',$event->date)));
break;
case 'addUser':
$describedEvent['title'] = $event->user.' '.tt('a ajoute l\'utilisateur').' '.$event->addedUser;
$describedEvent['description'] = '
'.$event->user.' '.tt('a ajoute l\'utilisateur % le %',array($event->addedUser,date('d/m/Y \- h:i:s',$event->date)));
$describedEvent['lien'] = $root.'#'.date('d-m-Y-h\hi\ms\s',$event->date).'-'.$event->addedUser.'-added';
break;
case 'install':
$describedEvent['title'] = $event->user.' '.tt('a installe le dropCenter');
$describedEvent['description'] = '
'.$event->user.' '.tt('a installe le dropCenter le %',array(date('d/m/Y \- h:i:s',$event->date)));
$describedEvent['lien'] = $root.'#-install';
break;
case 'deleteUser':
$describedEvent['title'] = $event->user.' '.tt('a supprime l\'utilisateur').' '.$event->deletedUser;
$describedEvent['description'] = '
'.$event->user.' '.tt('a supprime l\'utilisateur % le %',array($event->deletedUser,date('d/m/Y \- h:i:s',$event->date)));
$describedEvent['lien'] = $root.'#'.date('d-m-Y-h\hi\ms\s',$event->date).'-'.$event->deletedUser.'-deleted';
break;
/*case 'backup':
$describedEvent['title'] = $event->user.' '.tt('a fait un backup des fichiers');
$describedEvent['lien'] = $event->filePath;
$describedEvent['description'] = '
'.$event->user.' '.tt('a fait un backup des fichiers disponible sur % le %',array($describedEvent['lien'],$event->file,date('d/m/Y \- h:i:s',$event->date)));
break;*/
}
return $describedEvent;
}
function chuckQuote($path = null){
$path = (isset($path)?$path:'../'.DCFOLDER.CHUCKFILE);
$stream = explode('%',file_get_contents(UPLOAD_FOLDER.$path));
return utf8_encode($stream[rand(0,count($stream)-1)]);
}
function getSize($file)
{
$size = filesize($file);
return convertSize($size);
}
function convertSize($size){
if ($size < 1024) {
return ($size==0?'0 ':$size) .' o';
} elseif ($size < 1048576) {
return round($size / 1024, 2) .' Ko';
} elseif ($size < 1073741824) {
return round($size / 1048576, 2) . ' Mo';
} elseif ($size < 1099511627776) {
return round($size / 1073741824, 2) . ' Go';
} elseif ($size < 1125899906842624) {
return round($size / 1099511627776, 2) .' To';
} elseif ($size < 1152921504606846976) {
return round($size / 1125899906842624, 2) .' Po';
} elseif ($size < 1180591620717411303424) {
return round($size / 1152921504606846976, 2) .' Eo';
} elseif ($size < 1208925819614629174706176) {
return round($size / 1180591620717411303424, 2) .' Zo';
} else {
return round($size / 1208925819614629174706176, 2) .' Yo';
}
}
function countFiles($folder = UPLOAD_FOLDER){
$fileInfos = array();
$files = scanDir($folder);
foreach($files as $file){
if($file!='.' && $file!='..' && $folder.'/'.$file!='uploads//.dc' && $folder.'/'.$file!='uploads//avatars'&& $folder.'/'.$file!='uploads//.htaccess'){
if(is_dir($folder.'/'.$file)){
$fileInfos = array_merge($fileInfos,countFiles($folder.'/'.$file));
}else{
$fileInfos [$folder.$file]['size'] = filesize($folder.'/'.$file);
}
}
}
return $fileInfos;
}
/**
* Convertis une cle de traduction en langage traduit
* @param string $key : cle de traduction
* @param [OPTIONNAL] array $parameters, parametres dynamiques e inclure dans la traduction (remplace respectivement les signes [%%])
* @param [OPTIONNAL] string $lang
* @author Idleman
* @return String $traduction
*/
function tt($key,$parameters=null,$langage=DC_LANG){
$user = (isset($_SESSION['user']) && $_SESSION['user']!=null ?@unserialize($_SESSION['user']):null);
if(isset($user->lang) && isset($user->lang)) $langage =$user->lang;
$lang = getLang($langage);
//$return = (isset($lang[$key])?$lang[$key]:"TRADUCTION MISS : '$key' for langage '$langage']");
$return = (isset($lang[utf8_encode($key)])?$lang[utf8_encode($key)]:''.$key.'[::->]');
if(isset($parameters)){
$parametersVars = explode('[%%]',$return);
$return = '';
$i=0;
for($o = 0,$e= count($parametersVars);$o<$e;$o++){
if($o!=0){
$return .= (isset($parameters[$i])?$parameters[$i]:'').$parametersVars[$o];
$i++;
}else{
$return .= $parametersVars[$o];
}
}
}
return utf8_decode($return);
}
/**
* Convertis une cle de traduction en langage traduit
* @param string $key : cle de traduction
* @param [OPTIONNAL] array $parameters, parametres dynamiques e inclure dans la traduction (remplace respectivement les signes [%%])
* @param [OPTIONNAL] string $lang
* @author Idleman
* @echo String $traduction
*/
function t($key,$parameters=null,$langage=DC_LANG){
$user = (isset($_SESSION['user']) && $_SESSION['user']!=null ?unserialize($_SESSION['user']):null);
if(isset($user->lang) && isset($user->lang))$langage=$user->lang;
$lang = getLang($langage);
$return = (isset($lang[utf8_encode($key)])?$lang[utf8_encode($key)]:"TRADUCTION MISS : '$key' for langage '$langage']");
//$return = (isset($lang[$key])?$lang[$key]:''.$key.'[::->]');
if(isset($parameters)){
$parametersVars = explode('[%%]',$return);
$return = '';
$i=0;
for($o = 0,$e = count($parametersVars);$o<$e;$o++){
if($o!=0){
$return .= (isset($parameters[$i])?$parameters[$i]:'').$parametersVars[$o];
$i++;
}else{
$return .= $parametersVars[$o];
}
}
}
echo $return;
}
/**
* Parse le fichiers des langues et retourne les traductions sous forme d'un tableau
* @param [OPTIONNAL] string $lang
* @author Idleman
* @return array $traductions
*/
function getLang($lang=DC_LANG){
if(!isset($_SESSION['traductions'])){
$path = (file_exists(LANGFOLDER.$lang)?LANGFOLDER.$lang:'../'.LANGFOLDER.$lang);
$langLines = file($path,FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
$traductions = array();
foreach($langLines as $langLine){
if(trim($langLine)!=''){
list($key,$traduction) = explode('[::->]',$langLine);
$traductions[$key] = $traduction;
}
}
//TODO, e decommenter en fin de dev :
//$_SESSION['traductions'] = serialize($traductions);
}else{
$traductions = unserialize($_SESSION['traductions']);
}
return $traductions;
}
//Suprime un dossier et tous son contenu
function recursiveDelete($folder){
$open=@scandir($folder);
if (!$open) return false;
foreach($open as $file) {
if ($file != '.' && $file != '..'){
if (is_dir($folder."/".$file)) {
$r=recursiveDelete($folder."/".$file);
if (!$r) return false;
}
else if (is_file($folder."/".$file)){
$r=@unlink($folder."/".$file);
if (!$r) return false;
}
}
}
$r=@rmdir($folder);
if (!$r) return false;
return true;
}
//Convertit en bytes une chaîne au format texte
//Exemples de chaîne: "2 Mo", "5 Ko", ...
function toBytes($str)
{
$val = trim($str);
$last = strtolower($str[strlen($str)-1]);
switch($last)
{
case 'g': $val *= 1024;
case 'm': $val *= 1024;
case 'k': $val *= 1024;
}
return $val;
}
//Récupère la taille maximale d'upload autorisée dans php.ini
function getUploadSize()
{
$postSize = ini_get('post_max_size');
$uploadSize = ini_get('upload_max_filesize');
return min(toBytes($postSize),toBytes($uploadSize));
}
/* Constitue un nom lors de la creation des dossiers pour ne pas excraser les existantes (ex :nouveaux dossier (2)) */
function makeName($folder,$name,$number=1){
$scan = scandir($folder);
$exist = false;
foreach($scan as $file){
if($file==$name.' ('.$number.')') $exist = true;
}
if($exist){
return makeName($folder,$name,$number+1);
}else{
return $name.' ('.$number.')';
}
}
function rssHeader($link){
return '
'.DC_TITLE.'
'.$link.'
'.DC_DESCRIPTION.'
fr-fr
'.DC_LICENCE.'
'.date('r', gmstrftime(time())) .'
'.date('r', gmstrftime(time())) .'
'.DC_TITLE.' '.DC_VERSION.' '.DC_NAME.'';
}
function rssItem($title,$link,$date,$content,$action,$user,$image){
return '-
'.$link.'
'.$link.'
'.sha1($date.$user.$action).'
'.$action.'
'.$user.'
';
}
function rssFooter(){
return '';
}
function unicode2utf8($string){
return html_entity_decode(preg_replace("/U\+([0-9A-F]{4})/", "\\1;", $string), ENT_NOQUOTES, 'UTF-8');
}
?>