hexo/node_modules/hexo-theme-fluid/scripts/events/lib/lazyload.js

51 lines
1.5 KiB
JavaScript

'use strict';
const urlJoin = require('../../utils/url-join');
module.exports = (hexo) => {
const config = hexo.theme.config;
const loadingImage = urlJoin(hexo.config.root, config.lazyload.loading_img
|| urlJoin(config.static_prefix.internal_img, 'loading.gif'));
if (!config.lazyload || !config.lazyload.enable || !loadingImage) {
return;
}
if (config.lazyload.onlypost) {
hexo.extend.filter.register('after_post_render', (page) => {
if (page.layout !== 'post' && !page.lazyload) {
return;
}
if (page.lazyload !== false) {
page.content = lazyImages(page.content, loadingImage);
page.content = lazyComments(page.content);
}
return page;
});
} else {
hexo.extend.filter.register('after_render:html', (html, data) => {
if (!data.page || data.page.lazyload !== false) {
html = lazyImages(html, loadingImage);
html = lazyComments(html);
return html;
}
});
}
};
const lazyImages = (htmlContent, loadingImage) => {
return htmlContent.replace(/<img[^>]+?src=(".*?")[^>]*?>/gims, (str, p1) => {
if (/lazyload/i.test(str)) {
return str;
}
return str.replace(p1, `${p1} srcset="${loadingImage}" lazyload`);
});
};
const lazyComments = (htmlContent) => {
return htmlContent.replace(/<[^>]+?id="comments"[^>]*?>/gims, (str) => {
if (/lazyload/i.test(str)) {
return str;
}
return str.replace('id="comments"', 'id="comments" lazyload');
});
};