2015-11-28 2 views
6

Отказ от ответственности: Я новенькая ElmКак я могу получить специальные символы, используя модуль elm-html?

Я возиться с онлайн редактором Elm и я столкнулся с проблемой. Я не могу найти способ получить определенные специальные символы (авторское право, товарный знак и т. Д.). Я пробовал:

import Html exposing (text) 

main = 
    text "©" 

Все, что обнаружился был фактический текст ©. Я также пытался использовать юникод характер для него \u00A9 но в конечном итоге дает мне ошибку синтаксиса:

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

Единственный способ я нашел на самом деле пойти к кому-нибудь сайт и копировать/вставить их символ авторского права в мое приложение :

import Html exposing (text) 

main = 
    text "©" 

Это работает, но я предпочел бы иметь возможность вводить эти символы быстро, вместо того, чтобы выследить фактические символы на других сайтах. Есть ли предпочтительный/рекомендуемый метод получения неэкранированного текста при возврате HTML в Elm?


Edit:

Специально для Mac:

  • вариант + г дает ©
  • вариант + 2 дает
  • вариант + г дает ®

Все протестированы в онлайн-редакторе, и они работали. Это все еще не атакует основную проблему, но для этих конкретных специальных символов это просто замечательно.

ответ

7

Почему это (намеренно) не так легко

В «производители» вяза, по понятным причинам не хотят, чтобы дать нам возможность вставить «специальные» символы в HTML-текст. Две основные причины:

  1. Это откроет отверстие для ввода текста, в котором злоумышленник может вставить любые HTML-теги, даже код JavaScript, в веб-страницу. Представьте себе, можете ли вы сделать это на сайте форума, таком как Stack Overflow: вы можете обмануть любого, кто читает ваш вклад в выполнение кода по вашему выбору в своем браузере.
  2. Elm работает, чтобы получить оптимальные обновления DOM. Это работает только с содержимым тегов, о которых знает Элм, а не с текстом, который содержит теги. Когда люди вставляют текст, содержащий теги HTML в программу Elm, в конечном итоге становятся частью DOM, которые невозможно оптимизировать.

Как это возможно в любом случае

Тем не менее, сообщество пользователей Elm нашел лазейку, который предоставляет обходной путь. По причинам, указанным выше, не рекомендуется, особенно нет, если ваш текст непостоянный, т. Е. Исходит из источника вне вашей программы. Тем не менее, люди будут хотеть сделать это в любом случае, так что я буду документировать его, чтобы спасти другие неприятности я рытье всех и получить его работать:

  1. Если вы уже не имеете его,
    import Json.Encode exposing (string)
    Это в пакете elm-lang/core, поэтому он уже должен быть в ваших зависимостях.
  2. Аналогично,
    import Html.Attributes exposing (property)
  3. Наконец, создать тег, имеющий JSON-значение представления в property "innerHTML" и вашего текста, например:
    span [ property "innerHTML" (string " ") ] []
+1

Хотя я больше не использую Elm, это отличное объяснение того, как «взломать» решение, но почему бы не сделать это. Я думаю, что это правильный ответ на исходный вопрос. Спасибо, и я надеюсь, что это поможет кому-нибудь еще узнать об этом. – Sam

1

Вам не нужно искать символы, вы можете получить их из списка, например this one.

Если это слишком надоедливым, чтобы скопировать & пасту, вы можете также создать вспомогательную функцию, которую можно использовать с уцелевших символов, как это:

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 nk вас. Наверное, я был немного драматичным, когда сказал «охоту» :). Хотя это хорошая вспомогательная функция, на самом деле она не решает проблему копирования/вставки фактического символа авторского права (или любого другого символа, а не на клавиатуре) с другого веб-сайта в мой код. Но большой плюс этой вспомогательной функции заключается в том, что мне нужно будет только скопировать/вставить один раз. Затем я могу использовать обычные строки, которые HTML обычно распознает во всем приложении. – Sam

3

Я недавно создал Elm package, который решает эту проблему. Если вы используете text' "&copy;", он отобразит символ защиты © вместо кода выхода. Также работает с "&#169;" и "&#x000A9;". Надеюсь это поможет!

+0

Джейсон, радость в твоей тяжелой работе! Это выглядит очень практично. Но выполнение работы браузера, интерпретирующей объекты для работы с Html.text, выглядит немного глупым для меня. Я продолжу искать более «элегантное» решение. –

2

я обнаружил, что есть лучшее решение: вы можете преобразовать специальные символы из Unicode в char, а затем создать строку из char:

resString = String.fromChar (Char.fromCode 187) 
Смежные вопросы