Довольно долго я мучился с движком Blogger: хотелось делать в начале длинных статей оглавление со ссылками.
Вручную собирать оглавление, во-первых, хлопотно, во-вторых, у Blogger'а имеется такая странная особенность: для любых внутренних ссылок в документе нужно обязательно прописывать полный URL, иначе при сохранении статьи он автоматически подставляет перед знаком «#» адрес «https://www.blogger.com/blogger.g?blogID=…», и она, конечно, не работает. А указание в ссылке полного URL приводит к тому, что при щелчке на ней страница перезагружается целиком, что изрядно раздражает.
В конце концов я всё-таки написал простой скрипт (jQuery), который автоматически генерирует оглавление статьи, собирая его из заголовков (тегов <H1>,<H2> и т. д.) в указанной части текста и автоматически же вставляет внутренние ссылки. Это действительно простой скрипт, в интернете можно найти более впечатляющие примеры, когда оглавление постоянно находится на экране, в нём автоматически выделяются текущие элементы и т. д. Достаточно набрать в Google «jquery table of contents».
Источником вдохновения послужил написанный мною в далёком 2009 году скрипт на JavaScript (тогда ещё не jQuery), генерировавший структурированное оглавление в виде вложенных списков (увы, ссылка на статью про этот скрипт бесследно исчезла с того сайта, где она была выложена, и исходники нигде не сохранились) и статья Janko Jovanovic. В комментариях к той статье, кстати, предлагается похожее решение, но оно мне показалось слишком длинным и громоздким.
Источником вдохновения послужил написанный мною в далёком 2009 году скрипт на JavaScript (тогда ещё не jQuery), генерировавший структурированное оглавление в виде вложенных списков (увы, ссылка на статью про этот скрипт бесследно исчезла с того сайта, где она была выложена, и исходники нигде не сохранились) и статья Janko Jovanovic. В комментариях к той статье, кстати, предлагается похожее решение, но оно мне показалось слишком длинным и громоздким.
Получившийся скрипт генерирует не просто набор ссылок (как у Janko), а структурированный список с правильными уровнями вложенности. Отдельно обрабатываются ситуации, когда иерархия заголовков нарушена, то есть, например, после заголовка H1 сразу идёт H3.
В принципе, Blogger тут вообще ни при чём, работать этот скрипт может везде, где подключается jQuery. В качестве проверки я вставил его в последние по времени пару статей: про планшетный компьютер и про SQL-запросы для Firebird: эти статьи самые длинные, и без оглавления их тяжело читать.
$(function() { var curlvl; var startlvl = 0; // 2 for Blogger var prevlvl = startlvl; var lst = $("#toc"); if(typeof lst !== "undefined") { $("#content h1, #content h2, #content h3, #content h4").each(function(i) { var current = $(this); current.attr("id", "title" + i); for(curlvl = parseInt(current.prop("tagName").substring(1)); curlvl > prevlvl; prevlvl++) { var tmp = $("<ul></ul>"); if(prevlvl == startlvl) lst.append(tmp); else { var last_li = $("#toc li").last(); last_li.append(tmp); } if (curlvl > prevlvl + 1) tmp.append("<li style=\"list-style-type: none\"></li>"); lst = tmp; } while(curlvl < prevlvl) { lst = lst.parent().parent(); prevlvl--; } lst.append("<li><a id='link" + i + "' href='#title" + i + "'>" + current.html() + "</a></li>"); }); } });
Здесь
startlvl
— это фактически константа, которая определяет «нулевой» уровень вложенности (да, я знаю про ключевое слово const
, но мне всё-таки хотелось сохранить совместимость с IE). Например, в статьях Blogger обычно используются заголовки уровней 3 и 4 (1 и 2 используются на главной странице блога), поэтому startlvl = 2
, а заголовки, которые необходимо учитывать, будут записаны как "#content h3, #content h4"
.
Перед использованием скрипта текст статьи нужно подготовить. Во-первых, нужно выбрать место для оглавления и вписать в этом месте
<div id="toc"></div>
. Во-вторых, окружить ту часть статьи, из которой должно быть собрано оглавление, тегом <div id="content">…</div>
. Всё остальное сделает скрипт.
Отлично. Спасибо!
ОтветитьУдалить