// UTF-16 (LE BOM) /*global Enumerator, WScript */ // This script lists BMSes that exceed the specified number of BGM lines. // Requirements: // - Windows XP or later (Windows 95/98/ME is not supported) // - Windows Script Host 5.7 or later // (Windows 2000 or WSH 5.6 doesn't seem to handle ADODB.stream well) // wsh_count_bgm_lines.js: https://hitkey.bms.ms/diary2011.php#D201104 // * 2020-11-06: v0.0.2 (excluded #RANDOMs) // * 2020-11-04: v0.0.1 // Config Start ============================================================== var LIMIT_BGM_LINES_PER_MEASURE = -1; // Unlimited: -1, BMSC: 28, BMSE: 32 var TARGET_FOLDER = "D:/bms/THE BMS OF FIGHTERS XVI -NEO DYSTOPIA-"; // Config End ================================================================ (function (ws) { "use strict"; if (!ws || !Enumerator || parseFloat(ws.Version) < 5.7) { ws.echo("This script requires Windows Script Host 5.7 or later."); ws.quit(1); } var shell = null; var fso = null; (function () { shell = ws.createObject("WScript.Shell"); fso = ws.createObject("Scripting.FileSystemObject"); }()); if (shell.environment("Process").item("OS").indexOf("Windows_NT") < 0) { ws.echo("This script requires Windows XP or later."); ws.quit(1); } // Scolded by JSlint ( Use x===undefined ), but uncorrectable on WSH if (typeof TARGET_FOLDER === "undefined") { ws.echo("Specify TARGET_FOLDER variable on this JScript."); ws.quit(1); } if (typeof LIMIT_BGM_LINES_PER_MEASURE === "undefined") { ws.echo( "Specify LIMIT_BGM_LINES_PER_MEASURE variable on this JScript." ); ws.quit(1); } if (typeof LIMIT_BGM_LINES_PER_MEASURE !== "number") { ws.echo( "Specify an integer value for " + "LIMIT_BGM_LINES_PER_MEASURE variable on this JScript." ); ws.quit(1); } LIMIT_BGM_LINES_PER_MEASURE = parseInt(LIMIT_BGM_LINES_PER_MEASURE, 10); if (!TARGET_FOLDER) { ws.echo("Specify TARGET_FOLDER on this JScript."); ws.quit(1); } if (fso.fileExists(TARGET_FOLDER)) { ws.echo("Specify Target-directory on this JScript."); ws.quit(1); } if (!fso.folderExists(TARGET_FOLDER)) { ws.echo("Specified Target-directory is not found."); ws.quit(1); } var doneWait = function () { if (/CSCRIPT\.EXE$/.test(ws.FullName.toUpperCase())) { var dummyPauser = ws.StdIn.readLine(); ws.echo(dummyPauser.replace(dummyPauser, "")); } }; var runInCscript = function () { if (/CSCRIPT\.EXE$/.test(ws.FullName.toUpperCase())) { return; } var cmd = "CSCRIPT.EXE //NoLogo //E:JScript "; var curScr = ws.ScriptFullName; var aargs = ws.Arguments; var aarg; var al = aargs.length; var ai = 0; var ar; var ashell; var WINDOW_ACTIVIZE = 5; var WAIT_ON_RETURN = true; if (curScr.indexOf(" ") > -1) { curScr = "\"" + curScr + "\""; } cmd += curScr; while (ai < al) { aarg = aargs.item(ai); if (aarg.indexOf(" ") > -1) { aarg = "\"" + aarg + "\""; } cmd += " " + aarg; ai += 1; } ashell = ws.createObject("WScript.Shell"); ar = ashell.run(cmd, WINDOW_ACTIVIZE, WAIT_ON_RETURN); ws.quit(ar); }; runInCscript(); ws.echo("wsh_count_bgm_lines.js: Now working ..."); TARGET_FOLDER = fso.getFolder(TARGET_FOLDER).path; var enumFiles = function (target) { // exclude MacOS resource-forks var chart = /^[^.\\][\u0020-\[\]-\uFFFD]*\.(?:bms|bme|bml|pms)$/i; if (fso.fileExists(target) && chart.test(fso.getFileName(target))) { return [target]; } if (!fso.folderExists(target)) { return []; } var targets = []; var dir = fso.getFolder(target); var e = new Enumerator(dir.Files); var chartFile; var r; var n; while (!e.atEnd()) { chartFile = e.item(); n = fso.getFileName(chartFile); if (chart.test(n)) { targets.push(chartFile.path); } e.moveNext(); } e = new Enumerator(dir.SubFolders); while (!e.atEnd()) { r = enumFiles(e.item()); targets = targets.concat(r); e.moveNext(); } return targets; }; var chartsFrom = enumFiles(TARGET_FOLDER); if (!chartsFrom.length) { ws.echo("Chart is not exist."); doneWait(); ws.quit(1); } var binToHex = function (binStr) { var xmldom = ws.createObject("Microsoft.XMLDOM"); var binObj = xmldom.createElement("binObj"); binObj.dataType = "bin.hex"; binObj.nodeTypedValue = binStr; return String(binObj.text); }; var readText = function (fname, charset) { if (!fso.fileExists(fname)) { return ["Invalid", "US-ASCII"]; // removed after JScript running } if (fso.getFile(fname).size < 4) { return ["Invalid", "US-ASCII"]; } var adTypeBinary = 1; var adTypeText = 2; var adReadAll = -1; var s = ws.createObject("ADODB.Stream"); var bytes; var strBOM; var chartText; s.Type = adTypeBinary; s.open(); s.loadFromFile(fname); bytes = s.read(4); strBOM = binToHex(bytes); if (strBOM.indexOf("efbbbf") === 0) { charset = "UTF-8"; } else if (strBOM === "0000feff" || strBOM === "fffe0000") { charset = "UTF-32"; } else if (strBOM === "84319533") { charset = "GB18030"; } else if (strBOM.indexOf("feff") === 0) { // UTF-16BE charset = "UTF-16"; } else if (strBOM.indexOf("fffe") === 0) { // UTF-16LE charset = "UnicodeFFFE"; } else { charset = "_autodetect_all"; } s.close(); if (charset !== "UTF-32") { s.Type = adTypeText; s.charset = charset; // Windows2000: ?? s.open(); s.loadFromFile(fname); chartText = s.readText(adReadAll); s.close(); } else { chartText = "UTF-32 is not supported."; } s = null; return chartText; }; ws.echo("\r\n"); var getMaxBgmLinesCount = function (alltext) { // Windows XP requires String(args)? // lines = alltext.split(/\r\n|\r|\n/) is not effective on Windows XP. var lines = String(alltext).replace(/\r\n|\r/g, "\n").split("\n"); var i = 0; var l = lines.length; var isRandom = /^[\s\u00A0\u3000\uFEFF]*#(?:random|endif|if)/i; var isBgmData = /^[\s\u00A0\u3000\uFEFF]*#(\d\d\d)01[:\s\u00A0\u3000\uFEFF](?:[0-9A-Za-z]+)$/; var bgm; var bars = {}; var num; var max = 0; while (i < l) { if (isRandom.test(lines[i])) { return "?"; } bgm = isBgmData.exec(lines[i]); if (bgm !== null) { num = bgm[1]; if (!bars[num]) { bars[num] = 0; } bars[num] += 1; if (bars[num] > max) { max = bars[num]; } } i += 1; } return max; }; var getExceededCharts = function () { var i = 0; var l = chartsFrom.length; var bms; var txt; var overs = []; var max; while (i < l) { bms = chartsFrom[i]; txt = readText(bms); max = getMaxBgmLinesCount(txt); if (max === "?" || max > LIMIT_BGM_LINES_PER_MEASURE) { overs.push("[" + max + "] " + chartsFrom[i]); } i += 1; } return overs; }; var exceededCharts = getExceededCharts(); if (!exceededCharts.length) { ws.echo("Exceeded Chart is not exist."); doneWait(); ws.quit(1); } ws.echo( "[max BGM lines] (over " + LIMIT_BGM_LINES_PER_MEASURE + " BGM lines per measure) - BMS path\r\n" ); while (exceededCharts.length) { ws.echo(exceededCharts.pop()); } ws.echo("\r\nDone."); doneWait(); ws.quit(1); }(WScript));