Skip to content

Commit

Permalink
Merge pull request #1 from blinkboxbooks/feature/support-text-element…
Browse files Browse the repository at this point in the history
…-ranges

Added support for ranges between element and text nodes.
  • Loading branch information
vilmosioo committed Sep 17, 2014
2 parents 948916b + 71b3cd4 commit f524991
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 0 deletions.
42 changes: 42 additions & 0 deletions src/models/cfi_generator.js
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,48 @@ EPUBcfi.Generator = {
return commonCFIComponent.substring(1, commonCFIComponent.length) + "," + range1CFI + "," + range2CFI;
},

generateRangeComponent : function (rangeStartElement, startOffset, rangeEndElement, endOffset, classBlacklist, elementBlacklist, idBlacklist) {
if(rangeStartElement.nodeType === Node.ELEMENT_NODE && rangeEndElement.nodeType === Node.ELEMENT_NODE){
return generator.generateElementRangeComponent(rangeStartElement, rangeEndElement, classBlacklist, elementBlacklist, idBlacklist);
} else if(rangeStartElement.nodeType === Node.TEXT_NODE && rangeEndElement.nodeType === Node.TEXT_NODE){
return generator.generateCharOffsetRangeComponent(rangeStartElement, startOffset, rangeEndElement, endOffset, classBlacklist, elementBlacklist, idBlacklist);
} else {
var docRange, range1CFI, range1OffsetStep, range2CFI, range2OffsetStep;

// Create a document range to find the common ancestor
docRange = document.createRange();
docRange.setStart(rangeStartElement, startOffset);
docRange.setEnd(rangeEndElement, endOffset);
commonAncestor = docRange.commonAncestorContainer;

if(rangeStartElement.nodeType === Node.ELEMENT_NODE){
this.validateStartElement(rangeStartElement);
range1CFI = this.createCFIElementSteps($(rangeStartElement), commonAncestor, classBlacklist, elementBlacklist, idBlacklist);
} else {
this.validateStartTextNode(rangeStartElement);
// Generate terminating offset and range 1
range1OffsetStep = this.createCFITextNodeStep($(rangeStartElement), startOffset, classBlacklist, elementBlacklist, idBlacklist);
range1CFI = this.createCFIElementSteps($(rangeStartElement).parent(), commonAncestor, classBlacklist, elementBlacklist, idBlacklist) + range1OffsetStep;
}

if(rangeEndElement.nodeType === Node.ELEMENT_NODE){
this.validateStartElement(rangeEndElement);
range2CFI = this.createCFIElementSteps($(rangeEndElement), commonAncestor, classBlacklist, elementBlacklist, idBlacklist);
} else {
this.validateStartTextNode(rangeEndElement);
// Generate terminating offset and range 1
range2OffsetStep = this.createCFITextNodeStep($(rangeEndElement), endOffset, classBlacklist, elementBlacklist, idBlacklist);
range2CFI = this.createCFIElementSteps($(rangeEndElement).parent(), commonAncestor, classBlacklist, elementBlacklist, idBlacklist) + range2OffsetStep;
}

// Generate shared component
commonCFIComponent = this.createCFIElementSteps($(commonAncestor), "html", classBlacklist, elementBlacklist, idBlacklist);

// Return the result
return commonCFIComponent.substring(1, commonCFIComponent.length) + "," + range1CFI + "," + range2CFI;
}
},

// Description: Generates a character offset CFI
// Arguments: The text node that contains the offset referenced by the cfi, the offset value, the name of the
// content document that contains the text node, the package document for this EPUB.
Expand Down
3 changes: 3 additions & 0 deletions src/templates/cfi_library_template.js.erb
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,9 @@
},
generateElementRangeComponent : function (rangeStartElement, rangeEndElement, classBlacklist, elementBlacklist, idBlacklist) {
return generator.generateElementRangeComponent(rangeStartElement, rangeEndElement, classBlacklist, elementBlacklist, idBlacklist);
},
generateRangeComponent : function (rangeStartElement, startOffset, rangeEndElement, endOffset, classBlacklist, elementBlacklist, idBlacklist) {
return generator.generateRangeComponent(rangeStartElement, startOffset, rangeEndElement, endOffset, classBlacklist, elementBlacklist, idBlacklist);
}
};

Expand Down

0 comments on commit f524991

Please sign in to comment.