Beispiel #1
0
        internal static void FormatAndStyleAsPlainText(
            object text,
            FormatContext context)
        {
            PocketView tag = div(text.ToDisplayString(PlainTextFormatter.MimeType));

            tag.HtmlAttributes["class"] = "dni-plaintext";
            tag.WriteTo(context);
        }
        internal static HtmlFormatter <T> CreateForAnyObject(bool includeInternals)
        {
            var members = typeof(T).GetMembersToFormat(includeInternals)
                          .GetMemberAccessors <T>();

            return(new HtmlFormatter <T>((context, instance, writer) =>
            {
                // Note the order of members is declaration order
                var reducedMembers =
                    members
                    .Take(Math.Max(0, HtmlFormatter.MaxProperties))
                    .ToArray();

                if (reducedMembers.Length == 0 || context.ContentThreshold < 1.0)
                {
                    // This formatter refuses to format objects without members, and
                    // refused to produce nested tables, or if no members are selected
                    return false;
                }
                else
                {
                    // Reduce the content threshold for inner formatting, amon other things
                    // ensures no nested tables get produced.
                    var innerContext = context.ReduceContent(FormatContext.NestedInTable);

                    // Note, embeds the keys and values as arbitrary objects into the HTML content,
                    // ultimately rendered by PocketView, e.g. via ToDisplayString(PlainTextFormatter.MimeType)
                    List <object> headers =
                        reducedMembers.Select(m => th(str(m.Member.Name)))
                        .ToList();

                    // Add a '..' column if we elided some members due to size limitations
                    if (reducedMembers.Length < members.Length)
                    {
                        headers.Add(th(str("..")));
                    }

                    IEnumerable <object> values =
                        reducedMembers.Select(m => m.GetValueOrException(instance))
                        .Select(v => td(embed(v, innerContext)));

                    PocketView t =
                        table(
                            thead(
                                tr(
                                    headers)),
                            tbody(
                                tr(
                                    values)));

                    t.WriteTo(writer, HtmlEncoder.Default);
                    return true;
                }
            }));
        }
        private static ConcurrentDictionary <Type, ITypeFormatter> DefaultFormatters() =>
        new ConcurrentDictionary <Type, ITypeFormatter>
        {
            [typeof(DateTime)] = new HtmlFormatter <DateTime>((value, writer) => writer.Write(value.ToString("u"))),

            [typeof(DateTimeOffset)] = new HtmlFormatter <DateTimeOffset>((value, writer) => writer.Write(value.ToString("u"))),

            [typeof(ExpandoObject)] = new HtmlFormatter <ExpandoObject>((obj, writer) =>
            {
                var headers = new List <IHtmlContent>();
                var values  = new List <IHtmlContent>();

                foreach (var pair in obj.OrderBy(p => p.Key))
                {
                    headers.Add(th(pair.Key));
                    values.Add(td(pair.Value));
                }

                IHtmlContent view = table(
                    thead(
                        tr(
                            headers)),
                    tbody(
                        tr(
                            values)));

                view.WriteTo(writer, HtmlEncoder.Default);
            }),

            [typeof(HtmlString)] = new HtmlFormatter <HtmlString>((view, writer) => view.WriteTo(writer, HtmlEncoder.Default)),

            [typeof(JsonString)] = new HtmlFormatter <JsonString>((view, writer) => view.WriteTo(writer, HtmlEncoder.Default)),

            [typeof(PocketView)] = new HtmlFormatter <PocketView>((view, writer) => view.WriteTo(writer, HtmlEncoder.Default)),

            [typeof(ReadOnlyMemory <char>)] = new HtmlFormatter <ReadOnlyMemory <char> >((memory, writer) =>
            {
                PocketView view = span(memory.Span.ToString());

                view.WriteTo(writer, HtmlEncoder.Default);
            }),

            [typeof(string)] = new HtmlFormatter <string>((s, writer) => writer.Write(span(s))),

            [typeof(TimeSpan)] = new HtmlFormatter <TimeSpan>((timespan, writer) =>
            {
                writer.Write(timespan.ToString());
            }),

            [typeof(Type)] = _formatterForSystemType,

            [typeof(Type).GetType()] = _formatterForSystemType,
        };
Beispiel #4
0
        internal static HtmlFormatter <T> CreateForAnyObject(bool includeInternals)
        {
            var members = typeof(T).GetMembersToFormat(includeInternals)
                          .GetMemberAccessors <T>();

            return(new HtmlFormatter <T>((instance, context) =>
            {
                // Note the order of members is declaration order
                var reducedMembers =
                    members
                    .Take(Math.Max(0, HtmlFormatter.MaxProperties))
                    .ToArray();

                if (reducedMembers.Length == 0)
                {
                    // This formatter refuses to format objects without members, and
                    // refused to produce nested tables, or if no members are selected
                    return false;
                }
                else
                {
                    // Note, embeds the keys and values as arbitrary objects into the HTML content,
                    List <IHtmlContent> headers =
                        reducedMembers.Select(m => (IHtmlContent)th(m.Member.Name))
                        .ToList();

                    // Add a '..' column if we elided some members due to size limitations
                    if (reducedMembers.Length < members.Length)
                    {
                        headers.Add(th(".."));
                    }

                    IEnumerable <object> values =
                        reducedMembers.Select(m => m.GetValueOrException(instance))
                        .Select(v => td(
                                    div[@class: "dni-plaintext"](v.ToDisplayString(PlainTextFormatter.MimeType))));

                    PocketView t =
                        table(
                            thead(
                                tr(
                                    headers)),
                            tbody(
                                tr(
                                    values)));

                    t.WriteTo(context);

                    return true;
                }
            }));
        }