Home

tailwind-ctp-intellisense @8ca0e518b0592914075aef8e8042320116f7d50d - refs - log -
-
https://git.jolheiser.com/tailwind-ctp-intellisense.git
Tailwind intellisense + Catppuccin
tailwind-ctp-intellisense / packages / tailwindcss-language-service / src / util / getLanguageBoundaries.ts
- raw
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import type { TextDocument, Range } from 'vscode-languageserver'
import { isVueDoc, isHtmlDoc, isSvelteDoc } from './html'
import { State } from './state'
import { findAll, indexToPosition } from './find'
import { isJsDoc } from './js'

export interface LanguageBoundaries {
  html: Range[]
  css: Range[]
}

export function getLanguageBoundaries(
  state: State,
  doc: TextDocument
): LanguageBoundaries | null {
  if (isVueDoc(doc)) {
    let text = doc.getText()
    let blocks = findAll(
      /(?<open><(?<type>template|style|script)\b[^>]*>).*?(?<close><\/\k<type>>|$)/gis,
      text
    )
    let htmlRanges: Range[] = []
    let cssRanges: Range[] = []
    for (let i = 0; i < blocks.length; i++) {
      let range = {
        start: indexToPosition(
          text,
          blocks[i].index + blocks[i].groups.open.length
        ),
        end: indexToPosition(
          text,
          blocks[i].index + blocks[i][0].length - blocks[i].groups.close.length
        ),
      }
      if (blocks[i].groups.type === 'style') {
        cssRanges.push(range)
      } else {
        htmlRanges.push(range)
      }
    }

    return {
      html: htmlRanges,
      css: cssRanges,
    }
  }

  if (isHtmlDoc(state, doc) || isJsDoc(state, doc) || isSvelteDoc(doc)) {
    let text = doc.getText()
    let styleBlocks = findAll(
      /(?<open><style(?:\s[^>]*>|>)).*?(?<close><\/style>|$)/gis,
      text
    )
    let htmlRanges: Range[] = []
    let cssRanges: Range[] = []
    let currentIndex = 0

    for (let i = 0; i < styleBlocks.length; i++) {
      htmlRanges.push({
        start: indexToPosition(text, currentIndex),
        end: indexToPosition(text, styleBlocks[i].index),
      })
      cssRanges.push({
        start: indexToPosition(
          text,
          styleBlocks[i].index + styleBlocks[i].groups.open.length
        ),
        end: indexToPosition(
          text,
          styleBlocks[i].index +
            styleBlocks[i][0].length -
            styleBlocks[i].groups.close.length
        ),
      })
      currentIndex = styleBlocks[i].index + styleBlocks[i][0].length
    }
    htmlRanges.push({
      start: indexToPosition(text, currentIndex),
      end: indexToPosition(text, text.length),
    })

    return {
      html: htmlRanges,
      css: cssRanges,
    }
  }

  return null
}