Mercurial > eldonilo > lightstring
diff console/console.js @ 106:c06ec02217ee
many changes
author | Sonny Piers <sonny@fastmail.net> |
---|---|
date | Tue, 26 Jun 2012 12:02:14 +0200 |
parents | |
children | 5cb4733c5189 |
line wrap: on
line diff
new file mode 100755 --- /dev/null +++ b/console/console.js @@ -0,0 +1,100 @@ +'use strict'; + +var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; + +if(!Lightstring) + var Lightstring = {}; + +Lightstring.console = { + invertedScroll: true, + log: function(aLog) { + var stanza = vkbeautify.xml(aLog.data, 2, ' '); + var entry = document.createElement('div'); + entry.classList.add('entry'); + entry.classList.add(aLog.dir); + var header = document.createElement('header'); + //FIXME date? should come from the origin? + header.textContent = aLog.dir + ': '; + entry.appendChild(header) + var pre = document.createElement('pre'); + pre.textContent = stanza; + entry.appendChild(pre); + var entriesEl = document.querySelector('#entries') + entriesEl.appendChild(entry); + }, + filter: function(aFilter) { + var entries = document.querySelectorAll('.entry pre'); + for (var i = 0, length = entries.length; i < length; i++) { + var entry = entries[i]; + if (!entry.textContent.match(aFilter)) + entry.parentNode.hidden = true; + else + entry.parentNode.hidden = false; + + //FIXME use the Mutation Observer? get back to the previous scroll state? + this.scrollToBottom(); + } + }, + send: function(aData) { + Lightstring.console.source.postMessage({ + 'send': aData}, document.location.protocol + '//' + document.location.host); + }, + scrollToBottom: function() { + this.entriesEl.scrollTop = (this.entriesEl.scrollHeight - this.entriesEl.clientHeight); + } +}; + +(function() { + document.addEventListener('DOMContentLoaded', function() { + + var entriesEl = document.getElementById('entries'); + entriesEl.addEventListener('scroll', function(e) { + if (entriesEl.scrollTop === (entriesEl.scrollHeight - entriesEl.clientHeight)) + Lightstring.console.invertedScroll = true; + else + Lightstring.console.invertedScroll = false; + }) + + new MutationObserver(function(mutations) { + if(Lightstring.console.invertedScroll === true) + Lightstring.console.scrollToBottom(); + }).observe(entriesEl, { + childList: true, + // attributes: false, + // characterData: false + }); + + Lightstring.console.entriesEl = entriesEl; + if (Lightstring.console.invertedScroll) + Lightstring.console.scrollToBottom(); + + window.addEventListener("message", function(e) { + if(!Lightstring.console.source) + Lightstring.console.source = e.source; + + Lightstring.console.log(e.data); + }, false); + + document.getElementById('input').addEventListener('submit', function(e) { + e.preventDefault(); + Lightstring.console.send(this.elements['field'].value) + }); + document.getElementById('clear').addEventListener('click', function(e) { + Lightstring.console.entriesEl.innerHTML = ''; + }); + //FIXME allow xpath, xquery, E4X, whatever XML query syntax + document.getElementById('filter').addEventListener('input', function(e) { + Lightstring.console.filter(this.value); + }); + document.getElementById('input').addEventListener('keypress', function(e) { + if (e.keyCode === 13) { + if (e.shiftKey) { + e.preventDefault(); + var event = document.createEvent('Event'); + event.initEvent('submit', true, true); + this.dispatchEvent(event); + } + } + }); + }); +})(); \ No newline at end of file