
hudson.AbstractMarkupText Maven / Gradle / Ivy
package hudson;
import hudson.MarkupText.SubText;
import java.util.List;
import java.util.ArrayList;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
/**
* Common part between {@link MarkupText} and {@link MarkupText.SubText}.
*
*
* See {@link MarkupText} for more discussion about what this class represents.
*
* @author Kohsuke Kawaguchi
* @since 1.250
*/
public abstract class AbstractMarkupText {
/*package*/ AbstractMarkupText() {} // limit who can subclass this type.
/**
* Returns the plain text portion of this {@link MarkupText} without
* any markup.
*/
public abstract String getText();
/**
* Adds a start tag and end tag at the specified position.
*
*
* For example, if the text was "abc", then addMarkup(1,2,"<b>","</b>")
* would generate "a<b>b</b>c"
*/
public abstract void addMarkup( int startPos, int endPos, String startTag, String endTag );
/**
* Find all "tokens" that match the given pattern in this text.
*
*
* A token is like a substring, except that it's aware of word boundaries.
* For example, while "bc" is a string of "abc", calling {@code findTokens}
* with "bc" as a pattern on string "abc" won't match anything.
*
*
* This method is convenient for finding keywords that follow a certain syntax
* from natural text. You can then use {@link MarkupText.SubText#surroundWith(String,String)}
* to put mark up around such text.
*/
public List findTokens(Pattern pattern) {
String text = getText();
Matcher m = pattern.matcher(text);
List r = new ArrayList();
while(m.find()) {
int idx = m.start();
if(idx>0) {
char ch = text.charAt(idx-1);
if(Character.isLetter(ch) || Character.isDigit(ch))
continue; // not at a word boundary
}
idx = m.end();
if(idx