Я уже много лет пользуюсь генератором статических сайтов Hexo. За это
время написал для собственного удобства несколько tag plugins (аналог
shortcodes в генераторе hugo).
Написаны они коряво и подходят для очень ограниченных или специфических
условий, поэтому публиковать как готовый продукт я не стал.
hexo.extend.tag.register('prompt', function(args, content){ args.unshift('prompt'); // make first argument args[1] not args[0] var name='user'; var dir=''; var symbol='$'; var prefix=''; var promptclass = 'promptuser'; if (args.length > 1) { name = args[1]; dir = args[2]+' '; symbol = args[3]; } if (typeof args[1] !=='undefined' && args[1].indexOf('root') >-1 || args[1]=='livecd') { promptclass = 'promptroot'; } if (args[2]=='0' || typeof args[2] == 'undefined') { dir = ''; } if (args[3]=='0' || typeof args[3] == 'undefined') { symbol = ''; } if (typeof args[4] !== 'undefined') { prefix = args[4] + ' '; }
var lines = content.split(/\r\n|\r|\n/).length+1 var gutter=''; var i=1; for (i=1; i<lines; i++) { gutter += prefix+"<span class='"+promptclass+"'>"+name+"</span> <span class='promptdir'>" + dir + symbol + "</span><br>" }
Тэг-плагин для создания плиток из картинок с помощью js-библиотеки
justifiedgallery. Каждую картинку в плитке делает ссылкой, открывающей
крупный вариант, другая js-библиотека magnificpopup.
Я размещаю картинки для конкретной записи по адресу
lisakov.com/images/post/, а их маленькие версии по адресу
lisakov.com/images/post/thumbs/. Есть возможность указать thumbs_dir явно
или поставить thumbs_dir=none, если уменьшенных изображений нет.
С некоторых пор я стал пользоваться этим же тэгом для одиночных фотографий,
подгружая только magnificPopup без justifiedgallery.
/** * jg tag by lisakov.com * * Examples jg * * {% jg img_path=https://lisakov.com/images/ thumbs_dir=800 thumbs_dir2=2000 lastonly=true %} * imagename1.jpg * imagename2.jpg "Title with description for imagename2" * {% endjg %} * * Arguments * * path: * path to images (img_path) * default: 'https://lisakov.com/images/' * * thumbs_dir: * path to thumbs (appended to img_path) * default: 'thumbs/' * none: no thumbs, use original images, useful for a single image * * thumbs_dir2: * path to medium thumbs (appended to img_path) * default: '800/' * if lastonly=true, last element gets * * lastonly: * <bool> (if true, use larger thumbs or original only for the last item) * default: false * use img_path + 'thumbs/' for every image except for the last, * last will be img_path + thumbs (equals to anything, if thumbs=undefined, use original) * */
hexo.extend.tag.register('jg', function(args, content){ // set defaults var img_path = 'https://lisakov.com/images/'; var thumbs_dir = 'thumbs/'; var thumbs_dir2 = '800/'; var lastonly = 'false'; // read arguments and replace defaults if needed args.forEach((el, idx) => { if (el.includes('img_path=')) { img_path = el.replace('img_path=',''); } if (el.includes('lastonly=')) { lastonly = el.replace('lastonly=',''); } if (el.includes('thumbs_dir=')) { thumbs_dir = el.replace('thumbs_dir=',''); thumbs_dir += thumbs_dir.endsWith("/") ? "" : "/"//add trailing slash if not present if (thumbs_dir.includes('none')) { thumbs_dir=''; } } if (el.includes('thumbs_dir2=')) { thumbs_dir2 = el.replace('thumbs_dir2=',''); thumbs_dir2 += thumbs_dir2.endsWith("/") ? "" : "/"//add trailing slash if not present if (thumbs_dir2.includes('none')) { thumbs_dir2 = ''; } } });
// Перебираем все строки var lines = content.split(/\r\n|\r|\n/); lines.forEach((element, index, array) => { // Если нет lastonly=true if (lastonly === 'false') { // Если в строке только imgname без title if (lines[index].indexOf('"') === -1) { lines[index] = '<a href=" ' + img_path + element + '"><img src="' + img_path + thumbs_dir + element + '"/></a>'; // Если в строке imgname + "title" } else { var title = lines[index].match(/"([^']+)"/)[1]; var img_name = lines[index].split(' ')[0]; lines[index] = '<a href=" ' + img_path + img_name + '"' + 'title="' + title + '"><img src="' + img_path + thumbs_dir + img_name + '"/></a>'; } // Если lastonly=true } else {
// Если элемент ПОСЛЕДНИЙ if (index === array.length - 1) { // Если в строке только imgname без title if (lines[index].indexOf('"') === -1) { lines[index] = '<a href=" ' + img_path + element + '"><img src="' + img_path + thumbs_dir2 + element + '"/></a>'; // Если в строке imgname + "title" } else { var title = lines[index].match(/"([^']+)"/)[1]; var img_name = lines[index].split(' ')[0]; lines[index] = '<a href=" ' + img_path + img_name + '"' + 'title="' + title + '"><img src="' + img_path + thumbs_dir2 + img_name + '"/></a>'; }
// Если элемент НЕ последний } else { // Если в строке только imgname без title if (lines[index].indexOf('"') === -1) { lines[index] = '<a href=" ' + img_path + element + '"><img src="' + img_path + thumbs_dir + element + '"/></a>'; // Если в строке imgname + "title" } else { var title = lines[index].match(/"([^']+)"/)[1]; var img_name = lines[index].split(' ')[0]; lines[index] = '<a href=" ' + img_path + img_name + '"' + 'title="' + title + '"><img src="' + img_path + thumbs_dir + img_name + '"/></a>'; } }
<script> $('.jg').magnificPopup({ delegate: 'a', type: 'image', verticalFit: true, gallery: { enabled:true } }); $(document).ready(function() { $('.popup-with-zoom-anim').magnificPopup({ type: 'inline', fixedContentPos: false, fixedBgPos: true, overflowY: 'auto', closeBtnInside: true, preloader: false, gallery: { enabled: true, navigateByImgClick: true, preload: [0,1] // Will preload 0 - before current, and 1 after the current image }, midClick: true, removalDelay: 300, mainClass: 'my-mfp-zoom-in' }); }); </script>
Разумеется, все, что внутри тегов <script>, удобно подгружать по
указаниям justifiedgallery: <left/center/right/justify/nojustify> и
magnificpopup: true во front-matter,
настроив файлы themes/themename/layout/_partial/head.ejs и
after_footer.ejs таким образом:
Иногда оставляю неоформленные мысли в markdown файлах. Удалить жалко, но
хранить отдельно не хочется. Все, что будет внутри этого тэга, генератор
проигнорирует.
1 2 3 4 5 6 7 8 9 10 11 12 13
'use strict';
/** * Comment tag by lisakov.com * * {% comment %} * Text here won't be rendered * {% endcomment %} * */