在 Google Docs 中捕获文本选择

Posted

技术标签:

【中文标题】在 Google Docs 中捕获文本选择【英文标题】:Capture text selection in Google Docs 【发布时间】:2017-05-16 02:33:47 【问题描述】:

我正在编写一个 Chrome 扩展程序来捕获用户文本选择并将所选文本发送到 Google 搜索。

ma​​nifest.json


  "manifest_version": 2,

  "name": "Selection Extension",
  "description": "Search your selected text",
  "version": "1.0",
  "permissions": [
    "tabs",
    "http://*/*",
    "https://*/*"
  ],
  "background": 
    "scripts": [
      "background.js"
    ],
    "persistent": false
  ,
  "browser_action": 
    "default_icon": "icon.png",
    "default_title": "Mark it!!"
  ,
  "content_scripts": [
    
      "matches": ["<all_urls>"],
      "js": ["content_script.js"]
    
  ]

content_script.js

chrome.extension.onMessage.addListener(function(request, sender, sendResponse) 
    if (request.method == "getSelection") 
        sendResponse(data: window.getSelection().toString());
     else 
        sendResponse();
    
);

background.js

function initBackground() 

    chrome.browserAction.onClicked.addListener(function(tab) 
        chrome.tabs.sendMessage(tab.id, method: "getSelection", function(response)
            sendServiceRequest(response.data);
        );
    );


function sendServiceRequest(selectedText) 
    var serviceCall = 'http://www.google.com/search?q=' + selectedText;
    chrome.tabs.create(url: serviceCall);


initBackground();

此代码适用于网页(例如 Gmail、Facebook、新闻)中的选择。 我还希望能够在 PDF 和 Google Docs(在浏览器中查看)中获得选择。 在这些情况下:window.getSelection 返回一个空字符串...

有人知道怎么做吗?

【问题讨论】:

谢谢你!我将删除 executeScript。 对于 google-docs,有一个带有“kix-selection-overlay”类的 html 元素。此类是创建选择外观(即青色背景)的实际 div。但它无论如何都没有连接到包含文本的 div... 关于PDF:***.com/questions/15527095/… @Makyen 在这种情况下最小、完整和可验证的例子是唯一的window.getSelection().toString() This video tutorial 几乎完全符合您的要求。 【参考方案1】:

Google Docs 文档并没有真正遵循从扩展程序访问文本的正常方式。 为此,我创建了一个使用 Google Docs 的工具,可以在 here 找到它

这应该使您能够:

//contentScript.js
var googleDocument = googleDocsUtil.getGoogleDocument();
console.log("The selected text is: " + googleDocument.selectedText);

【讨论】:

您能否分享截取的确切代码 - 仅用于获取选定的文本?【参考方案2】:

您可以从上下文菜单中获取此信息。我打赌你无论如何都会添加一个上下文菜单项。

chrome.contextMenus.create(
   id:"g-search",
   title:"Search %s",
   contexts:["selection"]
);

chrome.contextMenus.onClicked.addListener(function(sel)
   console.log(sel.selectionText);
);

【讨论】:

谢谢,但是这种方法被 Google Docs 阻止了 - 而不是浏览器用户的上下文菜单,而是查看 Google Docs 的上下文菜单。 如果您愿意,可以添加禁用 Google 文档菜单的 Google 文档菜单项。 IE。禁用此菜单并允许原生。 在执行此操作之前将“contextMenus”权限添加到 manifest.json【参考方案3】:

感谢Mr. Java Wolf answer。

我创建了他的项目的一个分支,然后完全重写了他的项目以适应我自己的需要。保留了核心概念,但现在它更易于使用,因为它同时支持 IIFE 和 CJS。

所以,这里是google-docs-utils 包:

GitHub - https://github.com/Amaimersion/google-docs-utils NPM - https://www.npmjs.com/package/google-docs-utils

您可以将它与 Node.js 一起使用,也可以直接在浏览器中使用:

Node.js:npm install google-docs-utils 浏览器:https://unpkg.com/google-docs-utils@latest/dist/iife/index.js

这是使用google-docs-utils 包解决您的任务的代码:

const linesData = GoogleDocsUtils.getSelection();
let selectionData = null;

for (const lineData of linesData) 
    if (lineData) 
        selectionData = lineData;

        // we handle only single selection
        break;
    


if (selectionData) 
    console.log(selectionData.selectedText);

【讨论】:

以上是关于在 Google Docs 中捕获文本选择的主要内容,如果未能解决你的问题,请参考以下文章

如何启用 Intent 选择 Google Docs 文件(保存在 Google Drive 上)?

在另一个应用程序中捕获文本选择

Google Maps API 3. 叠加层中的文本选择

R Shiny Dynamic 选择输入 - 捕获事件

R Shiny Dynamic选择输入 - 捕获事件

Google 选择器身份验证弹出窗口被阻止