import { app, Component } from './apprun';
const popup_div = `
`;
const encodeHTML = code => {
return code.replace(/&/g, '&')
.replace(//g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
const code_html = code => `
AppRun Playground
${encodeHTML(code)}
`;
declare var CodeMirror;
const setup_editor = (textarea, iframe, code, hide_src) => {
if (!iframe || !code) return;
const run_code = code => {
const iframe_clone = iframe.cloneNode();
iframe.parentNode?.replaceChild(iframe_clone, iframe);
iframe = iframe_clone;
const doc = iframe.contentWindow?.document;
if (!doc) return;
doc.open();
if (code.indexOf('= 0)
doc.write(code);
else
doc.write(code_html(code));
doc.close();
}
run_code(code);
if (hide_src || !textarea || textarea.nodeName !== 'TEXTAREA') return;
if (typeof CodeMirror === 'undefined') {
textarea.onkeyup = () => run_code(textarea.value);
} else {
if (!textarea.editor) {
textarea.editor = CodeMirror.fromTextArea(textarea, {
lineNumbers: true,
mode: 'jsx'
});
textarea.editor.on('change', (cm) => run_code(cm.getValue()));
}
}
}
class Play extends Component {
view = (state) => {
const code_id = state['code-element-id'];
const element = this.element;
let code_area, code;
if (code_id) {
code_area = document.getElementById(code_id);
} else {
code_area = element.previousElementSibling ||
element.parentElement.previousElementSibling;
}
code = code_area?.innerText // from div-code
|| code_area?.value // from textarea
|| state['code']; // from code attr
this.state.code_area = code_area;
this.state.code = code;
return code ? <>
>
: AppRun Play cannot find code to run, please set code-element-id or code.
};
rendered = ({ style, hide_src, code_area, code }) => {
if (!code) return;
if (!document.getElementById('play-popup')) {
document.body.insertAdjacentHTML('beforeend', popup_div);
const textarea = document.querySelector(".apprun-play .editor") as any;
const iframe = document.querySelector('.apprun-play .preview');
textarea.value = code;
setup_editor(textarea, iframe, code, false);
}
const iframe = document.createElement('iframe');
iframe.classList.add('apprun-preview');
iframe.style.cssText = style;
this.element.before(iframe);
if (hide_src) code_area.style.display = 'none';
setup_editor(code_area, iframe, code, hide_src);
}
update = {
'show-popup': ({ code }) => {
const textarea = document.querySelector(".apprun-play .editor") as any;
textarea.editor?.setValue(code);
document.getElementById('play-popup').classList.add('show');
},
'@close-popup': () => { document.getElementById('play-popup').classList.remove('show') },
}
}
app.webComponent('apprun-play', Play);