mirror of
				https://github.com/art-ist/mustache-sharp.git
				synced 2024-06-16 21:05:32 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			105 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections;
 | |
| using System.Collections.Generic;
 | |
| using System.Linq;
 | |
| 
 | |
| namespace mustache
 | |
| {
 | |
|     /// <summary>
 | |
|     /// Defines a tag that conditionally prints its content.
 | |
|     /// </summary>
 | |
|     internal abstract class ConditionTagDefinition : TagDefinition
 | |
|     {
 | |
|         private const string conditionParameter = "condition";
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Initializes a new instance of a ConditionTagDefinition.
 | |
|         /// </summary>
 | |
|         /// <param name="tagName">The name of the tag.</param>
 | |
|         protected ConditionTagDefinition(string tagName)
 | |
|             : base(tagName, true)
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets the parameters that can be passed to the tag.
 | |
|         /// </summary>
 | |
|         /// <returns>The parameters.</returns>
 | |
|         protected override TagParameter[] GetParameters()
 | |
|         {
 | |
|             return new TagParameter[] { new TagParameter(conditionParameter) { IsRequired = true } };
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets whether the tag will contain content.
 | |
|         /// </summary>
 | |
|         public override bool HasBody
 | |
|         {
 | |
|             get { return true; }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets the tags that come into scope within the context of the current tag.
 | |
|         /// </summary>
 | |
|         /// <returns>The child tag definitions.</returns>
 | |
|         protected override TagDefinition[] GetChildTags()
 | |
|         {
 | |
|             return new TagDefinition[] 
 | |
|             {
 | |
|                 new ElifTagDefinition(),
 | |
|                 new ElseTagDefinition(),
 | |
|             };
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets whether the given tag's generator should be used for a secondary (or substitute) text block.
 | |
|         /// </summary>
 | |
|         /// <param name="definition">The tag to inspect.</param>
 | |
|         /// <returns>True if the tag's generator should be used as a secondary generator.</returns>
 | |
|         public override bool ShouldCreateSecondaryGroup(TagDefinition definition)
 | |
|         {
 | |
|             return (definition is ElifTagDefinition) || (definition is ElseTagDefinition);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets whether the primary generator group should be used to render the tag.
 | |
|         /// </summary>
 | |
|         /// <param name="arguments">The arguments passed to the tag.</param>
 | |
|         /// <returns>
 | |
|         /// True if the primary generator group should be used to render the tag;
 | |
|         /// otherwise, false to use the secondary group.
 | |
|         /// </returns>
 | |
|         public override bool ShouldGeneratePrimaryGroup(Dictionary<string, object> arguments)
 | |
|         {
 | |
|             object condition = arguments[conditionParameter];
 | |
|             return isConditionSatisfied(condition);
 | |
|         }
 | |
| 
 | |
|         private bool isConditionSatisfied(object condition)
 | |
|         {
 | |
|             if (condition == null)
 | |
|             {
 | |
|                 return false;
 | |
|             }
 | |
|             IEnumerable enumerable = condition as IEnumerable;
 | |
|             if (enumerable != null)
 | |
|             {
 | |
|                 return enumerable.Cast<object>().Any();
 | |
|             }
 | |
|             if (condition is Char)
 | |
|             {
 | |
|                 return (Char)condition != '\0';
 | |
|             }
 | |
|             try
 | |
|             {
 | |
|                 decimal number = (decimal)Convert.ChangeType(condition, typeof(decimal));
 | |
|                 return number != 0.0m;
 | |
|             }
 | |
|             catch
 | |
|             {
 | |
|                 return true;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | 
