Example #1
0
 public SimpleStylesheet(Stylesheet stylesheet, Func <object, ISelectable> asSelectable)
 {
     this.stylesheet   = stylesheet;
     this.asSelectable = asSelectable;
 }
Example #2
0
        internal static CompiledScript Compile(
            Stylesheet stylesheet,
            IDynamicInvoker dynamicInvoker,
            Func <object, ISelectable> asSelectable)
        {
            var code = new StringBuilder();

            code.AppendLine(
                @"return (function (__root__, args = {}) {

function __scriptPrivilege__(item) {
  return __svc__.GetScriptPrivilege(item);
}

function __isProxy__(item) {
  return '__isProxy__' in item && item['__isProxy__'];
}

function __wrap__(item) {
  if (__isProxy__(item)) {
    return item;
  }

  return __writable__(__svc__.AsScriptable(item));
}

__wrap__.readonly = function (item) {
  if (__isProxy__(item)) {
    return item;
  }

  return __readable__(__svc__.AsScriptable(item));
}

function __unwrap__(item) {
  if (__isProxy__(item)) {
    return item.element;
  }

  return item;
}

function __readable__(item) {
  if (__scriptPrivilege__(item) === 0) {
    return item;
  }

  return new Proxy(item, {
    has() {
      return true;
    },
    get(target, key) {
      if (typeof key !== 'string') {
        return undefined;
      }

      if (key === '__isProxy__') {
        return true;
      }

      return __readable__(target.Get(key));
    },
    set(target, key, value) { },
    deleteProperty(target, key) { }
  })
}

function __writable__(item) {
  const level = __scriptPrivilege__(item);
  if (level === 0) {
    return item;
  }

  if (typeof level === 'undefined') {
    level = __scriptPrivilege__(item);
  }

  return new Proxy(item, {
    has() { return true },
    get(target, key) {
      if (typeof key !== 'string') {
        return undefined;
      }

      if (key === '__isProxy__') {
        return true;
      }

      return __writable__(target.Get(key));
    },
    set(target, key, value) {
      if (level >= 2 && typeof key === 'string') {
        target.Set(key, value);
      }
    },
    deleteProperty(target, key) {
      if (level >= 3 && typeof key === 'string') {
        target.Delete(key);
      }
    }
  })
}

function __visit__(root, selector, callback, predicates = []) {
  __svc__.VisitScript(__unwrap__(root), selector, function (item) {
    const wrapped = __wrap__(item);
    callback.call(wrapped, wrapped);
  }, ...predicates.map(function (predicate) {
    return function (node) {
      return predicate.call(__wrap__.readonly(node));
    }
  }));
}

function __rule__(root, id) {
  __svc__.VisitRule(__unwrap__(root), id);
}

function __set__(root, key, value) {
  __svc__.Assign(__unwrap__(root), key, value);
}
");

            for (var i = 0; i < stylesheet.Declarations.Count; i++)
            {
                var id          = i.ToString();
                var declaration = stylesheet.Declarations[i];
                code.AppendLine(Serialize(id, declaration));
            }

            code.AppendLine("});");

            return(new CompiledScript(code.ToString(), new[]
            {
                new ScriptParameter("__svc__", new InjectedServices(stylesheet, dynamicInvoker, asSelectable)),
            }));
        }