summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSébastien Dailly <sebastien@chimrod.com>2014-10-04 16:59:06 +0200
committerSébastien Dailly <sebastien@chimrod.com>2014-10-04 16:59:06 +0200
commit2c3cf5179f16e8303ece57e3dbb191a46f3dcb85 (patch)
tree3d4ea31cd91388149ba43d3c8698c90532a51a59
parent19e71ce6cd7ca7540e0e004d180998e051c57402 (diff)
Moved resources to the blog site
-rw-r--r--content/Informatique/2009-03-11-wiimote.rst12
-rw-r--r--content/Informatique/2009-03-11-wiimote_fr.rst15
-rw-r--r--content/Informatique/2009-10-18-backup.rst11
-rw-r--r--content/Informatique/2010-06-06-awesome.rst6
-rw-r--r--content/Informatique/2010-10-04-rst.rst4
-rw-r--r--content/Informatique/2012-08-18-rstodt.rst2
-rw-r--r--content/resources/backup.sh100
-rw-r--r--content/resources/ir_control_0.py118
-rw-r--r--content/resources/mymenu.lua67
-rw-r--r--content/resources/rstodt/article.rst185
-rw-r--r--content/resources/rstodt/rst2html-pygments.py55
-rw-r--r--content/resources/rstodt/rst2odt.py77
12 files changed, 629 insertions, 23 deletions
diff --git a/content/Informatique/2009-03-11-wiimote.rst b/content/Informatique/2009-03-11-wiimote.rst
index eb6641d..325d4b7 100644
--- a/content/Informatique/2009-03-11-wiimote.rst
+++ b/content/Informatique/2009-03-11-wiimote.rst
@@ -23,9 +23,9 @@ as main, it use pygame for displaying the infrared sources the wiimote can
detect, but it is also compatible as plugin for wminput ( even if it does
anything for now ).
-You can get it here :
-`wm\_control.py <http://www.chimrod.com/downloads/wiimote/ir_control_0.py>`_
-( This code is licenced under GPL 3+ )
+You can get it here : wm_control.py_ ( This code is licenced under GPL 3+ )
+
+.. _wm_control.py: {filename}/resources/ir_control_0.py
About the code :
@@ -44,9 +44,9 @@ wminput plugin path ( on my debian this is the /usr/lib/cwiid/plugins/ )
return
def wmplugin_info():
- return [],
- [("X", wmplugin.REL | wmplugin.ABS, 1024, 0, 0, 0),
- ("Y", wmplugin.REL | wmplugin.ABS, 768, 0, 0, 0)],
+ return [],
+ [("X", wmplugin.REL | wmplugin.ABS, 1024, 0, 0, 0),
+ ("Y", wmplugin.REL | wmplugin.ABS, 768, 0, 0, 0)],
[]
We instanciate the wiimote object here and configure it in the IR mode. The
diff --git a/content/Informatique/2009-03-11-wiimote_fr.rst b/content/Informatique/2009-03-11-wiimote_fr.rst
index d61e6db..fc6f703 100644
--- a/content/Informatique/2009-03-11-wiimote_fr.rst
+++ b/content/Informatique/2009-03-11-wiimote_fr.rst
@@ -30,9 +30,10 @@ reconnue avant de continuer.
comme plugin pour wminput (même s'il ne fait rien pour l'instant).
-Vous pouvez le télécharger ici :
-`wm\_control.py <http://www.chimrod.com/downloads/wiimote/ir_control_0.py>`_
-(Code disponible sous licence GPL 3+)
+Vous pouvez le télécharger ici : wm_control.py_ (Code disponible sous licence GPL 3+)
+
+.. _wm_control.py: {filename}/resources/ir_control_0.py
+
Le code :
@@ -52,13 +53,13 @@ dans le répertoire de plugin de wminput (sur ma debian il se situe dans
return
def wmplugin_info():
- return [],
- [("X", wmplugin.REL | wmplugin.ABS, 1024, 0, 0, 0),
- ("Y", wmplugin.REL | wmplugin.ABS, 768, 0, 0, 0)],
+ return [],
+ [("X", wmplugin.REL | wmplugin.ABS, 1024, 0, 0, 0),
+ ("Y", wmplugin.REL | wmplugin.ABS, 768, 0, 0, 0)],
[]
On instancie la wiimote ici et actions le mode InfraRouge. Le nom est choisi
-par wminput si nous désirons pouvoir l'utiliser comme plugin. On déclare que le
+par wminput si nous désirons pouvoir l'utiliser comme plugin. On déclare que le
plugin retourne les coordonées X et Y dans un système de coordonées relative
(l'ensemble des paramètres sont disponibles ici : `actions list
<http://abstrakraft.org/cwiid/browser/trunk/wminput/action_enum.txt>`_)
diff --git a/content/Informatique/2009-10-18-backup.rst b/content/Informatique/2009-10-18-backup.rst
index 957a42d..291f187 100644
--- a/content/Informatique/2009-10-18-backup.rst
+++ b/content/Informatique/2009-10-18-backup.rst
@@ -15,7 +15,7 @@ Un système de backup automatique
que le PC que l'on souhaite sauvegarder. Le problème qui se pose est le
suivant : comment concilier ces deux conditions sur un PC de bureau (ne
disposant donc pas d'une série de serveur allumés en permanences et prêt à
- recevoir nos sauvegardes en continu…) ?
+ recevoir nos sauvegardes en continu…) ?
|summary|
@@ -34,8 +34,9 @@ périphériques sont déjà montés ou non, nous ne savons pas dans quel répert
nous allons nous trouve. Il va donc falloir mettre en place une ligne pour
récupérer le répertoire dans lequel nous sommes. Il ne nous reste plus qu'à
trouver le moyen de l'éxécuter automatiquement pour cela nous allons utiliser
-halevt. Le script est disponible `ici
-<http://chimrod.com/downloads/backup.sh>`_
+halevt. Le script est disponible ici_.
+
+.. _ici: {filename}/resources/backup.sh
Comme son nom l'indique, halevt est un gestionnaire d'évènements pour hal. Hal
est un gestionnaire d'évènement matériel sous Linux; il envoie des informations
@@ -46,7 +47,7 @@ un démon à l'écoute des informations qui nous sont envoyées par hal, et
d'activer des actions en conséquence : par exemple pour lancer l'antivirus sur
la clef usb, reconfigurer le mappage du clavier en fonction de la marque que
l'on branche etc. Pour notre part, nous allons nous contenter de lancer un
-script (celui du backup mentionné plus haut).
+script (celui du backup mentionné plus haut).
Pour commencer nous allons devoir identifier le lecteur à mettre sous
surveillance : inutile de se baser sur les noms de montage habituels (/dev/sda
@@ -71,7 +72,7 @@ solution (sur mon poste j'ai utilisé sudo, mais on peut très bien se
baser sur le sticky bit pour donner les droits au script). De même,
dans la configuration mise en place, le script se trouve sur le disque
de stockage (de manière à pouvoir le lancer à la main si le démon n'est
-pas disponible), cela peut être adapté en fonction de chacun…
+pas disponible), cela peut être adapté en fonction de chacun…
Dans le cas d'une configuration multi-utilisateur, je pense qu'il est
nécessaire de passer par un script qui lance les différentes sauvegardes sous
diff --git a/content/Informatique/2010-06-06-awesome.rst b/content/Informatique/2010-06-06-awesome.rst
index e1f3860..301f86c 100644
--- a/content/Informatique/2010-06-06-awesome.rst
+++ b/content/Informatique/2010-06-06-awesome.rst
@@ -62,7 +62,7 @@ reprendre à chaque fois que l'on met à jour awesome.
il n'y a pas d'option centralisée pour les retrouver. J'ai donc décidé
de me plonger un petit peu dans lua pour produire le menu que voilà :
-|Menu pour awesome|
+|Menu pour awesome|
Le menu permet les actions suivantes :
@@ -96,7 +96,9 @@ et dans la partie Key Binding :
Le menu apparaîtra sur le raccourci Mod4 + Flèche du bas
-Le fichier : `mymenu.lua <http://chimrod.com/downloads/mymenu.lua>`_
+Le fichier : `mymenu.lua`_
+
+.. _mymenu.lua: {filename}/resources/mymenu.lua
.. |Awesome| image:: http://awesome.naquadah.org/index/320x240-screen.png
:class: floatleft
diff --git a/content/Informatique/2010-10-04-rst.rst b/content/Informatique/2010-10-04-rst.rst
index faa0280..4f35744 100644
--- a/content/Informatique/2010-10-04-rst.rst
+++ b/content/Informatique/2010-10-04-rst.rst
@@ -55,7 +55,7 @@ paragraphe à un autre, ou « souligne » avec les caractères = _ ou - les titr
et les sous-titres, et le résultat donne un document très aéré et agréable à
travailler.
-.. _ici : http://chimrod.com/downloads/blog/article.rst
+.. _ici : {filename}/resources/rstodt/article.rst
Plugin wordpress
================
@@ -136,7 +136,7 @@ modifier la commande à exécuter pour le faire (j'ai mis à disposition le scri
à télécharger_). Assurez-vous que le script peut être exécuté par l'utilisateur
lancé par le service web.
-.. _télécharger : http://chimrod.com/downloads/scripts/rst2html-pygments.py
+.. _télécharger : {filename}/resources/rstodt/rst2html-pygments.py
La CSS n'est pas inclue dans le document et peut être définie à l'extérieur. Il
est possible de définir son style à partir de pygment avec la commande suivante
diff --git a/content/Informatique/2012-08-18-rstodt.rst b/content/Informatique/2012-08-18-rstodt.rst
index f99b5bc..c70611c 100644
--- a/content/Informatique/2012-08-18-rstodt.rst
+++ b/content/Informatique/2012-08-18-rstodt.rst
@@ -62,7 +62,7 @@ Et voilà, ça s'utilise comme ça :
.. _article précédent: {filename}2010-10-04-rst.rst
.. _rst2pdf: http://rst2pdf.ralsina.com.ar/
-.. _ici: http://chimrod.com/downloads/rst2odt.py
+.. _ici: {filename}/resources/rstodt/rst2odt.py
.. _inclusion de fichier: http://rst2pdf.ralsina.com.ar/handbook.html#file-inclusion
.. _Kea: http://www.flickr.com/photos/k_e_a/3325975129/
diff --git a/content/resources/backup.sh b/content/resources/backup.sh
new file mode 100644
index 0000000..aaf16f4
--- /dev/null
+++ b/content/resources/backup.sh
@@ -0,0 +1,100 @@
+#!/bin/sh
+###########################################################
+# This script uses rsync to backup directories on a media
+# (ex: USB disk) with a copy and incremental method.
+###########################################################
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+############################################################
+#
+# Written by Spip
+# Adapted by Chimrod
+# added script path detection
+# delete with find
+# Version 1.0
+#
+############################################################
+#to be nice...
+ionice -c3 -p$$
+renice +15 -p $$
+THEDATE=`date +%F_%Hh%M`
+#FILE=`dirname $0`
+FILE=`dirname "$(cd "${0%/*}" 2>/dev/null; echo "$PWD"/"${0##*/}")"`
+LOGFILE=$FILE'/log/sauvegarde'
+
+SPLIT='====================================================================='
+#check logfile directory
+
+if ! [ -e $LOGFILE ]
+then
+ /bin/mkdir -p $LOGFILE
+fi
+
+#check if the media is mounted
+
+if ! [ -e $FILE ]
+then
+ echo "$THEDATE : péripherique non connecté. Pas de sauvegarde possible" >> "$LOGFILE/save.log"
+ echo $SPLIT >> "$LOGFILE/save.log"
+ exit 0
+fi
+
+#prevent a second task
+LOCKFILE="/var/lock/sauvegarde.lock"
+[ -f $LOCKFILE ] && exit 0
+
+#if the script are stoped, remove lockfile
+trap "rm -f $LOCKFILE" EXIT
+touch $LOCKFILE
+echo "$THEDATE : Début de sauvegarde" >> "$LOGFILE/save.log"
+# $1:time to keep files; $2: name of the backup; $3: target
+
+function save() {
+
+ echo "$SPLIT" >> "$LOGFILE/$2.log"
+ echo "$THEDATE" >> "$LOGFILE/$2.log"
+
+ #Incremental & copie
+ INC="$FILE/$2/INC/$THEDATE"
+ BAK="$FILE/$2/BAK"
+ TOSAVE="$3"
+ mkdir -p $INC
+
+ if ! [ -e "$BAK" ]
+ then
+ /bin/mkdir -p "$BAK"
+ fi
+
+ #a: archivage :recurcif, preserve dates, persmissions, groupes...
+ #v: verbose mode
+ #delete : supprime les fichiers n'etant plus chez l'émeteur >> copie conforme.
+ /usr/bin/rsync -a --stats --delete --backup --backup-dir="$INC" "$TOSAVE" "$BAK" >> "$LOGFILE/$2.log"
+
+ cd $FILE/$2/INC
+ tar -czvf "$INC.tar.gz" "$THEDATE"
+ echo tar -czvf "$INC.tar.gz" "$FILE/$2/INC/$THEDATE"
+ rm -rf "$THEDATE"
+ #Remove the file older than $1 days
+ find "$FILE/$2/INC" -mtime +$1 -delete >> "$LOGFILE/save.log"
+
+}
+
+#List here all repositories to backup
+
+save 90 etc /etc/
+
+#to log the end of the backup
+THEDATE=`date +%F_%Hh%M`
+echo "$THEDATE : Sauvegarde effectuée" >> "$LOGFILE/save.log"
+exit 0
diff --git a/content/resources/ir_control_0.py b/content/resources/ir_control_0.py
new file mode 100644
index 0000000..dfce76a
--- /dev/null
+++ b/content/resources/ir_control_0.py
@@ -0,0 +1,118 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import cwiid
+
+## Configuration
+#wiimote_hwaddr = '' # Use your address to speed up the connection proccess
+wiimote_hwaddr = '00:1F:C5:5A:8C:69'
+
+def connect(wm_addr = ''):
+ '''Connects and syncs with a wiimote
+ wm_addr - Is a string representing the hwaddr of the wiimote we will try to
+ connect, or none to try to connect with any discoverable device
+ for example "00:19:1D:5D:5D:DC"'''
+
+ pygame.display.flip() # called now because cwiid.Wiimote is a blocking call
+
+ # This could be done in a thread to allow pygame to draw while searching
+ # but this is only a test
+ try:
+ return cwiid.Wiimote(wm_addr)
+ except:
+ print "Error conectando con wiimote " + str(wm_addr)
+
+
+def wmplugin_init(id, wiimote_arg):
+ #global wiimote
+
+ #wiimote = wiimote_arg
+ wmplugin.set_rpt_mode(id, cwiid.RPT_IR | cwiid.RPT_BTN)
+ return
+
+def wmplugin_info():
+ return [], \
+ [("X", wmplugin.REL | wmplugin.ABS, 1024, 0, 0, 0), \
+ ("Y", wmplugin.REL | wmplugin.ABS, 768, 0, 0, 0)], \
+ []
+
+def wmplugin_exec(messages, buton=[0]):
+ '''Wiimote callback managing method
+ Recieves a message list, each element is different, see the libcwiid docs'''
+ x = y = 0
+
+ for msg in messages:
+
+ if msg[0] == cwiid.MESG_BTN:
+ # msg is of the form (cwiid.MESG_BTN, cwiid.BTN_*)
+ buton[0] = msg[1]
+
+ if msg[0] == cwiid.MESG_IR:
+ if screen:
+ # red dot for the sources
+ [screen.fill((255, 0, 0), (point, (4, 4))) \
+ for point in ir_sensor.get_positions_points(msg)]
+
+ if buton[0] & cwiid.BTN_B == 0 :
+ x, y = (0, 0)
+
+ return [], (x, y)
+
+if __name__ == '__main__':
+ import pygame
+ from pygame.locals import *
+ runing = 0
+ def handle_events():
+ '''Typical event handling via pygame'''
+ for event in pygame.event.get():
+ if event.type == QUIT:
+ return 0
+ elif event.type == KEYUP:
+ if event.key == K_ESCAPE:
+ return 0
+ elif event.key == K_SPACE:
+ canvas.fill((0, 0, 0), ((0, 0), canvas.get_size()))
+ return 1
+
+ pygame.init()
+ pygame.display.set_caption('Wiimote IR test')
+ window = pygame.display.set_mode((cwiid.IR_X_MAX, cwiid.IR_Y_MAX), DOUBLEBUF)
+ screen = pygame.display.get_surface()
+ canvas = pygame.Surface(screen.get_size()) # persistent drawing here
+ canvas = canvas.convert()
+
+ wm = None # our wiimote
+ clock = pygame.time.Clock()
+ runing = 1
+ while(runing):
+ clock.tick(100)
+ runing = handle_events()
+ if not wm:
+ wm = connect(wiimote_hwaddr)
+ if not wm:
+ continue
+ # each message will contain info about ir and buttons
+ wm.rpt_mode = cwiid.RPT_IR | cwiid.RPT_BTN # | cwiid.RPT_STATUS
+ # tell cwiid to use the callback interface and allways send button events
+ wm.enable(cwiid.FLAG_MESG_IFC
+ #| cwiid.FLAG_NONBLOCK
+ | cwiid.FLAG_REPEAT_BTN)
+
+ # specify wich function will manage messages AFTER the other settings
+ wm.mesg_callback = wmplugin_exec
+
+ # quick check on the wiimote
+ print "Got Wiimote!"
+ st = wm.state
+ for e in st:
+ print str(e).ljust(8), ">", st[e]
+
+ screen.blit(canvas, (0, 0))
+ pygame.display.flip()
+
+ if wm:
+ wm.close()
+else:
+ #This code is used as a plugin for cwiid, we import the wminput system
+ import wmplugin
+ screen = None
diff --git a/content/resources/mymenu.lua b/content/resources/mymenu.lua
new file mode 100644
index 0000000..b3e5be4
--- /dev/null
+++ b/content/resources/mymenu.lua
@@ -0,0 +1,67 @@
+-- Menu d'application
+
+local awbeautiful = require("beautiful")
+local awful = require("awful")
+local capi = {
+ screen = screen,
+}
+
+local function getStickyIcon(client)
+ if client.sticky then
+ return awbeautiful.get().titlebar_sticky_button_focus_active
+ end
+ return awbeautiful.get().titlebar_sticky_button_focus_inactive
+end
+
+local function getOnTopIcon(client)
+ if client.ontop then
+ return awbeautiful.get().titlebar_ontop_button_focus_active
+ end
+ return awbeautiful.get().titlebar_ontop_button_focus_inactive
+end
+
+function newAppMenu(client)
+ local data = {}
+ local myAppMenu = {}
+
+ local args = {}
+ args.keygrabber = true
+
+ -- Insert the ontop entry
+ -- When onTop is selelected, set in floating mode too
+ table.insert(myAppMenu, {"On Top", function()
+ -- We do not use floating.togle() but syncronize the floating on top value
+ awful.client.floating.set( client, not client.ontop )
+ client.ontop = not client.ontop
+ end , getOnTopIcon(client)} )
+
+ -- Insert the Sticky entry
+ table.insert(myAppMenu, {"Sticky", function() client.sticky = not client.sticky end , getStickyIcon(client)} )
+
+ -- Insert the Hide entry
+ if not client.minimized then
+ table.insert(myAppMenu, {"Minimize", function() client.minimized = true end } )
+ end
+ table.insert(myAppMenu, {"Close", function() client:kill() end, awbeautiful.get().titlebar_close_button_focus } )
+
+ -- Add the move to tag entry
+ local moveToTag = {}
+ local tags = capi.screen[1]:tags()
+ for i = 1, #tags do
+ -- We do not show the curent client tags
+ local isInTag = false
+ local clientTag = tags[i]:clients()
+ for j = 1, #clientTag do
+ isInTag = isInTag or clientTag[j] == client
+ end
+ if not isInTag then
+ table.insert(moveToTag, {tags[i].name, function() awful.client.movetotag(tags[i], client) end } )
+ end
+ end
+ table.insert(myAppMenu, {"Move To", moveToTag } )
+
+ data.menu = awful.menu.new( { items = myAppMenu} )
+ data.menu:show(args)
+
+ return data
+end
diff --git a/content/resources/rstodt/article.rst b/content/resources/rstodt/article.rst
new file mode 100644
index 0000000..3e8001f
--- /dev/null
+++ b/content/resources/rstodt/article.rst
@@ -0,0 +1,185 @@
+.. -*- mode: rst -*-
+.. -*- coding: utf-8 -*-
+
+Blogguer en rst sous wordpress
+##############################
+
+:tags: Libre, reStructuredText
+:summary: |summary|
+
+.. default-role:: literal
+
+Le format reStructuredText_ est un langage de balise (un peu comme le HTML, ou
+le laTex), issu du monde de la programmation. Son but est de répondre au
+problème suivant : comment écrire du texte simplement et sans avoir besoin
+d'apprendre une syntaxe spécifique (ou du moins un minimum), tout en
+conservant des possibilités de formatage et d'export ?
+
+.. _reStructuredText : http://docutils.sourceforge.net/rst.html
+
+Présentation de RST
+===================
+
+.. |summary| replace::
+ Quand on écrit un article (par exemple ici cet article de blog), il est
+ nécessaire d'indiquer des directives de mise en page : ceci est un
+ paragraphe, ceci est un lien, inclure une image, une citation… Pour cela on
+ ne passe pas par un logiciel de traitement de texte pour le faire
+ (openOffice) : c'est lourd et cela n'apporte rien, mais la plupart du temps
+ par un éditeur intégré au blog qui permet de formater notre texte.
+
+|summary|
+
+Cet éditeur se charge pour nous de formater le texte en quelques clics. Le
+problème est que bien souvent ce texte ne pourra pas sortir du blog (par
+exemple pour prendre un extrait de l'article et l'utiliser ailleurs, nous
+sommes obligés de passer à nouveau par cette interface)
+
+Une autre solution est de rédiger notre texte directement dans le format de
+sortie (par exemple HTML), mais cela nécessite de connaître la syntaxe, et ne
+rend pas la lecture du fichier source très lisible (essayez de lire un article
+de presse en HTML avec un éditeur de texte pour voir…)
+
+Le format reStructuredText se veut être une réponse à ces problèmes : un
+fichier RST est lisible (le fichier source est compréhensible et peut être lu
+directement), ne nécessite pas de connaissances particulières (du moins peu), et
+à l'avantage de pouvoir être exporté dans de nombreux format de sortie (odt,
+pdf, latex, html…) On dispose donc d'un format unique pouvant servir à écrire
+des articles de blog, des documents de travail, ou encore de la documentation.
+
+La syntaxe est très simple, et ne charge pas le document à la lecture. Par
+exemple pour voir le document ayant servi à générer cet article est disponible
+ici_ : on laisse des lignes blanches pour indiquer que l'on passe d'un
+paragraphe à un autre, ou « souligne » avec les caractères = _ ou - les titres
+et les sous-titres, et le résultat donne un document très aéré et agréable à
+travailler.
+
+.. _ici : {filename}/resources/rstodt/article.rst
+
+Plugin wordpress
+================
+
+Il existe un plugin wordpress qui permet d'utiliser ce format pour l'écriture
+de documents dans le blog. À chaque fois que l'on va publier un article, le
+plugin va tester si le fichier est au format rst, et dans ce cas, va en faire
+la conversion en html en passant par la commande `rst2html`.
+
+**Attention**, pour le mettre en place, il est
+nécessaire d'avoir un accès à la machine pour y installer quelques
+applications.
+
+Pré-requis
+----------
+
+Python doit être disponible sur la machine, ainsi que le script `rst2html` (je
+ne pense pas que cela soit le cas pour les blogs hébergés et cela limite les
+possibilités).
+
+.. code-block:: console
+
+ $ sudo aptitude install python-docutils
+
+Installation
+------------
+
+Il s'agit juste d'un fichier à installer dans le répertoire des plugin de
+wordpress. Celui-ci est disponible sur launchpad_ et ne pose aucun problème de
+compatibilité.
+
+.. _launchpad : http://bazaar.launchpad.net/~gldnspud/rest-wordpress/trunk/files
+
+Le fichier README explique comment l'installer et le paramétrage à faire; les
+options (comme le chemin vers `rst2pdf`) se font directement dans le fichier php.
+
+.. code-block:: php startinline=True
+
+ // Set this to the prefix of your docutils installation.
+ $prefix = "/usr/local";
+
+ // Set this to the path of rst2html.py
+ $rst2html = "$prefix/bin/rst2html.py";
+
+Un petit test devrait montrer le résultat tout de suite. Dans le cas où le
+contenu est vide, regardez les logs d'erreur du serveur web, vous devriez y
+trouver les causes de votre erreur.
+
+Coloration syntaxique
+---------------------
+
+Il est possible de disposer de la coloration syntaxique automatique du code :
+
+.. code-block:: python
+
+ import os
+ # Standard hello world stuff
+ class Hello()
+ def do_it(self)
+ print "Hello world"
+
+ if __name__ == '__main__':
+ Hello().do_it()
+
+ def main()
+ print "Hello world"
+
+Pour intégrer la coloration syntaxique, il faut passer par pygment (un
+programme python qui s'occupe de ça) :
+
+.. code-block:: console
+
+ # aptitude install python-pygments
+
+Ensuite il va falloir modifier le script à lancer. En effet, par défaut, la
+commande `rst2pdf` n'intègre pas la coloration de code. Nous allons donc devoir
+modifier la commande à exécuter pour le faire (j'ai mis à disposition le script
+à télécharger_). Assurez-vous que le script peut être exécuté par l'utilisateur
+lancé par le service web.
+
+.. _télécharger : {filename}/resources/rstodt/rst2html-pygments.py
+
+La CSS n'est pas inclue dans le document et peut être définie à l'extérieur. Il
+est possible de définir son style à partir de pygment avec la commande suivante
+(pour appliquer le style tango) :
+
+.. code-block:: console
+
+ $ pygmentize -S tango -f html > style.css
+
+Conclusion
+==========
+
+Je cherchais depuis un petit moment une solution pour pouvoir écrire mes
+articles sans me connecter au blog. Les applications clientes ne me convenant
+pas tout à fait, le RST me permet d'utiliser une application totalement séparée
+du blog (par exemple VIM) et un format pérenne.
+
+Je ne sais pas s'il existe une solution équivalente pour les autres moteurs de
+blog, le RST étant encore un format assez jeune, et n'est pas encore très
+répandu…
+
+Sans être aussi complet que le latex, il est bien plus souple et
+beaucoup plus facile à utiliser. De plus il s'agit bien sûr d'un format
+ouvert, pouvant générer des documents sous openOffice, en PDF, voire en latex
+pour ceux qui veulent…
+
+Édit (29/05/11)
+===============
+
+Je reviens sur le plugin en constatant que par défaut, celui-ci met en cache le
+contenu de l'article, même si celui-ci est déjà en html. Une petite
+modification dans le code permet de ne sauvegarder le fichier que s'il s'agit
+d'un fichier rst :
+
+Rechercher dans le script la chaîne suivante :
+
+.. code-block:: php
+
+ if ($pos === false) {
+ // No modeline.
+ $rval = wpautop($text);
+
+Et rajouter la ligne suivante en dessous :
+
+.. code-block:: php
+
+ return $rval;
diff --git a/content/resources/rstodt/rst2html-pygments.py b/content/resources/rstodt/rst2html-pygments.py
new file mode 100644
index 0000000..7e2a826
--- /dev/null
+++ b/content/resources/rstodt/rst2html-pygments.py
@@ -0,0 +1,55 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+from docutils.core import publish_cmdline
+
+# Define a new directive `code-block` that uses the `pygments` source
+# highlighter to render code in color.
+#
+
+from docutils import nodes
+from docutils.parsers.rst import directives, Directive
+from pygments import highlight
+
+from pygments.lexers import get_lexer_by_name, TextLexer
+from pygments.formatters import HtmlFormatter
+
+INLINESTYLES = False
+pygments_formatter = HtmlFormatter()
+DEFAULT = HtmlFormatter(noclasses=INLINESTYLES,linenos="table")
+VARIANTS = {}
+
+class Pygments(Directive):
+ """ Source code syntax hightlighting.
+ """
+ required_arguments = 1
+ optional_arguments = 1
+ final_argument_whitespace = True
+
+ has_content = True
+ linenos=1
+
+ def run(self):
+ dic = {}
+
+ # On crée un dictionnaire à partir des options
+ for options in self.arguments[1:]:
+ clef, arg = options.split("=")
+ dic[clef] = arg
+
+ self.assert_has_content()
+ try:
+ lexer = get_lexer_by_name(self.arguments[0], **dic)
+ except ValueError:
+ # no lexer found - use the text one instead of an exception
+ lexer = TextLexer()
+ # take an arbitrary option if more than one is given
+ formatter = self.options and VARIANTS[self.options.keys()[0]] or DEFAULT
+ parsed = highlight(u'\n'.join(self.content), lexer, formatter)
+ return [nodes.raw('', parsed, format='html')]
+
+
+directives.register_directive('code-block', Pygments)
+
+publish_cmdline(writer_name='html')
+
diff --git a/content/resources/rstodt/rst2odt.py b/content/resources/rstodt/rst2odt.py
new file mode 100644
index 0000000..f1f107f
--- /dev/null
+++ b/content/resources/rstodt/rst2odt.py
@@ -0,0 +1,77 @@
+#!/usr/bin/python
+
+# $Id: rst2odt.py 5839 2009-01-07 19:09:28Z dkuhlman $
+# Author: Dave Kuhlman <dkuhlman@rexx.com>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A front end to the Docutils Publisher, producing OpenOffice documents.
+"""
+
+try:
+ import locale
+ locale.setlocale(locale.LC_ALL, '')
+except:
+ pass
+
+from docutils.core import publish_cmdline_to_binary, default_description
+from docutils.writers.odf_odt import Writer, Reader
+
+from docutils.parsers.rst.roles import set_classes
+
+from docutils import nodes
+from docutils.parsers.rst import directives, Directive
+
+
+description = ('Generates OpenDocument/OpenOffice/ODF documents from '
+ 'standalone reStructuredText sources. ' + default_description)
+
+class Codeblock(Directive):
+ """ Source code syntax highlighting.
+ """
+ required_arguments = 1
+ optional_arguments = 1
+ final_argument_whitespace = True
+
+ has_content = True
+ linenos=1
+
+ directives = {":include:": lambda self, *args, **kwargs : self.include(*args, **kwargs)}
+
+ def include(self, param):
+ """ Include a file and return it as a content.
+ """
+ try:
+ self.content = unicode(open(param, 'r').read(), "utf-8").split("\n")
+ except IOError:
+ self.content = ("FileNotFound",)
+
+ def run(self):
+ for argument in self.arguments:
+ directives = argument.split(" ")
+ processor = self.directives.get(directives[0], None)
+ if processor is None:
+ continue
+ processor(self, directives[1])
+
+ set_classes(self.options)
+ self.assert_has_content()
+ text = '\n'.join(self.content)
+ text_nodes, messages = self.state.inline_text(text, self.lineno)
+ node = nodes.literal_block(text, '', *text_nodes, **self.options)
+ node.line = self.content_offset + 1
+ self.add_name(node)
+ node.attributes['language'] = self.arguments[0]
+
+ return [node] + messages
+
+
+directives.register_directive('code-block', Codeblock)
+
+
+writer = Writer()
+reader = Reader()
+output = publish_cmdline_to_binary(reader=reader, writer=writer,
+ description=description)
+
+