"use strict";
var _require = require("../utils.js"),
createXmlTemplaterDocx = _require.createXmlTemplaterDocx,
expect = _require.expect,
getContent = _require.getContent,
createXmlTemplaterDocxNoRender = _require.createXmlTemplaterDocxNoRender;
describe("XmlTemplater", function () {
it("should work with simpleContent", function () {
var content = "Hello {name}";
var scope = {
name: "Edgar"
};
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: scope
});
expect(xmlTemplater.getFullText()).to.be.equal("Hello Edgar");
});
it("should work with doublecontent in w:t", function () {
var content = "Hello {name}, you're {age} years old";
var scope = {
name: "Edgar",
age: "foo"
};
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: scope
});
expect(xmlTemplater.getFullText()).to.be.equal("Hello Edgar, you're foo years old");
});
it("should work with {.} for this", function () {
var content = "Hello {.}";
var scope = "Edgar";
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: scope
});
expect(xmlTemplater.getFullText()).to.be.equal("Hello Edgar");
});
it("should work with {.} for this inside loop", function () {
var content = "Hello {#names}{.},{/names}";
var scope = {
names: ["Edgar", "John"]
};
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: scope
});
expect(xmlTemplater.getFullText()).to.be.equal("Hello Edgar,John,");
});
it("should work with non w:t content", function () {
var content = "{#loop}Hello {name}{/loop}";
var scope = {
loop: {
name: "edgar"
}
};
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: scope
});
expect(getContent(xmlTemplater)).to.be.equal('Hello edgar');
});
it("should handle in loop without error", function () {
var content = "{#ab}\n \n {.}{/ab}";
var scope = {
ab: [1, 2, 3]
};
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: scope
});
expect(xmlTemplater.getFullText()).to.be.equal("123");
});
it("should work with tag in two elements", function () {
var content = "Hello {name}";
var scope = {
name: "Edgar"
};
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: scope
});
expect(xmlTemplater.getFullText()).to.be.equal("Hello Edgar");
});
it("should work with splitted tag in three elements", function () {
var content = "Hello {name}";
var scope = {
name: "Edgar"
};
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: scope
});
expect(xmlTemplater.getFullText()).to.be.equal("Hello Edgar");
});
it("should work with simple loop with object value", function () {
var content = "Hello {#person}{name}{/person}";
var scope = {
person: {
name: "Edgar"
}
};
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: scope
});
expect(xmlTemplater.getFullText()).to.be.equal("Hello Edgar");
});
it("should work with simple Loop", function () {
var content = "Hello {#names}{name},{/names}";
var scope = {
names: [{
name: "Edgar"
}, {
name: "Mary"
}, {
name: "John"
}]
};
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: scope
});
expect(xmlTemplater.getFullText()).to.be.equal("Hello Edgar,Mary,John,");
});
it("should work with simple Loop with boolean value truthy", function () {
var content = "Hello {#showName}{name},{/showName}";
var scope = {
showName: true,
name: "Edgar"
};
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: scope
});
expect(xmlTemplater.getFullText()).to.be.equal("Hello Edgar,");
});
it("should work with simple Loop with boolean value falsy", function () {
var content = "Hello {#showName}{name},{/showName}";
var scope = {
showName: false,
name: "Edgar"
};
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: scope
});
expect(xmlTemplater.getFullText()).to.be.equal("Hello ");
});
it("should work with dash Loop", function () {
var content = "Hello {-w:p names}{name},{/names}";
var scope = {
names: [{
name: "Edgar"
}, {
name: "Mary"
}, {
name: "John"
}]
};
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: scope
});
expect(xmlTemplater.getFullText()).to.be.equal("Hello Edgar,Hello Mary,Hello John,");
});
it("should work with loop and innerContent", function () {
var content = '{#loop}{title}Proof that it works nicely :{#proof} It works because {reason}{/proof}{/loop}';
var scope = {
loop: {
title: "Everyone uses it",
proof: [{
reason: "it is quite cheap"
}, {
reason: "it is quit simple"
}, {
reason: "it works on a lot of different Hardware"
}]
}
};
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: scope
});
expect(xmlTemplater.getFullText()).to.be.equal("Everyone uses itProof that it works nicely : It works because it is quite cheap It works because it is quit simple It works because it works on a lot of different Hardware");
});
it("should work with loop and innerContent (with last)", function () {
var content = '{#loop}Start {title}Proof that it works nicely :{#proof} It works because {reason}{/proof} End{/loop}';
var scope = {
loop: {
title: "Everyone uses it",
proof: [{
reason: "it is quite cheap"
}, {
reason: "it is quit simple"
}, {
reason: "it works on a lot of different Hardware"
}]
}
};
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: scope
});
expect(xmlTemplater.getFullText()).to.be.equal("Start Everyone uses itProof that it works nicely : It works because it is quite cheap It works because it is quit simple It works because it works on a lot of different Hardware End");
});
it("should work with not w:t tag (if the for loop is like {#forloop} text {/forloop}) ", function () {
var content = "{#loop}Hello {#names}{name},{/names}{/loop}";
var scope = {
loop: {
names: [{
name: "Edgar"
}, {
name: "Mary"
}, {
name: "John"
}]
}
};
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: scope
});
expect(getContent(xmlTemplater)).to.be.equal('Hello Edgar,Mary,John,');
});
it("should work with delimiter in value", function () {
var content = "Hello {name}";
var scope = {
name: "{edgar}"
};
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: scope
});
expect(xmlTemplater.getFullText()).to.be.equal("Hello {edgar}");
});
it("should work with delimiter in value with loop)", function () {
var content = "Hello {#names}{name},{/names}";
var scope = {
names: [{
name: "{John}"
}, {
name: "M}}{ary"
}, {
name: "Di{{{gory"
}]
};
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: scope
});
expect(xmlTemplater.getFullText()).to.be.equal("Hello {John},M}}{ary,Di{{{gory,");
});
it("should work when replacing with exact same value", function () {
var content = 'Hello {name}';
var scope = {
name: "{name}"
};
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: scope
});
xmlTemplater.getFullText();
expect(xmlTemplater.getFullText()).to.be.equal("Hello {name}");
});
it("should work with equations", function () {
var content = "\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\ty\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t{bar}\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t*\n\t\t\n\t\t\n\t\tcos\u2061\n\t\t\n\t\t\n\t\t(\n\t\t\n\t\t\n\t\t {foo}\n\t\t\n\t\t\n\t\t+{baz})\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\tHello {\n\t\tname\n\t\t}\n\t\t\n\t\t";
var scope = {
name: "John",
foo: "MyFoo",
bar: "MyBar",
baz: "MyBaz"
};
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: scope
});
expect(xmlTemplater.getFullText()).to.be.equal("yMyBar*cosā”( MyFoo+MyBaz)Hello John");
});
});
describe("Change the nullGetter", function () {
it("should work with null", function () {
var content = "Hello {#names}{#foo}{bar}{/foo}{/names}";
function nullGetter(part, scopeManager) {
expect(part.value).to.equal("bar");
expect(scopeManager.scopePath).to.deep.equal(["names", "foo"]);
expect(scopeManager.scopePathItem).to.deep.equal([0, 0]);
return "null";
}
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: {
names: [{
foo: [{}]
}]
},
nullGetter: nullGetter
});
expect(xmlTemplater.getFullText()).to.be.equal("Hello null");
});
it("should be possible to keep null tags as is", function () {
var content = "Hello {name}, your hobby is {hobby}";
function nullGetter(part) {
if (!part.module) {
return "{" + part.value + "}";
}
if (part.module === "rawxml") {
return "";
}
return "";
}
var data = {
hobby: "diving"
};
var xmlTemplater = createXmlTemplaterDocxNoRender(content, {
nullGetter: nullGetter
});
xmlTemplater.compile();
return xmlTemplater.resolveData(data).then(function () {
xmlTemplater.render();
expect(xmlTemplater.getFullText()).to.be.equal("Hello {name}, your hobby is diving");
});
});
it("should work with null in resolve", function () {
var content = "Hello {#names}{#foo}{bar}{/foo}{/names}";
var calls = 0;
function nullGetter(part, scopeManager) {
calls++;
expect(scopeManager.scopePath).to.deep.equal(["names", "foo"]);
expect(scopeManager.scopePathItem).to.deep.equal([0, 0]);
return "null";
}
var data = {
names: [{
foo: [{}]
}]
};
var xmlTemplater = createXmlTemplaterDocxNoRender(content, {
nullGetter: nullGetter
});
xmlTemplater.compile();
return xmlTemplater.resolveData(data).then(function () {
expect(calls).to.be.equal(1);
xmlTemplater.render();
expect(calls).to.be.equal(1);
expect(xmlTemplater.getFullText()).to.be.equal("Hello null");
});
});
});
describe("Automatic expansion to table row (intelligent tagging)", function () {
it("should work with multiple rows", function () {
var content = "\n\t\t\n\t\t{#clauses} Clause {.}\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t{/clauses}\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t".replace(/\t|\n/g, "");
var scope = {
clauses: ["Foo", "Bar", "Baz"]
};
var doc = createXmlTemplaterDocx(content, {
tags: scope
});
var c = getContent(doc);
expect(c).to.be.equal(' Clause Foo Clause Bar Clause Baz');
});
it("should work with rows and inverted loops", function () {
var content = "\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t{^clauses} Clause {clause}\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t{/clauses}end\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\tBye\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t".replace(/\t|\n/g, "");
var scope = {
clauses: [1],
clause: "hello"
};
var doc = createXmlTemplaterDocx(content, {
tags: scope
});
var c = getContent(doc);
expect(c).to.be.equal("Bye");
});
});
describe("Custom delimiters", function () {
it("should work with custom tags", function () {
var delimiters = {
start: "[",
end: "]"
};
var content = "Hello [name]";
var scope = {
name: "Edgar"
};
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: scope,
delimiters: delimiters
});
expect(xmlTemplater.getFullText()).to.be.equal("Hello Edgar");
});
it("should work with custom delimiters with two chars", function () {
var delimiters = {
start: "[[",
end: "]]"
};
var content = "Hello [[name]]";
var scope = {
name: "Edgar"
};
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: scope,
delimiters: delimiters
});
expect(xmlTemplater.getFullText()).to.be.eql("Hello Edgar");
});
it("should work with custom delimiters as strings with different length", function () {
var delimiters = {
start: "[[[",
end: "]]"
};
var content = "Hello [[[name]]";
var scope = {
name: "Edgar"
};
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: scope,
delimiters: delimiters
});
expect(xmlTemplater.getFullText()).to.be.eql("Hello Edgar");
});
it("should work with custom tags and loops", function () {
var delimiters = {
start: "[[[",
end: "]]"
};
var content = "Hello [[[#names]][[[.]],[[[/names]]";
var scope = {
names: ["Edgar", "Mary", "John"]
};
var xmlTemplater = createXmlTemplaterDocx(content, {
tags: scope,
delimiters: delimiters
});
expect(xmlTemplater.getFullText()).to.be.equal("Hello Edgar,Mary,John,");
});
it("should work with loops", function () {
var content = "{#loop}{innertag} {/loop}";
var xmlt = createXmlTemplaterDocx(content, {
tags: {
loop: [{
innertag: 10
}, {
innertag: 5
}]
}
});
var c = getContent(xmlt);
expect(c).to.be.equal('10 5 ');
});
it("should work with complex loops (1)", function () {
var content = "{#looptag}{innertag}{/looptag}";
var xmlt = createXmlTemplaterDocx(content, {
tags: {
looptag: true,
innertag: "foo"
}
});
var c = getContent(xmlt);
expect(c).not.to.contain("");
expect(c).to.be.equal('foo');
});
it("should work with complex loops (2)", function () {
var content = "{#person}{name}{/person}";
var xmlt = createXmlTemplaterDocx(content, {
tags: {
person: [{
name: "Henry"
}]
}
});
var c = getContent(xmlt);
expect(c).to.contain("Henry");
expect(c).not.to.contain("Henry");
});
});
describe("getting parents context", function () {
it("should work with simple loops", function () {
var content = "{#loop}{name}{/loop}";
var xmlt = createXmlTemplaterDocx(content, {
tags: {
loop: [1],
name: "Henry"
}
});
var c = getContent(xmlt);
expect(c).to.be.equal('Henry');
});
it("should work with double loops", function () {
var content = "{#loop_first}{#loop_second}{name_inner} {name_outer}{/loop_second}{/loop_first}";
var xmlt = createXmlTemplaterDocx(content, {
tags: {
loop_first: [1],
loop_second: [{
name_inner: "John"
}],
name_outer: "Henry"
}
});
var c = getContent(xmlt);
expect(c).to.be.equal('John Henry');
});
});
describe("Using the resolveOffset property", function () {
it("should work", function () {
var content = "{#loop_first}{#loop_second}{name_inner} {name_outer}{/loop_second}{/loop_first}";
var xmlt = createXmlTemplaterDocxNoRender(content, {}).compile();
return xmlt.resolveData({
loop_first: [1],
loop_second: [{
name_inner: "John"
}],
name_outer: "Henry"
}).then(function () {
var sm = xmlt.scopeManagers["word/document.xml"];
expect(sm.finishedResolving).to.equal(true);
sm.scopePath.unshift("aaa");
sm.scopePathItem.unshift(122);
sm.scopePathLength.unshift(144);
sm.scopeLindex.unshift(555);
sm.resolveOffset = 1;
var part = {
value: "loop_first",
lIndex: 3
};
var part2 = {
value: "loop_second",
lIndex: 6
};
var val;
function loopOver(scope, i, length) {
var ssm = sm.createSubScopeManager(scope, part.value, i, part, length);
val = ssm.getValue("loop_second", {
part: part2
});
}
sm.loopOver("loop_first", loopOver, false, {
part: {
value: "loop_first",
lIndex: 3
}
});
expect(val[0][0].tag).to.equal("name_inner");
expect(val[0][0].value).to.equal("John");
});
});
});