1
0
Fork 0
mirror of https://github.com/futurepress/epub.js.git synced 2025-10-03 14:59:18 +02:00

Added several usage examples, fixed bugs, turned off restore by default

This commit is contained in:
Fred Chasen 2013-07-15 22:14:52 -07:00
parent 0e08b734ec
commit 416f7ab6a0
112 changed files with 23903 additions and 3348 deletions

View file

@ -0,0 +1,206 @@
// Generated by CoffeeScript 1.6.3
var testData;
testData = [[0, 13, 0, 27, "habitant morbi", "Partial node contents."], [0, 0, 0, 37, "Pellentesque habitant morbi tristique", "Full node contents, textNode refs."], ['/p/strong', 0, '/p/strong', 1, "Pellentesque habitant morbi tristique", "Full node contents, elementNode refs."], [0, 22, 1, 12, "morbi tristique senectus et", "Spanning 2 nodes."], ['/p/strong', 0, 1, 12, "Pellentesque habitant morbi tristique senectus et", "Spanning 2 nodes, elementNode start ref."], [1, 165, '/p/em', 1, "egestas semper. Aenean ultricies mi vitae est.", "Spanning 2 nodes, elementNode end ref."], [9, 7, 12, 11, "Level 2\n\n\n Lorem ipsum", "Spanning multiple nodes, textNode refs."], ['/p', 0, '/p', 8, "Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis. Ut felis.", "Spanning multiple nodes, elementNode refs."], ['/p[2]', 0, '/p[2]', 1, "Lorem sed do eiusmod tempor.", "Full node contents with empty node at end."], ["/div/text()[2]", 0, "/div/text()[2]", 28, "Lorem sed do eiusmod tempor.", "Text between br tags, textNode refs"], ["/div/text()[2]", 0, "/div", 4, "Lorem sed do eiusmod tempor.", "Text between br tags, elementNode ref at end"], ["/div/text()[2]", 0, "/div", 5, "Lorem sed do eiusmod tempor.", "Text between br tags, with <br/> at end"], ["/div/text()[2]", 0, "/div", 6, "Lorem sed do eiusmod tempor.", "Text between br tags, with <br/><br/> at end"], ["/div/text()[2]", 0, "/div", 7, "Lorem sed do eiusmod tempor.", "Text between br tags, with <br/><br/><br/> at end"], ["/div", 3, "/div/text()[2]", 28, "Lorem sed do eiusmod tempor.", "Text between br tags, elementNode ref at start"], ["/div", 2, "/div/text()[2]", 28, "Lorem sed do eiusmod tempor.", "Text between br tags, with <br/> at start"], ["/div", 1, "/div/text()[2]", 28, "Lorem sed do eiusmod tempor.", "Text between br tags, with <br/><br/> at start"], ["/div[2]/text()[2]", 0, "/div[2]/text()[2]", 28, "Lorem sed do eiusmod tempor.", "Text between br tags, textNode refs"], ["/div[2]/text()[2]", 0, "/div[2]", 4, "Lorem sed do eiusmod tempor.", "Text between br tags, elementNode ref at end"], ["/div[2]/text()[2]", 0, "/div[2]", 5, "Lorem sed do eiusmod tempor.", "Text between br tags, with <br/> at end"], ["/div[2]/text()[2]", 0, "/div[2]", 6, "Lorem sed do eiusmod tempor.", "Text between br tags, with <br/><p><br/></p> at end"], ["/div[2]/text()[2]", 0, "/div[2]", 7, "Lorem sed do eiusmod tempor.", "Text between br tags, with <br/><p><br/></p><br/> at end"], ["/div[2]", 3, "/div[2]/text()[2]", 28, "Lorem sed do eiusmod tempor.", "Text between br tags, elementNode ref at start"], ["/div[2]", 2, "/div[2]/text()[2]", 28, "Lorem sed do eiusmod tempor.", "Text between br tags, with <p><br/></p> at the start"], ["/div[2]", 1, "/div[2]/text()[2]", 28, "Lorem sed do eiusmod tempor.", "Text between br tags, with <br/><p><br/></p> at the start"]];
describe('Range', function() {
var mockSelection, r;
r = null;
mockSelection = null;
beforeEach(function() {
addFixture('range');
return mockSelection = function(ii) {
return new MockSelection(fix(), testData[ii]);
};
});
afterEach(function() {
delete a;
return clearFixtures();
});
describe(".nodeFromXPath()", function() {
var xpath;
xpath = window.require ? "/html/body/p/strong" : "/html/body/div/p/strong";
it("should parse a standard xpath string", function() {
var node;
node = Range.nodeFromXPath(xpath);
return assert.equal(node, $('strong')[0]);
});
return it("should parse an standard xpath string for an xml document", function() {
var node;
Annotator.$.isXMLDoc = function() {
return true;
};
node = Range.nodeFromXPath(xpath);
return assert.equal(node, $('strong')[0]);
});
});
describe("SerializedRange", function() {
beforeEach(function() {
return r = new Range.SerializedRange({
start: "/p/strong",
startOffset: 13,
end: "/p/strong",
endOffset: 27
});
});
describe("normalize", function() {
it("should return a normalized range", function() {
var norm;
norm = r.normalize(fix());
assert.isTrue(norm instanceof Range.NormalizedRange);
return assert.equal(norm.text(), "habitant morbi");
});
it("should return a normalized range with 0 offsets", function() {
var norm;
r.startOffset = 0;
norm = r.normalize(fix());
assert.isTrue(norm instanceof Range.NormalizedRange);
return assert.equal(norm.text(), "Pellentesque habitant morbi");
});
return it("should raise Range.RangeError if it cannot normalize the range", function() {
var check, e;
check = false;
try {
r.normalize($('<div/>')[0]);
} catch (_error) {
e = _error;
if (e instanceof Range.RangeError) {
check = true;
}
}
return assert.isTrue(check);
});
});
it("serialize() returns a serialized range", function() {
var seri;
seri = r.serialize(fix());
assert.equal(seri.start, "/p[1]/strong[1]");
assert.equal(seri.startOffset, 13);
assert.equal(seri.end, "/p[1]/strong[1]");
assert.equal(seri.endOffset, 27);
return assert.isTrue(seri instanceof Range.SerializedRange);
});
return it("toObject() returns a simple object", function() {
var obj;
obj = r.toObject();
assert.equal(obj.start, "/p/strong");
assert.equal(obj.startOffset, 13);
assert.equal(obj.end, "/p/strong");
assert.equal(obj.endOffset, 27);
return assert.equal(JSON.stringify(obj), '{"start":"/p/strong","startOffset":13,"end":"/p/strong","endOffset":27}');
});
});
describe("BrowserRange", function() {
var i, testBrowserRange, _i, _ref, _results;
beforeEach(function() {
var sel;
sel = mockSelection(0);
return r = new Range.BrowserRange(sel.getRangeAt(0));
});
it("normalize() returns a normalized range", function() {
var norm;
norm = r.normalize();
assert.equal(norm.start, norm.end);
return assert.equal(textInNormedRange(norm), 'habitant morbi');
});
testBrowserRange = function(i) {
return function() {
var norm, range, sel;
sel = mockSelection(i);
range = new Range.BrowserRange(sel.getRangeAt(0));
norm = range.normalize(fix());
return assert.equal(textInNormedRange(norm), sel.expectation);
};
};
_results = [];
for (i = _i = 0, _ref = testData.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
_results.push(it("should parse test range " + i + " (" + testData[i][5] + ")", testBrowserRange(i)));
}
return _results;
});
return describe("NormalizedRange", function() {
var sel;
sel = null;
beforeEach(function() {
var browserRange;
sel = mockSelection(7);
browserRange = new Range.BrowserRange(sel.getRangeAt(0));
return r = browserRange.normalize();
});
it("textNodes() returns an array of textNodes", function() {
var textNodes;
textNodes = r.textNodes();
assert.equal($.type(textNodes), 'array');
assert.lengthOf(textNodes, sel.endOffset);
return assert.equal(textNodes[0].nodeValue, 'Pellentesque habitant morbi tristique');
});
it("text() returns the textual contents of the range", function() {
return assert.equal(r.text(), sel.expectation);
});
describe("limit", function() {
var headText, para, paraText, paraText2, root;
headText = null;
paraText = null;
paraText2 = null;
para = null;
root = null;
beforeEach(function() {
var head;
headText = document.createTextNode("My Heading");
paraText = document.createTextNode("My paragraph");
paraText2 = document.createTextNode(" continues");
head = document.createElement('h1');
head.appendChild(headText);
para = document.createElement('p');
para.appendChild(paraText);
para.appendChild(paraText2);
root = document.createElement('div');
root.appendChild(head);
return root.appendChild(para);
});
it("should exclude any nodes not within the bounding element.", function() {
var range;
range = new Range.NormalizedRange({
commonAncestor: root,
start: headText,
end: paraText2
});
range = range.limit(para);
assert.equal(range.commonAncestor, para);
assert.equal(range.start, paraText);
return assert.equal(range.end, paraText2);
});
return it("should return null if no nodes fall within the bounds", function() {
var otherDiv, range;
otherDiv = document.createElement('div');
range = new Range.NormalizedRange({
commonAncestor: root,
start: headText,
end: paraText2
});
return assert.equal(range.limit(otherDiv), null);
});
});
return describe("toRange", function() {
return it("should return a new Range object", function() {
var mockRange;
mockRange = {
setStartBefore: sinon.spy(),
setEndAfter: sinon.spy()
};
sinon.stub(document, 'createRange').returns(mockRange);
r.toRange();
assert(document.createRange.calledOnce);
assert(mockRange.setStartBefore.calledOnce);
assert.isTrue(mockRange.setStartBefore.calledWith(r.start));
assert(mockRange.setEndAfter.calledOnce);
assert.isTrue(mockRange.setEndAfter.calledWith(r.end));
return document.createRange.restore();
});
});
});
});
/*
//@ sourceMappingURL=range_spec.map
*/