Sindbad~EG File Manager

Current Path : /home/beeson/public_html/WebMathXpert/
Upload File :
Current File : //home/beeson/public_html/WebMathXpert/checkTooltips.js

const fs = require('fs');
const path = require('path');

// Load TranslateEnterPages.js to extract tooltip entries
const translationsFile = path.join(__dirname, 'TranslateEnterPages.js');
const translationsContent = fs.readFileSync(translationsFile, 'utf8');

// Extract tooltip keys from TranslateEnterPages.js
const tooltipRegex = /"tooltip-([^"]+)"/g;
const tooltipIds = new Set();
let match;
while ((match = tooltipRegex.exec(translationsContent)) !== null) {
    tooltipIds.add(match[1]);
}

function ignore(id) {
	// List of IDs to ignore
	const ignoredIds = new Set([
		"language",
		"display",
		"real_simplify",  // options in EnterSimplify
		"complex_simplify",
		"real_roots",
		"complex_roots",  // options in EnterSolveEquation
		// options in EnterInfiniteSeries,  self-explanatory
		"seriesEval",
		"integraltest",
		"comparisontest",
		"rootorratiotest",
		"addFunctionButton",  // label is explicit enough, no tooltip
		"showaddFunctionButton",
		"nequations",
		// controls from EnterDefiniteIntegral that don't need tooltips:
		"topicReminder",
		"topicReminder<?php echo($topic); ?>",
		"functionRiemannSums",
		"from",
		"shadowfrom",
		"to",
		"shadowto",
		"nintervals",
		"shadownintervals",
		"riemannStyle",
		"styleLeft",
		"styleRight",
		// EnterDerivative.php
		"derivAdvice",
		// controls from EnterLinearEquations.php that don't need tooltips
		"addEquationBtn",
		"showAddFunctionBtn",
		"rowandcolumn",
		"substitution",
		"matrices",
		"gaussJordan",
		"matrixInverse",
		"cramer",
		"interval",   // EnterMaxMin.php
		"factor_quadratics",  // EnterFactor.php
		"advanced_factoring", 
		"selector32", // EnterPowerSeries.php
		"power_series",
		"power_series2",
		"ode2First",   // EnterTwoODEs.php
		"ode2Second",
		"parameterInterval",
		"initialConditions",
    ]);

    // Return true if the ID is in the list, otherwise false
    return ignoredIds.has(id);
}

// Example usage:
console.log(ignore("language")); // true
console.log(ignore("display"));  // true
console.log(ignore("randomID")); // false

// Function to scan PHP files and extract control IDs
function extractControlIdsFromFile(filePath) {
    const content = fs.readFileSync(filePath, 'utf8');
    const idRegex = /id=["']([^"']+)["']/g;
    const controlIds = new Set();
    let match;

    while ((match = idRegex.exec(content)) !== null) {
        const id = match[1];
		  if(ignore(id))
			  continue; 
        // Ignore tooltip elements themselves and exclude certain substrings
        if (
            !id.startsWith('tooltip-') &&
            !id.includes('enter') &&
            !id.includes('Field') &&
            !id.includes('ID') &&
            !id.includes('Id') &&
            !id.includes('Link') &&
            !id.includes('graph') &&
            !id.includes('container') &&
            !id.includes('Title') &&
            !id.includes('Label') &&
			   !id.includes('form') &&
			   !id.includes('Form') &&
			   !id.includes('Container') &&
			   !id.includes('Size') &&  // as in typeSize
			   !id.includes('size') &&
			   !id.includes('alert') &&
			   !id.includes('label') &&
			   !id.includes('Enter') 
        ) {
            controlIds.add(id);
        }
    }

    return controlIds;
}

// Check if a specific PHP file was provided as a command-line argument
const phpFiles = process.argv.length > 2
    ? [path.join(__dirname, process.argv[2])]
    : fs.readdirSync(__dirname).filter(file => file.endsWith('.php')).map(file => path.join(__dirname, file));

const controlIds = new Set();
phpFiles.forEach(file => {
    if (fs.existsSync(file)) {
        extractControlIdsFromFile(file).forEach(id => controlIds.add(id));
    } else {
        console.error(`Error: File "${file}" not found.`);
        process.exit(1);
    }
});

// Find missing tooltips (controls without a tooltip entry)
const missingTooltips = [...controlIds].filter(id => !tooltipIds.has(id));

// Find unused tooltips (entries in TranslateEnterPages.js that have no matching control)
const unusedTooltips = [...tooltipIds].filter(id => !controlIds.has(id));

console.log(`\n--- Checking ${phpFiles.length === 1 ? phpFiles[0] : 'all PHP files'} ---`);

console.log('\n--- Missing Tooltips (Controls without tooltip entries) ---');
console.log(missingTooltips.length ? missingTooltips.join('\n') : '✅ All controls have tooltips!');

console.log('\n--- Unused Tooltips (No matching control in PHP) ---');
console.log(unusedTooltips.length ? unusedTooltips.join('\n') : '✅ No unused tooltips!');

Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists