From 3d6f25c6b33d968e4efa94300cc5aebde9eb6483 Mon Sep 17 00:00:00 2001 From: Zac Spitzer Date: Fri, 13 Jan 2023 16:02:47 +0100 Subject: [PATCH] LD-162 precompile results for code exmaples --- api/rendering/SyntaxHighlighter.cfc | 42 ++++++++++++++++++- builders/html/assets/trycf/js/code-editor3.js | 3 ++ .../html/assets/trycf/js/docscodeloader.js | 7 ++++ exampleRunner/Application.cfc | 4 ++ exampleRunner/index.cfm | 23 ++++++++++ 5 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 exampleRunner/Application.cfc create mode 100644 exampleRunner/index.cfm diff --git a/api/rendering/SyntaxHighlighter.cfc b/api/rendering/SyntaxHighlighter.cfc index bfe77936b..1da4adc2a 100644 --- a/api/rendering/SyntaxHighlighter.cfc +++ b/api/rendering/SyntaxHighlighter.cfc @@ -37,15 +37,53 @@ component { var highlighted = replaceNewLines( highlighter.highlight( arguments.code, arguments.language, "html" ) ); if ( useTryCf ) { - var rawCode = '' & Chr(10); - return rawCode & highlighted; + var codeResult = getCodeResult(arguments.code, arguments.language) + if ( isEmpty( codeResult ) ) + return rawCode & highlighted; + var preview = ''; + return rawCode & highlighted & preview; } return highlighted; } + private function getCodeResult(code, lang) output=false { + var codeKey = createGUID(); + server["_luceeExamples_#codeKey#"] = arguments.code; + + // alas server.system is read only + //var env = duplicate(server.system.environment); + //var props = duplicate(server.system.properties); + //server.system.properties = {}; + //server.system.environment = {}; + + try { + var res = _internalRequest( + template: "/exampleRunner/index.cfm", + form: { + codeKey: codeKey, + lang: arguments.lang + } + ); + } catch(e){ + //request.logger( e.message ); + //dump(arguments); + //rethrow; + return e.message; + } + + //server.system.environment = env; + //server.system.properties = props; + + if (!structKeyExists(res, "fileContent")) + return ""; + return res.fileContent; + } + // PRIVATE HELPERS private any function _getNextHighlight( required string text, required string startPos=1 ) { var referenceRegex = "```([a-zA-Z\+]+)?\n(.*?)\n```"; diff --git a/builders/html/assets/trycf/js/code-editor3.js b/builders/html/assets/trycf/js/code-editor3.js index cbceaa3d3..c339cbbdd 100644 --- a/builders/html/assets/trycf/js/code-editor3.js +++ b/builders/html/assets/trycf/js/code-editor3.js @@ -125,6 +125,7 @@ angular.module("code.editor", []).directive("codeEditor", function ($timeout) { showError: "@showError", asserts: "@asserts", code: "@code", + preview: "@preview", codeGist: "@codeGist", setupCode: "@setupCode", setupCodeGist: "@setupCodeGist", @@ -135,6 +136,7 @@ angular.module("code.editor", []).directive("codeEditor", function ($timeout) { template: editorTemplate, link: function (scope, element, attrs) { scope.code = attrs.code; + scope.preview = attrs.preview; scope.codeGist = attrs.codeGist; scope.setupCode = attrs.setupCode; scope.setupCodeGist = attrs.setupCodeGist; @@ -329,6 +331,7 @@ angular.module("code.editor", []).directive("codeEditor", function ($timeout) { aceEditor.resize(true); } editor.show(); + resultsDiv.html(attrs.preview); if (scope.fullscreen !== undefined && scope.fullscreen == "true") { toggleFullscreen(); } diff --git a/builders/html/assets/trycf/js/docscodeloader.js b/builders/html/assets/trycf/js/docscodeloader.js index 12c24a7be..835b73138 100644 --- a/builders/html/assets/trycf/js/docscodeloader.js +++ b/builders/html/assets/trycf/js/docscodeloader.js @@ -19,6 +19,13 @@ code = "\n" + code + "\n"; } editor.setAttribute( "code", code ); + + preview = parent.document.getElementById( "result-" + codeContainer.id ); + if ( preview ){ + editor.setAttribute( "preview", atob(preview.innerHTML) ); + } else { + console.error("failed to load example preview"); + } } } )(); \ No newline at end of file diff --git a/exampleRunner/Application.cfc b/exampleRunner/Application.cfc new file mode 100644 index 000000000..3363004ff --- /dev/null +++ b/exampleRunner/Application.cfc @@ -0,0 +1,4 @@ +component { + this.name="lucee-docs-code-result-preview-#createUniqueID()#"; + this.applicationtimeout="#createTimeSpan(0,0,0,5)#"; +} \ No newline at end of file diff --git a/exampleRunner/index.cfm b/exampleRunner/index.cfm new file mode 100644 index 000000000..4d22956cd --- /dev/null +++ b/exampleRunner/index.cfm @@ -0,0 +1,23 @@ + + + + + // only reachable via internalRequest + if (len(cgi.HTTP_USER_AGENT?:"") eq 0 && structKeyExists(server, "_luceeExamples_#form.codeKey#")){ + src = server["_luceeExamples_#form.codeKey#"]; + structDelete(server, "_luceeExamples_#form.codeKey#"); + try { + if (form.lang eq "cfs"){ + echo( render( " #src##chr(10)#" ) ); + } else { + echo( render( src ) ); + } + } catch(e){ + //dump(arguments); + //dump(src); + header statuscode="500"; + echo(e.message); + //abort; + } + } +