Проблема здесь в том, что нет хорошего способа получить заголовки в порядке документа. Например, вызов jQuery $('h1,h2,h3,h4,h5,h6')
вернет все ваши заголовки, но сначала будут все <h1>
с, затем <h2>
и т. Д. При использовании селекторов с разделителями-запятыми никакая основная рама пока не возвращает элементы в порядке документа.
Вы можете решить эту проблему, добавив общий класс к каждому заголовку. Например:
<h1 class="heading">Heading level 1</h1>
<h2 class="heading">Sub heading #1</h2>
<h2 class="heading">Sub heading #2</h2>
<h3 class="heading">Sub Sub heading</h3>
<h2 class="heading">Sub heading #3</h2>
...
Теперь селектор $('.heading')
приведёт их все в порядок.
Вот как я бы сделал это с помощью jQuery:
var $result = $('<div/>');
var curDepth = 0;
$('h1,h2,h3,h4,h5,h6').addClass('heading');
$('.heading').each(function() {
var $li = $('<li/>').text($(this).text());
var depth = parseInt(this.tagName.substring(1));
if(depth > curDepth) { // going deeper
$result.append($('<ol/>').append($li));
$result = $li;
} else if (depth < curDepth) { // going shallower
$result.parents('ol:eq(' + (curDepth - depth - 1) + ')').append($li);
$result = $li;
} else { // same level
$result.parent().append($li);
$result = $li;
}
curDepth = depth;
});
$result = $result.parents('ol:last');
// clean up
$('h1,h2,h3,h4,h5,h6').removeClass('heading');
$result
теперь должно быть вашим <ol>
.
Также обратите внимание, что при этом будет обрабатываться <h4>
, за которым следует <h1>
(перемещение более чем на один уровень вниз одновременно), но он не будет обрабатывать <h1>
с последующим <h4>
(более одного уровень вверх за один раз).