如何使用elm-html模块获取特殊字符?

时间:2015-11-28 12:34:35

标签: elm

免责声明:我是榆树的新手

我正在摆弄在线榆树编辑器,我遇到了一个问题。我找不到让某些特殊字符(版权,商标等)出现的方法。我试过了:

import Html exposing (text)

main =
  text "©"

显示的只是实际文字©。我也尝试使用unicode字符\u00A9,但最终给我一个语法错误:

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

我找到的唯一方法是实际访问某人的网站并将其版权符号复制/粘贴到我的应用中:

import Html exposing (text)

main =
  text "©"

这很有效,但我宁愿能够快速输入这些字符,而不必去寻找其他网站上的实际符号。在Elm中返回HTML时是否有首选/推荐的获取非转义文本的方法?


修改

专门针对Mac:

  • 选项+ g为您提供©
  • 选项+ 2为您提供
  • 选项+ r为您提供®

所有测试都在在线编辑器中进行了测试。这仍然没有攻击核心问题,但对于这些特定的特殊字符来说,这只是一件好事。

5 个答案:

答案 0 :(得分:17)

为什么会这样(故意)不那么容易

榆树的“制造者”不愿意给我们提供一种在HTML文本中插入“特殊”字符的方法。两个主要原因:

  1. 这将打开一个“文本注入”漏洞,恶意用户可以将任何HTML标记(甚至JavaScript代码)插入到网页中。想象一下,如果你能在像Stack Overflow这样的论坛网站上做到这一点:你可以欺骗任何阅读你贡献的人在你的浏览器中执行你选择的代码。
  2. Elm努力工作以产生最佳的DOM更新。这仅适用于Elm知道的标记内容,而不适用于恰好包含标记的文本。当人们在Elm程序中插入包含HTML标签的文本时,最终会成为无法优化的DOM的一部分。
  3. 无论如何可能

    也就是说,榆树用户社区已找到一个漏洞,可以提供解决方法。由于上述原因,不建议使用尤其,如果您的文本不是常量,即来自程序外部的来源。尽管如此,人们仍然希望这样做,所以我要记录它以拯救其他人我在挖掘所有东西并让它工作的麻烦:

    1. 如果您还没有,请 import Json.Encode exposing (string)
      这是在elm-lang/core包中,因此它应该已经存在于您的依赖项中。
    2. 类似地,
      import Html.Attributes exposing (property)
    3. 最后,创建一个标签,其中包含property "innerHTML"和您文本的JSON-Value表示,例如: span [ property "innerHTML" (string " ") ] []

答案 1 :(得分:9)

我发现,有一个更好的解决方案: 您可以将特殊字符从Unicode转换为char,然后从char:

创建一个字符串
resString = String.fromChar (Char.fromCode 187)

答案 2 :(得分:7)

您可以在Elm字符串和字符中直接使用Unicode转义代码:

我们有一个util模块,其中包含我们所有的特殊字符,例如:

module Utils.SpecialChars exposing (noBreakSpace)

noBreakSpace : Char
noBreakSpace = '\x00A0'

可以用作:

let
  emptyLabel = String.fromChar noBreakSpace
in
label []
    [ span [ ] [ text emptyLabel ]
    ]

这将呈现<span>&nbsp;</span>

答案 3 :(得分:3)

我最近创建了一个解决此问题的Elm package。如果您使用text' "&copy;",它将呈现版权符号©而不是转义码。也适用于"&#169;""&#x000A9;"。希望这有帮助!

答案 4 :(得分:2)

您无需搜寻符号,您可以从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;"