sscparser.js
· 3.2 KiB · JavaScript
Ham
var fs = require('fs');
function StripComments(data) {
return data.replace(/(?:\/\*(?:[\s\S]*?)\*\/)|(?:([\s])+\/\/(?:.*)$)/gm, '$1');
}
function CleanLines(data) {
if(data instanceof Array) {
for(var n in data)
data[n] = data[n].trim();
return data.filter(function(n){ return n != '' });
}else
return data.trim();
}
function LineObject(data) {
if(data instanceof Array) {
for(var n in data) {
data[n] = LineObject(data[n]);
}
return data.filter(function(n){ return n != '' });
}else
return CleanLines(data.split("\n"));
}
function ParseSSCLines(data) {
var reg = /\#([\s\S]*?)\;/g;
var songdata = {
"charts" : []
};
var chart = -1;
var match;
while (match = reg.exec(data)) {
var variable = match[1].split(":",1)[0];
var content = match[1].replace(variable+":","");
variable = variable.trim();
if(variable == "NOTEDATA") {
chart += 1;
songdata["charts"][chart] = {};
}else{
if(chart > -1) { // Looking for chart data
switch(variable) {
case "NOTES" : songdata["charts"][chart][variable] = LineObject(content.split(",")); break;
case "BPMS" :
case "STOPS" :
case "DELAYS" :
case "WARPS" :
case "TIMESIGNATURES" :
case "TICKCOUNTS" :
case "COMBOS" :
case "SPEEDS" :
case "LABELS" :
case "SCROLLS" : songdata["charts"][chart][variable] = CleanLines(content.split(",")); break;
default : songdata["charts"][chart][variable] = CleanLines(content);
}
}else{ // Looking for song data
switch(variable) {
case "BPMS" :
case "STOPS" :
case "DELAYS" :
case "WARPS" :
case "TIMESIGNATURES" :
case "TICKCOUNTS" :
case "COMBOS" :
case "SPEEDS" :
case "LABELS" :
case "BGCHANGES" :
case "SCROLLS" : songdata[variable] = CleanLines(content.split(",")); break;
default : songdata[variable] = CleanLines(content);
}
}
}
}
return songdata;
}
fs.readFile('000.ssc', function (err, data) {
if (err) throw err;
data = data.toString();
data = StripComments(data);
var song = ParseSSCLines(data);
console.log(song);
});
| 1 | var fs = require('fs'); |
| 2 | |
| 3 | function StripComments(data) { |
| 4 | return data.replace(/(?:\/\*(?:[\s\S]*?)\*\/)|(?:([\s])+\/\/(?:.*)$)/gm, '$1'); |
| 5 | } |
| 6 | |
| 7 | function CleanLines(data) { |
| 8 | if(data instanceof Array) { |
| 9 | for(var n in data) |
| 10 | data[n] = data[n].trim(); |
| 11 | return data.filter(function(n){ return n != '' }); |
| 12 | }else |
| 13 | return data.trim(); |
| 14 | } |
| 15 | |
| 16 | function LineObject(data) { |
| 17 | if(data instanceof Array) { |
| 18 | for(var n in data) { |
| 19 | data[n] = LineObject(data[n]); |
| 20 | } |
| 21 | return data.filter(function(n){ return n != '' }); |
| 22 | }else |
| 23 | return CleanLines(data.split("\n")); |
| 24 | } |
| 25 | |
| 26 | function ParseSSCLines(data) { |
| 27 | var reg = /\#([\s\S]*?)\;/g; |
| 28 | var songdata = { |
| 29 | "charts" : [] |
| 30 | }; |
| 31 | var chart = -1; |
| 32 | |
| 33 | var match; |
| 34 | while (match = reg.exec(data)) { |
| 35 | var variable = match[1].split(":",1)[0]; |
| 36 | var content = match[1].replace(variable+":",""); |
| 37 | variable = variable.trim(); |
| 38 | if(variable == "NOTEDATA") { |
| 39 | chart += 1; |
| 40 | songdata["charts"][chart] = {}; |
| 41 | }else{ |
| 42 | if(chart > -1) { // Looking for chart data |
| 43 | switch(variable) { |
| 44 | case "NOTES" : songdata["charts"][chart][variable] = LineObject(content.split(",")); break; |
| 45 | case "BPMS" : |
| 46 | case "STOPS" : |
| 47 | case "DELAYS" : |
| 48 | case "WARPS" : |
| 49 | case "TIMESIGNATURES" : |
| 50 | case "TICKCOUNTS" : |
| 51 | case "COMBOS" : |
| 52 | case "SPEEDS" : |
| 53 | case "LABELS" : |
| 54 | case "SCROLLS" : songdata["charts"][chart][variable] = CleanLines(content.split(",")); break; |
| 55 | default : songdata["charts"][chart][variable] = CleanLines(content); |
| 56 | } |
| 57 | }else{ // Looking for song data |
| 58 | switch(variable) { |
| 59 | case "BPMS" : |
| 60 | case "STOPS" : |
| 61 | case "DELAYS" : |
| 62 | case "WARPS" : |
| 63 | case "TIMESIGNATURES" : |
| 64 | case "TICKCOUNTS" : |
| 65 | case "COMBOS" : |
| 66 | case "SPEEDS" : |
| 67 | case "LABELS" : |
| 68 | case "BGCHANGES" : |
| 69 | case "SCROLLS" : songdata[variable] = CleanLines(content.split(",")); break; |
| 70 | default : songdata[variable] = CleanLines(content); |
| 71 | } |
| 72 | |
| 73 | } |
| 74 | } |
| 75 | } |
| 76 | return songdata; |
| 77 | } |
| 78 | |
| 79 | fs.readFile('000.ssc', function (err, data) { |
| 80 | if (err) throw err; |
| 81 | data = data.toString(); |
| 82 | data = StripComments(data); |
| 83 | var song = ParseSSCLines(data); |
| 84 | console.log(song); |
| 85 | }); |