因此,我解析了一个文档,以便使用 stackHeadings() 获取所有标题。我这样做是为了使用 buildNav() 构建 Microsoft Word 样式的文档地图。这目前工作正常,但它不是很健壮,并且在标题不遵循严格顺序的任何时候都会中断......例如(如果你从 H2 开始它会中断,如果你在下面嵌套 H3 并且 H1 它会中断,等等......)
我无法弄清楚解决此问题的最佳方法(使其更强大)。我正在利用 jQuery 的 `nextUntil' 函数来查找两个 h1 之间的所有 h2。
一种可能性是替换:
elem.nextUntil( 'h' + cur, 'h' + next )
和
elem.nextUntil( 'h' + cur, 'h' + next + ',h' + (next + 1) + ',h' + (next + 2) ... )
查找同一级别的两个标题之间的所有子标题。但是现在 h1s 的 h3 孩子只会嵌套一层而不是两层。
因此,您必须将当前标题级别与父标题级别进行比较,如果跳跃超过一个(h1 -> h3),您必须在它们之间创建一个空子作为嵌套占位符失踪的h2。
任何想法或解决方案将不胜感激!
stackHeadings = (items, cur, counter) ->
cur = 1 if cur == undefined
counter ?= 1
next = cur + 1
for elem, index in items
elem = $(elem)
children = filterHeadlines( elem.nextUntil( 'h' + cur, 'h' + next ) )
d.children = stackHeadings( children, next, counter ) if children.length > 0
d
filterHeadlines = ( $hs ) ->
_.filter( $hs, ( h ) -> $(h).text().match(/[^\s]/) )
buildNav = ( ul, items ) ->
for child, index in items
li = $( "<li>" )
$( ul ).append( li )
$a = $("<a/>")
$a.attr( "id", "nav-title-" + child.id )
li.append( $a )
if child.children
subUl = document.createElement( 'ul' )
li.append( subUl )
buildNav( subUl, child.children )
items = stackHeadings( filterHeadlines( source.find( 'h1' ) ) )
ul = $('<ul>')
buildNav( ul, items)