alvarocastro/ember-draggable-modifiers

View on GitHub
packages/test-app/app/components/ui/code/index.js

Summary

Maintainability
A
0 mins
Test Coverage
import Component from '@glimmer/component';
import { action } from '@ember/object';
import { tracked } from '@glimmer/tracking';
import { htmlSafe } from '@ember/template';
import { stripIndent } from 'common-tags';
import he from 'he';
import hljs from 'highlight.js/lib/core';
import javascript from 'highlight.js/lib/languages/typescript';
import handlebars from 'highlight.js/lib/languages/handlebars';
import bash from 'highlight.js/lib/languages/bash';

hljs.registerLanguage('js', javascript);
hljs.registerLanguage('hbs', handlebars);
hljs.registerLanguage('bash', bash);

export default class UiCodeComponent extends Component {
  @tracked highlightedCode;
  @tracked lang;
  element;

  get languageName() {
    return {
      js: 'Javascript',
      hbs: 'Handlebars',
      bash: 'Terminal',
    }[this.lang];
  }

  @action onMount(element) {
    this.element = element;
    this.highlightCode();
  }

  @action update() {
    this.highlightCode();
  }

  highlightCode() {
    const code = this.args.code ?? he.decode(this.element.innerHTML);
    let result;
    if (this.args.lang) {
      result = hljs.highlight(code, { language: this.args.lang });
    } else {
      result = hljs.highlightAuto(code);
    }
    this.lang = result.language;
    this.highlightedCode = htmlSafe(stripIndent(result.value));
  }
}