Skip to content

Commit 3d6f25c

Browse files
committed
LD-162 precompile results for code exmaples
1 parent ee52ad1 commit 3d6f25c

File tree

5 files changed

+77
-2
lines changed

5 files changed

+77
-2
lines changed

api/rendering/SyntaxHighlighter.cfc

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,53 @@ component {
3737
var highlighted = replaceNewLines( highlighter.highlight( arguments.code, arguments.language, "html" ) );
3838

3939
if ( useTryCf ) {
40-
var rawCode = '<script type="text/template" id="code-#LCase( Hash( highlighted ) )#" data-trycf="true" data-script="#( arguments.language == 'cfs' )#">'
40+
var hashId = "code-#LCase( Hash( highlighted ) )#";
41+
var rawCode = '<script type="text/template" id="#hashId#" data-trycf="true" data-script="#( arguments.language == 'cfs' )#">'
4142
& arguments.code
4243
& '</script>' & Chr(10);
43-
return rawCode & highlighted;
44+
var codeResult = getCodeResult(arguments.code, arguments.language)
45+
if ( isEmpty( codeResult ) )
46+
return rawCode & highlighted;
47+
var preview = '<div id="result-#hashId#" style="display:none;">#toBase64(codeResult)#</div>';
48+
return rawCode & highlighted & preview;
4449
}
4550

4651
return highlighted;
4752
}
4853

54+
private function getCodeResult(code, lang) output=false {
55+
var codeKey = createGUID();
56+
server["_luceeExamples_#codeKey#"] = arguments.code;
57+
58+
// alas server.system is read only
59+
//var env = duplicate(server.system.environment);
60+
//var props = duplicate(server.system.properties);
61+
//server.system.properties = {};
62+
//server.system.environment = {};
63+
64+
try {
65+
var res = _internalRequest(
66+
template: "/exampleRunner/index.cfm",
67+
form: {
68+
codeKey: codeKey,
69+
lang: arguments.lang
70+
}
71+
);
72+
} catch(e){
73+
//request.logger( e.message );
74+
//dump(arguments);
75+
//rethrow;
76+
return e.message;
77+
}
78+
79+
//server.system.environment = env;
80+
//server.system.properties = props;
81+
82+
if (!structKeyExists(res, "fileContent"))
83+
return "";
84+
return res.fileContent;
85+
}
86+
4987
// PRIVATE HELPERS
5088
private any function _getNextHighlight( required string text, required string startPos=1 ) {
5189
var referenceRegex = "```([a-zA-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;
@@ -329,6 +331,7 @@ angular.module("code.editor", []).directive("codeEditor", function ($timeout) {
329331
aceEditor.resize(true);
330332
}
331333
editor.show();
334+
resultsDiv.html(attrs.preview);
332335
if (scope.fullscreen !== undefined && scope.fullscreen == "true") {
333336
toggleFullscreen();
334337
}

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)