@@ -62,7 +62,7 @@ export class DomHelpers<T extends JWPluginConfig = JWPluginConfig> extends JWPlu
6262 */
6363 addClass ( params : { domNode : Node | Node [ ] ; class : string | string [ ] } ) : void {
6464 const classes = Array . isArray ( params . class ) ? params . class : [ params . class ] ;
65- for ( const node of this . _getNodes ( params . domNode ) ) {
65+ for ( const node of this . getNodes ( params . domNode ) ) {
6666 node . modifiers . get ( Attributes ) . classList . add ( ...classes ) ;
6767 }
6868 }
@@ -73,7 +73,7 @@ export class DomHelpers<T extends JWPluginConfig = JWPluginConfig> extends JWPlu
7373 */
7474 removeClass ( params : { domNode : Node | Node [ ] ; class : string | string [ ] } ) : void {
7575 const classes = Array . isArray ( params . class ) ? params . class : [ params . class ] ;
76- for ( const node of this . _getNodes ( params . domNode ) ) {
76+ for ( const node of this . getNodes ( params . domNode ) ) {
7777 node . modifiers . get ( Attributes ) . classList . remove ( ...classes ) ;
7878 }
7979 }
@@ -85,7 +85,7 @@ export class DomHelpers<T extends JWPluginConfig = JWPluginConfig> extends JWPlu
8585 */
8686 toggleClass ( params : { domNode : Node | Node [ ] ; class : string } ) : void {
8787 const classes = Array . isArray ( params . class ) ? params . class : [ params . class ] ;
88- for ( const node of this . _getNodes ( params . domNode ) ) {
88+ for ( const node of this . getNodes ( params . domNode ) ) {
8989 node . modifiers . get ( Attributes ) . classList . toggle ( ...classes ) ;
9090 }
9191 }
@@ -95,7 +95,7 @@ export class DomHelpers<T extends JWPluginConfig = JWPluginConfig> extends JWPlu
9595 * @param params
9696 */
9797 setAttribute ( params : { domNode : Node | Node [ ] ; name : string ; value : string } ) : void {
98- for ( const node of this . _getNodes ( params . domNode ) ) {
98+ for ( const node of this . getNodes ( params . domNode ) ) {
9999 node . modifiers . get ( Attributes ) . set ( params . name , params . value ) ;
100100 }
101101 }
@@ -110,7 +110,7 @@ export class DomHelpers<T extends JWPluginConfig = JWPluginConfig> extends JWPlu
110110 value : string ;
111111 important ?: boolean ;
112112 } ) : void {
113- for ( const node of this . _getNodes ( params . domNode ) ) {
113+ for ( const node of this . getNodes ( params . domNode ) ) {
114114 const value = params . important ? params . value + ' !important' : params . value ;
115115 node . modifiers . get ( Attributes ) . style . set ( params . name , value ) ;
116116 }
@@ -121,7 +121,7 @@ export class DomHelpers<T extends JWPluginConfig = JWPluginConfig> extends JWPlu
121121 * @param params
122122 */
123123 remove ( params : { domNode : Node | Node [ ] } ) : void {
124- for ( const node of this . _getNodes ( params . domNode ) ) {
124+ for ( const node of this . getNodes ( params . domNode ) ) {
125125 node . remove ( ) ;
126126 }
127127 }
@@ -131,7 +131,7 @@ export class DomHelpers<T extends JWPluginConfig = JWPluginConfig> extends JWPlu
131131 * @param params
132132 */
133133 empty ( params : { domNode : Node | Node [ ] } ) : void {
134- for ( const node of this . _getNodes ( params . domNode ) ) {
134+ for ( const node of this . getNodes ( params . domNode ) ) {
135135 node . empty ( ) ;
136136 }
137137 }
@@ -141,7 +141,7 @@ export class DomHelpers<T extends JWPluginConfig = JWPluginConfig> extends JWPlu
141141 * @param params
142142 */
143143 async replace ( params : { domNodes : Node | Node [ ] ; html : string } ) : Promise < void > {
144- const nodes = this . _getNodes ( params . domNodes ) ;
144+ const nodes = this . getNodes ( params . domNodes ) ;
145145 const parsedNodes = await this . _parseHTMLString ( params . html ) ;
146146 const firstNode = nodes [ 0 ] ;
147147 for ( const parsedNode of parsedNodes ) {
@@ -157,7 +157,7 @@ export class DomHelpers<T extends JWPluginConfig = JWPluginConfig> extends JWPlu
157157 * @param params
158158 */
159159 async wrap ( params : { domContainer : Node ; html : string } ) : Promise < void > {
160- const container = this . _getNodes ( params . domContainer ) [ 0 ] ;
160+ const container = this . getNodes ( params . domContainer ) [ 0 ] ;
161161 if ( ! ( container instanceof ContainerNode ) ) {
162162 throw new Error (
163163 'The provided container must be a ContainerNode in the Jabberwock structure.' ,
@@ -174,8 +174,8 @@ export class DomHelpers<T extends JWPluginConfig = JWPluginConfig> extends JWPlu
174174 * @param params
175175 */
176176 moveBefore ( params : { fromDomNode : Node ; toDomNode : Node } ) : void {
177- const toNode = this . _getNodes ( params . toDomNode ) [ 0 ] ;
178- for ( const fromNode of this . _getNodes ( params . fromDomNode ) ) {
177+ const toNode = this . getNodes ( params . toDomNode ) [ 0 ] ;
178+ for ( const fromNode of this . getNodes ( params . fromDomNode ) ) {
179179 fromNode . before ( toNode ) ;
180180 }
181181 }
@@ -185,12 +185,71 @@ export class DomHelpers<T extends JWPluginConfig = JWPluginConfig> extends JWPlu
185185 * @param params
186186 */
187187 moveAfter ( params : { fromDomNode : Node ; toDomNode : Node } ) : void {
188- const toNodes = this . _getNodes ( params . toDomNode ) ;
188+ const toNodes = this . getNodes ( params . toDomNode ) ;
189189 const toNode = toNodes [ toNodes . length - 1 ] ;
190- for ( const fromNode of this . _getNodes ( params . fromDomNode ) . reverse ( ) ) {
190+ for ( const fromNode of this . getNodes ( params . fromDomNode ) . reverse ( ) ) {
191191 fromNode . after ( toNode ) ;
192192 }
193193 }
194+ /**
195+ * Insert html content before, after or inside a DOM Node. If no DOM Node
196+ * was provided, empty the range and insert the html content before the it.
197+ *
198+ * @param params
199+ */
200+ async insertHtml ( params : {
201+ html : string ;
202+ domNode ?: Node ;
203+ position ?: RelativePosition ;
204+ } ) : Promise < VNode [ ] > {
205+ let nodes : VNode [ ] ;
206+ let position : RelativePosition ;
207+ if ( params . domNode ) {
208+ nodes = this . getNodes ( params . domNode ) ;
209+ position = params . position || RelativePosition . BEFORE ;
210+ } else {
211+ this . editor . selection . range . empty ( ) ;
212+ nodes = [ this . editor . selection . range . start ] ;
213+ position = RelativePosition . BEFORE ;
214+ }
215+ const parsedNodes = await this . _parseHTMLString ( params . html ) ;
216+ switch ( position . toUpperCase ( ) ) {
217+ case RelativePosition . BEFORE . toUpperCase ( ) :
218+ for ( const parsedNode of parsedNodes ) {
219+ nodes [ 0 ] . before ( parsedNode ) ;
220+ }
221+ break ;
222+ case RelativePosition . AFTER . toUpperCase ( ) :
223+ for ( const parsedNode of parsedNodes . reverse ( ) ) {
224+ nodes [ nodes . length - 1 ] . after ( parsedNode ) ;
225+ }
226+ break ;
227+ case RelativePosition . INSIDE . toUpperCase ( ) :
228+ for ( const parsedNode of parsedNodes . reverse ( ) ) {
229+ nodes [ nodes . length - 1 ] . append ( parsedNode ) ;
230+ }
231+ break ;
232+ }
233+ return parsedNodes ;
234+ }
235+ /**
236+ * Return the `VNode`(s) matching a DOM Node or a list of DOM Nodes.
237+ *
238+ * @param domNode
239+ */
240+ getNodes ( domNode : Node | Node [ ] ) : VNode [ ] {
241+ const layout = this . editor . plugins . get ( Layout ) ;
242+ const domEngine = layout . engines . dom as DomLayoutEngine ;
243+ let nodes : VNode [ ] = [ ] ;
244+ if ( Array . isArray ( domNode ) ) {
245+ for ( const oneDomNode of domNode ) {
246+ nodes . push ( ...domEngine . getNodes ( oneDomNode ) ) ;
247+ }
248+ } else {
249+ nodes = domEngine . getNodes ( domNode ) ;
250+ }
251+ return nodes ;
252+ }
194253
195254 //--------------------------------------------------------------------------
196255 // Private
@@ -208,17 +267,4 @@ export class DomHelpers<T extends JWPluginConfig = JWPluginConfig> extends JWPlu
208267 div . innerHTML = content ;
209268 return ( await domParser . parse ( div ) ) [ 0 ] . children ( ) ;
210269 }
211- _getNodes ( domNode : Node | Node [ ] ) : VNode [ ] {
212- const layout = this . editor . plugins . get ( Layout ) ;
213- const domEngine = layout . engines . dom as DomLayoutEngine ;
214- let nodes : VNode [ ] = [ ] ;
215- if ( Array . isArray ( domNode ) ) {
216- for ( const oneDomNode of domNode ) {
217- nodes . push ( ...domEngine . getNodes ( oneDomNode ) ) ;
218- }
219- } else {
220- nodes = domEngine . getNodes ( domNode ) ;
221- }
222- return nodes ;
223- }
224270}
0 commit comments