blob: 2280c0f86bd06a62d82eb9bc7ad1d64db8dc36e4 [file] [log] [blame]
// Copyright 2014 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.gitiles;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Converts commit message text to soy data in accordance with a commentlink rule.
*
* <p>Example:
*
* <pre>
* new CommentLinkInfo(
* Pattern.compile("bug (\d+)"),
* "http://bugs/$1")
* .linkify("do something nice\n\nbug 5")
* </pre>
*
* <p>returns a list of soy data objects:
*
* <pre>
* ImmutableList.of(
* ImmutableMap.of("text", "do something nice\n\n"),
* ImmutableMap.of("text", "bug 5", "url", "http://bugs/5")
* )
* </pre>
*/
public class CommentLinkInfo {
private final Pattern pattern;
private final String link;
public CommentLinkInfo(Pattern pattern, String link) {
this.pattern = checkNotNull(pattern);
this.link = checkNotNull(link);
}
public List<Map<String, String>> linkify(String input) {
List<Map<String, String>> parsed = Lists.newArrayList();
Matcher m = pattern.matcher(input);
int last = 0;
while (m.find()) {
addText(parsed, input.substring(last, m.start()));
String text = m.group(0);
addLink(parsed, text, pattern.matcher(text).replaceAll(link));
last = m.end();
}
addText(parsed, input.substring(last));
return ImmutableList.copyOf(parsed);
}
private static void addLink(List<Map<String, String>> parts, String text, String url) {
parts.add(ImmutableMap.of("text", text, "url", url));
}
private static void addText(List<Map<String, String>> parts, String text) {
if (text.isEmpty()) {
return;
}
if (parts.isEmpty()) {
parts.add(ImmutableMap.of("text", text));
} else {
Map<String, String> old = parts.get(parts.size() - 1);
if (!old.containsKey("url")) {
parts.set(parts.size() - 1, ImmutableMap.of("text", old.get("text") + text));
} else {
parts.add(ImmutableMap.of("text", text));
}
}
}
}