summaryrefslogtreecommitdiff
path: root/content/resources/rstodt
diff options
context:
space:
mode:
Diffstat (limited to 'content/resources/rstodt')
-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
3 files changed, 317 insertions, 0 deletions
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)
+
+