// review_geom11.js - аудит Геометрии 11 (только репорт) const fs = require('fs'); const path = require('path'); const FILES = [ 'frontend/textbooks/geometry_11_hub.html', 'frontend/textbooks/geometry_11_ch1.html', 'frontend/textbooks/geometry_11_ch2.html', 'frontend/textbooks/geometry_11_ch3.html', 'frontend/textbooks/geometry_11_ch4.html', ]; const ROOT = path.join(__dirname, '..', '..'); // Словарь KaTeX-команд (часто встречающиеся) const KATEX_CMDS = new Set([ 'dfrac','frac','tfrac','sqrt','cdot','times','pm','mp','ne','le','ge','approx', 'angle','triangle','square','vec','overline','overrightarrow','overrightarrow', 'sin','cos','tan','cot','arcsin','arccos','arctan','log','ln','lg','exp', 'pi','alpha','beta','gamma','delta','varepsilon','theta','lambda','mu','phi','omega','rho','sigma','tau', 'Delta','Gamma','Omega','Phi','Sigma','Theta','Lambda', 'boxed','underline','mathbf','mathrm','text','textbf','textit', 'sum','prod','int','infty','lim','to','rightarrow','leftarrow','Rightarrow','Leftrightarrow', 'left','right','big','Big','bigg','Bigg','quad','qquad',',','!', 'cap','cup','in','notin','subset','supset','emptyset','varnothing', 'parallel','perp','cong','sim','equiv','neq', 'begin','end','array','matrix','pmatrix','bmatrix','cases','aligned','align', 'displaystyle','textstyle','scriptstyle', 'colon','ldots','cdots','vdots','ddots', 'mathbb','mathcal','mathfrak','operatorname', 'hat','tilde','bar','dot','widehat','widetilde', 'binom','choose','over','atop', 'div','star','ast','circ','bullet', 'forall','exists','land','lor','neg','iff','implies', 'leq','geq','prec','succ','subseteq','supseteq', 'partial','nabla','degree','prime', 'oplus','ominus','otimes','odot', 'mathring','space','phantom','vphantom', 'overset','underset','stackrel', 'color','textcolor','rgb','href', 'rule','kern','mskip','hspace','vspace', 'tag','label','ref', 'lvert','rvert','lVert','rVert','vert','Vert','|', 'oint','iint','iiint', 'because','therefore', 'leftrightarrow','Leftarrow','longleftarrow','longrightarrow', 'mapsto','hookrightarrow', ]); const EMOJI_CHARS = ['✓','✗','⚠','🔥','📐','✅','❌','🎯','🔴','🟢','🟡','📊','📈','📉','🎓','📚','🧮','🔬','🌟','⭐','💡','🚀','🎉','📝','📖','🗒']; const AUTHOR_NAMES = ['Латотин','Чеботаревский','Горбунова','Цыбулько','Шлыков','Подгорная']; function scanFile(rel) { const fp = path.join(ROOT, rel); const src = fs.readFileSync(fp, 'utf8'); const out = { file: rel, katex: [], optionsKatex: [], emoji: [], authors: [], pixels: [], g3d: {} }; // 1. KaTeX ошибки: ищем backslash перед буквой (одиночный) в JS template literals и в HTML // Анализируем строчно const lines = src.split(/\r?\n/); // Regex: одиночный \ перед 2+ буквами, не предшествуемый \ const reSingle = /(? и вне let inScript = false; for (let i = 0; i < lines.length; i++) { const line = lines[i]; if (/)/i.test(line)) inScript = true; // Сначала проверим текущую строку // Внутри