var m = require('mithril'); // https://github.com/markdown-it/markdown-it var markdown = require('markdown-it')() .use(require('markdown-it-footnote')); var _dbs = require('./dbs'); var _Header = require('./header'); var _Footer = require('./footer'); var _Ui = require('./ui.js'); // __ _ __ // / / (_)___ / /__ // / / / / __ \/ //_/ // / /___/ / / / / ,< // /_____/_/_/ /_/_/|_| var _Link = { tid:"", opened:false, oninit: function(vn){ // console.log("INIT LINK : vn", vn); // define target id this.tid = vn.attrs.href; }, onbeforeupdate: function(vn){ this.tid = vn.attrs.href; }, view: function(vn){ this.tid_known = typeof _dbs.data_byid[_dbs.lang][this.tid] === 'undefined' ? false : true; if (!this.tid_known) { console.log('!! target id '+this.tid+' unkonwn !!'); } if(this.opened && this.tid_known){ // console.log('this.tid', vn.state); return m('div', {'class':'opened-link'}, [ m('span', {'class':"link text"}, vn.children), typeof _dbs.data_byid[_dbs.lang][this.tid].childs != "undefined" ? m(_Enonce, _dbs.data_byid[_dbs.lang][this.tid]) : m(_Item, _dbs.data_byid[_dbs.lang][this.tid]) ] ); }else{ // console.log(vn); return m('a', { 'class':'link', 'href':'#'+this.tid, 'rel':this.tid, onclick:function(e){ e.preventDefault(); console.log('click', this); vn.state.opened = true; return false; } }, vn.children); // c'est quoi ce vn.children ? } } } // ______ __ // /_ __/__ _ __/ /_ // / / / _ \| |/_/ __/ // / / / __/> 1){ // if node has no localName it is probably a #text node // we record it if it's not empty n.tag='#text'; n.text=nodes[i].textContent; } // add the node to the list if it has a tag if(typeof n.tag != "undefined") list.push(n); } return list; } // recusive fucntion to generate mithril object from information recorded with parseTextDom() function populateTextDom(n,i){ // console.log('populateTextDom : '+i,n); return n.tag == "#text" ? m.trust(n.text) : m( n.tag != 'a' ? n.tag : _Link, typeof n.attrs != "undefined" ? n.attrs : {}, typeof n.childs != "undefined" ? n.childs.map(populateTextDom) : typeof n.text != "undefined" ? m.trust(n.text) : null ); } var _Text = { id:null, text:"", texthtml:"", textdom:null, textchilds:[], parsetext: function(){ // console.log('parsetext', this); // !! we need to convert markdown to html here because parseTextDom() is recursive through nodes tree // convert markdown to html this.texthtml = markdown.render(this.text) // TODO: fixe number link text disapear [3](1d3) ( in 104d ) // TODO: fixe parenthèse disparait _(par les Défin. [test 3](1d3) et [test 5](1d5))_ ( in 104d ) // parse html string to virtual dom this.textdom = new DOMParser().parseFromString(this.texthtml, "text/html"); // get the text nodes (avoid html document extra) this.textchilds = parseTextDom(this.textdom.getElementsByTagName('body')[0].childNodes); }, oninit: function(vn){ this.id = vn.attrs.id; this.text = vn.attrs.text || ""; this.parsetext(); }, onbeforeupdate: function(vn,old){ this.text = vn.attrs.text; this.parsetext(); }, view: function(vn){ // console.log('_Text :: view : '+vn.attrs.slug, vn); return m('div', {'class':'text'}, // loop through childNodes list generated by parseTextDom() in init this.textchilds.map(populateTextDom) ); // /m.div.text } // view: } // ______ // / _/ /____ ____ ___ // / // __/ _ \/ __ `__ \ // _/ // /_/ __/ / / / / / // /___/\__/\___/_/ /_/ /_/ var _Item = { id:null, part:null, type:null, nested:false, oninit: function(vn){ // console.log('vn.attrs', vn.attrs); this.id = vn.attrs.id; this.type = vn.attrs.type; // vn.state.part = vn.state.slug.match(/^(\d)(.+)/)[1]; this.text = vn.attrs.text; this.nested = vn.attrs.nested || false; }, onbeforeupdate: function(vn, old){ this.nested = vn.attrs.nested || false; this.type = vn.attrs.type; this.text = vn.attrs.text; }, view: function(vn){ return m("section", { 'id':this.id, 'class':'item'+(this.nested ? ' nested':'') }, [ // create title node m("h3", { // 'ref':vn.attrs.href, onclick: function(e){ vn.state.active = vn.state.active ? 0 : 1; } }, this.type), // create text node m(_Text, {'text':this.text, 'id':this.id}) ] ) } }; // ______ // / ____/___ ____ ____ ________ // / __/ / __ \/ __ \/ __ \/ ___/ _ \ // / /___/ / / / /_/ / / / / /__/ __/ // /_____/_/ /_/\____/_/ /_/\___/\___/ var _Enonce = { partid:null, id:null, title:null, text:null, nested:false, childs:[], oninit:function(vn){ // // console.log('Enonce on init', vn); this.partid = vn.attrs.partid; this.id = vn.attrs.id; this.title = vn.attrs.title; this.text = vn.attrs.text; this.childs = vn.attrs.childs || []; this.nested = vn.attrs.nested || false; }, onbeforeupdate:function(vn, old) { // console.log(vn.attrs.childs); this.title = vn.attrs.title; this.text = vn.attrs.text; this.childs = vn.attrs.childs; this.nested = vn.attrs.nested || false; // if(vn.attrs.id == '1d1') console.log('_Enonce UPDATE, text :', vn.attrs.text); }, view: function(vn){ // if(vn.attrs.id == '1d1') console.log('_Enonce VIEW, text :', vn.attrs.text); return m("section", { 'id' :this.id, 'class' :'enonce'+(this.nested ? ' nested':'') }, [ // create title node m("h2", {}, this.title), // create text node m(_Text, {'text':this.text, 'id':this.id}), // addd children this.childs.map(function(c){ return m(_Item, c) }) ]) } } // ____ __ // / __ \____ ______/ /_ // / /_/ / __ `/ ___/ __/ // / ____/ /_/ / / / /_ // /_/ \__,_/_/ \__/ var _Part = { oninit: function(vn){ this.id = vn.attrs.id; this.title = vn.attrs.title || ''; this.enonces = vn.attrs.enonces; }, onbeforeupdate: function(vn, old){ // console.log('_Part, onbeforeupdate old',old); this.title = vn.attrs.title || ''; this.enonces = vn.attrs.enonces; }, view: function(vn){ // console.log(vn.attrs.enonces); return m("section", { 'id' :this.id, 'class' :'part' }, [ // create title node m("h1", {'class':'part-title', 'part':this.id}, m.trust(markdown.renderInline(this.title))), // create text node this.enonces.map(function(e){ // console.log(e.type); // var title = e.title || ''; switch (e.type) { case "title": // handle titles // console.log('title'); return m("h2", {'class':'title'}, m.trust(markdown.renderInline(e.title))); break; case "filet": // handle filets // console.log('filet'); return m("h4", {'class':'filet'}, m.trust(markdown.renderInline(e.title))); break; default: // or build structure return m(_Enonce, Object.assign({"partid":this.id},e)); } }) ] ) } } // ____ __ _ // / _/___ / / (_)___ ___ // / // __ \/ / / / __ \/ _ \ // _/ // / / / /___/ / / / / __/ // /___/_/ /_/_____/_/_/ /_/\___/ module.exports = { // oninit : function(vn){ // this.lang = vn.attrs.lang; // }, oncreate: function(vn){ document.body.classList.add('inline'); _Ui.init(); }, view: function(vn){ console.log('_Inline view', vn.attrs.lang); return [ m(_Header), m('main', {id:"content", 'class':'inline'}, _dbs.data[vn.attrs.lang].map(function(p){ // console.log("MAP _dbs", p); return m(_Part,p); }) ), m(_Footer) ] } }