{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-livelyenergy/src/components/demo/lively-simulation-code.js"],"names":["Morph","_","DEFAULT_SNIPPET","HIGHLIGHT_BG_COLOR","LivelySimulationCode","initialize","initializeCodeMirror","initializeSaveDiscard","codeMirror","get","addEventListener","handleFocusOut","handleFocusIn","setCustomStyle","initializeSnippet","snippet","editView","editorLoaded","initializeEditor","preCompile","updateCellTags","save","handleSaveDiscard","discard","attachedCallback","registerCellName","detachedCallback","codeView","getCodeView","getCell","cellName","isEmpty","getSnippet","saveDiscard","clearAllMarks","handleCellRef","event","cellRef","simulation","getSimulation","toggleHighlight","preventDefault","setSnippet","execute","state","cellNames","keys","clearError","message","setError","resolve","pick","preProcessedSnippet","preProcess","Function","localState","getState","name","processedSnippet","preImportStateAsLocal","preImportSimulationAsLocal","preTransformExternalState","preExportStateAsLocal","replace","m","$1","s","split","ea","charAt","slice","join","re","match","exec","addWidget","highlight","cm","widget","markText","posFromIndex","replacedWith","error","forEach","getAllMarks","mark","clear","clearConnector","clearMarkupHighlight","matchingWidgets","updateMarkupHighlights","createConnector","undefined","widgets","map","filter","otherWidgets","reject","targetCell","find","cell","getNormalizedName","connector","initializeConnector","connectFrom","connectTo","scrollIntoView","selector","shadowRoot","querySelector","status","editor","getValue","isFocused","isChildFocused","child","doc","document","getRootNode"],"mappings":"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","file":"lively-simulation-code.js","sourcesContent":["/*MD\n  ![](https://lively-kernel.org/lively4/lively4-core/demos/lively-simulation/screenshots/code.png){width=500px}\nMD*/\n\n\"enable aexpr\";\n\nimport Morph from 'src/components/widgets/lively-morph.js';\nimport _ from 'src/external/lodash/lodash.js';\n\nconst DEFAULT_SNIPPET = '// Enter simulation code here';\nconst HIGHLIGHT_BG_COLOR = 'cornflowerblue';\n\nexport default class LivelySimulationCode extends Morph {\n    \n  // lifecycle\n  initialize() {\n    this.initializeCodeMirror();\n    this.initializeSaveDiscard();\n  }\n  \n  initializeCodeMirror() {\n    const codeMirror = this.get('#codeMirror');\n    codeMirror.addEventListener('focusout', () => this.handleFocusOut());\n    codeMirror.addEventListener('focusin', () => this.handleFocusIn());\n    codeMirror.checkSyntax = () => {};\n    codeMirror.setCustomStyle('.CodeMirror * { font-size: 0.7rem } .cm-error { color: inherit !important; }');\n  }\n  \n  initializeSnippet(snippet = DEFAULT_SNIPPET) {\n    const codeMirror = this.get('#codeMirror');\n    codeMirror.editView(snippet);\n    codeMirror.editorLoaded().then(() => this.initializeEditor());\n  }\n  \n  initializeEditor() {\n    const codeMirror = this.get('#codeMirror');\n    codeMirror.editor.setOption('lineNumbers', false);\n    codeMirror.editor.setOption('gutters', []);\n    codeMirror.editor.setOption('highlight', false);\n    codeMirror.editor.setOption('lint', false);\n    codeMirror.editor.refresh();\n    this.preCompile();\n    this.updateCellTags();\n  }\n  \n  initializeSaveDiscard() {\n    const save = this.get('#save');\n    save.addEventListener('click', () => this.handleSaveDiscard(true));\n    const discard = this.get('#discard');\n    discard.addEventListener('click', () => this.handleSaveDiscard(false));\n  }\n  \n  attachedCallback() {\n    this.registerCellName();\n  }\n  \n  detachedCallback() {\n    this.cellNameUpdater.dispose();\n  }\n  \n  registerCellName() {\n    this.cellNameUpdater = aexpr(() => {\n      const codeView = this.getCodeView();\n      return codeView.getCell().getNormalizedName();\n    }).dataflow((cellName) => {\n      if (!_.isEmpty(cellName)) this.preCompile();\n    });\n  }\n  \n  // event handler\n  handleFocusOut() {\n    if (this.checkpoint === this.getSnippet()) this.handleSaveDiscard(false);\n  }\n  \n  handleFocusIn() {\n    if (!this.isEditing) {\n      this.isEditing = true;\n      this.checkpoint = this.getSnippet();\n      const saveDiscard = this.get('#saveDiscard');\n      saveDiscard.classList.add('show');\n    }\n    this.clearAllMarks();\n  }\n  \n  handleCellRef(event, cellRef) {\n    if (this.hasFocus) return;\n    const simulation = this.getSimulation();\n    if (simulation && simulation.toggleHighlight)\n      simulation.toggleHighlight(cellRef);\n    event.preventDefault();\n  }\n  \n  handleSaveDiscard(save) {\n    const saveDiscard = this.get('#saveDiscard');\n    saveDiscard.classList.remove('show');\n    this.isEditing = false;\n    if (save) this.save();\n    else this.discard();\n    this.updateCellTags();\n  }\n  \n  // other\n  save() {\n    this.preCompile();\n  }\n  \n  discard() {\n    this.setSnippet(this.checkpoint);\n  }\n  \n  execute(state) {\n    const cellNames = _.keys(state);\n    try {\n      this.precompiled.apply(state);\n      this.clearError();\n    } catch ({ message }) {\n      this.setError(message);\n    }\n    return Promise.resolve(_.pick(state, cellNames));\n  }\n  \n  preCompile() {\n    try {\n      const snippet = this.getSnippet();\n      const preProcessedSnippet = this.preProcess(snippet);\n      this.precompiled = new Function(preProcessedSnippet);\n      this.clearError();\n    } catch ({ message }) {\n      this.setError(message);\n    }\n  }\n  \n  preProcess(snippet) {\n    const codeView = this.getCodeView();\n    if (!codeView) return;\n    const localState = codeView.getState();\n    const name = codeView.getCell().getNormalizedName();\n    let processedSnippet = snippet;\n    processedSnippet = this.preImportStateAsLocal(processedSnippet, name, localState);\n    processedSnippet = this.preImportSimulationAsLocal(processedSnippet, localState);\n    processedSnippet = this.preTransformExternalState(processedSnippet);\n    processedSnippet = this.preExportStateAsLocal(processedSnippet, name, localState);\n    return processedSnippet;\n  }\n  \n  preTransformExternalState(processedSnippet) {\n    // adapted from old simulation (#Cell -> this['cell'])\n    return processedSnippet.replace(/#([A-Za-z][A-Za-z0-9]*(?:#[A-Za-z0-9]*)*)(\\$)?(?!#)/g, \n        (m, $1) => {\n            var s = \"this\"\n            $1.split(\"#\").forEach(function(ea) { s += \"['\" + ea.charAt(0).toLowerCase() + ea.slice(1) +\"']\"})\n            return s\n        })\n  }\n  \n  preImportStateAsLocal(snippet, name, localState) {\n    if (_.isEmpty(localState)) return snippet;\n    return `let { ${name}: { ${_.join(_.keys(localState), ',')} } } = this;\\n\n            ${snippet}`;\n  }\n  \n  preImportSimulationAsLocal(snippet, localState) {\n    if (_.isEmpty(localState)) return snippet;\n    return `const { simulation: { dt, time } } = this;\\n${snippet}`;\n  }\n  \n  preExportStateAsLocal(snippet, name, localState) {\n    if (_.isEmpty(localState)) return snippet;\n    return `${snippet}\\n\n            this['${name}'] = {\n              ${ _.join(_.keys(localState), ',\\n') }\n            };`;\n  }\n  \n  updateCellTags() {\n    this.clearAllMarks();\n    const snippet = this.getSnippet();\n    const re = /#([A-Za-z][A-Za-z0-9]*(?:#[A-Za-z0-9]*)*)(\\$)?(?!#)/g;\n    let match;\n    while ((match = re.exec(snippet)) != null) {\n      this.addWidget(match);\n    }    \n    const simulation = this.getSimulation();\n    if (!simulation) return;\n    this.highlight(simulation.currentHighlight);\n  }\n  \n  addWidget(match) {\n    const cm =  this.get('#codeMirror').editor;\n    const cellRef = match[1].toLowerCase();\n    const widget = <span style='cursor: pointer; transition: background-color 0.3s ease; text-decoration: underline;'>{ match[0] }</span>;\n    widget.dataset['cellref'] = cellRef;\n    widget.addEventListener('mousedown', (event) => this.handleCellRef(event, cellRef));\n    try {\n      cm.markText(\n        cm.posFromIndex(match.index),\n        cm.posFromIndex(match.index + match[0].length), \n        { replacedWith: widget }\n      );\n    } catch (error) { /* ignore */ }\n  }\n  \n  clearAllMarks() {\n    const cm =  this.get('#codeMirror').editor;\n    _.forEach(cm.getAllMarks(), mark => mark.clear());\n  }\n  \n  highlight(cellRef) {\n    this.clearConnector();\n    if (!cellRef) {\n      this.clearMarkupHighlight();\n    } else {\n      const matchingWidgets = this.updateMarkupHighlights(cellRef);\n      if (!_.isEmpty(matchingWidgets)) this.createConnector(cellRef);\n    }\n  }\n  \n  clearConnector() {\n    if (this.connector) {\n      this.connector.remove();\n      this.connector = undefined;\n    }\n  }\n  \n  updateMarkupHighlights(cellRef) {\n    const cm =  this.get('#codeMirror').editor;\n    const widgets = _.map(cm.getAllMarks(), mark => _.get(mark, 'widgetNode.children[0]'));\n    const matchingWidgets = _.filter(widgets, widget => widget.dataset['cellref']== cellRef);\n    const otherWidgets = _.reject(widgets, widget => widget.dataset['cellref']== cellRef);\n    _.forEach(otherWidgets, widget => widget.style.backgroundColor = '');\n    _.forEach(matchingWidgets, widget => widget.style.backgroundColor = HIGHLIGHT_BG_COLOR);\n    return matchingWidgets;\n  }\n  \n  clearMarkupHighlight() {\n    const cm =  this.get('#codeMirror').editor;\n    const widgets = _.map(cm.getAllMarks(), mark => _.get(mark, 'widgetNode.children[0]'));\n    _.forEach(widgets, widget => widget.style.backgroundColor = '');\n  }\n  \n  createConnector(cellRef) {\n    this.clearConnector();\n    const targetCell = _.find(this.getSimulation().collectCells(), cell => cell.getNormalizedName().toLowerCase() === cellRef);\n    if (targetCell) {\n      Promise.resolve(<lively-connector></lively-connector>)\n        .then(connector => {\n          this.initializeConnector(connector, targetCell);\n          this.connector = connector;\n        });\n    }\n  }\n  \n  initializeConnector(connector, targetCell) {\n    this.getSimulation().appendChild(connector);\n    connector.connectFrom(this.getCodeView().getCell(), false, true);\n    connector.connectTo(targetCell, false, true);\n    connector.style.zIndex = 9999;\n    connector.style.cursor = 'pointer';\n    connector.addEventListener('click', () => targetCell.scrollIntoView());\n  }\n  \n  setSnippet(snippet) {\n    const codeMirror = this.get('#codeMirror');\n    codeMirror.editor.setValue(snippet);\n    this.preCompile(snippet);\n  }\n  \n  get(selector) {\n    const { shadowRoot } = this;\n    return shadowRoot.querySelector(selector);\n  }\n  \n  setError(error) {\n    const status = this.get('#status');\n    status.innerText = error;\n    status.classList.add('error');\n  }\n  \n  clearError() {\n    const status = this.get('#status');\n    status.innerText = '';\n    status.classList.remove('error');\n  }\n  \n  getSnippet() {\n    const editor = this.get('#codeMirror').editor;\n    return editor ? editor.getValue() : '';\n  }\n  \n  isFocused() {\n    return this.isChildFocused(this.get('#codeMirror'));\n  }\n  \n  isChildFocused(child, doc = document) {\n    if (doc.activeElement === child) return true;\n    if (doc.activeElement && doc.activeElement.shadowRoot)\n\t\t\treturn this.isChildFocused(child, doc.activeElement.shadowRoot)\n    return false;\n  }\n  \n  getCodeView() {\n    return this.getRootNode().host;\n  }\n  \n  getSimulation() {\n    const codeView = this.getCodeView();\n    if (!codeView) return;\n    const cell = codeView.getCell();\n    if (!cell) return;\n    return cell.getSimulation();  \n  }\n}"]}