/* global showdown */
import Ember from 'ember';
import {initializeLineSelection} from '../utils/line-selection';
function escapeHtml(text) {
return text.replace(/[\"&<>]/g, function (a) {
return { '"': '"', '&': '&', '<': '<', '>': '>' }[a];
});
}
function addLineNumbers (text) {
const start = "
";
let lineNumber = 0;
const lines = text.split("\n").map((line) => {
lineNumber ++;
const lineNumberHtml = ""+lineNumber+" | ";
const lineContentHtml = ""+escapeHtml(line)+" | ";
return ""+ lineNumberHtml + lineContentHtml + "
";
}).join("");
return start + lines + end;
}
const markdownExtensions = ["markdown", "mdown", "mkdn", "mkd", "md"];
export default Ember.Component.extend({
isMarkdown : Ember.computed('path',function() {
const maybeExtension = this.get('path').split('.').pop();
return markdownExtensions.any((extension) => (maybeExtension === extension));
}),
html : Ember.computed('path','isMarkdown',function() {
if(this.get('isMarkdown')) {
return this.markdownConverter.makeHtml(this.get('text'));
} else {
return addLineNumbers(this.get('text'));
}
}),
init() {
this._super(...arguments);
this.markdownConverter = new showdown.Converter();
},
didInsertElement() {
const sourceCodeContainerElement = this.element.querySelector('.source-code-container');
initializeLineSelection(sourceCodeContainerElement,this);
this.element.parentNode.scrollTop = 0;
},
willDestroyElement : function () {
this.cleanup();
},
cleanup() {
if(this._onhashchange) {
window.removeEventListener('hashchange',this._onhashchange);
}
if(this._onkeydown) {
document.removeEventListener('keydown',this._onkeydown);
}
if(this._onkeyup) {
document.removeEventListener('keyup',this._onkeyup);
}
},
pathObserver : Ember.observer('path',function() {
Ember.run.next(this,() => {
this.cleanup();
this.didInsertElement();
});
})
});