@@ -183,6 +183,15 @@ def fetch_issue_details(issue_number: int) -> tuple[dict | None, str | None]:
183183 }, None
184184
185185
186+ def sanitize_title_for_markdown_link (title : str ) -> str :
187+ """Remove or escape markdown special characters from title for use in link text."""
188+ # Remove backticks which break markdown link syntax
189+ sanitized = title .replace ("`" , "" )
190+ # Remove square brackets which interfere with link syntax
191+ sanitized = sanitized .replace ("[" , "(" ).replace ("]" , ")" )
192+ return sanitized
193+
194+
186195def replace_issue_references_with_previews (markdown_content : str ) -> str :
187196 """Replace issue references with styled previews."""
188197 # Pattern for issue links like [#12331](https://github.com/streamlit/streamlit/issues/12331)
@@ -206,8 +215,8 @@ def create_issue_preview(issue_number: int) -> str:
206215 else :
207216 status_icon = ":violet[:material/check_circle:]"
208217
209- # Truncate title if too long
210- title = issue_details ["title" ]
218+ # Sanitize and truncate title for use in markdown link
219+ title = sanitize_title_for_markdown_link ( issue_details ["title" ])
211220 if len (title ) > 50 :
212221 title = title [:50 ] + "..."
213222
@@ -582,12 +591,36 @@ def main() -> None:
582591 fetch_merged_specs .clear ()
583592 st .markdown ("Read product specs from the Streamlit repo." )
584593
585- tab_open , tab_merged = st .tabs (["Open PRs" , "Merged Specs" ])
594+ # Determine initial view from query params
595+ view_param = st .query_params .get ("view" )
596+ if view_param == "open" or "pr" in st .query_params :
597+ default_view = "Open PRs"
598+ elif view_param == "merged" or "spec" in st .query_params :
599+ default_view = "Merged Specs"
600+ else :
601+ default_view = "Merged Specs" # Default to merged specs
602+
603+ view_options = ["Open PRs" , "Merged Specs" ]
604+ selected_view = st .segmented_control (
605+ "View" ,
606+ options = view_options ,
607+ default = default_view ,
608+ label_visibility = "collapsed" ,
609+ )
586610
587- with tab_open :
611+ # Update query param when view changes and clean up conflicting params
612+ new_view_param = "merged" if selected_view == "Merged Specs" else "open"
613+ if st .query_params .get ("view" ) != new_view_param :
614+ st .query_params ["view" ] = new_view_param
615+ # Remove conflicting query params when switching views
616+ if new_view_param == "merged" and "pr" in st .query_params :
617+ del st .query_params ["pr" ]
618+ elif new_view_param == "open" and "spec" in st .query_params :
619+ del st .query_params ["spec" ]
620+
621+ if selected_view == "Open PRs" :
588622 render_open_spec_prs ()
589-
590- with tab_merged :
623+ else :
591624 render_merged_specs ()
592625
593626
0 commit comments