Ace: ACE kann Unix-Zeilenumbrüche nicht erkennen oder verwenden

Erstellt am 12. Juli 2013  ·  10Kommentare  ·  Quelle: ajaxorg/ace

Hallo!

Ich verwende GitLab und wenn ich ACE zum Bearbeiten von Dateien in Git verwende, speichert es weiterhin mit Zeilenumbrüchen im Windows-Stil.

Dies macht den Git-Verlauf nahezu nutzlos und macht Dinge kaputt, die nicht wissen, was mit dem Zeichen \r zu tun ist (z. B. Augias). Siehe gitlabhq/gitlabhq#3982 für den Verlauf.

Ich weiß, dass es ACE ist, aber ich weiß nicht, _warum_ es passiert.

Ich habe versucht (über die Konsole in Chrome) Dinge wie:

  • editor.session.setNewlineMode('unix')
  • editor.session.getDocument().setNewlineMode('unix')

... aber es sendet es trotzdem mit \r\n als Zeilenende an GitLab zurück.

Ich habe die API-Dokumente durchgelesen und einiges gegoogelt, kann aber keine Lösung für dieses Problem finden.

Ist dies ein Fehler in ACE oder missbraucht Gitlab ACE?

Ciao!

Hilfreichster Kommentar

Okay, ich weiß also, was los ist, und ich fühle mich dumm, weil ich das nicht weiß:

Wenn Sie ein Formular POST eingeben, verwendet es den MIME-Typ application/x-www-form-urlencoded . Gemäß den W3-Formularinhaltstypen sollte ein Browser Zeilenumbrüche immer als \r\n codieren.

Das ist also, wo die \r\n ins Spiel kommen. Ich schätze, ich habe es vorher nie bemerkt.

Die Lösung besteht darin, die Serveranwendung mit den zurückkommenden Daten das „Richtige“ tun zu lassen, was möglicherweise der Fall ist
beinhalten das Ersetzen \r\n durch \n .

Danke Leute. Schließe dieses Problem. Hoffentlich findet jemand mit einem ähnlichen Problem dieses Problem hilfreich.

Alle 10 Kommentare

Hallo

Ich halte es für sehr unwahrscheinlich, dass dies ein Problem mit Ace ist.
Kannst du es mit folgendem Code testen?

var session = editor.session
session.setNewLineMode("unix"); // same as session.setOption("newLineMode", "unix");
JSON.stringify(ace.session.doc.getNewLineCharacter()); // == '"\n"'
session.doc.getValue().indexOf("\r") == -1

Es wäre auch hilfreich, wenn Sie eine URL zu einer Beispielseite geben könnten, auf der ich versuchen könnte, das Problem zu reproduzieren

Leider ist unser Gitlab privat.

Ich weiß nicht, was es sonst sein könnte, weil es den Server ohne \r , aber sie hat, wenn es zurückkommt.

Wenn ich nach Hause komme, kümmere ich mich darum, Ihren Testcode auszuführen.

Ergebnisse Ihres Codes:

session = editor.session
// => undefined
session.setNewLineMode("unix")
// => undefined
JSON.stringify(session.doc.getNewLineCharacter())
// => ""\n""
session.doc.getValue().indexOf("\r") == -1
// => true

Und wenn ich es speichere, wird es von Rails mit \r\n für EOL empfangen.

Ich stochere immer noch darin herum, aber es treibt mich in den Wahnsinn.

Suchen Sie nach dem Code, der die Datei hochlädt
entweder es ersetzt \n durch \r\n oder der Browser macht das automatisch.

Hier ist der Code, der den Text zum Hochladen in ein verstecktes Feld einfügt:

https://github.com/gitlabhq/gitlabhq/blob/5-4-stable/app/views/edit_tree/show.html.haml#L42-L45

Es tut nichts, die Zeilenenden zu ändern. Warum sollte ein Browser diese Änderung vornehmen?

Okay, ich habe einen Beispielkern mit einer PHP-Datei erstellt, die den Fehler demonstriert.

https://gist.github.com/docwhat/5992954#file -ace-windows-newlines-php

Hoffentlich hilft uns das herauszufinden, was schief läuft.

Ciao!

Es wäre besser, einen Test mit normalem Textbereich zu erstellen, da wir gesehen haben, dass er nicht von ace verursacht wird.
Es gibt viele Möglichkeiten, wie Text in Windows in '\r\n' konvertiert werden kann, deshalb hat git die Option autocrlf.
Die richtige Lösung ist hier, auf dem Server zu prüfen, ob die Datei bereits Windows-Zeilenenden enthält, falls nicht, sie in das Linux-Format zu konvertieren.

Es gibt viele Möglichkeiten, wie Text in Windows in '\r\n' konvertiert werden kann, deshalb hat git die Option autocrlf.

Aber Windows ist in keiner Weise beteiligt – Der Server ist CentOS6 und der Client ist Chrome unter OS X.

Ich werde versuchen, mein Beispiel so zu ändern, dass stattdessen ein versteckter Textbereich verwendet wird, und sehen, ob das hilft.

Nö. Wenn ich meine Testseite unter OS X mit Chrome unter OS XI ausführe, werden beim Senden immer noch die Zeichen \r angezeigt.

Ich stimme irgendwie zu, dass es nicht Aces Problem ist, da es es bis zu textarea schafft, ohne dass \r hinzugefügt werden. Aber hier geht etwas Seltsames vor und wenn wir es herausfinden können, wird es einen guten FAQ-Eintrag für Ace geben, damit andere dieses Problem nicht haben.

Okay, ich weiß also, was los ist, und ich fühle mich dumm, weil ich das nicht weiß:

Wenn Sie ein Formular POST eingeben, verwendet es den MIME-Typ application/x-www-form-urlencoded . Gemäß den W3-Formularinhaltstypen sollte ein Browser Zeilenumbrüche immer als \r\n codieren.

Das ist also, wo die \r\n ins Spiel kommen. Ich schätze, ich habe es vorher nie bemerkt.

Die Lösung besteht darin, die Serveranwendung mit den zurückkommenden Daten das „Richtige“ tun zu lassen, was möglicherweise der Fall ist
beinhalten das Ersetzen \r\n durch \n .

Danke Leute. Schließe dieses Problem. Hoffentlich findet jemand mit einem ähnlichen Problem dieses Problem hilfreich.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen