var fs = require("fs"); import libxml from "../index"; import { XMLAttribute, HTMLParseOptions, parseHtml } from "../index"; const TEST_DIR = __dirname + "/../../test"; function make_error(object: any) { var err = new Error(object.message) as any; err.domain = object.domain; err.code = object.code; err.level = object.level; err.line = object.line; err.column = object.column; return err; } module.exports.parse = function (assert: any) { var filename = TEST_DIR + "/fixtures/parser.html"; function attempt_parse(encoding: any) { var str = fs.readFileSync(filename, encoding); var doc = parseHtml(str); assert.equal("html", doc.root()?.name()); assert.equal("Test HTML document", (doc.get("head/title") as any).text()); assert.equal("HTML content!", (doc.get("body/span") as any).text()); } // Parse via a string attempt_parse("utf-8"); // Parse via a Buffer attempt_parse(null); assert.done(); }; module.exports.parseAsync = function (assert: any) { var filename = TEST_DIR + "/fixtures/parser.html"; function attempt_parse(encoding: any) { var str = fs.readFileSync(filename, encoding); let x = 0; libxml.parseHtmlAsync(str).then((doc) => { assert.equal(++x, 2); assert.equal("html", doc.root()?.name()); assert.equal("Test HTML document", (doc.get("head/title") as any).text()); assert.equal("HTML content!", (doc.get("body/span") as any).text()); }); assert.equal(++x, 1); } // Parse via a string attempt_parse("utf-8"); // Parse via a Buffer attempt_parse(null); assert.done(); }; // Although libxml defaults to a utf-8 encoding, if not specifically specified // it will guess the encoding based on meta http-equiv tags available // This test shows that the "guessed" encoding can be overridden module.exports.parse_force_encoding = function (assert: any) { var filename = TEST_DIR + "/fixtures/parser.euc_jp.html"; function attempt_parse(encoding: any, opts: HTMLParseOptions) { var str = fs.readFileSync(filename, encoding); var doc = libxml.parseHtml(str, opts); assert.equal(doc.errors, 0); assert.equal("html", doc.root()?.name()); // make sure libxml rewrite the meta charset of this document // calling toString on the document ensure that it is converted to the // correct internal format and the new meta tag is replaced doc.root()?.toString(); let result = doc.find("/html/head/meta/@content")[0]; var fixedCharset = (result as XMLAttribute).value(); assert.ok(fixedCharset.indexOf(opts.encoding!.toUpperCase()) !== -1); assert.equal("テスト", (doc.get("head/title") as any).text()); assert.equal("テスト", (doc.get("body/div") as any).text()); } // Parse via a string attempt_parse("utf-8", { encoding: "utf-8" }); // Parse via a Buffer attempt_parse(null, { encoding: "utf-8" }); assert.done(); }; module.exports.recoverable_parse = function (assert: any) { var recoverableFile = TEST_DIR + "/fixtures/warnings/amp.html"; var str = fs.readFileSync(recoverableFile, "utf8"); var recoverableErrors = [ make_error({ domain: 5, code: 23, message: "htmlParseEntityRef: expecting ';'\n", level: 2, line: 12, column: 27, }), make_error({ domain: 5, code: 68, message: "htmlParseEntityRef: no name\n", level: 2, line: 12, column: 38 }), make_error({ domain: 5, code: 23, message: "htmlParseEntityRef: expecting ';'\n", level: 2, line: 14, column: 4, }), make_error({ domain: 5, code: 68, message: "htmlParseEntityRef: no name\n", level: 2, line: 15, column: 4 }), ]; var doc = libxml.parseHtml(str); assert.equal(4, doc.errors.length); for (var i = 0; i < recoverableErrors.length; i++) { assert.equal(recoverableErrors[i].domain, doc.errors[i]?.domain); assert.equal(recoverableErrors[i].code, doc.errors[i]?.code); assert.equal(recoverableErrors[i].message, doc.errors[i]?.message); assert.equal(recoverableErrors[i].level, doc.errors[i]?.level); assert.equal(recoverableErrors[i].line, doc.errors[i]?.line); } assert.done(); }; module.exports.parseOptions = function (assert: any) { var doc = libxml.parseHtml("", { doctype: false, implied: false }).toString()!; assert.ok(doc.indexOf("DOCTYPE") === -1); assert.ok(doc.indexOf("body") === -1); assert.ok(doc.indexOf("") === -1); doc = libxml.parseHtml("", { doctype: false, implied: true }).toString()!; assert.ok(doc.indexOf("DOCTYPE") === -1); assert.ok(doc.indexOf("body") > -1); assert.ok(doc.indexOf("") > -1); doc = libxml.parseHtml("", { implied: false }).toString()!; assert.ok(doc.indexOf("DOCTYPE") > -1); assert.ok(doc.indexOf("body") === -1); assert.ok(doc.indexOf("") === -1); assert.done(); }; module.exports.toString = function (assert: any) { var doc = libxml.Document(); assert.ok(doc.toString({ declaration: false }) === ""); assert.equal(doc.toString({ declaration: false, type: "html" }), "\n"); doc = libxml.parseHtml(""); assert.ok(doc.toString().indexOf(" -1); assert.ok(doc.toString({ type: "xhtml" }).indexOf(" -1); assert.ok(doc.toString({ type: "xml", selfCloseEmpty: true })!.indexOf("") > -1); assert.done(); };