I2P Address: [http://git.idk.i2p]

Skip to content
Snippets Groups Projects
Commit a8ea239d authored by jrandom's avatar jrandom Committed by zzz
Browse files

*cough*

parent ca391097
No related branches found
No related tags found
No related merge requests found
package net.i2p.syndie.sml;
import java.io.*;
import java.text.*;
import java.util.*;
import net.i2p.I2PAppContext;
import net.i2p.client.naming.PetName;
import net.i2p.data.*;
import net.i2p.syndie.*;
import net.i2p.syndie.data.*;
import net.i2p.syndie.web.*;
import net.i2p.util.Log;
/**
*
*/
public class ThreadedHTMLRenderer extends HTMLRenderer {
private Log _log;
private String _baseURI;
public ThreadedHTMLRenderer(I2PAppContext ctx) {
super(ctx);
_log = ctx.logManager().getLog(ThreadedHTMLRenderer.class);
}
/** what, if any, post should be rendered */
public static final String PARAM_VIEW_POST = "post";
/** what, if any, thread should be rendered in its entirety */
public static final String PARAM_VIEW_THREAD = "thread";
/** what post should be visible in the nav tree */
public static final String PARAM_VISIBLE = "visible";
public static final String PARAM_ADD_TO_GROUP_LOCATION = "addLocation";
public static final String PARAM_ADD_TO_GROUP_NAME = "addGroup";
/** index into the nav tree to start displaying */
public static final String PARAM_OFFSET = "offset";
public static final String PARAM_TAGS = "tags";
public static String getFilterByTagLink(String uri, ThreadNode node, User user, String tag) {
StringBuffer buf = new StringBuffer(64);
buf.append(uri).append('?');
if (node != null) {
buf.append(PARAM_VIEW_POST).append('=');
buf.append(node.getEntry().getKeyHash().toBase64()).append('/');
buf.append(node.getEntry().getEntryId()).append('&');
}
if ( (tag != null) && (tag.trim().length() > 0) )
buf.append(PARAM_TAGS).append('=').append(tag);
return buf.toString();
}
public static String getNavLink(String uri, String viewPost, String viewThread, String tags, int offset) {
StringBuffer buf = new StringBuffer(64);
buf.append(uri);
buf.append('?');
if (!empty(viewPost))
buf.append(PARAM_VIEW_POST).append('=').append(viewPost).append('&');
else if (!empty(viewThread))
buf.append(PARAM_VIEW_THREAD).append('=').append(viewThread).append('&');
if (!empty(tags))
buf.append(PARAM_TAGS).append('=').append(tags).append('&');
buf.append(PARAM_OFFSET).append('=').append(offset).append('&');
return buf.toString();
}
public static String getViewPostLink(String uri, ThreadNode node, User user, boolean isPermalink,
String offset, String tags) {
StringBuffer buf = new StringBuffer(64);
buf.append(uri);
if (node.getChildCount() > 0) {
buf.append('?').append(PARAM_VISIBLE).append('=');
ThreadNode child = node.getChild(0);
buf.append(child.getEntry().getKeyHash().toBase64()).append('/');
buf.append(child.getEntry().getEntryId()).append('&');
} else {
buf.append('?').append(PARAM_VISIBLE).append('=');
buf.append(node.getEntry().getKeyHash().toBase64()).append('/');
buf.append(node.getEntry().getEntryId()).append('&');
}
buf.append(PARAM_VIEW_POST).append('=');
buf.append(node.getEntry().getKeyHash().toBase64()).append('/');
buf.append(node.getEntry().getEntryId()).append('&');
if ( (!isPermalink) && (!empty(offset)) )
buf.append(PARAM_OFFSET).append('=').append(offset).append('&');
if ( (!isPermalink) && (!empty(tags)) )
buf.append(PARAM_TAGS).append('=').append(tags).append('&');
return buf.toString();
}
private static final boolean empty(String val) { return (val == null) || (val.trim().length() <= 0); }
public void render(User user, Writer out, Archive archive, BlogURI post,
boolean inlineReply, ThreadIndex index, String baseURI,
String offset, String requestTags) throws IOException {
EntryContainer entry = archive.getEntry(post);
if (entry == null) return;
_entry = entry;
_baseURI = baseURI;
_user = user;
_out = out;
_archive = archive;
_cutBody = false;
_showImages = true;
_headers = new HashMap();
_bodyBuffer = new StringBuffer(1024);
_postBodyBuffer = new StringBuffer(1024);
_addresses = new ArrayList();
_links = new ArrayList();
_blogs = new ArrayList();
_archives = new ArrayList();
_parser.parse(entry.getEntry().getText(), this);
out.write("<!-- body begin -->\n");
out.write("<!-- body meta begin -->\n");
out.write("<tr class=\"postMeta\" id=\"" + post.toString() + "\">\n");
String subject = (String)_headers.get(HTMLRenderer.HEADER_SUBJECT);
if (subject == null)
subject = "";
out.write(" <td colspan=\"3\" class=\"postMetaSubject\">");
out.write(subject);
out.write("</td></tr>\n");
out.write("<tr class=\"postMeta\"><td colspan=\"3\" class=\"postMetaLink\">\n");
out.write("<a href=\"");
out.write(getMetadataURL(post.getKeyHash()));
out.write("\" title=\"View the author's profile\">");
String author = null;
PetName pn = user.getPetNameDB().getByLocation(post.getKeyHash().toBase64());
if (pn == null) {
BlogInfo info = archive.getBlogInfo(post.getKeyHash());
if (info != null)
author = info.getProperty(BlogInfo.NAME);
} else {
author = pn.getName();
}
if ( (author == null) || (author.trim().length() <= 0) )
author = post.getKeyHash().toBase64().substring(0,6);
ThreadNode node = index.getNode(post);
out.write(author);
out.write("</a> @ ");
out.write(getEntryDate(post.getEntryId()));
Collection tags = node.getTags();
if ( (tags != null) && (tags.size() > 0) ) {
out.write("\nTags: \n");
for (Iterator tagIter = tags.iterator(); tagIter.hasNext(); ) {
String tag = (String)tagIter.next();
out.write("<a href=\"");
out.write(getFilterByTagLink(baseURI, node, user, tag));
out.write("\" title=\"Filter threads to only include posts tagged as '");
out.write(tag);
out.write("'\">");
out.write(" " + tag);
out.write("</a>\n");
}
}
out.write("\n<a href=\"");
out.write(getViewPostLink(baseURI, node, user, true, offset, requestTags));
out.write("\" title=\"Select a shareable link directly to this post\">permalink</a>\n");
out.write("</td>\n</tr>\n");
out.write("<!-- body meta end -->\n");
out.write("<!-- body post begin -->\n");
out.write("<tr class=\"postData\">\n");
out.write("<td colspan=\"3\">\n");
out.write(_bodyBuffer.toString());
out.write("</td>\n</tr>\n");
out.write("<!-- body post end -->\n");
out.write("<!-- body details begin -->\n");
out.write(_postBodyBuffer.toString());
/*
"<tr class=\"postDetails\">\n" +
" <form action=\"viewattachment.jsp\" method=\"GET\">\n" +
" <td colspan=\"3\">\n" +
" External links:\n" +
" <a href=\"external.jsp?foo\" title=\"View foo.i2p\">http://foo.i2p/</a>\n" +
" <a href=\"external.jsp?bar\" title=\"View bar.i2p\">http://bar.i2p/</a>\n" +
" <br />\n" +
" Attachments: <select name=\"attachment\">\n" +
" <option value=\"0\">sampleRawSML.sml: Sample SML file with headers (4KB, type text/plain)</option>\n" +
" </select> <input type=\"submit\" name=\"action\" value=\"Download\" />\n" +
" <br /><a href=\"\" title=\"Expand the entire thread\">Full thread</a>\n" +
" <a href=\"\" title=\"Previous post in the thread\">Prev in thread</a> \n" +
" <a href=\"\" title=\"Next post in the thread\">Next in thread</a> \n" +
" </td>\n" +
" </form>\n" +
"</tr>\n" +
*/
out.write("<!-- body details end -->\n");
if (inlineReply && user.getAuthenticated() ) {
String refuseReplies = (String)_headers.get(HTMLRenderer.HEADER_REFUSE_REPLIES);
// show the reply form if we are the author or replies have not been explicitly rejected
if ( (user.getBlog().equals(post.getKeyHash())) ||
(refuseReplies == null) || (!Boolean.valueOf(refuseReplies).booleanValue()) ) {
out.write("<!-- body reply begin -->\n");
out.write("<form action=\"post.jsp\" method=\"POST\" enctype=\"multipart/form-data\">\n");
out.write("<input type=\"hidden\" name=\"inReplyTo\" value=\"");
out.write(Base64.encode(post.toString()));
out.write("\" />");
out.write("<input type=\"hidden\" name=\"entrysubject\" value=\"re: ");
out.write(HTMLRenderer.sanitizeTagParam(subject));
out.write("\" />");
out.write("<tr class=\"postReply\">\n");
out.write("<td colspan=\"3\">Reply: (<a href=\"smlref.jsp\" title=\"SML cheatsheet\">SML reference</a>)</td>\n</tr>\n");
out.write("<tr class=\"postReplyText\">\n");
out.write("<td colspan=\"3\"><textarea name=\"entrytext\" rows=\"2\" cols=\"100\"></textarea></td>\n");
out.write("</tr>\n");
out.write("<tr class=\"postReplyOptions\">\n");
out.write(" <td colspan=\"3\">\n");
out.write(" <input type=\"submit\" value=\"Preview...\" name=\"Post\" />\n");
out.write(" Tags: <input type=\"text\" size=\"10\" name=\"entrytags\" />\n");
out.write(" in a new thread? <input type=\"checkbox\" name=\"replyInNewThread\" />\n");
out.write(" allow replies? <input type=\"checkbox\" name=\"allowReplies\" checked=\"true\" />\n");
out.write(" attachment: <input type=\"file\" name=\"entryfile0\" />\n");
out.write(" </td>\n</tr>\n</form>\n");
out.write("<!-- body reply end -->\n");
}
}
out.write("<!-- body end -->\n");
}
public void receiveEnd() {
_postBodyBuffer.append("<tr class=\"postDetails\">\n");
_postBodyBuffer.append(" <form action=\"viewattachment.jsp\" method=\"GET\">\n");
_postBodyBuffer.append(" <td colspan=\"3\" valign=\"top\" align=\"left\">\n");
_postBodyBuffer.append("<input type=\"hidden\" name=\"").append(ArchiveViewerBean.PARAM_BLOG);
_postBodyBuffer.append("\" value=\"");
if (_entry != null)
_postBodyBuffer.append(Base64.encode(_entry.getURI().getKeyHash().getData()));
else
_postBodyBuffer.append("unknown");
_postBodyBuffer.append("\" />\n");
_postBodyBuffer.append("<input type=\"hidden\" name=\"").append(ArchiveViewerBean.PARAM_ENTRY);
_postBodyBuffer.append("\" value=\"");
if (_entry != null)
_postBodyBuffer.append(_entry.getURI().getEntryId());
else
_postBodyBuffer.append("unknown");
_postBodyBuffer.append("\" />\n");
//_postBodyBuffer.append("<td colspan=\"2\" valign=\"top\" align=\"left\" ").append(getClass("summDetail")).append(" >\n");
if ( (_entry != null) && (_entry.getAttachments() != null) && (_entry.getAttachments().length > 0) ) {
_postBodyBuffer.append(getSpan("summDetailAttachment")).append("Attachments:</span> ");
_postBodyBuffer.append("<select ").append(getClass("summDetailAttachmentId")).append(" name=\"").append(ArchiveViewerBean.PARAM_ATTACHMENT).append("\">\n");
for (int i = 0; i < _entry.getAttachments().length; i++) {
_postBodyBuffer.append("<option value=\"").append(i).append("\">");
Attachment a = _entry.getAttachments()[i];
_postBodyBuffer.append(sanitizeString(a.getName()));
if ( (a.getDescription() != null) && (a.getDescription().trim().length() > 0) ) {
_postBodyBuffer.append(": ");
_postBodyBuffer.append(sanitizeString(a.getDescription()));
}
_postBodyBuffer.append(" (").append(a.getDataLength()/1024).append("KB");
_postBodyBuffer.append(", type ").append(sanitizeString(a.getMimeType())).append(")</option>\n");
}
_postBodyBuffer.append("</select>\n");
_postBodyBuffer.append("<input ").append(getClass("summDetailAttachmentDl")).append(" type=\"submit\" value=\"Download\" name=\"Download\" /><br />\n");
}
if (_blogs.size() > 0) {
_postBodyBuffer.append(getSpan("summDetailBlog")).append("Blog references:</span>");
for (int i = 0; i < _blogs.size(); i++) {
Blog b = (Blog)_blogs.get(i);
_postBodyBuffer.append("<a ").append(getClass("summDetailBlogLink")).append(" href=\"");
boolean expanded = (_user != null ? _user.getShowExpanded() : false);
boolean images = (_user != null ? _user.getShowImages() : false);
_postBodyBuffer.append(getPageURL(new Hash(Base64.decode(b.hash)), b.tag, b.entryId, -1, -1, expanded, images));
_postBodyBuffer.append("\">").append(sanitizeString(b.name)).append("</a> ");
}
_postBodyBuffer.append("<br />\n");
}
if (_links.size() > 0) {
_postBodyBuffer.append(getSpan("summDetailExternal")).append("External links:</span> ");
for (int i = 0; i < _links.size(); i++) {
Link l = (Link)_links.get(i);
_postBodyBuffer.append("<a ").append(getClass("summDetailExternalLink")).append(" href=\"externallink.jsp?");
if (l.schema != null)
_postBodyBuffer.append("schema=").append(sanitizeURL(l.schema)).append('&');
if (l.location != null)
_postBodyBuffer.append("location=").append(sanitizeURL(l.location)).append('&');
_postBodyBuffer.append("\">").append(sanitizeString(l.location));
_postBodyBuffer.append(getSpan("summDetailExternalNet")).append(" (").append(sanitizeString(l.schema)).append(")</span></a> ");
}
_postBodyBuffer.append("<br />\n");
}
if (_addresses.size() > 0) {
_postBodyBuffer.append(getSpan("summDetailAddr")).append("Addresses:</span>");
for (int i = 0; i < _addresses.size(); i++) {
Address a = (Address)_addresses.get(i);
importAddress(a);
PetName pn = null;
if (_user != null)
pn = _user.getPetNameDB().getByLocation(a.location);
if (pn != null) {
_postBodyBuffer.append(' ').append(getSpan("summDetailAddrKnown"));
_postBodyBuffer.append(sanitizeString(pn.getName())).append("</span>");
} else {
_postBodyBuffer.append(" <a ").append(getClass("summDetailAddrLink")).append(" href=\"addresses.jsp?");
if (a.schema != null)
_postBodyBuffer.append("network=").append(sanitizeTagParam(a.schema)).append('&');
if (a.location != null)
_postBodyBuffer.append("location=").append(sanitizeTagParam(a.location)).append('&');
if (a.name != null)
_postBodyBuffer.append("name=").append(sanitizeTagParam(a.name)).append('&');
if (a.protocol != null)
_postBodyBuffer.append("protocol=").append(sanitizeTagParam(a.protocol)).append('&');
_postBodyBuffer.append("\">").append(sanitizeString(a.name)).append("</a>");
}
}
_postBodyBuffer.append("<br />\n");
}
if (_archives.size() > 0) {
_postBodyBuffer.append(getSpan("summDetailArchive")).append("Archives:</span>");
for (int i = 0; i < _archives.size(); i++) {
ArchiveRef a = (ArchiveRef)_archives.get(i);
_postBodyBuffer.append(" <a ").append(getClass("summDetailArchiveLink")).append(" href=\"").append(getArchiveURL(null, new SafeURL(a.locationSchema + "://" + a.location)));
_postBodyBuffer.append("\">").append(sanitizeString(a.name)).append("</a>");
if (a.description != null)
_postBodyBuffer.append(": ").append(getSpan("summDetailArchiveDesc")).append(sanitizeString(a.description)).append("</span>");
if (null == _user.getPetNameDB().getByLocation(a.location)) {
_postBodyBuffer.append(" <a ").append(getClass("summDetailArchiveBookmark")).append(" href=\"");
_postBodyBuffer.append(getBookmarkURL(a.name, a.location, a.locationSchema, "syndiearchive"));
_postBodyBuffer.append("\">bookmark it</a>");
}
}
_postBodyBuffer.append("<br />\n");
}
if (_entry != null) {
List replies = _archive.getIndex().getReplies(_entry.getURI());
if ( (replies != null) && (replies.size() > 0) ) {
_postBodyBuffer.append(getSpan("summDetailReplies")).append("Replies:</span> ");
for (int i = 0; i < replies.size(); i++) {
BlogURI reply = (BlogURI)replies.get(i);
_postBodyBuffer.append("<a ").append(getClass("summDetailReplyLink")).append(" href=\"");
_postBodyBuffer.append(getPageURL(reply.getKeyHash(), null, reply.getEntryId(), -1, -1, true, _user.getShowImages()));
_postBodyBuffer.append("\">");
_postBodyBuffer.append(getSpan("summDetailReplyAuthor"));
BlogInfo replyAuthor = _archive.getBlogInfo(reply);
if (replyAuthor != null) {
_postBodyBuffer.append(sanitizeString(replyAuthor.getProperty(BlogInfo.NAME)));
} else {
_postBodyBuffer.append(reply.getKeyHash().toBase64().substring(0,16));
}
_postBodyBuffer.append("</span> on ");
_postBodyBuffer.append(getSpan("summDetailReplyDate"));
_postBodyBuffer.append(getEntryDate(reply.getEntryId()));
_postBodyBuffer.append("</a></span> ");
}
_postBodyBuffer.append("<br />");
}
}
String inReplyTo = (String)_headers.get(HEADER_IN_REPLY_TO);
if ( (inReplyTo != null) && (inReplyTo.trim().length() > 0) ) {
BlogURI replyURI = new BlogURI(inReplyTo);
if (replyURI.getEntryId() > 0)
_postBodyBuffer.append(" <a ").append(getClass("summDetailParent")).append(" href=\"").append(getPageURL(replyURI.getKeyHash(), null, replyURI.getEntryId(), 0, 0, true, true)).append("\">(view parent)</a><br />\n");
}
_postBodyBuffer.append(" </td>\n");
_postBodyBuffer.append(" </form>\n");
_postBodyBuffer.append("</tr>\n");
}
public void receiveHeaderEnd() {
//_preBodyBuffer.append("<table ").append(getClass("overall")).append(" width=\"100%\" border=\"0\">\n");
//renderSubjectCell();
//renderMetaCell();
//renderPreBodyCell();
}
protected String getEntryURL() { return getEntryURL(_user != null ? _user.getShowImages() : false); }
protected String getEntryURL(boolean showImages) {
if (_entry == null)
return _baseURI;
else
return _baseURI + '?' + PARAM_VIEW_POST + '=' +
Base64.encode(_entry.getURI().getKeyHash().getData()) + '/'
+ _entry.getURI().getEntryId() + '&';
}
public String getPageURL(User user, String selector, int numPerPage, int pageNum) { return _baseURI; }
public String getPageURL(Hash blog, String tag, long entryId, String group, int numPerPage, int pageNum, boolean expandEntries, boolean showImages) {
StringBuffer buf = new StringBuffer(128);
buf.append(_baseURI).append('?');
if ( (blog != null) && (entryId > 0) ) {
buf.append(PARAM_VIEW_POST).append('=').append(Base64.encode(blog.getData())).append('/').append(entryId).append('&');
buf.append(PARAM_VISIBLE).append('=').append(Base64.encode(blog.getData())).append('/').append(entryId).append('&');
}
if (tag != null)
buf.append(PARAM_TAGS).append('=').append(sanitizeTagParam(tag)).append('&');
return buf.toString();
}
public String getArchiveURL(Hash blog, SafeURL archiveLocation) {
return "remote.jsp?"
//+ "action=Continue..." // should this be the case?
+ "&schema=" + sanitizeTagParam(archiveLocation.getSchema())
+ "&location=" + sanitizeTagParam(archiveLocation.getLocation());
}
public String getBookmarkURL(String name, String location, String schema, String protocol) {
return "addresses.jsp?name=" + sanitizeTagParam(name)
+ "&network=" + sanitizeTagParam(schema)
+ "&protocol=" + sanitizeTagParam(protocol)
+ "&location=" + sanitizeTagParam(location);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment