//define(['jquery', 'bluebird', 'speex', 'pcmdata', 'bitstring'], factory); //$, Promise, SpeexLib, PCMDataLib /** * Usage: * var fileList = ...; // FileList object * var word = ...; // word for lookup * require(['mdict-parser', 'mdict-renderer'], function(MParser, MRenderer) { * MParser(fileList).then(function(resources) { * var mdict = MRenderer(resources), * dict_desc = resources.description.mdx; * mdict.lookup(word).then(function($content) { * // use $content to display result * }); * }); * }); */ var MRenderer = (function () { var MIME = { 'css': 'text/css', 'img': 'image', 'jpg': 'image/jpeg', 'png': 'image/png', 'spx': 'audio/x-speex', 'wav': 'audio/wav', 'mp3': 'audio/mp3', 'js' : 'text/javascript' }; function getExtension(filename, defaultExt) { return /(?:\.([^.]+))?$/.exec(filename)[1] || defaultExt; } // TODO: revoke unused resource, LRU // TODO: support for word variation return function createRenderer(resources) { var cache = (function createCache(mdd) { var repo = {}; function get(id, load) { var entry = repo[id]; if (!entry) { repo[id] = entry = new Promise(function(resolve) { var will = mdd.then(function(lookup) { console.log('lookup: ' + id); return lookup(id); }).then(load) .then(function(url) { resolve(url); }); }); } return entry; } return {get: get}; })(resources['mdd']); function loadData(mime, data) { var blob = new Blob([data], {type: mime}); return URL.createObjectURL(blob); } function loadAudio(ext, data) { if (ext === 'spx') { var blob = decodeSpeex(String.fromCharCode.apply(null, data)); return URL.createObjectURL(blob); } else { // 'spx' return loadData(MIME[ext] || 'audio', data); } } // TODO: LRU cache: remove oldest one only after rendering. function replaceImage(index, img) { var $img = $(img); var src = $img.attr('src'), m = /^file:\/\/(.*)/.exec(src); if (m) { src = m[1]; } cache.get(src, loadData.bind(null, MIME['img'])) .then(function(url) { $img.attr({src: url, src_: src}); }); } function playAudio(e, $a) { ($a || $(this)).find('audio')[0].play(); } function renderAudio() { var $a = $(this); if ($a.attr('href_')) { playAudio($a); } else { var href = $a.attr('href'), res = href.substring(8); var ext = getExtension(res, 'wav'); cache.get(res, loadAudio.bind(null, ext)) .then(function(url) { $a.append($('