diff options
author | Debarshi Ray <debarshir@src.gnome.org> | 2012-07-04 21:12:15 +0800 |
---|---|---|
committer | Debarshi Ray <debarshir@src.gnome.org> | 2013-01-21 23:42:23 +0800 |
commit | 4ccbecd15680fd76ac5ebf1b8da82bffc8f68ca0 (patch) | |
tree | d8fef872aa02573e1365b3980966591277ef602c /src | |
parent | fc577ecee431fdfc91617b0cd7f6df39e575b006 (diff) | |
download | gsoc2013-empathy-4ccbecd15680fd76ac5ebf1b8da82bffc8f68ca0.tar.gz gsoc2013-empathy-4ccbecd15680fd76ac5ebf1b8da82bffc8f68ca0.tar.zst gsoc2013-empathy-4ccbecd15680fd76ac5ebf1b8da82bffc8f68ca0.zip |
empathy-chat: add some JavaScript to prepend messages
Fixes: https://bugzilla.gnome.org/639877
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 26 | ||||
-rw-r--r-- | src/empathy-chat.gresource.xml | 6 | ||||
-rw-r--r-- | src/empathy-chat.js | 92 |
3 files changed, 123 insertions, 1 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index c2cb9f7a0..400b83b82 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -85,6 +85,11 @@ empathy_chat_SOURCES = \ empathy-chat.c \ $(NULL) +nodist_empathy_chat_SOURCES = \ + empathy-chat-resources.c \ + empathy-chat-resources.h \ + $(NULL) + empathy_call_SOURCES = \ empathy-call.c \ empathy-call-factory.c \ @@ -182,9 +187,28 @@ ui_DATA = \ EXTRA_DIST = \ $(autostart_DATA) \ - $(ui_DATA) + $(ui_DATA) \ + empathy-chat.js \ + empathy-chat.gresource.xml dist_man_MANS = \ empathy.1 \ empathy-accounts.1 +BUILT_SOURCES = \ + $(nodist_empathy_chat_SOURCES) \ + $(NULL) + +CLEANFILES = $(BUILT_SOURCES) + +empathy-chat-resources.c: empathy-chat.gresource.xml $(shell $(GLIB_COMPILE_RESOURCES) --generate-dependencies $(srcdir)/empathy-chat.gresource.xml) + $(AM_V_GEN)$(GLIB_COMPILE_RESOURCES) --target=$@ \ + --sourcedir=$(srcdir) \ + --generate-source \ + $< + +empathy-chat-resources.h: empathy-chat.gresource.xml $(shell $(GLIB_COMPILE_RESOURCES) --generate-dependencies $(srcdir)/empathy-chat.gresource.xml) + $(AM_V_GEN)$(GLIB_COMPILE_RESOURCES) --target=$@ \ + --sourcedir=$(srcdir) \ + --generate-header \ + $< diff --git a/src/empathy-chat.gresource.xml b/src/empathy-chat.gresource.xml new file mode 100644 index 000000000..dd5a29b2f --- /dev/null +++ b/src/empathy-chat.gresource.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<gresources> + <gresource prefix="/org/gnome/Empathy/Chat"> + <file>empathy-chat.js</file> + </gresource> +</gresources> diff --git a/src/empathy-chat.js b/src/empathy-chat.js new file mode 100644 index 000000000..236049959 --- /dev/null +++ b/src/empathy-chat.js @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2012 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Author: Debarshi Ray <debarshir@src.gnome.org> + */ + + +var chat = document.getElementById("Chat"); + + +function createHTMLNode(html) { + var range = document.createRange(); + range.selectNode(chat); + return range.createContextualFragment(html); +} + + +function getContentsNode(node) { + var post = node.getElementsByClassName("post")[0]; + return post.getElementsByClassName("post-contents")[0]; +} + + +// Remove all but the last #insert +function removeInsertNodes(node) { + var inserts = node.querySelectorAll("#insert"); + if (inserts.length < 2) + return; + + for (var i = 0; i < inserts.length - 1; i++) { + var insert = inserts[i]; + insert.parentNode.removeChild(insert); + } +} + + +// Remove all but the first #prepend +function removePrependNodes(node) { + var pres = node.querySelectorAll("#prepend"); + if (pres.length < 2) + return; + + for (var i = 1; i < pres.length; i++) { + var pre = pres[i]; + pre.parentNode.removeChild(pre); + } +} + + +function prepend(html) { + var node = createHTMLNode(html); + chat.insertBefore(node, chat.firstChild); + + // The lastChild should retain the #insert + if (chat.children.length == 1) + return; + + removeInsertNodes(chat); + removePrependNodes(chat); +} + + +function prependPrev(html) { + var pre = chat.firstChild.querySelector("#prepend"); + + // For themes that don't support #prepend + if (!pre) { + prepend(html); + return; + } + + var contents = pre.parentNode; + var node = createHTMLNode(html); + + // Skip both the #prepend and #insert + for (var i = node.childNodes.length - 2; i > 0; i--) + contents.insertBefore(node.childNodes[i], pre.nextSibling); +} |