Skip to content

Commit fff1ce3

Browse files
committed
Adjust heading levels for content inside AVDELNING sections
Content under AVDELNING sections now uses lower heading levels to reflect proper hierarchy: - AVDELNING headers remain H2 (##) - KAPITEL headers become H3 (###) when inside AVDELNING - Subsection titles become H4 (####) - Paragraph markers (§) become H5 (#####) when inside AVDELNING This ensures the Markdown heading hierarchy properly represents the document structure, where AVDELNING is the top-level organizational unit containing KAPITEL and their paragraphs. Example structure: ## AVDELNING I. (H2) ### 1 kap. (H3 - shifted from H2) #### Section title (H4) ##### 1 § (H5 - shifted from H4)
1 parent 7b86696 commit fff1ce3

1 file changed

Lines changed: 61 additions & 24 deletions

File tree

formatters/format_sfs_text.py

Lines changed: 61 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ def parse_logical_paragraphs(text: str) -> list:
119119
def _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+
134152
def 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

Comments
 (0)