annotatedText (el, path, options = {}) {
    if (!path) {
      throw new Error('path is mandatory')
    }
    const state = this.state
    const context = last(state.contexts)
    // NOTE: this API is meant for node converters, which have been triggered
    // via convertElement().
    if (!context) {
      throw new Error('This should be called from within an element converter.')
    }
    // TODO: are there more options?
    const oldPreserveWhitespace = state.preserveWhitespace
    if (options.preserveWhitespace) {
      state.preserveWhitespace = true
    }
    state.stack.push({ path: path, offset: 0, text: '', annos: [] })
    // IMO we should reset the last char, as it is only relevant within one
    // annotated text property. This feature is mainly used to eat up
    // whitespace in XML/HTML at tag boundaries, produced by pretty-printed XML/HTML.
    this.state.lastChar = ''
    const iterator = this.getChildNodeIterator(el)
    const text = this._annotatedText(iterator)
    // now we can create all annotations which have been created during this
    // call of annotatedText
    const top = state.stack.pop()
    context.annos = context.annos.concat(top.annos)

    // reset state
    state.preserveWhitespace = oldPreserveWhitespace

    return text
  }
Convert annotated text. You should call this method only for elements
containing rich-text.

@param {DOMElement} el
@param {String[]} path The target property where the extracted text (plus annotations) should be stored.
@param {Object} options
@param {Boolean} options.preserveWhitespace when true will preserve whitespace. Default: false.
@returns {String} The converted text as plain-text

@example

```
p.content = converter.annotatedText(pEl, [p.id, 'content'])
```