(function (factory) {
    if (typeof module === "object" && typeof module.exports === "object") {
        var v = factory(require, exports);
        if (v !== undefined) module.exports = v;
    }
    else if (typeof define === "function" && define.amd) {
        define(["require", "exports", "../cssLanguageTypes"], factory);
    }
})(function (require, exports) {
    /*---------------------------------------------------------------------------------------------
     *  Copyright (c) Microsoft Corporation. All rights reserved.
     *  Licensed under the MIT License. See License.txt in the project root for license information.
     *--------------------------------------------------------------------------------------------*/
    'use strict';
    Object.defineProperty(exports, "__esModule", { value: true });
    exports.getBrowserLabel = exports.textToMarkedString = exports.getEntryDescription = exports.browserNames = void 0;
    const cssLanguageTypes_1 = require("../cssLanguageTypes");
    exports.browserNames = {
        E: 'Edge',
        FF: 'Firefox',
        S: 'Safari',
        C: 'Chrome',
        IE: 'IE',
        O: 'Opera'
    };
    function getEntryStatus(status) {
        switch (status) {
            case 'experimental':
                return '⚠️ Property is experimental. Be cautious when using it.️\n\n';
            case 'nonstandard':
                return '🚨️ Property is nonstandard. Avoid using it.\n\n';
            case 'obsolete':
                return '🚨️️️ Property is obsolete. Avoid using it.\n\n';
            default:
                return '';
        }
    }
    function getEntryDescription(entry, doesSupportMarkdown, settings) {
        let result;
        if (doesSupportMarkdown) {
            result = {
                kind: 'markdown',
                value: getEntryMarkdownDescription(entry, settings)
            };
        }
        else {
            result = {
                kind: 'plaintext',
                value: getEntryStringDescription(entry, settings)
            };
        }
        if (result.value === '') {
            return undefined;
        }
        return result;
    }
    exports.getEntryDescription = getEntryDescription;
    function textToMarkedString(text) {
        text = text.replace(/[\\`*_{}[\]()#+\-.!]/g, '\\$&'); // escape markdown syntax tokens: http://daringfireball.net/projects/markdown/syntax#backslash
        return text.replace(/</g, '&lt;').replace(/>/g, '&gt;');
    }
    exports.textToMarkedString = textToMarkedString;
    function getEntryStringDescription(entry, settings) {
        if (!entry.description || entry.description === '') {
            return '';
        }
        if (typeof entry.description !== 'string') {
            return entry.description.value;
        }
        let result = '';
        if (settings?.documentation !== false) {
            if (entry.status) {
                result += getEntryStatus(entry.status);
            }
            result += entry.description;
            const browserLabel = getBrowserLabel(entry.browsers);
            if (browserLabel) {
                result += '\n(' + browserLabel + ')';
            }
            if ('syntax' in entry) {
                result += `\n\nSyntax: ${entry.syntax}`;
            }
        }
        if (entry.references && entry.references.length > 0 && settings?.references !== false) {
            if (result.length > 0) {
                result += '\n\n';
            }
            result += entry.references.map(r => {
                return `${r.name}: ${r.url}`;
            }).join(' | ');
        }
        return result;
    }
    function getEntryMarkdownDescription(entry, settings) {
        if (!entry.description || entry.description === '') {
            return '';
        }
        let result = '';
        if (settings?.documentation !== false) {
            if (entry.status) {
                result += getEntryStatus(entry.status);
            }
            if (typeof entry.description === 'string') {
                result += textToMarkedString(entry.description);
            }
            else {
                result += entry.description.kind === cssLanguageTypes_1.MarkupKind.Markdown ? entry.description.value : textToMarkedString(entry.description.value);
            }
            const browserLabel = getBrowserLabel(entry.browsers);
            if (browserLabel) {
                result += '\n\n(' + textToMarkedString(browserLabel) + ')';
            }
            if ('syntax' in entry && entry.syntax) {
                result += `\n\nSyntax: ${textToMarkedString(entry.syntax)}`;
            }
        }
        if (entry.references && entry.references.length > 0 && settings?.references !== false) {
            if (result.length > 0) {
                result += '\n\n';
            }
            result += entry.references.map(r => {
                return `[${r.name}](${r.url})`;
            }).join(' | ');
        }
        return result;
    }
    /**
     * Input is like `["E12","FF49","C47","IE","O"]`
     * Output is like `Edge 12, Firefox 49, Chrome 47, IE, Opera`
     */
    function getBrowserLabel(browsers = []) {
        if (browsers.length === 0) {
            return null;
        }
        return browsers
            .map(b => {
            let result = '';
            const matches = b.match(/([A-Z]+)(\d+)?/);
            const name = matches[1];
            const version = matches[2];
            if (name in exports.browserNames) {
                result += exports.browserNames[name];
            }
            if (version) {
                result += ' ' + version;
            }
            return result;
        })
            .join(', ');
    }
    exports.getBrowserLabel = getBrowserLabel;
});
