jquery.xontent.js 1.9 KB

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