# 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 )