jquery.xontent.js 2.1 KB

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