Architectural Upgrade 2026-03-30: Modular Emacs, org-gtd v4.0, and PSF Phase 1
This commit is contained in:
75
system/scripts/split_mega_projects.py
Normal file
75
system/scripts/split_mega_projects.py
Normal file
@@ -0,0 +1,75 @@
|
||||
import re
|
||||
import sys
|
||||
|
||||
def split_org_project(file_path, project_title, chunk_size=50):
|
||||
with open(file_path, 'r', encoding='utf-8') as f:
|
||||
lines = f.readlines()
|
||||
|
||||
new_lines = []
|
||||
in_target_project = False
|
||||
project_indent = 0
|
||||
subtasks = []
|
||||
header_info = []
|
||||
|
||||
# regex to find the project
|
||||
project_re = re.compile(r'^(\*+) (?:TODO |NEXT |DONE |CNCL )?' + re.escape(project_title))
|
||||
|
||||
for i, line in enumerate(lines):
|
||||
match = project_re.match(line)
|
||||
if match:
|
||||
in_target_project = True
|
||||
project_indent = len(match.group(1))
|
||||
header_info.append(line)
|
||||
# Find the properties block of the project to preserve it
|
||||
continue
|
||||
|
||||
if in_target_project:
|
||||
# If we hit another headline of the same or higher level, project ended
|
||||
headline_match = re.match(r'^(\*+) ', line)
|
||||
if headline_match and len(headline_match.group(1)) <= project_indent:
|
||||
# Process the collected subtasks before continuing
|
||||
process_chunks(new_lines, project_title, subtasks, chunk_size)
|
||||
in_target_project = False
|
||||
new_lines.append(line)
|
||||
continue
|
||||
|
||||
# Collect everything in the project
|
||||
subtasks.append(line)
|
||||
else:
|
||||
new_lines.append(line)
|
||||
|
||||
if in_target_project:
|
||||
process_chunks(new_lines, project_title, subtasks, chunk_size)
|
||||
|
||||
with open(file_path, 'w', encoding='utf-8') as f:
|
||||
f.writelines(new_lines)
|
||||
|
||||
def process_chunks(target_list, title, subtasks, chunk_size):
|
||||
# Split subtasks into chunks based on Level 3 headlines (***)
|
||||
current_chunk = []
|
||||
chunk_count = 1
|
||||
task_count = 0
|
||||
|
||||
for line in subtasks:
|
||||
if line.startswith('*** '):
|
||||
if task_count >= chunk_size:
|
||||
write_chunk(target_list, title, current_chunk, chunk_count)
|
||||
current_chunk = []
|
||||
chunk_count += 1
|
||||
task_count = 0
|
||||
task_count += 1
|
||||
current_chunk.append(line)
|
||||
|
||||
if current_chunk:
|
||||
write_chunk(target_list, title, current_chunk, chunk_count)
|
||||
|
||||
def write_chunk(target_list, title, lines, part):
|
||||
target_list.append(f"** TODO {title} [Part {part}]\n")
|
||||
target_list.append(":PROPERTIES:\n")
|
||||
target_list.append(f":ID: {title.replace(' ', '-').lower()}-part-{part}\n")
|
||||
target_list.append(":ORG_GTD: Projects\n")
|
||||
target_list.append(":END:\n\n")
|
||||
target_list.extend(lines)
|
||||
|
||||
if __name__ == "__main__":
|
||||
split_org_project(sys.argv[1], sys.argv[2])
|
||||
Reference in New Issue
Block a user