@@ -550,6 +550,12 @@ def process_current_section():
550550
551551 # Bygg section-tagg med attribut
552552 attributes = []
553+
554+ # Lägg till id-attribut baserat på rubriken
555+ if header_match :
556+ section_id = generate_section_id (header_text )
557+ attributes .append (f'id="{ section_id } "' )
558+
553559 if css_classes :
554560 attributes .append (f'class="{ " " .join (css_classes )} "' )
555561
@@ -583,6 +589,7 @@ def process_current_section():
583589
584590 # Rensa nuvarande sektion
585591 current_section = []
592+ current_section = []
586593
587594 for line in lines :
588595 # Kontrollera om raden är en markdown-rubrik
@@ -853,3 +860,44 @@ def clean_section_tags(text: str) -> str:
853860 cleaned_result .pop ()
854861
855862 return '\n ' .join (cleaned_result )
863+
864+
865+ def generate_section_id (header_text : str ) -> str :
866+ """
867+ Genererar ett id-attribut för section-taggar baserat på rubrik eller paragrafnummer.
868+
869+ Regler:
870+ - Om rubriken innehåller paragrafnummer (t.ex. "5 §", "13 a §"), använd bara paragrafnumret
871+ - Annars skapa en slug från rubriken (max 15 tecken)
872+ - Ta bort markeringar (text inom //) innan slug-generering
873+
874+ Args:
875+ header_text (str): Rubriktext (utan # tecken)
876+
877+ Returns:
878+ str: ID som kan användas som HTML id-attribut
879+ """
880+ # Ta bort markeringar (text inom //) från rubriken
881+ clean_text = re .sub (r'/[^/]+/' , '' , header_text ).strip ()
882+
883+ # Kontrollera om det finns paragrafnummer i rubriken
884+ paragraph_match = re .search (r'(\d+(?:\s*[a-z])?)\s*§' , clean_text )
885+ if paragraph_match :
886+ # Extrahera paragrafnumret utan mellanslag
887+ paragraph_num = paragraph_match .group (1 ).replace (' ' , '' )
888+ return f"{ paragraph_num } §"
889+
890+ # Om inget paragrafnummer, skapa slug från rubriken
891+ # Ta bort alla icke-alfanumeriska tecken och ersätt med bindestreck
892+ slug = re .sub (r'[^\w\s-]' , '' , clean_text )
893+ slug = re .sub (r'\s+' , '-' , slug )
894+ slug = slug .lower ().strip ('-' )
895+
896+ # Begränsa till max 15 tecken
897+ if len (slug ) > 15 :
898+ slug = slug [:15 ].rstrip ('-' )
899+
900+ if not slug :
901+ raise ValueError (f"Kan inte generera giltigt ID från rubriktext: '{ header_text } '" )
902+
903+ return slug
0 commit comments