CyberChef/src/core/operations/ToHTMLEntity.mjs

347 lines
7.7 KiB
JavaScript

/**
* @author n1474335 [n1474335@gmail.com]
* @copyright Crown Copyright 2016
* @license Apache-2.0
*/
import Operation from "../Operation";
import Utils from "../Utils";
/**
* To HTML Entity operation
*/
class ToHTMLEntity extends Operation {
/**
* ToHTMLEntity constructor
*/
constructor() {
super();
this.name = "To HTML Entity";
this.module = "Default";
this.description = "Converts characters to HTML entities<br><br>e.g. <code>&amp;</code> becomes <code>&amp;<span>amp;</span></code>";
this.infoURL = "https://wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references";
this.inputType = "string";
this.outputType = "string";
this.args = [
{
"name": "Convert all characters",
"type": "boolean",
"value": false
},
{
"name": "Convert to",
"type": "option",
"value": ["Named entities where possible", "Numeric entities", "Hex entities"]
}
];
}
/**
* @param {string} input
* @param {Object[]} args
* @returns {string}
*/
run(input, args) {
const convertAll = args[0],
numeric = args[1] === "Numeric entities",
hexa = args[1] === "Hex entities";
const charcodes = Utils.strToCharcode(input);
let output = "";
for (let i = 0; i < charcodes.length; i++) {
if (convertAll && numeric) {
output += "&#" + charcodes[i] + ";";
} else if (convertAll && hexa) {
output += "&#x" + Utils.hex(charcodes[i]) + ";";
} else if (convertAll) {
output += byteToEntity[charcodes[i]] || "&#" + charcodes[i] + ";";
} else if (numeric) {
if (charcodes[i] > 255 || byteToEntity.hasOwnProperty(charcodes[i])) {
output += "&#" + charcodes[i] + ";";
} else {
output += Utils.chr(charcodes[i]);
}
} else if (hexa) {
if (charcodes[i] > 255 || byteToEntity.hasOwnProperty(charcodes[i])) {
output += "&#x" + Utils.hex(charcodes[i]) + ";";
} else {
output += Utils.chr(charcodes[i]);
}
} else {
output += byteToEntity[charcodes[i]] || (
charcodes[i] > 255 ?
"&#" + charcodes[i] + ";" :
Utils.chr(charcodes[i])
);
}
}
return output;
}
}
/**
* Lookup table to translate byte values to their HTML entity codes.
*/
const byteToEntity = {
34: "&quot;",
38: "&amp;",
39: "&apos;",
60: "&lt;",
62: "&gt;",
160: "&nbsp;",
161: "&iexcl;",
162: "&cent;",
163: "&pound;",
164: "&curren;",
165: "&yen;",
166: "&brvbar;",
167: "&sect;",
168: "&uml;",
169: "&copy;",
170: "&ordf;",
171: "&laquo;",
172: "&not;",
173: "&shy;",
174: "&reg;",
175: "&macr;",
176: "&deg;",
177: "&plusmn;",
178: "&sup2;",
179: "&sup3;",
180: "&acute;",
181: "&micro;",
182: "&para;",
183: "&middot;",
184: "&cedil;",
185: "&sup1;",
186: "&ordm;",
187: "&raquo;",
188: "&frac14;",
189: "&frac12;",
190: "&frac34;",
191: "&iquest;",
192: "&Agrave;",
193: "&Aacute;",
194: "&Acirc;",
195: "&Atilde;",
196: "&Auml;",
197: "&Aring;",
198: "&AElig;",
199: "&Ccedil;",
200: "&Egrave;",
201: "&Eacute;",
202: "&Ecirc;",
203: "&Euml;",
204: "&Igrave;",
205: "&Iacute;",
206: "&Icirc;",
207: "&Iuml;",
208: "&ETH;",
209: "&Ntilde;",
210: "&Ograve;",
211: "&Oacute;",
212: "&Ocirc;",
213: "&Otilde;",
214: "&Ouml;",
215: "&times;",
216: "&Oslash;",
217: "&Ugrave;",
218: "&Uacute;",
219: "&Ucirc;",
220: "&Uuml;",
221: "&Yacute;",
222: "&THORN;",
223: "&szlig;",
224: "&agrave;",
225: "&aacute;",
226: "&acirc;",
227: "&atilde;",
228: "&auml;",
229: "&aring;",
230: "&aelig;",
231: "&ccedil;",
232: "&egrave;",
233: "&eacute;",
234: "&ecirc;",
235: "&euml;",
236: "&igrave;",
237: "&iacute;",
238: "&icirc;",
239: "&iuml;",
240: "&eth;",
241: "&ntilde;",
242: "&ograve;",
243: "&oacute;",
244: "&ocirc;",
245: "&otilde;",
246: "&ouml;",
247: "&divide;",
248: "&oslash;",
249: "&ugrave;",
250: "&uacute;",
251: "&ucirc;",
252: "&uuml;",
253: "&yacute;",
254: "&thorn;",
255: "&yuml;",
338: "&OElig;",
339: "&oelig;",
352: "&Scaron;",
353: "&scaron;",
376: "&Yuml;",
402: "&fnof;",
710: "&circ;",
732: "&tilde;",
913: "&Alpha;",
914: "&Beta;",
915: "&Gamma;",
916: "&Delta;",
917: "&Epsilon;",
918: "&Zeta;",
919: "&Eta;",
920: "&Theta;",
921: "&Iota;",
922: "&Kappa;",
923: "&Lambda;",
924: "&Mu;",
925: "&Nu;",
926: "&Xi;",
927: "&Omicron;",
928: "&Pi;",
929: "&Rho;",
931: "&Sigma;",
932: "&Tau;",
933: "&Upsilon;",
934: "&Phi;",
935: "&Chi;",
936: "&Psi;",
937: "&Omega;",
945: "&alpha;",
946: "&beta;",
947: "&gamma;",
948: "&delta;",
949: "&epsilon;",
950: "&zeta;",
951: "&eta;",
952: "&theta;",
953: "&iota;",
954: "&kappa;",
955: "&lambda;",
956: "&mu;",
957: "&nu;",
958: "&xi;",
959: "&omicron;",
960: "&pi;",
961: "&rho;",
962: "&sigmaf;",
963: "&sigma;",
964: "&tau;",
965: "&upsilon;",
966: "&phi;",
967: "&chi;",
968: "&psi;",
969: "&omega;",
977: "&thetasym;",
978: "&upsih;",
982: "&piv;",
8194: "&ensp;",
8195: "&emsp;",
8201: "&thinsp;",
8204: "&zwnj;",
8205: "&zwj;",
8206: "&lrm;",
8207: "&rlm;",
8211: "&ndash;",
8212: "&mdash;",
8216: "&lsquo;",
8217: "&rsquo;",
8218: "&sbquo;",
8220: "&ldquo;",
8221: "&rdquo;",
8222: "&bdquo;",
8224: "&dagger;",
8225: "&Dagger;",
8226: "&bull;",
8230: "&hellip;",
8240: "&permil;",
8242: "&prime;",
8243: "&Prime;",
8249: "&lsaquo;",
8250: "&rsaquo;",
8254: "&oline;",
8260: "&frasl;",
8364: "&euro;",
8465: "&image;",
8472: "&weierp;",
8476: "&real;",
8482: "&trade;",
8501: "&alefsym;",
8592: "&larr;",
8593: "&uarr;",
8594: "&rarr;",
8595: "&darr;",
8596: "&harr;",
8629: "&crarr;",
8656: "&lArr;",
8657: "&uArr;",
8658: "&rArr;",
8659: "&dArr;",
8660: "&hArr;",
8704: "&forall;",
8706: "&part;",
8707: "&exist;",
8709: "&empty;",
8711: "&nabla;",
8712: "&isin;",
8713: "&notin;",
8715: "&ni;",
8719: "&prod;",
8721: "&sum;",
8722: "&minus;",
8727: "&lowast;",
8730: "&radic;",
8733: "&prop;",
8734: "&infin;",
8736: "&ang;",
8743: "&and;",
8744: "&or;",
8745: "&cap;",
8746: "&cup;",
8747: "&int;",
8756: "&there4;",
8764: "&sim;",
8773: "&cong;",
8776: "&asymp;",
8800: "&ne;",
8801: "&equiv;",
8804: "&le;",
8805: "&ge;",
8834: "&sub;",
8835: "&sup;",
8836: "&nsub;",
8838: "&sube;",
8839: "&supe;",
8853: "&oplus;",
8855: "&otimes;",
8869: "&perp;",
8901: "&sdot;",
8942: "&vellip;",
8968: "&lceil;",
8969: "&rceil;",
8970: "&lfloor;",
8971: "&rfloor;",
9001: "&lang;",
9002: "&rang;",
9674: "&loz;",
9824: "&spades;",
9827: "&clubs;",
9829: "&hearts;",
9830: "&diams;",
};
export default ToHTMLEntity;