/*
- * Sone - ParserFilter.java - Copyright © 2011–2013 David Roden
+ * Sone - ParserFilter.java - Copyright © 2011–2016 David Roden
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
import static java.lang.String.valueOf;
import static net.pterodactylus.sone.utils.NumberParsers.parseInt;
-import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Map;
+import javax.annotation.Nonnull;
+
import net.pterodactylus.sone.core.Core;
import net.pterodactylus.sone.data.Sone;
+import net.pterodactylus.sone.text.FreemailPart;
import net.pterodactylus.sone.text.FreenetLinkPart;
import net.pterodactylus.sone.text.LinkPart;
import net.pterodactylus.sone.text.Part;
import net.pterodactylus.sone.text.SonePart;
import net.pterodactylus.sone.text.SoneTextParser;
import net.pterodactylus.sone.text.SoneTextParserContext;
-import net.pterodactylus.sone.web.page.FreenetRequest;
import net.pterodactylus.util.template.Filter;
import net.pterodactylus.util.template.Template;
import net.pterodactylus.util.template.TemplateContext;
import net.pterodactylus.util.template.TemplateContextFactory;
import net.pterodactylus.util.template.TemplateParser;
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+
/**
* Filter that filters a given text through a {@link SoneTextParser}.
*
if (sone instanceof String) {
sone = core.getSone((String) sone).orNull();
}
- FreenetRequest request = (FreenetRequest) templateContext.get("request");
- SoneTextParserContext context = new SoneTextParserContext(request, (Sone) sone);
+ SoneTextParserContext context = new SoneTextParserContext((Sone) 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 (allPartsLength < cutOffLength) {
- if ((allPartsLength + longText.length()) > cutOffLength) {
- shortenedParts.add(new PlainTextPart(longText.substring(0, cutOffLength - allPartsLength) + "…"));
- } else {
- shortenedParts.add(part);
- }
- }
- allPartsLength += longText.length();
- } else if (part instanceof LinkPart) {
- if (allPartsLength < cutOffLength) {
- shortenedParts.add(part);
- }
- allPartsLength += ((LinkPart) part).getText().length();
- } else {
- if (allPartsLength < cutOffLength) {
+ Iterable<Part> parts = soneTextParser.parse(text, context);
+ if (length > -1) {
+ int allPartsLength = 0;
+ List<Part> shortenedParts = new ArrayList<Part>();
+ for (Part part : parts) {
+ if (part instanceof PlainTextPart) {
+ String longText = part.getText();
+ if (allPartsLength < cutOffLength) {
+ if ((allPartsLength + longText.length()) > cutOffLength) {
+ shortenedParts.add(new PlainTextPart(longText.substring(0, cutOffLength - allPartsLength) + "…"));
+ } else {
shortenedParts.add(part);
}
}
+ allPartsLength += longText.length();
+ } else if (part instanceof LinkPart) {
+ if (allPartsLength < cutOffLength) {
+ shortenedParts.add(part);
+ }
+ allPartsLength += part.getText().length();
+ } else {
+ if (allPartsLength < cutOffLength) {
+ shortenedParts.add(part);
+ }
}
- if (allPartsLength >= length) {
- parts = shortenedParts;
- }
}
- render(parsedTextWriter, parts);
- } catch (IOException ioe1) {
- /* no exceptions in a StringReader or StringWriter, ignore. */
+ if (allPartsLength >= length) {
+ parts = shortenedParts;
+ }
}
+ render(parsedTextWriter, parts);
return parsedTextWriter.toString();
}
render(writer, (SonePart) part);
} else if (part instanceof PostPart) {
render(writer, (PostPart) part);
+ } else if (part instanceof FreemailPart) {
+ render(writer, (FreemailPart) part);
} else if (part instanceof Iterable<?>) {
render(writer, (Iterable<Part>) part);
}
*/
private void render(Writer writer, PostPart postPart) {
SoneTextParser parser = new SoneTextParser(core, core);
- SoneTextParserContext parserContext = new SoneTextParserContext(null, postPart.getPost().getSone());
- try {
- Iterable<Part> parts = parser.parse(parserContext, new StringReader(postPart.getPost().getText()));
- StringBuilder excerpt = new StringBuilder();
- for (Part part : parts) {
- excerpt.append(part.getText());
- if (excerpt.length() > 20) {
- int lastSpace = excerpt.lastIndexOf(" ", 20);
- if (lastSpace > -1) {
- excerpt.setLength(lastSpace);
- } else {
- excerpt.setLength(20);
- }
- excerpt.append("…");
- break;
+ SoneTextParserContext parserContext = new SoneTextParserContext(postPart.getPost().getSone());
+ Iterable<Part> parts = parser.parse(postPart.getPost().getText(), parserContext);
+ StringBuilder excerpt = new StringBuilder();
+ for (Part part : parts) {
+ excerpt.append(part.getText());
+ if (excerpt.length() > 20) {
+ int lastSpace = excerpt.lastIndexOf(" ", 20);
+ if (lastSpace > -1) {
+ excerpt.setLength(lastSpace);
+ } else {
+ excerpt.setLength(20);
}
+ excerpt.append("…");
+ break;
}
- renderLink(writer, "viewPost.html?post=" + postPart.getPost().getId(), excerpt.toString(), SoneAccessor.getNiceName(postPart.getPost().getSone()), "in-sone");
- } catch (IOException ioe1) {
- /* StringReader shouldn’t throw. */
}
+ renderLink(writer, "viewPost.html?post=" + postPart.getPost().getId(), excerpt.toString(), SoneAccessor.getNiceName(postPart.getPost().getSone()), "in-sone");
+ }
+
+ private void render(@Nonnull Writer writer, @Nonnull FreemailPart freemailPart) {
+ Optional<Sone> sone = core.getSone(freemailPart.getIdentityId());
+ String soneName = sone.transform(new Function<Sone, String>() {
+ @Nonnull
+ @Override
+ public String apply(Sone input) {
+ return SoneAccessor.getNiceName(input);
+ }
+ }).or(freemailPart.getIdentityId());
+ renderLink(writer,
+ "/Freemail/NewMessage?to=" + freemailPart.getIdentityId(),
+ String.format("%s@%s.freemail", freemailPart.getEmailLocalPart(), soneName),
+ String.format("%s", soneName),
+ "in-sone");
}
/**