123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- (function ($) {
- $.fn.xontent = function (op, arg) {
- if (!op) {
- return this.map(function (index, el) {
- return xontent(el).toArray();
- });
- }
- if (op === "set") {
- if (arg instanceof $) {
- arg = arg.get(0);
- }
- if (arg instanceof DocumentFragment) {
- this.data('xontent', arg);
- }
- }
- return this;
- };
- function xontent(el) {
- var $el = $(el), data, content, match;
- data = $el.data('xontent');
- if (data instanceof DocumentFragment) {
- // already set
- return $(data);
- }
- content = el.content;
- if (content instanceof DocumentFragment) {
- // template tag or something that behaves similarly
- $el.xontent('set', content);
- return xontent(el);
- }
- if (typeof data === "string") {
- // see selector, adopting xontent of external element
- match = data.match(/^see (.*)$/);
- if (match) {
- return $(match[1]).xontent();
- }
- // until selector, taking next siblings until sentinel
- // if sentinel is not present, go until end of parent
- match = data.match(/^until (.*)$/);
- if (match) {
- return xontentInterval(el, el.nextSibling, $el.nextAll(match[1]).get(0));
- }
- }
- // my contents
- return xontentInterval(el, el.firstChild, null);
- }
- function xontentInterval(el, child, stop) {
- var fragment = document.createDocumentFragment();
- while (child != stop) {
- var next = child.nextSibling;
- fragment.appendChild(child);
- child = next;
- }
- $(el).xontent('set', fragment);
- return xontent(el);
- }
- }(jQuery));
|