最後活躍 1 month ago

Javascript Stepmania SSC File Parser

修訂 efe7d887127086ffb3c1910085a071781862d747

sscparser.js 原始檔案
1var fs = require('fs');
2
3function StripComments(data) {
4 return data.replace(/(?:\/\*(?:[\s\S]*?)\*\/)|(?:([\s])+\/\/(?:.*)$)/gm, '$1');
5}
6
7function 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
16function 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
26function 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
79fs.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});