jquery.xontent.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. (function ($) {
  2. $.fn.xontent = function () {
  3. return this.map(function (index, el) {
  4. return xontent(el).toArray();
  5. });
  6. };
  7. function xontent(el) {
  8. var $el = $(el), data, content, match;
  9. data = $el.data('xontent');
  10. if (data instanceof $) {
  11. // already set
  12. return data;
  13. }
  14. content = el.content;
  15. if (content instanceof DocumentFragment) {
  16. // template tag or something that behaves similarly
  17. $el.data('xontent', $(content));
  18. return xontent(el);
  19. }
  20. if (typeof data === "string") {
  21. // see selector, adopting xontent of external element
  22. match = data.match(/^see (.*)$/);
  23. if (match) {
  24. return $(match[1]).xontent();
  25. }
  26. // until selector, taking next siblings until sentinel
  27. // if sentinel is not present, go until end of parent
  28. match = data.match(/^until (.*)$/);
  29. if (match) {
  30. return xontentInterval(el, el.nextSibling, $el.nextAll(match[1]).get(0));
  31. }
  32. }
  33. // my contents
  34. return xontentInterval(el, el.firstChild, null);
  35. }
  36. function xontentInterval(el, child, stop) {
  37. var fragment = document.createDocumentFragment();
  38. while (child != stop) {
  39. var next = child.nextSibling;
  40. fragment.appendChild(child);
  41. child = next;
  42. }
  43. $(el).data('xontent', $(fragment));
  44. return xontent(el);
  45. }
  46. }(jQuery));