livebook/assets/js/highlight/index.js
2021-07-28 19:35:36 +02:00

67 lines
1.6 KiB
JavaScript

import { getAttributeOrThrow } from "../lib/attribute";
import { highlight } from "../cell/live_editor/monaco";
import { findChildOrThrow } from "../lib/utils";
/**
* A hook used to highlight source code in the root element.
*
* Configuration:
*
* * `data-language` - language of the source code
*
* The element should have two children:
*
* * one annotated with `data-source` attribute, it should contain
* the source code to be highlighted
*
* * one annotated with `data-target` where the highlighted code
* is rendered
*/
const Highlight = {
mounted() {
this.props = getProps(this);
this.state = {
sourceElement: null,
originalElement: null,
};
this.state.sourceElement = findChildOrThrow(this.el, "[data-source]");
this.state.targetElement = findChildOrThrow(this.el, "[data-target]");
highlightInto(
this.state.targetElement,
this.state.sourceElement,
this.props.language
).then(() => {
this.el.setAttribute("data-highlighted", "true");
});
},
updated() {
this.props = getProps(this);
highlightInto(
this.state.targetElement,
this.state.sourceElement,
this.props.language
).then(() => {
this.el.setAttribute("data-highlighted", "true");
});
},
};
function getProps(hook) {
return {
language: getAttributeOrThrow(hook.el, "data-language"),
};
}
function highlightInto(targetElement, sourceElement, language) {
const code = sourceElement.innerText;
return highlight(code, language).then((html) => {
targetElement.innerHTML = html;
});
}
export default Highlight;