jquery.xontent.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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, $el.nextAll(match[1]).get(0));
  31. }
  32. }
  33. // my contents
  34. return xontentInterval(el, null, null);
  35. }
  36. function xontentInterval(el, child, stop) {
  37. var fragment = document.createDocumentFragment();
  38. child = child ? child.nextSibling : el.firstChild;
  39. while (child != stop) {
  40. var next = child.nextSibling;
  41. fragment.appendChild(child);
  42. child = next;
  43. }
  44. $(el).data('xontent', $(fragment));
  45. return xontent(el);
  46. }
  47. }(jQuery));