const lolight = require('lolight'); const marked = require('marked'); const {keys, dom} = require('../../util'); const {win} = require('../../globals'); const allsettings = require('../../core/settings'); const preview = require('./preview'); const XHR = win.XMLHttpRequest; const settings = Object.assign({ enabled: false, styles: {} }, allsettings['preview-txt']); const tplPre = '
';
const tplDiv = '
'; let state; const updateGui = () => { const el = dom('#pv-content-txt')[0]; if (!el) { return; } const container = dom('#pv-container')[0]; el.style.height = container.offsetHeight - 16 + 'px'; preview.setLabels([ state.item.label, state.item.size + ' bytes' ]); }; const requestTextContent = href => { return new Promise((resolve, reject) => { const xhr = new XHR(); const callback = () => { if (xhr.readyState === XHR.DONE) { try { resolve(xhr.responseText || ''); } catch (err) { reject(String(err)); } } }; xhr.open('GET', href, true); xhr.onreadystatechange = callback; xhr.send(); }); }; const loadText = item => { return requestTextContent(item.absHref) .catch(err => '[request failed] ' + err) .then(content => { const style = settings.styles[item.type]; if (style === 1) { return dom(tplPre).text(content); } else if (style === 2) { return dom(tplDiv).html(marked(content)); } else if (style === 3) { const $code = dom('').text(content); win.setTimeout(() => { lolight.el($code[0]); }, content.length < 20000 ? 0 : 500); return dom(tplPre).app($code); } return dom(tplDiv).text(content); }); }; const onEnter = (items, idx) => { state = preview.state(items, idx, loadText, updateGui); }; const init = () => { if (!settings.enabled) { return; } preview.register(keys(settings.styles), onEnter); }; init();