mirror of
				https://github.com/BookStackApp/BookStack.git
				synced 2025-11-03 02:13:16 +03:00 
			
		
		
		
	Added code to handle scroll for markdown.
Signed-off-by: Abijeet <abijeetpatro@gmail.com>
This commit is contained in:
		@@ -18,6 +18,13 @@ class MarkdownEditor {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        this.onMarkdownScroll = this.onMarkdownScroll.bind(this);
 | 
					        this.onMarkdownScroll = this.onMarkdownScroll.bind(this);
 | 
				
			||||||
        this.init();
 | 
					        this.init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Scroll to text if needed.
 | 
				
			||||||
 | 
					        const queryParams = (new URL(window.location)).searchParams;
 | 
				
			||||||
 | 
					        const scrollText = queryParams.get('content-text');
 | 
				
			||||||
 | 
					        if (scrollText) {
 | 
				
			||||||
 | 
					            this.scrollToText(scrollText);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    init() {
 | 
					    init() {
 | 
				
			||||||
@@ -387,6 +394,34 @@ class MarkdownEditor {
 | 
				
			|||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Scroll to a specified text
 | 
				
			||||||
 | 
					    scrollToText(searchText) {;
 | 
				
			||||||
 | 
					        if (!searchText) {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        const content = this.cm.getValue();
 | 
				
			||||||
 | 
					        const lines = content.split(/\r?\n/);
 | 
				
			||||||
 | 
					        let lineNumber = -1;
 | 
				
			||||||
 | 
					        for (let i = 0; i !== lines.length; ++i) {
 | 
				
			||||||
 | 
					            const line = lines[i];
 | 
				
			||||||
 | 
					            if (!line) {
 | 
				
			||||||
 | 
					                continue;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (line.indexOf(searchText) !== -1) {
 | 
				
			||||||
 | 
					                lineNumber = i;
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (lineNumber !== -1) {
 | 
				
			||||||
 | 
					            this.cm.scrollIntoView({
 | 
				
			||||||
 | 
					                line: lineNumber,
 | 
				
			||||||
 | 
					                char: lines[lineNumber].length
 | 
				
			||||||
 | 
					            }, 200);
 | 
				
			||||||
 | 
					            this.cm.focus();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = MarkdownEditor ;
 | 
					module.exports = MarkdownEditor ;
 | 
				
			||||||
@@ -222,7 +222,7 @@ class PageDisplay {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    setupEditOnHeader() {
 | 
					    setupEditOnHeader() {
 | 
				
			||||||
        const headingEditIcon = document.querySelector('.heading-edit-icon');
 | 
					        const headingEditIcon = document.querySelector('.heading-edit-icon');
 | 
				
			||||||
        if (headingEditIcon.length === 0) {
 | 
					        if (headingEditIcon === null) {
 | 
				
			||||||
            // user does not have permission to edit.
 | 
					            // user does not have permission to edit.
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -239,7 +239,10 @@ class PageDisplay {
 | 
				
			|||||||
            const headingId = currHeading.id;
 | 
					            const headingId = currHeading.id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            let editIcon = visibleHeadingEditIcon.cloneNode(true);
 | 
					            let editIcon = visibleHeadingEditIcon.cloneNode(true);
 | 
				
			||||||
            editIcon.href += `#${headingId}`;
 | 
					
 | 
				
			||||||
 | 
					            // get the first 50 characters.
 | 
				
			||||||
 | 
					            let queryContent = currHeading.textContent && currHeading.textContent.substring(0, 50);
 | 
				
			||||||
 | 
					            editIcon.href += `?content-id=${headingId}&content-text=${encodeURIComponent(queryContent)}`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            currHeading.appendChild(editIcon);
 | 
					            currHeading.appendChild(editIcon);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -483,22 +483,25 @@ class WysiwygEditor {
 | 
				
			|||||||
            },
 | 
					            },
 | 
				
			||||||
            setup: function (editor) {
 | 
					            setup: function (editor) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                editor.on('init ExecCommand change input NodeChange ObjectResized', editorChange);
 | 
					                editor.on('ExecCommand change input NodeChange ObjectResized', editorChange);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                editor.on('init', () => {
 | 
				
			||||||
 | 
					                    editorChange();
 | 
				
			||||||
 | 
					                    // Scroll to the content if needed.
 | 
				
			||||||
 | 
					                    const queryParams = (new URL(window.location)).searchParams;
 | 
				
			||||||
 | 
					                    const scrollId = queryParams.get('content-id');
 | 
				
			||||||
 | 
					                    if (scrollId) {
 | 
				
			||||||
 | 
					                        scrollToText(scrollId);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                function editorChange() {
 | 
					                function editorChange() {
 | 
				
			||||||
                    let content = editor.getContent();
 | 
					                    let content = editor.getContent();
 | 
				
			||||||
                    window.$events.emit('editor-html-change', content);
 | 
					                    window.$events.emit('editor-html-change', content);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                window.$events.listen('editor-html-update', html => {
 | 
					                function scrollToText(scrollId) {
 | 
				
			||||||
                    editor.setContent(html);
 | 
					                    const element = editor.dom.get(scrollId)
 | 
				
			||||||
                    editor.selection.select(editor.getBody(), true);
 | 
					 | 
				
			||||||
                    editor.selection.collapse(false);
 | 
					 | 
				
			||||||
                    editorChange(html);
 | 
					 | 
				
			||||||
                });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                window.$events.listen('editor-scroll-to-text', textId => {
 | 
					 | 
				
			||||||
                    const element = editor.dom.get(textId)
 | 
					 | 
				
			||||||
                    if (!element) {
 | 
					                    if (!element) {
 | 
				
			||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -508,6 +511,13 @@ class WysiwygEditor {
 | 
				
			|||||||
                    editor.selection.select(element, true);
 | 
					                    editor.selection.select(element, true);
 | 
				
			||||||
                    editor.selection.collapse(false);
 | 
					                    editor.selection.collapse(false);
 | 
				
			||||||
                    editor.focus();
 | 
					                    editor.focus();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                window.$events.listen('editor-html-update', html => {
 | 
				
			||||||
 | 
					                    editor.setContent(html);
 | 
				
			||||||
 | 
					                    editor.selection.select(editor.getBody(), true);
 | 
				
			||||||
 | 
					                    editor.selection.collapse(false);
 | 
				
			||||||
 | 
					                    editorChange(html);
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                registerEditorShortcuts(editor);
 | 
					                registerEditorShortcuts(editor);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,13 +43,6 @@ function mounted() {
 | 
				
			|||||||
    window.$events.listen('editor-markdown-change', markdown => {
 | 
					    window.$events.listen('editor-markdown-change', markdown => {
 | 
				
			||||||
        this.editorMarkdown = markdown;
 | 
					        this.editorMarkdown = markdown;
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					 | 
				
			||||||
    const scrollToText = window.location.hash ? window.location.hash.substr(1) : '';
 | 
					 | 
				
			||||||
    if (scrollToText) {
 | 
					 | 
				
			||||||
        setTimeout(() => {
 | 
					 | 
				
			||||||
            window.$events.emit('editor-scroll-to-text', scrollToText);
 | 
					 | 
				
			||||||
        }, 1000)
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let data = {
 | 
					let data = {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user