TUI for Todoist written with React+Ink.
0

Configure Feed

Select the types of activity you want to include in your feed.

add more link cases for regex, remove underline

Aly Raffauf (Feb 14, 2026, 1:02 PM EST) 4da6b40d 0e9467a4

+13 -5
+1 -1
source/task-list-view.tsx
··· 16 16 {segments.map((seg, i) => 17 17 seg.type === 'link' ? ( 18 18 <Link key={i} url={seg.url}> 19 - {seg.text} 19 + <Text color="cyan">{seg.text}</Text> 20 20 </Link> 21 21 ) : ( 22 22 <Text key={i}>{seg.text}</Text>
+12 -4
source/utils.ts
··· 17 17 18 18 export function parseMdLink(content: string): ContentSegment[] { 19 19 const segments: ContentSegment[] = []; 20 - const linkPattern = /\[([^\]]+)\]\(([^)]+)\)/g; 20 + const linkPattern = 21 + /\[((?:\[[^\]]*\]|[^\]])+)\]\(([^)]+)\)|(https?:\/\/[^\s)]+)/g; 21 22 22 23 let lastIndex = 0; 23 24 let match; 24 25 25 26 while ((match = linkPattern.exec(content)) !== null) { 26 27 if (match.index > lastIndex) { 27 - segments.push({type: 'text', text: content.slice(lastIndex, match.index)}); 28 + segments.push({ 29 + type: 'text', 30 + text: content.slice(lastIndex, match.index), 31 + }); 28 32 } 29 33 30 - segments.push({type: 'link', text: match[1]!, url: match[2]!}); 34 + if (match[1] && match[2]) { 35 + segments.push({type: 'link', text: match[1], url: match[2]}); 36 + } else if (match[3]) { 37 + segments.push({type: 'link', text: match[3], url: match[3]}); 38 + } 39 + 31 40 lastIndex = match.index + match[0].length; 32 41 } 33 42 ··· 37 46 38 47 return segments; 39 48 } 40 -