How can I expand CSS shorthand properties programmatically?
Is there a .Net CSS parser that will allow me to parse css shorthand properties into their longhand form?
For example I'd like to take the following:
#somediv{
margin: 10px;
padding: 10px 20px;
border:5px solid #FFF;
}
And translate it t开发者_运维问答o:
#somediv{
margin-top: 10px;
margin-right: 10px;
margin-bottom: 10px;
margin-left: 10px;
padding-top: 10px;
padding-right: 20px;
padding-bottom: 10px;
padding-left: 20px;
border-width: 5px;
border-style: solid;
border-color: #FFF;
}
Here is a pretty good list of all the different properties I'd need to handle in this manner: http://www.dustindiaz.com/css-shorthand/
Ideally I'd like something in .Net but if there's something in another language that's open source I can probably adapt it.
Update
Without getting into too much detail as to exactly what I'm trying to do here is the basic premise:
I need to programmaticly take multiple CSS docs and merge them to create one definitive set of CSS.
So if doc 1 has :
p { padding: 10px;}
And then I add on doc 2:
p { padding-left:20px;}
The resulting CSS should be:
p { padding-top: 10px; padding-right:10px; padding-bottom:10px; padding-left:20px;}
Because the later added doc overwrites the single property. To do this accurately I would need to take every CSS and break down every property to it's lowest element first.
For regular CSS parsing I've found this to be the easiest to use:
http://www.codeproject.com/KB/recipes/CSSParser.aspx
For breaking down the shorthand properties into their longhand form I've found two that can do it:
In .Net : http://www.modeltext.com/css/index.aspx
In JavaScript: http://www.glazman.org/JSCSSP/
The most simplest approach would is to make use of .NET's WebBrowserControl along with MsHTML(IE Renderer) and this is most reliable approach too !
//Create the instance of new webbrowser control.
WebBrowser browser = new WebBrowser();
//Navigate to the specified URL.
browser.Navigate(@"test.html");
//Wait until the webpage gets loaded completely.
while (browser.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
}
foreach (object divElement in
(browser.Document.GetElementsByTagName("div")))
{
IHTMLCurrentStyle currentStyle = ((divElement as HtmlElement)
.DomElement as IHTMLElement2).currentStyle;
Console.WriteLine(currentStyle.marginLeft);
Console.WriteLine(currentStyle.marginRight);
}
Note:
In order to get this code working you need to add reference to Microsoft.MSHTML.dll which can be found on the following location.
c:{Program Files}\microsoft.net\Primary Interop Assemblies\
Could you give a little more detail on why you want to do this?
And are you looking for it to do correct parsing with things like:
padding:10px 15px;
into
padding-top:10px; padding-right:15px; padding-bottom:10px; padding-left:15px;
精彩评论