ERB как библиотека для C # - PullRequest
       11

ERB как библиотека для C #

1 голос
/ 28 декабря 2008

Я ищу, чтобы найти librray, который эмулирует часть возможностей библиотеки Ruby ERB. т.е. заменить текст для переменных между <% и%>. Мне не нужна часть выполнения кода, которую предоставляет ERB, но если вы знаете что-то, что имеет это, я был бы очень признателен.

Ответы [ 4 ]

2 голосов
/ 28 декабря 2008

Я изменил класс, который раньше использовал для тестирования некоторых вещей. Это даже не так хорошо, как ERB, но он выполняет работу, заменяя текст. Он работает только со свойствами, поэтому вы можете исправить это.

Использование:

Substitutioner sub = new Substitutioner(
    "Hello world <%=Wow%>! My name is <%=Name%>");

MyClass myClass = new MyClass();
myClass.Wow = 42;
myClass.Name = "Patrik";

string result = sub.GetResults(myClass);

Код:

public class Substitutioner
{
    private string Template { get; set; }

    public Substitutioner(string template)
    {
        this.Template = template;
    }

    public string GetResults(object obj)
    {
        // Create the value map and the match list.
        Dictionary<string, object> valueMap = new Dictionary<string, object>();
        List<string> matches = new List<string>();

        // Get all matches.
        matches = this.GetMatches(this.Template);

        // Iterate through all the matches.
        foreach (string match in matches)
        {
            if (valueMap.ContainsKey(match))
                continue;

            // Get the tag's value (i.e. Test for <%=Test%>.
            string value = this.GetTagValue(match);

            // Get the corresponding property in the provided object.
            PropertyInfo property = obj.GetType().GetProperty(value);
            if (property == null)
                continue;

            // Get the property value.
            object propertyValue = property.GetValue(obj, null);

            // Add the match and the property value to the value map.
            valueMap.Add(match, propertyValue);
        }

        // Iterate through all values in the value map.
        string result = this.Template;
        foreach (KeyValuePair<string, object> pair in valueMap)
        {
            // Replace the tag with the corresponding value.
            result = result.Replace(pair.Key, pair.Value.ToString());
        }

        return result;
    }

    private List<string> GetMatches(string subjectString)
    {
        try
        {
            List<string> matches = new List<string>();
            Regex regexObj = new Regex("<%=(.*?)%>");
            Match match = regexObj.Match(subjectString);
            while (match.Success)
            {
                if (!matches.Contains(match.Value))
                    matches.Add(match.Value);
                match = match.NextMatch();
            }
            return matches;
        }
        catch (ArgumentException)
        {
            return new List<string>();
        }
    }

    public string GetTagValue(string tag)
    {
        string result = tag.Replace("<%=", string.Empty);
        result = result.Replace("%>", string.Empty);
        return result;
    }
}
1 голос
/ 28 декабря 2008

Обновлено сообщение

ссылки, которые были полезны, больше не доступны. Я оставил названия, чтобы вы могли их погуглить.

также ищите "C # Razor" (это механизм шаблонов, который MS использует с MVC)


есть еще пара.

Visual Studio поставляется с T4, который является механизмом шаблонов (то есть по сравнению с 2008, 2005 требуется бесплатное дополнение)

Бесплатный редактор T4 - DEAD LINK

T4 Screen Cast - DEAD LINK

Существует проект с открытым исходным кодом под названием Nvolicity, который был передан проекту Castle

Обновления проекта Nvolictiy Castle - DEAD LINK

НТН Кости

1 голос
/ 28 декабря 2008

Посмотрите на TemplateMachine , я не тестировал его, но, похоже, он немного похож на ERB.

0 голосов
/ 31 июля 2014

Я только что выпустил очень простую библиотеку для замены немного как ERB.

Вы не можете оценить в <%%> скобках, вы можете использовать только эти скобки: <%= key_value %>. key_value будет ключом для Hashtable, который вы передаете в качестве подстановочных аргументов, а скобки будут заменены значением в Hashtable. Вот и все.

https://github.com/Joern/C-Sharp-Substituting

Ваш

Joern

...