index.js
3.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/**
* @author Matthew Caruana Galizia <m@m.cg>
* @license MIT: http://mattcg.mit-license.org/
* @copyright Copyright (c) 2013, Matthew Caruana Galizia
*/
/*jshint node:true*/
'use strict';
var Tag = require('./Tag');
var Subtag = require('./Subtag');
var index = require('language-subtag-registry/data/json/index');
var registry = require('language-subtag-registry/data/json/registry');
var tags = function(tag) {
return new Tag(tag);
};
module.exports = tags;
tags.check = function(tag) {
return new Tag(tag).valid();
};
tags.types = function(subtag) {
var types = index[subtag];
if (!types) {
return [];
}
return Object.keys(types).filter(function(type) {
return type !== 'grandfathered' && type !== 'redundant';
});
};
tags.subtags = function(subtags) {
var result = [];
if (!Array.isArray(subtags)) {
subtags = [subtags];
}
subtags.forEach(function(subtag) {
tags.types(subtag).forEach(function(type) {
result.push(new Subtag(subtag, type));
});
});
return result;
};
tags.filter = function(subtags) {
return subtags.filter(function(subtag) {
return !tags.types(subtag).length;
});
};
tags.search = function(query, all) {
var test;
if ('function' === typeof query.test) {
test = function(description) {
return query.test(description);
};
// If the query is all lowercase, make a case-insensitive match.
} else if (query.toLowerCase() === query) {
test = function(description) {
return -1 !== description.toLowerCase().indexOf(query);
};
} else {
test = function(description) {
return -1 !== description.indexOf(query);
};
}
return registry.filter(function(record) {
if (!record.Subtag && !all) {
return false;
}
return record.Description.some(test);
// Sort by matched description string length.
// This is a quick way to push precise matches towards the top.
}).sort(function(a, b) {
return Math.min.apply(Math, a.Description.filter(test).map(function(description) {
return description.length;
})) - Math.min.apply(Math, b.Description.filter(test).map(function(description) {
return description.length;
}));
}).map(function(record) {
if (record.Subtag) {
return new Subtag(record.Subtag, record.Type);
}
return new Tag(record.Tag);
});
};
tags.languages = function(macrolanguage) {
var i, l, record, results = [];
macrolanguage = macrolanguage.toLowerCase();
if (!require('language-subtag-registry/data/json/macrolanguage')[macrolanguage]) {
throw new Error('\'' + macrolanguage + '\' is not a macrolanguage.');
}
for (i = 0, l = registry.length; i < l; i++) {
record = registry[i];
if (record.Macrolanguage === macrolanguage) {
results.push(new Subtag(record.Subtag, record.Type));
}
}
return results;
};
tags.language = function(subtag) {
return tags.type(subtag, 'language');
};
tags.region = function(subtag) {
return tags.type(subtag, 'region');
};
tags.type = function(subtag, type) {
var types = index[subtag.toLowerCase()];
if (types && types[type]) {
return new Subtag(subtag, type);
}
return null;
};
tags.date = function() {
return require('language-subtag-registry/data/json/meta')['File-Date'];
};