public void Evaluate(EvaluateContext context) { context.For <IShoppingCart>("Cart") .Token("Items", c => string.Join(T(", ").Text, (c ?? _shoppingCart).GetProducts().Select(p => p.ToString()))) .Chain("Items", "CartItems", c => (c ?? _shoppingCart).GetProducts()) .Token("Country", c => (c ?? _shoppingCart).Country) .Token("ZipCode", c => (c ?? _shoppingCart).ZipCode) .Token("Shipping", c => (c ?? _shoppingCart).ShippingOption.ToString()) .Chain("Shipping", "ShippingOption", c => (c ?? _shoppingCart).ShippingOption) .Token("Subtotal", c => _currencyProvider.GetPriceString((c ?? _shoppingCart).Subtotal())) .Token("Taxes", c => { var taxes = (c ?? _shoppingCart).Taxes(); return(taxes == null ? _currencyProvider.GetPriceString(0.0) : _currencyProvider.GetPriceString(taxes.Amount)); }) .Chain("Taxes", "TaxAmount", c => (c ?? _shoppingCart).Taxes() ?? new TaxAmount { Amount = 0, Name = "" }) .Token("Total", c => _currencyProvider.GetPriceString((c ?? _shoppingCart).Total())) .Token("Count", c => (c ?? _shoppingCart).ItemCount()); context.For <IEnumerable <ShoppingCartQuantityProduct> >("CartItems") .Token(s => s.StartsWith("Format:", StringComparison.OrdinalIgnoreCase) ? s.Substring("Format:".Length) : null, (s, q) => { var separator = ""; var colonIndex = s.IndexOf(':'); if (colonIndex != -1 && s.Length > colonIndex + 1) { separator = s.Substring(0, colonIndex); s = s.Substring(colonIndex + 1); } var format = s .Replace("$quantity", "{0}") .Replace("$sku", "{1}") .Replace("$product", "{2}") .Replace("$price", "{3}"); return(String.Join(separator, q.Select(qp => String.Format(format, qp.Quantity, qp.Product.Sku, qp.Product.As <TitlePart>().Title + " " + string.Join(", ", qp.AttributeIdsToValues.Select(kvp => "[{{" + kvp.Key + "}} " + _contentManager.GetItemMetadata(_contentManager.Get(kvp.Key)).DisplayText + ": " + kvp.Value.ToString() + "]") ), _currencyProvider.GetPriceString(qp.Price))))); }); context.For <ShippingOption>("ShippingOption") .Token("Price", option => _currencyProvider.GetPriceString(option.Price)) .Token("Description", option => option.Description) .Chain("Description", "Text", option => option.Description) .Token("Company", option => option.ShippingCompany) .Chain("Company", "Text", option => option.ShippingCompany); context.For <TaxAmount>("TaxAmount") .Token("Name", amount => amount.Name) .Chain("Name", "Text", amount => amount.Name) .Token("Amount", amount => _currencyProvider.GetPriceString(amount.Amount)); context.For <ShoppingCartItem>("Item") .Token(s => s.StartsWith("Format:", StringComparison.OrdinalIgnoreCase) ? s.Substring("Format:".Length) : null, (s, sci) => { var colonIndex = s.IndexOf(':'); if (colonIndex != -1 && s.Length > colonIndex + 1) { s = s.Substring(colonIndex + 1); } var format = s .Replace("$quantity", "{0}") .Replace("$sku", "{1}") .Replace("$product", "{2}") .Replace("$price", "{3}"); var product = _contentManager.Get <ProductPart>(sci.ProductId); return(string.Format(format, sci.Quantity, product.Sku, product.As <TitlePart>().Title + " " + string.Join(", ", sci.AttributeIdsToValues.Select(kvp => "[{{" + kvp.Key + "}} " + _contentManager.GetItemMetadata(_contentManager.Get(kvp.Key)).DisplayText + ": " + kvp.Value.ToString() + "]") ), _currencyProvider.GetPriceString(product.Price))); }); }