This app provides monitoring and information features for the common freifunk user and the technical stuff of a freifunk community.
Code base is taken from a TUM Practical Course project and added here to see if Freifunk Altdorf can use it.
https://www.freifunk-altdorf.de
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
2.5 KiB
117 lines
2.5 KiB
|
|
var fs = require('fs'); |
|
|
|
var utf8 = require('./encoding/utf8'), |
|
unicode = require('./encoding/unicode'), |
|
mbcs = require('./encoding/mbcs'), |
|
sbcs = require('./encoding/sbcs'), |
|
iso2022 = require('./encoding/iso2022'); |
|
|
|
var self = this; |
|
|
|
var recognisers = [ |
|
new utf8, |
|
new unicode.UTF_16BE, |
|
new unicode.UTF_16LE, |
|
new unicode.UTF_32BE, |
|
new unicode.UTF_32LE, |
|
new mbcs.sjis, |
|
new mbcs.big5, |
|
new mbcs.euc_jp, |
|
new mbcs.euc_kr, |
|
new mbcs.gb_18030, |
|
new iso2022.ISO_2022_JP, |
|
new iso2022.ISO_2022_KR, |
|
new iso2022.ISO_2022_CN, |
|
new sbcs.ISO_8859_1, |
|
new sbcs.ISO_8859_2, |
|
new sbcs.ISO_8859_5, |
|
new sbcs.ISO_8859_6, |
|
new sbcs.ISO_8859_7, |
|
new sbcs.ISO_8859_8, |
|
new sbcs.ISO_8859_9, |
|
new sbcs.windows_1251, |
|
new sbcs.windows_1256, |
|
new sbcs.KOI8_R |
|
]; |
|
|
|
module.exports.detect = function(buffer) { |
|
|
|
// Tally up the byte occurence statistics. |
|
var fByteStats = []; |
|
for (var i = 0; i < 256; i++) |
|
fByteStats[i] = 0; |
|
|
|
for (var i = buffer.length - 1; i >= 0; i--) |
|
fByteStats[buffer[i] & 0x00ff]++; |
|
|
|
var fC1Bytes = false; |
|
for (var i = 0x80; i <= 0x9F; i += 1) { |
|
if (fByteStats[i] != 0) { |
|
fC1Bytes = true; |
|
break; |
|
} |
|
} |
|
|
|
var context = { |
|
fByteStats: fByteStats, |
|
fC1Bytes: fC1Bytes, |
|
fRawInput: buffer, |
|
fRawLength: buffer.length, |
|
fInputBytes: buffer, |
|
fInputLen: buffer.length |
|
}; |
|
|
|
var match = recognisers.map(function(rec) { |
|
return rec.match(context); |
|
}).filter(function(match) { |
|
return !!match; |
|
}).sort(function(a, b) { |
|
return a.confidence - b.confidence; |
|
}).pop(); |
|
|
|
return match ? match.name : null; |
|
}; |
|
|
|
module.exports.detectFile = function(filepath, opts, cb) { |
|
if (typeof opts === 'function') { |
|
cb = opts; |
|
opts = undefined; |
|
} |
|
|
|
var fd; |
|
|
|
var handler = function(err, buffer) { |
|
if (fd) { |
|
fs.closeSync(fd); |
|
} |
|
|
|
if (err) return cb(err, null); |
|
cb(null, self.detect(buffer)); |
|
}; |
|
|
|
if (opts && opts.sampleSize) { |
|
fd = fs.openSync(filepath, 'r'), |
|
sample = new Buffer(opts.sampleSize); |
|
|
|
fs.read(fd, sample, 0, opts.sampleSize, null, function(err) { |
|
handler(err, sample); |
|
}); |
|
return; |
|
} |
|
|
|
fs.readFile(filepath, handler); |
|
}; |
|
|
|
module.exports.detectFileSync = function(filepath, opts) { |
|
if (opts && opts.sampleSize) { |
|
var fd = fs.openSync(filepath, 'r'), |
|
sample = new Buffer(opts.sampleSize); |
|
|
|
fs.readSync(fd, sample, 0, opts.sampleSize); |
|
fs.closeSync(fd); |
|
return self.detect(sample); |
|
} |
|
|
|
return self.detect(fs.readFileSync(filepath)); |
|
};
|
|
|