Un loup blessé

Aller au contenu | Aller au menu | Aller à la recherche

dimanche 22 février 2009

"Copyright" (ou autres licences) dans les flux (RSS et Atom) sous DotClear 1

Il y a quelques temps, comme je l'expliquait ici, le seul moyen à ma portée de mettre un genre de "copyright" (ce n'est pas un copyright puisque mon blog est sous licence Creative Commons, c'est juste que le terme Copyright est "parlant") dans les flux était cette bidouille :

Je plaçais ce morceau de code en début de billet :


<div style="text-align:center;"><span class="coprss">Source originale : <a href="http://1loup.net" rel="nofollow"><strong>Un loup blessé</strong></a> par <strong>1loup</strong></span></div>

puis celui là à la fin :


<div style="text-align:center;"><span class="coprss">Source originale/ Original post on : <a href="http://1loup.net" rel="nofollow"><strong>Un loup blessé</strong></a> par/by <strong>1loup</strong><br /><a href="http://creativecommons.org/licenses/by-nc-sa/2.0/fr/deed.en" rel="nofollow"><img src="http://1loup.net/somerights.png" alt="Some rights reserved - Creative commons" /></a></span></div>

et en ajoutant cette règle dans le style.css de mon thème :


.coprss {
display:none;
}

cela avait pour conséquence un affichage de ce genre :

Source originale/ Original post on : Un loup blessé par/by 1loup
Some rights reserved - Creative commons

uniquement dans les flux puisque la règle CSS le rendait invisible dans les billets.

C'était un peu lourdingue, une fois sur deux j'oubliais de rajouter les codes dans mes billets, ce n'était pas très pratique.

Puis, je me suis inspiré de cette conversation pour faire autrement : Directement dans le flux, uniquement dans le flux !

Cette manipulation s'effectue aussi dans le fichier class.xblogspost.php qui se trouve dans layout. Les fonctions à modifier sont également getRSSItem et getAtomEntry (les deux dernières). La partie intéressante est par contre située au niveau du return.

  • Pour getRSSItem :

function getRSSItem($short=false)
{

...(code non touché)...
		
	return
	'<item rdf:about="'.$this->getPermURL().'">'."\n".
	'  <title>'.$this->blog->toXML($this->f('post_titre'))."</title>\n".
	'  <link>'.$this->getPermURL()."</link>\n".
	'  <dc:date>'.$this->getIsoDate()."</dc:date>\n".
	(($this->f('post_lang')) ? '  <dc:language>'.$this->f('post_lang')."</dc:language>\n" : '').
	'  <dc:creator>'.htmlspecialchars($this->getUserCN())."</dc:creator>\n".
	'  <dc:subject>'.htmlspecialchars($this->f('cat_libelle'))."</dc:subject>\n".
	'  <description>'.$this->blog->toXML($desc)."</description>\n".
	'  <content:encoded><![CDATA['.$content."]]></content:encoded>\n".
	'</item>'."\n";
}

C'est cette ligne :


'  <content:encoded><![CDATA['.$content."]]></content:encoded>\n".

que j'ai modifié en :


'  <content:encoded><![CDATA['.$content.$coprss."]]></content:encoded>\n".

(je rajoute la variable coprss)

Ensuite, juste avant le return, je défini cette variable par un :


$coprss = '<p style="text-align:center;"><sup>Source originale/ Original post on : <a href="http://1loup.net"><strong>Un loup bless&eacute;</strong></a> par/by <strong>1loup</strong> dans le billet/on : <a href="'.$this->getPermURL().'">'.$this->blog->toXML($this->f('post_titre')).'</a><br /><a href="http://creativecommons.org/licenses/by-nc-sa/2.0/fr/deed.en" rel="nofollow"><img src="http://1loup.net/somerights.png" alt="Some rights reserved - Creative commons" /></a></sup></p>';

Cela me donne donc :


function getRSSItem($short=false)
{

...ne pas toucher à la première partie de la fonction...
		
$coprss = '<p style="text-align:center;"><sup>Source originale/ Original post on : <a href="http://1loup.net"><strong>Un loup bless&eacute;</strong></a> par/by <strong>1loup</strong> dans le billet/on : <a href="'.$this->getPermURL().'">'.$this->blog->toXML($this->f('post_titre')).'</a><br /><a href="http://creativecommons.org/licenses/by-nc-sa/2.0/fr/deed.en" rel="nofollow"><img src="http://1loup.net/somerights.png" alt="Some rights reserved - Creative commons" /></a></sup></p>';

	return
	'<item rdf:about="'.$this->getPermURL().'">'."\n".
	'  <title>'.$this->blog->toXML($this->f('post_titre'))."</title>\n".
	'  <link>'.$this->getPermURL()."</link>\n".
	'  <dc:date>'.$this->getIsoDate()."</dc:date>\n".
	(($this->f('post_lang')) ? '  <dc:language>'.$this->f('post_lang')."</dc:language>\n" : '').
	'  <dc:creator>'.htmlspecialchars($this->getUserCN())."</dc:creator>\n".
	'  <dc:subject>'.htmlspecialchars($this->f('cat_libelle'))."</dc:subject>\n".
	'  <description>'.$this->blog->toXML($desc)."</description>\n".
	'  <content:encoded><![CDATA['.$content.$coprss."]]></content:encoded>\n".
	'</item>'."\n";
}

  • Pour getAtomEntry :

function getAtomEntry($short=false)
{

...(code non touché)...
		
	return
	'<entry' .
	(($this->f('post_lang')) ? ' xml:lang="'.$this->f('post_lang').'"' : '').
	'>'."\n".
	'  <title>'.$this->blog->toXML($this->f('post_titre'))."</title>\n".
	'  <link rel="alternate" type="text/html" href="'.$this->getPermURL().'" />'."\n".
	'  <updated>'.$this->getIsoDate()."</updated>\n".
	'  <id>'.$id."</id>\n".
	'  <author><name>'.htmlspecialchars($this->getUserCN())."</name></author>\n".
	'  <category term="'.$this->f('cat_libelle_url').'" label="'.$this->blog->toXML($this->f('cat_libelle')).'"'."/>\n".
	'  <summary>'.$this->blog->toXML($desc)."</summary>\n".
	'  <content type="html">'.htmlspecialchars($content)."</content>\n".
	'</entry>'."\n";
}

idem, je remplace la ligne :


'  <content type="html">'.htmlspecialchars($content)."</content>\n".

par :


'  <content type="html">'.htmlspecialchars($content).htmlspecialchars($copatom)."</content>\n".

(je rajoute la variable copatom) puis juste avant le return de la fonction, j'inscris la définition :


$copatom = '<p style="text-align:center;"><sup>Source originale/ Original post on : <a href="http://1loup.net"><strong>Un loup bless&eacute;</strong></a> par/by <strong>1loup</strong> dans le billet/on : <a href="'.$this->getPermURL().'">'.$this->blog->toXML($this->f('post_titre')).'</a><br /><a href="http://creativecommons.org/licenses/by-nc-sa/2.0/fr/deed.en" rel="nofollow"><img src="http://1loup.net/somerights.png" alt="Some rights reserved - Creative commons" /></a></sup></p>';

Cela me donne donc :


function getAtomEntry($short=false)
{

...ne pas toucher à la première partie de la fonction...
		
$copatom = '<p style="text-align:center;"><sup>Source originale/ Original post on : <a href="http://1loup.net"><strong>Un loup bless&eacute;</strong></a> par/by <strong>1loup</strong> dans le billet/on : <a href="'.$this->getPermURL().'">'.$this->blog->toXML($this->f('post_titre')).'</a><br /><a href="http://creativecommons.org/licenses/by-nc-sa/2.0/fr/deed.en" rel="nofollow"><img src="http://1loup.net/somerights.png" alt="Some rights reserved - Creative commons" /></a></sup></p>';
		
	return
	'<entry' .
	(($this->f('post_lang')) ? ' xml:lang="'.$this->f('post_lang').'"' : '').
	'>'."\n".
	'  <title>'.$this->blog->toXML($this->f('post_titre'))."</title>\n".
	'  <link rel="alternate" type="text/html" href="'.$this->getPermURL().'" />'."\n".
	'  <updated>'.$this->getIsoDate()."</updated>\n".
	'  <id>'.$id."</id>\n".
	'  <author><name>'.htmlspecialchars($this->getUserCN())."</name></author>\n".
	'  <category term="'.$this->f('cat_libelle_url').'" label="'.$this->blog->toXML($this->f('cat_libelle')).'"'."/>\n".
	'  <summary>'.$this->blog->toXML($desc)."</summary>\n".
	'  <content type="html">'.htmlspecialchars($content).htmlspecialchars($copatom)."</content>\n".
	'</entry>'."\n";
}

Et voilà ! Dans les flux RSS et Atom, le texte que je voulais qui apparaisse est présent dans les billets sans avoir besoin de rajouter quoi que ce soit, c'est "automatique" :evil:

Chapô (extrait) et flux (RSS/Atom) sous DotClear 1

Attention : Étant resté sous DotClear 1.2.6, il y a quelques petites différences avec DotClear 1.2.7 et suivants (1.2.7.1 et 1.2.8) mais si vous comprenez le principe sous 1.2.6, c'est très facilement transposable ! - Je fais des approximations dans mes explications, le principal c'est de comprendre ce qui se passe.

Le comportement de DotClear 1.2 ne me satisfaisait pas au niveau de la publication de l'extrait (Chapô) et des flux (RSS et Atom). J'ai donc changé cela, je vous explique...

Le comportement par défaut de DotClear, c'est quoi ?

  • En page d'accueil, si le billet contient un extrait (chapô), on n'affiche que l'extrait
  • A l'intérieur du billet, on affiche l'extrait + le corps du billet

Pour les flux, c'est plus compliqué suivant que les flux sont tronqués ou pas :

  • Flux tronqués, présence d'un chapô : Publication du chapô
  • Flux tronqués, pas de chapô : Publication des 300 premiers caractères du billet
  • Flux non tronqués (Chapô ou pas) : Publication du chapô + intégralité du billet

C'est cette dernière possibilité qui ne me convenait pas. Lorsque le billet n'a pas de chapô, il me parait normal de publier l'intégralité du billet mais pas en présence d'un chapô ! Je voulais donc qu'en présence de chapô, lorsque les flux ne sont pas tronqués, il n'y a publication que du chapô dans les flux. Voyons comment faire cela :

Les modifications sont à effectuer dans le fichier class.xblogspost.php qui se trouve dans layout. Les deux fonctions qui nous intéressent sont getRSSItem et getAtomEntry (les deux dernières). Je vais expliquer sur getRSSItem puisque c'est la même chose pour getAtomEntry.

Un coup d'oeil d'abord sur la fonction d'origine (rappel : de DotClear 1.2.6, hein...) :


function getRSSItem($short=false)
{
	if ($this->f('post_chapo') != '') {
		$desc = strip_tags($this->f('post_chapo'));
	} else {
		$desc = util::cutString(strip_tags($this->f('post_content')),300).'...';
	}
		
	if ($short) {
		$content = $desc;
	} else {
		$content = $this->f('post_chapo').' '.$this->f('post_content');
	}
		
	return...

Je ne recopie pas toute la fonction, c'est la partie avant le "return" qui nous intéresse.


if ($this->f('post_chapo') != '') {
	$desc = strip_tags($this->f('post_chapo'));

=> Si le chapô n'est pas vide, on place dans la variable desc le contenu de ce chapô


} else {
	$desc = util::cutString(strip_tags($this->f('post_content')),300).'...';
}

=> Sinon (pas de chapô donc), on place dans desc les 300 premiers caractères du billet.


if ($short) {
	$content = $desc;

=> Si le flux est tronqué, on place dans la variable content ce qui est dans desc


} else {
	$content = $this->f('post_chapo').' '.$this->f('post_content');
}

=> Sinon (flux non tronqué donc), on place dans la variable content le chapô + le billet.

C'est donc cette dernière partie que je vais adapter. Je vais remplacer ce qu'il y a à l'intérieur du "else" par ceci :


if ($this->f('post_chapo') != '') {
	$content = $this->f('post_chapo').'<p><strong>Pour lire le reste du billet, venez sur le blog</strong></p>';
} else {
	$content = $this->f('post_chapo').' '.$this->f('post_content');
}

=> Si le chapô n'est pas vide, publication du chapô et d'une phrase invitant à venir lire le reste sur le blog. Sinon publication du chapô + billet.

La fonction devient donc :


function getRSSItem($short=false)
{
	if ($this->f('post_chapo') != '') {
		$desc = strip_tags($this->f('post_chapo'));
	} else {
		$desc = util::cutString(strip_tags($this->f('post_content')),300).'...';
	}
		
	if ($short) {
		$content = $desc;
	} else {
	
		if ($this->f('post_chapo') != '') {
			$content = $this->f('post_chapo').'<p><strong>Pour lire le reste du billet, venez sur le blog</strong></p>';
		} else {
			$content = $this->f('post_chapo').' '.$this->f('post_content');
		}
			
	}
		
	return...

Voilà, c'est tout. Un petit test conditionnel supplémentaire et les flux non tronqués ne contiennent plus l'intégralité du billet lorsqu'il y a un chapô.

(J'avais absolument besoin de ce comportement lors de la publication de mon billet des tests des sextoys. Je ne voulais en aucun cas que le billet passe dans le flux afin que des enfants ne puissent le lire par erreur. En venant sur le blog, le tag ICRA fait son office.)

Pour la fonction getAtomEntry, on remplace exactement la même portion de code au même endroit.

Pour DotClear 1.2.7 et suivants, il y a une portion différente :


$content = $this->f('post_chapo').' '.$this->f('post_content');

est remplacé par :


$content = util::relToAbsURL($this->f('post_chapo').' '.$this->f('post_content'));

dans la fonction d'origine. Ce n'est pas la mer à boire à adapter, si ? :evil:

lundi 6 octobre 2008

Ajout dans le code du plugin Captcha

Sous Dotclear 1, vous utilisez ce captcha accessible ?

Je vous conseille maintenant un ajout :

Sur le forum DotClear, un nouveau venu a réclamé la possibilité de rajouter une boite d'alerte lorsque le résultat du captcha est incorrect. Il est vrai qu'il n'est pas rare que certains commentateurs ne s'aperçoivent pas qu'ils ont oublié de remplir le captcha et repartent sans s'être aperçu que leurs commentaires n'ont pas été validés.

J'ai proposé une modification et je l'ai mis en pratique ici même depuis plusieurs jours. Pour le voir en action, tapez un commentaire sans remplir le captcha. Après avoir cliqué sur "envoyer", vous devriez voir apparaitre un message d'alerte genre :

Alerte captcha incorrect

Si vous souhaitez faire pareil, voici le guide :

Il va falloir modifier le fichier postcon.php qui se trouve dans /dotclear/ecrire/tools/captcha/. Si votre DotClear n'est pas installé dans le répertoire /dotclear/ et/ou que vous avez renommé le répertoire /ecrire/, adaptez le chemin en conséquence.

Entre la ligne 65 et 70, trouvez cette ligne :


$GLOBALS['error_captcha'] = $GLOBALS['form_err'] = __('rÈsultat du captcha incorrect');

Rajoutez à la suite, sur la ligne du dessous :

echo '<script type="text/javascript">alert("ATTENTION\nCaptcha incorrect - Votre commentaire est exclu\nVeuillez recommencer, en retapant juste le captcha.");</script>';

Remplacez par :


$GLOBALS['error_captcha'] = $GLOBALS['form_err'] = __('résultat du captcha incorrect') . __('<script type="text/javascript">alert("ATTENTION\nCaptcha incorrect - Votre commentaire est exclu\nVeuillez recommencer, en retapant juste le captcha.");</script>');

Et c'est tout, sauvegardez et réuploadez le fichier postcon.php ainsi modifié :hysterique:

(Vous pouvez modifier les phrases de l'alerte mais évitez les accents, Opera et Internet Explorer n'aiment pas trop :( Je me suis cassé le cul à faire des phrases sans participe passé en "é" !)

Mekbrun, Fiuuu, SLB : Je peux faire la modification sur vos blogs si vous le désirez, laissez juste un commentaire ici.

lundi 16 juin 2008

Plugin AutoShadowBox et AutoClearBox pour WordPress

Depuis mon billet sur les lightbox-like, certains d'entre vous sous WordPress ont peut être adopté le plugin Shadowbox JS de Matt Martz ou installé mon pack ShadowBox / ClearBox.

Je vous propose d'améliorer le plugin (et mon pack) et de définir que tous les liens qui pointent vers des images (jpg, jpeg, png, gif et bmp), vidéos (flv, mov, wmv et mp4) et les animations flashs (swf) s'ouvrent avec l'effet shadowbox et ceci sans avoir besoin de rajouter le paramètre rel="shadowbox" dans le code par l'ajout d'une fonction "autoshadowbox" ! Si vous préférez la ClearBox, on va faire un "autoclearbox" (mais uniquement sur les images).

En gros, lorsque vous insérez une image (miniature ou de taille moyenne) ou une vidéo par "ajouter un média", c'est un lien qui est rajouté et le morceau de code que je vous propose va inclure tout seul le code pour la shadowbox.

De même, si dans un billet vous insérez plusieurs images, il va les lier dans un album et vous pourrez passer d'une image à l'autre (voire d'une vidéos à l'autre) directement par la box.

Après avoir installé le plugin Shadowbox JS ou mon pack, télécharger ce dossier zippé AutoClearShadow.zip.

Dézippez-le, vous allez obtenir deux fichiers : AutoClearBox.php et AutoShadowBox.php.

Uploadez dans /wp-content/plugins/ l'un des deux suivant que vous souhaitez travailler avec ShadowBox ou avec ClearBox et aller activer le plugin dans votre interface d'administration.

Lorsqu'ensuite dans vos billets vous aurez une image ou une vidéo dans un lien, il s'ouvrira au clic dans un effet shadowbox.

Paramètre intéressant : le rel="shadowbox" ou rel="clearbox" ainsi rajouté n'est pas en dur dans le code des billets mais il est rajouté "à la volée" si bien que si dans quelques temps vous choisissez de ne plus fonctionner avec shadowbox ou clearbox mais avec un autre lightbox-like, en enlevant ce plugin autoshadowbox ou autoclearbox, les rel="shadowbox" et rel="clearbox" disparaissent d'eux mêmes.

Sur le même principe, il est possible d'adapter ce petit bout de code pour un autre lightbox-like, demandez-moi si vous avez besoin d'aide, je peux vous faire un auto"ce que vous voulez" ;-)

Je vous rappelle au passage que la Shadowbox est compatible avec la Lightbox et que si votre blog est déjà rempli de rel="lightbox", la Shadowbox prend le relai si vous désinstallez Lightbox. Pas besoin de revoir tout vos rel="lightbox" en "dur", laissez-les ainsi, shadowbox les interprétera comme des rel="shadowbox" ! J'ai même fait le test avec un lien contenant un rel="lightbox" et mon plugin AutoShadowBox d'activé : c'est Ok, Shadowbox prend toujours le relai !

mardi 25 octobre 2005

Les smileys en double


J'ai le même problème qu'ici, la solution est :

Résumé : lorsque l'on tape deux fois de suite le même smiley, le deuxième n'est pas remplacé par son image :(

La solution serait de remplacer dans le dossier "layout" / fichier "class.xblog.php" le code

$r = '/(\A|[\s]+|>)('.preg_quote($matches[1],'/').')([\s]+|[<]|\Z)/ms';

par

$r = '/(\G|[\s]+|>)('.preg_quote($matches[1],'/').')([\s]+|[<]|\Z)/ms';

(de remplacer le A par un G)

Eureka : cela marche nickel :-D