public override void Format(FormattingInfo formattingInfo) { foreach (var item in formattingInfo.Format.Items) { if (item is LiteralText literalItem) { m_Characters = m_Characters.Concat(item.ToEnumerable()); continue; } // Otherwise, the item must be a placeholder. var placeholder = (Placeholder)item; var childFormattingInfo = formattingInfo.CreateChild(placeholder); var formatterName = childFormattingInfo.Placeholder.FormatterName; // Evaluate the named formatter (or, evaluate all "" formatters) foreach (var formatterExtension in FormatterExtensions) { if (formatterExtension is IFormatterLiteralExtractor literalExtractor && formatterExtension.Names.Contains(formatterName)) { literalExtractor.WriteAllLiterals(childFormattingInfo); } } } }
/// <summary> /// Format the <see cref="FormattingInfo" /> argument. /// </summary> /// <param name="formattingInfo"></param> public void Format(FormattingInfo formattingInfo) { // Before we start, make sure we have at least one source extension and one formatter extension: CheckForExtensions(); if (formattingInfo.Format is null) { return; } foreach (var item in formattingInfo.Format.Items) { if (item is LiteralText literalItem) { formattingInfo.Write(literalItem.ToString()); continue; } // Otherwise, the item must be a placeholder. var placeholder = (Placeholder)item; var childFormattingInfo = formattingInfo.CreateChild(placeholder); try { EvaluateSelectors(childFormattingInfo); } catch (Exception ex) { // An error occurred while evaluation selectors var errorIndex = placeholder.Format?.startIndex ?? placeholder.Selectors.Last().endIndex; FormatError(item, ex, errorIndex, childFormattingInfo); continue; } try { EvaluateFormatters(childFormattingInfo); } catch (Exception ex) { // An error occurred while evaluating formatters var errorIndex = placeholder.Format?.startIndex ?? placeholder.Selectors.Last().endIndex; FormatError(item, ex, errorIndex, childFormattingInfo); } } }