using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
namespace Fungus
{
///
/// Replaces special tokens in a string with substituted values (typically variables or localisation strings).
///
public class StringSubstituter
{
///
/// Interface for components that support substituting strings.
///
public interface ISubstitutionHandler
{
///
/// Returns a new string with tokens replaced by subsituted values.
/// It's up to clients how to implement substitution but the convention looks like:
/// "Hi {$VarName}" => "Hi John" where VarName == "John"
///
string SubstituteStrings(string input);
}
protected List substitutionHandlers = new List();
///
/// Constructor which caches all components in the scene that implement ISubstitutionHandler.
///
public StringSubstituter()
{
CacheSubstitutionHandlers();
}
///
/// Populates a cache of all components in the scene that implement ISubstitutionHandler.
///
public virtual void CacheSubstitutionHandlers()
{
// Use reflection to find all components in the scene that implement ISubstitutionHandler
var types = this.GetType().Assembly.GetTypes().Where(type => type.IsClass &&
!type.IsAbstract &&
typeof(ISubstitutionHandler).IsAssignableFrom(type));
substitutionHandlers.Clear();
foreach (System.Type t in types)
{
Object[] objects = GameObject.FindObjectsOfType(t);
foreach (Object o in objects)
{
ISubstitutionHandler handler = o as ISubstitutionHandler;
if (handler != null)
{
substitutionHandlers.Add(handler);
}
}
}
}
///
/// Returns a new string that has been processed by all substitution handlers in the scene.
///
public virtual string SubstituteStrings(string input)
{
string newString = input;
foreach (ISubstitutionHandler handler in substitutionHandlers)
{
newString = handler.SubstituteStrings(newString);
}
return newString;
}
}
}