mirror of
				https://github.com/We-Dont-Byte/Mind_Reader.git
				synced 2025-02-04 10:38:42 +00:00 
			
		
		
		
	Added lineHighlighter.ts
This commit is contained in:
		
							
								
								
									
										364
									
								
								src/lineHighlighter.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										364
									
								
								src/lineHighlighter.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,364 @@
 | 
			
		||||
/**
 | 
			
		||||
* ? ██╗  ██╗██╗ ██████╗ ██╗  ██╗██╗     ██╗ ██████╗ ██╗  ██╗████████╗      ██╗████████╗
 | 
			
		||||
* ? ██║  ██║██║██╔════╝ ██║  ██║██║     ██║██╔════╝ ██║  ██║╚══██╔══╝      ██║╚══██╔══╝
 | 
			
		||||
* ? ███████║██║██║  ███╗███████║██║     ██║██║  ███╗███████║   ██║   █████╗██║   ██║
 | 
			
		||||
* ? ██╔══██║██║██║   ██║██╔══██║██║     ██║██║   ██║██╔══██║   ██║   ╚════╝██║   ██║
 | 
			
		||||
* ? ██║  ██║██║╚██████╔╝██║  ██║███████╗██║╚██████╔╝██║  ██║   ██║         ██║   ██║
 | 
			
		||||
* ? ╚═╝  ╚═╝╚═╝ ╚═════╝ ╚═╝  ╚═╝╚══════╝╚═╝ ╚═════╝ ╚═╝  ╚═╝   ╚═╝         ╚═╝   ╚═╝
 | 
			
		||||
**/
 | 
			
		||||
import { Position, window, workspace, TextEditorDecorationType, TextEditor, WorkspaceConfiguration, Range } from 'vscode';
 | 
			
		||||
 | 
			
		||||
export { lineHighlighter };
 | 
			
		||||
 | 
			
		||||
let highlightStyle: TextEditorDecorationType;
 | 
			
		||||
 | 
			
		||||
function lineHighlighter(): void {
 | 
			
		||||
    let highlightStyle    : TextEditorDecorationType = getHighlighterStyle();
 | 
			
		||||
    let activeTextEditor  : TextEditor | undefined   = window.activeTextEditor;
 | 
			
		||||
    let isEnabled         : boolean    | undefined   = getHighlighterStatus();
 | 
			
		||||
    let multiLineIsEnabled: boolean    | undefined   = getMultiLineHighlighterStatus();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     *  Trigger the line highlight when the extension
 | 
			
		||||
     *  loads so current line gets highlighted
 | 
			
		||||
     */
 | 
			
		||||
    triggerHighlight();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Trigger for when the active text editor changes
 | 
			
		||||
     */
 | 
			
		||||
    window.onDidChangeActiveTextEditor((editor) => {
 | 
			
		||||
        if (!editor) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        triggerHighlight();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     *  Trigger for when text selection changes
 | 
			
		||||
     */
 | 
			
		||||
    window.onDidChangeTextEditorSelection((editor) => {
 | 
			
		||||
        if (!editor.textEditor) {
 | 
			
		||||
            console.error(`[*] onDidChangeTextEditorSelection(${editor}) -> no active text editor`);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        triggerHighlight();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Trigger for when the text document changes
 | 
			
		||||
     */
 | 
			
		||||
    workspace.onDidChangeTextDocument((editor) => {
 | 
			
		||||
        if (!activeTextEditor) {
 | 
			
		||||
            console.error(`[*] onDidChangeTextDocument(${editor}) -> no active text editor`);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        triggerHighlight();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Trigger for when the window state changes
 | 
			
		||||
     */
 | 
			
		||||
    window.onDidChangeWindowState((editor) => {
 | 
			
		||||
        if (!editor) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        triggerHighlight();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Trigger for when configuration changes
 | 
			
		||||
     */
 | 
			
		||||
    workspace.onDidChangeConfiguration((editor) => {
 | 
			
		||||
        if (!editor) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Dump existing styling
 | 
			
		||||
        highlightStyle.dispose();
 | 
			
		||||
        // check if line highlighter is enable/disabled
 | 
			
		||||
        isEnabled          = getHighlighterStatus();
 | 
			
		||||
        multiLineIsEnabled = getMultiLineHighlighterStatus();
 | 
			
		||||
        // get new line highlighter styling
 | 
			
		||||
        highlightStyle     = getHighlighterStyle();
 | 
			
		||||
        // trigger highlight with new styling
 | 
			
		||||
        triggerHighlight();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * main function that triggers the highlights
 | 
			
		||||
     */
 | 
			
		||||
    function triggerHighlight(): void {
 | 
			
		||||
        if (!activeTextEditor) {
 | 
			
		||||
            console.error("[*] NO Active Text Editor");
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Sets the activeTextEditor to the current active window
 | 
			
		||||
         */
 | 
			
		||||
        activeTextEditor  = window.activeTextEditor;
 | 
			
		||||
        if (activeTextEditor !== undefined) {
 | 
			
		||||
            /**
 | 
			
		||||
             * If the line highlighter function is enabled
 | 
			
		||||
             *      set the decorations with our chosen highlighting style on the selection
 | 
			
		||||
             *      otherwise (highlighter is disabled) dump our highlighting style
 | 
			
		||||
             */
 | 
			
		||||
            // (isEnabled)
 | 
			
		||||
            //     ? activeTextEditor!.setDecorations(highlightStyle, activeTextEditor!.selections)
 | 
			
		||||
            //     : highlightStyle.dispose();
 | 
			
		||||
            switch (isEnabled) {
 | 
			
		||||
                case true: // isEnabled is true
 | 
			
		||||
                    switch (multiLineIsEnabled) {
 | 
			
		||||
                        case true: // isEnabled is true and multiLineIsEnabled is true
 | 
			
		||||
                            // const startLine = activeTextEditor!.selection.start;
 | 
			
		||||
                            // const endLine   = activeTextEditor!.selection.end;
 | 
			
		||||
                            // const rangeToHighlight = { range: new Range(startLine, endLine) };
 | 
			
		||||
                            // activeTextEditor!.setDecorations(highlightStyle, [rangeToHighlight]);
 | 
			
		||||
                            // const currentLineRange = activeTextEditor!.document.lineAt(activeTextEditor!.selection.anchor).range;
 | 
			
		||||
                            // activeTextEditor!.setDecorations(highlightStyle, [currentLineRange]);
 | 
			
		||||
                            // const startLine = activeTextEditor!.selection.start.line;
 | 
			
		||||
                            // const endLine   = activeTextEditor!.selection.end;
 | 
			
		||||
                            // const rangeToHighlight = { range: new Range(startLine, endLine) };
 | 
			
		||||
                            activeTextEditor.setDecorations(highlightStyle, activeTextEditor.selections);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case false: // isEnabled is true and multiLineIsEnabled is false
 | 
			
		||||
                            switch (activeTextEditor.selection.isSingleLine) {
 | 
			
		||||
                                case true: // isEnabled is true and multiLineIsEnabled is false and VSCode is reporting a single line
 | 
			
		||||
                                    let currentPosition = [];
 | 
			
		||||
                                    for (let i = 0; i < activeTextEditor.selections.length; i++) {
 | 
			
		||||
                                        currentPosition[i] = { range: new Range(activeTextEditor.selections[i].anchor, activeTextEditor.selections[i].anchor) };
 | 
			
		||||
                                    }
 | 
			
		||||
 | 
			
		||||
                                    activeTextEditor.setDecorations(highlightStyle, currentPosition);
 | 
			
		||||
                                    // const currentLine = activeTextEditor.selection.active.line;
 | 
			
		||||
                                    // const newDecoration = { range: new Range(currentPosition, currentPosition) };
 | 
			
		||||
                                    // const singleLineHighlight = { range: new Range(activeTextEditor!.selection.anchor.line, activeTextEditor!.selection.anchor.line) };
 | 
			
		||||
                                    // activeTextEditor!.setDecorations(highlightStyle, [singleLineRange]);
 | 
			
		||||
                                    // activeTextEditor.setDecorations(highlightStyle, [activeTextEditor.selection]);
 | 
			
		||||
                                    break;
 | 
			
		||||
                                case false: // isEnabled is true and multiLineIsEnabled is false and VSCode is reporting multiple lines
 | 
			
		||||
                                    // Dispose of our highlighting style so multiple lines aren't all highlighted when clicking and dragging to highlight
 | 
			
		||||
                                    // highlightStyle.dispose();
 | 
			
		||||
                                    activeTextEditor.setDecorations(highlightStyle, []);
 | 
			
		||||
                                    // Since we disposed of our highlighting style, we need to re-acquire it for highlighting to continue to work after clicking and dragging to highlight
 | 
			
		||||
                                    // highlightStyle = getHighlighterStyle();
 | 
			
		||||
                                    break;
 | 
			
		||||
                                default: // isEnabled is true and multiLineIsEnabled is false and VSCode is reporting something else - break out of 3rd switch
 | 
			
		||||
                                    break;
 | 
			
		||||
                            }
 | 
			
		||||
                            break;
 | 
			
		||||
                        default: // isEnabled is true and multiLineIsEnabled is undetected - break out of 2nd switch statement
 | 
			
		||||
                            break;
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
                case false: // isEnabled is false
 | 
			
		||||
                    highlightStyle.dispose();
 | 
			
		||||
                    break;
 | 
			
		||||
                default: // break out of initial switch is true or false not found
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            //  Track new position, without this the line the the cursor begins on will never get styled
 | 
			
		||||
            new Position(activeTextEditor.selection.start.line, activeTextEditor.selection.start.character);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Function to get the user configured highlighting styles, or use defaults
 | 
			
		||||
     *
 | 
			
		||||
     * Designed with user configuration in mind, able to control different sides
 | 
			
		||||
     * independently from each other (in most cases). This allows for many different
 | 
			
		||||
     * configurations.
 | 
			
		||||
     *
 | 
			
		||||
     * @returns highlighterStyle
 | 
			
		||||
     */
 | 
			
		||||
    function getHighlighterStyle(): TextEditorDecorationType {
 | 
			
		||||
        // Used so we don't have to type out workspace.getConfiguration('mind-reader.lineHighlight') on every line, ie: shorthand
 | 
			
		||||
        const userConfig: WorkspaceConfiguration = workspace.getConfiguration('mind-reader.lineHighlight');
 | 
			
		||||
 | 
			
		||||
        const borderWidthTop    : string = userConfig.get('borderWidthTop')    || "1px";
 | 
			
		||||
        const borderWidthRight  : string = userConfig.get('borderWidthRight')  || "16px";
 | 
			
		||||
        const borderWidthBottom : string = userConfig.get('borderWidthBottom') || "1px";
 | 
			
		||||
        const borderWidthLeft   : string = userConfig.get('borderWidthLeft')   || "1px";
 | 
			
		||||
 | 
			
		||||
        const borderStyleTop    : string = userConfig.get('borderStyleTop')    || "solid";
 | 
			
		||||
        const borderStyleRight  : string = userConfig.get('borderStyleRight')  || "solid";
 | 
			
		||||
        const borderStyleBottom : string = userConfig.get('borderStyleBottom') || "solid";
 | 
			
		||||
        const borderStyleLeft   : string = userConfig.get('borderStyleLeft')   || "solid";
 | 
			
		||||
 | 
			
		||||
        const borderColorTop    : string = userConfig.get('borderColorTop')    || "#FFFFFF";
 | 
			
		||||
        const borderColorRight  : string = userConfig.get('borderColorRight')  || "#FFFFFF";
 | 
			
		||||
        const borderColorBottom : string = userConfig.get('borderColorBottom') || "#FFFFFF";
 | 
			
		||||
        const borderColorLeft   : string = userConfig.get('borderColorLeft')   || "#FFFFFF";
 | 
			
		||||
 | 
			
		||||
        const backgroundColor   : string = userConfig.get('backgroundColor')   || "#232C5C";
 | 
			
		||||
 | 
			
		||||
        const fontStyle         : string = userConfig.get('fontStyle')         || "normal";
 | 
			
		||||
        const fontWeight        : string = userConfig.get('fontWeight')        || "bolder";
 | 
			
		||||
        const outlineColor      : string = userConfig.get('outlineColor')      || "#4866FE";
 | 
			
		||||
        const outlineStyle      : string = userConfig.get('outlineStyle')      || "solid";
 | 
			
		||||
        const outlineWidth      : string = userConfig.get('outlineWidth')      || "1px";
 | 
			
		||||
        const textDecoration    : string = userConfig.get('textDecoration')    || "none";
 | 
			
		||||
        const textColor         : string = userConfig.get('textColor')         || "#FFFFFF";
 | 
			
		||||
 | 
			
		||||
        // Combine all our styling into a single variable to return
 | 
			
		||||
        const highlighterStyle  : TextEditorDecorationType  = window.createTextEditorDecorationType({
 | 
			
		||||
            isWholeLine         : true,
 | 
			
		||||
            backgroundColor     : `${backgroundColor}`,
 | 
			
		||||
            fontStyle           : `${fontStyle}`,
 | 
			
		||||
            fontWeight          : `${fontWeight}`,
 | 
			
		||||
            textDecoration      : `${textDecoration}`,
 | 
			
		||||
            color               : `${textColor}`,
 | 
			
		||||
            borderColor         : `${borderColorTop} ${borderColorRight} ${borderColorBottom} ${borderColorLeft}`,
 | 
			
		||||
            borderWidth         : `${borderWidthTop} ${borderWidthRight} ${borderWidthBottom} ${borderWidthLeft}`,
 | 
			
		||||
            borderStyle         : `${borderStyleTop} ${borderStyleRight} ${borderStyleBottom} ${borderStyleLeft}`,
 | 
			
		||||
            outlineColor        : `${outlineColor}`,
 | 
			
		||||
            outlineWidth        : `${outlineWidth}`,
 | 
			
		||||
            outlineStyle        : `${outlineStyle}`,
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // Return our variable
 | 
			
		||||
        return highlighterStyle;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Function to retrieve the 'isEnabled' status
 | 
			
		||||
     *
 | 
			
		||||
     * This will determine if the line highlighter will display or not
 | 
			
		||||
     *      - enabled  -> will show
 | 
			
		||||
     *      - disabled -> will not show
 | 
			
		||||
     *
 | 
			
		||||
     * @returns enabledStatus
 | 
			
		||||
     */
 | 
			
		||||
    function getHighlighterStatus(): boolean | undefined {
 | 
			
		||||
        // set a boolean variable
 | 
			
		||||
        let enabledStatus: boolean | undefined;
 | 
			
		||||
 | 
			
		||||
        /***
 | 
			
		||||
         * if "isEnabled" is missing from the settings (aka undefined)
 | 
			
		||||
         *      - set our variable to true (default)
 | 
			
		||||
         * otherwise, "isEnabled" is listed in the settings
 | 
			
		||||
         *      - so we just pull its value
 | 
			
		||||
         */
 | 
			
		||||
        (workspace.getConfiguration("mind-reader.lineHighlight").get("isEnabled") === undefined)
 | 
			
		||||
            ? (enabledStatus = true)
 | 
			
		||||
            : (enabledStatus = workspace.getConfiguration("mind-reader.lineHighlight").get("isEnabled"));
 | 
			
		||||
 | 
			
		||||
        // return the enabledStatus
 | 
			
		||||
        return enabledStatus;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function getMultiLineHighlighterStatus(): boolean | undefined {
 | 
			
		||||
        // set a boolean variable
 | 
			
		||||
        let multiLineIsEnabled: boolean | undefined;
 | 
			
		||||
 | 
			
		||||
        /***
 | 
			
		||||
         * if "isEnabled" is missing from the settings (aka undefined)
 | 
			
		||||
         *      - set our variable to true (default)
 | 
			
		||||
         * otherwise, "isEnabled" is listed in the settings
 | 
			
		||||
         *      - so we just pull its value
 | 
			
		||||
         */
 | 
			
		||||
        (workspace.getConfiguration("mind-reader.lineHighlight").get("multiLineIsEnabled") === undefined)
 | 
			
		||||
            ? (multiLineIsEnabled = true)
 | 
			
		||||
            : (multiLineIsEnabled = workspace.getConfiguration("mind-reader.lineHighlight").get("multiLineIsEnabled"));
 | 
			
		||||
 | 
			
		||||
        // return the enabledStatus
 | 
			
		||||
        return multiLineIsEnabled;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Clean-up after ourself
 | 
			
		||||
export function deactivate() {
 | 
			
		||||
	// when the plugin is terminated remove all highlighting
 | 
			
		||||
	if (highlightStyle !== undefined) {
 | 
			
		||||
		highlightStyle.dispose();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Border Width Settings
 | 
			
		||||
         *      borderWidthTop    = Top    Border Width
 | 
			
		||||
         *      borderWidthRight  = Right  Border Width * Right border is a little finicky, I have all others at 1px, but need 15px for this one to match
 | 
			
		||||
         *      borderWidthBottom = Bottom Border Width
 | 
			
		||||
         *      borderWidthLeft   = Left   Border Width
 | 
			
		||||
         *
 | 
			
		||||
         * Uses CSS so should accept:
 | 
			
		||||
         *      thin | medium | thick
 | 
			
		||||
         *      px
 | 
			
		||||
         *      rem
 | 
			
		||||
         *      em
 | 
			
		||||
         *      cm
 | 
			
		||||
         *      % - Weird behavior
 | 
			
		||||
         *      inherit
 | 
			
		||||
         *
 | 
			
		||||
         * If no value is found in the settings, we set the value after the double pipes (||) instead
 | 
			
		||||
         */
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Border Style Settings
 | 
			
		||||
         *      borderStyleTop    = Top    Border Style
 | 
			
		||||
         *      borderStyleRight  = Right  Border Style
 | 
			
		||||
         *      borderStyleBottom = Bottom Border Style
 | 
			
		||||
         *      borderStyleLeft   = Left   Border Style
 | 
			
		||||
         *
 | 
			
		||||
         * Uses CSS so should accept: (Some of them I can't tell a difference, but they do something)
 | 
			
		||||
         *      none
 | 
			
		||||
         *      hidden
 | 
			
		||||
         *      dotted
 | 
			
		||||
         *      dashed
 | 
			
		||||
         *      solid
 | 
			
		||||
         *      double
 | 
			
		||||
         *      groove
 | 
			
		||||
         *      ridge
 | 
			
		||||
         *      inset
 | 
			
		||||
         *      outset
 | 
			
		||||
         *
 | 
			
		||||
         * If no value is found in the settings, we set the value after the double pipes (||) instead
 | 
			
		||||
         */
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Border Color Settings
 | 
			
		||||
         *      borderColorRight  = Right  Border Color
 | 
			
		||||
         *      borderColorBottom = Bottom Border Color
 | 
			
		||||
         *      borderColorTop    = Top    Border Color
 | 
			
		||||
         *      borderColorLeft   = Left   Border Color
 | 
			
		||||
         *
 | 
			
		||||
         * Uses CSS so should accept: (Some of them I can't tell a difference, but they do something)
 | 
			
		||||
         *      none - This one doesn't play nice
 | 
			
		||||
         *      string value like "red" | "blue" | "orange" etc - https://www.w3schools.com/cssref/css_colors.asp
 | 
			
		||||
         *      #<value>
 | 
			
		||||
         *      rgb(###, ###, ###)
 | 
			
		||||
         *      rgba(###, ###, ###, ###)
 | 
			
		||||
         *      hsla(##, ##%, ##%, .#);
 | 
			
		||||
         *      inherit - This one has weird behavior as well
 | 
			
		||||
         *
 | 
			
		||||
         * If no value is found in the settings, we set the value after the double pipes (||) instead
 | 
			
		||||
         */
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Color of the background
 | 
			
		||||
         *
 | 
			
		||||
         * Uses CSS so should accept:
 | 
			
		||||
         *      none - This one doesn't play nice
 | 
			
		||||
         *      string value like "red" | "blue" | "orange" etc - https://www.w3schools.com/cssref/css_colors.asp
 | 
			
		||||
         *      #<value>
 | 
			
		||||
         *      rgb(###, ###, ###)
 | 
			
		||||
         *      rgba(###, ###, ###, ###)
 | 
			
		||||
         *      hsla(##, ##%, ##%, .#);
 | 
			
		||||
         *      inherit - This one has weird behavior as well
 | 
			
		||||
         *
 | 
			
		||||
         * If no value is found in the settings, we set the value after the double pipes (||) instead
 | 
			
		||||
         */
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * font-style: normal|italic|oblique|initial|inherit
 | 
			
		||||
         */
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * font-weight: normal|bold|bolder|lighter|number|initial|inherit
 | 
			
		||||
         */
 | 
			
		||||
		Reference in New Issue
	
	Block a user