@@ -119,7 +119,7 @@ def parse_logical_paragraphs(text: str) -> list:
119119def _add_header_with_blank_line (formatted : list , header_level : str , original_line : str ) -> None :
120120 """
121121 Lägg till en rubrik med tom rad före om nödvändigt enligt markdown-standarden.
122-
122+
123123 Args:
124124 formatted (list): Lista med formaterade rader
125125 header_level (str): Rubriknivå som "##" eller "###" eller "####"
@@ -131,6 +131,24 @@ def _add_header_with_blank_line(formatted: list, header_level: str, original_lin
131131 formatted .append (format_header_with_markings (header_level , original_line ))
132132
133133
134+ def _adjust_heading_level_for_avdelning (base_level : str , inside_avdelning : bool ) -> str :
135+ """
136+ Justera rubriknivån baserat på om vi är inuti en AVDELNING.
137+ Innehåll under AVDELNING får en nivå lägre (mer #).
138+
139+ Args:
140+ base_level (str): Basrubriknivå som "##", "###", eller "####"
141+ inside_avdelning (bool): Om vi är inuti en AVDELNING-sektion
142+
143+ Returns:
144+ str: Justerad rubriknivå
145+ """
146+ if inside_avdelning :
147+ # Lägg till en extra # för att sänka nivån
148+ return base_level + '#'
149+ return base_level
150+
151+
134152def format_sfs_text_as_markdown (text : str , apply_links : bool = False ) -> str :
135153 """
136154 Formattera texten från en författningstext importerad från
@@ -174,6 +192,7 @@ def format_sfs_text_as_markdown(text: str, apply_links: bool = False) -> str:
174192 # Steg 2: Bearbeta resultatet för rubriker och fetstil-formatering
175193 formatted = []
176194 previous_line_empty = True # Första raden räknas som början av nytt stycke
195+ inside_avdelning = False # Spåra om vi är inuti en AVDELNING
177196
178197 # Använd originalraderna för formatering men tillämpa rubriklogik baserat på rensade rader
179198 for i , original_line in enumerate (original_result_lines ):
@@ -224,42 +243,51 @@ def format_sfs_text_as_markdown(text: str, apply_links: bool = False) -> str:
224243 if not next_is_list_start or is_overgangsbestammelser :
225244 # Kontrollera först om det är en avdelningsrubrik (nivå 2 ##)
226245 if is_chapter_header (cleaned_line .strip ()):
246+ # AVDELNING är alltid nivå 2 (##) och markerar början av en ny sektion
247+ inside_avdelning = True
227248 _add_header_with_blank_line (formatted , '##' , original_line )
228249 # Kontrollera om det är ett kapitel (börjar med "X kap." eller "X Kap" eller "X A Kap")
229250 elif re .match (CHAPTER_PATTERN , cleaned_line .strip ()):
230- _add_header_with_blank_line (formatted , '##' , original_line )
251+ adjusted_level = _adjust_heading_level_for_avdelning ('##' , inside_avdelning )
252+ _add_header_with_blank_line (formatted , adjusted_level , original_line )
231253 # Kontrollera om det är en bilaga (börjar med "Bilaga ")
232254 elif cleaned_line .strip ().startswith (ATTACHMENT_PREFIX ):
233- _add_header_with_blank_line (formatted , '##' , original_line )
255+ adjusted_level = _adjust_heading_level_for_avdelning ('##' , inside_avdelning )
256+ _add_header_with_blank_line (formatted , adjusted_level , original_line )
234257 # Kontrollera om det är en artikel (börjar med "Artikel X")
235258 elif re .match (ARTIKEL_PATTERN , cleaned_line .strip ()):
236- _add_header_with_blank_line (formatted , '###' , original_line )
259+ adjusted_level = _adjust_heading_level_for_avdelning ('###' , inside_avdelning )
260+ _add_header_with_blank_line (formatted , adjusted_level , original_line )
237261 # Potentiella rubriker enligt standardkriterier
238262 elif is_potential_header :
239263 # Om raden har max två ord OCH inte innehåller punkt, eller uppfyller de andra kriterierna
240264 if (len (cleaned_line .split ()) <= 2 and '.' not in cleaned_line ) or (len (cleaned_line ) < 300 and not cleaned_line .strip ().endswith (('.' , ':' ))):
241265 # Använd H3-rubrik för rubriker
242- _add_header_with_blank_line (formatted , '###' , original_line )
266+ adjusted_level = _adjust_heading_level_for_avdelning ('###' , inside_avdelning )
267+ _add_header_with_blank_line (formatted , adjusted_level , original_line )
243268 else :
244269 # Hantera paragrafnummer som rubriker
245270 if previous_line_empty :
246271 # Kontrollera om raden börjar med paragrafnummer (använd rensad rad)
247272 paragraph_match = re .match (r'^' + PARAGRAPH_PATTERN , cleaned_line )
248273 if paragraph_match :
249274 paragraph_num = paragraph_match .group (0 )
250-
275+
251276 # Extrahera markeringar från originalraden
252277 markings = re .findall (TEMPORAL_MARKER_PATTERN , original_line )
253-
278+
279+ # Justera rubriknivå baserat på AVDELNING-kontext
280+ adjusted_level = _adjust_heading_level_for_avdelning ('####' , inside_avdelning )
281+
254282 # Skapa rubrik med bara markeringar och paragrafnummer
255283 if markings :
256284 markings_str = ' ' .join (markings )
257- formatted .append (f'#### { markings_str } { paragraph_num } ' )
285+ formatted .append (f'{ adjusted_level } { markings_str } { paragraph_num } ' )
258286 else :
259- formatted .append (f'#### { paragraph_num } ' )
260-
287+ formatted .append (f'{ adjusted_level } { paragraph_num } ' )
288+
261289 formatted .append ('' ) # Tom rad efter rubriken
262-
290+
263291 # Hitta resten av texten efter paragrafnumret i rensad rad
264292 rest_of_line = cleaned_line [len (paragraph_num ):].strip ()
265293 if rest_of_line :
@@ -270,26 +298,30 @@ def format_sfs_text_as_markdown(text: str, apply_links: bool = False) -> str:
270298 formatted .append (original_line )
271299 else :
272300 if is_chapter_header (cleaned_line .strip ()):
273- # Hantera avdelningsrubriker
301+ # Hantera avdelningsrubriker - alltid nivå 2 (##)
302+ inside_avdelning = True
274303 _add_header_with_blank_line (formatted , '##' , original_line )
275304 elif previous_line_empty :
276305 # Kontrollera om raden börjar med paragrafnummer (använd rensad rad)
277306 paragraph_match = re .match (r'^' + PARAGRAPH_PATTERN , cleaned_line )
278307 if paragraph_match :
279308 paragraph_num = paragraph_match .group (0 )
280-
309+
281310 # Extrahera markeringar från originalraden
282311 markings = re .findall (TEMPORAL_MARKER_PATTERN , original_line )
283-
312+
313+ # Justera rubriknivå baserat på AVDELNING-kontext
314+ adjusted_level = _adjust_heading_level_for_avdelning ('####' , inside_avdelning )
315+
284316 # Skapa rubrik med bara markeringar och paragrafnummer
285317 if markings :
286318 markings_str = ' ' .join (markings )
287- formatted .append (f'#### { markings_str } { paragraph_num } ' )
319+ formatted .append (f'{ adjusted_level } { markings_str } { paragraph_num } ' )
288320 else :
289- formatted .append (f'#### { paragraph_num } ' )
290-
321+ formatted .append (f'{ adjusted_level } { paragraph_num } ' )
322+
291323 formatted .append ('' ) # Tom rad efter rubriken
292-
324+
293325 # Hitta resten av texten efter paragrafnumret i rensad rad
294326 rest_of_line = cleaned_line [len (paragraph_num ):].strip ()
295327 if rest_of_line :
@@ -301,25 +333,30 @@ def format_sfs_text_as_markdown(text: str, apply_links: bool = False) -> str:
301333 else :
302334 # Hantera AVDELNING-rubriker och paragrafnummer som rubriker även när övriga kriterier inte uppfylls
303335 if is_chapter_header (cleaned_line .strip ()):
336+ # AVDELNING är alltid nivå 2 (##)
337+ inside_avdelning = True
304338 _add_header_with_blank_line (formatted , '##' , original_line )
305339 elif previous_line_empty :
306340 # Kontrollera om raden börjar med paragrafnummer (använd rensad rad)
307341 paragraph_match = re .match (r'^' + PARAGRAPH_PATTERN , cleaned_line )
308342 if paragraph_match :
309343 paragraph_num = paragraph_match .group (0 )
310-
344+
311345 # Extrahera markeringar från originalraden
312346 markings = re .findall (TEMPORAL_MARKER_PATTERN , original_line )
313-
347+
348+ # Justera rubriknivå baserat på AVDELNING-kontext
349+ adjusted_level = _adjust_heading_level_for_avdelning ('####' , inside_avdelning )
350+
314351 # Skapa rubrik med bara markeringar och paragrafnummer
315352 if markings :
316353 markings_str = ' ' .join (markings )
317- formatted .append (f'#### { markings_str } { paragraph_num } ' )
354+ formatted .append (f'{ adjusted_level } { markings_str } { paragraph_num } ' )
318355 else :
319- formatted .append (f'#### { paragraph_num } ' )
320-
356+ formatted .append (f'{ adjusted_level } { paragraph_num } ' )
357+
321358 formatted .append ('' ) # Tom rad efter rubriken
322-
359+
323360 # Hitta resten av texten efter paragrafnumret i rensad rad
324361 rest_of_line = cleaned_line [len (paragraph_num ):].strip ()
325362 if rest_of_line :
0 commit comments