ResponseHighlighter enhancements - hyperlinks and dateTime/UUID whole-string selection via some javascript
This commit is contained in:
parent
f968afd7bd
commit
3afab596ab
|
@ -24,6 +24,7 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
@ -33,6 +34,7 @@ import javax.servlet.ServletRequest;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.apache.commons.lang3.StringEscapeUtils;
|
import org.apache.commons.lang3.StringEscapeUtils;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
|
|
||||||
|
@ -325,8 +327,13 @@ public class ResponseHighlighterInterceptor extends InterceptorAdapter {
|
||||||
b.append(" <head>\n");
|
b.append(" <head>\n");
|
||||||
b.append(" <meta charset=\"utf-8\" />\n");
|
b.append(" <meta charset=\"utf-8\" />\n");
|
||||||
b.append(" <style>\n");
|
b.append(" <style>\n");
|
||||||
b.append(".hlQuot {\n");
|
b.append(".hlQuot { color: #88F; }\n");
|
||||||
b.append(" color: #88F;\n");
|
b.append(".hlQuot a { text-decoration: none; color: #88F; }\n");
|
||||||
|
b.append(".hlQuot .uuid, .hlQuot .dateTime {\n");
|
||||||
|
b.append(" user-select: all;\n");
|
||||||
|
b.append(" -moz-user-select: all;\n");
|
||||||
|
b.append(" -webkit-user-select: all;\n");
|
||||||
|
b.append(" -ms-user-select: element;\n");
|
||||||
b.append("}\n");
|
b.append("}\n");
|
||||||
b.append(".hlAttr {\n");
|
b.append(".hlAttr {\n");
|
||||||
b.append(" color: #888;\n");
|
b.append(" color: #888;\n");
|
||||||
|
@ -409,7 +416,16 @@ public class ResponseHighlighterInterceptor extends InterceptorAdapter {
|
||||||
b.append("<pre>");
|
b.append("<pre>");
|
||||||
b.append(format(encoded, encoding));
|
b.append(format(encoded, encoding));
|
||||||
b.append("</pre>");
|
b.append("</pre>");
|
||||||
b.append(" </body>");
|
b.append("\n");
|
||||||
|
|
||||||
|
InputStream jsStream = ResponseHighlighterInterceptor.class.getResourceAsStream("ResponseHighlighter.js");
|
||||||
|
String jsStr = jsStream != null ? IOUtils.toString(jsStream, "UTF-8") : "console.log('ResponseHighlighterInterceptor: javascript resource not found')";
|
||||||
|
jsStr = jsStr.replace("FHIR_BASE", theRequestDetails.getServerBaseForRequest());
|
||||||
|
b.append("<script type=\"text/javascript\">");
|
||||||
|
b.append(jsStr);
|
||||||
|
b.append("</script>\n");
|
||||||
|
|
||||||
|
b.append("</body>");
|
||||||
b.append("</html>");
|
b.append("</html>");
|
||||||
//@formatter:off
|
//@formatter:off
|
||||||
String out = b.toString();
|
String out = b.toString();
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/* bail out if user is testing a version of this script via Greasemonkey or Tampermonkey */
|
||||||
|
if (window.HAPI_ResponseHighlighter_userscript) {
|
||||||
|
console.log("HAPI ResponseHighlighter: userscript detected - not executing embedded script");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* adds hyperlinks and CSS styles to dates and UUIDs (e.g. to enable user-select: all) */
|
||||||
|
const logicalReferenceRegex = /^[A-Z][A-Za-z]+\/[0-9]+$/;
|
||||||
|
const dateTimeRegex = /^-?[0-9]{4}(-(0[1-9]|1[0-2])(-(0[0-9]|[1-2][0-9]|3[0-1])(T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\.[0-9]+)?(Z|(\+|-)((0[0-9]|1[0-3]):[0-5][0-9]|14:00)))?)?)?$/; // from the spec - https://www.hl7.org/fhir/datatypes.html#datetime
|
||||||
|
const uuidRegex = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/;
|
||||||
|
|
||||||
|
const allQuotes = document.querySelectorAll(".hlQuot");
|
||||||
|
for (var i = 0; i < allQuotes.length; i++) {
|
||||||
|
const quote = allQuotes[i];
|
||||||
|
const text = quote.textContent.substr(1, quote.textContent.length - 2 /* remove quotes */);
|
||||||
|
|
||||||
|
const absHyperlink = text.startsWith("http://") || text.startsWith("https://");
|
||||||
|
const relHyperlink = text.match(logicalReferenceRegex);
|
||||||
|
const uuid = text.match(uuidRegex);
|
||||||
|
const dateTime = text.match(dateTimeRegex);
|
||||||
|
|
||||||
|
if (absHyperlink || relHyperlink) {
|
||||||
|
const link = document.createElement("a");
|
||||||
|
const href = absHyperlink ? text : "FHIR_BASE/" + text;
|
||||||
|
link.setAttribute("href", href);
|
||||||
|
link.textContent = '"' + text + '"';
|
||||||
|
quote.textContent = "";
|
||||||
|
quote.appendChild(link);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (uuid || dateTime) {
|
||||||
|
const span = document.createElement("span");
|
||||||
|
span.setAttribute("class", uuid ? "uuid" : "dateTime");
|
||||||
|
span.textContent = text;
|
||||||
|
quote.textContent = "";
|
||||||
|
quote.appendChild(document.createTextNode('"'));
|
||||||
|
quote.appendChild(span);
|
||||||
|
quote.appendChild(document.createTextNode('"'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
Loading…
Reference in New Issue