Skip to content

Commit

Permalink
Épuration du HTML et meilleure syntaxe Markdown
Browse files Browse the repository at this point in the history
- Les <br>, <p>, <div>, <span> sont transformés en paragraphes au sens Markdown
- Les listes à puces prennent toujours le format de liste à puces Markdown, y
  compris avec les tirets exotiques (avec une ligne vide précédent la liste à
  puces comme en Markdown originel)
- Maximum de 1 espace consécutive
- Maximum de 2 retours chariots consécutifs
- Le formatage des tableaux reste en HTML pour l’instant, mais la soupe de <tr>,
  <td>, <th> est séparée en les mettant chacun sur une ligne séparée; déjà ça
  rend le tableau plus lisible et les diffs plus lisibles
- Les alinéas sont désormais correctement délimités, par 1 ou 2 retours chariot
  (2 le plus souvent, mais 1 lorsqu’il s’agit de listes à puces), hormis dans
  les tableaux où cela demande un parsing spécifique.

Issue: #54
Issue: #25
  • Loading branch information
Seb35 committed Aug 14, 2018
1 parent 068b73f commit 48ee602
Showing 1 changed file with 47 additions and 22 deletions.
69 changes: 47 additions & 22 deletions marcheolex/exports/Markdown.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,19 +26,40 @@ def transformer_depuis_html( self, html ):
(string|None) Texte équivalent en Markdown.
"""

# Transformation des <br/> en <p>
texte = html
if texte == None:
texte = ''
texte = re.sub(r'<br ?\/>', '\n', texte)
texte = re.sub(r'<p>(.*?)<\/p>', r'\1\n\n', texte, flags=re.DOTALL)
texte = re.sub(r'\n\n+', '\n\n', texte)

# Retrait des espaces blancs de fin de ligne
texte = '\n'.join([l.strip() for l in texte.split('\n')])
texte = texte.strip()

# - Markdownisation des listes numérotées
return ''

# Transformation des <br>, <p>, <div>, <span>, <blockquote> en paragraphes Markdown
# - Les deux blockquote successifs servent lorsque deux blockquote sont imbriqués (souvent)
texte = re.sub(r'<br((?: [^>]*)?)/?>', '\n\n', texte)
texte = re.sub(r'<p(?:(?: [^>]*)?)>(.*?)</p>', r'\1\n\n', texte, flags=re.DOTALL)
texte = re.sub(r'<div(?:(?: [^>]*)?)>(.*?)</div>', r'\1\n\n', texte, flags=re.DOTALL)
texte = re.sub(r'<span(?:(?: [^>]*)?)>(.*?)</span>', r'\1\n\n', texte, flags=re.DOTALL)
texte = re.sub(r'<blockquote>(.*?)</blockquote>', r'\n\n\1\n\n', texte, flags=re.DOTALL)
texte = re.sub(r'<blockquote>(.*?)</blockquote>', r'\n\n\1\n\n', texte, flags=re.DOTALL)

# Les balises de tableau vont sur des lignes séparées
texte = re.sub(r'\s*<td(?: align="left")?((?: [^>]*)?)>\s*(.*?)\s*</td>\s*', r'\n<td\1>\2</td>\n', texte, flags=re.DOTALL)
texte = re.sub(r'\s*<th(?: align="left")?((?: [^>]*)?)>\s*(.*?)\s*</th>\s*', r'\n<th\1>\2</th>\n', texte, flags=re.DOTALL)
texte = re.sub(r'\s*<tr(?: align="left")?((?: [^>]*)?)>\s*', r'\n<tr\1>\n', texte, flags=re.DOTALL)
texte = re.sub(r'\s*</tr>\s*', '\n</tr>\n', texte, flags=re.DOTALL)

# Retrait des espaces blancs en début et fin de ligne
texte = re.sub(r'[ \t\r\f\v]+\n', '\n', texte)
texte = re.sub(r'\n[ \t\r\f\v]+', '\n', texte)

# Markdownisation des listes non-numérotées
# - Les sept tirets sont U+002D, U+2010 et U+2011, U+2012 et U+2013, U+2014 et U+2015
texte = re.sub(r'\n+[-‐‑‒–—―] *([^\n]+)', r'\n- \1', texte)
texte = re.sub(r'\n([^-][^\n]*)\n-([^\n]+)', r'\n\1\n\n-\2', texte)

# Markdownisation des listes numérotées
# - Certains convertisseurs Markdown → HTML renumérotent à partir de 1 dès que ça ressemble à une
# liste numérotée, ce qui bien sûr fait perdre ladite numérotation ; pour éviter cela, les listes
# numérotées ne sont pas transformées en syntaxe Markdown. Un point également à prendre en compte
# est que le signe par défaut est ° (par ex. 1°), ce qui serait probablement perdu en Markdown,
# faisant s’éloigner du texte original.
#lignes = texte.split('\n')
#ligne_liste = [ False ] * len(lignes)
#for i in range(len(lignes)):
Expand All @@ -47,13 +68,19 @@ def transformer_depuis_html( self, html ):
# lignes[i] = re.sub(r'^(\d+)([°\.\)-]) +', r'\1. ', lignes[i])
# lignes[i] = re.sub(r'^([\*-]) +', r'- ', lignes[i])

# - Création d’alinea séparés, sauf pour les listes
#texte = lignes[0]
#for i in range(1, len(lignes)):
# if ligne_liste[i]:
# texte = texte + '\n' + lignes[i]
# else:
# texte = texte + '\n\n' + lignes[i]
# Lorsque trop d’espaces consécutifs sont présents, limiter à un maximum de 1
texte = re.sub(r' {2,}', ' ', texte)

# Ajouter des espaces blancs en début de ligne des tableaux
texte = re.sub(r'\n*<td((?: [^>]*)?)>(.*?)</td>', r'\n <td\1>\2</td>', texte, flags=re.DOTALL)
texte = re.sub(r'\n*<th((?: [^>]*)?)>(.*?)</th>', r'\n <th\1>\2</th>', texte, flags=re.DOTALL)
texte = re.sub(r'\n*<tr((?: [^>]*)?)>\n*', r'\n <tr\1>\n', texte, flags=re.DOTALL)
texte = re.sub(r'\n*</tr>\n*', '\n </tr>\n', texte, flags=re.DOTALL)

# Lorsque trop de retours à la ligne consécutifs sont présents, limiter à un maximum de 2
texte = re.sub(r'\n{3,}', '\n\n', texte)

texte = texte.strip()

return texte

Expand Down Expand Up @@ -97,11 +124,9 @@ def obtenir_titre( self, parents, texte ):
(string|None) Texte du titre dans la syntaxe représentée.
"""

marque_niveau = ''
for i in range( len(parents) ):
marque_niveau = marque_niveau + '#'
marque_niveau = '#' * len(parents)

texte = re.sub( r'&#13;\n*', '', texte )
texte = re.sub( r'(&#13;)?\n*', '', texte ).strip()

return marque_niveau + ' ' + texte + '\n\n'

Expand Down

0 comments on commit 48ee602

Please sign in to comment.