import net.pterodactylus.sone.text.SonePart;
import net.pterodactylus.sone.text.SoneTextParser;
import net.pterodactylus.sone.text.SoneTextParserContext;
-import net.pterodactylus.sone.web.page.Page.Request;
+import net.pterodactylus.sone.web.page.FreenetRequest;
+import net.pterodactylus.util.number.Numbers;
import net.pterodactylus.util.template.Filter;
import net.pterodactylus.util.template.Template;
import net.pterodactylus.util.template.TemplateContext;
@Override
public Object format(TemplateContext templateContext, Object data, Map<String, String> parameters) {
String text = String.valueOf(data);
- int length = -1;
- try {
- length = Integer.parseInt(parameters.get("length"));
- } catch (NumberFormatException nfe1) {
- /* ignore. */
- }
- if ((length == -1) && (parameters.get("length") != null)) {
- try {
- length = Integer.parseInt(String.valueOf(templateContext.get(parameters.get("length"))));
- } catch (NumberFormatException nfe1) {
- /* ignore. */
- }
- }
+ int length = Numbers.safeParseInteger(parameters.get("length"), Numbers.safeParseInteger(templateContext.get(parameters.get("length")), -1));
+ int cutOffLength = Numbers.safeParseInteger(parameters.get("cut-off-length"), Numbers.safeParseInteger(templateContext.get(parameters.get("cut-off-length")), length));
String soneKey = parameters.get("sone");
if (soneKey == null) {
soneKey = "sone";
if (sone == null) {
sone = core.getSone(soneKey, false);
}
- Request request = (Request) templateContext.get("request");
+ FreenetRequest request = (FreenetRequest) templateContext.get("request");
SoneTextParserContext context = new SoneTextParserContext(request, sone);
StringWriter parsedTextWriter = new StringWriter();
try {
Iterable<Part> parts = soneTextParser.parse(context, new StringReader(text));
if (length > -1) {
+ int allPartsLength = 0;
List<Part> shortenedParts = new ArrayList<Part>();
for (Part part : parts) {
if (part instanceof PlainTextPart) {
String longText = ((PlainTextPart) part).getText();
- if (length >= longText.length()) {
- shortenedParts.add(part);
- } else {
- shortenedParts.add(new PlainTextPart(longText.substring(0, length) + "…"));
+ if (allPartsLength < cutOffLength) {
+ if ((allPartsLength + longText.length()) > cutOffLength) {
+ shortenedParts.add(new PlainTextPart(longText.substring(0, cutOffLength - allPartsLength) + "…"));
+ } else {
+ shortenedParts.add(part);
+ }
}
- length -= longText.length();
+ allPartsLength += longText.length();
} else if (part instanceof LinkPart) {
- shortenedParts.add(part);
- length -= ((LinkPart) part).getText().length();
+ if (allPartsLength < cutOffLength) {
+ shortenedParts.add(part);
+ }
+ allPartsLength += ((LinkPart) part).getText().length();
} else {
- shortenedParts.add(part);
- }
- if (length <= 0) {
- break;
+ if (allPartsLength < cutOffLength) {
+ shortenedParts.add(part);
+ }
}
}
- parts = shortenedParts;
+ if (allPartsLength >= length) {
+ parts = shortenedParts;
+ }
}
render(parsedTextWriter, parts);
} catch (IOException ioe1) {
* The part to render
*/
private void render(Writer writer, SonePart sonePart) {
- renderLink(writer, "viewSone.html?sone=" + sonePart.getSone().getId(), SoneAccessor.getNiceName(sonePart.getSone()), SoneAccessor.getNiceName(sonePart.getSone()), "in-sone");
+ if ((sonePart.getSone() != null) && (sonePart.getSone().getName() != null)) {
+ renderLink(writer, "viewSone.html?sone=" + sonePart.getSone().getId(), SoneAccessor.getNiceName(sonePart.getSone()), SoneAccessor.getNiceName(sonePart.getSone()), "in-sone");
+ } else {
+ renderLink(writer, "/WebOfTrust/ShowIdentity?id=" + sonePart.getSone().getId(), sonePart.getSone().getId(), sonePart.getSone().getId(), "in-sone");
+ }
}
/**