2015-11-28 7 views
6

Disclaimer: io sono nuovo di zecca per ElmCome posso ottenere caratteri speciali usando il modulo elm-html?

sto trafficando con l'editor Elm on-line e che ho incontrato un problema. Non riesco a trovare un modo per ottenere determinati caratteri speciali (copyright, marchio commerciale, ecc.) Da mostrare. Ho provato:

import Html exposing (text) 

main = 
    text "©" 

Tutto ciò che si presentò era il testo vero e proprio ©. Ho anche cercato di utilizzare il carattere unicode per esso \u00A9 ma che ha finito per avermi dato un errore di sintassi:

(line 1, column 16): unexpected "u" expecting space, "&" or escape code 

L'unico modo che ho trovato è stato quello di andare effettivamente al sito di qualcuno e copia/incolla il simbolo di copyright nella mia app :

import Html exposing (text) 

main = 
    text "©" 

Questo funziona, ma preferirei di gran lunga essere in grado di digitare questi caratteri rapidamente, invece di dover dare la caccia ai simboli effettivi su altri siti web. Esiste un metodo preferito/consigliato per ottenere testo senza escape quando si restituisce l'HTML in Elm?


Edit:

particolare per Mac:

  • opzione + g ti dà ©
  • opzione + 2 ti dà
  • opzione + r ti dà ®

Tutti testati nell'editor online e hanno funzionato. Questo ancora non attacca il problema principale, ma è solo qualcosa di carino da notare per questi specifici caratteri speciali.

risposta

7

Perché questo è (volutamente) non così facile

I "responsabili" di Elm sono comprensibilmente riluttanti a darci un modo per inserire caratteri "speciali" in testo HTML. Due motivi principali:

  1. Questa avrebbero aperto un "testo di iniezione" buco in cui un utente malintenzionato potrebbe inserire alcun tag HTML, anche il codice JavaScript, in una pagina Web. Immagina di poterlo fare in un sito di forum come Stack Overflow: potresti ingannare chiunque leggendo il tuo contributo nell'esecuzione del codice che hai scelto nel browser.
  2. Elm lavora sodo per produrre aggiornamenti DOM ottimali. Funziona solo con il contenuto dei tag di cui Elm è a conoscenza, non con il testo che contiene tag. Quando le persone inseriscono testo contenente tag HTML in un programma Elm, finiscono per essere parti del DOM che non possono essere ottimizzate.

Come è possibile in ogni caso

Detto questo, la comunità di utenti Elm ha trovato una scappatoia che permette una soluzione. Per i motivi di cui sopra, non è consigliabile, in particolare, non se il tuo testo non è costante, cioè proviene da una fonte esterna al tuo programma. Eppure, la gente verrà voglia di fare questo comunque, quindi ho intenzione di documentarlo per salvare gli altri i problemi che avevo a scavare tutto e farlo funzionare:

  1. Se non lo avete già,
    import Json.Encode exposing (string)
    Questo è nel pacchetto elm-lang/core quindi dovrebbe già essere nelle dipendenze.
  2. Allo stesso modo,
    import Html.Attributes exposing (property)
  3. Infine, creare un tag con un una rappresentazione property "innerHTML" e JSON-valore del testo, ad esempio:
    span [ property "innerHTML" (string " ") ] []
+1

Anche se non uso più Elm, questa è una grande spiegazione su come "hackerare" una soluzione, ma perché non farlo. Penso che questa sia la risposta corretta alla domanda originale. Grazie e spero che questo aiuti chiunque altro curioso di questo. – Sam

1

Non è necessario cercare i simboli, è possibile ottenerli da un elenco come this one.

Se è troppo fastidioso per copiare & incolla, è anche possibile creare una funzione di supporto che è possibile utilizzare con i vostri caratteri di escape in questo modo:

import Html exposing (..) 
import String 

htmlDecode str = 
    let 
    replace (s1, s2) src= String.join s2 <| String.split s1 src  
    chrmap = 
     [ ("&reg;", "®") 
     , ("&copy;", "©") 
     ] 
    in 
    List.foldl replace str chrmap 

main = text <| htmlDecode "hello &copy;" 
+0

Tha tu no. Immagino di essere un po 'drammatico quando ho detto "caccia" :). Anche se questa è una bella funzione di aiuto, in realtà non risolve il problema di dover copiare/incollare il vero simbolo del copyright (o qualsiasi altro simbolo non su una tastiera) da un altro sito web nel mio codice. Ma il grande vantaggio di questa funzione di aiuto è che dovrei solo copiare/incollare una volta. Quindi posso usare le normali stringhe che l'HTML riconosce solitamente in tutta la mia applicazione. – Sam

3

Recentemente ho creato un Elm package che risolve questo. Se si utilizza text' "&copy;", verrà visualizzato il simbolo © del copyright anziché il codice di escape. Funziona anche con "&#169;" e "&#x000A9;". Spero che questo ti aiuti!

+0

Jason, complimenti per il tuo duro lavoro su questo! Sembra molto pratico. Ma interpretare le entità del lavoro del browser per aggirare Html.text mi sembra un po 'sconcertante. Continuerò a cercare una soluzione più "elegante". –

2

ho trovato, che ci sia una soluzione migliore: è possibile convertire caratteri speciali da Unicode in char e quindi creare una stringa da char:

resString = String.fromChar (Char.fromCode 187)