SYMBOL INDEX (65 symbols across 9 files) FILE: scripts/categorize.py function _remove_prohibited_context (line 33) | def _remove_prohibited_context(text: str) -> str: function is_harmful (line 38) | def is_harmful(text: str) -> bool: function is_non_simplified_chinese (line 48) | def is_non_simplified_chinese(text: str) -> bool: function remove_emoji (line 71) | def remove_emoji(text: str) -> str: function clean_text_advanced (line 77) | def clean_text_advanced(text: str, title: str = "") -> str: function clean_title_advanced (line 138) | def clean_title_advanced(title: str) -> str: function _remove_rule_context (line 161) | def _remove_rule_context(text: str) -> str: function determine_category (line 370) | def determine_category(title: str, desc: str) -> str: function main (line 397) | def main(): FILE: scripts/crawl.py function setup_logging (line 73) | def setup_logging(log_path: Path) -> logging.Logger: class ProgressTracker (line 110) | class ProgressTracker: method __init__ (line 113) | def __init__(self, total: int): method tick (line 120) | def tick(self, keep: bool): method progress_str (line 127) | def progress_str(self) -> str: method summary_str (line 151) | def summary_str(self) -> str: function init_db (line 165) | def init_db(db_path: Path) -> sqlite3.Connection: function upsert_entry (line 196) | def upsert_entry(conn: sqlite3.Connection, data: dict): function parse_subscriber_text (line 261) | def parse_subscriber_text(text: str) -> tuple: function crawl_page (line 285) | def crawl_page(session: requests.Session, url: str, username: str) -> dict: function crawl_preview_page (line 357) | def crawl_preview_page(session: requests.Session, username: str) -> dict: function _request_with_retry (line 407) | def _request_with_retry( function _contains_chinese (line 448) | def _contains_chinese(text: str) -> bool: function _is_traditional_chinese (line 454) | def _is_traditional_chinese(text: str) -> bool: function _is_simplified_chinese_entry (line 472) | def _is_simplified_chinese_entry(entry: dict) -> bool: function _is_inactive_channel (line 491) | def _is_inactive_channel(entry: dict) -> bool: function _inactive_days (line 503) | def _inactive_days(entry: dict) -> int: function should_keep (line 513) | def should_keep(entry: dict) -> tuple: function main (line 554) | def main(): function _random_delay (line 752) | def _random_delay(): FILE: scripts/generate_readme.py function make_anchor (line 53) | def make_anchor(section: str, category_index: int | None = None) -> str: function format_count (line 59) | def format_count(count) -> str: function escape_pipe (line 65) | def escape_pipe(text: str) -> str: function compact_text (line 71) | def compact_text(text: str) -> str: function build_toc_column (line 77) | def build_toc_column(title: str, section_id: str, categories: list[str])... function generate_readme (line 84) | def generate_readme(conn: sqlite3.Connection) -> str: function main (line 242) | def main(): FILE: scripts/parse_links.py function init_db (line 25) | def init_db(db_path: Path) -> sqlite3.Connection: function extract_username (line 45) | def extract_username(url: str): function parse_readme (line 62) | def parse_readme(readme_path: Path) -> list: function main (line 104) | def main(): FILE: scripts/refilter.py function contains_chinese (line 24) | def contains_chinese(text): function is_traditional (line 28) | def is_traditional(text): function evaluate (line 39) | def evaluate(entry): function main (line 79) | def main(): FILE: scripts/scrape_tgnav.py function init_db (line 92) | def init_db(db_path: Path) -> sqlite3.Connection: function extract_tme_usernames (line 112) | def extract_tme_usernames(html: str) -> set[str]: function main (line 147) | def main(): FILE: web/build-data.js constant README_PATH (line 8) | const README_PATH = path.resolve(__dirname, '../README.md'); constant OUT_DIR (line 9) | const OUT_DIR = path.resolve(__dirname, 'public'); constant OUT_FILE (line 10) | const OUT_FILE = path.resolve(OUT_DIR, 'data.json'); function main (line 12) | function main() { FILE: web/public/sw.js constant CACHE_NAME (line 1) | const CACHE_NAME = 'rectg-cache-v2'; FILE: web/src/scripts/main.js function safeGetStorage (line 14) | function safeGetStorage(key) { function safeSetStorage (line 23) | function safeSetStorage(key, value) { function showToast (line 47) | function showToast(msg) { function initTheme (line 58) | function initTheme() { function initSidebar (line 76) | function initSidebar() { function highlightPinyin (line 131) | function highlightPinyin(text, matchPositions) { function initSearch (line 139) | function initSearch() { function initScrollSpy (line 203) | function initScrollSpy() { function initInteractions (line 229) | function initInteractions() { function initScrollFeatures (line 288) | function initScrollFeatures() { function initRouting (line 317) | function initRouting() { function initLikes (line 338) | function initLikes() { function init (line 373) | function init() {