From a502d96a860456ec5e8c96761db70f7cabb74751 Mon Sep 17 00:00:00 2001 From: Paul Martin <paul@paulsputer.com> Date: Sat, 30 Apr 2016 04:19:14 -0400 Subject: [PATCH] Merge pull request #1073 from gitblit/1062-DocEditorUpdates --- src/main/java/com/gitblit/wicket/pages/BlobPage.java | 114 +++++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 79 insertions(+), 35 deletions(-) diff --git a/src/main/java/com/gitblit/wicket/pages/BlobPage.java b/src/main/java/com/gitblit/wicket/pages/BlobPage.java index e2b8546..1ef8f22 100644 --- a/src/main/java/com/gitblit/wicket/pages/BlobPage.java +++ b/src/main/java/com/gitblit/wicket/pages/BlobPage.java @@ -21,31 +21,42 @@ import org.apache.wicket.Component; import org.apache.wicket.PageParameters; +import org.apache.wicket.RedirectException; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.image.Image; import org.apache.wicket.markup.html.link.BookmarkablePageLink; -import org.eclipse.jgit.lib.Constants; +import org.apache.wicket.markup.html.link.ExternalLink; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; -import com.gitblit.GitBlit; import com.gitblit.Keys; +import com.gitblit.servlet.RawServlet; import com.gitblit.utils.JGitUtils; import com.gitblit.utils.StringUtils; +import com.gitblit.wicket.CacheControl; +import com.gitblit.wicket.CacheControl.LastModified; import com.gitblit.wicket.ExternalImage; +import com.gitblit.wicket.MarkupProcessor; import com.gitblit.wicket.WicketUtils; import com.gitblit.wicket.panels.CommitHeaderPanel; import com.gitblit.wicket.panels.PathBreadcrumbsPanel; +@CacheControl(LastModified.BOOT) public class BlobPage extends RepositoryPage { + + protected String fileExtension; public BlobPage(PageParameters params) { super(params); Repository r = getRepository(); final String blobPath = WicketUtils.getPath(params); - String [] encodings = GitBlit.getEncodings(); - + String [] encodings = getEncodings(); + + if (StringUtils.isEmpty(objectId) && StringUtils.isEmpty(blobPath)) { + throw new RedirectException(TreePage.class, WicketUtils.newRepositoryParameter(repositoryName)); + } + if (StringUtils.isEmpty(blobPath)) { // blob by objectid @@ -53,9 +64,8 @@ WicketUtils.newPathParameter(repositoryName, objectId, blobPath)) .setEnabled(false)); add(new BookmarkablePageLink<Void>("historyLink", HistoryPage.class).setEnabled(false)); - add(new BookmarkablePageLink<Void>("rawLink", RawPage.class, - WicketUtils.newPathParameter(repositoryName, objectId, blobPath))); - add(new BookmarkablePageLink<Void>("headLink", BlobPage.class).setEnabled(false)); + String rawUrl = RawServlet.asLink(getContextUrl(), repositoryName, objectId, blobPath); + add(new ExternalLink("rawLink", rawUrl)); add(new CommitHeaderPanel("commitHeader", objectId)); add(new PathBreadcrumbsPanel("breadcrumbs", repositoryName, blobPath, objectId)); Component c = new Label("blobText", JGitUtils.getStringContent(r, objectId, encodings)); @@ -68,26 +78,24 @@ extension = blobPath.substring(blobPath.lastIndexOf('.') + 1).toLowerCase(); } - // see if we should redirect to the markdown page - for (String ext : GitBlit.getStrings(Keys.web.markdownExtensions)) { + // see if we should redirect to the doc page + MarkupProcessor processor = new MarkupProcessor(app().settings(), app().xssFilter()); + for (String ext : processor.getMarkupExtensions()) { if (ext.equals(extension)) { - setResponsePage(MarkdownPage.class, params); + setResponsePage(DocPage.class, params); return; } } - // manually get commit because it can be null - RevCommit commit = JGitUtils.getCommit(r, objectId); + RevCommit commit = getCommit(); // blob page links add(new BookmarkablePageLink<Void>("blameLink", BlamePage.class, WicketUtils.newPathParameter(repositoryName, objectId, blobPath))); add(new BookmarkablePageLink<Void>("historyLink", HistoryPage.class, WicketUtils.newPathParameter(repositoryName, objectId, blobPath))); - add(new BookmarkablePageLink<Void>("rawLink", RawPage.class, - WicketUtils.newPathParameter(repositoryName, objectId, blobPath))); - add(new BookmarkablePageLink<Void>("headLink", BlobPage.class, - WicketUtils.newPathParameter(repositoryName, Constants.HEAD, blobPath))); + String rawUrl = RawServlet.asLink(getContextUrl(), repositoryName, objectId, blobPath); + add(new ExternalLink("rawLink", rawUrl)); add(new CommitHeaderPanel("commitHeader", repositoryName, commit)); @@ -95,13 +103,13 @@ // Map the extensions to types Map<String, Integer> map = new HashMap<String, Integer>(); - for (String ext : GitBlit.getStrings(Keys.web.prettyPrintExtensions)) { + for (String ext : app().settings().getStrings(Keys.web.prettyPrintExtensions)) { map.put(ext.toLowerCase(), 1); } - for (String ext : GitBlit.getStrings(Keys.web.imageExtensions)) { + for (String ext : app().settings().getStrings(Keys.web.imageExtensions)) { map.put(ext.toLowerCase(), 2); } - for (String ext : GitBlit.getStrings(Keys.web.binaryExtensions)) { + for (String ext : app().settings().getStrings(Keys.web.binaryExtensions)) { map.put(ext.toLowerCase(), 3); } @@ -114,7 +122,7 @@ case 2: // image blobs add(new Label("blobText").setVisible(false)); - add(new ExternalImage("blobImage", urlFor(RawPage.class, WicketUtils.newPathParameter(repositoryName, objectId, blobPath)).toString())); + add(new ExternalImage("blobImage", rawUrl)); break; case 3: // binary blobs @@ -124,55 +132,81 @@ default: // plain text String source = JGitUtils.getStringContent(r, commit.getTree(), blobPath, encodings); - String table = generateSourceView(source, type == 1); + String table; + if (source == null) { + table = missingBlob(blobPath, commit); + } else { + table = generateSourceView(source, extension, type == 1); + addBottomScriptInline("jQuery(prettyPrint);"); + } add(new Label("blobText", table).setEscapeModelStrings(false)); add(new Image("blobImage").setVisible(false)); + fileExtension = extension; } } else { // plain text String source = JGitUtils.getStringContent(r, commit.getTree(), blobPath, encodings); - String table = generateSourceView(source, false); + String table; + if (source == null) { + table = missingBlob(blobPath, commit); + } else { + table = generateSourceView(source, null, false); + addBottomScriptInline("jQuery(prettyPrint);"); + } add(new Label("blobText", table).setEscapeModelStrings(false)); add(new Image("blobImage").setVisible(false)); } } } - - protected String generateSourceView(String source, boolean prettyPrint) { + + protected String missingBlob(String blobPath, RevCommit commit) { + StringBuilder sb = new StringBuilder(); + sb.append("<div class=\"alert alert-error\">"); + String pattern = getString("gb.doesNotExistInTree").replace("{0}", "<b>{0}</b>").replace("{1}", "<b>{1}</b>"); + sb.append(MessageFormat.format(pattern, blobPath, commit.getTree().getId().getName())); + sb.append("</div>"); + return sb.toString(); + } + + protected String generateSourceView(String source, String extension, boolean prettyPrint) { String [] lines = source.split("\n"); - + StringBuilder sb = new StringBuilder(); sb.append("<!-- start blob table -->"); sb.append("<table width=\"100%\"><tbody><tr>"); - + // nums column sb.append("<!-- start nums column -->"); sb.append("<td id=\"nums\">"); sb.append("<pre>"); - String numPattern = "<span id=\"L{0}\" class=\"num\">{0}</span>\n"; + String numPattern = "<span id=\"L{0}\" class=\"jump\"></span><a href=\"#L{0}\">{0}</a>\n"; for (int i = 0; i < lines.length; i++) { sb.append(MessageFormat.format(numPattern, "" + (i + 1))); } sb.append("</pre>"); sb.append("<!-- end nums column -->"); sb.append("</td>"); - + sb.append("<!-- start lines column -->"); sb.append("<td id=\"lines\">"); sb.append("<div class=\"sourceview\">"); if (prettyPrint) { - sb.append("<pre class=\"prettyprint\">"); + sb.append("<pre class=\"prettyprint lang-" + extension + "\">"); } else { sb.append("<pre class=\"plainprint\">"); } - lines = StringUtils.escapeForHtml(source, true).split("\n"); - + final int tabLength = app().settings().getInteger(Keys.web.tabLength, 4); + lines = StringUtils.escapeForHtml(source, true, tabLength).split("\n"); + sb.append("<table width=\"100%\"><tbody>"); - - String linePattern = "<tr class=\"{0}\"><td><a href=\"#L{2}\">{1}</a>\r</tr>"; + + String linePattern = "<tr class=\"{0}\"><td><div><span class=\"line\">{1}</span></div>\r</tr>"; for (int i = 0; i < lines.length; i++) { String line = lines[i].replace('\r', ' '); String cssClass = (i % 2 == 0) ? "even" : "odd"; + if (StringUtils.isEmpty(line.trim())) { + line = " "; + } sb.append(MessageFormat.format(linePattern, cssClass, line, "" + (i + 1))); } sb.append("</tbody></table></pre>"); @@ -180,10 +214,10 @@ sb.append("</div>"); sb.append("</td>"); sb.append("<!-- end lines column -->"); - + sb.append("</tr></tbody></table>"); sb.append("<!-- end blob table -->"); - + return sb.toString(); } @@ -191,4 +225,14 @@ protected String getPageName() { return getString("gb.view"); } + + @Override + protected boolean isCommitPage() { + return true; + } + + @Override + protected Class<? extends BasePage> getRepoNavPageClass() { + return TreePage.class; + } } -- Gitblit v1.9.1