90 lines
No EOL
3.9 KiB
Python
90 lines
No EOL
3.9 KiB
Python
# Importation des bibliothèques nécessaires
|
|
import mdformat # Pour formater le texte Markdown
|
|
import streamlit as st # Pour créer l'interface utilisateur web
|
|
import requests # Pour effectuer des requêtes HTTP
|
|
import re # Pour les expressions régulières
|
|
|
|
# Importation du texte de démonstration depuis un autre fichier
|
|
from demo_text import demo_text
|
|
|
|
# Définition de la fonction principale pour l'onglet 1 de l'application
|
|
def app_tab1():
|
|
# Fonction de rappel pour le bouton de formatage
|
|
def button1_callback():
|
|
# Récupère le texte Markdown actuel
|
|
markdown_text = st.session_state['markdown']
|
|
|
|
# Vérifie si l'utilisateur veut ajouter des nouvelles pages
|
|
if st.session_state.get('add_newpage_checkbox', False):
|
|
header_level = st.session_state['header_level_select']
|
|
|
|
# 1. Insérer \newpage avant le niveau d'en-tête spécifié
|
|
lines = markdown_text.split('\n')
|
|
new_lines = []
|
|
for line in lines:
|
|
if line.startswith('#' * header_level + ' '):
|
|
new_lines.append('\\newpage')
|
|
new_lines.append(line)
|
|
markdown_text = '\n'.join(new_lines)
|
|
|
|
# 2. Supprimer les \newpage trop proches, sauf s'il y a une image
|
|
final_lines = []
|
|
i = 0
|
|
while i < len(new_lines):
|
|
if new_lines[i] == '\\newpage':
|
|
# Vérifier si la prochaine \newpage est trop proche
|
|
next_newpage_index = -1
|
|
for j in range(i + 1, min(i + 11, len(new_lines))): # Vérifier jusqu'à 10 lignes plus loin
|
|
if new_lines[j] == '\\newpage':
|
|
next_newpage_index = j
|
|
break
|
|
|
|
if next_newpage_index != -1:
|
|
# Vérifier s'il y a une image entre les deux \newpage
|
|
image_found = False
|
|
for k in range(i + 1, next_newpage_index):
|
|
if '!' in new_lines[k] and '[' in new_lines[k] and ']' in new_lines[k] and '(' in new_lines[k] and ')' in new_lines[k]:
|
|
image_found = True
|
|
break
|
|
|
|
if not image_found:
|
|
# Supprimer la \newpage actuelle si la prochaine est trop proche et pas d'image
|
|
i += 1 # Passer la \newpage actuelle
|
|
continue # Ne pas l'ajouter à final_lines
|
|
|
|
final_lines.append(new_lines[i])
|
|
i += 1
|
|
|
|
markdown_text = '\n'.join(final_lines)
|
|
|
|
# Formate le texte Markdown stocké dans la session et active la numérotation
|
|
st.session_state['markdown'] = mdformat.text(markdown_text,
|
|
options={"number": True})
|
|
|
|
# Création d'une zone de texte pour entrer le contenu Markdown
|
|
st.text_area(
|
|
# Texte d'instruction pour l'utilisateur
|
|
"Entre ton texte ici. Les images sont dans ./images/",
|
|
# Texte par défaut (démonstration)
|
|
st.session_state.get('markdown', demo_text),
|
|
# Hauteur de la zone de texte en pixels
|
|
height=450,
|
|
# Clé unique pour identifier cet élément dans la session
|
|
key='markdown'
|
|
)
|
|
|
|
# Menu déroulant pour choisir le niveau d'en-tête
|
|
st.selectbox(
|
|
"Insérer une nouvelle page avant les en-têtes de niveau :",
|
|
options=[1, 2, 3, 4, 5, 6],
|
|
index=1, # Par défaut, niveau 2
|
|
key='header_level_select'
|
|
)
|
|
|
|
# Création d'un bouton pour formater le texte
|
|
st.button(
|
|
# Texte affiché sur le bouton
|
|
"Formater le texte",
|
|
# Fonction à appeler lorsque le bouton est cliqué
|
|
on_click=button1_callback
|
|
) |