Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Iterating through words in a paragraph

So basically I have a paragraph with some text underlined, but not all text is underlined. I want to be able to iterate through the selected text and change the text size of the UN-underlined text.

Essentially I want the underlined text to stick out more. Is there a way to iterate through the paragraph and check if each word is underlined? The text element in GAS has a isUnderlined() function but that doesn't do me any good since I only know how to grab the entire element.

like image 505
tmoney226 Avatar asked Jan 15 '15 19:01

tmoney226


2 Answers

Here is some code that evaluates each word in a paragraph. It bolds every word in the third paragraph that is not underlined. As an example, the code is getting the 3rd paragraph. You will need to adjust the code to your criteria. The code assumes that if the first letter of the word is underlined, that the entire word is underlined. Each word is set to bold with a beginning and ending index.

function findAndBold() {
  var allParagraphs,bodyElement,endPosition,lengthOfThisWord ,numberOfWordsInPara ,
      paragraphAsString,remainingTxtInParagraph,startPosition,text ,theParagraph;

  bodyElement = DocumentApp.getActiveDocument().getBody();
  allParagraphs = bodyElement.getParagraphs();

  //Get a paragraph by index number  E.g. 2 Gets the third paragraph
  theParagraph = allParagraphs[2];
  //Logger.log("theParagraph: " + theParagraph);

  // Only modify elements that can be edited as text; skip images and other
  // non-text elements.
  text = theParagraph.editAsText();
  paragraphAsString = text.getText();
  //Logger.log("paragraphAsString: " + paragraphAsString);

  startPosition = 0;
  endPosition = 0;
  remainingTxtInParagraph = paragraphAsString;
  lengthOfThisWord = 0;
  numberOfWordsInPara = 0;//Initialize with a value of zero

  while (remainingTxtInParagraph.length > 0) {
    Logger.log("remainingTxtInParagraph: " + remainingTxtInParagraph.length);
    numberOfWordsInPara ++;

    lengthOfThisWord = remainingTxtInParagraph.indexOf(" ");
    Logger.log("lengthOfThisWord: " + lengthOfThisWord);

    if (lengthOfThisWord > -1) {
      endPosition = startPosition + lengthOfThisWord;
      Logger.log("startPosition: " + startPosition);
      Logger.log("endPosition: " + endPosition);
    } else {
      lengthOfThisWord = remainingTxtInParagraph.length;
      Logger.log("lengthOfThisWord: " + lengthOfThisWord);
      endPosition = startPosition + lengthOfThisWord - 1;
      Logger.log("final end position: " + endPosition);
      Logger.log("startPosition: " + startPosition);
    };

    remainingTxtInParagraph = remainingTxtInParagraph.substr(lengthOfThisWord + 1); //length is omitted.  Extracts characters to the end
    Logger.log("remainingTxtInParagraph: " + remainingTxtInParagraph.length);

    if (!text.isUnderline(startPosition)) {
      text.setBold(startPosition, endPosition, true);
    };

    startPosition = startPosition + lengthOfThisWord + 1;
    Logger.log("next iteration startPosition: " + startPosition);
    Logger.log(" ");
  };

  Logger.log("numberOfWordsInPara: " + numberOfWordsInPara);
}

The code uses a combination of JavaScript string methods, the JavaScript string length property, along with the Apps Script Text Class methods.

like image 181
Alan Wells Avatar answered Sep 28 '22 00:09

Alan Wells


the easiest way to do that is if you iterate through each character in the paragraph.

function notUnder() {
  var doc = DocumentApp.getActiveDocument();
  var body = doc.getBody();
  var paragraph = body.getChild(0); //Analyze the first paragraph in document
  var txt = paragraph.asParagraph().getChild(0); //assumes the paragraph only has text
  var len = txt.asText().getText().length;
  for (var i = 0; i<len; i++) {
    var isUnder = txt.asText().isUnderline(i);
    if (!isUnder) {
      txt.asText().setFontSize(i,i,10); //sets the character to font size 10 if is not underlined
    };
  };
};

This will make all characters that are not underlined have font size of 10. If a word has only one character underlined, all other characters in the word will be of size 10. This can be worked to behave differently, but is a starting point...

like image 35
filipeglfw Avatar answered Sep 28 '22 01:09

filipeglfw