11import { MarkdownPostProcessorContext , Plugin } from "obsidian" ;
2+ import topologyUi from "@couchbaselabs/topology-ui" ;
23import { topologyAssetDataUris } from "./generated/topology-assets" ;
34
4- type TopologyUiModule = {
5- parseTopologySource : ( input : string , options ?: { allowJavaScript ?: boolean } ) => unknown ;
6- renderTopology : ( input : unknown ) => string ;
7- } ;
8-
9- const topologyUi = require ( "@couchbaselabs/topology-ui" ) as TopologyUiModule ;
10-
115export default class CouchbaseTopologyPlugin extends Plugin {
126 private topologyUi = topologyUi ;
137
14- async onload ( ) : Promise < void > {
15- this . registerMarkdownCodeBlockProcessor ( "couchbase-topology" , async ( source , el , ctx ) => {
16- await this . renderTopologyCodeBlock ( source , el , ctx ) ;
8+ onload ( ) : void {
9+ this . registerMarkdownCodeBlockProcessor ( "couchbase-topology" , ( source , el , ctx ) => {
10+ this . renderTopologyCodeBlock ( source , el , ctx ) ;
1711 } ) ;
1812 }
1913
20- private async renderTopologyCodeBlock (
14+ private renderTopologyCodeBlock (
2115 source : string ,
2216 el : HTMLElement ,
2317 _ctx : MarkdownPostProcessorContext
24- ) : Promise < void > {
18+ ) : void {
2519 const host = el . createDiv ( { cls : "couchbase-topology-block" } ) ;
2620
2721 try {
2822 const topology = this . topologyUi . parseTopologySource ( source ) ;
29- host . innerHTML = this . inlineTopologyAssets ( this . topologyUi . renderTopology ( topology ) ) ;
23+ const renderedMarkup = this . inlineTopologyAssets ( this . topologyUi . renderTopology ( topology ) ) ;
24+ host . replaceChildren ( this . createRenderedFragment ( host , renderedMarkup ) ) ;
3025 } catch ( error ) {
3126 const message = error instanceof Error ? error . message : String ( error ) ;
3227 host . empty ( ) ;
@@ -38,6 +33,12 @@ export default class CouchbaseTopologyPlugin extends Plugin {
3833 }
3934 }
4035
36+ private createRenderedFragment ( host : HTMLElement , markup : string ) : DocumentFragment {
37+ const range = host . ownerDocument . createRange ( ) ;
38+ range . selectNodeContents ( host ) ;
39+ return range . createContextualFragment ( markup ) ;
40+ }
41+
4142 private inlineTopologyAssets ( html : string ) : string {
4243 return html . replace (
4344 / \b ( x l i n k : h r e f | s r c ) = ( [ " ' ] ) i m a g e s \/ ( [ ^ " ' ? # ] + ) \2/ g,
0 commit comments