| // 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)); | |
| } | |
| } | |
| } | |
| } |