blob: c1ed2465bfd2af20c6541f2b49a3aa9ac6f44792 [file] [log] [blame]
Shawn Pearce99cdbce2015-02-10 12:05:45 -08001// Copyright 2015 Google Inc. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package com.google.gitiles.doc;
16
Shawn Pearce99cdbce2015-02-10 12:05:45 -080017import com.google.gitiles.doc.html.HtmlBuilder;
Shawn Pearcef75a2c62015-02-12 21:39:00 -080018import com.google.template.soy.shared.restricted.EscapingConventions.FilterImageDataUri;
Dave Borowitz1900e522015-09-16 16:32:41 -040019import com.google.template.soy.shared.restricted.Sanitizers;
Shawn Pearce99cdbce2015-02-10 12:05:45 -080020
Shawn Pearce12c8fab2016-05-15 16:55:21 -070021import org.commonmark.node.Heading;
22import org.commonmark.node.Node;
Shawn Pearce99cdbce2015-02-10 12:05:45 -080023
24import java.util.HashMap;
Shawn Pearce99cdbce2015-02-10 12:05:45 -080025import java.util.Map;
Shawn Pearce12c8fab2016-05-15 16:55:21 -070026import java.util.regex.Matcher;
27import java.util.regex.Pattern;
Shawn Pearce99cdbce2015-02-10 12:05:45 -080028
29class Navbar {
Shawn Pearce12c8fab2016-05-15 16:55:21 -070030 private static final Pattern REF_LINK =
31 Pattern.compile("^\\[(logo|home)\\]:\\s*(.+)$", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
32
33 static Map<String, Object> bannerSoyData(
34 ImageLoader img, MarkdownToHtml toHtml, String navMarkdown, Node nav) {
Shawn Pearce99cdbce2015-02-10 12:05:45 -080035 Map<String, Object> data = new HashMap<>();
36 data.put("siteTitle", null);
37 data.put("logoUrl", null);
38 data.put("homeUrl", null);
39
40 if (nav == null) {
41 return data;
42 }
43
Shawn Pearce12c8fab2016-05-15 16:55:21 -070044 for (Node c = nav.getFirstChild(); c != null; c = c.getNext()) {
45 if (c instanceof Heading) {
46 Heading h = (Heading) c;
Shawn Pearce99cdbce2015-02-10 12:05:45 -080047 if (h.getLevel() == 1) {
Shawn Pearce108599e2015-02-11 13:28:37 -080048 data.put("siteTitle", MarkdownUtil.getInnerText(h));
Shawn Pearce12c8fab2016-05-15 16:55:21 -070049 h.unlink();
Shawn Pearce99cdbce2015-02-10 12:05:45 -080050 break;
51 }
52 }
53 }
54
Shawn Pearce12c8fab2016-05-15 16:55:21 -070055 Matcher m = REF_LINK.matcher(navMarkdown);
56 while (m.find()) {
57 String key = m.group(1).toLowerCase();
58 String url = m.group(2).trim();
59 switch (key) {
60 case "logo":
61 data.put("logoUrl", toImgSrc(img, url));
62 break;
63
64 case "home":
65 data.put("homeUrl", toHtml.href(url));
66 break;
Shawn Pearce99cdbce2015-02-10 12:05:45 -080067 }
68 }
Shawn Pearce12c8fab2016-05-15 16:55:21 -070069
Shawn Pearce99cdbce2015-02-10 12:05:45 -080070 return data;
71 }
72
Shawn Pearce12c8fab2016-05-15 16:55:21 -070073 private static Object toImgSrc(ImageLoader img, String url) {
74 if (HtmlBuilder.isValidHttpUri(url)) {
75 return url;
76 }
77
78 if (HtmlBuilder.isImageDataUri(url)) {
79 return Sanitizers.filterImageDataUri(url);
80 }
81
82 if (img != null) {
83 return Sanitizers.filterImageDataUri(img.loadImage(url));
84 }
85
86 return FilterImageDataUri.INSTANCE.getInnocuousOutput();
87 }
88
Han-Wen Nienhuysc0200f62016-05-02 17:34:51 +020089 private Navbar() {}
Shawn Pearce99cdbce2015-02-10 12:05:45 -080090}