public static List <CssAttritue> GetAttributesInfo(string attributeValue) { var cssAttritues = new List <CssAttritue>(); // Attribute Raw string 분해 var attrReg = new Regex(AttributeMatch); var attrResult = attrReg.Matches(attributeValue); // Attribute 만들기 foreach (Match attrItem in attrResult) { var dividerIndex = attrItem.Value.IndexOf(":"); // Attribute에서 :(콜론)으로 나뉘는 부분의 Index var attr = attrItem.Value.Substring(0, dividerIndex).Trim(); var attrVal = attrItem.Value .Substring(dividerIndex, attrItem.Value.Count() - dividerIndex) .Trim() .Replace(";", "").Replace(":", "") .Split(null); var cssAttritue = new CssAttritue() { AttributeName = attr }; //cssClass.CssAttritues.Add(cssAttritue); cssAttritues.Add(cssAttritue); // Value 만들기(Attribute value) foreach (string valueItem in attrVal) { if (!string.IsNullOrWhiteSpace(valueItem)) { var cssValue = new CssValue() { Value = valueItem }; cssAttritue.CssValues.Add(cssValue); } } } return(cssAttritues); }
public static string ParseHtmlText(string htmlText) { var builder = new StringBuilder(); builder.Append(DefaultHeader); var htmlDoc = new HtmlDocument(); htmlDoc.LoadHtml(htmlText); var htmlNode = htmlDoc.DocumentNode; CssClasses = new List <CssClass>(); // Internal CSS 검색해서 미리 만들어 놓기 var styleData = htmlNode.Descendants("style"); var classAllMatch = @"([\.#][_A-Za-z0-9\-]+)[^}]*{[^}]*}"; // 클래스 전체 var classNameMatch = @"[\.#][_A-Za-z0-9\-]+[^}]"; // 클래스 이름만 //var attributeMatch = @"[_a-zA-z_0-9\-]+[:]+[_a-zA-z_0-9\-\s]+[;]"; // Attribute 및 값 까지 foreach (var item in styleData) { var styleInnerText = item.InnerText; var classRegex = new Regex(classAllMatch); var classText = classRegex.Matches(styleInnerText); // Class 만들기 foreach (Match m in classText) { //Debug.WriteLine("'{0}' found at index {1}.", m.Value, m.Index); var classInnerText = m.Value; var classNameReg = new Regex(classNameMatch); var attrReg = new Regex(AttributeMatch); var matchResult = classNameReg.Matches(classInnerText); var attrResult = attrReg.Matches(classInnerText); var cssClass = new CssClass() { ClassName = matchResult[0].Value.Trim().Replace(".", "").Replace("#", "") }; // Attribute 만들기 foreach (Match attrItem in attrResult) { var dividerIndex = attrItem.Value.IndexOf(":"); // Attribute에서 :(콜론)으로 나뉘는 부분의 Index var attr = attrItem.Value.Substring(0, dividerIndex).Trim(); var attrVal = attrItem.Value .Substring(dividerIndex, attrItem.Value.Count() - dividerIndex) .Trim() .Replace(";", "").Replace(":", "") .Split(null); var cssAttritue = new CssAttritue() { AttributeName = attr }; cssClass.CssAttritues.Add(cssAttritue); // Value 만들기(Attribute value) foreach (string valueItem in attrVal) { if (!string.IsNullOrWhiteSpace(valueItem)) { var cssValue = new CssValue() { Value = valueItem }; cssAttritue.CssValues.Add(cssValue); } } } CssClasses.Add(cssClass); } } // HTML Node들 돌면서 CSS 적용 및 텍스트 만들기 var htmlAllNodes = htmlNode.Descendants(); foreach (var nodeItem in htmlAllNodes) { if (nodeItem.Name.Contains("div") || nodeItem.Name.Contains("span")) { SetValueToRtf(nodeItem, ref builder); builder.Append(" \\par "); } } builder.Append(DefaultFooter); CssClasses.Clear(); return(builder.ToString()); }