diff options
author | Shawn O. Pearce <sop@google.com> | 2009-01-27 11:35:18 -0800 |
---|---|---|
committer | Shawn O. Pearce <sop@google.com> | 2009-01-27 11:35:23 -0800 |
commit | ecd2cb62fd4cd89d5e1e9c70166c8aed47232934 (patch) | |
tree | b46a2faf491ef41be691f5547b70a2f289e90e0a | |
parent | 51e313d48f41121af3fb7169b16c06f5bb5f20f4 (diff) |
Line wrap the side by side tables at 100 columns
Excessively long lines force the file to be very hard to read in
a side-by-side presentation as it makes one (or both) columns
too wide for many common display devices, especially laptops.
Forcing our own line wrapping at some reasonable limit (e.g. 100)
ensures that even if the project's style standards permit very long
lines the page is still at least readable on a smaller monitor.
Signed-off-by: Shawn O. Pearce <sop@google.com>
3 files changed, 58 insertions, 10 deletions
diff --git a/appjar/src/main/java/com/google/gerrit/client/patches/PatchUtil.java b/appjar/src/main/java/com/google/gerrit/client/patches/PatchUtil.java index 69ea33b0ef..0f7f175a21 100644 --- a/appjar/src/main/java/com/google/gerrit/client/patches/PatchUtil.java +++ b/appjar/src/main/java/com/google/gerrit/client/patches/PatchUtil.java @@ -22,18 +22,63 @@ public class PatchUtil { public static final PatchConstants C = GWT.create(PatchConstants.class); public static final PatchMessages M = GWT.create(PatchMessages.class); public static final PatchDetailService DETAIL_SVC; + public static final int DEFAULT_LINE_LENGTH = 100; static { DETAIL_SVC = GWT.create(PatchDetailService.class); JsonUtil.bind(DETAIL_SVC, "rpc/PatchDetailService"); } - public static String lineToHTML(final String src) { - String html = DomUtil.escape(src); - html = expandTabs(html); + public static String lineToHTML(final String src, final int lineLength) { + final boolean hasTab = src.indexOf('\t') >= 0; + String brokenSrc = wrapLines(src, hasTab, lineLength); + String html = DomUtil.escape(brokenSrc); + if (brokenSrc != src) { + // If we had line breaks inserted into the source text we need + // to expand the line breaks into <br> tags in HTML, so the + // line will wrap around. + // + html = expandLFs(html); + } + if (hasTab) { + // We had at least one horizontal tab, so we should expand it out. + // + html = expandTabs(html); + } return html; } + private static String wrapLines(final String src, final boolean hasTabs, + final int lineLength) { + if (lineLength <= 0) { + // Caller didn't request for line wrapping; use it unmodified. + // + return src; + } + if (src.length() < lineLength && !hasTabs) { + // We're too short and there are no horizontal tabs, line is fine + // as-is so bypass the longer line wrapping code below. + return src; + } + + final StringBuilder r = new StringBuilder(); + int lineLen = 0; + for (int i = 0; i < src.length(); i++) { + final char c = src.charAt(i); + final int cLen = c == '\t' ? 8 : 1; + if (lineLen >= lineLength) { + r.append('\n'); + lineLen = 0; + } + r.append(c); + lineLen += cLen; + } + return r.toString(); + } + private native static String expandTabs(String src) /*-{ return src.replace(/\t/g, '<span title="Visual Tab" class="gerrit-visualtab">»</span>\t'); }-*/; + + private native static String expandLFs(String src) + /*-{ return src.replace(/\n/g, '<br>'); }-*/; } diff --git a/appjar/src/main/java/com/google/gerrit/client/patches/SideBySideTable.java b/appjar/src/main/java/com/google/gerrit/client/patches/SideBySideTable.java index 03271618b1..e818bb9ddf 100644 --- a/appjar/src/main/java/com/google/gerrit/client/patches/SideBySideTable.java +++ b/appjar/src/main/java/com/google/gerrit/client/patches/SideBySideTable.java @@ -293,7 +293,7 @@ public class SideBySideTable extends AbstractPatchContentTable { private void appendFileLine(final StringBuilder nc, final List<SideBySideLine> line) { - nc.append("<tr>"); + nc.append("<tr valign=\"top\">"); nc.append("<td class=\"" + S_ICON_CELL + "\"> </td>"); for (int fileId = 0; fileId < fileCnt; fileId++) { @@ -306,10 +306,12 @@ public class SideBySideTable extends AbstractPatchContentTable { nc.append("<td class=\"FileLine FileLine-"); nc.append(s.getType().name()); nc.append("\">"); - if (!"".equals(s.getText())) - nc.append(PatchUtil.lineToHTML(s.getText())); - else + if (!"".equals(s.getText())) { + nc.append(PatchUtil.lineToHTML(s.getText(), + PatchUtil.DEFAULT_LINE_LENGTH)); + } else { nc.append(" "); + } nc.append("</td>"); } else { nc.append("<td class=\"LineNumber\"> </td>"); diff --git a/appjar/src/main/java/com/google/gerrit/client/patches/UnifiedDiffTable.java b/appjar/src/main/java/com/google/gerrit/client/patches/UnifiedDiffTable.java index b475092a21..b2d6682c3d 100644 --- a/appjar/src/main/java/com/google/gerrit/client/patches/UnifiedDiffTable.java +++ b/appjar/src/main/java/com/google/gerrit/client/patches/UnifiedDiffTable.java @@ -109,10 +109,11 @@ public class UnifiedDiffTable extends AbstractPatchContentTable { nc.append("<td class=\"DiffText DiffText-"); nc.append(line.getType().name()); nc.append("\">"); - if (!"".equals(line.getText())) - nc.append(PatchUtil.lineToHTML(line.getText())); - else + if (!"".equals(line.getText())) { + nc.append(PatchUtil.lineToHTML(line.getText(), 0)); + } else { nc.append(" "); + } nc.append("</td>"); nc.append("</tr>"); |