4) {
5 let html =
6 `<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Editor.js 🤩🧦🤨 example</title> <link href="https://fonts.googleapis.com/css?family=PT+Mono" rel="stylesheet"> <link href="../public/assets/demo.css" rel="stylesheet"> <script src="../public/assets/json-preview.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /></head><body> <div class="ce-example"> <div class="ce-example__header"> <a class="ce-example__header-logo" href="https://codex.so/editor">Editor.js 🤩🧦🤨</a> <div class="ce-example__header-menu"> <a href="https://github.com/editor-js" target="_blank">Plugins</a> <a href="https://editorjs.io/usage" target="_blank">Usage</a> <a href="https://editorjs.io/configuration" target="_blank">Configuration</a> <a href="https://editorjs.io/creating-a-block-tool" target="_blank">API</a> </div> </div> <div class="ce-example__content _ce-example__content--small"> <div id="editorjs"></div> <div class="ce-example__button" id="saveButton"> editor.save() </div> <div class="ce-example__statusbar"> Readonly: <b id="readonly-state"> Off </b> <div class="ce-example__statusbar-button" id="toggleReadOnlyButton"> toggle </div> </div> </div> <div class="ce-example__output"> <pre class="ce-example__output-content" id="output"></pre> <div class="ce-example__output-footer"> <a href="https://codex.so" style="font-weight: bold;">Made by CodeX</a> </div> </div> </div> <!-- Load Tools --> <!-- You can upload Tools to your project's directory and connect them by relative links. Also you can load each Tool from CDN or use NPM/Yarn packages. Read more at Tools Connection doc: https://editorjs.io/getting-started#tools-connection --> <script src="https://cdn.jsdelivr.net/npm/@editorjs/header@latest"></script><!-- Header --> <script src="https://cdn.jsdelivr.net/npm/@editorjs/simple-image@latest"></script><!-- Image --> <script src="https://cdn.jsdelivr.net/npm/@editorjs/delimiter@latest"></script><!-- Delimiter --> <script src="https://cdn.jsdelivr.net/npm/@editorjs/list@latest"></script><!-- List --> <script src="https://cdn.jsdelivr.net/npm/@editorjs/checklist@latest"></script><!-- Checklist --> <script src="https://cdn.jsdelivr.net/npm/@editorjs/quote@latest"></script><!-- Quote --> <script src="https://cdn.jsdelivr.net/npm/@editorjs/code@latest"></script><!-- Code --> <script src="https://cdn.jsdelivr.net/npm/@editorjs/embed@latest"></script><!-- Embed --> <script src="https://cdn.jsdelivr.net/npm/@editorjs/table@latest"></script><!-- Table --> <script src="https://cdn.jsdelivr.net/npm/@editorjs/link@latest"></script><!-- Link --> <script src="https://cdn.jsdelivr.net/npm/@editorjs/warning@latest"></script><!-- Warning --> <script src="https://cdn.jsdelivr.net/npm/@editorjs/marker@latest"></script><!-- Marker --> <script src="https://cdn.jsdelivr.net/npm/@editorjs/inline-code@latest"></script><!-- Inline Code --> <!-- Load Editor.js's Core --> <script src="https://cdn.jsdelivr.net/npm/@editorjs/editorjs@latest"></script><script>var editor=new EditorJS({readOnly:!1,holder:'editorjs',tools:{header:{class:Header,inlineToolbar:['marker','link'],config:{placeholder:'Header'},shortcut:'CMD+SHIFT+H'},image:SimpleImage,list:{class:List,inlineToolbar:!0,shortcut:'CMD+SHIFT+L'},checklist:{class:Checklist,inlineToolbar:!0,},quote:{class:Quote,inlineToolbar:!0,config:{quotePlaceholder:'Enter a quote',captionPlaceholder:'Quote\'s author',},shortcut:'CMD+SHIFT+O'},warning:Warning,marker:{class:Marker,shortcut:'CMD+SHIFT+M'},code:{class:CodeTool,shortcut:'CMD+SHIFT+C'},delimiter:Delimiter,inlineCode:{class:InlineCode,shortcut:'CMD+SHIFT+C'},linkTool:LinkTool,embed:Embed,table:{class:Table,inlineToolbar:!0,shortcut:'CMD+ALT+T'},},data:{},onReady:function(){saveButton.click()},onChange:function(api,event){console.log('something changed',event)}});const saveButton=document.getElementById('saveButton');const toggleReadOnlyButton=document.getElementById('toggleReadOnlyButton');const readOnlyIndicator=document.getElementById('readonly-state');saveButton.addEventListener('click',function(){editor.save().then((savedData)=>{cPreview.show(savedData,document.getElementById("output"))}).catch((error)=>{console.error('Saving error',error)})});toggleReadOnlyButton.addEventListener('click',async()=>{const readOnlyState=await editor.readOnly.toggle();readOnlyIndicator.textContent=readOnlyState?'On':'Off'})</script></body></html>`;
7 res.send(html);
8}
3export async function trpc(userHandle, valName) {
4 return await fetch(
5 `https://www.val.town/api/trpc/getValReferenceTypes?input={%22userHandle%22:%22${userHandle}%22,%22valName%22:%22${valName}%22}`,
6 ).then((data) => data.json());
7}
5 options = {},
6) => {
7 // Initialize OpenAI API stub
8 const { Configuration, OpenAIApi } = await import("https://esm.sh/openai");
9 const configuration = new Configuration({
10 apiKey: process.env.OPENAI,
11 });
12 const openai = new OpenAIApi(configuration);
13 // Request chat completion
14 const messages = typeof prompt === "string"