Process plain text TABs, refactoring

pull/168/head
M66B 6 years ago
parent ac9634553f
commit 86afc8a978

@ -71,6 +71,7 @@ public class HtmlHelper {
private static final int PREVIEW_SIZE = 500; // characters private static final int PREVIEW_SIZE = 500; // characters
private static final float MIN_LUMINANCE = 0.5f; private static final float MIN_LUMINANCE = 0.5f;
private static final int TAB_SIZE = 2;
private static final int MAX_AUTO_LINK = 250; private static final int MAX_AUTO_LINK = 250;
private static final int TRACKING_PIXEL_SURFACE = 25; // pixels private static final int TRACKING_PIXEL_SURFACE = 25; // pixels
@ -266,31 +267,68 @@ public class HtmlHelper {
// Pre formatted text // Pre formatted text
for (Element pre : document.select("pre")) { for (Element pre : document.select("pre")) {
Element div = document.createElement("font"); int level = 0;
div.attr("face", "monospace"); StringBuilder sb = new StringBuilder();
String[] lines = pre.wholeText().split("\\r?\\n"); String[] lines = pre.wholeText().split("\\r?\\n");
for (String line : lines) { for (String line : lines) {
// Opening quotes
int tlevel = 0;
while (line.startsWith(">")) {
tlevel++;
if (tlevel > level)
sb.append("<blockquote>");
line = line.substring(1); // >
if (line.startsWith(" "))
line = line.substring(1);
}
// Closing quotes
for (int i = 0; i < level - tlevel; i++)
sb.append("</blockquote>");
level = tlevel;
// Tabs characters
StringBuilder l = new StringBuilder();
for (int j = 0; j < line.length(); j++) {
char kar = line.charAt(j);
if (kar == '\t') {
l.append(' ');
while (l.length() % TAB_SIZE != 0)
l.append(' ');
} else
l.append(kar);
}
line = l.toString();
// Html characters
line = Html.escapeHtml(line); line = Html.escapeHtml(line);
StringBuilder sb = new StringBuilder(); // Space characters
int len = line.length(); int len = line.length();
for (int j = 0; j < len; j++) { for (int j = 0; j < len; j++) {
char kar = line.charAt(j); char kar = line.charAt(j);
if (kar == ' ' && if (kar == ' ') {
j + 1 < len && line.charAt(j + 1) == ' ') // Prevent trimming start
// Keep one space for word wrapping
if (j == 0 || (j + 1 < len && line.charAt(j + 1) == ' '))
sb.append("&nbsp;"); sb.append("&nbsp;");
else else
sb.append(' ');
} else
sb.append(kar); sb.append(kar);
} }
Element span = document.createElement("span"); sb.append("<br>");
span.html(sb.toString());
div.appendChild(span);
div.appendElement("br");
} }
pre.replaceWith(div); // Closing quotes
for (int i = 0; i < level; i++)
sb.append("</blockquote>");
pre.tagName("tt"); // monospace
pre.html(sb.toString());
} }
// Code // Code

@ -23,7 +23,6 @@ import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.net.MailTo; import android.net.MailTo;
import android.net.Uri; import android.net.Uri;
import android.text.Html;
import android.text.TextUtils; import android.text.TextUtils;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
@ -1041,60 +1040,8 @@ public class MessageHelper {
warnings.add(Helper.formatThrowable(ex, false)); warnings.add(Helper.formatThrowable(ex, false));
} }
// Prevent Jsoup throwing an exception if (part == plain)
if (part == plain) { result = "<pre>" + result + "</pre>";
StringBuilder sb = new StringBuilder();
sb.append("<span>");
int level = 0;
String[] lines = result.split("\\r?\\n");
for (String line : lines) {
// Opening quotes
int tlevel = 0;
while (line.startsWith(">")) {
tlevel++;
if (tlevel > level)
sb.append("<blockquote>");
line = line.substring(1); // >
if (line.startsWith(" "))
line = line.substring(1);
}
// Closing quotes
for (int i = 0; i < level - tlevel; i++)
sb.append("</blockquote>");
level = tlevel;
// Show as-is
line = Html.escapeHtml(line);
// Non breaking spaces
boolean start = true;
int len = line.length();
for (int j = 0; j < len; j++) {
char kar = line.charAt(j);
if (kar == ' ' &&
(start || j + 1 < len && line.charAt(j + 1) == ' '))
sb.append("&nbsp;");
else {
start = false;
sb.append(kar);
}
}
sb.append("<br>");
}
// Closing quotes
for (int i = 0; i < level; i++)
sb.append("</blockquote>");
sb.append("</span>");
result = sb.toString();
}
return result; return result;
} }

Loading…
Cancel
Save