html lists export fix
This commit is contained in:
parent
b4ad7cf452
commit
8502c04bee
1 changed files with 63 additions and 65 deletions
|
@ -362,25 +362,14 @@ function getHTMLFromAtext (pad, atext, authorColors) {
|
|||
// so we want to do something reasonable there. We also
|
||||
// want to deal gracefully with blank lines.
|
||||
// => keeps track of the parents level of indentation
|
||||
var lists = []; // e.g. [[1,'bullet'], [3,'bullet'], ...]
|
||||
var listLevels = [];
|
||||
var openLists = [];
|
||||
for (var i = 0; i < textLines.length; i++) {
|
||||
var context;
|
||||
var line = _analyzeLine(textLines[i], attribLines[i], apool);
|
||||
var lineContent = getLineHTML(line.text, line.aline);
|
||||
listLevels.push(line.listLevel);
|
||||
|
||||
if (line.listLevel) { //If we are inside a list
|
||||
// do list stuff
|
||||
var whichList = -1; // index into lists or -1
|
||||
if (line.listLevel) {
|
||||
whichList = lists.length;
|
||||
for (var j = lists.length - 1; j >= 0; j--) {
|
||||
if (line.listLevel <= lists[j][0]) {
|
||||
whichList = j;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
context = {
|
||||
line: line,
|
||||
lineContent: lineContent,
|
||||
|
@ -389,57 +378,74 @@ function getHTMLFromAtext (pad, atext, authorColors) {
|
|||
text: textLines[i],
|
||||
padId: pad.id
|
||||
};
|
||||
var prevLine = null;
|
||||
var nextLine = null;
|
||||
if (i > 0) {
|
||||
prevLine = _analyzeLine(textLines[i - 1], attribLines[i - 1], apool);
|
||||
}
|
||||
if (i < textLines.length) {
|
||||
nextLine = _analyzeLine(textLines[i + 1], attribLines[i + 1], apool);
|
||||
}
|
||||
hooks.callAll('getLineHTMLForExport', context);
|
||||
if (whichList >= lists.length) {
|
||||
if (lists.length > 0) {
|
||||
pieces.push('</li>');
|
||||
}
|
||||
lists.push([line.listLevel, line.listTypeName]);
|
||||
|
||||
// if there is a previous list we need to open x tags, where x is the difference of the levels
|
||||
// if there is no previous list we need to open x tags, where x is the wanted level
|
||||
var toOpen = lists.length > 1 ? line.listLevel - lists[lists.length - 2][0] - 1 : line.listLevel - 1
|
||||
|
||||
if (line.listTypeName === 'number') {
|
||||
if (toOpen > 0) {
|
||||
pieces.push(new Array(toOpen + 1).join('<ol></li><li>'));
|
||||
//To create list parent elements
|
||||
if ((!prevLine || prevLine.listLevel !== line.listLevel) || (prevLine && line.listTypeName !== prevLine.listTypeName)) {
|
||||
//pieces.push('<ul class="' + line.listTypeName + '">');
|
||||
var exists = _.find(openLists, function (item) {
|
||||
return (item.level === line.listLevel && item.type === line.listTypeName);
|
||||
});
|
||||
if (!exists) {
|
||||
var prevLevel = prevLine.listLevel || 0;
|
||||
if (prevLine && line.listTypeName !== prevLine.listTypeName) {
|
||||
prevLevel = 0;
|
||||
}
|
||||
pieces.push('<ol class="' + line.listTypeName + '"><li>', context.lineContent || '<br>');
|
||||
} else {
|
||||
if (toOpen > 0) {
|
||||
pieces.push(new Array(toOpen + 1).join('<li><ul><li>'));
|
||||
}
|
||||
pieces.push('<ul class="' + line.listTypeName + '"><li>', context.lineContent || '<br>');
|
||||
|
||||
for (var diff = prevLevel; diff < line.listLevel; diff++) {
|
||||
openLists.push({level: diff, type: line.listTypeName});
|
||||
var prevPiece = pieces[pieces.length - 1];
|
||||
|
||||
if (prevPiece.indexOf('<ul') === 0 || prevPiece.indexOf('<ol') === 0 || prevPiece.indexOf('</li>') === 0) {
|
||||
pieces.push('<li>');
|
||||
}
|
||||
|
||||
if (line.listTypeName === 'number') {
|
||||
pieces.push('<ol class="' + line.listTypeName + '">');
|
||||
} else {
|
||||
pieces.push('<ul class="' + line.listTypeName + '">');
|
||||
}
|
||||
}
|
||||
}
|
||||
} else { //means we are getting closer to the lowest level of indentation or are at the same level
|
||||
var toClose = lists.length > 0 ? listLevels[listLevels.length - 2] - line.listLevel : 0
|
||||
if (toClose > 0) {
|
||||
pieces.push('</li>');
|
||||
if (lists[lists.length - 1][1] === 'number') {
|
||||
pieces.push(new Array(toClose + 1).join('</ol></li>'));
|
||||
pieces.push('<li>', context.lineContent || '<br>');
|
||||
|
||||
}
|
||||
|
||||
pieces.push('<li>', context.lineContent);
|
||||
|
||||
// To close list elements
|
||||
if (nextLine && nextLine.listLevel === line.listLevel && line.listTypeName === nextLine.listTypeName) {
|
||||
pieces.push('</li>');
|
||||
}
|
||||
if ((!nextLine || !nextLine.listLevel || nextLine.listLevel < line.listLevel) || (nextLine && line.listTypeName !== nextLine.listTypeName)) {
|
||||
var nextLevel = nextLine.listLevel || 0;
|
||||
if (nextLine && line.listTypeName !== nextLine.listTypeName) {
|
||||
nextLevel = 0;
|
||||
}
|
||||
|
||||
for (var diff = nextLevel; diff < line.listLevel; diff++) {
|
||||
openLists = openLists.filter(function(el) {
|
||||
return el.level !== diff && el.type !== line.listTypeName;
|
||||
});
|
||||
|
||||
if (pieces[pieces.length - 1].indexOf('</ul') === 0 || pieces[pieces.length - 1].indexOf('</ol') === 0) {
|
||||
pieces.push('</li>');
|
||||
}
|
||||
|
||||
if (line.listTypeName === 'number') {
|
||||
pieces.push('</ol>');
|
||||
} else {
|
||||
pieces.push(new Array(toClose + 1).join('</ul></li>'));
|
||||
pieces.push('<li>', context.lineContent || '<br>');
|
||||
pieces.push('</ul>');
|
||||
}
|
||||
lists = lists.slice(0, whichList + 1);
|
||||
} else {
|
||||
pieces.push('</li><li>', context.lineContent || '<br>');
|
||||
}
|
||||
}
|
||||
}
|
||||
} else { //outside any list, need to close line.listLevel of lists
|
||||
|
||||
if (lists.length > 0) {
|
||||
if (lists[lists.length - 1][1] === 'number') {
|
||||
pieces.push('</li></ol>');
|
||||
pieces.push(new Array(listLevels[listLevels.length - 2]).join('</ol></li>'));
|
||||
} else {
|
||||
pieces.push('</li></ul>');
|
||||
pieces.push(new Array(listLevels[listLevels.length - 2]).join('</ul></li>'));
|
||||
}
|
||||
}
|
||||
lists = [];
|
||||
|
||||
context = {
|
||||
line: line,
|
||||
lineContent: lineContent,
|
||||
|
@ -454,14 +460,6 @@ function getHTMLFromAtext (pad, atext, authorColors) {
|
|||
}
|
||||
}
|
||||
|
||||
for (var k = lists.length - 1; k >= 0; k--) {
|
||||
if (lists[k][1] === 'number') {
|
||||
pieces.push('</li></ol>');
|
||||
} else {
|
||||
pieces.push('</li></ul>');
|
||||
}
|
||||
}
|
||||
|
||||
return pieces.join('');
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue