Skip to content

Commit 11add48

Browse files
committed
LD-162 precompile results for code exmaples
1 parent f682f59 commit 11add48

5 files changed

Lines changed: 77 additions & 2 deletions

File tree

api/rendering/SyntaxHighlighter.cfc

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,53 @@ component {
3030
var highlighted = highlighter.highlight( arguments.code, arguments.language, false );
3131

3232
if ( useTryCf ) {
33-
var rawCode = '<script type="text/template" id="code-#LCase( Hash( highlighted ) )#" data-trycf="true" data-script="#( arguments.language == 'cfs' )#">'
33+
var hashId = "code-#LCase( Hash( highlighted ) )#";
34+
var rawCode = '<script type="text/template" id="#hashId#" data-trycf="true" data-script="#( arguments.language == 'cfs' )#">'
3435
& arguments.code
3536
& '</script>' & Chr(10);
36-
return rawCode & highlighted;
37+
var codeResult = getCodeResult(arguments.code, arguments.language)
38+
if ( isEmpty( codeResult ) )
39+
return rawCode & highlighted;
40+
var preview = '<div id="result-#hashId#" style="display:none;">#toBase64(codeResult)#</div>';
41+
return rawCode & highlighted & preview;
3742
}
3843

3944
return highlighted;
4045
}
4146

47+
private function getCodeResult(code, lang) output=false {
48+
var codeKey = createGUID();
49+
server["_luceeExamples_#codeKey#"] = arguments.code;
50+
51+
// alas server.system is read only
52+
//var env = duplicate(server.system.environment);
53+
//var props = duplicate(server.system.properties);
54+
//server.system.properties = {};
55+
//server.system.environment = {};
56+
57+
try {
58+
var res = _internalRequest(
59+
template: "/exampleRunner/index.cfm",
60+
form: {
61+
codeKey: codeKey,
62+
lang: arguments.lang
63+
}
64+
);
65+
} catch(e){
66+
//request.logger( e.message );
67+
//dump(arguments);
68+
//rethrow;
69+
return e.message;
70+
}
71+
72+
//server.system.environment = env;
73+
//server.system.properties = props;
74+
75+
if (!structKeyExists(res, "fileContent"))
76+
return "";
77+
return res.fileContent;
78+
}
79+
4280
// PRIVATE HELPERS
4381
private any function _getNextHighlight( required string text, required string startPos=1 ) {
4482
var referenceRegex = "```([a-z\+]+)?\n(.*?)\n```";

builders/html/assets/trycf/js/code-editor3.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ angular.module("code.editor", []).directive("codeEditor", function ($timeout) {
125125
showError: "@showError",
126126
asserts: "@asserts",
127127
code: "@code",
128+
preview: "@preview",
128129
codeGist: "@codeGist",
129130
setupCode: "@setupCode",
130131
setupCodeGist: "@setupCodeGist",
@@ -135,6 +136,7 @@ angular.module("code.editor", []).directive("codeEditor", function ($timeout) {
135136
template: editorTemplate,
136137
link: function (scope, element, attrs) {
137138
scope.code = attrs.code;
139+
scope.preview = attrs.preview;
138140
scope.codeGist = attrs.codeGist;
139141
scope.setupCode = attrs.setupCode;
140142
scope.setupCodeGist = attrs.setupCodeGist;
@@ -321,6 +323,7 @@ angular.module("code.editor", []).directive("codeEditor", function ($timeout) {
321323
aceEditor.resize(true);
322324
}
323325
editor.show();
326+
resultsDiv.html(attrs.preview);
324327
if (scope.fullscreen !== undefined && scope.fullscreen == "true") {
325328
toggleFullscreen();
326329
}

builders/html/assets/trycf/js/docscodeloader.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,13 @@
1919
code = "<cfscript>\n" + code + "\n</cfscript>";
2020
}
2121
editor.setAttribute( "code", code );
22+
23+
preview = parent.document.getElementById( "result-" + codeContainer.id );
24+
if ( preview ){
25+
editor.setAttribute( "preview", atob(preview.innerHTML) );
26+
} else {
27+
console.error("failed to load example preview");
28+
}
2229
}
2330

2431
} )();

exampleRunner/Application.cfc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
component {
2+
this.name="lucee-docs-code-result-preview-#createUniqueID()#";
3+
this.applicationtimeout="#createTimeSpan(0,0,0,5)#";
4+
}

exampleRunner/index.cfm

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<cfparam name="form.lang">
2+
<cfparam name="form.codeKey">
3+
4+
<cfscript>
5+
// only reachable via internalRequest
6+
if (len(cgi.HTTP_USER_AGENT?:"") eq 0 && structKeyExists(server, "_luceeExamples_#form.codeKey#")){
7+
src = server["_luceeExamples_#form.codeKey#"];
8+
structDelete(server, "_luceeExamples_#form.codeKey#");
9+
try {
10+
if (form.lang eq "cfs"){
11+
echo( render( "<cfscript> #src##chr(10)#</cfscript>" ) );
12+
} else {
13+
echo( render( src ) );
14+
}
15+
} catch(e){
16+
//dump(arguments);
17+
//dump(src);
18+
header statuscode="500";
19+
echo(e.message);
20+
//abort;
21+
}
22+
}
23+
</cfscript>

0 commit comments

Comments
 (0)