/// <summary> /// This method encapsulates both client- and server- side CSS processing. /// </summary> /// <param name="input">Stylesheet code in dynamic language syntax</param> /// <param name="language">CSS dynamic language</param> /// <param name="output">Plain CSS output</param> /// <param name="hiddenField">Hidden field that holds the result of client-side compilation</param> public static string ProcessCss(string input, string language, out string output, HiddenField hiddenField) { string errorMessage = String.Empty; CssPreprocessor prep = CssStylesheetInfoProvider.GetCssPreprocessor(language); EnsureClientSideCompiledCss(hiddenField); if (String.IsNullOrEmpty(CssPreprocessor.CurrentCompiledValue) || ((prep != null) && !prep.UsesClientSideCompilation)) { // Parse the style sheet code server-side errorMessage = CssStylesheetInfoProvider.TryParseCss(input, language, out output); if (String.IsNullOrEmpty(errorMessage)) { // Store last result CssPreprocessor.CurrentCompiledValue = output; } } else { // Use client-side parsed code output = CssPreprocessor.CurrentCompiledValue; // Check if client-side process result contains special sequence indicating that parser produced no output (this may not be an error) if (output.EqualsCSafe(BLANKOUTPUT)) { output = String.Empty; } else { if ((prep != null) && (prep.GetErrorDescription != null)) { // Handle error errorMessage = prep.GetErrorDescription(output); if (!String.IsNullOrEmpty(errorMessage)) { output = String.Empty; } } } } return(errorMessage); }