跳到内容

mathiasbynes/他

生成状态 代码覆盖率状态 依赖关系状态

(用于“HTML实体”)是一个用JavaScript编写的健壮的HTML实体编码器/解码器。它支持符合HTML的所有标准化命名字符引用,手柄模棱两可的和号和其他边缘情况就像浏览器一样,具有广泛的测试套件,并且与许多其他JavaScript解决方案相反-可以很好地处理星体Unicode符号。提供了在线演示。

安装

通过净现值法:

npm安装he

通过鲍尔:

bower安装he

通过组件:

组件安装mathiasbynens/he

在浏览器中:

<脚本 型钢混凝土="你好js"></脚本>

节点.js,操作系统.js,独角鲸、和RingoJS公司:

无功功率,无功功率  = 要求(“他”);

犀牛:

负载(“he.js”);

使用AMD加载程序,如要求JS:

要求(
  {
    “路径”:{
      “他”:'路径/目标/他'
    }
  },
  [“他”],
  功能() {
    慰问.日志();
  }
);

美国石油学会

he.版本

表示语义版本号的字符串。

he.编码(文本、选项)

此函数接受一个文本字符串,并对(默认情况下)任何不可打印的ASCII符号和&,<,>,",'、和`,将其替换为字符引用。

.编码('foo©bar≠baz𝌆qux');
//→“foo&#xA9;条&#x2260;baz&#x1D306;量子'

只要输入字符串包含允许的代码点只有,此函数的返回值始终是有效的HTML。任何无法使用字符引用表示的(无效)代码点在输入中未编码:

.编码(“foo\0 bar”);
//→“foo\0 bar”

然而,启用这个严格的选项导致无效代码点引发异常。使用严格的启用,he编码抛出(如果输入包含无效代码点)或返回有效HTML字符串。

这个选项对象是可选的。它可以识别以下属性:

使用命名引用

的默认值使用命名引用选项是这意味着编码()不会使用任何命名字符引用(例如。&副本;)在输出中-十六进制转义(例如。&#xA9;)将改用。将其设置为真的以启用命名引用。

请注意,如果担心与旧浏览器的兼容性,则应禁用此选项。

//使用全局默认设置(默认为“false”):
.编码('foo©bar≠baz𝌆qux');
//→“foo&#xA9;条&#x2260;baz&#x1D306;量子'

//将`options`对象传递给`encode`,以显式禁止命名引用:
.编码('foo©bar≠baz𝌆qux', {
  “useNamedReferences”:
});
//→'foo&#xA9;条&#x2260;baz&#x1D306;量子'

//将`options`对象传递给`encode`,以显式允许命名引用:
.编码('foo©bar≠baz𝌆qux', {
  “useNamedReferences”:真的
});
//→'foo&copy;条形图(&N);baz&#x1D306;量子'

十进制的

的默认值十进制的选项是。如果启用该选项,编码通常使用十进制转义(例如。&#169;)而不是十六进制转义(例如。&#xA9;). 除此之外,与其他选项组合时,基本行为保持不变。例如:如果两个选项都有使用命名引用十进制的已启用,命名引用(例如。&副本;)用于十进制转义。没有命名引用的HTML实体使用十进制转义进行编码。

//使用全局默认设置(默认为“false”):
.编码('foo©bar≠baz𝌆qux');
//→'foo&#xA9;条&#x2260;巴兹;量子'

//将`options`对象传递给`encode`,以显式禁用小数转义:
.编码('foo©bar≠baz𝌆qux', {
  '十进制':
});
//→“foo&#xA9;条&#x2260;baz&#x1D306;量子'

//将`options`对象传递给`encode`,以显式启用小数转义:
.编码('foo©bar≠baz𝌆qux', {
  '十进制':真的
});
//→'foo&#169;酒吧&#8800;baz&#119558;量子'

//将`options`对象传递给`encode`,以显式允许命名引用和小数转义:
.编码('foo©bar≠baz𝌆qux', {
  “useNamedReferences”:真的,
  '十进制':真的
});
//→'foo&copy;条形图(&N);baz&#119558;量子'

编码所有内容

的默认值编码所有内容选项是这意味着编码()不会对不需要转义的可打印ASCII符号使用任何字符引用。将其设置为真的对输入字符串中的每个符号进行编码。设置为时真的,此选项优先于允许不安全符号(即将后者设置为真的在这种情况下没有影响)。

//使用全局默认设置(默认为“false”):
.编码('foo©bar≠baz𝌆qux');
//→“foo&#xA9;bar≠;baz&#x1D306;量子位

//将`options`对象传递给`encode`,以显式编码所有符号:
.编码('foo©bar≠baz𝌆qux', {
  '编码所有内容':真的
});
//→“&#x66&#x6F&#x6F&#x20&#xA9&#x20&#x62&#x61&#x72&#x20&#x2260像素&#x20&#x62&#x61&#x7A&#x20&#x1D306&#x20&#x71&#x75&#x78;'

//此设置可以与“useNamedReferences”选项结合使用:
.编码('foo©bar≠baz𝌆qux', {
  '编码所有内容':真的,
  “useNamedReferences”:真的
});
//→“&#x66&#x6F&#x6F&#x20&复制&#x20&#x62&#x61&#x72&#x20中&无&#x20&#x62&#x61&#x7A&#x20&#x1D306&#x20&#x71&#x75&#x78;'

严格的

的默认值严格的选项是这意味着编码()将对您提供的任何HTML文本内容进行编码,即使其中包含导致分析错误。若要在遇到此类无效HTML时引发错误,请将严格的选择真的。此选项允许使用作为HTML解析器和HTML验证器的一部分。

//使用全局默认设置(默认为“false”,即容错模式):
.编码(“\x01”);
//→“&#x1;”

//将`options`对象传递给`encode`,以显式启用容错模式:
.编码(“\x01”, {
  “严格”:
});
//→“&#x1;”

//将`options`对象传递给`encode`,以显式启用严格模式:
.编码(“\x01”, {
  “严格”:真的
});
//→分析错误

允许不安全符号

的默认值允许不安全符号选项是。这意味着在HTML内容中使用不安全的字符(&,<,>,",'、和`)将被编码。设置为时真的,仅对非ASCII字符进行编码。如果编码所有内容选项设置为真的,此选项将被忽略。

.编码('foo©和&ampersand', {
  'allowUnsafeSymbols':真的
});
//→“foo&#xA9;和&安培数'

覆盖默认值编码全球选项

可以通过修改he.encode.选项对象。这样可以避免您传入选项对象的每个调用编码如果要使用非默认设置。

//读取全局默认设置:
.编码.选项.使用命名引用;
//默认情况下→“false”

//覆盖全局默认设置:
.编码.选项.使用名称引用 = 真的;

//使用现在为“true”的全局默认设置:
.编码('foo©bar≠baz𝌆qux');
//→'foo&copy;条形图(&N);baz&#x1D306;量子'

he.decode(html,选项)

此函数接受一个HTML字符串,并使用HTML规范第12.2.4.69节中描述的算法.

.解码('foo&copy;条形图(&N);baz&#x1D306;量子');
//→“foo©bar≠baz𝌆qux”

这个选项对象是可选的。它可以识别以下属性:

是属性值

的默认值是属性值选项是这意味着解码()将解码字符串,就像它在中使用一样HTML文档中的文本上下文.HTML具有不同的规则解析属性值中的字符引用-将此选项设置为真的将输入字符串视为用作属性值。

//使用全局默认设置(默认为“false”,即HTML文本上下文):
.解码('foo ampbar(&A)');
//→“foo&bar”

//将`options`对象传递给`decode`,以显式假定HTML文本上下文:
.解码('foo ampbar(&A)', {
  “isAttributeValue”:
});
//→“foo&bar”

//将`options`对象传递给`decode`,以显式假定HTML属性值上下文:
.解码('foo ampbar(&A)', {
  'isAttributeValue':真的
});
//→“foo和ampbar”

严格的

的默认值严格的选项是这意味着解码()将解码您输入的任何HTML文本内容,即使它包含导致分析错误。若要在遇到此类无效HTML时引发错误,请将严格的选择真的。此选项允许使用作为HTML解析器和HTML验证器的一部分。

//使用全局默认设置(默认为“false”,即容错模式):
.解码('foo ampbar(&A)');
//→“foo&bar”

//将`options`对象传递给`decode`,以显式启用容错模式:
.解码('foo ampbar(&A)', {
  “严格”:
});
//→“foo&bar”

//将`options`对象传递给`decode`,以显式启用严格模式:
.解码('foo ampbar(&A)', {
  “严格”:真的
});
//→分析错误

覆盖默认值解码全球选项

的全局默认设置解码函数可以通过修改he.decode选项对象。这样可以避免您传入选项对象的每个调用解码如果要使用非默认设置。

//读取全局默认设置:
.解码.选项.是属性值;
//默认情况下→“false”

//覆盖全局默认设置:
.解码.选项.是属性值 = 真的;

//使用全局默认设置(现在为“true”):
.解码('foo ampbar(&A)');
//→“foo和ampbar”

他逃跑了(文本)

此函数获取一个文本字符串并将其转义,以便在XML或HTML文档的文本上下文中使用。仅转义了以下字符:&,<,>,",'、和`.

.逃跑('<img src=\'x\'onerror=“prompt(1)”>');
//→“&lt;img src=&#x27;x&#x27;onerror=&quot;提示(1)&quot&gt;'

he.unescape(html,选项)

he.unescape公司是的别名he.解码。它接受一个HTML字符串,并对其中的任何命名字符和数字字符引用进行解码。

使用二元的

要使用在shell中使用二进制文件,只需安装全局使用npm:

npm安装-g he

之后,您将能够从命令行对HTML实体进行编码/解码:

$he—编码'föo公司巴茨'(f)&#xF6;o&#x2665;b&#xE5;r&#x1D306;巴兹$he--编码--使用命名引用'福欧巴茨'(f)&ouml公司;o(o)&心脏;b条&共享;第页&#x1D306;巴兹$he—解码'字体(&O);o心形;共享(&A);r&#x1D306;巴兹'福欧巴茨

读取本地文本文件,对其进行编码以在HTML文本上下文中使用,并将结果保存到新文件中:

$he—编码<文件夹.txt>foo-escaped.html

或者对联机文本文件执行相同操作:

$curl-sL"网址:http://git.io/HnfEaw" |he—编码>转义.html

或者,相反,在文本上下文中读取包含HTML片段的本地文件,将其解码为纯文本,然后将结果保存到新文件中:

$he—解码<foo-escaped.html>食品.txt

或者对联机HTML片段执行相同操作:

$curl-sL"网址:http://git.io/HnfEaw" |他——解码>解码.txt

请参见他——帮助查看完整的选项列表。

支持

至少在以下方面进行过测试:

  • 铬27-50
  • 火狐3-45
  • 野生动物园4-9
  • 歌剧10-12、15-37
  • 工业工程6–11
  • 边缘
  • 独角鲸0.3.2
  • 节点.js v0.10、v0.12、v4、v5
  • 幻影JS 1.9.0
  • 犀牛1.7RC4
  • 林戈JS 0.8-0.11

单元测试和代码覆盖率

克隆此存储库后,运行npm安装安装开发和测试所需的依赖项。您可能想安装伊斯坦布尔全球地使用安装伊斯坦布尔核电站-g.

完成后,可以使用以下命令在Node中运行单元测试npm测试节点测试/tests.js。要在Rhino、Ringo、Narwhal和web浏览器中运行测试,请使用呼噜声试验.

要生成代码覆盖率报告,请使用咕噜声掩护.

致谢

多亏了西蒙·彼得斯(@zcorpan公司)对于许多建议。

作者

推特/马提亚斯
马蒂亚斯·拜恩斯

许可证

可在麻省理工学院许可证。