IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Remplacer des nombres par différents tags html suivant leurs valeurs


Sujet :

Python

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Remplacer des nombres par différents tags html suivant leurs valeurs
    Bonjour,

    Je termine la conversion d'un livre en ePub et j'aimerais créer des hyperliens dans la bilbiographie et l'index vers les numéros de pages pour lesquels il existe des ancres dans le texte.

    Concrètement, le livre est divisé avec un fichier .htm par chapitre, de sorte que l'hyperlien varie en fonction des numéros de pages:

    htm file name first page
    003_introduction.htm 5
    01_Part1chap2.htm 27
    02_Part1chap2.htm 46
    03_Part1chap3.htm 71
    04_Part1chap4.htm 89
    etc.

    Par ailleurs, dans la bibliographie, les numéros de page où sont mentionnés chaque ouvrage sont mis entre crochets à la fin de la référence. P.ex.:
    <p class="biblio" id="Atlan-1972">Atlan H., <i>L’organisation biologique et la théorie de l’information,</i> Paris, Ed. Herman, 1972, 300 p. [<i>72, 73, 261</i>].</p>

    Il faut donc retrouver les numéros de page, vérifier dans quel fichier htm ils sont "ancrés" et créer le tag hyperlien en fonction de cela...

    J'imagine faire un script python et utiliser regex (il y a 400 référence bibliographique, sans compter l'index...), mais je suis tellement novice que si quelqu'un pouvait me mettre le pied à l'étrier, j'apprécierais!

    Pierre

  2. #2
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Solution
    Bonjour,

    La solution trouvée n'est certainement pas la plus propre, mais elle fonctionne plus ou moins et je la partage ici. Si quelqu'un a des suggestions d'amélioration, je suis preneur.

    Extrait du fichier:
    Accroissement, 220, 226, 229, 252
    Accumulation, 21
    Acquis, 18, 59
    Acquisition, 252
    Acte, 37, 200
    Acteur, 8, 90, 169, 191, 223, 224, 228
    Script
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    # -*- coding: utf-8 -*-
    # Python
     
    import os, sys, fileinput, shutil, re
     
    input_dir = "/dir"
     
    # liste des chapitres avec le numéro de première page et le nom de fichier correspondant
    ChapNameByPage = (
       (1, "002Avant-Propos.htm"),
       (5, "003_introduction.htm"),
       (27, "01_Part1chap1.htm"),
       (46, "02_Part1chap2.htm"),
       (71, "03_Part1chap3.htm"),
       (89, "04_Part2chap4.htm"),
       (102, "05_Part2chap5.htm"),
       (126, "06_Part2chap6.htm"),
       (153, "07_Part3chap7.htm"),
       (168, "08_Part3chap8.htm"),
       (194, "09_Part3chap9.htm"),
       (217, "10_Part4chap10.htm"),
       (237, "11_Part4chap11.htm"),
       (255, "12_Part4chap12.htm"),
       (269, "13_Conclusion.xhtml"),
       (273, "14_PostFace.xhtml"),
       (281, "99_Annexe.htm"),
       (299, "991_Bibliographie.htm"),
       (321, "Index.xhtml"),
       (340, "Max") # Pour ne pas générer d'erreur pour les pages > 321
    )
     
    def repl(var):
       PageNum = int(var.group(0))
     
    Les ancres de numéros de page sont à 3 chiffres ("005")
     
       if ChapNameByPage[0][0] <= PageNum <= ChapNameByPage[-1][0] -1:
          ChapId = 0
          if PageNum < 10:
             ZeroFill = "00"
          elif PageNum < 100:
             ZeroFill = "0"
          else:
             ZeroFill = ""
     
    # Parcourt la liste des chapitres jusqu'à trouver celui qui correspond, puis renvoie le tag url
     
          while ChapId < ChapNameByPage[ChapId][0]:
             if ChapNameByPage[ChapId][0] <= PageNum < ChapNameByPage[ChapId + 1][0]:
                return '<a href="../Text/%s#P%s%d">%d</a>' % (ChapNameByPage[ChapId][1], ZeroFill, PageNum, PageNum)        
             ChapId = ChapId + 1
       else:
          print "Page number out of range"
     
    # Ouverture du fichier
     
    input_file = open(input_dir + "/file.txt", "rb")
    file_content = unicode(input_file.read(), "utf-8")
    input_file.close()
     
    # C'est ici que tout se joue avec "repl" qui est la fonction et qui reçoit comme argument le match
    output_text = re.sub("\d+", repl, file_content)
     
    output_file = open(input_dir + "/file.txt", "r+b")
    output_file.read() # we do this way to preserve file creation date
    output_file.seek(0)
    output_file.write(output_text.encode("utf-8"))
    output_file.truncate()
    output_file.close()

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/02/2015, 13h29
  2. Remplacement des Frames par Css et Html
    Par Alpha31 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 20/07/2009, 09h55
  3. Label d'axe graphique: remplacer les nombres par des mots
    Par Chrysomallus dans le forum MATLAB
    Réponses: 3
    Dernier message: 19/04/2007, 15h23
  4. [PHP][HTML] remplacer des RC par des <br>
    Par Arnard dans le forum Langage
    Réponses: 2
    Dernier message: 26/06/2006, 21h21
  5. Réponses: 5
    Dernier message: 30/05/2005, 16h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo