Лучший способ конвертировать HTML в CSHTML - PullRequest
0 голосов
/ 11 июля 2011

У меня есть несколько десятков HTML-форм, которые мне нужно преобразовать в частичные представления Razor ASP.NET MVC (CSHTML). В частности, мне нужно преобразовать каждый в @ Html.TextBox. Например, конвертировать

<input name="text1" style="margin:0pt"></input>

до

@Html.TextBox("text1", String.Empty, new { style = "margin:0pt" })

, а затем сохраните файл в новый файл CSHTML. Конечно, входной тег может быть закодирован как

<input .../> or as <input ...></input>

и тег может иметь или не иметь атрибут стиля.

Кто-нибудь знает об автоматизированном способе, которым я мог бы сделать это? Альтернатива состоит в том, чтобы вручную внести изменения, которые будут довольно трудоемкими. Я думал, что для этого нужно использовать магию регулярных выражений, или, возможно, использовать какой-то HTML-анализатор DOM, но я не большой бог Regex и не знаком с какими-либо компонентами синтаксического анализа, которые могли бы помочь.

Любые предложения будут наиболее ценными!

1 Ответ

0 голосов
/ 12 июля 2011

Это вам поможет,

    private static void ReplaceInputTagsWithHtmlTextBox(string filePath)
    {
        var input = System.IO.File.ReadAllText(filePath);
        var keyValueRegex = new Regex("\\s*(?<key>[^=]*)=\\s*['\"](?<value>[^'\"]*)['\"]");
        var values = new List<string>();
        var regex = new Regex(@"<input (?<Attributes>[^>]*)>(</input>)?");
        var newContent = regex.Replace(input, m =>
        {
            var keyValueDict = new Dictionary<string, string>();
            var allAttributes = m.Groups["Attributes"].Value;
            keyValueRegex.Replace(m.Groups["Attributes"].Value, mm =>
            {
                keyValueDict.Add(mm.Groups["key"].Value, mm.Groups["value"].Value);
                return null;
            });
            var keyValues = new StringBuilder();
            foreach (KeyValuePair<string, string> pair in keyValueDict)
            {
                if (!pair.Key.Equals("id", StringComparison.OrdinalIgnoreCase) && !pair.Key.Equals("name", StringComparison.OrdinalIgnoreCase) && !pair.Key.Equals("value", StringComparison.OrdinalIgnoreCase))//don't include id, name and value
                    keyValues.Append(pair.Key.Replace("class", "@class") + "= \"" + pair.Value + "\", ");
            }
            var keyValuesString = keyValues.ToString();
            if (keyValuesString.EndsWith(", "))
                keyValuesString = keyValuesString.Remove(keyValuesString.Length - 2, 2);
            if (!keyValueDict.ContainsKey("name") || keyValueDict["name"] == null)
                keyValueDict["name"] = "";
            if (!keyValueDict.ContainsKey("value") || keyValueDict["value"] == null)
                keyValueDict["value"] = "";
            return String.Format("@Html.TextBox(\"{0}\", \"{1}\", new {{ {2} }})\n", keyValueDict["name"], keyValueDict["value"], keyValuesString);
        });
        using (StreamWriter outfile =new StreamWriter(filePath))
        {
            outfile.Write(newContent);
        }
    }

Теперь просто назовите его, используя,

ReplaceInputTagsWithHtmlTextBox("Temp.cshtml");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...