textversionjs
Version:
A tool for generating the text version of an html email.
178 lines (168 loc) • 8.67 kB
JavaScript
var textVerionsCore = require("../src/textversion");
describe("Empty output on empty content input", function(){
it("returns empty", function(){
expect(textVerionsCore("")).toEqual("\n");
});
it("empty body", function(){
expect(textVerionsCore("<html>Foo<body></body></html>")).toEqual("\n");
});
it("no text just tags", function(){
expect(textVerionsCore("<body><p><ul></ul></p></body>")).toEqual("\n");
});
});
describe("empty html tags", function(){
it("text should only remain", function(){
expect(textVerionsCore("<p>Lorem <strong>ipsum</strong> <pre>dolorem</pre> <foo>sic</foo> amet</p>"))
.toEqual("Lorem ipsum dolorem sic amet\n");
});
});
describe("row braking stuff", function(){
it("simple row brake", function(){
expect(textVerionsCore("Lorem ipsum<br /> dolorem <br>sic amet"))
.toEqual("Lorem ipsum\ndolorem \nsic amet\n");
});
it("simple paragraph", function(){
expect(textVerionsCore("<p>Lorem ipsum dolorem sic amet</p>"))
.toEqual("Lorem ipsum dolorem sic amet\n");
});
it("simple double paragraph", function(){
expect(textVerionsCore("<p>Lorem ipsum</p><p>dolorem sic amet</p>"))
.toEqual("Lorem ipsum\ndolorem sic amet\n");
});
it("simple div", function(){
expect(textVerionsCore("<div>Lorem ipsum dolorem sic amet</div>"))
.toEqual("Lorem ipsum dolorem sic amet\n");
});
it("div, p and br together", function(){
expect(textVerionsCore("<div>Lorem <div>ipsum<p>dolor sic amet,<br /> consectetur adipiscing elit, sed do </p>eiusmod tempor </div>incididunt ut labore</div>"))
.toEqual("Lorem \nipsum\ndolor sic amet,\nconsectetur adipiscing elit, sed do \neiusmod tempor \nincididunt ut labore\n");
});
});
describe("link replace", function(){
it("simple link replacement", function(){
expect(textVerionsCore("Lorem <a href=\"here\">ipsum</a> dolorem sic amet"))
.toEqual("Lorem [ipsum] (here) dolorem sic amet\n");
});
it("link replacement with function", function(){
expect(textVerionsCore("Lorem <a href=\"here\">ipsum</a> dolorem sic amet", {linkProcess: function(href, linkText){
return " {" + linkText+"} ["+ href + "] ";
}}))
.toEqual("Lorem {ipsum} [here] dolorem sic amet\n");
});
it("link replacement with function to discard link href", function(){
expect(textVerionsCore("Lorem <a href=\"here\">ipsum</a> dolorem sic amet", {linkProcess: function(href, linkText){
return linkText;
}}))
.toEqual("Lorem ipsum dolorem sic amet\n");
});
it("link replacement with function to discard link href and put braces", function(){
expect(textVerionsCore("Lorem <a href=\"here\">ipsum</a> dolorem sic amet", {linkProcess: function(href, linkText){
return "[" + linkText + "]";
}}))
.toEqual("Lorem [ipsum] dolorem sic amet\n");
});
});
describe("image replace", function(){
it("simple image replacement", function(){
expect(textVerionsCore("Lorem <img src=\"imagelink\" alt=\"ipsum\"> dolorem sic amet"))
.toEqual("Lorem ![ipsum] (imagelink) dolorem sic amet\n");
});
it("simple image replacement if no alt is present", function(){
expect(textVerionsCore("Lorem <img src=\"imagelink\" alt=\"\"> dolorem sic amet"))
.toEqual("Lorem ![image] (imagelink) dolorem sic amet\n");
});
it("image replacement with function", function(){
expect(textVerionsCore("Lorem <img src=\"imagelink\" alt=\"ipsum\"> dolorem sic amet", {imgProcess: function(src, imAlt){
return " {" + imAlt+"} ["+ src + "] ";
}}))
.toEqual("Lorem {ipsum} [imagelink] dolorem sic amet\n");
});
it("image replacement with function to discard source", function(){
expect(textVerionsCore("Lorem <img src=\"imagelink\" alt=\"ipsum\"> dolorem sic amet", {imgProcess: function(src, imAlt){
return imAlt;
}}))
.toEqual("Lorem ipsum dolorem sic amet\n");
});
it("image replacement with function to discard cource and put braces", function(){
expect(textVerionsCore("Lorem <img src=\"imagelink\" alt=\"ipsum\"> dolorem sic amet", {imgProcess: function(src, imAlt){
return "[" + imAlt + "]";
}}))
.toEqual("Lorem [ipsum] dolorem sic amet\n");
});
});
describe("headings", function(){
it("simple heading with underline", function(){
expect(textVerionsCore("<h1>Lorem</h1> ipsum <h2>dolorem</h2> sic <h3>amet</h3> sic amet"))
.toEqual("Lorem\n=====\n\nipsum \n\ndolorem\n-------\n\nsic \n\namet\n\nsic amet\n");
});
it("heading with underline other tags within", function(){
expect(textVerionsCore("<h1><span>Lorem</span></h1> ipsum <h2>dolorem</h2> sic <h3>amet</h3> sic amet"))
.toEqual("Lorem\n=====\n\nipsum \n\ndolorem\n-------\n\nsic \n\namet\n\nsic amet\n");
});
it("heading removal with option linebreak", function(){
expect(textVerionsCore("<h1>Lorem</h1> ipsum dolorem sic amet", {headingStyle: "linebreak"}))
.toEqual("Lorem\nipsum dolorem sic amet\n");
});
it("heading removal with option hashify", function(){
expect(textVerionsCore("<h1>Lorem</h1> ipsum <h2>dolorem</h2> sic <h4>amet</h4> sic amet", {headingStyle: "hashify"}))
.toEqual("# Lorem\n\nipsum \n\n## dolorem\n\nsic \n\n#### amet\n\nsic amet\n");
});
});
describe("lists", function(){
it("ulist removal with option linebreak", function(){
expect(textVerionsCore("<ul><li>Lorem</li><li>ipsum</li></ul> dolorem sic amet", {listStyle: "linebreak"}))
.toEqual("Lorem\nipsum\ndolorem sic amet\n");
});
it("simple ulist removal", function(){
expect(textVerionsCore("<ul><li>Lorem</li><li>ipsum</li></ul> dolorem sic amet"))
.toEqual("---Lorem\n---ipsum\ndolorem sic amet\n");
});
it("ulist removal with option indention and other styles", function(){
expect(textVerionsCore("<ul><li>Lorem</li><li>ipsum</li></ul> dolorem sic amet", {listStyle: "indention", uIndentionChar: "=", listIndentionTabs: "4"}))
.toEqual("====Lorem\n====ipsum\ndolorem sic amet\n");
});
it("simple olist removal", function(){
expect(textVerionsCore("<ol><li>Lorem</li><li>ipsum</li></ol> dolorem sic amet"))
.toEqual("1--Lorem\n2--ipsum\ndolorem sic amet\n");
});
it("olist removal with option linebreak", function(){
expect(textVerionsCore("<ol><li>Lorem</li><li>ipsum</li></ol> dolorem sic amet", {listStyle: "linebreak"}))
.toEqual("Lorem\nipsum\ndolorem sic amet\n");
});
it("olist removal with starting value and option indention and other styles", function(){
expect(textVerionsCore("<ol start=\"31\"><li>Lorem</li><li>ipsum</li></ol> dolorem sic amet", {listStyle: "indention", oIndentionChar: "=", listIndentionTabs: "4"}))
.toEqual("31==Lorem\n32==ipsum\ndolorem sic amet\n");
});
it("combined ulist and olist removal with starting value and option indention and other styles", function(){
expect(textVerionsCore("<ol start=\"3\"><li>Lorem</li><li><ul><li>ipsum</li><li>dolorem</li></ul></li></ol>sic amet", {listStyle: "indention", oIndentionChar: "=", uIndentionChar: "=", listIndentionTabs: "2"}))
.toEqual("3=Lorem\n4===ipsum\n====dolorem\nsic amet\n");
});
});
describe("remove full blocks when needed", function(){
it("remove body scripts", function(){
expect(textVerionsCore("<script>var a=2</script>\nLorem ipsum dolorem <script type=\"text/js\">alert(\"hello world\");\nalert(\"nothing\")</script>sic amet</div>"))
.toEqual("Lorem ipsum dolorem sic amet\n");
});
it("remove body styles", function(){
expect(textVerionsCore("<style>div {\n display: block;\n}</style>\nLorem ipsum dolorem <style type=\"text/css\">.page-content {\npadding: 30px 0;\n}\n</style>sic amet</div>"))
.toEqual("Lorem ipsum dolorem sic amet\n");
});
it("remove body comments", function(){
expect(textVerionsCore("Lorem ipsum dolorem <!--foo\nfoo--> sic amet<!--foo-->"))
.toEqual("Lorem ipsum dolorem sic amet\n");
});
});
describe("pasting from editors", function(){
it("google doc styling meta tag", function(){
expect(textVerionsCore("<meta charset=\"utf-8\"><span style=\"font-size:30.666666666666664px;font-family:Arial;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap;\">line 1</span>"))
.toEqual("line 1\n");
});
it("ms word styling <o:p>", function(){
expect(textVerionsCore("<span lang=EN-US style='font-size:10.5pt;line-height:107%; font-family:\"Arial\",sans-serif;color:#333333;mso-ansi-language:EN-US'>Line 2</span><span lang=EN-US style='mso-ansi-language:EN-US'><o:p></o:p></span>"))
.toEqual("Line 2\n");
});
it("fix special tag endings", function(){
expect(textVerionsCore("<span test=\"a \" lang=EN-US style='font-size:10.5pt;line-height:107%; font-family:\"Arial\",sans-serif;color:#333333;mso-ansi-language:EN-US'>A</span>"))
.toEqual("A\n");
});
});