Allow admins to define the default CSS for formatters
At the moment the default CSS is hard-coded and projects can override
it. Now administrators can override the default CSS for all projects.
Change-Id: I04ae0f55e1f8988d050cc8eb6b5adb61c8ddc84f
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/AsciidoctorFormatter.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/AsciidoctorFormatter.java
index 367dc7c..eb3d4ae 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/AsciidoctorFormatter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/AsciidoctorFormatter.java
@@ -91,12 +91,15 @@
ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteStreams.copy(input, out);
String html = out.toString(UTF_8.name());
+ String globalCss = util.getGlobalCss("asciidoctor");
String projectCss = util.getCss(projectName, "asciidoctor");
if (projectCfg.getBoolean(KEY_APPEND_CSS, true)) {
- return util.insertCss(html, defaultCss, projectCss);
+ return util.insertCss(html,
+ MoreObjects.firstNonNull(globalCss, defaultCss), projectCss);
} else {
return util.insertCss(html,
- MoreObjects.firstNonNull(projectCss, defaultCss));
+ MoreObjects.firstNonNull(projectCss,
+ MoreObjects.firstNonNull(globalCss, defaultCss)));
}
}
} finally {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/FormatterUtil.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/FormatterUtil.java
index 6447ea9..255876e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/FormatterUtil.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/FormatterUtil.java
@@ -17,6 +17,7 @@
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.apache.commons.lang.StringEscapeUtils.escapeHtml;
+import com.google.gerrit.extensions.annotations.PluginData;
import com.google.gerrit.extensions.annotations.PluginName;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
@@ -33,17 +34,24 @@
import org.eclipse.jgit.treewalk.TreeWalk;
import org.eclipse.jgit.treewalk.filter.PathFilter;
+import java.io.File;
import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
@Singleton
public class FormatterUtil {
- private final GitRepositoryManager repoManager;
private final String pluginName;
+ private final File baseDir;
+ private final GitRepositoryManager repoManager;
@Inject
FormatterUtil(@PluginName String pluginName,
+ @PluginData File baseDir,
GitRepositoryManager repoManager) {
this.pluginName = pluginName;
+ this.baseDir = baseDir;
this.repoManager = repoManager;
}
@@ -61,6 +69,25 @@
}
/**
+ * Returns the CSS from the file
+ * "<review-site>/data/<plugin-name>/css/<name>.css".
+ *
+ * @param name the name of the CSS file without the ".css" file extension
+ * @return the CSS from the file; HTML characters are escaped;
+ * <code>null</code> if the file doesn't exist
+ * @throws IOException thrown in case of an I/O Error while reading the CSS
+ * file
+ */
+ public String getGlobalCss(String name) throws IOException {
+ Path p = Paths.get(baseDir.getAbsolutePath(), "css", name + ".css");
+ if (Files.exists(p)) {
+ byte[] css = Files.readAllBytes(p);
+ return escapeHtml(new String(css, UTF_8));
+ }
+ return null;
+ }
+
+ /**
* Inserts the given CSS into the given HTML.
*
* @param html the HTML
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/MarkdownFormatter.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/MarkdownFormatter.java
index 1863d54..4f23ad9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/MarkdownFormatter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/formatter/MarkdownFormatter.java
@@ -22,7 +22,7 @@
import com.googlesource.gerrit.plugins.xdocs.ConfigSection;
-import java.io.UnsupportedEncodingException;
+import java.io.IOException;
public class MarkdownFormatter implements Formatter {
public final static String NAME = "MARKDOWN";
@@ -40,7 +40,7 @@
@Override
public String format(String projectName, String revision,
- ConfigSection globalCfg, String raw) throws UnsupportedEncodingException {
+ ConfigSection globalCfg, String raw) throws IOException {
ConfigSection projectCfg =
formatters.getFormatterConfig(globalCfg.getSubsection(), projectName);
com.google.gerrit.server.documentation.MarkdownFormatter f =
@@ -48,18 +48,24 @@
if (!globalCfg.getBoolean(KEY_ALLOW_HTML, false)) {
f.suppressHtml();
}
+ String globalCss = util.getGlobalCss("markdown");
String projectCss = util.getCss(projectName, "markdown");
if (projectCfg.getBoolean(KEY_APPEND_CSS, true)) {
- // if f.setCss(css) is not invoked
+ // if there is no global CSS and f.setCss(null) is invoked
// com.google.gerrit.server.documentation.MarkdownFormatter applies the
// default CSS
+ f.setCss(globalCss);
byte[] b = f.markdownToDocHtml(raw, UTF_8.name());
return util.insertCss(new String(b, UTF_8), projectCss);
} else {
- // if there is no project-specific CSS and f.setCss(null) is invoked
- // com.google.gerrit.server.documentation.MarkdownFormatter applies the
- // default CSS
- f.setCss(projectCss);
+ if (projectCss != null) {
+ f.setCss(projectCss);
+ } else {
+ // if there is no global CSS and f.setCss(null) is invoked
+ // com.google.gerrit.server.documentation.MarkdownFormatter applies the
+ // default CSS
+ f.setCss(globalCss);
+ }
byte[] b = f.markdownToDocHtml(raw, UTF_8.name());
return new String(b, UTF_8);
}
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
index 3c7e004..aef00c5 100644
--- a/src/main/resources/Documentation/config.md
+++ b/src/main/resources/Documentation/config.md
@@ -240,3 +240,13 @@
*CANNOT* be overridden on project-level.
Default: `PLAIN_TEXT`
+
+<a id="globalDefaultCss">
+Global Default CSS
+------------------
+
+Gerrit administrators can override the built-in default CSS by
+providing CSS files in `<review-site>/data/@PLUGIN@/css/`:
+
+* `ASCIIDOCTOR`: `asciidoctor.css`
+* `MARKDOWN`: `markdown.css`