@@ -41,19 +41,38 @@ $(function() {
4141 } ) ;
4242
4343 // show Markdown preview right of <textarea> inputs with class .with-markdown-preview
44- $ ( 'textarea.with-markdown-preview, input[type="text"].with-markdown-preview' ) . each ( function ( ) {
45- let $input = $ ( this ) ;
46- let $row = $ ( '<div>' , { class : 'row' } ) . insertBefore ( $input ) ;
47- let $preview = $ ( '<div>' , { class : 'markdown-preview' } ) . appendTo ( $row ) ;
44+ document . querySelectorAll ( "textarea.with-markdown-preview, input[type=text].with-markdown-preview" ) . forEach ( elem => {
45+ let row = elem . parentNode . parentNode ;
46+ let col = document . createElement ( "div" ) ;
47+ col . className = "col-sm-6" ;
48+ let preview = document . createElement ( "div" ) ;
49+ preview . className = "markdown-preview" ;
4850
49- $input . detach ( ) . prependTo ( $row ) ;
51+ col . append ( preview )
52+ row . append ( col ) ;
5053
51- $input . addClass ( 'col' ) ;
52- $preview . addClass ( 'col' ) ;
54+ elem . addEventListener ( "input" , e => {
55+ preview . innerHTML = marked ( e . target . value ) ;
56+ } ) ;
5357
54- $input . on ( 'change input' , function ( ) {
55- $preview . html ( marked ( $input . val ( ) ) ) ;
56- } ) . change ( ) ;
58+ elem . dispatchEvent ( new Event ( "input" ) ) ;
59+
60+ if ( elem . tagName === "TEXTAREA" ) {
61+ let obs = new ResizeObserver ( ( ) => {
62+ let height = elem . clientHeight ;
63+ // Adding 2px to height to prevent infinity loop of resizing
64+ preview . style . height = `${ height + 2 } px` ;
65+ } ) ;
66+
67+ obs . observe ( elem ) ;
68+
69+ const syncScrolling = ( e , linkedElem ) => {
70+ linkedElem . scrollTop = e . currentTarget . scrollTop ;
71+ }
72+
73+ elem . addEventListener ( "scroll" , e => syncScrolling ( e , preview ) ) ;
74+ preview . addEventListener ( "scroll" , e => syncScrolling ( e , elem ) ) ;
75+ }
5776 } ) ;
5877
5978} ) ;
0 commit comments