Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Gruesome hack (you need to sort out authentication and server names)</p> <p>The SSJS (getting the source from a view)</p> <pre><code>var unid = curRow.getUniversalID(); var body = getComponent("body1"); var magic = new demo.HTMLMagic(); magic.doMagic(database, unid, body); </code></pre> <p>The Java</p> <pre><code>package demo; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.List; import org.apache.http.HttpHost; import org.apache.http.HttpResponse; import org.apache.http.HttpVersion; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.scheme.PlainSocketFactory; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpParams; import org.apache.http.params.HttpProtocolParams; import net.htmlparser.jericho.Attribute; import net.htmlparser.jericho.Attributes; import net.htmlparser.jericho.HTMLElementName; import net.htmlparser.jericho.OutputDocument; import net.htmlparser.jericho.Source; import net.htmlparser.jericho.StartTag; import lotus.domino.Database; import lotus.domino.NotesException; import com.ibm.misc.BASE64Encoder; import com.ibm.xsp.component.xp.XspInputRichText; import com.ibm.xsp.http.IMimeMultipart; import com.ibm.xsp.model.domino.wrapped.DominoRichTextItem; public class HTMLMagic { private HttpClient httpClient = null; private HttpHost httpHost = null; //TODO: that needs to be resolved smarter private static final String HOSTNAME = "localhost"; public void doMagic(final Database database, final String unid, final XspInputRichText body) throws NotesException, ClientProtocolException, IOException { final String docURL = "http://" + HOSTNAME + "/__" + database.getReplicaID() + ".nsf/0/" + unid + "/Body?OpenField"; final String fixedHTML = this.fixHTML(docURL); IMimeMultipart result = DominoRichTextItem.convertToMime("-- copied text--&lt;br /&gt;" + fixedHTML); body.setValue(result); } private String fixHTML(final String rawHTMLstring) throws ClientProtocolException, IOException { HttpHost target = this.getHttpHost(); HttpClient client = this.getHttpClient(); HttpGet get = new HttpGet(rawHTMLstring); HttpResponse response = client.execute(target, get); InputStream data = response.getEntity().getContent(); Source rawHTML = new Source(data); OutputDocument outputDocument = new OutputDocument(rawHTML); StringBuilder sb = new StringBuilder(); String tagName = HTMLElementName.IMG; String attName = "src"; List&lt;StartTag&gt; links = rawHTML.getAllStartTags(tagName); for (StartTag onelink : links) { String href = onelink.getAttributeValue(attName); if (href != null) { String replace = this.urltoData(href); if (replace != null) { sb.setLength(0); sb.append("&lt;"); sb.append(tagName); sb.append(" "); sb.append(attName); sb.append("=\""); sb.append(replace); sb.append("\""); Attributes atts = onelink.getAttributes(); if (!atts.isEmpty()) { for (int i = 0; i &lt; atts.size(); i++) { Attribute att = atts.get(i); if (!att.getName().equals(attName)) { sb.append(" "); sb.append(att.getName()); sb.append("=\""); sb.append(att.getValue()); sb.append("\" "); } } } sb.append("&gt;"); outputDocument.replace(onelink, sb.toString()); } } } return outputDocument.toString(); } private HttpClient getHttpClient() { if (this.httpClient == null) { // general setup SchemeRegistry supportedSchemes = new SchemeRegistry(); // Register the "http" protocol scheme, it is required // by the default operator to look up socket factories. supportedSchemes.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); // prepare parameters HttpParams params = new BasicHttpParams(); HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(params, "UTF-8"); HttpProtocolParams.setUseExpectContinue(params, true); ClientConnectionManager connMgr = new ThreadSafeClientConnManager(params, supportedSchemes); this.httpClient = new DefaultHttpClient(connMgr, params); } return this.httpClient; } private HttpHost getHttpHost() { if (this.httpHost == null) { this.httpHost = new HttpHost(HOSTNAME, 80, "http"); } return this.httpHost; } private String urltoData(final String href) throws ClientProtocolException, IOException { StringBuilder sb = new StringBuilder(); sb.append("data:image/"); sb.append(href.substring(href.lastIndexOf("FieldElemFormat=") + 1)); sb.append(";base64,"); // Here go the Image data HttpHost target = this.getHttpHost(); HttpClient client = this.getHttpClient(); HttpGet get = new HttpGet(href); HttpResponse response = client.execute(target, get); InputStream data = response.getEntity().getContent(); BASE64Encoder encoder = new BASE64Encoder(); OutputStream output = new ByteArrayOutputStream(); encoder.encode(data, output); sb.append(output.toString()); output.close(); return sb.toString(); } } </code></pre> <p>Would be curious if that works for you. The Notes client can't show inline HTML images</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload