Sindbad~EG File Manager
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