{"record":{"id":"068e3da5d5b55c7f","repo":"BigPizzaV3/CodexPlusPlus","slug":"theme-css","errorCode":null,"errorMessage":"theme.css 包含不允许的控制字符、注释或转义","messagePattern":"theme\\.css 包含不允许的控制字符、注释或转义","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/codex-plus-core/src/dream_skin_package.rs","lineNumber":285,"sourceCode":"}\n\n#[derive(Debug)]\nstruct SafeCssRule<'a> {\n    selector: &'a str,\n    part: &'a str,\n    declarations: Vec<(&'a str, &'a str)>,\n}\n\nfn parse_safe_css(css: &str) -> anyhow::Result<Vec<SafeCssRule<'_>>> {\n    if css.is_empty() || css.len() > CSS_LIMIT {\n        bail!(\"theme.css 为空或超过 256 KiB 限制\");\n    }\n    if css.chars().any(forbidden_css_character)\n        || css.contains(\"/*\")\n        || css.contains(\"*/\")\n        || css.contains('\\\\')\n    {\n        bail!(\"theme.css 包含不允许的控制字符、注释或转义\");\n    }\n    let allowed_parts = [\n        \"root\",\n        \"sidebar\",\n        \"main\",\n        \"header\",\n        \"home\",\n        \"home-hero\",\n        \"project-list\",\n        \"thread\",\n        \"message\",\n        \"composer\",\n        \"composer-toolbar\",\n        \"dialog\",\n    ];\n    let mut parsed = Vec::new();\n    let mut declarations = 0usize;\n    let mut rest = css;","sourceCodeStart":267,"sourceCodeEnd":303,"githubUrl":"https://github.com/BigPizzaV3/CodexPlusPlus/blob/f2074595a281bc057525c748175c8eb9805b0673/crates/codex-plus-core/src/dream_skin_package.rs#L267-L303","documentation":"Character guard in parse_safe_css: the stylesheet contains a character rejected by forbidden_css_character (control characters), CSS comments (/* */), or backslash escapes. The Safe CSS subset is deliberately comment- and escape-free so the compiled output is fully predictable.","triggerScenarios":"Thrown at crates/codex-plus-core/src/dream_skin_package.rs:285 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Strip comments, backslash escapes, and control characters from theme.css","Use only plain ASCII-safe declarations"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"f2074595a281bc057525c748175c8eb9805b0673","analyzedAt":"2026-08-23T12:52:24.489Z","contentChangedAt":"2026-08-23T12:52:24.489Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}