public MarkupMinificationResult Minify(string content, string fileContext, Encoding encoding,
bool generateStatistics)
{
MinificationStatistics statistics = null;
string cleanedContent = Utils.RemoveByteOrderMark(content);
string minifiedContent = string.Empty;
var errors = new List<MinificationErrorInfo>();
var warnings = new List<MinificationErrorInfo>();
lock (_minificationSynchronizer)
{
_fileContext = fileContext;
_encoding = encoding;
try
{
if (generateStatistics)
{
statistics = new MinificationStatistics(_encoding);
statistics.Init(cleanedContent);
}
int estimatedCapacity = (int)Math.Floor(cleanedContent.Length * AVERAGE_COMPRESSION_RATIO);
_result = StringBuilderPool.GetBuilder(estimatedCapacity);
_htmlParser.Parse(cleanedContent);
FlushBuffer();
if (_errors.Count == 0)
{
minifiedContent = _result.ToString();
if (generateStatistics)
{
statistics.End(minifiedContent);
}
}
}
catch (MarkupParsingException e)
{
WriteError(LogCategoryConstants.HtmlParsingError, e.Message, _fileContext,
e.LineNumber, e.ColumnNumber, e.SourceFragment);
}
finally
{
StringBuilderPool.ReleaseBuilder(_result);
_buffer.Clear();
_tagsWithNotRemovableWhitespaceQueue.Clear();
_currentNodeType = HtmlNodeType.Unknown;
_currentTag = null;
_currentText = string.Empty;
errors.AddRange(_errors);
warnings.AddRange(_warnings);
_errors.Clear();
_warnings.Clear();
_fileContext = null;
_encoding = null;
}
}
if (errors.Count == 0)
{
_logger.Info(LogCategoryConstants.HtmlMinificationSuccess,
string.Format(Strings.SuccesMessage_MarkupMinificationComplete, "HTML"),
fileContext, statistics);
}
return new MarkupMinificationResult(minifiedContent, errors, warnings, statistics);
}