aboutsummaryrefslogtreecommitdiff
path: root/node_modules/prismjs/components/index.js
blob: fe5940ae1ca09ffac0513af5ab16b65f6c6ad22d (plain)
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
var components = require('../components.js');
var peerDependentsMap = null;

function getPeerDependentsMap() {
	var peerDependentsMap = {};
	Object.keys(components.languages).forEach(function (language) {
		if (language === 'meta') {
			return false;
		}
		if (components.languages[language].peerDependencies) {
			var peerDependencies = components.languages[language].peerDependencies;
			if (!Array.isArray(peerDependencies)) {
				peerDependencies = [peerDependencies];
			}
			peerDependencies.forEach(function (peerDependency) {
				if (!peerDependentsMap[peerDependency]) {
					peerDependentsMap[peerDependency] = [];
				}
				peerDependentsMap[peerDependency].push(language);
			});
		}
	});
	return peerDependentsMap;
}

function getPeerDependents(mainLanguage) {
	if (!peerDependentsMap) {
		peerDependentsMap = getPeerDependentsMap();
	}
	return peerDependentsMap[mainLanguage] || [];
}

function loadLanguages(arr, withoutDependencies) {
	// If no argument is passed, load all components
	if (!arr) {
		arr = Object.keys(components.languages).filter(function (language) {
			return language !== 'meta';
		});
	}
	if (arr && !arr.length) {
		return;
	}

	if (!Array.isArray(arr)) {
		arr = [arr];
	}

	arr.forEach(function (language) {
		if (!components.languages[language]) {
			console.warn('Language does not exist ' + language);
			return;
		}
		// Load dependencies first
		if (!withoutDependencies && components.languages[language].require) {
			loadLanguages(components.languages[language].require);
		}

		var pathToLanguage = './prism-' + language;
		delete require.cache[require.resolve(pathToLanguage)];
		delete Prism.languages[language];
		require(pathToLanguage);

		// Reload dependents
		var dependents = getPeerDependents(language).filter(function (dependent) {
			// If dependent language was already loaded,
			// we want to reload it.
			if (Prism.languages[dependent]) {
				delete Prism.languages[dependent];
				return true;
			}
			return false;
		});
		if (dependents.length) {
			loadLanguages(dependents, true);
		}
	});
}

module.exports = function (arr) {
	// Don't expose withoutDependencies
	loadLanguages(arr);
};