@shopify/theme-language-server-common
Version: 
<h1 align="center" style="position: relative;" > <br> <img src="https://github.com/Shopify/theme-check-vscode/blob/main/images/shopify_glyph.png?raw=true" alt="logo" width="141" height="160"> <br> Theme Language Server </h1>
53 lines (49 loc) • 1.88 kB
text/typescript
import { NodeTypes } from '@shopify/liquid-html-parser';
import { LiquidHtmlNode } from '@shopify/theme-check-common';
import { Hover } from 'vscode-languageserver';
import { HtmlData, renderHtmlEntry } from '../../docset';
import {
  findLast,
  getCompoundName,
  isHtmlAttribute,
  isNamedHtmlElementNode,
  isTextNode,
} from '../../utils';
import { BaseHoverProvider } from '../BaseHoverProvider';
export class HtmlAttributeValueHoverProvider implements BaseHoverProvider {
  async hover(currentNode: LiquidHtmlNode, ancestors: LiquidHtmlNode[]): Promise<Hover | null> {
    const attributeNode = findLast(ancestors, isHtmlAttribute);
    const tagNode = findLast(ancestors, isNamedHtmlElementNode);
    if (
      !isTextNode(currentNode) ||
      !attributeNode ||
      !tagNode ||
      !isHtmlAttribute(attributeNode) ||
      !isNamedHtmlElementNode(tagNode) ||
      attributeNode.type === NodeTypes.AttrEmpty ||
      attributeNode.value.length !== 1 ||
      !attributeNode.value.includes(currentNode)
    ) {
      return null;
    }
    const valueName = currentNode.value;
    const attrName = getCompoundName(attributeNode);
    const tagName = getCompoundName(tagNode);
    const tagEntry = HtmlData.tags.find((tag) => tag.name === tagName);
    const attribute =
      HtmlData.globalAttributes.find((attr) => attr.name === attrName) ??
      tagEntry?.attributes.find((attr) => attr.name === attrName);
    const valueSetName = attribute?.valueSet;
    const valueSetEntry = HtmlData.valueSets.find((valueSet) => valueSet.name === valueSetName);
    const valueEntry = valueSetEntry?.values.find((value) => value.name === valueName);
    if (!valueEntry) {
      return null;
    }
    return {
      contents: {
        kind: 'markdown',
        value: renderHtmlEntry(valueEntry, attribute?.references ? attribute : tagEntry),
      },
    };
  }
}