From 8502c04beeedf86e7b6aa425f0cf77fe3a4293bd Mon Sep 17 00:00:00 2001 From: ilmar Date: Mon, 9 Apr 2018 15:37:28 +0300 Subject: [PATCH] html lists export fix --- src/node/utils/ExportHtml.js | 128 +++++++++++++++++------------------ 1 file changed, 63 insertions(+), 65 deletions(-) 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('
  1. ')); + //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('
      1. ', 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('
  2. ')); - pieces.push('
  3. ', context.lineContent || '
    '); + pieces.push(''); } - lists = lists.slice(0, whichList + 1); - } else { - pieces.push('
  4. ', 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(''); }