From a7317acec01cde855a9f9f3d2da3dcc49d89aa86 Mon Sep 17 00:00:00 2001 From: James Moger Date: Thu, 24 Oct 2013 23:44:11 -0400 Subject: Support for intra-Markdown linking using [[WikiLinks]] syntax (issue-324) All WikiLinks must be specified relative to the root of the repository. The displayed link text is stripped to just the document name. Spaces in the document name are replaced with '-' characters; this is consistent with wiki syntax and Github. Change-Id: Id3fb1b5441352d9bacc4993a5b85882db113693b --- .../java/com/gitblit/wicket/pages/DocsPage.java | 67 ++++++++++++++++++---- 1 file changed, 56 insertions(+), 11 deletions(-) (limited to 'src/main/java/com/gitblit/wicket/pages/DocsPage.java') diff --git a/src/main/java/com/gitblit/wicket/pages/DocsPage.java b/src/main/java/com/gitblit/wicket/pages/DocsPage.java index eea9595c..58471ef9 100644 --- a/src/main/java/com/gitblit/wicket/pages/DocsPage.java +++ b/src/main/java/com/gitblit/wicket/pages/DocsPage.java @@ -15,21 +15,27 @@ */ package com.gitblit.wicket.pages; +import java.util.Arrays; import java.util.List; +import org.apache.wicket.Component; import org.apache.wicket.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.BookmarkablePageLink; +import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.data.DataView; import org.apache.wicket.markup.repeater.data.ListDataProvider; import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; import com.gitblit.GitBlit; import com.gitblit.Keys; import com.gitblit.models.PathModel; import com.gitblit.utils.ByteFormat; import com.gitblit.utils.JGitUtils; +import com.gitblit.utils.MarkdownUtils; +import com.gitblit.utils.StringUtils; import com.gitblit.wicket.CacheControl; import com.gitblit.wicket.CacheControl.LastModified; import com.gitblit.wicket.WicketUtils; @@ -42,14 +48,51 @@ public class DocsPage extends RepositoryPage { super(params); Repository r = getRepository(); + RevCommit head = JGitUtils.getCommit(r, null); List extensions = GitBlit.getStrings(Keys.web.markdownExtensions); List paths = JGitUtils.getDocuments(r, extensions); - final ByteFormat byteFormat = new ByteFormat(); + String doc = null; + String markdown = null; + String html = null; + + List roots = Arrays.asList("home"); - add(new Label("header", getString("gb.docs"))); + // try to find a custom index/root page + for (PathModel path : paths) { + String name = path.name.toLowerCase(); + if (name.indexOf('.') > -1) { + name = name.substring(0, name.lastIndexOf('.')); + } + if (roots.contains(name)) { + doc = path.name; + break; + } + } - // documents list + if (!StringUtils.isEmpty(doc)) { + // load the document + String [] encodings = GitBlit.getEncodings(); + markdown = JGitUtils.getStringContent(r, head.getTree(), doc, encodings); + html = MarkdownUtils.transformMarkdown(markdown, getLinkRenderer()); + } + + Fragment fragment = null; + if (StringUtils.isEmpty(html)) { + // no custom index/root, use the standard document list + fragment = new Fragment("docs", "noIndexFragment", this); + fragment.add(new Label("header", getString("gb.docs"))); + } else { + // custom index/root, use tabbed ui of index/root and document list + fragment = new Fragment("docs", "indexFragment", this); + Component content = new Label("index", html).setEscapeModelStrings(false); + fragment.add(content); + } + + // document list + final String id = getBestCommitId(head); + final ByteFormat byteFormat = new ByteFormat(); + Fragment docs = new Fragment("documents", "documentsFragment", this); ListDataProvider pathsDp = new ListDataProvider(paths); DataView pathsView = new DataView("document", pathsDp) { private static final long serialVersionUID = 1L; @@ -60,23 +103,25 @@ public class DocsPage extends RepositoryPage { PathModel entry = item.getModelObject(); item.add(WicketUtils.newImage("docIcon", "file_world_16x16.png")); item.add(new Label("docSize", byteFormat.format(entry.size))); - item.add(new LinkPanel("docName", "list", entry.name, BlobPage.class, WicketUtils - .newPathParameter(repositoryName, entry.commitId, entry.path))); + item.add(new LinkPanel("docName", "list", entry.name, MarkdownPage.class, WicketUtils + .newPathParameter(repositoryName, id, entry.path))); // links - item.add(new BookmarkablePageLink("view", BlobPage.class, WicketUtils - .newPathParameter(repositoryName, entry.commitId, entry.path))); + item.add(new BookmarkablePageLink("view", MarkdownPage.class, WicketUtils + .newPathParameter(repositoryName, id, entry.path))); item.add(new BookmarkablePageLink("raw", RawPage.class, WicketUtils - .newPathParameter(repositoryName, entry.commitId, entry.path))); + .newPathParameter(repositoryName, id, entry.path))); item.add(new BookmarkablePageLink("blame", BlamePage.class, WicketUtils - .newPathParameter(repositoryName, entry.commitId, entry.path))); + .newPathParameter(repositoryName, id, entry.path))); item.add(new BookmarkablePageLink("history", HistoryPage.class, WicketUtils - .newPathParameter(repositoryName, entry.commitId, entry.path))); + .newPathParameter(repositoryName, id, entry.path))); WicketUtils.setAlternatingBackground(item, counter); counter++; } }; - add(pathsView); + docs.add(pathsView); + fragment.add(docs); + add(fragment); } @Override -- cgit v1.2.3