Premiers exemples...
authorProgfou <jean-christophe.andre@auf.org>
Wed, 25 Mar 2009 07:30:18 +0000 (14:30 +0700)
committerProgfou <jean-christophe.andre@auf.org>
Wed, 25 Mar 2009 07:30:18 +0000 (14:30 +0700)
ctypes/iconv.py [new file with mode: 0644]
mod_python/index.py [new file with mode: 0644]

diff --git a/ctypes/iconv.py b/ctypes/iconv.py
new file mode 100644 (file)
index 0000000..11ee248
--- /dev/null
@@ -0,0 +1,84 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+Module de support iconv pour Python.
+
+Copyright : Agence universitaire de la Francophonie
+Licence : GNU General Public Licence, version 2
+Auteur : Jean Christophe André
+Date de création : 20 mars 2009
+"""
+
+from ctypes import *
+from ctypes.util import find_library
+
+# on n'exporte que la fonction iconv ('a marche pô ?!)
+__all__ = ["iconv"]
+
+# la librairie C
+_libc = CDLL(find_library("c"))
+
+# un type spécifique à iconv (pour stoquer l'état de son automate)
+_iconv_t = c_void_p
+
+# prototype de la fonction iconv_open(3)
+_iconv_open = _libc.iconv_open
+_iconv_open.argtypes = [c_char_p, c_char_p]
+_iconv_open.restype = _iconv_t
+
+# prototype de la fonction iconv(3)
+_iconv = _libc.iconv
+_iconv.argtypes = [_iconv_t,
+                   POINTER(POINTER(ARRAY(c_char, 1024))), POINTER(c_size_t),
+                   POINTER(POINTER(ARRAY(c_char, 4096))), POINTER(c_size_t)]
+_iconv.restype = c_size_t
+
+# prototype de la fonction iconv_close(3)
+_iconv_close = _libc.iconv_close
+_iconv_close.argtypes = [_iconv_t]
+_iconv_close.restype = c_int
+
+def iconv(from_code, to_code, string):
+    """
+    from_code : encodage d'origine de string
+    to_code : encodage souhaité en retour
+    string : la chaîne dont il faut convertir l'encodage
+
+    On pourra utiliser to_code='ascii//TRANSLIT' pour supprimer les accents.
+    Attention : ça ne fonctionne pas à 100% !
+
+    Plus de détails dans la page de manuel de iconv(1).
+    """
+
+    # on commence par créer un contexte de conversion
+    cp = _iconv_open(c_char_p(to_code), c_char_p(from_code))
+
+    # on prépare les structures de données à transmettres
+    inbuf = create_string_buffer(string, 1024)
+    inbytesleft = c_size_t(len(inbuf))
+    outbuf = create_string_buffer(4096)
+    outbytesleft = c_size_t(len(outbuf))
+
+    # on effectue la conversion
+    _iconv(cp, byref(pointer(inbuf)), byref(inbytesleft),
+               byref(pointer(outbuf)), byref(outbytesleft))
+    result = outbuf.value[:outbytesleft.value]
+
+    # on détruit le contexte de conversion et on retourne le résultat
+    _iconv_close(cp)
+    return result
+
+if __name__ == "__main__":
+    # on précise la translitération via un environnement linguistique
+    from locale import setlocale, LC_ALL
+    setlocale(LC_ALL, 'en_US.UTF-8')
+
+    # test de cas limites (en français, vietnamien et japonais)
+    from unicodedata import normalize
+    t = u"fête cœur français tiếng việt đường プログフ"
+    i = iconv("utf-8", "ascii//TRANSLIT", t.encode('utf-8'))
+    u = normalize("NFKD", t).encode('ascii','ignore')
+    print u"TEST: texte original: '%s'" % t
+    print u"TEST: iconv(utf8..ascii//TRANSLIT): '%s'" % i
+    print u"TEST: normalize(NFKD).encode(ascii,ignore): '%s'" % u
+
diff --git a/mod_python/index.py b/mod_python/index.py
new file mode 100644 (file)
index 0000000..64f4db8
--- /dev/null
@@ -0,0 +1,102 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+Index automatique des dossiers et sous-dossiers et liens sur les fichiers.
+(Page de téléchargement pour les documents de la CRE en Asie-Pacifique.)
+
+Copyright : Agence universitaire de la Francophonie
+Licence : GNU General Public Licence, version 2
+Auteur : Jean Christophe André
+Date de création : 25 mars 2009
+"""
+
+import os
+import mod_python
+import urllib
+
+HTML = u"""
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+  <title>CRE</title>
+  <style type="text/css">
+body { background: url('Bamboo2-jc.png') #80FF80; }
+a { color: black; text-decoration: none; }
+a:hover { color: black; text-decoration: underline; }
+a:visited { color: black; text-decoration: underline; }
+li { padding: 3pt; list-style: none; font-weight: bold; font-family: sans; }
+li em { color: black; font-size: 70%%; }
+.hidden { display: none; }
+.visible { display: inline; }
+  </style>
+  <script type="text/javascript">
+function sw(id) {
+  elt = document.getElementById(id)
+  if (elt.className == 'hidden') {
+    elt.className = 'visible';
+  } else {
+    elt.className = 'hidden';
+  }
+}
+  </script>
+</head>
+<body>
+%(content)s
+</body>
+</html>
+"""
+
+id_number = 0
+
+def human_size(size):
+    if size < 1024: return "%s octets" % size
+    size /= 1024
+    if size < 1024: return "%s Kio" % size
+    size /= 1024
+    if size < 1024: return "%s Mio" % size
+    size /= 1024
+    if size < 1024: return "%s Gio" % size
+    size /= 1024
+    return "%s Tio" % size
+
+def my_listdir(dir):
+    path = os.path.join(os.environ["PWD"], dir)
+    names = os.listdir(path)
+    dirs = [x for x in names if os.path.isdir(os.path.join(path, x))]
+    files = [x for x in names if os.path.isfile(os.path.join(path, x))]
+    return dirs, files
+
+def my_getsize(file):
+    path = os.path.join(os.environ["PWD"], file)
+    return os.path.getsize(path)
+
+def dir_content(root, level=0):
+    global id_number
+    space = u"  " * level
+    dirs, files = my_listdir(root)
+    content = space + u"""<div id="l%s" class="%s"><ul>\n""" \
+                % (id_number, level == 0 and "visible" or "hidden")
+    id_number += 1
+    for dir in sorted(dirs):
+        content += space + u"""<li>"""
+        content += u"""<a href="javascript:void(0)" onclick="sw('l%s')">%s</a>""" \
+                    % (id_number, dir.decode('utf-8'))
+        content += u"""</li>\n"""
+        content += dir_content(os.path.join(root, dir), level + 1)
+    if level > 0:
+        for file in sorted(files):
+            content += space + u"""<li>"""
+            content += u"""<a href="%s">%s</a> <em>(%s)</em>""" \
+                        % (urllib.quote(root+'/'+file), file.decode('utf-8'),
+                           human_size(my_getsize(os.path.join(root, file))) )
+            content += u"""</li>\n"""
+    content += space + u"""</ul></div>\n"""
+    return content
+
+def handler(request):
+    html = HTML % {'content': dir_content(".")}
+    request.content_type = "text/html; charset=utf-8"
+    request.write(html.encode('utf-8'))
+    return mod_python.apache.OK
+