import re with open('app/modules/sag/templates/detail.html', 'r', encoding='utf-8') as f: html = f.read() pattern = re.compile(r"document\.querySelectorAll\('\[data-module\]'\)\.forEach\(\(el\) => \{.*?updateRightColumnVisibility\(\);", re.DOTALL) new_code = """document.querySelectorAll('[data-module]').forEach((el) => { const moduleName = el.getAttribute('data-module'); const hasContent = moduleHasContent(el); const isTimeModule = moduleName === 'time'; const shouldCompactWhenEmpty = moduleName !== 'wiki' && moduleName !== 'pipeline' && !isTimeModule; const pref = modulePrefs[moduleName]; const tabButton = document.querySelector(`[data-module-tab="${moduleName}"]`); // Helper til at skjule eller vise modulet og dets mb-3 indpakning const setVisibility = (visible) => { let wrapper = null; if (el.parentElement) { const isMB3 = el.parentElement.classList.contains('mb-3'); const isRowCol12 = el.parentElement.classList.contains('col-12') && el.parentElement.parentElement && el.parentElement.parentElement.classList.contains('row'); if (isMB3) wrapper = el.parentElement; else if (isRowCol12) wrapper = el.parentElement.parentElement; } if (visible) { el.classList.remove('d-none'); if (wrapper && wrapper.classList.contains('d-none')) { wrapper.classList.remove('d-none'); } if (tabButton && tabButton.classList.contains('d-none')) { tabButton.classList.remove('d-none'); } } else { el.classList.add('d-none'); if (wrapper && !wrapper.classList.contains('d-none')) wrapper.classList.add('d-none'); if (tabButton && !tabButton.classList.contains('d-none')) tabButton.classList.add('d-none'); } }; // Altid vis time (tid) if (isTimeModule) { setVisibility(true); el.classList.remove('module-empty-compact'); return; } // HVIS specifik præference deaktiverer den - Skjul den! Uanset content. if (pref === false) { setVisibility(false); el.classList.remove('module-empty-compact'); return; } // HVIS specifik præference aktiverer den (brugervalg) if (pref === true) { setVisibility(true); el.classList.toggle('module-empty-compact', shouldCompactWhenEmpty && !hasContent); return; } // Default logic (ingen brugervalg) - har den content, så vis den if (hasContent) { setVisibility(true); el.classList.remove('module-empty-compact'); return; } // Default logic - ingen content: se på layout defaults if (standardModuleSet.has(moduleName)) { setVisibility(true); el.classList.toggle('module-empty-compact', shouldCompactWhenEmpty); } else { setVisibility(false); el.classList.remove('module-empty-compact'); } }); updateRightColumnVisibility();""" html, count = pattern.subn(new_code, html) print(f"Replaced {count} instances.") with open('app/modules/sag/templates/detail.html', 'w', encoding='utf-8') as f: f.write(html)