ZahirJS commited on
Commit
29bc850
·
verified ·
1 Parent(s): 6dfc154

Update timeline_generator.py

Browse files
Files changed (1) hide show
  1. timeline_generator.py +4 -15
timeline_generator.py CHANGED
@@ -62,16 +62,15 @@ def generate_timeline_diagram(json_input: str, output_format: str) -> str:
62
  }
63
  )
64
 
65
- base_color = '#19191a' # Hardcoded base color
66
 
67
  title = data.get('title', '')
68
  events = data.get('events', [])
69
- events_per_row = data.get('events_per_row', 4) # Default to 4 events per row
70
 
71
  if not events:
72
  raise ValueError("Timeline must contain at least one event")
73
 
74
- # Add title node if provided
75
  if title:
76
  dot.node(
77
  'title',
@@ -80,19 +79,17 @@ def generate_timeline_diagram(json_input: str, output_format: str) -> str:
80
  fontsize='18',
81
  fontweight='bold',
82
  fontcolor=base_color,
83
- pos="6,2!" # Centered at top (adjust x-coordinate based on timeline width)
84
  )
85
 
86
  total_events = len(events)
87
 
88
- # Create all event nodes first
89
  for i, event in enumerate(events):
90
  event_id = event.get('id', f'event_{i}')
91
  event_label = event.get('label', f'Event {i+1}')
92
  event_date = event.get('date', '')
93
  event_description = event.get('description', '')
94
 
95
- # Create full label with date and description
96
  if event_date and event_description:
97
  full_label = f"{event_date}\\n{event_label}\\n{event_description}"
98
  elif event_date:
@@ -102,7 +99,6 @@ def generate_timeline_diagram(json_input: str, output_format: str) -> str:
102
  else:
103
  full_label = event_label
104
 
105
- # Calculate color opacity based on position in timeline
106
  if total_events == 1:
107
  opacity = 'FF'
108
  else:
@@ -112,17 +108,14 @@ def generate_timeline_diagram(json_input: str, output_format: str) -> str:
112
  node_color = f"{base_color}{opacity}"
113
  font_color = 'white' if i < total_events * 0.7 else 'black'
114
 
115
- # Calculate position for serpentine layout
116
  row = i // events_per_row
117
  col = i % events_per_row
118
 
119
- # For odd rows, reverse the column position to create serpentine effect
120
  if row % 2 == 1:
121
  visual_col = events_per_row - 1 - col
122
  else:
123
  visual_col = col
124
 
125
- # Add the event node with position attributes for layout
126
  dot.node(
127
  event_id,
128
  full_label,
@@ -133,10 +126,9 @@ def generate_timeline_diagram(json_input: str, output_format: str) -> str:
133
  fontsize='12',
134
  width='2.5',
135
  height='1.2',
136
- pos=f"{visual_col * 4.5},{-row * 3}!" # Increased spacing for serpentine layout
137
  )
138
 
139
- # Connect events in chronological order (1→2→3→4...)
140
  for i in range(len(events) - 1):
141
  current_event_id = events[i].get('id', f'event_{i}')
142
  next_event_id = events[i + 1].get('id', f'event_{i + 1}')
@@ -149,9 +141,6 @@ def generate_timeline_diagram(json_input: str, output_format: str) -> str:
149
  penwidth='2'
150
  )
151
 
152
- # No need to connect title to events - it stays at the top independently
153
-
154
- # Set the layout engine to handle fixed positions
155
  dot.engine = 'neato'
156
 
157
  with NamedTemporaryFile(delete=False, suffix=f'.{output_format}') as tmp:
 
62
  }
63
  )
64
 
65
+ base_color = '#19191a'
66
 
67
  title = data.get('title', '')
68
  events = data.get('events', [])
69
+ events_per_row = data.get('events_per_row', 4)
70
 
71
  if not events:
72
  raise ValueError("Timeline must contain at least one event")
73
 
 
74
  if title:
75
  dot.node(
76
  'title',
 
79
  fontsize='18',
80
  fontweight='bold',
81
  fontcolor=base_color,
82
+ pos="6,2!"
83
  )
84
 
85
  total_events = len(events)
86
 
 
87
  for i, event in enumerate(events):
88
  event_id = event.get('id', f'event_{i}')
89
  event_label = event.get('label', f'Event {i+1}')
90
  event_date = event.get('date', '')
91
  event_description = event.get('description', '')
92
 
 
93
  if event_date and event_description:
94
  full_label = f"{event_date}\\n{event_label}\\n{event_description}"
95
  elif event_date:
 
99
  else:
100
  full_label = event_label
101
 
 
102
  if total_events == 1:
103
  opacity = 'FF'
104
  else:
 
108
  node_color = f"{base_color}{opacity}"
109
  font_color = 'white' if i < total_events * 0.7 else 'black'
110
 
 
111
  row = i // events_per_row
112
  col = i % events_per_row
113
 
 
114
  if row % 2 == 1:
115
  visual_col = events_per_row - 1 - col
116
  else:
117
  visual_col = col
118
 
 
119
  dot.node(
120
  event_id,
121
  full_label,
 
126
  fontsize='12',
127
  width='2.5',
128
  height='1.2',
129
+ pos=f"{visual_col * 4.5},{-row * 3}!"
130
  )
131
 
 
132
  for i in range(len(events) - 1):
133
  current_event_id = events[i].get('id', f'event_{i}')
134
  next_event_id = events[i + 1].get('id', f'event_{i + 1}')
 
141
  penwidth='2'
142
  )
143
 
 
 
 
144
  dot.engine = 'neato'
145
 
146
  with NamedTemporaryFile(delete=False, suffix=f'.{output_format}') as tmp: