谷歌文档脚本,大写句子而不删除其他属性

时间:2015-10-23 18:35:52

标签: javascript regex google-apps-script google-docs google-apps

我想创建一个脚本来大写google doc中的句子,但不会改变某些单词中的现有属性。例如,在谷歌文档中,会有几个段落,每个段落都有几个句子。在这样的谷歌文档中,会有超链接,粗体中的单词,斜体中的单词,带下划线的单词等。我希望所有这些属性保持不变;脚本应该只对句子进行大写,而不删除这些单词的现有属性。

我编写了以下google doc脚本,它完成了大写句子的工作,但脚本删除了上面提到的其他单词(超链接,粗体,斜体,下划线)中的所有属性。

function cap12() {

  // define function "replacement" to change the matched pattern to uppercase
  function replacement(match) { return match.toUpperCase(); }

  // define regex "period, followed by zero or any number 
  // of blank spaces, followed by any lowercase character"
  var regex1 = "(^|\.)(\s*)[a-z]";
  var regex2 = /(^|\.)(\s*)[a-z]/;
  // Logger.log(regex1, regex2);

  // get text matching pattern "regex"
  var body = DocumentApp.getActiveDocument().getBody();
  var foundElement = body.findText(regex1);
  // Logger.log(foundElement);

  while (foundElement != null) {
    // Get the text object from the element
    var foundText = foundElement.getElement().asText();   

    // capitalize the character after the period   
    var str1 = foundText.getText();
    var str2 = str1.replace(regex2, replacement);
    foundText.setText(str2);

    // Find the next match
    foundElement = body.findText(regex1, foundElement);
  }

}

我感谢任何帮助指出我的错误。谢谢。

注意:上面的脚本cap12是我的项目的延续,用于开发一个google脚本来大写句子,如帖子google doc script to capitalize sentences中所述。本文中的最终脚本cap7仅在所选文本上本地工作(即不在整个文档上),但也删除了所有属性,如超链接,粗体,斜体,下划线。

通过阅读右栏中列出的相关帖子,或多或少随机的方式,或许本能地引导,我偶然发现一个可能由专业人士写的好剧本,新手(像我一样)可以从中学到很多东西。所以我描述了我在下面做了什么,以防有人感兴趣。

来自帖子,与我目前的帖子相关,标题为Google Apps Script/Javascript search and replace with regex not working,我注意到另一篇相关帖子Find and change unknown strings to UPPERCASE in Google Apps Script Document using JS,其中Mogsdad发布了一个非常好的代码。首先,通过讨论阅读,我认为我必须尝试理解Mogsdad在答案中发布的代码。

然后我注意到句子“以下脚本是文档加载项的一部分,this gist中可用changeCase.js中的源代码。” (我仍然需要找出“gist”的意思;与GitHub有关的东西。好的,“gist”在帖子What is the difference between github and gist? [closed]中有解释。)

所以我查看了链接this gist,实际上我发现脚本changeCase.js包含ALMOST我正在尝试开发的内容(即“句子案例”;下面描述了一些问题):

changeCase.js - Document add-in, provides case-change operations in the add-in Menu.

onOpen - installs "Change Case" menu
_changeCase - worker function to locate selected text and change text case. Case conversion is managed via callback to a function that accepts a string as a parameter and returns the converted string.
helper functions for five cases
UPPER CASE
lower case
Title Case
Sentence case
camelCase
Fountain-lite, screenplay formatting - see http://fountain.io/
这是一个了不起的代码;我需要很长时间才能达到这个水平来开发这样的代码。

我在我的google doc中安装了脚本changeCase.js,关闭了google doc再次重新打开它以激活加载项changeCase.js。然后我测试了“句子案例”选项;该脚本工作得很好,我可以选择我希望将句子大写的文本,避免使用特殊格式的单词,如粗体,斜体,下划线等。

但是当我选择包含粗体字(和/或斜体字和/或下划线)的文本时,则会删除粗体属性(与我想要解决的问题完全相同)。所以脚本changeCase.js没有解决我的问题,但提供了解决方法。

脚本changeCase.js仅在所选文本上本地工作,而我的帖子google doc script to capitalize sentences中的脚本cap7在整个段落中工作,即使我只选择了一部分这段落。

换句话说,我可以修改我的脚本cap7,使其成为脚本changeCase.js的“句子案例”选项。我认为问题在于我进行了“全局”搜索和替换,而不是在所选文本中进行“本地”搜索和替换。

脚本changeCase.js的“句子案例”选项的问题在于它将所选文本中的所有字符转换为小写,这不是我想要的,因为有些字符我想保持大写(例如,人名等)。我只想将所选文本中的句子大写,而不修改这些句子中的任何内容。

要执行上述操作,只需删除代码中的“toLowerCase”方法:

// https://stackoverflow.com/a/19089667/1677912
function _toSentenceCase (str) {
  var rg = /(^\s*\w{1}|\.\s*\w{1})/gi;
  return str.toLowerCase().replace(rg, function(toReplace) {
    return toReplace.toUpperCase();
  });
}

即使用以下修改后的代码:

function _toSentenceCase (str) {
  var rg = /(^\s*\w{1}|\.\s*\w{1})/gi;
  return str.replace(rg, function(toReplace) {
    return toReplace.toUpperCase();
  });
}

它有效。

脚本changeCase.js的另一个问题是它一次只能处理一个段落,效率不高。

我想开发一个可以处理整个文档的脚本,而不需要删除现有属性(超链接,粗体,斜体,下划线)。

如果有人可以在帖子google doc script, attributes (bold, italics, underline) not shown in log中的帖子cap12b中指出错误/问题,我们将不胜感激。

0 个答案:

没有答案