示例#1
0
 static parseEventName(eventName) {
     var parts = eventName.toLowerCase().split('.');
     var domEventName = parts.shift();
     if ((parts.length === 0) ||
         !(StringWrapper.equals(domEventName, 'keydown') ||
             StringWrapper.equals(domEventName, 'keyup'))) {
         return null;
     }
     var key = KeyEventsPlugin._normalizeKey(parts.pop());
     var fullKey = '';
     modifierKeys.forEach(modifierName => {
         if (ListWrapper.contains(parts, modifierName)) {
             ListWrapper.remove(parts, modifierName);
             fullKey += modifierName + '.';
         }
     });
     fullKey += key;
     if (parts.length != 0 || key.length === 0) {
         // returning null instead of throwing to let another plugin process the event
         return null;
     }
     var result = StringMapWrapper.create();
     StringMapWrapper.set(result, 'domEventName', domEventName);
     StringMapWrapper.set(result, 'fullKey', fullKey);
     return result;
 }
 _makeScopeMatcher(scopeSelector) {
     var lre = /\[/g;
     var rre = /\]/g;
     scopeSelector = StringWrapper.replaceAll(scopeSelector, lre, '\\[');
     scopeSelector = StringWrapper.replaceAll(scopeSelector, rre, '\\]');
     return RegExpWrapper.create('^(' + scopeSelector + ')' + _selectorReSuffix, 'm');
 }
 ReplacePipe.prototype.transform = function (value, args) {
     if (lang_1.isBlank(args) || args.length !== 2) {
         throw new exceptions_1.BaseException('ReplacePipe requires two arguments');
     }
     if (lang_1.isBlank(value)) {
         return value;
     }
     if (!this._supportedInput(value)) {
         throw new invalid_pipe_argument_exception_1.InvalidPipeArgumentException(ReplacePipe, value);
     }
     var input = value.toString();
     var pattern = args[0];
     var replacement = args[1];
     if (!this._supportedPattern(pattern)) {
         throw new invalid_pipe_argument_exception_1.InvalidPipeArgumentException(ReplacePipe, pattern);
     }
     if (!this._supportedReplacement(replacement)) {
         throw new invalid_pipe_argument_exception_1.InvalidPipeArgumentException(ReplacePipe, replacement);
     }
     // template fails with literal RegExp e.g /pattern/igm
     // var rgx = pattern instanceof RegExp ? pattern : RegExpWrapper.create(pattern);
     if (lang_1.isFunction(replacement)) {
         var rgxPattern = lang_1.isString(pattern) ? lang_1.RegExpWrapper.create(pattern) : pattern;
         return lang_1.StringWrapper.replaceAllMapped(input, rgxPattern, replacement);
     }
     if (pattern instanceof RegExp) {
         // use the replaceAll variant
         return lang_1.StringWrapper.replaceAll(input, pattern, replacement);
     }
     return lang_1.StringWrapper.replace(input, pattern, replacement);
 };
示例#4
0
  convertColonHost(css: string):string {
    css = StringWrapper.replaceAll(css, _HOST_RE, _HOST_TOKEN);

    var partReplacer = function(host, part, suffix) {
      part = StringWrapper.replaceAll(part, _HOST_TOKEN_RE, '');
      return `${host}${part}${suffix}`;
    }

    return StringWrapper.replaceAllMapped(css, _COLON_HOST_RE, function(m) {
      var base = _HOST_TOKEN;
      var inParens = m[2];
      var rest = m[3];

      if (isPresent(inParens)) {
        var srcParts = inParens.split(',');
        var dstParts = [];

        for (var i = 0; i < srcParts.length; i++) {
          var part = srcParts[i].trim();
          if (part.length > 0) {
            ListWrapper.push(dstParts, partReplacer(base, part, rest));
          }
        }

        return ListWrapper.join(dstParts, ',');
      } else {
        return `${base}${rest}`;
      }
    });
  }
 // scope via name and [is=name]
 _applySimpleSelectorScope(selector, scopeSelector, hostSelector) {
     if (isPresent(RegExpWrapper.firstMatch(_polyfillHostRe, selector))) {
         var replaceBy = this.strictStyling ? `[${hostSelector}]` : scopeSelector;
         selector = StringWrapper.replace(selector, _polyfillHostNoCombinator, replaceBy);
         return StringWrapper.replaceAll(selector, _polyfillHostRe, replaceBy + ' ');
     }
     else {
         return scopeSelector + ' ' + selector;
     }
 }
示例#6
0
 setBindingDebugInfo(renderElement, propertyName, propertyValue) {
     var dashCasedPropertyName = camelCaseToDashCase(propertyName);
     if (DOM.isCommentNode(renderElement)) {
         var existingBindings = RegExpWrapper.firstMatch(TEMPLATE_BINDINGS_EXP, StringWrapper.replaceAll(DOM.getText(renderElement), /\n/g, ''));
         var parsedBindings = Json.parse(existingBindings[1]);
         parsedBindings[dashCasedPropertyName] = propertyValue;
         DOM.setText(renderElement, StringWrapper.replace(TEMPLATE_COMMENT_TEXT, '{}', Json.stringify(parsedBindings)));
     }
     else {
         this.setElementAttribute(renderElement, propertyName, propertyValue);
     }
 }
 /*
  * Process styles to add rules which will only apply under the polyfill
  * and do not process via CSSOM. (CSSOM is destructive to rules on rare
  * occasions, e.g. -webkit-calc on Safari.)
  * For example, we convert this rule:
  *
  * @polyfill-unscoped-rule {
  *   content: 'menu-item';
  * ... }
  *
  * to this:
  *
  * menu-item {...}
  *
 **/
 _extractUnscopedRulesFromCssText(cssText) {
     // Difference with webcomponents.js: does not handle comments
     var r = '', m;
     var matcher = RegExpWrapper.matcher(_cssContentUnscopedRuleRe, cssText);
     while (isPresent(m = RegExpMatcherWrapper.next(matcher))) {
         var rule = m[0];
         rule = StringWrapper.replace(rule, m[2], '');
         rule = StringWrapper.replace(rule, m[1], m[3]);
         r += rule + '\n\n';
     }
     return r;
 }
 scoped = parts.map(p => {
     // remove :host since it should be unnecessary
     var t = StringWrapper.replaceAll(p.trim(), _polyfillHostRe, '');
     if (t.length > 0 && !ListWrapper.contains(splits, t) &&
         !StringWrapper.contains(t, attrName)) {
         var re = /([^:]*)(:*)(.*)/g;
         var m = RegExpWrapper.firstMatch(re, t);
         if (isPresent(m)) {
             p = m[1] + attrName + m[2] + m[3];
         }
     }
     return p;
 })
示例#9
0
 _processCarriageReturns(content) {
     // http://www.w3.org/TR/html5/syntax.html#preprocessing-the-input-stream
     // In order to keep the original position in the source, we can not
     // pre-process it.
     // Instead CRs are processed right before instantiating the tokens.
     return StringWrapper.replaceAll(content, CR_OR_CRLF_REGEXP, '\n');
 }
 _handleMessage(message) {
     var data = new MessageData(message);
     // TODO(jteplitz602): replace these strings with messaging constants #3685
     if (StringWrapper.equals(data.type, "result") || StringWrapper.equals(data.type, "error")) {
         var id = data.id;
         if (this._pending.has(id)) {
             if (StringWrapper.equals(data.type, "result")) {
                 this._pending.get(id).resolve(data.value);
             }
             else {
                 this._pending.get(id).reject(data.value, null);
             }
             this._pending.delete(id);
         }
     }
 }
示例#11
0
 _rewriteShortSyntax(ast) {
     let m = RegExpWrapper.firstMatch(SHORT_SYNTAX_REGEXP, ast.name);
     let attrName = ast.name;
     let attrValue = ast.value;
     if (isPresent(m)) {
         if (isPresent(m[1])) {
             attrName = `(${dashCaseToCamelCase(m[1])})`;
         }
         else if (isPresent(m[2])) {
             attrName = `[(${dashCaseToCamelCase(m[2])})]`;
         }
         else if (isPresent(m[3])) {
             let prop = StringWrapper.replaceAllMapped(m[3], SPECIAL_PREFIXES_REGEXP, (m) => { return m[1].toLowerCase() + '.'; });
             if (prop.startsWith('class.') || prop.startsWith('attr.') || prop.startsWith('style.')) {
                 attrName = `[${prop}]`;
             }
             else {
                 attrName = `[${dashCaseToCamelCase(prop)}]`;
             }
         }
         else if (isPresent(m[4])) {
             attrName = `#${dashCaseToCamelCase(m[4])}`;
             attrValue = dashCaseToCamelCase(attrValue);
         }
     }
     return attrName == ast.name && attrValue == ast.value ?
         ast :
         new HtmlAttrAst(attrName, attrValue, ast.sourceSpan);
 }
function _buildValueString(id, value) {
    if (lang_1.isBlank(id))
        return "" + value;
    if (!lang_1.isPrimitive(value))
        value = "Object";
    return lang_1.StringWrapper.slice(id + ": " + value, 0, 50);
}
示例#13
0
 _advance() {
     if (this.index >= this.length) {
         throw this._createError(unexpectedCharacterErrorMsg($EOF), this._getSpan());
     }
     if (this.peek === $LF) {
         this.line++;
         this.column = 0;
     }
     else if (this.peek !== $LF && this.peek !== $CR) {
         this.column++;
     }
     this.index++;
     this.peek = this.index >= this.length ? $EOF : StringWrapper.charCodeAt(this.input, this.index);
     this.nextPeek =
         this.index + 1 >= this.length ? $EOF : StringWrapper.charCodeAt(this.input, this.index + 1);
 }
function escapeBlocks(input) {
    var inputParts = StringWrapper.split(input, _curlyRe);
    var resultParts = [];
    var escapedBlocks = [];
    var bracketCount = 0;
    var currentBlockParts = [];
    for (var partIndex = 0; partIndex < inputParts.length; partIndex++) {
        var part = inputParts[partIndex];
        if (part == CLOSE_CURLY) {
            bracketCount--;
        }
        if (bracketCount > 0) {
            currentBlockParts.push(part);
        }
        else {
            if (currentBlockParts.length > 0) {
                escapedBlocks.push(currentBlockParts.join(''));
                resultParts.push(BLOCK_PLACEHOLDER);
                currentBlockParts = [];
            }
            resultParts.push(part);
        }
        if (part == OPEN_CURLY) {
            bracketCount++;
        }
    }
    if (currentBlockParts.length > 0) {
        escapedBlocks.push(currentBlockParts.join(''));
        resultParts.push(BLOCK_PLACEHOLDER);
    }
    return new StringWithEscapedBlocks(resultParts.join(''), escapedBlocks);
}
示例#15
0
  replaceCombinators(selector: string): string {
    for (var i = 0; i < _COMBINATORS.length; i++) {
      var combinator = _COMBINATORS[i];
      selector = StringWrapper.replaceAll(selector, combinator, '');
    }

    return selector;
  }
 _colonHostContextPartReplacer(host, part, suffix) {
     if (StringWrapper.contains(part, _polyfillHost)) {
         return this._colonHostPartReplacer(host, part, suffix);
     }
     else {
         return host + part + suffix + ', ' + part + ' ' + host + suffix;
     }
 }
示例#17
0
 insertAttr(selector: string): string {
   return StringWrapper.replaceAllMapped(selector, _SIMPLE_SELECTORS, (m) => {
     var basePart = m[1];
     var colonPart = m[2];
     var rest = m[3];
     return (m[0].length > 0) ? `${basePart}${this._attr}${colonPart}${rest}` : '';
   });
 }
示例#18
0
 _attemptStrCaseInsensitive(chars) {
     for (var i = 0; i < chars.length; i++) {
         if (!this._attemptCharCodeCaseInsensitive(StringWrapper.charCodeAt(chars, i))) {
             return false;
         }
     }
     return true;
 }
示例#19
0
 _rewriteTemplateAttribute(ast) {
     let name = ast.name;
     let value = ast.value;
     if (name.toLowerCase() == 'template') {
         name = 'template';
         // rewrite the directive selector
         value = StringWrapper.replaceAllMapped(value, TEMPLATE_SELECTOR_REGEXP, (m) => { return dashCaseToCamelCase(m[1]); });
         // rewrite the var declarations
         value = StringWrapper.replaceAllMapped(value, VARIABLE_TPL_BINDING_REGEXP, m => {
             return `${m[1].toLowerCase()}${dashCaseToCamelCase(m[2])}`;
         });
     }
     if (name == ast.name && value == ast.value) {
         return ast;
     }
     return new HtmlAttrAst(name, value, ast.sourceSpan);
 }
示例#20
0
 advance() {
   this.index++;
   if (this.index >= this.length) {
     this.peek = _$EOF;
   } else {
     this.peek = StringWrapper.charCodeAt(this.input, this.index);
   }
 }
示例#21
0
 ControlGroup.prototype.find = function (path) {
     if (!(path instanceof collection_1.List)) {
         path = lang_1.StringWrapper.split(path, new RegExp("/"));
     }
     return collection_1.ListWrapper.reduce(path, function (v, name) { return v instanceof ControlGroup && lang_1.isPresent(v.controls[name]) ?
         v.controls[name] :
         null; }, this);
 };
示例#22
0
 this.response = new Observable((responseObserver) => {
     this.readyState = ReadyState.Loading;
     let id = this._id = _dom.nextRequestID();
     _dom.exposeConnection(id, this);
     // Workaround Dart
     // url = url.replace(/=JSONP_CALLBACK(&|$)/, `generated method`);
     let callback = _dom.requestCallback(this._id);
     let url = req.url;
     if (url.indexOf('=JSONP_CALLBACK&') > -1) {
         url = StringWrapper.replace(url, '=JSONP_CALLBACK&', `=${callback}&`);
     }
     else if (url.lastIndexOf('=JSONP_CALLBACK') === url.length - '=JSONP_CALLBACK'.length) {
         url = url.substring(0, url.length - '=JSONP_CALLBACK'.length) + `=${callback}`;
     }
     let script = this._script = _dom.build(url);
     let onLoad = (event) => {
         if (this.readyState === ReadyState.Cancelled)
             return;
         this.readyState = ReadyState.Done;
         _dom.cleanup(script);
         if (!this._finished) {
             let responseOptions = new ResponseOptions({ body: JSONP_ERR_NO_CALLBACK, type: ResponseType.Error, url });
             if (isPresent(baseResponseOptions)) {
                 responseOptions = baseResponseOptions.merge(responseOptions);
             }
             responseObserver.error(new Response(responseOptions));
             return;
         }
         let responseOptions = new ResponseOptions({ body: this._responseData, url });
         if (isPresent(this.baseResponseOptions)) {
             responseOptions = this.baseResponseOptions.merge(responseOptions);
         }
         responseObserver.next(new Response(responseOptions));
         responseObserver.complete();
     };
     let onError = (error) => {
         if (this.readyState === ReadyState.Cancelled)
             return;
         this.readyState = ReadyState.Done;
         _dom.cleanup(script);
         let responseOptions = new ResponseOptions({ body: error.message, type: ResponseType.Error });
         if (isPresent(baseResponseOptions)) {
             responseOptions = baseResponseOptions.merge(responseOptions);
         }
         responseObserver.error(new Response(responseOptions));
     };
     script.addEventListener('load', onLoad);
     script.addEventListener('error', onError);
     _dom.send(script);
     return () => {
         this.readyState = ReadyState.Cancelled;
         script.removeEventListener('load', onLoad);
         script.removeEventListener('error', onError);
         if (isPresent(script)) {
             this._dom.cleanup(script);
         }
     };
 });
 this.response = new Observable_1.Observable(function (responseObserver) {
     _this.readyState = enums_1.ReadyState.Loading;
     var id = _this._id = _dom.nextRequestID();
     _dom.exposeConnection(id, _this);
     // Workaround Dart
     // url = url.replace(/=JSONP_CALLBACK(&|$)/, `generated method`);
     var callback = _dom.requestCallback(_this._id);
     var url = req.url;
     if (url.indexOf('=JSONP_CALLBACK&') > -1) {
         url = lang_1.StringWrapper.replace(url, '=JSONP_CALLBACK&', "=" + callback + "&");
     }
     else if (url.lastIndexOf('=JSONP_CALLBACK') === url.length - '=JSONP_CALLBACK'.length) {
         url = url.substring(0, url.length - '=JSONP_CALLBACK'.length) + ("=" + callback);
     }
     var script = _this._script = _dom.build(url);
     var onLoad = function (event) {
         if (_this.readyState === enums_1.ReadyState.Cancelled)
             return;
         _this.readyState = enums_1.ReadyState.Done;
         _dom.cleanup(script);
         if (!_this._finished) {
             var responseOptions_1 = new base_response_options_1.ResponseOptions({ body: JSONP_ERR_NO_CALLBACK, type: enums_1.ResponseType.Error, url: url });
             if (lang_1.isPresent(baseResponseOptions)) {
                 responseOptions_1 = baseResponseOptions.merge(responseOptions_1);
             }
             responseObserver.error(new static_response_1.Response(responseOptions_1));
             return;
         }
         var responseOptions = new base_response_options_1.ResponseOptions({ body: _this._responseData, url: url });
         if (lang_1.isPresent(_this.baseResponseOptions)) {
             responseOptions = _this.baseResponseOptions.merge(responseOptions);
         }
         responseObserver.next(new static_response_1.Response(responseOptions));
         responseObserver.complete();
     };
     var onError = function (error) {
         if (_this.readyState === enums_1.ReadyState.Cancelled)
             return;
         _this.readyState = enums_1.ReadyState.Done;
         _dom.cleanup(script);
         var responseOptions = new base_response_options_1.ResponseOptions({ body: error.message, type: enums_1.ResponseType.Error });
         if (lang_1.isPresent(baseResponseOptions)) {
             responseOptions = baseResponseOptions.merge(responseOptions);
         }
         responseObserver.error(new static_response_1.Response(responseOptions));
     };
     script.addEventListener('load', onLoad);
     script.addEventListener('error', onError);
     _dom.send(script);
     return function () {
         _this.readyState = enums_1.ReadyState.Cancelled;
         script.removeEventListener('load', onLoad);
         script.removeEventListener('error', onError);
         if (lang_1.isPresent(script)) {
             _this._dom.cleanup(script);
         }
     };
 });
示例#24
0
 scopeSimpleSelector(selector: string, strict: boolean) {
   if (StringWrapper.contains(selector, _HOST_TOKEN)) {
     return this.replaceColonSelectors(selector);
   } else if (strict) {
     return this.insertTagToEverySelectorPart(selector);
   } else {
     return `${this._tag} ${selector}`;
   }
 }
 ObservableWrapper.subscribe(this._channelSource, (msg) => {
     var listeners = null;
     if (StringMapWrapper.contains(msg, 'event')) {
         let type = msg['event']['type'];
         if (StringWrapper.equals(type, "popstate")) {
             listeners = this._popStateListeners;
         }
         else if (StringWrapper.equals(type, "hashchange")) {
             listeners = this._hashChangeListeners;
         }
         if (listeners !== null) {
             let e = deserializeGenericEvent(msg['event']);
             // There was a popState or hashChange event, so the location object thas been updated
             this._location = this._serializer.deserialize(msg['location'], LocationType);
             listeners.forEach((fn) => fn(e));
         }
     }
 });
示例#26
0
 scanSelector(): _Token {
   var start = this.index;
   this.advance();
   while (this.isSelector(this.peek)) {
     this.advance();
   }
   var selector = StringWrapper.substring(this.input, start, this.index);
   return new _Token(selector.trim(), 'selector');
 }
示例#27
0
 async_1.ObservableWrapper.subscribe(this._channelSource, function (msg) {
     var listeners = null;
     if (collection_1.StringMapWrapper.contains(msg, 'event')) {
         var type = msg['event']['type'];
         if (lang_1.StringWrapper.equals(type, "popstate")) {
             listeners = _this._popStateListeners;
         }
         else if (lang_1.StringWrapper.equals(type, "hashchange")) {
             listeners = _this._hashChangeListeners;
         }
         if (listeners !== null) {
             var e_1 = event_deserializer_1.deserializeGenericEvent(msg['event']);
             // There was a popState or hashChange event, so the location object thas been updated
             _this._location = _this._serializer.deserialize(msg['location'], serialized_types_1.LocationType);
             listeners.forEach(function (fn) { return fn(e_1); });
         }
     }
 });
示例#28
0
export function splitAtColon(input, defaultValues) {
    var parts = StringWrapper.split(input.trim(), /\s*:\s*/g);
    if (parts.length > 1) {
        return parts;
    }
    else {
        return defaultValues;
    }
}
 LowerCasePipe.prototype.transform = function (value, args) {
     if (args === void 0) { args = null; }
     if (lang_1.isBlank(value))
         return value;
     if (!lang_1.isString(value)) {
         throw new invalid_pipe_argument_exception_1.InvalidPipeArgumentException(LowerCasePipe, value);
     }
     return lang_1.StringWrapper.toLowerCase(value);
 };
 /*
  * Process styles to add rules which will only apply under the polyfill
  *
  * For example, we convert this rule:
  *
  * polyfill-rule {
  *   content: ':host menu-item';
  * ...
  * }
  *
  * to this:
  *
  * scopeName menu-item {...}
  *
 **/
 _insertPolyfillRulesInCssText(cssText) {
     // Difference with webcomponents.js: does not handle comments
     return StringWrapper.replaceAllMapped(cssText, _cssContentRuleRe, function (m) {
         var rule = m[0];
         rule = StringWrapper.replace(rule, m[1], '');
         rule = StringWrapper.replace(rule, m[2], '');
         return m[3] + rule;
     });
 }