1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
//! # Render Module - Text Display and Line Management
//!
//! This module provides data structures and utilities for rendering typing trainer text
//! to user interfaces. It handles text line breaking, cursor positioning, and provides
//! contextual information needed for visual display and styling.
//!
//! ## Key Features
//!
//! - **Flexible Line Breaking**: Word-aware and character-based line wrapping
//! - **Cursor Tracking**: Maintains cursor position across line boundaries
//! - **Context-Rich Rendering**: Provides character, word, and cursor information
//! - **Configurable Display**: Customizable line length and breaking behavior
//!
//! ## Rendering Pipeline
//!
//!
//! ## Usage Example
//!
//! ```rust
//! use gladius::render::{LineRenderConfig, LineContext};
//! use gladius::session::TypingSession;
//!
//! let session = TypingSession::new("hello world this is a test").unwrap();
//! let config = LineRenderConfig::new(10).with_word_wrapping(false);
//!
//! let lines = session.render_lines(|line_context: LineContext| {
//! // Process each line and return your line representation
//! Some(format!("Line: {} chars", line_context.contents.len()))
//! }, config);
//! ```
use crate::;
/// Context information for rendering a single character
///
/// Provides all the information needed to render one character, including its
/// typing state, containing word context, cursor position, and text index.
/// Used by UI frameworks to determine styling, highlighting, and visual effects.
///
/// # Fields
///
/// - `character`: The character data including its char value and typing state
/// - `word`: The word containing this character (None for whitespace)
/// - `has_cursor`: Whether the typing cursor is currently at this position
/// - `index`: Zero-based index of this character in the full text
/// Context information for rendering a complete line of text
///
/// Groups multiple characters into a line with metadata about the line's
/// relationship to the cursor position. Used by line-based rendering systems
/// to display text with proper line breaks and cursor tracking.
///
/// # Fields
///
/// - `active_line_offset`: Distance from the line containing the cursor
/// - `contents`: All characters in this line with their rendering contexts
///
/// # Line Offset Examples
///
/// ```text
/// Line -1: "hello world" (offset: -1, above cursor line)
/// Line 0: "this |is text" (offset: 0, contains cursor)
/// Line +1: "more text" (offset: +1, below cursor line)
/// ```
/// Configuration for line rendering behavior
///
/// Controls how text is broken into lines for display. Provides options for
/// line length limits, word wrapping behavior, and newline handling to support
/// different UI layouts and display requirements.
///
/// # Breaking Behavior
///
/// - **Word Wrapping**: When disabled, tries to break at word boundaries
/// - **Character Wrapping**: When word wrapping enabled, breaks anywhere
/// - **Newline Breaking**: When enabled, forces line breaks at `\n` characters
///
/// # Usage Examples
///
/// ```rust
/// use gladius::render::LineRenderConfig;
///
/// // Basic configuration: 80 characters, break at words
/// let config = LineRenderConfig::new(80);
///
/// // Allow breaking words mid-word for narrow displays
/// let narrow_config = LineRenderConfig::new(20)
/// .with_word_wrapping(true);
///
/// // Ignore newlines for continuous text flow
/// let flow_config = LineRenderConfig::new(50)
/// .with_newline_breaking(false);
/// ```
/// Iterator that produces rendering contexts for each character in a typing session
///
/// Provides a convenient way to iterate through all characters in the text with
/// their complete rendering context including typing state, word association,
/// and cursor position. Used as the foundation for all rendering operations.
///
/// # Performance
///
/// - Iteration: O(1) per character
/// - Memory: O(1) iterator state (does not copy text data)
/// - Length: O(1) via ExactSizeIterator
///
/// # Example
///
/// ```rust
/// use gladius::session::TypingSession;
///
/// let session = TypingSession::new("hello world").unwrap();
/// let mut contexts: Vec<_> = session.render_iter().collect();
///
/// assert_eq!(contexts.len(), 11); // "hello world" = 11 chars
/// assert_eq!(contexts[0].character.char, 'h');
/// assert_eq!(contexts[0].index, 0);
/// assert!(contexts[0].has_cursor); // Cursor starts at position 0
/// ```