jquery.xontent.js 1.9 KB

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