프로젝트

일반

사용자정보

통계
| 개정판:

root / HServer / 00.Server / 00.Program / node_modules / mime / mime.js

이력 | 보기 | 이력해설 | 다운로드 (2.66 KB)

1 39 HKM
var path = require('path');
2
var fs = require('fs');
3
4
function Mime() {
5
  // Map of extension -> mime type
6
  this.types = Object.create(null);
7
8
  // Map of mime type -> extension
9
  this.extensions = Object.create(null);
10
}
11
12
/**
13
 * Define mimetype -> extension mappings.  Each key is a mime-type that maps
14
 * to an array of extensions associated with the type.  The first extension is
15
 * used as the default extension for the type.
16
 *
17
 * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']});
18
 *
19
 * @param map (Object) type definitions
20
 */
21
Mime.prototype.define = function (map) {
22
  for (var type in map) {
23
    var exts = map[type];
24
    for (var i = 0; i < exts.length; i++) {
25
      if (process.env.DEBUG_MIME && this.types[exts[i]]) {
26
        console.warn((this._loading || "define()").replace(/.*\//, ''), 'changes "' + exts[i] + '" extension type from ' +
27
          this.types[exts[i]] + ' to ' + type);
28
      }
29
30
      this.types[exts[i]] = type;
31
    }
32
33
    // Default extension is the first one we encounter
34
    if (!this.extensions[type]) {
35
      this.extensions[type] = exts[0];
36
    }
37
  }
38
};
39
40
/**
41
 * Load an Apache2-style ".types" file
42
 *
43
 * This may be called multiple times (it's expected).  Where files declare
44
 * overlapping types/extensions, the last file wins.
45
 *
46
 * @param file (String) path of file to load.
47
 */
48
Mime.prototype.load = function(file) {
49
  this._loading = file;
50
  // Read file and split into lines
51
  var map = {},
52
      content = fs.readFileSync(file, 'ascii'),
53
      lines = content.split(/[\r\n]+/);
54
55
  lines.forEach(function(line) {
56
    // Clean up whitespace/comments, and split into fields
57
    var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/);
58
    map[fields.shift()] = fields;
59
  });
60
61
  this.define(map);
62
63
  this._loading = null;
64
};
65
66
/**
67
 * Lookup a mime type based on extension
68
 */
69
Mime.prototype.lookup = function(path, fallback) {
70
  var ext = path.replace(/^.*[\.\/\\]/, '').toLowerCase();
71
72
  return this.types[ext] || fallback || this.default_type;
73
};
74
75
/**
76
 * Return file extension associated with a mime type
77
 */
78
Mime.prototype.extension = function(mimeType) {
79
  var type = mimeType.match(/^\s*([^;\s]*)(?:;|\s|$)/)[1].toLowerCase();
80
  return this.extensions[type];
81
};
82
83
// Default instance
84
var mime = new Mime();
85
86
// Define built-in types
87
mime.define(require('./types.json'));
88
89
// Default type
90
mime.default_type = mime.lookup('bin');
91
92
//
93
// Additional API specific to the default instance
94
//
95
96
mime.Mime = Mime;
97
98
/**
99
 * Lookup a charset based on mime type.
100
 */
101
mime.charsets = {
102
  lookup: function(mimeType, fallback) {
103
    // Assume text types are utf8
104
    return (/^text\/|^application\/(javascript|json)/).test(mimeType) ? 'UTF-8' : fallback;
105
  }
106
};
107
108
module.exports = mime;