com.google.gitiles.CommentLinkInfo.java Source code

Java tutorial

Introduction

Here is the source code for com.google.gitiles.CommentLinkInfo.java

Source

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