diff --git a/src/node/utils/ExportHtml.js b/src/node/utils/ExportHtml.js
index d885c6824..84909f8c6 100644
--- a/src/node/utils/ExportHtml.js
+++ b/src/node/utils/ExportHtml.js
@@ -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('');
- }
- 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('
- '));
+ //To create list parent elements
+ if ((!prevLine || prevLine.listLevel !== line.listLevel) || (prevLine && line.listTypeName !== prevLine.listTypeName)) {
+ //pieces.push('
');
+ 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('- ', context.lineContent || '
');
- } else {
- if (toOpen > 0) {
- pieces.push(new Array(toOpen + 1).join(' - '));
- }
- pieces.push('
- ', context.lineContent || '
');
+
+ for (var diff = prevLevel; diff < line.listLevel; diff++) {
+ openLists.push({level: diff, type: line.listTypeName});
+ var prevPiece = pieces[pieces.length - 1];
+
+ if (prevPiece.indexOf('') === 0) {
+ pieces.push('- ');
+ }
+
+ if (line.listTypeName === 'number') {
+ pieces.push('
');
+ } else {
+ pieces.push('');
+ }
+ }
}
- } 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('
');
- if (lists[lists.length - 1][1] === 'number') {
- pieces.push(new Array(toClose + 1).join('
'));
- pieces.push('- ', context.lineContent || '
');
+
+ }
+
+ pieces.push(' - ', context.lineContent);
+
+ // To close list elements
+ if (nextLine && nextLine.listLevel === line.listLevel && line.listTypeName === nextLine.listTypeName) {
+ pieces.push('
');
+ }
+ 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('');
+ }
+
+ if (line.listTypeName === 'number') {
+ pieces.push('
');
} else {
- pieces.push(new Array(toClose + 1).join(''));
- pieces.push('', context.lineContent || '
');
+ pieces.push('');
}
- lists = lists.slice(0, whichList + 1);
- } else {
- pieces.push('', context.lineContent || '
');
- }
+ }
}
} else { //outside any list, need to close line.listLevel of lists
-
- if (lists.length > 0) {
- if (lists[lists.length - 1][1] === 'number') {
- pieces.push('');
- pieces.push(new Array(listLevels[listLevels.length - 2]).join(''));
- } else {
- pieces.push('');
- pieces.push(new Array(listLevels[listLevels.length - 2]).join(''));
- }
- }
- 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('');
- } else {
- pieces.push('');
- }
- }
-
return pieces.join('');
}