ryu1kn/vscode-annotator

View on GitHub
src/lib/annotation-style-builder.ts

Summary

Maintainability
A
2 hrs
Test Coverage
A
100%
import {ConfigStore} from './config-store';

const _map = require('lodash.map');

export class AnnotationStyleBuilder {
    private readonly _configStore: ConfigStore;

    constructor(params) {
        this._configStore = params.configStore;
    }

    build(lineBlames?) {
        return this._getFixedStyle() + this._getAnnotationColoriseStyle(lineBlames);
    }

    _getFixedStyle() {
        const config = this._configStore;
        const fontFamily = config.getEditorConfig('fontFamily');
        const fontSize = config.getEditorConfig('fontSize');
        const lineHeight = config.getEditorConfig('lineHeight');
        const effectiveLineHeight = lineHeight ? (lineHeight / fontSize) : 1.5;
        const annotationColumnWidth = config.getExtensionConfig('annotationColumnWidth');
        const annotationCommitColorBarWidth = config.getExtensionConfig('annotationCommitColorBarWidth');
        const annotationFontColour = config.getExtensionConfig('annotationFontColor');
        const annotationTooltipBackgroundColor =
                config.getExtensionConfig('annotationTooltipBackgroundColor');
        const annotationTooltipWidth = config.getExtensionConfig('annotationTooltipWidth');
        return `
            * {
                font-family: ${fontFamily};
                font-size: ${fontSize}px;
                line-height: ${effectiveLineHeight};
                margin: 0;
            }
            code {
                color: var(--vscode-editor-foreground);
            }
            .line {
                display: -webkit-flex;
                display: flex;
                -webkit-flex-wrap: nowrap;
                flex-wrap: nowrap;
            }
            .annotation {
                position: relative;
                min-width: ${annotationColumnWidth};
                max-width: ${annotationColumnWidth};
                color: ${annotationFontColour};
            }
            .annotation-inner {
                display: block;
                color: inherit;
                text-decoration: none;
                white-space: pre;
                overflow: hidden;
                text-overflow: ellipsis;
            }
            .annotation-inner:hover {
                text-decoration: underline;
            }
            .tooltip {
                display: block;
                position: absolute;
                z-index: 1;
                white-space: pre-wrap;
                width: ${annotationTooltipWidth};
                background-color: ${annotationTooltipBackgroundColor};
                margin-top: -0.5em;
                margin-left: ${annotationColumnWidth};
                padding: .5em;
                border-radius: 5px;
                color: ${annotationFontColour};
            }
            .commitColor {
                min-width: ${annotationCommitColorBarWidth};
                max-width: ${annotationCommitColorBarWidth};
                margin: 0 1em 0 .5em;
            }
        `;
    }

    _getAnnotationColoriseStyle(commitColorMap) {
        return _map(commitColorMap, (color, commitHash) =>
            `.line[data-commitHash="${commitHash}"] > .commitColor {background-color: ${color};}`
        ).join('\n');
    }

}