Google文档 - 实时访问文本更改

Mr.*_*olf 30 javascript google-docs google-apps-script google-drive-realtime-api

目标

我们的用户使用Google文档.他们写的文字将在他们使用文字转语音键入时读给他们.它应该在尽可能多的平台和浏览器中工作.

我们的方案

这似乎适合Google Apps脚本,适用于所有桌面浏览器和某些移动浏览器.

这有效

我们有一个文本转语音模块,效果很好,所以没问题.我们目前正在使用侧边栏.侧边栏可以使用HTML 5音频标签播放音频,无需任何问题.

问题

问题实际上是从Google文档文档中获取文本.到目前为止,我还没有找到任何方法直接从侧边栏访问Google文档文本.我们一直在做的是:

  1. 补充工具栏每隔x毫秒轮询我们在Google云上运行的Google Apps脚本
  2. 然后,我们在Google云上运行的Google Apps脚本会访问云中的同步文档
  3. 如果发现任何更改,则会将其发送回补充工具栏
  4. 边栏使用HTML5音频标签和我们的文字转语音播放音频.

在此输入图像描述

从用户在谷歌文档中输入文本到将更改同步到谷歌文档云时,需要一秒或更长时间.

我们计划了不同的步骤.文本转语音很快,HTML5音频也没问题.

时间片是获得文本的变化.它目前需要1-3秒,这对我们的用例来说太长了.

我们可以更快地访问Google文档中的文字吗?也许直接而不是通过谷歌的云?

更新2017-02-15 目前看来它是不可能的.可以通过Chrome扩展程序执行此操作,它会解析Google文档主页并从HTML + JS中提取文本.这很难,但......可能.

Bud*_*nWA 1

如果浏览器插件是提供该功能的适当方式,那么应该可以监听 Google 文档在更新页面内容时对 DOM 所做的更改。

// This div contains all of the page content and not much else, in my rudimentary testing.
var pageRoot = document.getElementsByClassName('kix-appview-editor')[0].firstChild;

var observer = new MutationObserver(handleNewChanges);
observer.observe(pageRoot, {
  subtree: true,
  childList: true,
  attributes: false,
});

// Later, you can stop observing
observer.disconnect();
Run Code Online (Sandbox Code Playgroud)

handleNewChanges只要 DOM 内容发生更改,您的函数就会被调用,并带有更改列表。这些变化相当混乱,但是

  • 可以通过查看添加和删除的节点来过滤无关紧要的更改(例如用户选择某些文本),
  • 您可以沿着 DOM 树查找文档中更改的位置,并且
  • 您可以使用它someNode.innerText来获取实际内容。

通过观察更改并保留某些文档状态,您应该能够确定您关心的更改何时发生。


这似乎很适合您的用例,因为

  • 不需要远程服务器。数据流看起来更像是这样,完全在浏览器选项卡中:

    ---------------                   ----------        
    | Google Docs | <=  fetch doc  <= |  Your  |
    |  Document   | => DOM changes => | Module |
    ---------------                   ----------
    
    Run Code Online (Sandbox Code Playgroud)
  • 更新与文档视觉更新同步,这感觉触发此操作是很自然的事情。

  • 解析每个 DOM 更改所需的簿记量可能是恒定的(即,无需循环遍历文档内容)。这意味着观察增加的开销是恒定的,因此它应该扩展到任何大小的文档。