using System.Text.Encodings.Web; using Microsoft.AspNetCore.Html; namespace BewerbungsSeite.Models.SiteContent; /// /// Erzeugt die data-Attribute, an denen der Editor die bearbeitbaren Stellen /// erkennt. Ausserhalb des Edit-Modus kommt nichts zurueck, damit das Markup /// der oeffentlichen Seite unveraendert bleibt. /// (Razor laesst Attribute mit null-Wert nicht weg, deshalb dieser Weg.) /// public static class EditMarkup { private static readonly HtmlEncoder Encoder = HtmlEncoder.Default; private static IHtmlContent Attributes(bool editMode, string markup) => editMode ? new HtmlString(markup) : HtmlString.Empty; /// Kennzeichnet einen Bereich. public static IHtmlContent Section(bool editMode, string name) => Attributes(editMode, $"data-section=\"{Encoder.Encode(name)}\""); /// /// Kennzeichnet ein bearbeitbares Textfeld. kommt aus /// und landet als data-max im Markup, wo es der /// Editor (page-editor.js) fuer den Live-Zaehler und die Eingabegrenze liest. /// public static IHtmlContent Field(bool editMode, string name, bool multiline = false, int? max = null) => Attributes(editMode, $"data-field=\"{Encoder.Encode(name)}\"" + (multiline ? " data-multiline=\"true\"" : string.Empty) + (max.HasValue ? $" data-max=\"{max}\"" : string.Empty) + " contenteditable=\"true\""); /// Macht ein Element bearbeitbar, ohne ihm ein eigenes Feld zuzuordnen. public static IHtmlContent Editable(bool editMode, int? max = null) => Attributes(editMode, "contenteditable=\"true\"" + (max.HasValue ? $" data-max=\"{max}\"" : string.Empty)); /// Kennzeichnet einen Listencontainer. public static IHtmlContent List(bool editMode, string name) => Attributes(editMode, $"data-list=\"{Encoder.Encode(name)}\""); /// Kennzeichnet eine Liste aus reinen Texten. public static IHtmlContent StringList(bool editMode, string name) => Attributes(editMode, $"data-list=\"{Encoder.Encode(name)}\" data-string-list=\"true\""); /// Kennzeichnet einen Listeneintrag. public static IHtmlContent Item(bool editMode) => Attributes(editMode, "data-item=\"true\""); /// Kennzeichnet ein verschachteltes Objekt. public static IHtmlContent Object(bool editMode, string name) => Attributes(editMode, $"data-object=\"{Encoder.Encode(name)}\""); /// Kennzeichnet ein austauschbares Bild und haelt dessen gespeicherten Pfad fest. public static IHtmlContent Image(bool editMode, string name, string path) => Attributes(editMode, $"data-image=\"{Encoder.Encode(name)}\" data-value=\"{Encoder.Encode(path ?? string.Empty)}\""); }