Hi,
I'm working on
http://jira.xwiki.org/jira/browse/XWIKI-4345 and in
order to implement the logic in contenview.vm I need to perform some
regex find() from velocity.
I'd like to propose introducing a new velocity tool for this:
#-# velocity.tools = regextool = org.xwiki.velocity.tools.RegexTool
Right now RegexTool has one method:
/**
* @param content the content to parse
* @param regex the regex to look for in the passed content
* @return empty list if the passed regex doesn't match the
content or several {@link RegexResult} objects
* containing the matched position and matched content
for all capturing groups, the first group
* representing the whole . The first object is
represents the entier pattern
*/
public List<RegexResult> find(String content, String regex)
{
List<RegexResult> result = new ArrayList<RegexResult>();
Matcher matcher = Pattern.compile(regex,
Pattern.MULTILINE).matcher(content);
if (matcher.find()) {
for (int i = 0; i < matcher.groupCount() + 1; i++) {
result.add(new RegexResult(matcher.start(i),
matcher.end(i), matcher.group(i)));
}
}
return result;
}
WDYT?
FYI here's what I currently have in contenview.vm:
##
----------------------------------------------------------------------------
## Remove the first rendered H1 or H2 if the following conditions are
met:
## - the document's title is set
## - the title compatibility flag is on
## - the title extracted from the rendered content is the same as the
set title
## We need to do this since we've changed how titles are used and we
need to
## ensure we don't break existing documents that have not yet migrated
to the
## new way.
##
-----------------------------------------------------------------------------
#set ($titleToDisplay = $tdoc.displayTitle)
#if ($cdoc.title && $cdoc.title.length() > 0)
## Look for first H1 or H2 either in lowercase or uppercase
#set ($regexResult = $regextool.find($renderedContent, "<[hH][12].*?
<span>(.*)</span></[hH][12]>"))
#if (!$regexResult.isEmpty() &&
$regexResult.get(1).group.equals($titleToDisplay))
#if ($regexResult.get(0).end <
$mathtool.sub($renderedContent.length(), 1))
#set ($renderedContent = "${renderedContent.substring(0,
$regexResult.get(0).start)}$
{renderedContent.substring($regexResult.get(0).end)}")
#else
#set ($renderedContent = $renderedContent.substring(0,
$regexResult.get(0).start))
#end
#end
#end
Note that the other option is to introduce yet another API in Document
for this but it doesn't look right to me.
Here's my +1
Thanks
-Vincent