astro-ghostcms/.pnpm-store/v3/files/94/6f479679e1f56488f6b4db2c339...

162 lines
7.1 KiB
Plaintext

(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", "../parser/cssNodes", "../languageFacts/facts", "./selectorPrinting", "../utils/strings", "../cssLanguageTypes", "../utils/objects"], 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.CSSHover = void 0;
const nodes = require("../parser/cssNodes");
const languageFacts = require("../languageFacts/facts");
const selectorPrinting_1 = require("./selectorPrinting");
const strings_1 = require("../utils/strings");
const cssLanguageTypes_1 = require("../cssLanguageTypes");
const objects_1 = require("../utils/objects");
class CSSHover {
constructor(clientCapabilities, cssDataManager) {
this.clientCapabilities = clientCapabilities;
this.cssDataManager = cssDataManager;
this.selectorPrinting = new selectorPrinting_1.SelectorPrinting(cssDataManager);
}
configure(settings) {
this.defaultSettings = settings;
}
doHover(document, position, stylesheet, settings = this.defaultSettings) {
function getRange(node) {
return cssLanguageTypes_1.Range.create(document.positionAt(node.offset), document.positionAt(node.end));
}
const offset = document.offsetAt(position);
const nodepath = nodes.getNodePath(stylesheet, offset);
/**
* nodepath is top-down
* Build up the hover by appending inner node's information
*/
let hover = null;
for (let i = 0; i < nodepath.length; i++) {
const node = nodepath[i];
if (node instanceof nodes.Selector) {
hover = {
contents: this.selectorPrinting.selectorToMarkedString(node),
range: getRange(node)
};
break;
}
if (node instanceof nodes.SimpleSelector) {
/**
* Some sass specific at rules such as `@at-root` are parsed as `SimpleSelector`
*/
if (!(0, strings_1.startsWith)(node.getText(), '@')) {
hover = {
contents: this.selectorPrinting.simpleSelectorToMarkedString(node),
range: getRange(node)
};
}
break;
}
if (node instanceof nodes.Declaration) {
const propertyName = node.getFullPropertyName();
const entry = this.cssDataManager.getProperty(propertyName);
if (entry) {
const contents = languageFacts.getEntryDescription(entry, this.doesSupportMarkdown(), settings);
if (contents) {
hover = {
contents,
range: getRange(node)
};
}
else {
hover = null;
}
}
continue;
}
if (node instanceof nodes.UnknownAtRule) {
const atRuleName = node.getText();
const entry = this.cssDataManager.getAtDirective(atRuleName);
if (entry) {
const contents = languageFacts.getEntryDescription(entry, this.doesSupportMarkdown(), settings);
if (contents) {
hover = {
contents,
range: getRange(node)
};
}
else {
hover = null;
}
}
continue;
}
if (node instanceof nodes.Node && node.type === nodes.NodeType.PseudoSelector) {
const selectorName = node.getText();
const entry = selectorName.slice(0, 2) === '::'
? this.cssDataManager.getPseudoElement(selectorName)
: this.cssDataManager.getPseudoClass(selectorName);
if (entry) {
const contents = languageFacts.getEntryDescription(entry, this.doesSupportMarkdown(), settings);
if (contents) {
hover = {
contents,
range: getRange(node)
};
}
else {
hover = null;
}
}
continue;
}
}
if (hover) {
hover.contents = this.convertContents(hover.contents);
}
return hover;
}
convertContents(contents) {
if (!this.doesSupportMarkdown()) {
if (typeof contents === 'string') {
return contents;
}
// MarkupContent
else if ('kind' in contents) {
return {
kind: 'plaintext',
value: contents.value
};
}
// MarkedString[]
else if (Array.isArray(contents)) {
return contents.map(c => {
return typeof c === 'string' ? c : c.value;
});
}
// MarkedString
else {
return contents.value;
}
}
return contents;
}
doesSupportMarkdown() {
if (!(0, objects_1.isDefined)(this.supportsMarkdown)) {
if (!(0, objects_1.isDefined)(this.clientCapabilities)) {
this.supportsMarkdown = true;
return this.supportsMarkdown;
}
const hover = this.clientCapabilities.textDocument && this.clientCapabilities.textDocument.hover;
this.supportsMarkdown = hover && hover.contentFormat && Array.isArray(hover.contentFormat) && hover.contentFormat.indexOf(cssLanguageTypes_1.MarkupKind.Markdown) !== -1;
}
return this.supportsMarkdown;
}
}
exports.CSSHover = CSSHover;
});