source: pyromaths/trunk/fuentes/src/pyromaths/outils/TexFiles.py @ 423

Last change on this file since 423 was 423, checked in by mabarracus, 4 years ago

add sources from pyromaths 15.10

File size: 4.2 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# Pyromaths
4# Un programme en Python qui permet de créer des fiches d'exercices types de
5# mathématiques niveau collège ainsi que leur corrigé en LaTeX.
6# Copyright (C) 2006 -- Jérôme Ortais (jerome.ortais@pyromaths.org)
7#
8# This program is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation; either version 2 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program; if not, write to the Free Software
20# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21#
22import codecs
23def mise_en_forme(file):
24    """
25    \begin => +2 espaces si pas \begin{document}
26    \item => +2 espaces après sauf si c'est \item
27    \end => -2 espaces avant sauf si \end{document}
28    Si longueur de ligne >80, retour ligne au dernier espace précédent et
29        indentation de la ligne suivante.
30    Couper la ligne après un \\begin{}[]{} ou un \\end{}
31    lline : last line
32    cline : current line
33    """
34    f = codecs.open(file, encoding='utf-8', mode='r')
35    old_tex = f.readlines()
36    new_tex = []
37    indent = 0
38    item = False
39    for cline in old_tex:
40        if new_tex:
41            lline = new_tex[-1]
42        else:
43            lline = ""
44        cline = cline.strip()
45        indent = trouve_indentation(cline, indent, lline)
46        if indent < 0:
47            print _("problème")
48        if cline:
49            chaine, indent = traite_chaine(cline, indent)
50            new_tex.extend(chaine)
51        else:
52            new_tex.append("")
53    f.close()
54    f = codecs.open(file, encoding='utf-8', mode='w')
55    f.write("\n".join(new_tex))
56    f.close()
57
58def trouve_indentation(cline, indent, lline):
59    if lline.find(r"\begin{") >= 0:
60        _("indente tout ce qui suit \begin{...}")
61        indent += 2
62    if cline.find(r"\end{") == 0:
63        _("desindente tout ce qui suit \end{...}")
64        indent -= 2
65#    if lline.find(r"\begin{enumerate}")>=0 or lline.find(r"\begin{itemize}")>=0:
66#        "n'indente pas ce qui suit un environnement itemize"
67#        indent -= 2
68#    if cline.find(r"\item") == 0 and lline.find(r"\begin{enumerate}") < 0 \
69#                                  and lline.find(r"\begin{itemize}") < 0:
70#        indent -= 2
71    if cline.find(r"\item") == 0 :
72        indent -= 2
73    if lline.find(r"\item") >= 0:
74        indent += 2
75    indent += compte_paires_ouvertes(lline)
76    return indent
77
78def traite_chaine(cline, indent):
79    """indente la chaine txt en fonction du paramètre indent"""
80    list = []
81    cline = " "*indent + cline
82    list.append(cline)
83    while len(list[-1]) > 80:
84        if list[-1].rfind(" ", indent + 1, 80) > 0:
85            for i in range(79, indent, -1):
86                if list[-1][i] == " ":
87                    list.append(list[-1][:i])
88                    indent = trouve_indentation(list[-2][i + 1:], indent, list[-1])
89                    list.append(" "*indent + list[-2][i + 1:])
90                    list.pop(-3)
91                    break
92        else:
93            break
94    return list, indent
95
96def trouve_paire(txt):
97    """Trouve le caractère fermant pour les symboles {, [, ( qui est le 1er
98    caractère de txt"""
99    ouvrant = ["{", "[", "("]
100    fermant = ["}", "]", ")"]
101    index = ouvrant.index(txt[0])
102    compte = 0
103    for i in range(len(txt)):
104        if txt[i] == ouvrant[index]:
105            compte += 1
106        elif txt[i] == fermant[index]:
107            compte -= 1
108        if compte == 0:
109            return i
110    return None
111
112def compte_paires_ouvertes(txt):
113    """Compte le nombres de paires {...}, \[...\] qui ne sont pas fermées dans
114    la string txt"""
115    diff = 0
116    for i in ["{", r"\["]:
117        diff += txt.count(i)
118    for i in ["}", r"\]"]:
119        diff -= txt.count(i)
120    return 2 * diff
121
122# mise_en_forme("/home/jerome/Documents/projets/pyromaths/exemples/3e-corrige.tex")
123# mise_en_forme("/tmp/4e.tex")
Note: See TracBrowser for help on using the repository browser.