Wen es interessiert oder wenn noch jemand verbesserungen hat, hier der (Javascript) Code:
numbers ist ein array von arrays. Die Unterarrays haben an Position 0 den Text, um den es geht.
Rest sollte selbsterklärend sein.
JavaScript-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| function makeMenu(numbers) { var elCt=numbers.length; if (elCt == 0) return; var menuUl = document.createElement('ul'); var catCt = Math.min(elCt, 7); var elCatCt = Math.round(elCt / catCt); var curStart = 0; var curEnd, curEndPre; var lastC = numbers[0][0].firstChar(); var curC; for (var i = 1; i < catCt; i++) { curEndPre=-100000; for (curEnd = curStart + 1; curEnd < elCt; curEnd++) { curC = numbers[curEnd][0].firstChar(); if (curC != lastC) { lastC = curC; if (curEnd >= i*elCatCt){ if(i*elCatCt-curEndPre<curEnd-i*elCatCt) curEnd=curEndPre; break; } curEndPre=curEnd; } } makeMenuSub(numbers, menuUl, curStart, curEnd-1); curStart = curEnd; if(curStart>=elCt) break; } if(curStart+1<elCt) makeMenuSub(numbers, menuUl, curStart, elCt-1); } |
Verbesserungsvorschläge nehme ich gern an. Aber denke, ich hab auch alle Grenzfälle abgedeckt.
Edit: JUHU! Bug im JS-Highlighter!