2013-02-08 14 views
6

lat temu napisałem następującą funkcję dla jednego z moich Firefox dodatki, które pomaga mi uzyskać platformy specyficzny charakter nowej linii:Uzyskiwanie znaku nowej linii w JavaScript?

GetNewLine: function() 
{ 
    var platform = navigator.platform.toLowerCase(); 

    if(platform.indexOf('win') != -1) // Windows 
     return "\r\n"; 
    else if(platform.indexOf('mac') != -1) // Mac 
     return "\r"; 
    else // *nix 
     return "\n"; 
} 

to wydaje się działać OK, ale po przeczytaniu newline Wikipedia article odnotowałem, że ostatnie systemy operacyjne Apple (OS X i nowsze) teraz używają zakończenia linii w stylu UNIX \n. W związku z tym moja mała funkcja może zwracać niewłaściwe rzeczy w tej sprawie (nie mam systemu Mac OS, na którym można go przetestować).

Czy mogę w jakiś sposób przekonać Firefoksa, jaki jest znak nowej linii? Być może jakiś rodzaj wbudowanej funkcji użyteczności? Używam tych linii w plikach tekstowych zapisanych przez moje rozszerzenie i chcę użyć tej specyficznej dla platformy, aby pliki wyglądały odpowiednio w różnych systemach.

Aktualizacja (13.02.2013): Więc po uruchomieniu połączenia navigator.platform.toLowerCase() funkcji w Mac mini (OS X), pojawia się wartość wyjściową macintel. Spowoduje to, że moja funkcja powróci \r zamiast \n, tak jak powinna.

+1

Nie moja odpowiedź, ale inteligentna: http://stackoverflow.com/a/1156388/1883464 – runspired

+0

There jest API ([nsLinebreakConverter.cpp] (http://mxr.mozilla.org/mozilla-central/source/xpcom/io/nsLinebreakConverter.cpp) [nsLinebreakConverter.h] (http://mxr.mozilla.org/ mozilla-central/source/xpcom/io/nsLinebreakConverter.h)), ale jak widać, jest nieaktualny, a co ważniejsze, jest przeznaczony tylko do użytku wewnętrznego. – paa

Odpowiedz

2

Oto, co skończyło się przy użyciu:

GetNewLine: function() 
{ 
    var OS = Components.classes["@mozilla.org/xre/app-info;1"]. 
      getService(Components.interfaces.nsIXULRuntime).OS; 

    return /winnt|os2/i.test(OS) ? "\r\n" : /mac/i.test(OS) ? "\r" : "\n"; 
} 

Jestem prawie pewien, że sprawa "mac" nigdy nie powinna się zdarzyć, ponieważ nie jest wymieniona jako opcja w zmiennej OS TARGET (którą testuję za pomocą właściwości OS w nsIXULRuntime).

0

Nie potrzeba żadnych określania, czy po prostu chcesz podzielić tekst na nowej linii, można zrobić coś takiego:

htmlstring = sNewLine.replace(/(\r\n|\n|\r)/gm, "<br>"); 

Jeśli potrzebujesz stanowiącego podstawę serwerach nowej linii, można dostać go z wywołania AJAX i coś takiego powrotu, jeśli przy użyciu ASP.NET

Environment.NewLine 
+0

Niestety, nie generuję żadnego kodu HTML (jest to zwykły plik tekstowy) i interesuje mnie znak nowej linii * klienta * (tj. System operacyjny, w którym uruchamiana jest przeglądarka Firefox). –

1

AKTUALIZACJA 1/16/15: kodowanie nie obsługuje specyficznego dla nowego wiersza znaku os.

IRC:

07:49 futpib i guess encoding is for charset only 
07:49 Will character encoding is nothing to do with OS-specific line-endings 

Jeśli używasz OS.File i TextEncoder koduje swoje \ n Os odpowiedni (Im dość pewny): https://developer.mozilla.org/en-US/docs/JavaScript_OS.File/OS.File_for_the_main_thread

let encoder = new TextEncoder();         // This encoder can be reused for several writes 
let array = encoder.encode("This is some text");     // Convert the text to an array 
let promise = OS.File.writeAtomic("file.txt", array,    // Write the array atomically to "file.txt", using as temporary 
    {tmpPath: "file.txt.tmp"});         // buffer "file.txt.tmp".