astro-ghostcms/.pnpm-store/v3/files/5a/55e1f69d69036f6e7960d61a44f...

116 lines
3.3 KiB
Plaintext
Raw Normal View History

2024-02-14 14:10:47 +00:00
/**
* @author Matthew Caruana Galizia <mattcg@gmail.com>
* @license MIT: http://mattcg.mit-license.org/
* @copyright Copyright (c) 2013, Matthew Caruana Galizia
*/
'use strict';
var Tag = require('./Tag.js');
var Subtag = require('./Subtag.js');
var index = require('language-subtag-registry/data/json/index.json');
var registry = require('language-subtag-registry/data/json/registry.json');
var tags = function tags(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.toLowerCase()];
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 test(description) {
return query.test(description);
};
// If the query is all lowercase, make a case-insensitive match.
} else if (query.toLowerCase() === query) {
test = function test(description) {
return -1 !== description.toLowerCase().indexOf(query);
};
} else {
test = function test(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.json')[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.json')['File-Date'];
};