Erweiterungen
Alles jenseits des Kerns ist eine Erweiterung: Knotentypen, Befehle, Transforms, Regeln und State-Felder. Der Resolver prüft sie alle, bevor eine Sitzung existiert.
Auflösen
Eine Liste, vorab geprüft
ExtensionResolver lehnt doppelte Erweiterungen, fehlende Abhängigkeiten, Zyklen, doppelte Wire-Namen und widersprüchliche Ersetzungen ab, bevor etwas gebaut wird. Eine fehlgeschlagene Installation wird zurückgebaut.
scala
val generator = NodeIdGenerator.sequential("doc")
val history = new History(HistoryConfig.default)
val resolved = ExtensionResolver.resolve(Vector(
RichText(generator),
ListExtension(generator),
LinkExtension(generator),
CodeExtension(generator),
ImageExtension(generator, MediaUrlPolicy.default),
TableExtension(generator),
history
)).fold(errors => sys.error(errors.map(_.render).mkString("; ")), identity)
val session = EditorSession.create(document, resolved, resolved.sessionConfig())
Mit genau dieser Konfiguration laufen die Live-Editoren auf diesen Seiten.
Features
Was jede Erweiterung mitbringt
Feature-Module sind headless. Sie wissen nichts von HTML oder Markdown; ember-standard ist der eine Ort, an dem Knotentypen und Renderer sich treffen.
- RichText(generator)
- Absätze, Überschriften, Zitate, Umbrüche und die fünf Marks.
- ListExtension(generator)
- Nummerierte und unnummerierte Listen, Ein- und Ausrücken.
- LinkExtension(generator)
- Inline-Links mit geprüfter URL-Policy.
- CodeExtension(generator)
- Codeblöcke mit typisierter Sprachangabe.
- ImageExtension(generator, policy)
- Referenzbasierte Medien als Inline-Atome.
- TableExtension(generator)
- Tabellen mit rechteckiger Zellauswahl.
- History(config)
- Rückgängig und Wiederholen mit expliziter Gruppierung.
Eigene Erweiterungen
Deklarative Beiträge
Eine Erweiterung beschreibt, was sie beiträgt, und tut selbst nichts. Deshalb lässt sich eine Konfiguration auf dem Server auflösen und prüfen.
scala
object CompositionGate extends Extension:
val id = ExtensionId("app.composition-gate")
override def contribute = ExtensionContributions(
preCommitRules = Vector(BrowserInputController.busyRule(compositions))
)