├── .covignore ├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── LICENSE.txt ├── README.md ├── bower.json ├── build └── htmlencode.min.js ├── index.d.ts ├── package.json ├── src └── htmlencode.js └── tests ├── index.html ├── node-test.js └── test.js /.covignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | /tests/ 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | /covreporter/ 3 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "0.12.15" 4 | - "4.5" 5 | - "6.5.0" 6 | before_install: 7 | - npm install coveralls 8 | - npm install mocha-lcov-reporter 9 | script: npm run-script coveralls 10 | branches: 11 | only: 12 | - master 13 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | ## v0.3.0 / 2017-02-10 4 | ### Added 5 | - AMD support. 6 | 7 | ### Fixed 8 | - `root` is undefined in some special environment. 9 | 10 | ## v0.2.0 / 2016-08-30 11 | ### Added 12 | - TypeScript support. 13 | - unit tests to 100% coverage. 14 | 15 | ## v0.1.1 / 2015-01-09 16 | ### Added 17 | - bower package. 18 | - coveralls. 19 | 20 | ### Improved 21 | - test framework. 22 | 23 | ## v0.1.0 / 2014-12-30 24 | ### Added 25 | - create project. 26 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright 2014-2017 Chen, Yi-Cyuan 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # js-htmlencode 2 | [![Build Status](https://api.travis-ci.org/emn178/js-htmlencode.png)](https://travis-ci.org/emn178/js-htmlencode) 3 | [![Build Status](https://coveralls.io/repos/emn178/js-htmlencode/badge.png?branch=master)](https://coveralls.io/r/emn178/js-htmlencode?branch=master) 4 | [![NPM](https://nodei.co/npm/js-htmlencode.png?stars&downloads)](https://nodei.co/npm/js-htmlencode/) 5 | A simple HTML encode / decode function for JavaScript. 6 | 7 | ## Demo 8 | [HTML Encode Online](http://emn178.github.io/online-tools/html_encode.html) 9 | [HTML Decode Online](http://emn178.github.io/online-tools/html_decode.html) 10 | 11 | ## Download 12 | [Compress](https://raw.github.com/emn178/js-htmlencode/master/build/htmlencode.min.js) 13 | [Uncompress](https://raw.github.com/emn178/js-htmlencode/master/src/htmlencode.js) 14 | 15 | ## Installation 16 | You can also install js-htmlencode by using Bower. 17 | 18 | bower install js-htmlencode 19 | 20 | For node.js, you can use this command to install: 21 | 22 | npm install js-htmlencode 23 | 24 | ## Usage 25 | You could use like this: 26 | ```JavaScript 27 | htmlEncode('Html to encode'); 28 | htmlDecode('String to decode'); 29 | ``` 30 | If you use node.js, you should require the module first: 31 | ```JavaScript 32 | var htmlEncode = require('js-htmlencode'); 33 | ``` 34 | Or 35 | ```JavaScript 36 | var htmlEncode = require('js-htmlencode').htmlEncode; 37 | var htmlDecode = require('js-htmlencode').htmlDecode; 38 | ``` 39 | It supports AMD: 40 | ```JavaScript 41 | require(['your/path/htmlencode.js'], function (htmlEncode) { 42 | var htmlEncode = htmlEncode.htmlEncode; 43 | var htmlDecode = htmlDecode.htmlDecode; 44 | // ... 45 | }); 46 | ``` 47 | For TypeScript 48 | ```TypeScript 49 | import { htmlEncode, htmlDecode } from 'js-htmlencode'; 50 | htmlEncode('ooo'); 51 | htmlDecode('xxx'); 52 | ``` 53 | ## Example 54 | ```JavaScript 55 | htmlEncode('HTML Encode'); // <a href="#">HTML Encode</a> 56 | htmlDecode('<a href="#">HTML Encode</a>'); // HTML Encode 57 | htmlDecode('HTML Encode'); // HTML Encode 58 | ``` 59 | 60 | ## License 61 | The project is released under the [MIT license](http://www.opensource.org/licenses/MIT). 62 | 63 | ## Contact 64 | The project's website is located at https://github.com/emn178/js-htmlencode 65 | Author: Chen, Yi-Cyuan (emn178@gmail.com) 66 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "js-htmlencode", 3 | "version": "0.3.0", 4 | "main": ["src/htmlencode.js"], 5 | "ignore": [ 6 | "samples", 7 | "tests" 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /build/htmlencode.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * [js-htmlencode]{@link https://github.com/emn178/js-htmlencode} 3 | * 4 | * @version 0.3.0 5 | * @author Chen, Yi-Cyuan [emn178@gmail.com] 6 | * @copyright Chen, Yi-Cyuan 2014-2017 7 | * @license MIT 8 | */ 9 | !function(){"use strict";var e="object"==typeof window?window:{},r=!e.JS_HTMLENCODE_NO_NODE_JS&&"object"==typeof process&&process.versions&&process.versions.node;r&&(e=global);var a=!e.JS_HTMLENCODE_NO_COMMON_JS&&"object"==typeof module&&module.exports,i="function"==typeof define&&define.amd,t={" ":" ","¡":"¡","¢":"¢","£":"£","¤":"¤","¥":"¥","¦":"¦","§":"§","¨":"¨","©":"©","ª":"ª","«":"«","¬":"¬","­":"­","®":"®","¯":"¯","°":"°","±":"±","²":"²","³":"³","´":"´","µ":"µ","¶":"¶","·":"·","¸":"¸","¹":"¹","º":"º","»":"»","¼":"¼","½":"½","¾":"¾","¿":"¿","À":"À","Á":"Á","Â":"Â","Ã":"Ã","Ä":"Ä","Å":"Å","Æ":"Æ","Ç":"Ç","È":"È","É":"É","Ê":"Ê","Ë":"Ë","Ì":"Ì","Í":"Í","Î":"Î","Ï":"Ï","Ð":"Ð","Ñ":"Ñ","Ò":"Ò","Ó":"Ó","Ô":"Ô","Õ":"Õ","Ö":"Ö","×":"×","Ø":"Ø","Ù":"Ù","Ú":"Ú","Û":"Û","Ü":"Ü","Ý":"Ý","Þ":"Þ","ß":"ß","à":"à","á":"á","â":"â","ã":"ã","ä":"ä","å":"å","æ":"æ","ç":"ç","è":"è","é":"é","ê":"ê","ë":"ë","ì":"ì","í":"í","î":"î","ï":"ï","ð":"ð","ñ":"ñ","ò":"ò","ó":"ó","ô":"ô","õ":"õ","ö":"ö","÷":"÷","ø":"ø","ù":"ù","ú":"ú","û":"û","ü":"ü","ý":"ý","þ":"þ","ÿ":"ÿ",""":'"',"&":"&","<":"<",">":">","'":"'","Œ":"Œ","œ":"œ","Š":"Š","š":"š","Ÿ":"Ÿ","ˆ":"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€","ƒ":"ƒ","Α":"Α","Β":"Β","Γ":"Γ","Δ":"Δ","Ε":"Ε","Ζ":"Ζ","Η":"Η","Θ":"Θ","Ι":"Ι","Κ":"Κ","Λ":"Λ","Μ":"Μ","Ν":"Ν","Ξ":"Ξ","Ο":"Ο","Π":"Π","Ρ":"Ρ","Σ":"Σ","Τ":"Τ","Υ":"Υ","Φ":"Φ","Χ":"Χ","Ψ":"Ψ","Ω":"Ω","α":"α","β":"β","γ":"γ","δ":"δ","ε":"ε","ζ":"ζ","η":"η","θ":"θ","ι":"ι","κ":"κ","λ":"λ","μ":"μ","ν":"ν","ξ":"ξ","ο":"ο","π":"π","ρ":"ρ","ς":"ς","σ":"σ","τ":"τ","υ":"υ","φ":"φ","χ":"χ","ψ":"ψ","ω":"ω","ϑ":"ϑ","ϒ":"ϒ","ϖ":"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄","℘":"℘","ℑ":"ℑ","ℜ":"ℜ","™":"™","ℵ":"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","⟨":"〈","⟩":"〉","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"},o=function(e){if("#"!==e.charAt(1))return t[e]||e;var r,a=e.charAt(2);return"x"===a||"X"===a?(a=e.substring(3,e.length-1),r=parseInt(a,16)):(a=e.substring(2,e.length-1),r=parseInt(a)),isNaN(r)?e:String.fromCharCode(r)},l=function(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")},u=function(e){return e.replace(/&#?\w+;/g,o)},c=l;l.htmlEncode=l,l.htmlDecode=u,a?module.exports=c:(e.htmlEncode=l,e.htmlDecode=u,i&&define(function(){return c}))}(); -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | interface decode { 2 | /** 3 | * HTML Decode 4 | * 5 | * @param str The content you want to HTML decode. 6 | */ 7 | (str: string): string; 8 | } 9 | 10 | interface encode { 11 | /** 12 | * HTML Encode 13 | * 14 | * @param str The content you want to HTML encode. 15 | */ 16 | (str: string): string; 17 | } 18 | 19 | export var htmlEncode: encode; 20 | export var htmlDecode: decode; 21 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "js-htmlencode", 3 | "version": "0.3.0", 4 | "description": "A simple HTML encode / decode function for JavaScript.", 5 | "main": "src/htmlencode.js", 6 | "typings": "index", 7 | "devDependencies": { 8 | "expect.js": "~0.3.1", 9 | "jscoverage": "~0.5.9", 10 | "mocha": "^3.0.2", 11 | "uglifyjs": "~2.4.10" 12 | }, 13 | "scripts": { 14 | "test": "mocha tests/node-test.js -r jscoverage", 15 | "report": "mocha tests/node-test.js -r jscoverage --covout=html", 16 | "coveralls": "mocha tests/node-test.js -R mocha-lcov-reporter -r jscoverage | coveralls", 17 | "build": "uglifyjs src/htmlencode.js --compress --mangle --comments --output build/htmlencode.min.js" 18 | }, 19 | "repository": { 20 | "type": "git", 21 | "url": "https://github.com/emn178/js-htmlencode.git" 22 | }, 23 | "keywords": [ 24 | "htmlencode", 25 | "htmldecode", 26 | "encode", 27 | "decode" 28 | ], 29 | "license": "MIT", 30 | "author": "emn178 ", 31 | "homepage": "https://github.com/emn178/js-htmlencode", 32 | "bugs": { 33 | "url": "https://github.com/emn178/js-htmlencode/issues" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/htmlencode.js: -------------------------------------------------------------------------------- 1 | /** 2 | * [js-htmlencode]{@link https://github.com/emn178/js-htmlencode} 3 | * 4 | * @version 0.3.0 5 | * @author Chen, Yi-Cyuan [emn178@gmail.com] 6 | * @copyright Chen, Yi-Cyuan 2014-2017 7 | * @license MIT 8 | */ 9 | /*jslint bitwise: true */ 10 | (function () { 11 | 'use strict'; 12 | 13 | var root = typeof window === 'object' ? window : {}; 14 | var NODE_JS = !root.JS_HTMLENCODE_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node; 15 | if (NODE_JS) { 16 | root = global; 17 | } 18 | var COMMON_JS = !root.JS_HTMLENCODE_NO_COMMON_JS && typeof module === 'object' && module.exports; 19 | var AMD = typeof define === 'function' && define.amd; 20 | 21 | var HTML_ENTITIES = { 22 | ' ' : '\u00A0', 23 | '¡' : '\u00A1', 24 | '¢' : '\u00A2', 25 | '£' : '\u00A3', 26 | '¤' : '\u00A4', 27 | '¥' : '\u00A5', 28 | '¦' : '\u00A6', 29 | '§' : '\u00A7', 30 | '¨' : '\u00A8', 31 | '©' : '\u00A9', 32 | 'ª' : '\u00AA', 33 | '«' : '\u00AB', 34 | '¬' : '\u00AC', 35 | '­' : '\u00AD', 36 | '®' : '\u00AE', 37 | '¯' : '\u00AF', 38 | '°' : '\u00B0', 39 | '±' : '\u00B1', 40 | '²' : '\u00B2', 41 | '³' : '\u00B3', 42 | '´' : '\u00B4', 43 | 'µ' : '\u00B5', 44 | '¶' : '\u00B6', 45 | '·' : '\u00B7', 46 | '¸' : '\u00B8', 47 | '¹' : '\u00B9', 48 | 'º' : '\u00BA', 49 | '»' : '\u00BB', 50 | '¼' : '\u00BC', 51 | '½' : '\u00BD', 52 | '¾' : '\u00BE', 53 | '¿' : '\u00BF', 54 | 'À' : '\u00C0', 55 | 'Á' : '\u00C1', 56 | 'Â' : '\u00C2', 57 | 'Ã' : '\u00C3', 58 | 'Ä' : '\u00C4', 59 | 'Å' : '\u00C5', 60 | 'Æ' : '\u00C6', 61 | 'Ç' : '\u00C7', 62 | 'È' : '\u00C8', 63 | 'É' : '\u00C9', 64 | 'Ê' : '\u00CA', 65 | 'Ë' : '\u00CB', 66 | 'Ì' : '\u00CC', 67 | 'Í' : '\u00CD', 68 | 'Î' : '\u00CE', 69 | 'Ï' : '\u00CF', 70 | 'Ð' : '\u00D0', 71 | 'Ñ' : '\u00D1', 72 | 'Ò' : '\u00D2', 73 | 'Ó' : '\u00D3', 74 | 'Ô' : '\u00D4', 75 | 'Õ' : '\u00D5', 76 | 'Ö' : '\u00D6', 77 | '×' : '\u00D7', 78 | 'Ø' : '\u00D8', 79 | 'Ù' : '\u00D9', 80 | 'Ú' : '\u00DA', 81 | 'Û' : '\u00DB', 82 | 'Ü' : '\u00DC', 83 | 'Ý' : '\u00DD', 84 | 'Þ' : '\u00DE', 85 | 'ß' : '\u00DF', 86 | 'à' : '\u00E0', 87 | 'á' : '\u00E1', 88 | 'â' : '\u00E2', 89 | 'ã' : '\u00E3', 90 | 'ä' : '\u00E4', 91 | 'å' : '\u00E5', 92 | 'æ' : '\u00E6', 93 | 'ç' : '\u00E7', 94 | 'è' : '\u00E8', 95 | 'é' : '\u00E9', 96 | 'ê' : '\u00EA', 97 | 'ë' : '\u00EB', 98 | 'ì' : '\u00EC', 99 | 'í' : '\u00ED', 100 | 'î' : '\u00EE', 101 | 'ï' : '\u00EF', 102 | 'ð' : '\u00F0', 103 | 'ñ' : '\u00F1', 104 | 'ò' : '\u00F2', 105 | 'ó' : '\u00F3', 106 | 'ô' : '\u00F4', 107 | 'õ' : '\u00F5', 108 | 'ö' : '\u00F6', 109 | '÷' : '\u00F7', 110 | 'ø' : '\u00F8', 111 | 'ù' : '\u00F9', 112 | 'ú' : '\u00FA', 113 | 'û' : '\u00FB', 114 | 'ü' : '\u00FC', 115 | 'ý' : '\u00FD', 116 | 'þ' : '\u00FE', 117 | 'ÿ' : '\u00FF', 118 | '"' : '\u0022', 119 | '&' : '\u0026', 120 | '<' : '\u003C', 121 | '>' : '\u003E', 122 | ''' : '\u0027', 123 | 'Œ' : '\u0152', 124 | 'œ' : '\u0153', 125 | 'Š' : '\u0160', 126 | 'š' : '\u0161', 127 | 'Ÿ' : '\u0178', 128 | 'ˆ' : '\u02C6', 129 | '˜' : '\u02DC', 130 | ' ' : '\u2002', 131 | ' ' : '\u2003', 132 | ' ' : '\u2009', 133 | '‌' : '\u200C', 134 | '‍' : '\u200D', 135 | '‎' : '\u200E', 136 | '‏' : '\u200F', 137 | '–' : '\u2013', 138 | '—' : '\u2014', 139 | '‘' : '\u2018', 140 | '’' : '\u2019', 141 | '‚' : '\u201A', 142 | '“' : '\u201C', 143 | '”' : '\u201D', 144 | '„' : '\u201E', 145 | '†' : '\u2020', 146 | '‡' : '\u2021', 147 | '‰' : '\u2030', 148 | '‹' : '\u2039', 149 | '›' : '\u203A', 150 | '€' : '\u20AC', 151 | 'ƒ' : '\u0192', 152 | 'Α' : '\u0391', 153 | 'Β' : '\u0392', 154 | 'Γ' : '\u0393', 155 | 'Δ' : '\u0394', 156 | 'Ε' : '\u0395', 157 | 'Ζ' : '\u0396', 158 | 'Η' : '\u0397', 159 | 'Θ' : '\u0398', 160 | 'Ι' : '\u0399', 161 | 'Κ' : '\u039A', 162 | 'Λ' : '\u039B', 163 | 'Μ' : '\u039C', 164 | 'Ν' : '\u039D', 165 | 'Ξ' : '\u039E', 166 | 'Ο' : '\u039F', 167 | 'Π' : '\u03A0', 168 | 'Ρ' : '\u03A1', 169 | 'Σ' : '\u03A3', 170 | 'Τ' : '\u03A4', 171 | 'Υ' : '\u03A5', 172 | 'Φ' : '\u03A6', 173 | 'Χ' : '\u03A7', 174 | 'Ψ' : '\u03A8', 175 | 'Ω' : '\u03A9', 176 | 'α' : '\u03B1', 177 | 'β' : '\u03B2', 178 | 'γ' : '\u03B3', 179 | 'δ' : '\u03B4', 180 | 'ε' : '\u03B5', 181 | 'ζ' : '\u03B6', 182 | 'η' : '\u03B7', 183 | 'θ' : '\u03B8', 184 | 'ι' : '\u03B9', 185 | 'κ' : '\u03BA', 186 | 'λ' : '\u03BB', 187 | 'μ' : '\u03BC', 188 | 'ν' : '\u03BD', 189 | 'ξ' : '\u03BE', 190 | 'ο' : '\u03BF', 191 | 'π' : '\u03C0', 192 | 'ρ' : '\u03C1', 193 | 'ς' : '\u03C2', 194 | 'σ' : '\u03C3', 195 | 'τ' : '\u03C4', 196 | 'υ' : '\u03C5', 197 | 'φ' : '\u03C6', 198 | 'χ' : '\u03C7', 199 | 'ψ' : '\u03C8', 200 | 'ω' : '\u03C9', 201 | 'ϑ' : '\u03D1', 202 | 'ϒ' : '\u03D2', 203 | 'ϖ' : '\u03D6', 204 | '•' : '\u2022', 205 | '…' : '\u2026', 206 | '′' : '\u2032', 207 | '″' : '\u2033', 208 | '‾' : '\u203E', 209 | '⁄' : '\u2044', 210 | '℘' : '\u2118', 211 | 'ℑ' : '\u2111', 212 | 'ℜ' : '\u211C', 213 | '™' : '\u2122', 214 | 'ℵ' : '\u2135', 215 | '←' : '\u2190', 216 | '↑' : '\u2191', 217 | '→' : '\u2192', 218 | '↓' : '\u2193', 219 | '↔' : '\u2194', 220 | '↵' : '\u21B5', 221 | '⇐' : '\u21D0', 222 | '⇑' : '\u21D1', 223 | '⇒' : '\u21D2', 224 | '⇓' : '\u21D3', 225 | '⇔' : '\u21D4', 226 | '∀' : '\u2200', 227 | '∂' : '\u2202', 228 | '∃' : '\u2203', 229 | '∅' : '\u2205', 230 | '∇' : '\u2207', 231 | '∈' : '\u2208', 232 | '∉' : '\u2209', 233 | '∋' : '\u220B', 234 | '∏' : '\u220F', 235 | '∑' : '\u2211', 236 | '−' : '\u2212', 237 | '∗' : '\u2217', 238 | '√' : '\u221A', 239 | '∝' : '\u221D', 240 | '∞' : '\u221E', 241 | '∠' : '\u2220', 242 | '∧' : '\u2227', 243 | '∨' : '\u2228', 244 | '∩' : '\u2229', 245 | '∪' : '\u222A', 246 | '∫' : '\u222B', 247 | '∴' : '\u2234', 248 | '∼' : '\u223C', 249 | '≅' : '\u2245', 250 | '≈' : '\u2248', 251 | '≠' : '\u2260', 252 | '≡' : '\u2261', 253 | '≤' : '\u2264', 254 | '≥' : '\u2265', 255 | '⊂' : '\u2282', 256 | '⊃' : '\u2283', 257 | '⊄' : '\u2284', 258 | '⊆' : '\u2286', 259 | '⊇' : '\u2287', 260 | '⊕' : '\u2295', 261 | '⊗' : '\u2297', 262 | '⊥' : '\u22A5', 263 | '⋅' : '\u22C5', 264 | '⌈' : '\u2308', 265 | '⌉' : '\u2309', 266 | '⌊' : '\u230A', 267 | '⌋' : '\u230B', 268 | '⟨' : '\u2329', 269 | '⟩' : '\u232A', 270 | '◊' : '\u25CA', 271 | '♠' : '\u2660', 272 | '♣' : '\u2663', 273 | '♥' : '\u2665', 274 | '♦' : '\u2666' 275 | }; 276 | 277 | var decodeEntity = function (code) { 278 | // name type 279 | if (code.charAt(1) !== '#') { 280 | return HTML_ENTITIES[code] || code; 281 | } 282 | 283 | var n, c = code.charAt(2); 284 | // hex number 285 | if (c === 'x' || c === 'X') { 286 | c = code.substring(3, code.length - 1); 287 | n = parseInt(c, 16); 288 | } else { 289 | c = code.substring(2, code.length - 1); 290 | n = parseInt(c); 291 | } 292 | return isNaN(n) ? code : String.fromCharCode(n); 293 | }; 294 | 295 | var htmlEncode = function (str) { 296 | return str.replace(/&/g, '&').replace(/"/g, '"').replace(/'/g, ''') 297 | .replace(//g, '>'); 298 | }; 299 | 300 | var htmlDecode = function (str) { 301 | return str.replace(/&#?\w+;/g, decodeEntity); 302 | }; 303 | 304 | var exports = htmlEncode; 305 | htmlEncode.htmlEncode = htmlEncode; 306 | htmlEncode.htmlDecode = htmlDecode; 307 | if (COMMON_JS) { 308 | module.exports = exports; 309 | } else { 310 | root.htmlEncode = htmlEncode; 311 | root.htmlDecode = htmlDecode; 312 | if (AMD) { 313 | define(function() { 314 | return exports; 315 | }); 316 | } 317 | } 318 | })(); 319 | -------------------------------------------------------------------------------- /tests/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | HTML Encode / Decode 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 16 | 17 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /tests/node-test.js: -------------------------------------------------------------------------------- 1 | // Node.js env 2 | expect = require('expect.js'); 3 | htmlEncode = require('../src/htmlencode.js').htmlEncode; 4 | htmlDecode = require('../src/htmlencode.js').htmlDecode; 5 | require('./test.js'); 6 | 7 | delete require.cache[require.resolve('../src/htmlencode.js')] 8 | delete require.cache[require.resolve('./test.js')] 9 | htmlEncode = null; 10 | htmlDecode = null; 11 | 12 | // Webpack browser env 13 | JS_HTMLENCODE_NO_NODE_JS = true; 14 | window = global; 15 | htmlEncode = require('../src/htmlencode.js').htmlEncode; 16 | htmlDecode = require('../src/htmlencode.js').htmlDecode; 17 | require('./test.js'); 18 | 19 | delete require.cache[require.resolve('../src/htmlencode.js')]; 20 | delete require.cache[require.resolve('./test.js')]; 21 | htmlEncode = null; 22 | htmlDecode = null; 23 | 24 | // browser env 25 | JS_HTMLENCODE_NO_NODE_JS = true; 26 | JS_HTMLENCODE_NO_COMMON_JS = true; 27 | window = global; 28 | require('../src/htmlencode.js') 29 | require('./test.js'); 30 | 31 | delete require.cache[require.resolve('../src/htmlencode.js')]; 32 | delete require.cache[require.resolve('./test.js')]; 33 | htmlEncode = null; 34 | htmlDecode = null; 35 | 36 | // browser AMD 37 | JS_HTMLENCODE_NO_NODE_JS = true; 38 | JS_HTMLENCODE_NO_COMMON_JS = true; 39 | window = global; 40 | define = function (func) { 41 | htmlEncode = func().htmlEncode; 42 | htmlDecode = func().htmlDecode; 43 | require('./test.js'); 44 | }; 45 | define.amd = true; 46 | 47 | require('../src/htmlencode.js'); 48 | -------------------------------------------------------------------------------- /tests/test.js: -------------------------------------------------------------------------------- 1 | (function (htmlEncode, htmlDecode) { 2 | var tests = [ 3 | { 4 | encode: { 5 | method: htmlEncode, 6 | text: 'htmlEncode' 7 | }, 8 | decode: { 9 | method: htmlDecode, 10 | text: 'htmlDecode' 11 | } 12 | } 13 | ]; 14 | 15 | if (htmlEncode.htmlEncode) { 16 | tests = tests.concat([ 17 | { 18 | encode: { 19 | method: htmlEncode.htmlEncode, 20 | text: 'htmlEncode.htmlEncode' 21 | }, 22 | decode: { 23 | method: htmlEncode.htmlDecode, 24 | text: 'htmlEncode.htmlDecode' 25 | } 26 | } 27 | ]); 28 | } 29 | 30 | tests.forEach(function (test) { 31 | describe('#' + test.encode.text, function() { 32 | it('should be successful', function() { 33 | expect(test.encode.method('HTML Encode')).to.be('<a href="#">HTML Encode</a>'); 34 | expect(test.encode.method('<\'&">')).to.be('<'&">'); 35 | }); 36 | }); 37 | 38 | describe('#' + test.decode.text, function() { 39 | it('should be successful', function() { 40 | expect(test.decode.method('<a href="#">HTML Encode</a>')).to.be('HTML Encode'); 41 | expect(test.decode.method('<'&">')).to.be('<\'&">'); 42 | expect(test.decode.method('HTML Encode')).to.be('HTML Encode'); 43 | expect(test.decode.method('&amp;')).to.be('&'); 44 | expect(test.decode.method('©©©')).to.be('©©©'); 45 | expect(test.decode.method('¬found;')).to.be('¬found;'); 46 | expect(test.decode.method('&#nan;')).to.be('&#nan;'); 47 | }); 48 | }); 49 | }); 50 | })(htmlEncode, htmlDecode); 51 | --------------------------------------------------------------------------------