describe('linenumbering', function () { beforeEach(module('OpenSlidesApp.motions.lineNumbering')); var lineNumberingService, brMarkup = function (no) { return '
' + ' '; }, noMarkup = function (no) { return ' '; }, longstr = function (length) { var outstr = ''; for (var i = 0; i < length; i++) { outstr += String.fromCharCode(65 + (i % 26)); } return outstr; }; beforeEach(inject(function (_lineNumberingService_) { lineNumberingService = _lineNumberingService_; })); describe('paragraph splitting', function () { it('breaks simple DIVs', function () { var htmlIn = '
Test 1
' + "\n" + '

Test 2 3

'; var out = lineNumberingService.splitToParagraphs(htmlIn); expect(out.length).toBe(2); expect(out[0]).toBe('
Test 1
'); expect(out[1]).toBe('

Test 2 3

'); }); it('ignores root-level text-nodes', function () { var htmlIn = '
Test 3
' + "\n New line"; var out = lineNumberingService.splitToParagraphs(htmlIn); expect(out.length).toBe(1); expect(out[0]).toBe('
Test 3
'); }); it('splits UL-Lists', function () { var htmlIn = ""; var out = lineNumberingService.splitToParagraphs(htmlIn); expect(out.length).toBe(3); expect(out[0]).toBe(''); expect(out[1]).toBe(''); expect(out[2]).toBe(''); }); it('splits OL-Lists', function () { var htmlIn = "
    \n
  1. Node 1
  2. \n
  3. Node 2
  4. Node 3

"; var out = lineNumberingService.splitToParagraphs(htmlIn); expect(out.length).toBe(3); expect(out[0]).toBe('
  1. Node 1
'); expect(out[1]).toBe('
  1. Node 2
'); expect(out[2]).toBe('
  1. Node 3

'); }); }); describe('getting line number range', function () { it('extracts the line number range, example 1', function () { var html = '

' + noMarkup(2) + 'et accusam et justo duo dolores et ea rebum Inserted Text. Stet clita kasd ' + brMarkup(3) + 'gubergren,

'; var range = lineNumberingService.getLineNumberRange(html); expect(range).toEqual({"from": 2, "to": 4}); }); }); describe('line numbering: test nodes', function () { it('breaks very short lines', function () { var textNode = document.createTextNode("0123"); lineNumberingService._currentInlineOffset = 0; lineNumberingService._currentLineNumber = 1; var out = lineNumberingService._textNodeToLines(textNode, 5); var outHtml = lineNumberingService._nodesToHtml(out); expect(outHtml).toBe('0123'); expect(lineNumberingService._currentInlineOffset).toBe(4); }); it('breaks simple lines', function () { var textNode = document.createTextNode("012345678901234567"); lineNumberingService._currentInlineOffset = 0; lineNumberingService._currentLineNumber = 1; var out = lineNumberingService._textNodeToLines(textNode, 5); var outHtml = lineNumberingService._nodesToHtml(out); expect(outHtml).toBe('01234' + brMarkup(1) + '56789' + brMarkup(2) + '01234' + brMarkup(3) + '567'); expect(lineNumberingService._currentInlineOffset).toBe(3); }); it('breaks simple lines with offset', function () { var textNode = document.createTextNode("012345678901234567"); lineNumberingService._currentInlineOffset = 2; lineNumberingService._currentLineNumber = 1; var out = lineNumberingService._textNodeToLines(textNode, 5); var outHtml = lineNumberingService._nodesToHtml(out); expect(outHtml).toBe('012' + brMarkup(1) + '34567' + brMarkup(2) + '89012' + brMarkup(3) + '34567'); expect(lineNumberingService._currentInlineOffset).toBe(5); }); it('breaks simple lines with offset equaling to length', function () { var textNode = document.createTextNode("012345678901234567"); lineNumberingService._currentInlineOffset = 5; lineNumberingService._currentLineNumber = 1; var out = lineNumberingService._textNodeToLines(textNode, 5); var outHtml = lineNumberingService._nodesToHtml(out); expect(outHtml).toBe(brMarkup(1) + '01234' + brMarkup(2) + '56789' + brMarkup(3) + '01234' + brMarkup(4) + '567'); expect(lineNumberingService._currentInlineOffset).toBe(3); }); it('breaks simple lines with spaces (1)', function () { var textNode = document.createTextNode("0123 45 67 89012 34 567"); lineNumberingService._currentInlineOffset = 0; lineNumberingService._currentLineNumber = 1; var out = lineNumberingService._textNodeToLines(textNode, 5); var outHtml = lineNumberingService._nodesToHtml(out); expect(outHtml).toBe('0123 ' + brMarkup(1) + '45 67 ' + brMarkup(2) + '89012 ' + brMarkup(3) + '34 ' + brMarkup(4) + '567'); expect(lineNumberingService._currentInlineOffset).toBe(3); }); it('breaks simple lines with spaces (2)', function () { var textNode = document.createTextNode("0123 45 67 89012tes 344 "); lineNumberingService._currentInlineOffset = 0; lineNumberingService._currentLineNumber = 1; var out = lineNumberingService._textNodeToLines(textNode, 5); var outHtml = lineNumberingService._nodesToHtml(out); expect(outHtml).toBe('0123 ' + brMarkup(1) + '45 67 ' + brMarkup(2) + '89012' + brMarkup(3) + 'tes ' + brMarkup(4) + '344 '); expect(lineNumberingService._currentInlineOffset).toBe(4); }); it('breaks simple lines with spaces (3)', function () { var textNode = document.createTextNode("I'm a Demo-Text"); lineNumberingService._currentInlineOffset = 0; lineNumberingService._currentLineNumber = 1; var out = lineNumberingService._textNodeToLines(textNode, 5); var outHtml = lineNumberingService._nodesToHtml(out); expect(outHtml).toBe('I\'m a ' + brMarkup(1) + 'Demo-' + brMarkup(2) + 'Text'); expect(lineNumberingService._currentInlineOffset).toBe(4); }); it('breaks simple lines with spaces (4)', function () { var textNode = document.createTextNode("I'm a LongDemo-Text"); lineNumberingService._currentInlineOffset = 0; lineNumberingService._currentLineNumber = 1; var out = lineNumberingService._textNodeToLines(textNode, 5); var outHtml = lineNumberingService._nodesToHtml(out); expect(outHtml).toBe('I\'m a ' + brMarkup(1) + 'LongD' + brMarkup(2) + 'emo-' + brMarkup(3) + 'Text'); expect(lineNumberingService._currentInlineOffset).toBe(4); }); }); describe('line numbering: inline nodes', function () { it('leaves a simple SPAN untouched', function () { var inHtml = "Test"; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 5); expect(outHtml).toBe(noMarkup(1) + 'Test'); expect(lineNumberingService.stripLineNumbers(outHtml)).toBe(inHtml); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); it('breaks lines in a simple SPAN', function () { var inHtml = "Lorem ipsum dolorsit amet"; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 5); expect(outHtml).toBe(noMarkup(1) + 'Lorem ' + brMarkup(2) + 'ipsum ' + brMarkup(3) + 'dolor' + brMarkup(4) + 'sit ' + brMarkup(5) + 'amet'); expect(lineNumberingService.stripLineNumbers(outHtml)).toBe(inHtml); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); it('breaks lines in nested inline elements', function () { var inHtml = "Lorem ipsum dolorsit amet"; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 5); expect(outHtml).toBe(noMarkup(1) + 'Lorem ' + brMarkup(2) + 'ipsum ' + brMarkup(3) + 'dolor' + brMarkup(4) + 'sit ' + brMarkup(5) + 'amet'); expect(lineNumberingService.stripLineNumbers(outHtml)).toBe(inHtml); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); it('counts within DEL nodes', function () { var inHtml = "1234 1234 1234 1234"; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 10); expect(outHtml).toBe(noMarkup(1) + '1234 1234 ' + brMarkup(2) + '1234 1234'); expect(lineNumberingService.stripLineNumbers(outHtml)).toBe(inHtml); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); it('counts after DEL/INS-nodes', function () { var inHtml = "

leo Testelefantgeweih Buchstabenwut als Achzehnzahlunginer. Hierbei darfsetzen bist der Deifi das Dor Reh Wachtel da Subjunktivier als Derftige Aalsan Orthopädische, der Arbeitsnachweisdiskus Bass der Tastatur Weiter schreiben wie Tasse Wasser als dienen.

"; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 95); expect(outHtml).toBe('

' + noMarkup(1) + 'leo Testelefantgeweih Buchstabenwut als Achzehnzahlunginer. Hierbei darfsetzen bist der Deifi das ' + brMarkup(2) + 'Dor Reh Wachtel da Subjunktivier als Derftige Aalsan Orthopädische, der Arbeitsnachweisdiskus Bass der Tastatur ' + brMarkup(3) + 'Weiter schreiben wie Tasse Wasser als dienen.

'); }); it('handles STRIKE-tags', function () { var inHtml = '

et accusam et justo duo dolores et ea rebum Inserted Text. Stet clita kasd gubergren,

'; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 80); expect(outHtml).toBe('

' + noMarkup(1) + 'et accusam et justo duo dolores et ea rebum Inserted Text. Stet clita kasd ' + brMarkup(2) + 'gubergren,

'); expect(lineNumberingService.stripLineNumbers(outHtml)).toBe(inHtml); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); it('treats ascii newline characters like spaces', function () { var inHtml = "

Test 123\nTest1

"; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 5); expect(outHtml).toBe('

' + noMarkup(1) + 'Test ' + brMarkup(2) + "123\n" + brMarkup(3) + 'Test1

'); }); }); describe('line numbering: block nodes', function () { it('leaves a simple DIV untouched', function () { var inHtml = "
Test
"; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 5); expect(outHtml).toBe('
' + noMarkup(1) + 'Test
'); expect(lineNumberingService.stripLineNumbers(outHtml)).toBe(inHtml); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); it('breaks a DIV containing only inline elements', function () { var inHtml = "
Test Test12345678 Test
"; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 5); expect(outHtml).toBe('
' + noMarkup(1) + 'Test ' + brMarkup(2) + 'Test1' + brMarkup(3) + '23456' + brMarkup(4) + '78 ' + brMarkup(5) + 'Test
'); expect(lineNumberingService.stripLineNumbers(outHtml)).toBe(inHtml); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); it('handles a DIV within a DIV correctly', function () { var inHtml = "
Te
Te Test
Test
"; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 5); expect(outHtml).toBe('
' + noMarkup(1) + 'Te
' + noMarkup(2) + 'Te ' + brMarkup(3) + 'Test
' + noMarkup(4) + 'Test
'); expect(lineNumberingService.stripLineNumbers(outHtml)).toBe(inHtml); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); it('ignores white spaces between block element tags', function () { var inHtml = ""; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 80); expect(outHtml).toBe("'); expect(lineNumberingService.stripLineNumbers(outHtml)).toBe(inHtml); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); }); describe('indentation for block elements', function () { it('indents LI-elements', function () { var inHtml = '
' +longstr(100) + '' + longstr(100) + '
'; var expected = '
' + noMarkup(1) + 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZAB' + brMarkup(2) + 'CDEFGHIJKLMNOPQRSTUV' + '' + noMarkup(5) + 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZAB' + brMarkup(6) + 'CDEFGHIJKLMNOPQRSTUV
'; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 80); expect(outHtml).toBe(expected); expect(lineNumberingService.stripLineNumbers(outHtml)).toBe(inHtml); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); it('indents BLOCKQUOTE-elements', function () { var inHtml = '
' +longstr(100) + '
' + longstr(100) + '
' + longstr(100) + '
'; var expected = '
' + noMarkup(1) + 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZAB' + brMarkup(2) + 'CDEFGHIJKLMNOPQRSTUV' + '
' + noMarkup(3) + 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGH' + brMarkup(4) + 'IJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUV' + '
' + noMarkup(5) + 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZAB' + brMarkup(6) + 'CDEFGHIJKLMNOPQRSTUV
'; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 80); expect(outHtml).toBe(expected); expect(lineNumberingService.stripLineNumbers(outHtml)).toBe(inHtml); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); it('shortens the line for H1-elements by 2/3', function () { var inHtml = '

' + longstr(80) + '

'; var expected = '

' + noMarkup(1) + 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZA' + brMarkup(2) + 'BCDEFGHIJKLMNOPQRSTUVWXYZAB

'; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 80); expect(outHtml).toBe(expected); expect(lineNumberingService.stripLineNumbers(outHtml)).toBe(inHtml); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); it('shortens the line for H2-elements by 0.75', function () { var inHtml = '

' + longstr(80) + '

'; var expected = '

' + noMarkup(1) + 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGH' + brMarkup(2) + 'IJKLMNOPQRSTUVWXYZAB

'; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 80); expect(outHtml).toBe(expected); expect(lineNumberingService.stripLineNumbers(outHtml)).toBe(inHtml); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); it('indents Ps with 30px-padding by 6 characters', function () { var inHtml = '
' + longstr(80) + '
'; var expected = '
' + noMarkup(1) + 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUV' + brMarkup(2) + 'WXYZAB
'; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 80); expect(outHtml).toBe(expected); expect(lineNumberingService.stripLineNumbers(outHtml)).toBe(inHtml); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); it('breaks before an inline element, if the first word of the new inline element is longer than the remaining line (1)', function () { var inHtml = "

Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio.

"; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 80); expect(outHtml).toBe('

' + noMarkup(1) + 'Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie ' + brMarkup(2) + 'consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan ' + brMarkup(3) + 'et iusto odio.

'); expect(lineNumberingService.stripLineNumbers(outHtml)).toBe(inHtml); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); it('breaks before an inline element, if the first word of the new inline element is longer than the remaining line (2)', function () { var inHtml = "

Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio.

"; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 80); expect(outHtml).toBe('

' + noMarkup(1) + 'Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie ' + brMarkup(2) + 'consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan ' + brMarkup(3) + 'et iusto odio.

'); expect(lineNumberingService.stripLineNumbers(outHtml)).toBe(inHtml); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); it('does not fail in a weird case', function () { var inHtml = "seid Noch

Test 123

"; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 80); expect(outHtml).toBe(noMarkup(1) + 'seid Noch

' + noMarkup(2) + 'Test 123

'); expect(lineNumberingService.stripLineNumbers(outHtml)).toBe(inHtml); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); }); describe('line numbering in regard to the inline diff', function() { it('does not count within INS nodes', function () { var inHtml = "1234 1234 1234 1234"; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 10); expect(outHtml).toBe(noMarkup(1) + '1234 1234 1234 ' + brMarkup(2) + '1234'); expect(lineNumberingService.stripLineNumbers(outHtml)).toBe(inHtml); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); it('does not create a new line for a trailing INS', function () { var inHtml = "

et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, conseteturdsfsdf23

"; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 80); expect(outHtml).toBe('

' + noMarkup(1) + 'et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata ' + brMarkup(2) + 'sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, conseteturdsfsdf23

'); expect(lineNumberingService.stripLineNumbers(outHtml)).toBe(inHtml); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); it('inserts the line number before the INS, if INS is the first element of the paragraph', function() { var inHtml = "

lauthals 'liebe Kinder, ich will hinaus in den Wald, seid auf der Hut vor dem Wolf!' Und noch etwas mehr Text bis zur nächsten Zeile

"; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 80); expect(outHtml).toBe("

" + noMarkup(1) + "lauthals 'liebe Kinder, ich will hinaus in den Wald, seid auf der Hut vor dem Wolf!' Und " + brMarkup(2) + "noch etwas mehr Text bis zur nächsten Zeile

"); expect(lineNumberingService.stripLineNumbers(outHtml)).toBe(inHtml); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); it('cancels newlines after br-elements', function () { var inHtml = "

Test 123
\nTest 456

"; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 80); expect(outHtml).toBe("

" + noMarkup(1) + "Test 123
" + noMarkup(2) + "Test 456

"); }); it('does not force-break words right after an INS', function () { var inHtml = "

" + noMarkup(1) + "012345 78 01 345678901234567890123456789

"; var outHtml = lineNumberingService.insertLineBreaksWithoutNumbers(inHtml, 20, true); expect(outHtml).toBe("

" + noMarkup(1) + "012345 78 01
34567
890123456789012
3456789

"); }); }); describe('line breaking without adding line numbers', function() { var plainBr = '
'; it('breaks a DIV containing only inline elements', function () { var inHtml = "
Test Test12345678 Test
"; var outHtml = lineNumberingService.insertLineBreaksWithoutNumbers(inHtml, 5); expect(outHtml).toBe('
Test ' + plainBr + 'Test1' + plainBr + '23456' + plainBr + '78 ' + plainBr + 'Test
'); expect(lineNumberingService.stripLineNumbers(outHtml)).toBe(inHtml); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); it('indents BLOCKQUOTE-elements', function () { var inHtml = '
' + longstr(100) + '
' + longstr(100) + '
' + longstr(100) + '
'; var expected = '
' + 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZAB' + plainBr + 'CDEFGHIJKLMNOPQRSTUV' + '
' + 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGH' + plainBr + 'IJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUV' + '
' + 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZAB' + plainBr + 'CDEFGHIJKLMNOPQRSTUV
'; var outHtml = lineNumberingService.insertLineBreaksWithoutNumbers(inHtml, 80); expect(outHtml).toBe(expected); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); it('DOES count within INS nodes', function () { var inHtml = "1234 1234 1234 1234"; var outHtml = lineNumberingService.insertLineBreaksWithoutNumbers(inHtml, 10, true); expect(outHtml).toBe('1234 1234 ' + plainBr + '1234 1234'); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); it('does not create a new line for a trailing INS', function () { var inHtml = "

et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, conseteturdsfsdf23

"; var outHtml = lineNumberingService.insertLineBreaksWithoutNumbers(inHtml, 80, true); expect(outHtml).toBe('

et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata ' + plainBr + 'sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur' + plainBr + 'dsfsdf23

'); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); it('ignores witespaces by previously added line numbers', function () { var inHtml = "

" + noMarkup(1) + longstr(10) + "

"; var outHtml = lineNumberingService.insertLineBreaksWithoutNumbers(inHtml, 10, true); expect(outHtml).toBe("

" + noMarkup(1) + longstr(10) + "

"); expect(lineNumberingService.insertLineBreaksWithoutNumbers(outHtml, 80)).toBe(outHtml); }); }); describe('behavior regarding ckeditor', function() { it('does not count empty lines, case 1', function () { var inHtml = "

Line 1

\n\n

Line 2

"; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 80); expect(outHtml).toBe('

' + noMarkup(1) + 'Line 1

' + "\n\n" + '

' + noMarkup(2) + 'Line 2

'); }); it('does not count empty lines, case 2', function () { var inHtml = ""; var outHtml = lineNumberingService.insertLineNumbers(inHtml, 80); expect(outHtml).toBe(""); }); }); describe('line highlighting', function() { it('highlights a simple line', function () { var inHtml = lineNumberingService.insertLineNumbers("Lorem ipsum dolorsit amet", 5); var highlighted = lineNumberingService.highlightLine(inHtml, 2); expect(highlighted).toBe(noMarkup(1) + 'Lorem ' + brMarkup(2) + 'ipsum ' + brMarkup(3) + 'dolor' + brMarkup(4) + 'sit ' + brMarkup(5) + 'amet'); }); it('highlights a simple line with formattings', function () { var inHtml = lineNumberingService.insertLineNumbers("Lorem ipsum dolorsit amet Lorem ipsum dolorsit amet Lorem ipsum dolorsit amet", 20); expect(inHtml).toBe(noMarkup(1) + 'Lorem ipsum dolorsit ' + brMarkup(2) + 'amet Lorem ipsum ' + brMarkup(3) + 'dolorsit amet Lorem ' + brMarkup(4) + 'ipsum dolorsit amet'); var highlighted = lineNumberingService.highlightLine(inHtml, 2); expect(highlighted).toBe(noMarkup(1) + 'Lorem ipsum dolorsit ' + brMarkup(2) + 'amet Lorem ipsum ' + brMarkup(3) + 'dolorsit amet Lorem ' + brMarkup(4) + 'ipsum dolorsit amet'); }); it('highlights the last line', function () { var inHtml = lineNumberingService.insertLineNumbers("Lorem ipsum dolorsit amet", 5); var highlighted = lineNumberingService.highlightLine(inHtml, 5); expect(highlighted).toBe(noMarkup(1) + 'Lorem ' + brMarkup(2) + 'ipsum ' + brMarkup(3) + 'dolor' + brMarkup(4) + 'sit ' + brMarkup(5) + 'amet'); }); it('highlights the first line', function () { var inHtml = lineNumberingService.insertLineNumbers("Lorem ipsum dolorsit amet", 5); var highlighted = lineNumberingService.highlightLine(inHtml, 1); expect(highlighted).toBe(noMarkup(1) + 'Lorem ' + brMarkup(2) + 'ipsum ' + brMarkup(3) + 'dolor' + brMarkup(4) + 'sit ' + brMarkup(5) + 'amet'); }); it('does not change the string if the line number is not found', function () { var inHtml = lineNumberingService.insertLineNumbers("Lorem ipsum dolorsit amet", 5); var highlighted = lineNumberingService.highlightLine(inHtml, 8); expect(highlighted).toBe(noMarkup(1) + 'Lorem ' + brMarkup(2) + 'ipsum ' + brMarkup(3) + 'dolor' + brMarkup(4) + 'sit ' + brMarkup(5) + 'amet'); }); }); describe('document structure parsing', function () { it('detects the line numbers of headings', function () { var inHtml = '

Line 1

' + '

Heading 1

Line 2

Heading 1.1

Line 3

Heading 1.2

Line 4

' + '

Heading 2

Heading 2.1

Line 5

'; inHtml = lineNumberingService.insertLineNumbers(inHtml, 80); var structure = lineNumberingService.getHeadingsWithLineNumbers(inHtml); expect(structure).toEqual([ {lineNumber: 2, level: 1, text: 'Heading 1'}, {lineNumber: 4, level: 2, text: 'Heading 1.1'}, {lineNumber: 6, level: 2, text: 'Heading 1.2'}, {lineNumber: 8, level: 1, text: 'Heading 2'}, {lineNumber: 9, level: 2, text: 'Heading 2.1'} ]); }); }); describe('caching', function() { it('caches based on line length', function () { var inHtml = '

' +longstr(100) + '

'; var outHtml80 = lineNumberingService.insertLineNumbers(inHtml, 80); var outHtml70 = lineNumberingService.insertLineNumbers(inHtml, 70); expect(outHtml70).not.toBe(outHtml80); }); }); });