-->

Maboite.org

Feb 18

Voici un faux hack css ie8 à l’aide jquery (et css ie9, css ie10 …)

jQuery.each(jQuery.browser, function(i, val) {
   if(i=="msie" && jQuery.browser.version.substr(0,3)=="8.0")
      $('#mondiv').addClass('ie8');
 });

Ce qui transforme donc ceci :

<div id="mondiv">
  <p>
        Mon contenu avec un faux hack css ie8 qui sux sous ie8
        et seulement ie8 parce que ... c'est le digne successeur de ie6 et ie7....
  </p>
</div>

En ceci uniquement pour ie8:

<div id="mondiv" class="ie8">
  <p>
        Mon contenu avec un faux hack css ie8 qui sux sous ie8 et seulement ie8 parce que ...
        c'est le digne successeur de ie6 et ie7....
  </p>
</div>
\\ tags:

Jan 15

# php syntax checker

find . -iname '*.php' | sed 's/^/php -l /' | bash | egrep -v '^No'

# auto add translate fonction in html page content (appox)

sed -i  's/>\([^<">]*\)</><?= _translate("\1")?></g' *

#get

find . -type f | egrep '.(php|html|php)$'
  | xargs cat
  | sed  -e"s/_translate/\n_translate/g"  
  |  grep '^_translate'
  | sed -e"s/\(.*\)\([\"'])\).*/\1/" 
  |  sed -e"s/_translate(.\(.*\)/\1/g"
  | sort -u  
  | sed -e "s/\(.*\)[\"']).*/\1/" >  string.to.translates.csv

#TODO, coupling with xgetPo & co.

Oct 12

Petit mémo perso pour la gestion des sauvegardes de site en tar.gz

# repertoire contenant le site
www.monsite.com/

# repertoire de sauvegarde
save/

A mettre dans le crontab:

# on sauvegarde le repertoire www.monsite.com dans le repertoire save.
tar -cvzf save/www.monsite.com -`date '+%d-%B-%Y--%H_%M_%I'`.tar.gz ../www.monsite.com/ 

# on efface les sauvegarde de plus de 6 heures.
find save  -mtime +0.25 -type f -iname '*.tar.gz' | xargs rm
\\ tags:

Jul 02

La W3C n’accepte pas que les pages utilisent l’attribut target=”_blank” sur un lien.

Pourquoi ? Parce qu’il pense que le choix d’ouvrir ou non une nouvelle fenêtre appartient à l’internaute et non au créateur de la page.

C’est bien le respect de l’internaute, mais parfois pour des raisons marketing ou autres, on veut absolument qu’un nouvelle page s’ouvre mais tout en respectant les normes W3C.

Voici donc une méthode simple et efficace grâce à JQuery:

$(document).ready(function() {
    $("a[href^='http://']").click(function(){
      if(($(this).attr("class"))=='internal'){
        return true;
      }
      window.open(this.href);
      return false;
    });
});

Un lien simple :

<a href="http://www.exemple.com">lien</a>

s’ouvrira automatiquement dans une nouvelle fenêtre.

On se garde toutefois la possibilité d’ouvir un lien externe dans la même fenêtre en ajout la class=”internal” comme ceci :

<a href="http://www.exemple.com" class="internal">lien</a>
\\ tags:

Jan 05

Petit mémo: fonctions pour couper des textes et des phrases sans couper les mots avec preg_replace
Deux utilisation différentes:

La première fonction resumeString coupe un texte au plus près de la longueur maximale demandée.
La deuxième fonction resumeSentence coupe un texte au plus près mais en respectant une césure, soit un caractère ‘,’ ou ‘;’ ou ‘.’ ou ‘-’ afin de conserver le sens de la phrase.

Voici les fonctions et des exemples d’utilisation:

$string =" Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Aenean nunc tortor, luctus sodales, sodales eget, pharetra a, urna.
Integer in pede ac ante commodo egestas.
Curabitur ut tortor in nisl varius laoreet.
Vivamus massa. Suspendisse blandit condimentum magna.
Donec rutrum lorem non turpis. Mauris eu tellus ac quam convallis pellentesque.";
function resumeString($string, $length = 150){
  if( mb_strlen($string) <=  $length ) return $string;
  return preg_replace('@(^.{'.$length.',})[\s,:;\.-].*$@isU',"$1...",$string);
}
$newString = resumeString($string, 100);
echo strlen($newString)." => ".$newString;

105 => Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Aenean nunc tortor, luctus sodales, sodales…
Ici, string a été coupé au plus près, à 105 caractères sans prendre en compte la ponctuation mais sans couper les mots. Trois ‘.’ ont été ajoutés pour montrer que la phrase n’est pas complète.

function resumeSentence($string, $length = 150){
  if( mb_strlen($string) <=  $length ) return $string;
  return preg_replace('@(^.{'.$length.',})[,;\.-].*$@isU',"$1.",$string);
}
$newSentence = resumeSentence($string, 100);
echo strlen($newSentence)." => ".$newSentence;

108 => Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Aenean nunc tortor, luctus sodales, sodales eget.
Ici, string a été coupé au plus près, à 108 caractères en prenant en compte la ponctuation.

\\ tags: , , , ,

Dec 12

Après avoir cherché et utilisé des fonctions html2text, je me suis aperçu qu’aucune ne me satisfaisait vraiment parce que mes besoins n’étaient pas seulement de transcrire en texte.

Pour un projet de moteur de recherche, j’ai besoin de crawler des pages HTML et de sauvegarder seulement les parties intéressantes des pages.

Alors après pas mal de temps à m’amuser avec les regexp, voici quelques lignes de code qui nettoient un code html et essai d’en sortir des phrases:

  $c = file_get_contents("http://www.maboite.org");
  $c = html_entity_decode($c, ENT_QUOTES , "utf-8");
  # delete useless tags
  $c = preg_replace('@<\s?(script|embed|object|style)([^>]+)?>.*<\s?/\s?\1\s?>@isU','',$c);
  # delete comments
  $c = preg_replace('@<!--.*-->+@isU','',$c);
  #replace spacing tags
  $c = preg_replace('@<\s?(br|hr)[^>]*>+@i',"\n",$c);
  # replace tabs
  $c = preg_replace("@\t@i","\n",$c);
  # replacing li and Co by text comma separated
  $c = preg_replace('@\s*<\s?(td|li|dt|ot|dd)([^>]+)?>(.*)<\s?/\s?\1\s?>\s*@isU','\3, ',$c);
  # closing end of list, delete comma and add point
  $c = preg_replace('@\s*,\s*<\s?/\s?(ul|dl|ol)\s?>\s*@isU','.',$c);
  # lot of site are using "a" for listing
  $c = preg_replace("@(<\s?/\s?a\s?>)([^<]+)?(<\s?a)@isU",'\1, \3',$c);
  # replace link by text
  $c = preg_replace('@<\s?a[^>]*>([^<]*)<\s?/\s?a\s?>@isU','\1',$c);
  # replacing img alt for keeping text
  $c = preg_replace('@<\s?img([^>]+)?alt\s?=\s?(["|\'])([^\2]+)?\2[^>]*>@isU',"\n".'\3'."\n",$c);
  #get meta desc
  $c = preg_replace('@<\s?meta\s?name\s?=\s?(["|\'])\s?description\s?\1\s?(lang=\s?(["|\'])[^\3]+\3)?\scontent\s?=\s?(["|\'])([^\4]+)\4([^>]+)?>@isU',"\n".'\5'."\n",$c);
  # get page title
  $c = preg_replace('@<\s?title\s?>\s?([^<]+)\s?<\s?/\s?title\s?>@isU',"\n".'\1'."\n",$c);
  # get text container tags
  $c = preg_replace('@<\s?(p|textarea|div)[^>]*>(.*)<\s?/\1\s?>@isU',"\n".'\2'."\n",$c);
  # because sometimes table are used only for displaying table content, add comma
  $c = preg_replace('@\s*<\s?(td)([^>]+)?>(.*)<\s?/\s?\1\s?>\s*@isU','\3, ',$c);
  # Each tr is a new ligne
  $c = preg_replace('@\s*<\s?(tr)([^>]+)?>(.*)<\s?/\s?\1\s?>\s*@isU','\3'."\n",$c);
  # delete all others tags
  $c = preg_replace('@<[^>]+>@i',"\n",$c);
  # explode all sentence which ended with point and start with an uppercase letter
  $c = preg_replace("@(\.(\s*)?([A-Z]))@",".\n".'\3',$c);
  # multi space delete
  $c = preg_replace("@(\n|\s)+@i",'\1',$c);
  # begin as space delete
  $c = preg_replace('@^(\s)+@i','',$c);
  # sentences ended by :\n must be ended by:
  $c = preg_replace("@:\s?\n+@i",': ',$c);
  # remove the last comma added when replacing links
  $c = preg_replace("@\n,\s+@isU","\n",$c);
  $c = preg_replace_callback(
          "@.*\n@isU"
         ,create_function(
            '$matches'
           ,'return (!empty($matches[0]) && strlen($matches[0]) > 50) ? $matches[0]  : "";'
          )
         ,$c
  );
\\ tags: ,

Oct 02

Petit mémo pour aller chercher l’entête d’une page (headers) et seulement l’entête.
Expression régulière pour le code HTTP de la page, puis détéction de la nouvelle url si code 301.

$url = "http://maboite.org/";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'MyUserAgent');
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
$headers    = curl_exec($ch);
$CurlErr = curl_error($ch);
curl_close($ch);
if ($CurlErr){
  $status_code  = '404';
}
else{
  # get the status code before downloading the page content
  preg_match("|^HTTP/1\.[0-9]\s([1-5][01][0-9])\s.*$|isU", $headers, $temp);
  $status_code = $temp[1];
}

# if the page has moved, we get the new url
if($status_code == 301){
  preg_match('/\s?[lL]ocation\s?:\s?(.*)\s/',$headers, $temp);
  $url = $temp[1];
}

Pour info, curl est LA meilleur solution pour aller chercher une page sur un serveur distant. file_get_contents et autres fopen ne gèrent pas bien le timeout.

\\ tags: ,

Sep 29

Petit update de la fonction urlize postée précédemment.

function urlize($string){
$find   = array(
'/[^A-Za-z0-9ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ]/'  #alphanum + accents
,'/[-]+/'             # multi -
,'/(^-)/'             # - as begin
,'/(-$)/'             # - as end
);
$repl   = array('-','-','','');
return  preg_replace($find, $repl, $string);
}
\\ tags: ,

Sep 24

Pour ceux qui comme moi ont opté pour Wordpress (pauvres de nous …), voici quelques requêtes utiles pour afficher les derniers commentaires, les derniers posts ou les commentaires les plus commentés.

Bizarrement, les seuls plugins trouvés (2) ne fonctionnent pas (vive wordpress…).

  • Les posts les plus commentés:
select p.id, p.post_title,count(c.comment_ID) as cnt
  from wp_posts p, wp_comments c
  where c.comment_post_ID=p.id
    and comment_approved="1"
  group by c.comment_post_id
  order by cnt desc limit 5
  • Les derniers posts:
select id, post_title
  from wp_posts
  where  post_status="publish"
  order by id desc limit 5
  • Les derniers commentaires
select p.id, c.comment_author, c.comment_author_url, c.comment_content
  from wp_comments c, wp_posts p
  where c.comment_post_ID=p.ID
        and comment_approved="1"
  order by c.comment_ID desc limit 10

Vous notez au passage la superbe cohérence dans le nom des champs: wp_post.id et wp_comment.comment_ID

PS : merci de ne pas me demander pourquoi je n’ai pas choisi DotClear … j’ai pas la réponse.

\\ tags: , , ,

Aug 12

Si dans vos interfaces d’administration (backoffice) vous installez des textarea WYSIWYG type Tinymce, Htmlarea, FCEditor vous avez déjà sans doute remarqué qu’il n’était pas toujours facile de garder des pages W3C compliants.
Allez expliquer à vos clients que la propriété ALT est obligatoire dans les balises IMG…

Voici donc une méthode automatisée, bien sympa, certe peu délicate mais tellement efficace : le module php-tidy (php5-tidy).
Attention ce module ne permet pas de réparer les pages qui contiennent des centaines d’erreurs, le code se doit d’être propre au minimum.

Voici un exemple simple:

<?php ob_start() ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
                       <!-- manque le head -->
<body>
<img src="toto.gif "/> <!-- manque le alt -->
<body>                 <!--erreur-->
</html>


<?php
$html = ob_get_clean();
$cfg = array(
'indent' => true,
'output-xhtml' => true,
'wrap' => 80,
'doctype' => 'strict',
'hide-comments' => true,
'accessibility-check' => 3,
'alt-text' => 'no desc for this image'
);
$tidy = new tidy;
$tidy->parseString($html, $cfg, 'utf8');
$tidy->cleanRepair();
?>

<?=$tidy?>

Et voici le resultat de la page :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
  <head>
    <title></title>
  </head>
  <body>
    <img src="toto.gif" alt="no desc for this image" />
  </body>
</html>

Ce traitement est bien entendu gourmand et est à utiliser avant la mise en page de page/template/partial.

\\ tags: , , ,

Création entreprise d'électricité (en étant électricien ou pas)

Créer son entreprise n'est pas facile, je sais de quoi je parle. Alors crée son entreprise en électricité en étant électricien doit être, je suppose, le même combat. Des tonnes de formulaires à remplir, des semaines d'attente de papier en tout genre. Si vous voulez créer une entreprise en électricité, voici déjà comment devenir électricien.

Antigraffiti et hydrogommage

La société HTP Antigraffiti est basée à Paris dans la 18ème arrondissement. Cette société de nettoyage de graffiti(s) et de rénovation propose de l'hydrogommage et bien d'autres techniques pour mettre fin aux graffitiis. Cette société intervient dans tout la France, voici son site internet si vous chercher une entreprise de nettoyage de graffiti

Moteur de recherche RSS

Moteur de rechercher RSS

Vous cherchez un plombier pour une fuite ou des travaux de plomberie ?

Voici un nouveau site, un plombier.com rempli d'informations sur les plombier qui vous permet d'en savoir un peu plus sur les devis de plombier ou sur les différents types de factures.

Vous y trouverez aussi plein d'informtion sur les formations pour devenir plombier.

Vous cherchez un éléctricien ?

Encore un nouveau site, un electricien.com rempli d'informations sur les électricien, des infos pour devenir électricien.