def render_sequence(sequence, pam_sites): html = """
""" guide_positions = {} pam_positions = {} cut_positions = set() for idx, site in enumerate(pam_sites): start = site["position"] guide_len = len(site["guide"]) for i in range(start, start + guide_len): guide_positions[i] = idx pam_start = start + guide_len for i in range(pam_start, pam_start + 3): pam_positions[i] = idx cut_positions.add(site["cut_site"]) for i, base in enumerate(sequence): style = "" if i in guide_positions: style += "background-color:#2563eb;color:white;" if i in pam_positions: style += "background-color:#dc2626;color:white;font-weight:bold;" if i in cut_positions: style += "border-bottom:3px solid #22c55e;" if i % 10 == 0: html += f" {i} " html += f"{base}" if (i + 1) % 80 == 0: html += "

" html += """

Guide RNA

PAM Site (NGG)

Cas9 Cut Site
""" return html