Commit e2f8fd13 authored by csillag's avatar csillag

Added PDF support - we can now annotate PDF documents

 * Update dom-text-mapper to fcd26632 (master branch)
 * Update dom-text-matcher to fcd26632 (master branch)
 * Update Annotator to f1e08bdd (maintenance branch)

 * Updated assets.py for the changed Annotator files and libraries
 * Updated JSChannel with a patch to allow talking to pdf.js
 * Updated our code to follow Annotator API changess
 * Updated the heatmap for two-phase anchoring and virtual anchors

The change in embed.txt fixes a sporadic code insertation problem.

For pages with no script tags, our embed script sometimes crashed.
I have already fixed this problem for YepNope (see #607), but now
it has come back in our own code.

I am not sure why have not this happened before,
but it definitely was happening now.

I applied the same fix that worked with YepNope. It worked again.
parent 686fe9cf
...@@ -12,6 +12,8 @@ class Annotator.Guest extends Annotator ...@@ -12,6 +12,8 @@ class Annotator.Guest extends Annotator
# Plugin configuration # Plugin configuration
options: options:
FuzzyAnchoring: {}
PDF: {}
Document: {} Document: {}
# Internal state # Internal state
...@@ -40,7 +42,7 @@ class Annotator.Guest extends Annotator ...@@ -40,7 +42,7 @@ class Annotator.Guest extends Annotator
formatted = {} formatted = {}
if annotation.document? if annotation.document?
formatted['uri'] = @plugins.Document.uri() formatted['uri'] = @plugins.Document.uri()
for k, v of annotation when k isnt 'highlights' for k, v of annotation when k not in ['highlights', 'anchors']
formatted[k] = v formatted[k] = v
# Work around issue in jschannel where a repeated object is considered # Work around issue in jschannel where a repeated object is considered
# recursive, even if it is not its own ancestor. # recursive, even if it is not its own ancestor.
...@@ -65,6 +67,14 @@ class Annotator.Guest extends Annotator ...@@ -65,6 +67,14 @@ class Annotator.Guest extends Annotator
if not @plugins[name] if not @plugins[name]
this.addPlugin(name, opts) this.addPlugin(name, opts)
this.subscribe "annotationPhysicallyAnchored", (anchor) =>
if anchor.annotation.id? # Is this a finished annotation ?
@plugins.Heatmap._update()
this.subscribe "annotationPhysicallyUnAnchored", (anchor) =>
if anchor.annotation.id? # Is this a finished annotation ?
@plugins.Heatmap._update()
# Scan the document text with the DOM Text libraries # Scan the document text with the DOM Text libraries
this.scanDocument "Annotator initialized" this.scanDocument "Annotator initialized"
...@@ -135,9 +145,7 @@ class Annotator.Guest extends Annotator ...@@ -135,9 +145,7 @@ class Annotator.Guest extends Annotator
scanDocument: (reason = "something happened") => scanDocument: (reason = "something happened") =>
try try
console.log "Analyzing host frame, because " + reason + "..." console.log "Analyzing host frame, because " + reason + "..."
r = this._scan() this._scan()
scanTime = r.time
console.log "Traversal+scan took " + scanTime + " ms."
catch e catch e
console.log e.message console.log e.message
console.log e.stack console.log e.stack
...@@ -149,8 +157,6 @@ class Annotator.Guest extends Annotator ...@@ -149,8 +157,6 @@ class Annotator.Guest extends Annotator
setTimeout => setTimeout =>
unless @selectedRanges?.length unless @selectedRanges?.length
@panel?.notify method: 'back' @panel?.notify method: 'back'
this._setupMatching()
@domMatcher.setRootNode @wrapper[0]
this this
# These methods aren't used in the iframe-hosted configuration of Annotator. # These methods aren't used in the iframe-hosted configuration of Annotator.
...@@ -342,11 +348,7 @@ class Annotator.Guest extends Annotator ...@@ -342,11 +348,7 @@ class Annotator.Guest extends Annotator
# Uncomment the traces below to investigate this further. # Uncomment the traces below to investigate this further.
deleteAnnotation: (annotation) -> deleteAnnotation: (annotation) ->
if annotation.deleted if annotation.deleted
# console.log "Not deleting annotation the second time."
# console.trace()
return return
else else
# console.log "Deleting an annotation in " + @role + "."
# console.trace()
annotation.deleted = true annotation.deleted = true
super super
...@@ -115,6 +115,32 @@ class Annotator.Plugin.Heatmap extends Annotator.Plugin ...@@ -115,6 +115,32 @@ class Annotator.Plugin.Heatmap extends Annotator.Plugin
.interpolate(d3.interpolateHcl) .interpolate(d3.interpolateHcl)
c(v).toString() c(v).toString()
_collectPendingVirtualAnnotations: (startIndex, endIndex) ->
results = []
for index in [startIndex .. endIndex]
anchors = @annotator.anchors[index]
if anchors?
$.merge results, (anchor.annotation for anchor in anchors when not anchor.allRendered)
results
_scrollTo: (where, up) ->
wrapper = @annotator.wrapper
defaultView = wrapper[0].ownerDocument.defaultView
pad = defaultView.innerHeight * .2
where?.scrollintoview
complete: ->
if this.parentNode is this.ownerDocument
scrollable = $(this.ownerDocument.body)
else
scrollable = $(this)
top = scrollable.scrollTop()
correction = pad * (if up then -1 else +1)
scrollable.stop().animate {scrollTop: top + correction}, 300
_scrollUpTo: (where) -> this._scrollTo where, true
_scrollDownTo: (where) -> this._scrollTo where, false
_update: => _update: =>
wrapper = @annotator.wrapper wrapper = @annotator.wrapper
highlights = wrapper.find('.annotator-hl') highlights = wrapper.find('.annotator-hl')
...@@ -123,6 +149,17 @@ class Annotator.Plugin.Heatmap extends Annotator.Plugin ...@@ -123,6 +149,17 @@ class Annotator.Plugin.Heatmap extends Annotator.Plugin
# Keep track of buckets of annotations above and below the viewport # Keep track of buckets of annotations above and below the viewport
above = [] above = []
below = [] below = []
# Get the page numbers
mapper = @annotator.domMapper
firstPage = 0
currentPage = mapper.getPageIndex()
lastPage = mapper.getPageCount() - 1
# Collect the pending virtual anchors from above and below
$.merge above, this._collectPendingVirtualAnnotations 0, currentPage-1
$.merge below, this._collectPendingVirtualAnnotations currentPage+1, lastPage
comments = @annotator.comments.slice() comments = @annotator.comments.slice()
# Construct control points for the heatmap highlights # Construct control points for the heatmap highlights
...@@ -322,50 +359,54 @@ class Annotator.Plugin.Heatmap extends Annotator.Plugin ...@@ -322,50 +359,54 @@ class Annotator.Plugin.Heatmap extends Annotator.Plugin
# Does one of a few things when a tab is clicked depending on type # Does one of a few things when a tab is clicked depending on type
.on 'click', (bucket) => .on 'click', (bucket) =>
d3.event.stopPropagation() d3.event.stopPropagation()
highlights = wrapper.find('.annotator-hl')
pad = defaultView.innerHeight * .2 pad = defaultView.innerHeight * .2
# If it's the upper tab, scroll to next bucket above # If it's the upper tab, scroll to next bucket above (virtual version)
if @isUpper bucket if (@isUpper bucket)
@dynamicBucket = true @dynamicBucket = true
threshold = defaultView.pageYOffset # Find the next annotation, based on character position
{next} = highlights.toArray().reduce (acc, hl) -> {next} = @buckets[bucket].reduce (acc, ann) ->
{pos, next} = acc {start, next} = acc
if pos < $(hl).offset().top < threshold if start < ann.anchors[0].virtual.start
pos: $(hl).offset().top start: ann.anchors[0].virtual.start
next: $(hl) next: ann
else else
acc acc
, {pos: 0, next: null} , {start: 0, next: null}
next?.scrollintoview anchor = next.anchors[0] # This is where we want to go
complete: -> startPage = anchor.virtual.startPage
if this.parentNode is this.ownerDocument if anchor.physical[startPage]? # Is this rendered?
scrollable = $(this.ownerDocument.body) hl = anchor.physical[startPage].highlights
else this._scrollUpTo $(hl)
scrollable = $(this) else # Not rendered yet
top = scrollable.scrollTop() @pendingScroll =
scrollable.stop().animate {scrollTop: top - pad}, 300 anchor: anchor
page: startPage
# If it's the lower tab, scroll to next bucket below @annotator.domMapper.setPageIndex startPage
else if @isLower bucket
# If it's the lower tab, scroll to next bucket below (virtual version)
else if (@isLower bucket)
@dynamicBucket = true @dynamicBucket = true
threshold = defaultView.pageYOffset + defaultView.innerHeight - pad # Find the next annotation, based on character position
{next} = highlights.toArray().reduce (acc, hl) -> {next} = @buckets[bucket].reduce (acc, ann) ->
{pos, next} = acc {start, next} = acc
if threshold < $(hl).offset().top < pos if ann.anchors[0].virtual.start < start
pos: $(hl).offset().top start: ann.anchors[0].virtual.start
next: $(hl) next: ann
else else
acc acc
, {pos: Number.MAX_VALUE, next: null} , {start: @annotator.domMapper.getCorpus().length, next: null}
next?.scrollintoview anchor = next.anchors[0] # This is where we want to go
complete: -> startPage = anchor.virtual.startPage
if this.parentNode is this.ownerDocument if anchor.physical[startPage]? # Is this rendered?
scrollable = $(this.ownerDocument.body) hl = anchor.physical[startPage].highlights
else this._scrollDownTo $(hl)
scrollable = $(this) else # Not rendered yet
top = scrollable.scrollTop() # Pass this value to our listener
scrollable.stop().animate {scrollTop: top + pad}, 300 @pendingScroll =
anchor: anchor
page: startPage
@annotator.domMapper.setPageIndex startPage
# If it's neither of the above, load the bucket into the viewer # If it's neither of the above, load the bucket into the viewer
else else
...@@ -392,6 +433,14 @@ class Annotator.Plugin.Heatmap extends Annotator.Plugin ...@@ -392,6 +433,14 @@ class Annotator.Plugin.Heatmap extends Annotator.Plugin
if @dynamicBucket if @dynamicBucket
this._fillDynamicBucket() this._fillDynamicBucket()
# Event handler to finish scrolling when we have to wait for rendering
@annotator.subscribe "annotationPhysicallyAnchored", (anchor) =>
if @pendingScroll? and anchor is @pendingScroll.anchor
# The wanted annotation has been anchored.
hl = anchor.physical[@pendingScroll.page].highlights
this._scrollDownTo $(hl)
delete @pendingScroll
_fillDynamicBucket: => _fillDynamicBucket: =>
top = window.pageYOffset top = window.pageYOffset
bottom = top + $(window).innerHeight() bottom = top + $(window).innerHeight()
......
...@@ -99,7 +99,9 @@ class Annotator extends Delegator ...@@ -99,7 +99,9 @@ class Annotator extends Delegator
return this unless Annotator.supported() return this unless Annotator.supported()
this._setupDocumentEvents() unless @options.readOnly this._setupDocumentEvents() unless @options.readOnly
this._setupWrapper() this._setupWrapper()
this._setupMatching() unless @options.noMatching unless @options.noMatching
this._setupDocumentAccessStrategies()
this._setupVirtualAnchoringStrategies()
this._setupViewer()._setupEditor() this._setupViewer()._setupEditor()
this._setupDynamicStyle() this._setupDynamicStyle()
...@@ -109,19 +111,60 @@ class Annotator extends Delegator ...@@ -109,19 +111,60 @@ class Annotator extends Delegator
# Create adder # Create adder
this.adder = $(this.html.adder).appendTo(@wrapper).hide() this.adder = $(this.html.adder).appendTo(@wrapper).hide()
# Initializes the components used for analyzing the DOM # Initializes the available document access strategies
_setupMatching: -> _setupDocumentAccessStrategies: ->
@documentAccessStrategies = [
@domMapper = new DomTextMapper() # Default strategy for simple HTML documents.
@domMatcher = new DomTextMatcher @domMapper # Also the generic fallback.
@domMapper.setRootNode @wrapper[0] name: "DOM generic"
mapper: DomTextMapper
init: => @domMapper.setRootNode @wrapper[0]
]
this
# Initializes the components used for analyzing the document
_setupMapper: ->
if @domMapper? then return
# Go over the available strategies
for s in @documentAccessStrategies
# Can we use this strategy for this document?
if s.mapper.applicable()
@documentAccessStrategy = s
console.log "Selected document access strategy: " + s.name
@domMapper = new s.mapper()
@anchors = {}
addEventListener "docPageMapped", (evt) =>
@_physicallyAnchorPage evt.pageIndex
addEventListener "docPageUnmapped", (evt) =>
@_physicallyUnAnchorPage evt.pageIndex
s.init?()
return this
# Initializes the available virtual anchoring strategies
_setupVirtualAnchoringStrategies: ->
@virtualAnchoringStrategies = [
# Simple strategy based on DOM Range
name: "range"
code: this.createVirtualAnchorFromRangeSelector
,
# Position-based strategy. (The quote is verified.)
# This can handle document structure changes,
# but not the content changes.
name: "position"
code: this.createVirtualAnchorFromPositionSelector
]
this this
# Perform a scan of the DOM. Required for finding anchors. # Perform a scan of the DOM. Required for finding anchors.
_scan: -> _scan: ->
@domMatcher.scan() unless @domMapper # If we haven't yet created a document mapper,
this._setupMapper() # do so now.
@pendingScan = @domMapper.scan()
# Wraps the children of @element in a @wrapper div. NOTE: This method will also # Wraps the children of @element in a @wrapper div. NOTE: This method will also
# remove any script elements inside @element to prevent them re-executing. # remove any script elements inside @element to prevent them re-executing.
# #
...@@ -251,8 +294,7 @@ class Annotator extends Delegator ...@@ -251,8 +294,7 @@ class Annotator extends Delegator
unless rangeEnd? unless rangeEnd?
throw new Error "Called getTextQuoteSelector(range) on a range with no valid end." throw new Error "Called getTextQuoteSelector(range) on a range with no valid end."
endOffset = (@domMapper.getInfoForNode rangeEnd).end endOffset = (@domMapper.getInfoForNode rangeEnd).end
quote = @domMapper.getCorpus()[startOffset .. endOffset-1].trim()
quote = @domMapper.getContentForCharRange startOffset, endOffset
[prefix, suffix] = @domMapper.getContextForCharRange startOffset, endOffset [prefix, suffix] = @domMapper.getContextForCharRange startOffset, endOffset
selector = selector =
type: "TextQuoteSelector" type: "TextQuoteSelector"
...@@ -364,199 +406,89 @@ class Annotator extends Delegator ...@@ -364,199 +406,89 @@ class Annotator extends Delegator
# Try to determine the anchor position for a target # Try to determine the anchor position for a target
# using the saved Range selector. The quote is verified. # using the saved Range selector. The quote is verified.
findAnchorFromRangeSelector: (target) -> createVirtualAnchorFromRangeSelector: (target) ->
selector = this.findSelector target.selector, "RangeSelector" selector = this.findSelector target.selector, "RangeSelector"
unless selector? then return null unless selector? then return null
# Try to apply the saved XPath # Try to apply the saved XPath
normalizedRange = Range.sniff(selector).normalize @wrapper[0] try
normalizedRange = Range.sniff(selector).normalize @wrapper[0]
catch error
#console.log "Could not apply XPath selector to current document, " +
# "because the structure has changed."
return null
startInfo = @domMapper.getInfoForNode normalizedRange.start
startOffset = startInfo.start
endInfo = @domMapper.getInfoForNode normalizedRange.end
endOffset = endInfo.end
content = @domMapper.getCorpus()[startOffset .. endOffset-1].trim()
currentQuote = this.normalizeString content
# Look up the saved quote # Look up the saved quote
savedQuote = this.getQuoteForTarget target savedQuote = this.getQuoteForTarget target
if savedQuote? if savedQuote? and currentQuote isnt savedQuote
# We have a saved quote, let's compare it to current content #console.log "Could not apply XPath selector to current document, " +
startInfo = @domMapper.getInfoForNode normalizedRange.start # "because the quote has changed. (Saved quote is '#{savedQuote}'." +
startOffset = startInfo.start # " Current quote is '#{currentQuote}'.)"
endInfo = @domMapper.getInfoForNode normalizedRange.end return null
endOffset = endInfo.end
content = @domMapper.getContentForCharRange startOffset, endOffset # Create a "text poision"-type virtual anchor from this range
currentQuote = this.normalizeString content startPage: startInfo.pageIndex ? 0
if currentQuote isnt savedQuote start: startInfo.start
console.log "Could not apply XPath selector to current document \ endPage: endInfo.pageIndex ? 0
because the quote has changed. (Saved quote is '#{savedQuote}'. \ end: endInfo.end
Current quote is '#{currentQuote}'.)" quote: currentQuote
return null
else
# console.log "Saved quote matches."
else
console.log "No saved quote, nothing to compare. Assume that it's OK."
range: normalizedRange
quote: savedQuote
# Try to determine the anchor position for a target # Try to determine the anchor position for a target
# using the saved position selector. The quote is verified. # using the saved position selector. The quote is verified.
findAnchorFromPositionSelector: (target) -> createVirtualAnchorFromPositionSelector: (target) ->
selector = this.findSelector target.selector, "TextPositionSelector" selector = this.findSelector target.selector, "TextPositionSelector"
unless selector? then return null unless selector? then return null
content = @domMapper.getCorpus()[selector.start .. selector.end-1].trim()
currentQuote = this.normalizeString content
savedQuote = this.getQuoteForTarget target savedQuote = this.getQuoteForTarget target
if savedQuote? if savedQuote? and currentQuote isnt savedQuote
# We have a saved quote, let's compare it to current content # We have a saved quote, let's compare it to current content
content = @domMapper.getContentForCharRange selector.start, selector.end #console.log "Could not apply position selector" +
currentQuote = this.normalizeString content # " [#{selector.start}:#{selector.end}] to current document," +
if currentQuote isnt savedQuote # " because the quote has changed. " +
console.log "Could not apply position selector" + # "(Saved quote is '#{savedQuote}'." +
" [#{selector.start}:#{selector.end}] to current document," + # " Current quote is '#{currentQuote}'.)"
" because the quote has changed." +
"(Saved quote is '#{savedQuote}'." +
" Current quote is '#{currentQuote}'.)"
return null
else
# console.log "Saved quote matches."
else
console.log "No saved quote, nothing to compare. Assume that it's okay."
# OK, we have everything. Create a range from this.
mappings = this.domMapper.getMappingsForCharRange selector.start,
selector.end
browserRange = new Range.BrowserRange mappings.realRange
normalizedRange = browserRange.normalize @wrapper[0]
range: normalizedRange
quote: savedQuote
findAnchorWithTwoPhaseFuzzyMatching: (target) ->
# Fetch the quote and the context
quoteSelector = this.findSelector target.selector, "TextQuoteSelector"
prefix = quoteSelector?.prefix
suffix = quoteSelector?.suffix
quote = quoteSelector?.exact
# No context, to joy
unless (prefix? and suffix?) then return null
# Fetch the expected start and end positions
posSelector = this.findSelector target.selector, "TextPositionSelector"
expectedStart = posSelector?.start
expectedEnd = posSelector?.end
options =
contextMatchDistance: @domMapper.getDocLength() * 2
contextMatchThreshold: 0.5
patternMatchThreshold: 0.5
flexContext: true
result = @domMatcher.searchFuzzyWithContext prefix, suffix, quote,
expectedStart, expectedEnd, false, null, options
# If we did not got a result, give up
unless result.matches.length
console.log "Fuzzy matching did not return any results. Giving up on two-phase strategy."
return null
# here is our result
match = result.matches[0]
console.log "2-phase fuzzy found match:"
console.log match
# convert it to a Range
browserRange = new Range.BrowserRange match.realRange
normalizedRange = browserRange.normalize @wrapper[0]
# return the anchor
anchor =
range: normalizedRange
quote: unless match.exact then match.found
diffHTML: unless match.exact then match.comparison.diffHTML
diffCaseOnly: unless match.exact then match.exactExceptCase
anchor
findAnchorWithFuzzyMatching: (target) ->
# Fetch the quote
quoteSelector = this.findSelector target.selector, "TextQuoteSelector"
quote = quoteSelector?.exact
# No quote, no joy
unless quote? then return null
# For too short quotes, this strategy is bound to return false positives.
# See https://github.com/hypothesis/h/issues/853 for details.
return unless quote.length >= 32
# Get a starting position for the search
posSelector = this.findSelector target.selector, "TextPositionSelector"
expectedStart = posSelector?.start
# Get full document length
len = this.domMapper.getDocLength()
# If we don't have the position saved, start at the middle of the doc
expectedStart ?= len / 2
# Do the fuzzy search
options =
matchDistance: len * 2
withFuzzyComparison: true
result = @domMatcher.searchFuzzy quote, expectedStart, false, null, options
# If we did not got a result, give up
unless result.matches.length
console.log "Fuzzy matching did not return any results. Giving up on one-phase strategy."
return null return null
# here is our result # OK, we have everything.
match = result.matches[0] # Compile the data required to store this virtual anchor
console.log "1-phase fuzzy found match:" startPage: @domMapper.getPageIndexForPos selector.start
console.log match endPage: @domMapper.getPageIndexForPos selector.end
start: selector.start
# convert it to a Range end: selector.end
browserRange = new Range.BrowserRange match.realRange quote: currentQuote
normalizedRange = browserRange.normalize @wrapper[0]
# return the anchor
anchor =
range: normalizedRange
quote: unless match.exact then match.found
diffHTML: unless match.exact then match.comparison.diffHTML
diffCaseOnly: unless match.exact then match.exactExceptCase
anchor
# Try to find the right anchoring point for a given target # Try to find the right anchoring point for a given target
# #
# Returns a normalized range if succeeded, null otherwise # Returns a normalized range if succeeded, null otherwise
findAnchor: (target) -> createVirtualAnchor: (target) ->
unless target? unless target?
throw new Error "Trying to find anchor for null target!" throw new Error "Trying to find anchor for null target!"
# console.log "Trying to find anchor for target: " # console.log "Trying to find anchor for target: "
# console.log target # console.log target
strategies = [
# Simple strategy based on DOM Range
this.findAnchorFromRangeSelector
# Position-based strategy. (The quote is verified.)
# This can handle document structure changes,
# but not the content changes.
this.findAnchorFromPositionSelector
# Two-phased fuzzy text matching strategy. (Using context and quote.)
# This can handle document structure changes,
# and also content changes.
this.findAnchorWithTwoPhaseFuzzyMatching
# Naive fuzzy text matching strategy. (Using only the quote.)
# This can handle document structure changes,
# and also content changes.
this.findAnchorWithFuzzyMatching
]
error = null error = null
anchor = null anchor = null
for fn in strategies for s in @virtualAnchoringStrategies
try try
anchor ?= fn.call this, target a = s.code.call this, target
if a
# console.log "Strategy '" + s.name + "' yielded a virtual anchor."
return result: a
# else
# console.log "Strategy '" + s.name + "' did NOT yield a virtual anchor."
catch error catch error
unless error instanceof Range.RangeError # console.log "Strategy '" + s.name + "' has thrown an error."
if error instanceof Range.RangeError
return error: error
else
throw error throw error
{error, anchor}
# Public: Initialises an annotation either from an object representation or # Public: Initialises an annotation either from an object representation or
# an annotation created with Annotator#createAnnotation(). It finds the # an annotation created with Annotator#createAnnotation(). It finds the
...@@ -579,7 +511,6 @@ class Annotator extends Delegator ...@@ -579,7 +511,6 @@ class Annotator extends Delegator
# #
# Returns the initialised annotation. # Returns the initialised annotation.
setupAnnotation: (annotation) -> setupAnnotation: (annotation) ->
root = @wrapper[0]
ranges = annotation.ranges or @selectedRanges or [] ranges = annotation.ranges or @selectedRanges or []
# Upgrade format from v1.2.6 and earlier # Upgrade format from v1.2.6 and earlier
...@@ -590,20 +521,43 @@ class Annotator extends Delegator ...@@ -590,20 +521,43 @@ class Annotator extends Delegator
unless annotation.target? unless annotation.target?
throw new Error "Can not run setupAnnotation(). No target or selection available." throw new Error "Can not run setupAnnotation(). No target or selection available."
normedRanges = []
annotation.quote = [] annotation.quote = []
annotation.anchors = []
annotation.ranges = []
annotation.highlights = []
for t in annotation.target for t in annotation.target
try try
{anchor, error} = this.findAnchor t result = this.createVirtualAnchor t
if error instanceof Range.RangeError vAnchor = result.result
this.publish('rangeNormalizeFail', [annotation, error.range, error]) if result.error? instanceof Range.RangeError
if anchor? this.publish 'rangeNormalizeFail', [annotation, result.error.range, result.error]
t.quote = anchor.quote or $.trim(anchor.range.text()) if vAnchor?
t.diffHTML = anchor.diffHTML annotation.quote.push t.quote = vAnchor.quote
t.diffCaseOnly = anchor.diffCaseOnly delete vAnchor.quote
normedRanges.push anchor.range t.diffHTML = vAnchor.diffHTML
annotation.quote.push t.quote delete vAnchor.diffHTML
t.diffCaseOnly = vAnchor.diffCaseOnly
delete vAnchor.diffCaseOnly
# Create a new anchor object, starting with a virtual anchor
anchor =
annotation: annotation
target: t
virtual: vAnchor
physical: {}
# Store this anchor for the annotation
annotation.anchors.push anchor
# Store the anchor for all involved pages
for pageIndex in [vAnchor.startPage .. vAnchor.endPage]
@anchors[pageIndex] ?= []
@anchors[pageIndex].push anchor
# Realizing the anchor
this._physicallyAnchor anchor
else else
console.log "Could not find anchor target for annotation '" + console.log "Could not find anchor target for annotation '" +
annotation.id + "'." annotation.id + "'."
...@@ -612,20 +566,9 @@ class Annotator extends Delegator ...@@ -612,20 +566,9 @@ class Annotator extends Delegator
console.log exception.message console.log exception.message
console.log exception console.log exception
annotation.ranges = []
annotation.highlights = []
for normed in normedRanges
annotation.ranges.push normed.serialize(@wrapper[0], '.annotator-hl')
$.merge annotation.highlights, this.highlightRange(normed)
# Join all the quotes into one string. # Join all the quotes into one string.
annotation.quote = annotation.quote.join(' / ') annotation.quote = annotation.quote.join(' / ')
# Save the annotation data on each highlighter element.
$(annotation.highlights).data('annotation', annotation)
annotation annotation
# Public: Publishes the 'beforeAnnotationUpdated' and 'annotationUpdated' # Public: Publishes the 'beforeAnnotationUpdated' and 'annotationUpdated'
...@@ -657,12 +600,11 @@ class Annotator extends Delegator ...@@ -657,12 +600,11 @@ class Annotator extends Delegator
# #
# Returns deleted annotation. # Returns deleted annotation.
deleteAnnotation: (annotation) -> deleteAnnotation: (annotation) ->
if annotation.highlights? if annotation.anchors?
for h in annotation.highlights when h.parentNode? for a in annotation.anchors
child = h.childNodes[0] for page, data of a.physical
$(h).replaceWith(h.childNodes) this._physicallyUnAnchor a, page
window.DomTextMapper.changed child.parentNode, this._removeAnchor a
"removed hilite (annotation deleted)"
this.publish('annotationDeleted', [annotation]) this.publish('annotationDeleted', [annotation])
annotation annotation
...@@ -693,7 +635,17 @@ class Annotator extends Delegator ...@@ -693,7 +635,17 @@ class Annotator extends Delegator
this.publish 'annotationsLoaded', [clone] this.publish 'annotationsLoaded', [clone]
clone = annotations.slice() clone = annotations.slice()
loader(annotations) if annotations.length
if annotations.length # Do we have to do something?
if @pendingScan? # Is there a pending scan?
# Schedule the parsing the annotations for
# when scan has finished
@pendingScan.then =>
#console.log "Document scan finished. Can start anchoring."
setTimeout => loader annotations
else # no pending scan
# We can start parsing them right away
loader annotations
this this
# Public: Calls the Store#dumpAnnotations() method. # Public: Calls the Store#dumpAnnotations() method.
...@@ -1034,6 +986,112 @@ class Annotator extends Delegator ...@@ -1034,6 +986,112 @@ class Annotator extends Delegator
# Delete highlight elements. # Delete highlight elements.
this.deleteAnnotation annotation this.deleteAnnotation annotation
# Virtual/Physical anchoring
# Remove an anchor from all involved pages
_removeAnchor: (anchor) ->
# Go over all the pages
for index in [anchor.virtual.startPage .. anchor.virtual.endPage]
# Remove the anchor from the list
i = @anchors[index].indexOf anchor
@anchors[index][i..i] = []
# Kill the list if it's empty
delete @anchors[index] unless @anchors[index].length
_physicallyAnchor: (anchor) ->
return if anchor.allRendered # If we have everything, go home
vAnchor = anchor.virtual
pAnchor = anchor.physical
# Collect the pages that are already rendered
renderedPages = [vAnchor.startPage .. vAnchor.endPage].filter (index) =>
@domMapper.isPageMapped index
# Collect the pages that are already rendered, but not yet anchored
pagesTodo = renderedPages.filter (index) -> not pAnchor[index]?
return unless pagesTodo.length # Return if nothing to do
# First calculate the ranges
mappings = @domMapper.getMappingsForCharRange vAnchor.start, vAnchor.end, pagesTodo
for page, section of mappings.sections
browserRange = new Range.BrowserRange section.realRange
range = browserRange.normalize @wrapper[0]
# Get the serialized range
serializedRange = range.serialize @wrapper[0], '.annotator-hl'
# Add the range to the annotation
anchor.annotation.ranges.push serializedRange
# Create a highlights, and link them with the annotation
highlights = this.highlightRange range
$(highlights).data('annotation', anchor.annotation)
$.merge anchor.annotation.highlights, highlights
# Add the newly mapped page to the physical anchor
pAnchor[page] =
range: serializedRange
highlights: highlights
anchor.allRendered = renderedPages.length is vAnchor.endPage - vAnchor.startPage + 1
# Announce the anchoring
this.publish 'annotationPhysicallyAnchored', anchor
# Physically anchor targets to a given pages
_physicallyAnchorPage: (index) ->
# Fetch the anchors related to this page
anchors = @anchors[index]
# If there are no anchors, or the page is not mapped, give up
return unless anchors? and @domMapper.isPageMapped index
# Go over all anchors
for anchor in anchors
this._physicallyAnchor anchor
# Remove a given physical anchor from a given page
_physicallyUnAnchor: (anchor, pageIndex) ->
data = anchor.physical[pageIndex]
return unless data? # No physical anchor for this page
ann = anchor.annotation
# remove the range added by this anchor
i = ann.ranges.indexOf data.range
ann.ranges[i..i] = []
# remove the highlights added by this anchor
for hl in data.highlights
# Is this highlight actually the part of the document?
if hl.parentNode? and @domMapper.isPageMapped pageIndex
# We should restore original state
child = hl.childNodes[0]
$(hl).replaceWith hl.childNodes
window.DomTextMapper.changed child.parentNode,
"removed hilite (annotation deleted)"
i = ann.highlights.indexOf hl
ann.highlights[i..i] = []
delete anchor.physical[pageIndex]
# Mark this anchor as not fully rendered
anchor.allRendered = false
# Publish un-anchoring event
this.publish 'annotationPhysicallyUnAnchored', anchor
# Remove physical anchors from a given page
_physicallyUnAnchorPage: (index) ->
# Go over all virtual anchors related to this page
for anchor in @anchors[index] ? []
this._physicallyUnAnchor anchor, index
# Create namespace for Annotator plugins # Create namespace for Annotator plugins
class Annotator.Plugin extends Delegator class Annotator.Plugin extends Delegator
constructor: (element, options) -> constructor: (element, options) ->
......
# Annotator plugin for fuzzy text matching
class Annotator.Plugin.FuzzyAnchoring extends Annotator.Plugin
pluginInit: ->
# Initialize the text matcher library
@textFinder = new DomTextMatcher => @annotator.domMapper.getCorpus()
# Register our fuzzy strategies
@annotator.virtualAnchoringStrategies.push
# Two-phased fuzzy text matching strategy. (Using context and quote.)
# This can handle document structure changes,
# and also content changes.
name: "two-phase fuzzy"
code: this.createVirtualAnchorWithTwoPhaseFuzzyMatching
@annotator.virtualAnchoringStrategies.push
# Naive fuzzy text matching strategy. (Using only the quote.)
# This can handle document structure changes,
# and also content changes.
name: "one-phase fuzzy"
code: this.createVirtualAnchorWithFuzzyMatching
createVirtualAnchorWithTwoPhaseFuzzyMatching: (target) =>
# Fetch the quote and the context
quoteSelector = @annotator.findSelector target.selector, "TextQuoteSelector"
prefix = quoteSelector?.prefix
suffix = quoteSelector?.suffix
quote = quoteSelector?.exact
# No context, to joy
unless (prefix? and suffix?) then return null
# Fetch the expected start and end positions
posSelector = @annotator.findSelector target.selector, "TextPositionSelector"
expectedStart = posSelector?.start
expectedEnd = posSelector?.end
options =
contextMatchDistance: @annotator.domMapper.getCorpus().length * 2
contextMatchThreshold: 0.5
patternMatchThreshold: 0.5
flexContext: true
result = @textFinder.searchFuzzyWithContext prefix, suffix, quote,
expectedStart, expectedEnd, false, options
# If we did not got a result, give up
unless result.matches.length
# console.log "Fuzzy matching did not return any results. Giving up on two-phase strategy."
return null
# here is our result
match = result.matches[0]
# console.log "2-phase fuzzy found match at: [" + match.start + ":" +
# match.end + "]: '" + match.found + "' (exact: " + match.exact + ")"
# OK, we have everything
# Compile the data required to store this virtual anchor
start: match.start
end: match.end
startPage: @annotator.domMapper.getPageIndexForPos match.start
endPage: @annotator.domMapper.getPageIndexForPos match.end
quote: match.found
diffHTML: unless match.exact then match.comparison.diffHTML
diffCaseOnly: unless match.exact then match.exactExceptCase
createVirtualAnchorWithFuzzyMatching: (target) =>
# Fetch the quote
quoteSelector = @annotator.findSelector target.selector, "TextQuoteSelector"
quote = quoteSelector?.exact
# No quote, no joy
unless quote? then return null
# For too short quotes, this strategy is bound to return false positives.
# See https://github.com/hypothesis/h/issues/853 for details.
return unless quote.length >= 32
# Get a starting position for the search
posSelector = @annotator.findSelector target.selector, "TextPositionSelector"
expectedStart = posSelector?.start
# Get full document length
len = @annotator.domMapper.getCorpus().length
# If we don't have the position saved, start at the middle of the doc
expectedStart ?= len / 2
# Do the fuzzy search
options =
matchDistance: len * 2
withFuzzyComparison: true
result = @textFinder.searchFuzzy quote, expectedStart, false, options
# If we did not got a result, give up
unless result.matches.length
# console.log "Fuzzy matching did not return any results. Giving up on one-phase strategy."
return null
# here is our result
match = result.matches[0]
# console.log "1-phase fuzzy found match at: [" + match.start + ":" +
# match.end + "]: '" + match.found + "' (exact: " + match.exact + ")"
# OK, we have everything
# Compile the data required to store this virtual anchor
start: match.start
end: match.end
startPage: @annotator.domMapper.getPageIndexForPos match.start
endPage: @annotator.domMapper.getPageIndexForPos match.end
quote: match.found
diffHTML: unless match.exact then match.comparison.diffHTML
diffCaseOnly: unless match.exact then match.exactExceptCase
...@@ -29,7 +29,7 @@ Annotator::setupPlugins = (config={}, options={}) -> ...@@ -29,7 +29,7 @@ Annotator::setupPlugins = (config={}, options={}) ->
win = util.getGlobal() win = util.getGlobal()
# Set up the default plugins. # Set up the default plugins.
plugins = ['Unsupported', 'Auth', 'Tags', 'Filter', 'Store', 'AnnotateItPermissions'] plugins = ['Unsupported', 'Auth', 'Tags', 'Filter', 'Store', 'AnnotateItPermissions', "FuzzyAnchoring", "PDF"]
# If Showdown is included add the Markdown plugin. # If Showdown is included add the Markdown plugin.
if win.Showdown if win.Showdown
......
# Document mapper module for PDF.js documents
class window.PDFTextMapper extends window.PageTextMapperCore
# Are we working with a PDF document?
@applicable: -> PDFView?.initialized ? false
requiresSmartStringPadding: true
# Get the number of pages
getPageCount: -> PDFView.pages.length
# Where are we in the document?
getPageIndex: -> PDFView.page - 1
# Jump to a given page
setPageIndex: (index) -> PDFView.page = index + 1
# Determine whether a given page has been rendered
_isPageRendered: (index) ->
return PDFView.pages[index]?.textLayer?.renderingDone
# Get the root DOM node of a given page
getRootNodeForPage: (index) ->
PDFView.pages[index].textLayer.textLayerDiv
constructor: ->
@setEvents()
# Install watchers for various events to detect page rendering/unrendering
setEvents: ->
# Detect page rendering
addEventListener "pagerender", (evt) =>
index = evt.detail.pageNumber - 1
@_onPageRendered index
# Detect page un-rendering
addEventListener "DOMNodeRemoved", (evt) =>
node = evt.target
if node.nodeType is Node.ELEMENT_NODE and node.nodeName.toLowerCase() is "div" and node.className is "textLayer"
index = parseInt node.parentNode.id.substr(13) - 1
# Forget info about the new DOM subtree
@_unmapPage @pageInfo[index]
# Do something about cross-page selections
window.DomTextMapper.instances.push
id: "cross-page catcher"
rootNode: document.getElementById "viewer"
performUpdateOnNode: (node, data) =>
if "viewer" is node.getAttribute? "id"
# This event escaped the pages.
# Must be a cross-page selection.
if data.start? and data.end?
startPage = @getPageForNode data.start
endPage = @getPageForNode data.end
for index in [ startPage.index .. endPage.index ]
#console.log "Should rescan page #" + index
@_updateMap @pageInfo[index]
documentChanged: ->
timestamp: ->
_extractionPattern: /[ ]+/g
_parseExtractedText: (text) => text.replace @_extractionPattern, " "
# Extract the text from the PDF
scan: ->
console.log "Scanning document for text..."
# Create a promise
pendingScan = new PDFJS.Promise()
# Tell the Find Controller to go digging
PDFFindController.extractText()
# When all the text has been extracted
PDFJS.Promise.all(PDFFindController.extractTextPromises).then =>
# PDF.js text extraction has finished.
# Post-process the extracted text
@pageInfo = ({ content: @_parseExtractedText page } for page in PDFFindController.pageContents)
# Do some besic calculations with the content
@_onHavePageContents()
# OK, we are ready to rock.
pendingScan.resolve()
# Do whatever we need to do after scanning
@_onAfterScan()
# Return the promise
pendingScan
# Look up the page for a given DOM node
getPageForNode: (node) ->
# Search for the root of this page
div = node
while (
(div.nodeType isnt Node.ELEMENT_NODE) or
not div.getAttribute("class")? or
(div.getAttribute("class") isnt "textLayer")
)
div = div.parentNode
# Fetch the page number from the id. ("pageContainerN")
index = parseInt div.parentNode.id.substr(13) - 1
# Look up the page
@pageInfo[index]
# Annotator plugin for annotating documents handled by PDF.js
class Annotator.Plugin.PDF extends Annotator.Plugin
pluginInit: ->
@annotator.documentAccessStrategies.unshift
# Strategy to handle PDF documents rendered by PDF.js
name: "PDF.js"
mapper: PDFTextMapper
...@@ -213,7 +213,7 @@ class Range.BrowserRange ...@@ -213,7 +213,7 @@ class Range.BrowserRange
if window.DomTextMapper? and changed if window.DomTextMapper? and changed
# console.log "Ranged normalization changed the DOM, updating d-t-m" # console.log "Ranged normalization changed the DOM, updating d-t-m"
window.DomTextMapper.changed nr.commonAncestor, "range normalization" window.DomTextMapper.changed nr.commonAncestor, "range normalization", nr
new Range.NormalizedRange(nr) new Range.NormalizedRange(nr)
......
// Generated by CoffeeScript 1.6.3 // Generated by CoffeeScript 1.6.3
/* /*
** Annotator 1.2.6-dev-b9ec63a ** Annotator 1.2.6-dev-33543a5
** https://github.com/okfn/annotator/ ** https://github.com/okfn/annotator/
** **
** Copyright 2012 Aron Carroll, Rufus Pollock, and Nick Stenning. ** Copyright 2012 Aron Carroll, Rufus Pollock, and Nick Stenning.
** Dual licensed under the MIT and GPLv3 licenses. ** Dual licensed under the MIT and GPLv3 licenses.
** https://github.com/okfn/annotator/blob/master/LICENSE ** https://github.com/okfn/annotator/blob/master/LICENSE
** **
** Built at: 2013-10-02 17:26:42Z ** Built at: 2013-10-27 05:12:46Z
*/ */
......
// Generated by CoffeeScript 1.6.3 // Generated by CoffeeScript 1.6.3
/* /*
** Annotator 1.2.6-dev-0aaf331 ** Annotator 1.2.6-dev-33543a5
** https://github.com/okfn/annotator/ ** https://github.com/okfn/annotator/
** **
** Copyright 2012 Aron Carroll, Rufus Pollock, and Nick Stenning. ** Copyright 2012 Aron Carroll, Rufus Pollock, and Nick Stenning.
** Dual licensed under the MIT and GPLv3 licenses. ** Dual licensed under the MIT and GPLv3 licenses.
** https://github.com/okfn/annotator/blob/master/LICENSE ** https://github.com/okfn/annotator/blob/master/LICENSE
** **
** Built at: 2013-10-24 01:17:53Z ** Built at: 2013-10-27 05:12:46Z
*/ */
......
// Generated by CoffeeScript 1.6.3
/*
** Annotator 1.2.6-dev-f1e08bd
** https://github.com/okfn/annotator/
**
** Copyright 2012 Aron Carroll, Rufus Pollock, and Nick Stenning.
** Dual licensed under the MIT and GPLv3 licenses.
** https://github.com/okfn/annotator/blob/master/LICENSE
**
** Built at: 2013-11-12 02:02:47Z
*/
/*
//
*/
// Generated by CoffeeScript 1.6.3
(function() {
var _ref,
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
Annotator.Plugin.FuzzyAnchoring = (function(_super) {
__extends(FuzzyAnchoring, _super);
function FuzzyAnchoring() {
this.createVirtualAnchorWithFuzzyMatching = __bind(this.createVirtualAnchorWithFuzzyMatching, this);
this.createVirtualAnchorWithTwoPhaseFuzzyMatching = __bind(this.createVirtualAnchorWithTwoPhaseFuzzyMatching, this);
_ref = FuzzyAnchoring.__super__.constructor.apply(this, arguments);
return _ref;
}
FuzzyAnchoring.prototype.pluginInit = function() {
var _this = this;
this.textFinder = new DomTextMatcher(function() {
return _this.annotator.domMapper.getCorpus();
});
this.annotator.virtualAnchoringStrategies.push({
name: "two-phase fuzzy",
code: this.createVirtualAnchorWithTwoPhaseFuzzyMatching
});
return this.annotator.virtualAnchoringStrategies.push({
name: "one-phase fuzzy",
code: this.createVirtualAnchorWithFuzzyMatching
});
};
FuzzyAnchoring.prototype.createVirtualAnchorWithTwoPhaseFuzzyMatching = function(target) {
var expectedEnd, expectedStart, match, options, posSelector, prefix, quote, quoteSelector, result, suffix;
quoteSelector = this.annotator.findSelector(target.selector, "TextQuoteSelector");
prefix = quoteSelector != null ? quoteSelector.prefix : void 0;
suffix = quoteSelector != null ? quoteSelector.suffix : void 0;
quote = quoteSelector != null ? quoteSelector.exact : void 0;
if (!((prefix != null) && (suffix != null))) {
return null;
}
posSelector = this.annotator.findSelector(target.selector, "TextPositionSelector");
expectedStart = posSelector != null ? posSelector.start : void 0;
expectedEnd = posSelector != null ? posSelector.end : void 0;
options = {
contextMatchDistance: this.annotator.domMapper.getCorpus().length * 2,
contextMatchThreshold: 0.5,
patternMatchThreshold: 0.5,
flexContext: true
};
result = this.textFinder.searchFuzzyWithContext(prefix, suffix, quote, expectedStart, expectedEnd, false, options);
if (!result.matches.length) {
return null;
}
match = result.matches[0];
return {
start: match.start,
end: match.end,
startPage: this.annotator.domMapper.getPageIndexForPos(match.start),
endPage: this.annotator.domMapper.getPageIndexForPos(match.end),
quote: match.found,
diffHTML: !match.exact ? match.comparison.diffHTML : void 0,
diffCaseOnly: !match.exact ? match.exactExceptCase : void 0
};
};
FuzzyAnchoring.prototype.createVirtualAnchorWithFuzzyMatching = function(target) {
var expectedStart, len, match, options, posSelector, quote, quoteSelector, result;
quoteSelector = this.annotator.findSelector(target.selector, "TextQuoteSelector");
quote = quoteSelector != null ? quoteSelector.exact : void 0;
if (quote == null) {
return null;
}
if (!(quote.length >= 32)) {
return;
}
posSelector = this.annotator.findSelector(target.selector, "TextPositionSelector");
expectedStart = posSelector != null ? posSelector.start : void 0;
len = this.annotator.domMapper.getCorpus().length;
if (expectedStart == null) {
expectedStart = len / 2;
}
options = {
matchDistance: len * 2,
withFuzzyComparison: true
};
result = this.textFinder.searchFuzzy(quote, expectedStart, false, options);
if (!result.matches.length) {
return null;
}
match = result.matches[0];
return {
start: match.start,
end: match.end,
startPage: this.annotator.domMapper.getPageIndexForPos(match.start),
endPage: this.annotator.domMapper.getPageIndexForPos(match.end),
quote: match.found,
diffHTML: !match.exact ? match.comparison.diffHTML : void 0,
diffCaseOnly: !match.exact ? match.exactExceptCase : void 0
};
};
return FuzzyAnchoring;
})(Annotator.Plugin);
}).call(this);
//
//@ sourceMappingURL=annotator.fuzzyanchoring.map
\ No newline at end of file
{"version":3,"file":"annotator.fuzzyanchoring.js","sources":["_preamble.coffee","_annotator_mapsrc/src/plugin/fuzzyanchoring.coffee"],"names":[],"mappings":"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"}
\ No newline at end of file
// Generated by CoffeeScript 1.6.3 // Generated by CoffeeScript 1.6.3
/* /*
** Annotator 1.2.6-dev-33543a5 ** Annotator 1.2.6-dev-f1e08bd
** https://github.com/okfn/annotator/ ** https://github.com/okfn/annotator/
** **
** Copyright 2012 Aron Carroll, Rufus Pollock, and Nick Stenning. ** Copyright 2012 Aron Carroll, Rufus Pollock, and Nick Stenning.
** Dual licensed under the MIT and GPLv3 licenses. ** Dual licensed under the MIT and GPLv3 licenses.
** https://github.com/okfn/annotator/blob/master/LICENSE ** https://github.com/okfn/annotator/blob/master/LICENSE
** **
** Built at: 2013-10-27 05:20:36Z ** Built at: 2013-11-12 02:02:44Z
*/ */
...@@ -557,7 +557,7 @@ ...@@ -557,7 +557,7 @@
nr.commonAncestor = nr.commonAncestor.parentNode; nr.commonAncestor = nr.commonAncestor.parentNode;
} }
if ((window.DomTextMapper != null) && changed) { if ((window.DomTextMapper != null) && changed) {
window.DomTextMapper.changed(nr.commonAncestor, "range normalization"); window.DomTextMapper.changed(nr.commonAncestor, "range normalization", nr);
} }
return new Range.NormalizedRange(nr); return new Range.NormalizedRange(nr);
}; };
...@@ -850,7 +850,8 @@ ...@@ -850,7 +850,8 @@
} }
this._setupWrapper(); this._setupWrapper();
if (!this.options.noMatching) { if (!this.options.noMatching) {
this._setupMatching(); this._setupDocumentAccessStrategies();
this._setupVirtualAnchoringStrategies();
} }
this._setupViewer()._setupEditor(); this._setupViewer()._setupEditor();
this._setupDynamicStyle(); this._setupDynamicStyle();
...@@ -860,15 +861,66 @@ ...@@ -860,15 +861,66 @@
this.adder = $(this.html.adder).appendTo(this.wrapper).hide(); this.adder = $(this.html.adder).appendTo(this.wrapper).hide();
} }
Annotator.prototype._setupMatching = function() { Annotator.prototype._setupDocumentAccessStrategies = function() {
this.domMapper = new DomTextMapper(); var _this = this;
this.domMatcher = new DomTextMatcher(this.domMapper); this.documentAccessStrategies = [
this.domMapper.setRootNode(this.wrapper[0]); {
name: "DOM generic",
mapper: DomTextMapper,
init: function() {
return _this.domMapper.setRootNode(_this.wrapper[0]);
}
}
];
return this;
};
Annotator.prototype._setupMapper = function() {
var s, _k, _len2, _ref1,
_this = this;
if (this.domMapper != null) {
return;
}
_ref1 = this.documentAccessStrategies;
for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) {
s = _ref1[_k];
if (s.mapper.applicable()) {
this.documentAccessStrategy = s;
console.log("Selected document access strategy: " + s.name);
this.domMapper = new s.mapper();
this.anchors = {};
addEventListener("docPageMapped", function(evt) {
return _this._physicallyAnchorPage(evt.pageIndex);
});
addEventListener("docPageUnmapped", function(evt) {
return _this._physicallyUnAnchorPage(evt.pageIndex);
});
if (typeof s.init === "function") {
s.init();
}
return this;
}
}
};
Annotator.prototype._setupVirtualAnchoringStrategies = function() {
this.virtualAnchoringStrategies = [
{
name: "range",
code: this.createVirtualAnchorFromRangeSelector
}, {
name: "position",
code: this.createVirtualAnchorFromPositionSelector
}
];
return this; return this;
}; };
Annotator.prototype._scan = function() { Annotator.prototype._scan = function() {
return this.domMatcher.scan(); if (!this.domMapper) {
this._setupMapper();
}
return this.pendingScan = this.domMapper.scan();
}; };
Annotator.prototype._setupWrapper = function() { Annotator.prototype._setupWrapper = function() {
...@@ -988,7 +1040,7 @@ ...@@ -988,7 +1040,7 @@
throw new Error("Called getTextQuoteSelector(range) on a range with no valid end."); throw new Error("Called getTextQuoteSelector(range) on a range with no valid end.");
} }
endOffset = (this.domMapper.getInfoForNode(rangeEnd)).end; endOffset = (this.domMapper.getInfoForNode(rangeEnd)).end;
quote = this.domMapper.getContentForCharRange(startOffset, endOffset); quote = this.domMapper.getCorpus().slice(startOffset, +(endOffset - 1) + 1 || 9e9).trim();
_ref1 = this.domMapper.getContextForCharRange(startOffset, endOffset), prefix = _ref1[0], suffix = _ref1[1]; _ref1 = this.domMapper.getContextForCharRange(startOffset, endOffset), prefix = _ref1[0], suffix = _ref1[1];
return selector = { return selector = {
type: "TextQuoteSelector", type: "TextQuoteSelector",
...@@ -1082,170 +1134,90 @@ ...@@ -1082,170 +1134,90 @@
return null; return null;
}; };
Annotator.prototype.findAnchorFromRangeSelector = function(target) { Annotator.prototype.createVirtualAnchorFromRangeSelector = function(target) {
var content, currentQuote, endInfo, endOffset, normalizedRange, savedQuote, selector, startInfo, startOffset; var content, currentQuote, endInfo, endOffset, error, normalizedRange, savedQuote, selector, startInfo, startOffset, _ref1, _ref2;
selector = this.findSelector(target.selector, "RangeSelector"); selector = this.findSelector(target.selector, "RangeSelector");
if (selector == null) { if (selector == null) {
return null; return null;
} }
normalizedRange = Range.sniff(selector).normalize(this.wrapper[0]); try {
normalizedRange = Range.sniff(selector).normalize(this.wrapper[0]);
} catch (_error) {
error = _error;
return null;
}
startInfo = this.domMapper.getInfoForNode(normalizedRange.start);
startOffset = startInfo.start;
endInfo = this.domMapper.getInfoForNode(normalizedRange.end);
endOffset = endInfo.end;
content = this.domMapper.getCorpus().slice(startOffset, +(endOffset - 1) + 1 || 9e9).trim();
currentQuote = this.normalizeString(content);
savedQuote = this.getQuoteForTarget(target); savedQuote = this.getQuoteForTarget(target);
if (savedQuote != null) { if ((savedQuote != null) && currentQuote !== savedQuote) {
startInfo = this.domMapper.getInfoForNode(normalizedRange.start); return null;
startOffset = startInfo.start;
endInfo = this.domMapper.getInfoForNode(normalizedRange.end);
endOffset = endInfo.end;
content = this.domMapper.getContentForCharRange(startOffset, endOffset);
currentQuote = this.normalizeString(content);
if (currentQuote !== savedQuote) {
console.log("Could not apply XPath selector to current document because the quote has changed. (Saved quote is '" + savedQuote + "'. Current quote is '" + currentQuote + "'.)");
return null;
} else {
}
} else {
console.log("No saved quote, nothing to compare. Assume that it's OK.");
} }
return { return {
range: normalizedRange, startPage: (_ref1 = startInfo.pageIndex) != null ? _ref1 : 0,
quote: savedQuote start: startInfo.start,
endPage: (_ref2 = endInfo.pageIndex) != null ? _ref2 : 0,
end: endInfo.end,
quote: currentQuote
}; };
}; };
Annotator.prototype.findAnchorFromPositionSelector = function(target) { Annotator.prototype.createVirtualAnchorFromPositionSelector = function(target) {
var browserRange, content, currentQuote, mappings, normalizedRange, savedQuote, selector; var content, currentQuote, savedQuote, selector;
selector = this.findSelector(target.selector, "TextPositionSelector"); selector = this.findSelector(target.selector, "TextPositionSelector");
if (selector == null) { if (selector == null) {
return null; return null;
} }
content = this.domMapper.getCorpus().slice(selector.start, +(selector.end - 1) + 1 || 9e9).trim();
currentQuote = this.normalizeString(content);
savedQuote = this.getQuoteForTarget(target); savedQuote = this.getQuoteForTarget(target);
if (savedQuote != null) { if ((savedQuote != null) && currentQuote !== savedQuote) {
content = this.domMapper.getContentForCharRange(selector.start, selector.end);
currentQuote = this.normalizeString(content);
if (currentQuote !== savedQuote) {
console.log("Could not apply position selector" + (" [" + selector.start + ":" + selector.end + "] to current document,") + " because the quote has changed." + ("(Saved quote is '" + savedQuote + "'.") + (" Current quote is '" + currentQuote + "'.)"));
return null;
} else {
}
} else {
console.log("No saved quote, nothing to compare. Assume that it's okay.");
}
mappings = this.domMapper.getMappingsForCharRange(selector.start, selector.end);
browserRange = new Range.BrowserRange(mappings.realRange);
normalizedRange = browserRange.normalize(this.wrapper[0]);
return {
range: normalizedRange,
quote: savedQuote
};
};
Annotator.prototype.findAnchorWithTwoPhaseFuzzyMatching = function(target) {
var anchor, browserRange, expectedEnd, expectedStart, match, normalizedRange, options, posSelector, prefix, quote, quoteSelector, result, suffix;
quoteSelector = this.findSelector(target.selector, "TextQuoteSelector");
prefix = quoteSelector != null ? quoteSelector.prefix : void 0;
suffix = quoteSelector != null ? quoteSelector.suffix : void 0;
quote = quoteSelector != null ? quoteSelector.exact : void 0;
if (!((prefix != null) && (suffix != null))) {
return null; return null;
} }
posSelector = this.findSelector(target.selector, "TextPositionSelector"); return {
expectedStart = posSelector != null ? posSelector.start : void 0; startPage: this.domMapper.getPageIndexForPos(selector.start),
expectedEnd = posSelector != null ? posSelector.end : void 0; endPage: this.domMapper.getPageIndexForPos(selector.end),
options = { start: selector.start,
contextMatchDistance: this.domMapper.getDocLength() * 2, end: selector.end,
contextMatchThreshold: 0.5, quote: currentQuote
patternMatchThreshold: 0.5,
flexContext: true
};
result = this.domMatcher.searchFuzzyWithContext(prefix, suffix, quote, expectedStart, expectedEnd, false, null, options);
if (!result.matches.length) {
console.log("Fuzzy matching did not return any results. Giving up on two-phase strategy.");
return null;
}
match = result.matches[0];
console.log("2-phase fuzzy found match:");
console.log(match);
browserRange = new Range.BrowserRange(match.realRange);
normalizedRange = browserRange.normalize(this.wrapper[0]);
anchor = {
range: normalizedRange,
quote: !match.exact ? match.found : void 0,
diffHTML: !match.exact ? match.comparison.diffHTML : void 0,
diffCaseOnly: !match.exact ? match.exactExceptCase : void 0
};
return anchor;
};
Annotator.prototype.findAnchorWithFuzzyMatching = function(target) {
var anchor, browserRange, expectedStart, len, match, normalizedRange, options, posSelector, quote, quoteSelector, result;
quoteSelector = this.findSelector(target.selector, "TextQuoteSelector");
quote = quoteSelector != null ? quoteSelector.exact : void 0;
if (quote == null) {
return null;
}
if (!(quote.length >= 32)) {
return;
}
posSelector = this.findSelector(target.selector, "TextPositionSelector");
expectedStart = posSelector != null ? posSelector.start : void 0;
len = this.domMapper.getDocLength();
if (expectedStart == null) {
expectedStart = len / 2;
}
options = {
matchDistance: len * 2,
withFuzzyComparison: true
};
result = this.domMatcher.searchFuzzy(quote, expectedStart, false, null, options);
if (!result.matches.length) {
console.log("Fuzzy matching did not return any results. Giving up on one-phase strategy.");
return null;
}
match = result.matches[0];
console.log("1-phase fuzzy found match:");
console.log(match);
browserRange = new Range.BrowserRange(match.realRange);
normalizedRange = browserRange.normalize(this.wrapper[0]);
anchor = {
range: normalizedRange,
quote: !match.exact ? match.found : void 0,
diffHTML: !match.exact ? match.comparison.diffHTML : void 0,
diffCaseOnly: !match.exact ? match.exactExceptCase : void 0
}; };
return anchor;
}; };
Annotator.prototype.findAnchor = function(target) { Annotator.prototype.createVirtualAnchor = function(target) {
var anchor, error, strategies, _k, _len2; var a, anchor, error, s, _k, _len2, _ref1;
if (target == null) { if (target == null) {
throw new Error("Trying to find anchor for null target!"); throw new Error("Trying to find anchor for null target!");
} }
strategies = [this.findAnchorFromRangeSelector, this.findAnchorFromPositionSelector, this.findAnchorWithTwoPhaseFuzzyMatching, this.findAnchorWithFuzzyMatching];
error = null; error = null;
anchor = null; anchor = null;
for (_k = 0, _len2 = strategies.length; _k < _len2; _k++) { _ref1 = this.virtualAnchoringStrategies;
fn = strategies[_k]; for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) {
s = _ref1[_k];
try { try {
if (anchor == null) { a = s.code.call(this, target);
anchor = fn.call(this, target); if (a) {
return {
result: a
};
} }
} catch (_error) { } catch (_error) {
error = _error; error = _error;
if (!(error instanceof Range.RangeError)) { if (error instanceof Range.RangeError) {
return {
error: error
};
} else {
throw error; throw error;
} }
} }
} }
return {
error: error,
anchor: anchor
};
}; };
Annotator.prototype.setupAnnotation = function(annotation) { Annotator.prototype.setupAnnotation = function(annotation) {
var anchor, error, exception, normed, normedRanges, r, ranges, root, t, _k, _l, _len2, _len3, _ref1, _ref2; var anchor, exception, pageIndex, r, ranges, result, t, vAnchor, _base, _k, _l, _len2, _ref1, _ref2, _ref3;
root = this.wrapper[0];
ranges = annotation.ranges || this.selectedRanges || []; ranges = annotation.ranges || this.selectedRanges || [];
if (annotation.ranges != null) { if (annotation.ranges != null) {
delete annotation.ranges; delete annotation.ranges;
...@@ -1262,22 +1234,40 @@ ...@@ -1262,22 +1234,40 @@
if (annotation.target == null) { if (annotation.target == null) {
throw new Error("Can not run setupAnnotation(). No target or selection available."); throw new Error("Can not run setupAnnotation(). No target or selection available.");
} }
normedRanges = [];
annotation.quote = []; annotation.quote = [];
annotation.anchors = [];
annotation.ranges = [];
annotation.highlights = [];
_ref1 = annotation.target; _ref1 = annotation.target;
for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) {
t = _ref1[_k]; t = _ref1[_k];
try { try {
_ref2 = this.findAnchor(t), anchor = _ref2.anchor, error = _ref2.error; result = this.createVirtualAnchor(t);
if (error instanceof Range.RangeError) { vAnchor = result.result;
this.publish('rangeNormalizeFail', [annotation, error.range, error]); if ((result.error != null) instanceof Range.RangeError) {
this.publish('rangeNormalizeFail', [annotation, result.error.range, result.error]);
} }
if (anchor != null) { if (vAnchor != null) {
t.quote = anchor.quote || $.trim(anchor.range.text()); annotation.quote.push(t.quote = vAnchor.quote);
t.diffHTML = anchor.diffHTML; delete vAnchor.quote;
t.diffCaseOnly = anchor.diffCaseOnly; t.diffHTML = vAnchor.diffHTML;
normedRanges.push(anchor.range); delete vAnchor.diffHTML;
annotation.quote.push(t.quote); t.diffCaseOnly = vAnchor.diffCaseOnly;
delete vAnchor.diffCaseOnly;
anchor = {
annotation: annotation,
target: t,
virtual: vAnchor,
physical: {}
};
annotation.anchors.push(anchor);
for (pageIndex = _l = _ref2 = vAnchor.startPage, _ref3 = vAnchor.endPage; _ref2 <= _ref3 ? _l <= _ref3 : _l >= _ref3; pageIndex = _ref2 <= _ref3 ? ++_l : --_l) {
if ((_base = this.anchors)[pageIndex] == null) {
_base[pageIndex] = [];
}
this.anchors[pageIndex].push(anchor);
}
this._physicallyAnchor(anchor);
} else { } else {
console.log("Could not find anchor target for annotation '" + annotation.id + "'."); console.log("Could not find anchor target for annotation '" + annotation.id + "'.");
} }
...@@ -1290,15 +1280,7 @@ ...@@ -1290,15 +1280,7 @@
console.log(exception); console.log(exception);
} }
} }
annotation.ranges = [];
annotation.highlights = [];
for (_l = 0, _len3 = normedRanges.length; _l < _len3; _l++) {
normed = normedRanges[_l];
annotation.ranges.push(normed.serialize(this.wrapper[0], '.annotator-hl'));
$.merge(annotation.highlights, this.highlightRange(normed));
}
annotation.quote = annotation.quote.join(' / '); annotation.quote = annotation.quote.join(' / ');
$(annotation.highlights).data('annotation', annotation);
return annotation; return annotation;
}; };
...@@ -1309,17 +1291,17 @@ ...@@ -1309,17 +1291,17 @@
}; };
Annotator.prototype.deleteAnnotation = function(annotation) { Annotator.prototype.deleteAnnotation = function(annotation) {
var child, h, _k, _len2, _ref1; var a, data, page, _k, _len2, _ref1, _ref2;
if (annotation.highlights != null) { if (annotation.anchors != null) {
_ref1 = annotation.highlights; _ref1 = annotation.anchors;
for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) {
h = _ref1[_k]; a = _ref1[_k];
if (!(h.parentNode != null)) { _ref2 = a.physical;
continue; for (page in _ref2) {
data = _ref2[page];
this._physicallyUnAnchor(a, page);
} }
child = h.childNodes[0]; this._removeAnchor(a);
$(h).replaceWith(h.childNodes);
window.DomTextMapper.changed(child.parentNode, "removed hilite (annotation deleted)");
} }
} }
this.publish('annotationDeleted', [annotation]); this.publish('annotationDeleted', [annotation]);
...@@ -1352,7 +1334,15 @@ ...@@ -1352,7 +1334,15 @@
}; };
clone = annotations.slice(); clone = annotations.slice();
if (annotations.length) { if (annotations.length) {
loader(annotations); if (this.pendingScan != null) {
this.pendingScan.then(function() {
return setTimeout(function() {
return loader(annotations);
});
});
} else {
loader(annotations);
}
} }
return this; return this;
}; };
...@@ -1567,6 +1557,112 @@ ...@@ -1567,6 +1557,112 @@
return this.deleteAnnotation(annotation); return this.deleteAnnotation(annotation);
}; };
Annotator.prototype._removeAnchor = function(anchor) {
var i, index, _k, _ref1, _ref2, _ref3, _results;
_results = [];
for (index = _k = _ref1 = anchor.virtual.startPage, _ref2 = anchor.virtual.endPage; _ref1 <= _ref2 ? _k <= _ref2 : _k >= _ref2; index = _ref1 <= _ref2 ? ++_k : --_k) {
i = this.anchors[index].indexOf(anchor);
[].splice.apply(this.anchors[index], [i, i - i + 1].concat(_ref3 = [])), _ref3;
if (!this.anchors[index].length) {
_results.push(delete this.anchors[index]);
} else {
_results.push(void 0);
}
}
return _results;
};
Annotator.prototype._physicallyAnchor = function(anchor) {
var browserRange, highlights, mappings, pAnchor, page, pagesTodo, range, renderedPages, section, serializedRange, vAnchor, _k, _ref1, _ref2, _ref3, _results,
_this = this;
if (anchor.allRendered) {
return;
}
vAnchor = anchor.virtual;
pAnchor = anchor.physical;
renderedPages = (function() {
_results = [];
for (var _k = _ref1 = vAnchor.startPage, _ref2 = vAnchor.endPage; _ref1 <= _ref2 ? _k <= _ref2 : _k >= _ref2; _ref1 <= _ref2 ? _k++ : _k--){ _results.push(_k); }
return _results;
}).apply(this).filter(function(index) {
return _this.domMapper.isPageMapped(index);
});
pagesTodo = renderedPages.filter(function(index) {
return pAnchor[index] == null;
});
if (!pagesTodo.length) {
return;
}
mappings = this.domMapper.getMappingsForCharRange(vAnchor.start, vAnchor.end, pagesTodo);
_ref3 = mappings.sections;
for (page in _ref3) {
section = _ref3[page];
browserRange = new Range.BrowserRange(section.realRange);
range = browserRange.normalize(this.wrapper[0]);
serializedRange = range.serialize(this.wrapper[0], '.annotator-hl');
anchor.annotation.ranges.push(serializedRange);
highlights = this.highlightRange(range);
$(highlights).data('annotation', anchor.annotation);
$.merge(anchor.annotation.highlights, highlights);
pAnchor[page] = {
range: serializedRange,
highlights: highlights
};
}
anchor.allRendered = renderedPages.length === vAnchor.endPage - vAnchor.startPage + 1;
return this.publish('annotationPhysicallyAnchored', anchor);
};
Annotator.prototype._physicallyAnchorPage = function(index) {
var anchor, anchors, _k, _len2, _results;
anchors = this.anchors[index];
if (!((anchors != null) && this.domMapper.isPageMapped(index))) {
return;
}
_results = [];
for (_k = 0, _len2 = anchors.length; _k < _len2; _k++) {
anchor = anchors[_k];
_results.push(this._physicallyAnchor(anchor));
}
return _results;
};
Annotator.prototype._physicallyUnAnchor = function(anchor, pageIndex) {
var ann, child, data, hl, i, _k, _len2, _ref1, _ref2, _ref3;
data = anchor.physical[pageIndex];
if (data == null) {
return;
}
ann = anchor.annotation;
i = ann.ranges.indexOf(data.range);
[].splice.apply(ann.ranges, [i, i - i + 1].concat(_ref1 = [])), _ref1;
_ref2 = data.highlights;
for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
hl = _ref2[_k];
if ((hl.parentNode != null) && this.domMapper.isPageMapped(pageIndex)) {
child = hl.childNodes[0];
$(hl).replaceWith(hl.childNodes);
window.DomTextMapper.changed(child.parentNode, "removed hilite (annotation deleted)");
}
i = ann.highlights.indexOf(hl);
[].splice.apply(ann.highlights, [i, i - i + 1].concat(_ref3 = [])), _ref3;
}
delete anchor.physical[pageIndex];
anchor.allRendered = false;
return this.publish('annotationPhysicallyUnAnchored', anchor);
};
Annotator.prototype._physicallyUnAnchorPage = function(index) {
var anchor, _k, _len2, _ref1, _ref2, _results;
_ref2 = (_ref1 = this.anchors[index]) != null ? _ref1 : [];
_results = [];
for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
anchor = _ref2[_k];
_results.push(this._physicallyUnAnchor(anchor, index));
}
return _results;
};
return Annotator; return Annotator;
})(Delegator); })(Delegator);
......
{"version":3,"file":"annotator.js","sources":["_preamble.coffee","_annotator_mapsrc/src/xpath.coffee","_annotator_mapsrc/src/extensions.coffee","_annotator_mapsrc/src/console.coffee","_annotator_mapsrc/src/class.coffee","_annotator_mapsrc/src/range.coffee","_annotator_mapsrc/src/annotator.coffee","_annotator_mapsrc/src/widget.coffee","_annotator_mapsrc/src/editor.coffee","_annotator_mapsrc/src/viewer.coffee","_annotator_mapsrc/src/notification.coffee"],"names":[],"mappings":"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"} {"version":3,"file":"annotator.js","sources":["_preamble.coffee","_annotator_mapsrc/src/xpath.coffee","_annotator_mapsrc/src/extensions.coffee","_annotator_mapsrc/src/console.coffee","_annotator_mapsrc/src/class.coffee","_annotator_mapsrc/src/range.coffee","_annotator_mapsrc/src/annotator.coffee","_annotator_mapsrc/src/widget.coffee","_annotator_mapsrc/src/editor.coffee","_annotator_mapsrc/src/viewer.coffee","_annotator_mapsrc/src/notification.coffee"],"names":[],"mappings":"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"}
\ No newline at end of file \ No newline at end of file
// Generated by CoffeeScript 1.6.3
/*
** Annotator 1.2.6-dev-f1e08bd
** https://github.com/okfn/annotator/
**
** Copyright 2012 Aron Carroll, Rufus Pollock, and Nick Stenning.
** Dual licensed under the MIT and GPLv3 licenses.
** https://github.com/okfn/annotator/blob/master/LICENSE
**
** Built at: 2013-11-12 02:02:48Z
*/
/*
//
*/
// Generated by CoffeeScript 1.6.3
(function() {
var _ref,
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
window.PDFTextMapper = (function(_super) {
__extends(PDFTextMapper, _super);
PDFTextMapper.applicable = function() {
var _ref;
return (_ref = typeof PDFView !== "undefined" && PDFView !== null ? PDFView.initialized : void 0) != null ? _ref : false;
};
PDFTextMapper.prototype.requiresSmartStringPadding = true;
PDFTextMapper.prototype.getPageCount = function() {
return PDFView.pages.length;
};
PDFTextMapper.prototype.getPageIndex = function() {
return PDFView.page - 1;
};
PDFTextMapper.prototype.setPageIndex = function(index) {
return PDFView.page = index + 1;
};
PDFTextMapper.prototype._isPageRendered = function(index) {
var _ref, _ref1;
return (_ref = PDFView.pages[index]) != null ? (_ref1 = _ref.textLayer) != null ? _ref1.renderingDone : void 0 : void 0;
};
PDFTextMapper.prototype.getRootNodeForPage = function(index) {
return PDFView.pages[index].textLayer.textLayerDiv;
};
function PDFTextMapper() {
this._parseExtractedText = __bind(this._parseExtractedText, this);
this.setEvents();
}
PDFTextMapper.prototype.setEvents = function() {
var _this = this;
addEventListener("pagerender", function(evt) {
var index;
index = evt.detail.pageNumber - 1;
return _this._onPageRendered(index);
});
addEventListener("DOMNodeRemoved", function(evt) {
var index, node;
node = evt.target;
if (node.nodeType === Node.ELEMENT_NODE && node.nodeName.toLowerCase() === "div" && node.className === "textLayer") {
index = parseInt(node.parentNode.id.substr(13) - 1);
return _this._unmapPage(_this.pageInfo[index]);
}
});
return window.DomTextMapper.instances.push({
id: "cross-page catcher",
rootNode: document.getElementById("viewer"),
performUpdateOnNode: function(node, data) {
var endPage, index, startPage, _i, _ref, _ref1, _results;
if ("viewer" === (typeof node.getAttribute === "function" ? node.getAttribute("id") : void 0)) {
if ((data.start != null) && (data.end != null)) {
startPage = _this.getPageForNode(data.start);
endPage = _this.getPageForNode(data.end);
_results = [];
for (index = _i = _ref = startPage.index, _ref1 = endPage.index; _ref <= _ref1 ? _i <= _ref1 : _i >= _ref1; index = _ref <= _ref1 ? ++_i : --_i) {
_results.push(_this._updateMap(_this.pageInfo[index]));
}
return _results;
}
}
},
documentChanged: function() {},
timestamp: function() {}
});
};
PDFTextMapper.prototype._extractionPattern = /[ ]+/g;
PDFTextMapper.prototype._parseExtractedText = function(text) {
return text.replace(this._extractionPattern, " ");
};
PDFTextMapper.prototype.scan = function() {
var pendingScan,
_this = this;
console.log("Scanning document for text...");
pendingScan = new PDFJS.Promise();
PDFFindController.extractText();
PDFJS.Promise.all(PDFFindController.extractTextPromises).then(function() {
var page;
_this.pageInfo = (function() {
var _i, _len, _ref, _results;
_ref = PDFFindController.pageContents;
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
page = _ref[_i];
_results.push({
content: this._parseExtractedText(page)
});
}
return _results;
}).call(_this);
_this._onHavePageContents();
pendingScan.resolve();
return _this._onAfterScan();
});
return pendingScan;
};
PDFTextMapper.prototype.getPageForNode = function(node) {
var div, index;
div = node;
while ((div.nodeType !== Node.ELEMENT_NODE) || (div.getAttribute("class") == null) || (div.getAttribute("class") !== "textLayer")) {
div = div.parentNode;
}
index = parseInt(div.parentNode.id.substr(13) - 1);
return this.pageInfo[index];
};
return PDFTextMapper;
})(window.PageTextMapperCore);
Annotator.Plugin.PDF = (function(_super) {
__extends(PDF, _super);
function PDF() {
_ref = PDF.__super__.constructor.apply(this, arguments);
return _ref;
}
PDF.prototype.pluginInit = function() {
return this.annotator.documentAccessStrategies.unshift({
name: "PDF.js",
mapper: PDFTextMapper
});
};
return PDF;
})(Annotator.Plugin);
}).call(this);
//
//@ sourceMappingURL=annotator.pdf.map
\ No newline at end of file
{"version":3,"file":"annotator.pdf.js","sources":["_preamble.coffee","_annotator_mapsrc/src/plugin/pdf.coffee"],"names":[],"mappings":"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"}
\ No newline at end of file
...@@ -9,17 +9,27 @@ class window.DomTextMapper ...@@ -9,17 +9,27 @@ class window.DomTextMapper
@instances: [] @instances: []
@changed: (node, reason = "no reason") -> @changed: (node, reason = "no reason", data = {}) ->
if @instances.length is 0 then return if @instances.length is 0 then return
# dm = @instances[0] # console.log "==== Node"
# console.log "Node @ " + (dm.getPathTo node) + " has changed: " + reason # console.log node
# console.log "has changed: " + reason
# console.log data
for instance in @instances when instance.rootNode.contains(node) for instance in @instances when instance.rootNode.contains(node)
instance.performUpdateOnNode node # console.log "Telling instance '" + instance.id + "'."
instance.documentChanged()
instance.performUpdateOnNode node, false, data
instance.lastScanned = instance.timestamp()
null null
constructor: -> constructor: (@id)->
@setRealRoot() @setRealRoot()
window.DomTextMapper.instances.push this instances = window.DomTextMapper.instances
instances.push this
@id ?= "d-t-m #" + instances.length
log: (msg) ->
console.log @id + ": " + msg
# ===== Public methods ======= # ===== Public methods =======
...@@ -69,7 +79,10 @@ class window.DomTextMapper ...@@ -69,7 +79,10 @@ class window.DomTextMapper
# anythime, and therefore will not assume any stability. # anythime, and therefore will not assume any stability.
documentChanged: -> documentChanged: ->
@lastDOMChange = @timestamp() @lastDOMChange = @timestamp()
# console.log "Registered document change." # @log "Registered document change."
setExpectedContent: (content) ->
@expectedContent = content
# Scan the document # Scan the document
# #
...@@ -85,6 +98,7 @@ class window.DomTextMapper ...@@ -85,6 +98,7 @@ class window.DomTextMapper
# length: the length of the next content # length: the length of the next content
scan: -> scan: ->
if @domStableSince @lastScanned if @domStableSince @lastScanned
<<<<<<< HEAD
# We have a valid paths structure! # We have a valid paths structure!
# console.log "We have a valid DOM structure cache." # console.log "We have a valid DOM structure cache."
return return
...@@ -92,26 +106,38 @@ class window.DomTextMapper ...@@ -92,26 +106,38 @@ class window.DomTextMapper
unless @pathStartNode.ownerDocument.body.contains @pathStartNode unless @pathStartNode.ownerDocument.body.contains @pathStartNode
# We cannot map nodes that are not attached. # We cannot map nodes that are not attached.
# console.log "This is not attached to dom. Exiting." # console.log "This is not attached to dom. Exiting."
=======
# @log "We have a valid DOM structure cache."
return
else
# @log "Last scan time: " + @lastScanned
# @log "Last DOM change: " + @lastDOMChange
# @log "No valid DOM structure scan available, doing scan."
unless @pathStartNode.ownerDocument.body.contains @pathStartNode
# We cannot map nodes that are not attached.
# @log "This is not attached to dom. Exiting."
>>>>>>> Updated libraries for PDF support
return return
# console.log "No valid cache, will have to do a scan." # @log "No valid cache, will have to do a scan."
startTime = @timestamp() startTime = @timestamp()
@saveSelection() @saveSelection()
@path = {} @path = {}
@traverseSubTree @pathStartNode, @getDefaultPath() @traverseSubTree @pathStartNode, @getDefaultPath()
t1 = @timestamp() t1 = @timestamp()
# console.log "Phase I (Path traversal) took " + (t1 - startTime) + " ms." # @log "Phase I (Path traversal) took " + (t1 - startTime) + " ms."
path = @getPathTo @pathStartNode path = @getPathTo @pathStartNode
node = @path[path].node node = @path[path].node
@collectPositions node, path, null, 0, 0 @collectPositions node, path, null, 0, 0
@restoreSelection() @restoreSelection()
@lastScanned = @timestamp() @lastScanned = @timestamp()
@corpus = @path[path].content @_corpus = @path[path].content
# console.log "Corpus is: " + @corpus # @log "Corpus is: " + @_corpus
t2 = @timestamp() t2 = @timestamp()
# console.log "Phase II (offset calculation) took " + (t2 - t1) + " ms." # @log "Phase II (offset calculation) took " + (t2 - t1) + " ms."
null null
...@@ -135,13 +161,13 @@ class window.DomTextMapper ...@@ -135,13 +161,13 @@ class window.DomTextMapper
@performUpdateOnNode node.parentNode, true @performUpdateOnNode node.parentNode, true
unless escalating then @restoreSelection() unless escalating then @restoreSelection()
return return
# console.log "Performing update on node @ path " + path # @log "Performing update on node @ path " + path
# if escalating then console.log "(Escalated)" # if escalating then @log "(Escalated)"
# console.log "Updating data about " + path + ": " # @log "Updating data about " + path + ": "
if pathInfo.node is node and pathInfo.content is @getNodeContent node, false if pathInfo.node is node and pathInfo.content is @getNodeContent node, false
# console.log "Good, the node and the overall content is still the same" # @log "Good, the node and the overall content is still the same"
# console.log "Dropping obsolete path info for children..." # @log "Dropping obsolete path info for children..."
prefix = path + "/" prefix = path + "/"
pathsToDrop =p pathsToDrop =p
...@@ -152,13 +178,13 @@ class window.DomTextMapper ...@@ -152,13 +178,13 @@ class window.DomTextMapper
for p in pathsToDrop for p in pathsToDrop
delete @path[p] delete @path[p]
# console.log "Done. Collecting new path info..." # @log "Done. Collecting new path info..."
@traverseSubTree node, path @traverseSubTree node, path
# console.log "Done. Updating mappings..." # @log "Done. Updating mappings..."
if pathInfo.node is @pathStartNode if pathInfo.node is @pathStartNode
console.log "Ended up rescanning the whole doc." # @log "Ended up rescanning the whole doc."
@collectPositions node, path, null, 0, 0 @collectPositions node, path, null, 0, 0
else else
parentPath = @parentPath path parentPath = @parentPath path
...@@ -173,18 +199,18 @@ class window.DomTextMapper ...@@ -173,18 +199,18 @@ class window.DomTextMapper
@collectPositions node, path, parentPathInfo.content, @collectPositions node, path, parentPathInfo.content,
parentPathInfo.start, oldIndex parentPathInfo.start, oldIndex
# console.log "Data update took " + (@timestamp() - startTime) + " ms." # @log "Data update took " + (@timestamp() - startTime) + " ms."
else else
# console.log "Hm..node has been replaced, or overall content has changed!" # @log "Hm..node has been replaced, or overall content has changed!"
if pathInfo.node isnt @pathStartNode if pathInfo.node isnt @pathStartNode
# console.log "I guess I must go up one level." # @log "I guess I must go up one level."
parentNode = if node.parentNode? parentNode = if node.parentNode?
# console.log "Node has parent, using that." # @log "Node has parent, using that."
node.parentNode node.parentNode
else else
parentPath = @parentPath path parentPath = @parentPath path
# console.log "Node has no parent, will look up " + parentPath # @log "Node has no parent, will look up " + parentPath
@lookUpNode parentPath @lookUpNode parentPath
@performUpdateOnNode parentNode, true @performUpdateOnNode parentNode, true
else else
...@@ -208,13 +234,9 @@ class window.DomTextMapper ...@@ -208,13 +234,9 @@ class window.DomTextMapper
@getInfoForPath @getPathTo node @getInfoForPath @getPathTo node
# Get the matching DOM elements for a given set of charRanges # Get the matching DOM elements for a given set of charRanges
# (Calles getMappingsForCharRange for each element in the givenl ist) # (Calles getMappingsForCharRange for each element in the given ist)
getMappingsForCharRanges: (charRanges) -> getMappingsForCharRanges: (charRanges) ->
# console.log "charRanges:" (@getMappingsForCharRange charRange.start, charRange.end) for charRange in charRanges
# console.log charRanges
(for charRange in charRanges
mapping = @getMappingsForCharRange charRange.start, charRange.end
)
# Return the rendered value of a part of the dom. # Return the rendered value of a part of the dom.
# If path is not given, the default path is used. # If path is not given, the default path is used.
...@@ -228,22 +250,16 @@ class window.DomTextMapper ...@@ -228,22 +250,16 @@ class window.DomTextMapper
path ?= @getDefaultPath() path ?= @getDefaultPath()
@path[path].length @path[path].length
getDocLength: -> @getLengthForPath() getDocLength: -> @_corpus.length
# Return a given charRange of the rendered value of a part of the dom. getCorpus: -> @_corpus
# If path is not given, the default path is used.
getContentForCharRange: (start, end, path = null) ->
text = @getContentForPath(path).substr start, end - start
text.trim()
# Get the context that encompasses the given charRange # Get the context that encompasses the given charRange
# in the rendered text of the document # in the rendered text of the document
getContextForCharRange: (start, end, path = null) -> getContextForCharRange: (start, end) ->
content = @getContentForPath path
prefixStart = Math.max 0, start - CONTEXT_LEN prefixStart = Math.max 0, start - CONTEXT_LEN
prefixLen = start - prefixStart prefix = @_corpus[prefixStart .. start - 1]
prefix = content.substr prefixStart, prefixLen suffix = @_corpus[end .. end + CONTEXT_LEN - 1]
suffix = content.substr end, prefixLen
[prefix.trim(), suffix.trim()] [prefix.trim(), suffix.trim()]
# Get the matching DOM elements for a given charRange # Get the matching DOM elements for a given charRange
...@@ -253,17 +269,18 @@ class window.DomTextMapper ...@@ -253,17 +269,18 @@ class window.DomTextMapper
getMappingsForCharRange: (start, end) -> getMappingsForCharRange: (start, end) ->
unless (start? and end?) unless (start? and end?)
throw new Error "start and end is required!" throw new Error "start and end is required!"
# console.log "Collecting nodes for [" + start + ":" + end + "]"
# @log "Collecting nodes for [" + start + ":" + end + "]"
@scan() @scan()
# Collect the matching path infos # Collect the matching path infos
# console.log "Collecting mappings" # @log "Collecting mappings"
mappings = [] mappings = []
for p, info of @path when info.atomic and for p, info of @path when info.atomic and
@regions_overlap info.start, info.end, start, end @regions_overlap info.start, info.end, start, end
do (info) => do (info) =>
# console.log "Checking " + info.path # @log "Checking " + info.path
# console.log info # @log info
mapping = mapping =
element: info element: info
...@@ -293,28 +310,30 @@ class window.DomTextMapper ...@@ -293,28 +310,30 @@ class window.DomTextMapper
mapping.endCorrected - mapping.startCorrected mapping.endCorrected - mapping.startCorrected
else if (info.node.nodeType is Node.ELEMENT_NODE) and else if (info.node.nodeType is Node.ELEMENT_NODE) and
(info.node.tagName.toLowerCase() is "img") (info.node.tagName.toLowerCase() is "img")
console.log "Can not select a sub-string from the title of an image. @log "Can not select a sub-string from the title of an image.
Selecting all." Selecting all."
mapping.full = true mapping.full = true
mapping.wanted = info.content mapping.wanted = info.content
else else
console.log "Warning: no idea how to handle partial mappings @log "Warning: no idea how to handle partial mappings
for node type " + info.node.nodeType for node type " + info.node.nodeType
if info.node.tagName? then console.log "Tag: " + info.node.tagName if info.node.tagName? then @log "Tag: " + info.node.tagName
console.log "Selecting all." @log "Selecting all."
mapping.full = true mapping.full = true
mapping.wanted = info.content mapping.wanted = info.content
mappings.push mapping mappings.push mapping
# console.log "Done with " + info.path # @log "Done with " + info.path
if mappings.length is 0 if mappings.length is 0
@log "Collecting nodes for [" + start + ":" + end + "]"
@log "Should be: '" + @_corpus[ start .. (end-1) ] + "'."
throw new Error "No mappings found for [" + start + ":" + end + "]!" throw new Error "No mappings found for [" + start + ":" + end + "]!"
mappings = mappings.sort (a, b) -> a.element.start - b.element.start mappings = mappings.sort (a, b) -> a.element.start - b.element.start
# Create a DOM range object # Create a DOM range object
# console.log "Building range..." # @log "Building range..."
r = @rootWin.document.createRange() r = @rootWin.document.createRange()
startMapping = mappings[0] startMapping = mappings[0]
startNode = startMapping.element.node startNode = startMapping.element.node
...@@ -350,23 +369,27 @@ class window.DomTextMapper ...@@ -350,23 +369,27 @@ class window.DomTextMapper
endInfo: endInfo endInfo: endInfo
safeParent: r.commonAncestorContainer safeParent: r.commonAncestorContainer
} }
# console.log "Done collecting"
result # Return the result
sections: [result]
# ===== Private methods (never call from outside the module) ======= # ===== Private methods (never call from outside the module) =======
timestamp: -> new Date().getTime() timestamp: -> new Date().getTime()
stringStartsWith: (string, prefix) -> stringStartsWith: (string, prefix) ->
prefix is string.substr 0, prefix.length string[ 0 .. prefix.length - 1 ] is prefix
stringEndsWith: (string, suffix) -> stringEndsWith: (string, suffix) ->
suffix is string.substr string.length - suffix.length string[ string.length - suffix.length .. string.length ] is suffix
parentPath: (path) -> path.substr 0, path.lastIndexOf "/" parentPath: (path) -> path.substr 0, path.lastIndexOf "/"
domChangedSince: (timestamp) -> domChangedSince: (timestamp) ->
if @lastDOMChange? and timestamp? then @lastDOMChange > timestamp else true if @lastDOMChange? and timestamp?
@lastDOMChange > timestamp
else
true
domStableSince: (timestamp) -> not @domChangedSince timestamp domStableSince: (timestamp) -> not @domChangedSince timestamp
...@@ -415,14 +438,18 @@ class window.DomTextMapper ...@@ -415,14 +438,18 @@ class window.DomTextMapper
length: cont.length length: cont.length
node : node node : node
if cont.length if cont.length
if verbose then console.log "Collected info about path " + path if verbose then @log "Collected info about path " + path
if invisible if invisible
console.log "Something seems to be wrong. I see visible content @ " + @log "Something seems to be wrong. I see visible content @ " +
path + ", while some of the ancestor nodes reported empty contents. path + ", while some of the ancestor nodes reported empty contents.
Probably a new selection API bug...." Probably a new selection API bug...."
<<<<<<< HEAD
console.log "Anyway, text is '" + cont + "'." console.log "Anyway, text is '" + cont + "'."
=======
@log "Anyway, text is '" + cont + "'."
>>>>>>> Updated libraries for PDF support
else else
if verbose then console.log "Found no content at path " + path if verbose then @log "Found no content at path " + path
invisible = true invisible = true
# Step two: cover all children. # Step two: cover all children.
...@@ -448,11 +475,11 @@ class window.DomTextMapper ...@@ -448,11 +475,11 @@ class window.DomTextMapper
# save the original selection # save the original selection
saveSelection: -> saveSelection: ->
if @savedSelection? if @savedSelection?
console.log "Selection saved at:" @log "Selection saved at:"
console.log @selectionSaved @log @selectionSaved
throw new Error "Selection already saved!" throw new Error "Selection already saved!"
sel = @rootWin.getSelection() sel = @rootWin.getSelection()
# console.log "Saving selection: " + sel.rangeCount + " ranges." # @log "Saving selection: " + sel.rangeCount + " ranges."
@savedSelection = (sel.getRangeAt i) for i in [0 ... sel.rangeCount] @savedSelection = (sel.getRangeAt i) for i in [0 ... sel.rangeCount]
switch sel.rangeCount switch sel.rangeCount
when 0 then @savedSelection ?= [] when 0 then @savedSelection ?= []
...@@ -464,7 +491,7 @@ class window.DomTextMapper ...@@ -464,7 +491,7 @@ class window.DomTextMapper
# restore selection # restore selection
restoreSelection: -> restoreSelection: ->
# console.log "Restoring selection: " + @savedSelection.length + " ranges." # @log "Restoring selection: " + @savedSelection.length + " ranges."
unless @savedSelection? then throw new Error "No selection to restore." unless @savedSelection? then throw new Error "No selection to restore."
sel = @rootWin.getSelection() sel = @rootWin.getSelection()
sel.removeAllRanges() sel.removeAllRanges()
...@@ -523,9 +550,9 @@ class window.DomTextMapper ...@@ -523,9 +550,9 @@ class window.DomTextMapper
# If this is the case, then it's OK. # If this is the case, then it's OK.
unless USE_EMPTY_TEXT_WORKAROUND and @isWhitespace node unless USE_EMPTY_TEXT_WORKAROUND and @isWhitespace node
# No, this is not the case. Then this is an error. # No, this is not the case. Then this is an error.
console.log "Warning: failed to scan element @ " + @underTraverse @log "Warning: failed to scan element @ " + @underTraverse
console.log "Content is: " + node.innerHTML @log "Content is: " + node.innerHTML
console.log "We won't be able to properly anchor to any text inside this element." @log "We won't be able to properly anchor to any text inside this element."
# throw exception # throw exception
if scroll if scroll
sn = node sn = node
...@@ -534,7 +561,7 @@ class window.DomTextMapper ...@@ -534,7 +561,7 @@ class window.DomTextMapper
if sn? if sn?
sn.scrollIntoViewIfNeeded() sn.scrollIntoViewIfNeeded()
else else
console.log "Failed to scroll to element. (Browser does not support scrollIntoViewIfNeeded?)" @log "Failed to scroll to element. (Browser does not support scrollIntoViewIfNeeded?)"
sel sel
# Read and convert the text of the current selection. # Read and convert the text of the current selection.
...@@ -557,23 +584,23 @@ class window.DomTextMapper ...@@ -557,23 +584,23 @@ class window.DomTextMapper
# Convert "display" text indices to "source" text indices. # Convert "display" text indices to "source" text indices.
computeSourcePositions: (match) -> computeSourcePositions: (match) ->
# console.log "In computeSourcePosition" # @log "In computeSourcePosition"
# console.log match.element.path # @log match.element.path
# console.log match.element.node.data # @log match.element.node.data
# the HTML source of the text inside a text element. # the HTML source of the text inside a text element.
# console.log "Calculating source position at " + match.element.path # @log "Calculating source position at " + match.element.path
sourceText = match.element.node.data.replace /\n/g, " " sourceText = match.element.node.data.replace /\n/g, " "
# console.log "sourceText is '" + sourceText + "'" # @log "sourceText is '" + sourceText + "'"
# what gets displayed, when the node is processed by the browser. # what gets displayed, when the node is processed by the browser.
displayText = match.element.content displayText = match.element.content
# console.log "displayText is '" + displayText + "'" # @log "displayText is '" + displayText + "'"
# The selected charRange in displayText. # The selected charRange in displayText.
displayStart = if match.start? then match.start else 0 displayStart = if match.start? then match.start else 0
displayEnd = if match.end? then match.end else displayText.length displayEnd = if match.end? then match.end else displayText.length
# console.log "Display charRange is: " + displayStart + "-" + displayEnd # @log "Display charRange is: " + displayStart + "-" + displayEnd
if displayEnd is 0 if displayEnd is 0
# Handle empty text nodes # Handle empty text nodes
...@@ -597,7 +624,7 @@ class window.DomTextMapper ...@@ -597,7 +624,7 @@ class window.DomTextMapper
sourceIndex++ sourceIndex++
match.startCorrected = sourceStart match.startCorrected = sourceStart
match.endCorrected = sourceEnd match.endCorrected = sourceEnd
# console.log "computeSourcePosition done. Corrected charRange is: " + # @log "computeSourcePosition done. Corrected charRange is: " +
# match.startCorrected + "-" + match.endCorrected # match.startCorrected + "-" + match.endCorrected
null null
...@@ -605,7 +632,11 @@ class window.DomTextMapper ...@@ -605,7 +632,11 @@ class window.DomTextMapper
# as render by the browser. # as render by the browser.
# The current implementation uses the browser selection API to do so. # The current implementation uses the browser selection API to do so.
getNodeContent: (node, shouldRestoreSelection = true) -> getNodeContent: (node, shouldRestoreSelection = true) ->
@getNodeSelectionText node, shouldRestoreSelection if node is @pathStartNode and @expectedContent?
# @log "Returning fake expectedContent for getNodeContent"
@expectedContent
else
@getNodeSelectionText node, shouldRestoreSelection
# Internal function to collect mapping data from a given DOM element. # Internal function to collect mapping data from a given DOM element.
# #
...@@ -627,7 +658,7 @@ class window.DomTextMapper ...@@ -627,7 +658,7 @@ class window.DomTextMapper
# the first character offset position in the content of this node's # the first character offset position in the content of this node's
# parent node that is not accounted for by this node # parent node that is not accounted for by this node
collectPositions: (node, path, parentContent = null, parentIndex = 0, index = 0) -> collectPositions: (node, path, parentContent = null, parentIndex = 0, index = 0) ->
# console.log "Scanning path " + path # @log "Scanning path " + path
# content = @getNodeContent node, false # content = @getNodeContent node, false
pathInfo = @path[path] pathInfo = @path[path]
...@@ -645,11 +676,11 @@ class window.DomTextMapper ...@@ -645,11 +676,11 @@ class window.DomTextMapper
else else
index index
if startIndex is -1 if startIndex is -1
# content of node is not present in parent's content - probably hidden, # content of node is not present in parent's content - probably hidden,
# or something similar # or something similar
# console.log "Content of this not is not present in content of parent, @log "Content of this not is not present in content of parent, at path " + path
# at path " + path @log "(Content: '" + content + "'.)"
return index return index
endIndex = startIndex + content.length endIndex = startIndex + content.length
...@@ -694,3 +725,24 @@ class window.DomTextMapper ...@@ -694,3 +725,24 @@ class window.DomTextMapper
mightBeEmpty mightBeEmpty
else false else false
result result
# Internal debug method to verify the consistency of mapping info
_testMap: ->
@log "Verifying map info: was it all properly traversed?"
for i,p of @path
unless p.atomic? then @log i + " is missing data."
@log "Verifying map info: do atomic elements match?"
for i,p of @path when p.atomic
expected = @_corpus[p.start .. (p.end - 1) ]
ok = p.content is expected
unless ok then @log "Mismatch on " + i + ": content is '" + p.content + "', range in corpus is '" + expected + "'."
ok
null
# Fake two-phase / pagination support, used for HTML documents
getPageIndex: -> 0
getPageCount: -> 1
getPageIndexForPos: -> 0
isPageMapped: -> true
# Text search library
class window.DomTextMatcher class window.DomTextMatcher
constructor: (@corpus) ->
# ===== Public methods =======
# Consider only the sub-tree beginning with the given node.
#
# This will be the root node to use for all operations.
setRootNode: (rootNode) -> @mapper.setRootNode rootNode
# Consider only the sub-tree beginning with the node whose ID was given.
#
# This will be the root node to use for all operations.
setRootId: (rootId) -> @mapper.setRootId rootId
# Use this iframe for operations.
#
# Call this when mapping content in an iframe.
setRootIframe: (iframeId) -> @mapper.setRootIframe iframeId
# Work with the whole DOM tree
#
# (This is the default; you only need to call this, if you have configured
# a different root earlier, and now you want to restore the default setting.)
setRealRoot: -> @mapper.setRealRoot()
# Notify the library that the document has changed.
# This means that subsequent calls can not safely re-use previously cached
# data structures, so some calculations will be necessary again.
#
# The usage of this feature is not mandatorry; if not receiving change
# notifications, the library will just assume that the document can change
# anythime, and therefore will not assume any stability.
documentChanged: -> @mapper.documentChanged()
# The available paths which can be searched
#
# An map is returned, where the keys are the paths, and the values hold
# the collected informatino about the given sub-trees of the DOM.
scan: ->
t0 = @timestamp()
data = @mapper.scan()
t1 = @timestamp()
return time: t1 - t0, data: data
# Return the default path
getDefaultPath: -> @mapper.getDefaultPath()
# Search for text using exact string matching # Search for text using exact string matching
# #
...@@ -54,19 +11,14 @@ class window.DomTextMatcher ...@@ -54,19 +11,14 @@ class window.DomTextMatcher
# #
# caseSensitive: should the search be case sensitive? (defaults to false) # caseSensitive: should the search be case sensitive? (defaults to false)
# #
# path: the sub-tree inside the DOM you want to search.
# Must be an XPath expression, relative to the configured root node.
# You can check for valid input values using the getAllPaths method above.
# It's not necessary to submit path, if the search was prepared beforehand,
# with the prepareSearch() method
# #
# For the details about the returned data structure, # For the details about the returned data structure,
# see the documentation of the search() method. # see the documentation of the search() method.
searchExact: (pattern, distinct = true, caseSensitive = false, path = null) -> searchExact: (pattern, distinct = true, caseSensitive = false) ->
if not @pm then @pm = new window.DTM_ExactMatcher if not @pm then @pm = new window.DTM_ExactMatcher
@pm.setDistinct(distinct) @pm.setDistinct(distinct)
@pm.setCaseSensitive(caseSensitive) @pm.setCaseSensitive(caseSensitive)
@search @pm, pattern, null, path @_search @pm, pattern
# Search for text using regular expressions # Search for text using regular expressions
# #
...@@ -75,18 +27,12 @@ class window.DomTextMatcher ...@@ -75,18 +27,12 @@ class window.DomTextMatcher
# #
# caseSensitive: should the search be case sensitive? (defaults to false) # caseSensitive: should the search be case sensitive? (defaults to false)
# #
# path: the sub-tree inside the DOM you want to search.
# Must be an XPath expression, relative to the configured root node.
# You can check for valid input values using the getAllPaths method above.
# It's not necessary to submit path, if the search was prepared beforehand,
# with the prepareSearch() method
#
# For the details about the returned data structure, # For the details about the returned data structure,
# see the documentation of the search() method. # see the documentation of the search() method.
searchRegex: (pattern, caseSensitive = false, path = null) -> searchRegex: (pattern, caseSensitive = false) ->
if not @rm then @rm = new window.DTM_RegexMatcher if not @rm then @rm = new window.DTM_RegexMatcher
@rm.setCaseSensitive(caseSensitive) @rm.setCaseSensitive(caseSensitive)
@search @rm, pattern, null, path @_search @rm, pattern
# Search for text using fuzzy text matching # Search for text using fuzzy text matching
# #
...@@ -102,26 +48,16 @@ class window.DomTextMatcher ...@@ -102,26 +48,16 @@ class window.DomTextMatcher
# fine-tuning parameters for the d-m-p library. # fine-tuning parameters for the d-m-p library.
# See http://code.google.com/p/google-diff-match-patch/wiki/API for details. # See http://code.google.com/p/google-diff-match-patch/wiki/API for details.
# #
# path: the sub-tree inside the DOM you want to search.
# Must be an XPath expression, relative to the configured root node.
# You can check for valid input values using the getAllPaths method above.
# It's not necessary to submit path, if the search was prepared beforehand,
# with the prepareSearch() method
#
# For the details about the returned data structure, # For the details about the returned data structure,
# see the documentation of the search() method. # see the documentation of the search() method.
searchFuzzy: (pattern, pos, caseSensitive = false, path = null, options = {}) -> searchFuzzy: (pattern, pos, caseSensitive = false, options = {}) ->
@ensureDMP() @ensureDMP()
@dmp.setMatchDistance options.matchDistance ? 1000 @dmp.setMatchDistance options.matchDistance ? 1000
@dmp.setMatchThreshold options.matchThreshold ? 0.5 @dmp.setMatchThreshold options.matchThreshold ? 0.5
@dmp.setCaseSensitive caseSensitive @dmp.setCaseSensitive caseSensitive
@search @dmp, pattern, pos, path, options @_search @dmp, pattern, pos, options
# Do some normalization to get a "canonical" form of a string.
# Used to even out some browser differences.
normalizeString: (string) -> string.replace /\s{2,}/g, " "
searchFuzzyWithContext: (prefix, suffix, pattern, expectedStart = null, expectedEnd = null, caseSensitive = false, path = null, options = {}) -> searchFuzzyWithContext: (prefix, suffix, pattern, expectedStart = null, expectedEnd = null, caseSensitive = false, options = {}) ->
@ensureDMP() @ensureDMP()
# No context, to joy # No context, to joy
...@@ -130,7 +66,7 @@ class window.DomTextMatcher ...@@ -130,7 +66,7 @@ class window.DomTextMatcher
with missing context!" with missing context!"
# Get full document length # Get full document length
len = @mapper.getDocLength() len = @corpus().length
# Get a starting position for the prefix search # Get a starting position for the prefix search
expectedPrefixStart = if expectedStart? expectedPrefixStart = if expectedStart?
...@@ -141,7 +77,7 @@ class window.DomTextMatcher ...@@ -141,7 +77,7 @@ class window.DomTextMatcher
# Do the fuzzy search for the prefix # Do the fuzzy search for the prefix
@dmp.setMatchDistance options.contextMatchDistance ? len * 2 @dmp.setMatchDistance options.contextMatchDistance ? len * 2
@dmp.setMatchThreshold options.contextMatchThreshold ? 0.5 @dmp.setMatchThreshold options.contextMatchThreshold ? 0.5
prefixResult = @dmp.search @mapper.corpus, prefix, expectedPrefixStart prefixResult = @dmp.search @corpus(), prefix, expectedPrefixStart
# If the prefix is not found, give up # If the prefix is not found, give up
unless prefixResult.length then return matches: [] unless prefixResult.length then return matches: []
...@@ -166,7 +102,7 @@ class window.DomTextMatcher ...@@ -166,7 +102,7 @@ class window.DomTextMatcher
64 64
# Get the part of text that is after the prefix # Get the part of text that is after the prefix
remainingText = @mapper.corpus.substr prefixEnd remainingText = @corpus().substr prefixEnd
# Calculate expected position # Calculate expected position
expectedSuffixStart = patternLength expectedSuffixStart = patternLength
...@@ -190,7 +126,7 @@ class window.DomTextMatcher ...@@ -190,7 +126,7 @@ class window.DomTextMatcher
matchThreshold = options.patternMatchThreshold ? 0.5 matchThreshold = options.patternMatchThreshold ? 0.5
# See how good a match we have # See how good a match we have
analysis = @analyzeMatch pattern, charRange, true analysis = @_analyzeMatch pattern, charRange, true
# Should we try to find a better match by moving the # Should we try to find a better match by moving the
# initial match around a little bit, even if this has # initial match around a little bit, even if this has
...@@ -202,7 +138,7 @@ class window.DomTextMatcher ...@@ -202,7 +138,7 @@ class window.DomTextMatcher
@pm.setDistinct false @pm.setDistinct false
@pm.setCaseSensitive false @pm.setCaseSensitive false
flexMatches = @pm.search @mapper.corpus[prefixStart..suffixEnd], pattern flexMatches = @pm.search @corpus()[prefixStart..suffixEnd], pattern
delete candidate delete candidate
bestError = 2 bestError = 2
...@@ -215,12 +151,12 @@ class window.DomTextMatcher ...@@ -215,12 +151,12 @@ class window.DomTextMatcher
# Check how the prefix would fare # Check how the prefix would fare
prefixRange = start: prefixStart, end: flexRange.start prefixRange = start: prefixStart, end: flexRange.start
a1 = @analyzeMatch prefix, prefixRange, true a1 = @_analyzeMatch prefix, prefixRange, true
prefixError = if a1.exact then 0 else a1.comparison.errorLevel prefixError = if a1.exact then 0 else a1.comparison.errorLevel
# Check how the suffix would fare # Check how the suffix would fare
suffixRange = start: flexRange.end, end: suffixEnd suffixRange = start: flexRange.end, end: suffixEnd
a2 = @analyzeMatch suffix, suffixRange, true a2 = @_analyzeMatch suffix, suffixRange, true
suffixError = if a2.exact then 0 else a2.comparison.errorLevel suffixError = if a2.exact then 0 else a2.comparison.errorLevel
# Did we at least one match? # Did we at least one match?
...@@ -237,17 +173,16 @@ class window.DomTextMatcher ...@@ -237,17 +173,16 @@ class window.DomTextMatcher
if candidate? if candidate?
console.log "flexContext adjustment: we found a better candidate!" console.log "flexContext adjustment: we found a better candidate!"
charRange = candidate charRange = candidate
analysis = @analyzeMatch pattern, charRange, true analysis = @_analyzeMatch pattern, charRange, true
# Do we have to compare what we found to a pattern? # Do we have to compare what we found to a pattern?
if (not pattern?) or # "No pattern, nothing to compare. Assume it's OK." if (not pattern?) or # "No pattern, nothing to compare. Assume it's OK."
analysis.exact or # "Found text matches exactly to pattern" analysis.exact or # "Found text matches exactly to pattern"
(analysis.comparison.errorLevel <= matchThreshold) # still acceptable (analysis.comparison.errorLevel <= matchThreshold) # still acceptable
mappings = @mapper.getMappingsForCharRange charRange.start, charRange.end
# Collect the results # Collect the results
match = {} match = {}
for obj in [charRange, analysis, mappings] for obj in [charRange, analysis]
for k, v of obj for k, v of obj
match[k] = v match[k] = v
return matches: [match] return matches: [match]
...@@ -256,19 +191,16 @@ class window.DomTextMatcher ...@@ -256,19 +191,16 @@ class window.DomTextMatcher
# errorLevel + ")" # errorLevel + ")"
return matches: [] return matches: []
# ===== Private methods (never call from outside the module) ======= # ===== Private methods (never call from outside the module) =======
constructor: (domTextMapper) -> # Do some normalization to get a "canonical" form of a string.
@mapper = domTextMapper # Used to even out some browser differences.
_normalizeString: (string) -> (string.replace /\s{2,}/g, " ").trim()
# Search for text with a custom matcher object # Search for text with a custom matcher object
# #
# Parameters: # Parameters:
# matcher: the object to use for doing the plain-text part of the search # matcher: the object to use for doing the plain-text part of the search
# path: the sub-tree inside the DOM you want to search.
# Must be an XPath expression, relative to the configured root node.
# You can check for valid input values using the getAllPaths method above.
# pattern: what to search for # pattern: what to search for
# pos: where do we expect to find it # pos: where do we expect to find it
# #
...@@ -280,7 +212,7 @@ class window.DomTextMatcher ...@@ -280,7 +212,7 @@ class window.DomTextMatcher
# Nodes is the list of matching nodes, with details about the matches. # Nodes is the list of matching nodes, with details about the matches.
# #
# If no match is found, an empty list is returned. # If no match is found, an empty list is returned.
search: (matcher, pattern, pos, path = null, options = {}) -> _search: (matcher, pattern, pos, options = {}) ->
# Prepare and check the pattern # Prepare and check the pattern
unless pattern? then throw new Error "Can't search for null pattern!" unless pattern? then throw new Error "Can't search for null pattern!"
pattern = pattern.trim() pattern = pattern.trim()
...@@ -288,28 +220,21 @@ class window.DomTextMatcher ...@@ -288,28 +220,21 @@ class window.DomTextMatcher
fuzzyComparison = options.withFuzzyComparison ? false fuzzyComparison = options.withFuzzyComparison ? false
# Do some preparation, if required
t0 = @timestamp()
if path? then @scan()
t1 = @timestamp() t1 = @timestamp()
# Do the text search # Do the text search
textMatches = matcher.search @mapper.corpus, pattern, pos, options textMatches = matcher.search @corpus(), pattern, pos, options
t2 = @timestamp() t2 = @timestamp()
matches = [] matches = []
for textMatch in textMatches for textMatch in textMatches
do (textMatch) => do (textMatch) =>
# See how good a match we have # See how good a match we have
analysis = @analyzeMatch pattern, textMatch, fuzzyComparison analysis = @_analyzeMatch pattern, textMatch, fuzzyComparison
# Collect the mappings
mappings = @mapper.getMappingsForCharRange textMatch.start,
textMatch.end
# Collect the results # Collect the results
match = {} match = {}
for obj in [textMatch, analysis, mappings] for obj in [textMatch, analysis]
for k, v of obj for k, v of obj
match[k] = v match[k] = v
...@@ -319,19 +244,17 @@ class window.DomTextMatcher ...@@ -319,19 +244,17 @@ class window.DomTextMatcher
result = result =
matches: matches matches: matches
time: time:
phase0_domMapping: t1 - t0
phase1_textMatching: t2 - t1 phase1_textMatching: t2 - t1
phase2_matchMapping: t3 - t2 phase2_matchMapping: t3 - t2
total: t3 - t0 total: t3 - t1
result result
timestamp: -> new Date().getTime() timestamp: -> new Date().getTime()
# Read a match returned by the matcher engine, and compare it with the pattern # Read a match returned by the matcher engine, and compare it with the pattern
analyzeMatch: (pattern, charRange, useFuzzy = false) -> _analyzeMatch: (pattern, charRange, useFuzzy = false) ->
expected = @normalizeString pattern expected = @_normalizeString pattern
found = @normalizeString @mapper.getContentForCharRange charRange.start, found = @_normalizeString @corpus()[charRange.start .. charRange.end - 1]
charRange.end
result = result =
found: found found: found
exact: found is expected exact: found is expected
...@@ -353,4 +276,4 @@ class window.DomTextMatcher ...@@ -353,4 +276,4 @@ class window.DomTextMatcher
unless window.DTM_DMPMatcher? unless window.DTM_DMPMatcher?
throw new Error "DTM_DMPMatcher is not available. throw new Error "DTM_DMPMatcher is not available.
Have you loaded the text match engines?" Have you loaded the text match engines?"
@dmp = new window.DTM_DMPMatcher @dmp = new window.DTM_DMPMatcher
\ No newline at end of file
...@@ -268,6 +268,8 @@ ...@@ -268,6 +268,8 @@
else if (null !== (oMatch = cfg.origin.match(/^https?:\/\/(?:[-a-zA-Z0-9_\.])+(?::\d+)?/))) { else if (null !== (oMatch = cfg.origin.match(/^https?:\/\/(?:[-a-zA-Z0-9_\.])+(?::\d+)?/))) {
cfg.origin = oMatch[0].toLowerCase(); cfg.origin = oMatch[0].toLowerCase();
validOrigin = true; validOrigin = true;
} else if (cfg.origin == "resource://pdf.js") {
validOrigin = true
} }
} }
......
# Common functions for all page-based document mapper modules
class window.PageTextMapperCore
CONTEXT_LEN: 32
# Get the page index for a given character position
getPageIndexForPos: (pos) ->
for info in @pageInfo
if info.start <= pos < info.end
return info.index
console.log "Not on page " + info.index
return -1
# A new page was rendered
_onPageRendered: (index) =>
#console.log "Allegedly rendered page #" + index
# Is it really rendered?
unless @_isPageRendered index
#console.log "Page #" + index + " is not really rendered yet."
setTimeout (=> @_onPageRendered index), 1000
return
# Collect info about the new DOM subtree
@_mapPage @pageInfo[index]
# Determine whether a given page has been rendered and mapped
isPageMapped: (index) ->
return @pageInfo[index]?.domMapper?
# Create the mappings for a given page
_mapPage: (info) ->
info.node = @getRootNodeForPage info.index
info.domMapper = new DomTextMapper("d-t-m for page #" + info.index)
info.domMapper.setRootNode info.node
info.domMapper.documentChanged()
if @requiresSmartStringPadding
info.domMapper.setExpectedContent info.content
info.domMapper.scan()
renderedContent = info.domMapper.getCorpus()
if renderedContent isnt info.content
console.log "Oops. Mismatch between rendered and extracted text, while mapping page #" + info.index + "!"
console.trace()
console.log "Rendered: " + renderedContent
console.log "Extracted: " + info.content
# Announce the newly available page
setTimeout ->
event = document.createEvent "UIEvents"
event.initUIEvent "docPageMapped", false, false, window, 0
event.pageIndex = info.index
window.dispatchEvent event
# Update the mappings for a given page
_updateMap: (info) ->
#console.log "Updating mappings for page #" + info.index
info.domMapper.scan()
# Delete the mappings for a given page
_unmapPage: (info) ->
delete info.domMapper
# Announce the unavailable page
event = document.createEvent "UIEvents"
event.initUIEvent "docPageUnmapped", false, false, window, 0
event.pageIndex = info.index
window.dispatchEvent event
# Look up info about a give DOM node, uniting page and node info
getInfoForNode: (node) ->
pageData = @getPageForNode node
nodeData = pageData.domMapper.getInfoForNode node
# Copy info about the node
info = {}
for k,v of nodeData
info[k] = v
# Correct the chatacter offsets with that of the page
info.start += pageData.start
info.end += pageData.start
info.pageIndex = pageData.index
info
# Return some data about a given character range
getMappingsForCharRange: (start, end, pages) ->
#console.log "Get mappings for char range [" + start + "; " + end + "], for pages " + pages + "."
# Check out which pages are these on
startIndex = @getPageIndexForPos start
endIndex = @getPageIndexForPos end
#console.log "These are on pages [" + startIndex + ".." + endIndex + "]."
# Function to get the relevant section inside a given page
getSection = (index) =>
info = @pageInfo[index]
# Calculate in-page offsets
realStart = (Math.max info.start, start) - info.start
realEnd = (Math.min info.end, end) - info.start
# Get the range inside the page
mappings = info.domMapper.getMappingsForCharRange realStart, realEnd
mappings.sections[0]
# Get the section for all involved pages
sections = {}
for index in pages ? [startIndex..endIndex]
sections[index] = getSection index
# Return the data
sections: sections
getCorpus: -> @_corpus
getContextForCharRange: (start, end) ->
prefixStart = Math.max 0, start - @CONTEXT_LEN
prefixLen = start - prefixStart
prefix = @_corpus.substr prefixStart, prefixLen
suffix = @_corpus.substr end, @CONTEXT_LEN
[prefix.trim(), suffix.trim()]
# Call this in scan, when you have the page contents
_onHavePageContents: ->
# Join all the text together
@_corpus = (info.content for info in @pageInfo).join " "
# Go over the pages, and calculate some basic info
pos = 0
@pageInfo.forEach (info, i) =>
info.index = i
info.len = info.content.length
info.start = pos
info.end = (pos += info.len + 1)
# Call this in scan, after resolving the promise
_onAfterScan: ->
# Go over the pages again, and map the rendered ones
@pageInfo.forEach (info, i) =>
if @_isPageRendered i
@_mapPage info
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment