92 lines
3.6 KiB
JavaScript
92 lines
3.6 KiB
JavaScript
/**
|
|
* CDN static file resolvers.
|
|
*
|
|
* @example
|
|
* <%- cdn(package, version, filename) %>
|
|
* <%- fontcdn(fontName) %>
|
|
* <%- iconcdn() %>
|
|
*/
|
|
const cdn_providers = {
|
|
cdnjs: 'https://cdnjs.cloudflare.com/ajax/libs/${ package }/${ version }/${ filename }',
|
|
jsdelivr: 'https://cdn.jsdelivr.net/npm/${ package }@${ version }/${ filename }',
|
|
unpkg: 'https://unpkg.com/${ package }@${ version }/${ filename }'
|
|
};
|
|
|
|
const font_providers = {
|
|
google: 'https://fonts.googleapis.com/${ type }?family=${ fontname }'
|
|
};
|
|
|
|
const icon_providers = {
|
|
fontawesome: 'https://use.fontawesome.com/releases/v5.4.1/css/all.css'
|
|
};
|
|
|
|
module.exports = function(hexo) {
|
|
hexo.extend.helper.register('cdn', function(_package, version, filename) {
|
|
let provider = this.config.provider && 'cdn' in this.config.provider ? this.config.provider.cdn : 'jsdelivr';
|
|
|
|
// cdn.js does not follow a GitHub npm style like jsdeliver and unpkg do. Patch it!
|
|
if (provider === 'cdnjs' || provider.startsWith('[cdnjs]')) {
|
|
if (provider.startsWith('[cdnjs]')) {
|
|
provider = provider.substr(7);
|
|
}
|
|
if (filename.startsWith('dist/')) {
|
|
filename = filename.substr(5);
|
|
}
|
|
if (_package === 'moment') {
|
|
_package = 'moment.js';
|
|
filename = filename.startsWith('min/') ? filename.substr(4) : filename;
|
|
}
|
|
if (_package === 'outdatedbrowser') {
|
|
_package = 'outdated-browser';
|
|
filename = filename.startsWith('outdatedbrowser/') ? filename.substr(16) : filename;
|
|
}
|
|
if (_package === 'highlight.js') {
|
|
filename = filename.endsWith('.css') && filename.indexOf('.min.') === -1
|
|
? filename.substr(0, filename.length - 4) + '.min.css' : filename;
|
|
}
|
|
if (_package === 'mathjax') {
|
|
filename = filename.startsWith('unpacked/') ? filename.substr(9) : filename;
|
|
}
|
|
if (_package === 'pace-js') {
|
|
_package = 'pace';
|
|
}
|
|
if (_package === 'clipboard') {
|
|
_package = 'clipboard.js';
|
|
}
|
|
if (_package === 'disqusjs') {
|
|
provider = 'jsdelivr';
|
|
}
|
|
if (_package === 'katex') {
|
|
_package = 'KaTeX.js';
|
|
}
|
|
}
|
|
if (provider !== null && provider in cdn_providers) {
|
|
provider = cdn_providers[provider];
|
|
}
|
|
return provider.replace(/\${\s*package\s*}/gi, _package)
|
|
.replace(/\${\s*version\s*}/gi, version)
|
|
.replace(/\${\s*filename\s*}/gi, filename);
|
|
});
|
|
|
|
hexo.extend.helper.register('fontcdn', function(fontName, type = 'css') {
|
|
let provider = this.config.provider && 'fontcdn' in this.config.provider ? this.config.provider.fontcdn : 'google';
|
|
if (provider !== null && provider in font_providers) {
|
|
provider = font_providers[provider];
|
|
}
|
|
return provider.replace(/\${\s*fontname\s*}/gi, fontName)
|
|
.replace(/\${\s*type\s*}/gi, type);
|
|
});
|
|
|
|
hexo.extend.helper.register('iconcdn', function(provider = null) {
|
|
if (provider !== null && provider in icon_providers) {
|
|
provider = icon_providers[provider];
|
|
} else {
|
|
provider = this.config.provider && 'iconcdn' in this.config.provider ? this.config.provider.iconcdn : 'fontawesome';
|
|
if (provider !== null && provider in icon_providers) {
|
|
provider = icon_providers[provider];
|
|
}
|
|
}
|
|
return provider;
|
|
});
|
|
};
|