diff --git a/frontend-js/src/main/js/gui/AddOverlayDialog.js b/frontend-js/src/main/js/gui/AddOverlayDialog.js index d49c6a153db8f9436d021c8a4126d5cb3cbc9436..7a2509a0d25f1e9e63f8feb1c5d10ae3e8756b82 100644 --- a/frontend-js/src/main/js/gui/AddOverlayDialog.js +++ b/frontend-js/src/main/js/gui/AddOverlayDialog.js @@ -116,6 +116,10 @@ AddOverlayDialog.prototype.processFile = function (file) { if (overlay.getDescription() !== undefined) { descriptionInput.value = overlay.getDescription(); } + if (overlayParser.containsMixedNewLineCharacters(evt.target.result)) { + GuiConnector.warn("Selected file contains new line characters from different operating systems " + + "(MAC/Windows/Linux). This might cause confusion when reading the file in the editor later on.") + } resolve(self.getFileContent()); } catch (error) { reject(error); diff --git a/frontend-js/src/main/js/map/OverlayParser.js b/frontend-js/src/main/js/map/OverlayParser.js index 72fc466358ac3bc06fb988402834959eca341687..be71a609445ea0f363301c916e8686556521f88d 100644 --- a/frontend-js/src/main/js/map/OverlayParser.js +++ b/frontend-js/src/main/js/map/OverlayParser.js @@ -7,10 +7,21 @@ var TextDecoder = require('text-encoding').TextDecoder; function OverlayParser() { } -OverlayParser.prototype.parse = function (content) { +/** + * + * @param {string| Uint8Array | ArrayBuffer} content + * @returns {string} + * @private + */ +OverlayParser.prototype._extractContent = function (content) { if (content instanceof Uint8Array || content instanceof ArrayBuffer) { content = new TextDecoder("UTF8").decode(content); } + return content; +}; + +OverlayParser.prototype.parse = function (content) { + content = this._extractContent(content); var data = {content: content}; var lines = content.split("\n"); for (var i = 0; i < lines.length; i++) { @@ -37,5 +48,36 @@ OverlayParser.prototype.parse = function (content) { return new DataOverlay(data); }; +/** + * + * @param {string| Uint8Array | ArrayBuffer} content + * @returns {boolean} + */ +OverlayParser.prototype.containsMixedNewLineCharacters = function (content) { + content = this._extractContent(content); + var newLineRegEx = /[\r\n]+/g; + var match = newLineRegEx.exec(content); + var newLineFormats = {}; + var counter = 0; + while (match !== null && match !== undefined) { + var foundMultiplication = false; + var key = ''; + //this is just a heuristic - let's assume there are at most 10 empty lines in a file + for (var i = 0; i < 10; i++) { + key += match[0]; + if (newLineFormats[key]) { + foundMultiplication = true; + } else { + newLineFormats[key] = true; + } + } + if (!foundMultiplication) { + counter++; + } + match = newLineRegEx.exec(content); + } + return counter > 1; +}; + module.exports = OverlayParser; diff --git a/frontend-js/src/test/js/map/OverlayParser-test.js b/frontend-js/src/test/js/map/OverlayParser-test.js index 48ce28d457854d75db0760b5b895aefa11f9ee66..a79ced51117e2e786a780e87053bddfdceac1859 100644 --- a/frontend-js/src/test/js/map/OverlayParser-test.js +++ b/frontend-js/src/test/js/map/OverlayParser-test.js @@ -42,5 +42,50 @@ describe('OverlayParser', function () { }); }); }); + describe('containsMixedNewLineCharacters', function () { + it('normal file', function () { + return ServerConnector.sendGetRequest("testFiles/overlay/good.txt").then(function (fileContent) { + var parser = new OverlayParser(); + assert.notOk(parser.containsMixedNewLineCharacters(fileContent)); + }); + }); + it('windows/linux mix', function () { + var content = "line1\n\rline2\n"; + var parser = new OverlayParser(); + assert.ok(parser.containsMixedNewLineCharacters(content)); + }); + + it('windows empty lines', function () { + var content = "line1\n\rline2\n\r\n\rline4"; + var parser = new OverlayParser(); + assert.notOk(parser.containsMixedNewLineCharacters(content)); + }); + + it('windows/mac mix', function () { + var content = "line1\n\rline2\r"; + var parser = new OverlayParser(); + assert.ok(parser.containsMixedNewLineCharacters(content)); + }); + + it('mac empty lines', function () { + var content = "line1\rline2\r\rline4"; + var parser = new OverlayParser(); + assert.notOk(parser.containsMixedNewLineCharacters(content)); + }); + + it('windows/mac mix 2', function () { + var content = "line1\n\r\rline2\n\rline3"; + var parser = new OverlayParser(); + assert.ok(parser.containsMixedNewLineCharacters(content)); + }); + + it('linux empty lines', function () { + var content = "line1\nline2\n\nline4"; + var parser = new OverlayParser(); + assert.notOk(parser.containsMixedNewLineCharacters(content)); + }); + + + }); });